| CARVIEW |
domingo, 06 marzo
12:56
Manuel Kaufmann (Humitos): ¿No será mucho?
Recién estaba leyendo una nota del Diario UNO de Paraná y quise dejar un comentario, pero únicamente pueden dejar comentarios los que están registrados en el sitio. Entonces dije: “meh, ya fue… me registro en un toque y dejo mi opinión”.
Así que fui a la página de Registro y empecé a ingresar mis datos y me parecía un poco mucho lo que pedían y por último veo “DNI”. “¿Posta?” -dije-. Le dí aceptar sin completar ese campo y resulta que no sólo lo piden sino que es Obligatorio.
Estuve a punto de poner: “en trámites”
sábado, 05 marzo
20:46
Roberto Alsina: De Vicenzo: un mini browser más copado
Parece que hubieran sido solo unos días desde que empecé este proyecto. Ah, epa, sí, fué hace unos días nomás!
Si no querés leer eso de nuevo, la idea es ver cuánto código falta para convertir el motor WebKit de Qt en un browser "en serio".
Para ello, me puse una meta completamente arbitraria de 128 líneas de código. En este momento lo declaro feature-complete (pero buggy).
Los nuevos features son:
- Tabbed browsing (se puede agregar/sacar tabs)
- Bookmarks (se pueden agregar/sacar y elegir de una lista)
Esto es lo que ya funcionaba:
- Zoom in (Ctrl++)
- Zoom out (Ctrl+-)
- Reset Zoom (Ctrl+=)
- Buscar (Ctrl+F)
- Esconder búsqueda (Esc)
- Botones de atrás/adelante y recargar
- Entrada de URL que coincide con la página + autocompletado desde la historia + arregla la URL puesta a mano (agrega https://, esas cosas)
- Plugins (incluído flash, que hay que bajar aparte ;-)
- El título de la ventana muestra el título de la página (sin propaganda del browser)
- Barra de progreso para la carga de la página
- Barra de estado que muestra el destino de los links cuando pasas el mouse
- Toma una URL en la línea de comando (o abre https://python.org
- Multiplataforma (funciona donde funciona QtWebKit)
Y cuanto código es eso? 87 LINEAS.
O si preferís la versión que cumple con la PEP8: 115 LINEAS.
Me atajo antes que alguien lo diga: sí, el motor de rendering y el toolkit son enormes. Lo que escribí es el "chrome" alrededor de eso, igual que hacen Arora, Rekonq, Galeon, Epiphany, y muchos otros browsers.
Es un chrome simple y minimalista, pero funciona bastante bien, creo yo.
Aquí está el demo (buggy):
Mas o menos hace lo que esperaba que se puediera lograr, pero le faltan arreglos.
Para ver el código, vayan a su home page: https://devicenzo.googlecode.com
16:45
Gustavo Carmona: Suscripciones por email
Para dar la posibilidad de que tus lectores vean en su e-mail cuando publicaste un nuevo post, debes agregar el widget suscripciones por e-mail. Es muy fácil y en cada e-mail que reciba el lector, tendrá la posibilidad de darse de baja (des-suscripbirse) haciendo click en el fin de su mensaje.
Muy buen diseño tiene esta solución de wordpress.com.
15:52
PyDay Cordoba: PyDay_ar: PyDay Cordoba 2011 - Call For Charlas https://wp.me/p8CBX-7s RT!
PyDay_ar: PyDay Cordoba 2011 - Call For Charlas https://wp.me/p8CBX-7s RT!
15:06
PyDay_ar: 30 de Abril, PyDay Córdoba! Todavía no te inscribiste? Apurate que son cupos limitados! + info: https://www.pyday.com.ar/cordoba2011
03:31
Manuel Kaufmann (Humitos): Practicando en casa
miércoles, 02 marzo
17:24
Manuel Kaufmann (Humitos): First Bus Stopped Released!
KISS Method: Keep It Simple Sucker!
Seee! Se cumplío, bah, en realidad cumplí! Me puse a estudiar Google App Engine y la API 3 de Google Maps. En menos de una semana me hice un sitio web que las trae
Hace tiempo que tengo la idea de meter las paradas de colectivos con sus horarios en un Google Maps y que depende dónde estés vos y a dónde vayas te diga en cuanto tiempo pasa uno y en qué lugar. ¿Qué más querés?
Bueno, todavía no está terminado pero me parece que la idea va bien. Me quedan un montón de cosas por probar y tengo muchas ganas de meterle pilas porque está interesante (al menos para mí) la idea; además creo que puede ser útil
¡Sí! Le falta un montón y tengo muchas ideas más en la cabeza, ¿pero sabés qué? Ya está andando
09:59
Manuel Kaufmann (Humitos): FireLogger
martes, 01 marzo
13:30
Mariano Draghi (cHagHi): Acentuame el SMS
¿Cuántas prestadoras de telefonía celular hay en Argentina? Básicamente, 3: Movistar, Personal y Claro. 4, si querés contar a Nextel (OK, contémosla, total…)
Digo yo, ¿tanto les cuesta ponerse de acuerdo en la codificación de caracteres, de manera que cuando alguien usa acentos, eñes, signos de exclamación/pregunta de apertura, etc., en un SMS de un usuario de la operadora A, a un usuario de la operadora B, el mensaje llegue a destino como fue escrito? El caso entre Movistar y Personal por ejemplo ya es patológico. No se quien se manda el moco, pero cualquier SMS con caracteres fuera del rango ASCII estándar desde un celular de Personal a uno de Movistar llega para el culo, con todos los caracteres “especiales” convertidos en signos de pregunta de apertura (¿). Es patético.
Sí, yo se que algunos consideran más cool, o más eficiente, o algo, escribir sin tildes, abreviando, reemplazando el grupo “qu” por “k”, etc. Cada uno es libre de escribir como quiera… no es el punto. Yo soy hinchapelotas y me tomo el laburo de escribir en castellano bien (cada vez menos laburo, porque los teléfonos hacen cada vez más fácil escribir bien… a veces es más lento y complicado “pelear” contra el teléfono para escribir mal, que escribir bien). Y las operadoras no tienen por qué transmitir mal entre ellas lo que escribo. Con ese criterio, también sería aceptable que recorten los mensajes o cambien palabras o reemplacen caracteres al azar. Y no da.
Encima no es una limitación tecnológica, porque con mensajes enviados entre usuarios de la misma operadora, funciona perfecto.
¿Entonces? Entonces la o las personas dentro de Claro, Personal, Movistar y Nextel que deberían resolver esto y tienen el poder para resolverlo y no lo hacen son una manga de energúmenos inútiles mediocres sin profesionalisimo.
Y los odio, eso. Porque encima debería ser TRIVIAL de arreglar.
12:31
Juan Bautista Cabral: PyDay Cordoba 2011 – Call For Charlas (RT PLEASE)
PyAr, el grupo de usuarios de Python de Argentina invita a toda la comunidad de usuarios de Python y de Software Libre en general a proponer presentaciones y charlas para la Pyday Cordoba 2011
https://www.pyday.com.ar/cordoba2011/
En este evento nos juntaremos desarrolladores y programadores tanto principiantes como avanzados; bloggers, autores y diseñadores web; gerentes, administradores y emprendedores; científicos, ingenieros, curiosos y todo aquel que tenga ganas de acercarse a la comunidad Python en Argentina.
El autor de cada charla seleccionada participará presencialmente, como orador en el evento. En los casos en que la charla sea realizada por varios autores, se permitirá un máximo de 3 oradores.
Las charlas deben ser ingresadas para su aprobación en [https://www.pyday.com.ar/cordoba2011/activity/propose/talk]
La fecha límite de envío de charlas es el viernes 1 de abril del 2011 inclusive. En caso de consultas o inconvenientes, contactarse con
pyday-cba2011@googlegroups.com (Poner en el subject [charlas])
Cómo enviar las Charlas
El envío de la propuesta de charla debe tener los siguientes datos:
- Autor(es): Nombre y apellido, breve descripción de cada uno, foto, asociación, grupo de usuarios, organismo, o empresa a la que pertenece, si corresponde.
- Título.
- Tiempo estimado de duración: Las charlas generalmente deberán ser de 25′. No importa que diga la pagina en cuestión.
- Abstract: Descripción de la charla. Uno o dos párrafo(s) que explique -no tan brevemente el contenido de la presentación.
- Descripción: Una descripción detalladada de como sera su charla para los evaluadores.
- Categoría: stdlib, web, mobile, cloud, desktop, web, gui, databases, frameworks, orm, ide, ciencia, etc.
- Nivel objetivo de la charla: introductorio / intermedio / avanzado
- Tipo de publico: Desarrolladores avanzados, desarrolladores principiantes, empresarios, docentes, público en general
- Conocimientos previos: Especificar que conocimientos previos deberán tener los asistentes.
- Fecha y Hora: no aplica
La duración predeterminada de las presentaciones es más corta que lo que se ha hecho costumbre en eventos de la comunidad local: somos de la idea que una disertación en una conferencia es un muy buen lugar para presentar ideas a un nivel un poco más detallado que una charla relámpago, pero queremos desinsentivar el uso del formato charla para dar tutoriales; es mucho más provechoso para el público si la charla brinda una introducción al tema, acompañada de enlaces a material donde se desarrolle el tema en más profundidad. Además, creemos que muchas de las charlas mejorarían si fueran presentadas con un estilo más ágil y habiéndolas practicado. Entonces:
- Diagrame su charla para presentar la idea central, con enlaces a material adicional.
- Practique la charla.
- Si no entra en el tiempo predeterminado y el contenido lo amerita, una charla puede ocupar más de un slot.
https://www.pyday.com.ar/cordoba2011/
lunes, 28 febrero
18:10
Roberto Alsina: ¿Cuanto browser entra en 128 líneas de código?
Hoy, charlando en IRC, traté de encontrar un browser de 42 líneas que escribí hace un tiempo. Lamentablemente el pastebin en que lo posteé estaba muerto, así que aprendí una lección: No es buena idea confiar en un pastebin como repositorio de código.
Lo que me gustaba de ese browser de 42 líneas era que no era el ejemplo típico, donde meten una vista de Webkit en una ventana, cargan una página y te tratan de convencer de que son unos bananas. Esa versión son 7 líneas:
import sys from PyQt4 import QtGui,QtCore,QtWebKit app=QtGui.QApplication(sys.argv) wb=QtWebKit.QWebView() wb.setUrl(QtCore.QUrl('https://www.python.org')) wb.show() sys.exit(app.exec_())
O 6 si lo soportara un poco más feo.
¡Pero igual, el de 42 se veía útil!
Esos botones que se ven funcionaban correctamente, habilitando y deshabilitandose en el momento correcto, la entrada de URL cambiaba cuando hacías click en un link, y otras cositas así.
Ahí decidí empezar un pequeño proyecto intermitente de code golf: meter el mejor browser que pueda en 128 líneas de código (sin contar comentarios ni blancos), usando solo PyQt4.
Eso tiene un propósito útil: siempre sospeché que si uno asume PyQt como parte del sistema base, la mayoría de las aplicaciones entrarían en diskettes. Esta entra unas 500 veces en uno de 1.44MB (¡así que podés usar los de 360 de commodore sin duplidisk!)
hasta ahora van 50 líneas, y tiene los siguientes features:
- Zoom in (Ctrl++)
- Zoom out (Ctrl+-)
- Reset Zoom (Ctrl+=)
- Buscar (Ctrl+F)
- Esconder búsqueda (Esc)
- Botones de atrás/adelante y recargar
- Entrada de URL que coincide con la página + autocompletado desde la historia + arregla la URL puesta a mano (agrega https://, esas cosas)
- Plugins (incluído flash, que hay que bajar aparte ;-)
- El título de la ventana muestra el título de la página (sin propaganda del browser)
- Barra de progreso para la carga de la página
- Barra de estado que muestra el destino de los links cuando pasas el mouse
- Toma una URL en la línea de comando (o abre https://python.org
- Multiplataforma (funciona donde funciona QtWebKit)
Faltan tabs y soporte de proxy. Espero que lleven unas 40 líneas más, pero creo que ya es el más capaz de todos estos browsers de ejemplo.
El código... no es tan terrible. Uso muchos lambdas, y los argumentos keyword de PyQt para conectar señales, que hacen que algunas líneas sean muy largas, pero no muy difíciles. Se podría achicar bastante todavía!
Aquí está en acción:
Y aquí está el código:
#!/usr/bin/env python "A web browser that will never exceed 128 lines of code. (not counting blanks)" import sys from PyQt4 import QtGui,QtCore,QtWebKit class MainWindow(QtGui.QMainWindow): def __init__(self, url): QtGui.QMainWindow.__init__(self) self.sb=self.statusBar() self.pbar = QtGui.QProgressBar() self.pbar.setMaximumWidth(120) self.wb=QtWebKit.QWebView(loadProgress = self.pbar.setValue, loadFinished = self.pbar.hide, loadStarted = self.pbar.show, titleChanged = self.setWindowTitle) self.setCentralWidget(self.wb) self.tb=self.addToolBar("Main Toolbar") for a in (QtWebKit.QWebPage.Back, QtWebKit.QWebPage.Forward, QtWebKit.QWebPage.Reload): self.tb.addAction(self.wb.pageAction(a)) self.url = QtGui.QLineEdit(returnPressed = lambda:self.wb.setUrl(QtCore.QUrl.fromUserInput(self.url.text()))) self.tb.addWidget(self.url) self.wb.urlChanged.connect(lambda u: self.url.setText(u.toString())) self.wb.urlChanged.connect(lambda: self.url.setCompleter(QtGui.QCompleter(QtCore.QStringList([QtCore.QString(i.url().toString()) for i in self.wb.history().items()]), caseSensitivity = QtCore.Qt.CaseInsensitive))) self.wb.statusBarMessage.connect(self.sb.showMessage) self.wb.page().linkHovered.connect(lambda l: self.sb.showMessage(l, 3000)) self.search = QtGui.QLineEdit(returnPressed = lambda: self.wb.findText(self.search.text())) self.search.hide() self.showSearch = QtGui.QShortcut("Ctrl+F", self, activated = lambda: (self.search.show() , self.search.setFocus())) self.hideSearch = QtGui.QShortcut("Esc", self, activated = lambda: (self.search.hide(), self.wb.setFocus())) self.quit = QtGui.QShortcut("Ctrl+Q", self, activated = self.close) self.zoomIn = QtGui.QShortcut("Ctrl++", self, activated = lambda: self.wb.setZoomFactor(self.wb.zoomFactor()+.2)) self.zoomOut = QtGui.QShortcut("Ctrl+-", self, activated = lambda: self.wb.setZoomFactor(self.wb.zoomFactor()-.2)) self.zoomOne = QtGui.QShortcut("Ctrl+=", self, activated = lambda: self.wb.setZoomFactor(1)) self.wb.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True) self.sb.addPermanentWidget(self.search) self.sb.addPermanentWidget(self.pbar) self.wb.load(url) if __name__ == "__main__": app=QtGui.QApplication(sys.argv) if len(sys.argv) > 1: url = QtCore.QUrl.fromUserInput(sys.argv[1]) else: url = QtCore.QUrl('https://www.python.org') wb=MainWindow(url) wb.show() sys.exit(app.exec_())
18:06
Facundo Batista: Primer día de jardín!
El tiempo pasa, y así como sin querer, Felipe arrancó el jardín :|
Bueno, es "maternal" todavía, no "jardín de infantes propiamente dicho", y van a ser menos de tres horas por día, pero va a estar bueno para que vaya conociendo gente y se vaya socializando.
Hoy como era la primera vez fuimos Moni y yo, hubo una actividad de pegar una foto, la directora charló un rato con nosotros, y no mucho más. Felipe había ido un par de veces al jardín (cuando reservamos, y a la entrevista con la "seño Lumila"), y la verdad es que le encantó estar ahí.
Se fascinó con un tobogán, al que aprendió a subirse y tirarse solo, y estuvo mucho rato ahí... pero también deambulando por el jardín, y la verdad es que no lo vimos demasiado preocupado cuando lo dejamos solo.
Igual, la adaptación será la adaptación, veremos como se porta.
17:24
Martín Gaitán: Yendo a las fuentes de cuevana.tv
Dos cosas me gustan mucho últimamente: cuevana.tv y GreaseMonkey
Cuevana es un sitio para ver series y películas online, en streaming de alta calidad, con subtitulos y todo. El truco está en un plugincito que hace instalar en el navegador que permite reproducir (en un reproductor basado en flash comunacho) un archivo que se descarga de megaupload, filefactory o sitios por el estilo. El ancho de banda lo ponen otros, la alegría es toda de cuevana (y nuestra). Todos unos pillos.
Lamentablemente, mi conexión no se banca un streaming de alta calidad (como los videos de cuevana) sin bufferear (?) y entonces pierde sentido (o gana mala sangre) intentar ver directamente "online".
Y acá entra Greasemonkey, que es una extensión para Firefox (y otros navegadores) que permite agregar scripts (en javascript) para modificar localmente las páginas que indiquemos.
Con esta herramienta, programadores voluntarios crean cientos de scripts para mejorar la estética o funcionalidad de muchos sitios, conocidos o no.
Mi primer aporte a la "comunidad Greasemonkera" (y cuevanera) intenta subsanar la discriminación que el streaming de alta calidad tiene con los que tenemos un ancho de banda no muy ancho.
Una vez instalado el script muestra links a la fuente original de descarga, justo abajo de los iconos de selección.

Así podemos bajar los videos y verlos offline.
Como complemento, se pueden copiar y pegar los links en un gestor de descargas como Tucan
Respecto a los subtítulos, todavía soy principiante con javascript, pero espero poder obtener el link a los subtitulos en futuras versiones. Mientras tanto ArgenTeam y Subdivx. ¡Hecho!
UPDATE
Llamativamente, y aunque Diego en el primer comentario me hace notar que no era demasiado útil lo que hice, 8 horas después de hacer este script el código de gestión de las fuentes de Cuevana cambió. No mucho, pero suficientes para dejar a mi ejendro sin utilidad.
De puro cabezadura lo actualicé y ahora expuse los links a los subtitulos. Lindo lenguaje el javascript. eh...
10:22
Manuel Kaufmann (Humitos): Su trámite necesita una fotocopia de DNI
Hoy me desperté, fui a la pc y tenía un mail de CRON (un programa que ejecuta scripts a una determinada hora) informándome de un error en el script que yo había hecho para chequear el estado del Trámite de mi DNI que vengo haciendo hace un tiempo ya.
Lo abro y veo que era un error medio boludo y que probablemente saltó porque habían cambiado la página del registro o porque finalmente mi trámite estaba finalizado.
Cuando abro el sitio desde el Firefox me encuentro con esto:
A la fecha no existen tramites en curso.
Lo que me hizo pensar: “EH?, ¿qué pasó acá?”. Así que, llamé al número que estaba ahí abajo y me dijeron que tenía que llamar al 0800-999-9364 porque en el Registro Nacional habían borrado todos los datos. “WTF??”
Bueno, llamé a ese número. Esperé bastante y finalmente me atendió una chica, le dí mi número de DNI y luego me preguntó si había hecho la renovación a los 16 y si alguna vez había votado. “¿Cómo? ¿No tienen mis datos? ¿Era verdad que los borraron? ¡¡Jodeme!!”
Finalmente, después de hablar como 20 minutos y tratarnos como el orto (porque yo estaba re caliente y la piba esta estaba en modo irónico**) me preguntó si cuando hice el último reclamo había llevado una fotocopia de DNI, de cédula o de pasaporte. “¿Qué cómo quién? ¿Una fotocopia de DNI? Yo estoy haciendo el trámite del DNI, difícilmente tenga una fotocopia”.
Me dijo que probablemente, alguna vez en mi vida, le saqué alguna fotocopia para presentar en el colegio o en el club o en algún lugar similar y que probablemente podía tener una :S
En resumen, me explicó que el problema del trámite es que las huellas dactilares que ellos tienen en su banco de datos no coinciden con las que actualmente presenté y por eso el trámite está rebotando. Y claro, después de todos los liftings de manos que me hice… ¿cómo van a coincidir?
Dios, ¿¡de qué estamos hablando!?
Finalmente me dijo que vuelva al registro civil a hacer el trámite y lleve una fotocopia del DNI (ya que cédula y pasaporte nunca hice) que haya pedido en la escuela o similar e inicie nuevamente el trámite.
¡Hijos de puta! Estoy re caliente y me da mucha bronca que hace 1 año que no tengo DNI, me tienen a las vueltas y me dicen cualquier cosa cada vez que llamo. ¡No puedo hacer nada sin el DNI, te das cuenta cuando no lo tenés! ¡Se van todos a la mierda, no quiero ser más un indocumentado y no me dejan!
PD: no creo en Dios, sólo lo uso en este tipo de expresiones vulgares que llaman más la atención
** esto es porque en la conversación me pregunto:
- ¿Llevaste las huellas dactilares al registro civil?
- Sí, llevé mis dedos
- Y sí, no los vas a dejar en tu casa ¿no?
domingo, 27 febrero
22:57
Alejandro Santos: Google Earth en Debian Squeeze amd64 + Nvidia
Hoy me fui a dar una vuelta en bicicleta, y cuando llegué a mi casa quería saber cuántos Km había hecho. Bajé el Google Earth pero no iniciaba.
Sucede que la versión de GE de 64 bits está compilada en 32 y hace falta instalar las librerias de compatibilidad, tanto para libc como para los drivers GL de Nvidia.
Luego de mirar un bug y un post en foros encontré las dependencias necesarias:
aptitude install ia32-libs-gtk lsb-core lib32nss-mdns ia32-libs lib32ncurses5 nvidia-glx-ia32
14:34
Mariano Guerra: exige tu propia aventura
costo ponerle titulo al post, acá van algunos de los que se me ocurrieron:
Set the Controls for the Heart of the Sun, por el tema de pink floyd
last day on heart, por el tema de marilyn manson (no se dejen llevar por los estereotipos y escuchenla)
pero al final me decidí por una frase que leí al pie de una pagina de la revista orsai
y ustedes se preguntaran, porque tanta introducción?
si blogger le da bola a la configuración que le di, este post esta saliendo en el momento que me subo al avión, sino sale en el instante que aprieto publish y todo el misticismo se va al tacho.
bue, resulta que de vuelta cruzo el charco y me voy para el viejo continente, conseguí un trabajo en inglaterra que me da suficiente libertad como para hacer varias cosas que tengo en mente (no muy relacionadas con lo laboral) así que decidí aprovecharla.
muchos planes mas que ir allá y hacer cosas que se me vengan a la mente no tengo y para ponerle mas emoción no he planificado nada mas que comprarme una bicicleta (alla) y llevar una carpa gentilmente donada por los pichis.
vamos a ver que sale de esto, lo que vaya saliendo saldrá por este blog si consigo una computadora (la miá feneció de tristeza* los otros días)
nos vemos al rato
* quizás el puñetazo que le pegue al teclado para ver si reactivaba algunas teclas muertas ayudo a la tristeza (sin contar la tristeza del disco que decidía fallar cada unos minutos)
PD: blogger no lo publico, ya llegue, se fue la posibilidad de postear un blog mientras estaba en el aire
sábado, 26 febrero
17:27
Juan Bautista Cabral: Abierta la Inscripcion a Pyday Cordoba 2011
Para el que se quiera ir inscribiendose la pagina de pyday cordoba 2011 esta disponible
https://www.pyday.com.ar/cordoba2011
Para logearse van a tener que usar el “olvidaste tu contrse~na” por q se autogenera.
El call for charlas en breve pero voy adelantando que son charlas de 30 min.
viernes, 25 febrero
22:47
Manuel Kaufmann (Humitos): Excelente Plugin de Firefox
Hoy buscando el plugin que vengo usando para los Tabs Verticales (Verttab) en Firefox 3.6.* para Firefox 4 Beta me encontré con BarTab.
La cosa es que BarTab… ¿Qué carajo es? Para mí no tenía un nombre llamativo y me parecía que iba a ser cualquiera pero… Al leer una de las Reviews primeras que se mostraban, decía “Awesome”… Eh, ¿para tanto? -dije-
Bah… Vamos a probarlo a ver qué onda. Lo primero que hice fue instalarlo en Firefox 4 Beta; y después de verlo un ratito, noté que andaba para el tuje. Me fui a las FAQ’s y lo primero que decía es “0. HALP! It doesn’t work on Firefox 4!“
Listo, cerré el Firefox 4 y abrí el Iceweasel 3.6.12. Instalé, configuré, reinicié el Iceweasel y ya lo tenía andando en pocos segundos.
Pero sí, ¿de qué se trata este plugin con ese nombre tan pedorro?. La idea es que “los tabs que no estás usando… no deben consumir memoria”. Entonces: “hace eso”. Lo podés configurar para decirle: “che, si no estoy usando un tab por 2 minutos… fue; sacalo de la memoria, pero… dejalo ahí, cosa de que yo le pueda hacer click de nuevo y vos me lo cargues cuando lo necesito”
Altamente recomendable.
Como frutillita del postre, también le podés decir: “che, estos sitios nunca me los cierres”. Entonces, ahí podés meter Gmail, Twitter, YouTube o Facebook por ejemplo.
17:17
Mariano Draghi (cHagHi): Ascensores, esas máquinas diabólicas
Habiendo escalera -el propietario- no se responsabiliza de los accidentes que pueda ocasionar el uso del ascensor
El cartel está en un edificio viejo, que fue modernizado, pero que conserva varias perlitas. Me imagino que la placa esta (colocada sobre el ascensor) fue conservada a propósito, y responderá a una época en la que los ascensores eran una novedad tecnológica desconocida y peligrosa…
jueves, 24 febrero
22:59
Juanjo Conti: Para entender el origen de Narnia
Narnia es un mundo fantástico creado por el catedrático y escritor C.S. Lewis. Seguramente viste alguna de las películas en el cine. Si querés conocer el origen del este mundo, lee El sobrino del mago, el primer tomo de la saga. Lo terminé de leer hoy y me gustó mucho.
20:05
Martín Gaitán: Covertura de los Oscars 2011
Anoche, en un arrebato procrastinador, armé Oscars Awards y su clon Oscars Winners .
Aprovechando una promo de netfirms.com y con un poco de suerte, consegui los dos dominios por u$s 9 que pagué con PayPal. Vuelve la burbuja .com ?
El "streaming de tweets" está basado en juitter, pequeñamente hackeado.
¿Quién gana en los Oscars 2011 ?
martes, 22 febrero
19:45
Roberto Alsina: The Outhouse and the Mall
Wearing the software engineer's hat: Code is the most trivial and the least important part of a feature.
—Michael Iatrou
Michael tweeted that, I replied, he replied, but what the heck, I think sometimes things can be better explained in more than 140 characters, thus this post [1].
So, why the mall and the outhouse? Because when we talk about software and code and features, we are not all talking about the same thing. Imagine if I told you that bricks are trivial. After all, they have existed in their current form for thousands of years, they are pretty simple to manufacture, and have no interesting features, really, except a certain resistence.
Now, suppose you are building an outhouse. Since you are a funny guy, you want to build an actual brick outhouse so you will use bricks to do it.
Now, since bricks are so boring, you may feel compelled to believe bricks are the least important part of your edifice, and that the overall design is more important. Should you carve a moon-shaped hole in the door? How deep should the latrine be?
However, that position is fatally flawed, since if you ignore those trivial, boring bricks, all you have is shit in a hole in the ground. That is because you are considering the bricks as just a mean to your end. You only care about the bricks insofar as they help you realize your grand outhouse vision. I am here to tell you that you are wrong.
The first way in which you are wrong is in that artificial separation between means and ends. Everyone is familiar with the ethical conundrum about whether the ends justify the means, but that's garbage. That'swhat you say when you try to convince yourself that doing things haphazardly is ok, because what you do is just the means to whatever other thing is the end. Life is not so easily divided into things that matter and things that don't.
Your work, your creation is not just some ideal isolated end towards which you travel across a sea of dirty means, trying to keep your silver armour clean. It's one whole thing. You are creating the means, you are creating your goal, you are responsible for both, and if you use shoddy bricks, your outhouse should shame you.
In the same way, if you do crappy code, your feature is demeaned. It may even work, but you will know it's built out of crap. You will know you will have to fix and maintain that crap for years to come, or, if you are lucky, ruin your karma by dumping it on the head of some poor sucker who follows your steps.
I am pretty much a materialist. If you remove the code, you don't have a feature, or software, you have a concept, maybe an idea, perhaps a design (or maybe not) but certainly not software, just like you don't have a brick outhouse without piling some damn bricks one on top of the other.
I always say, when I see someone calling himself a software engineer, that I am merely a software carpenter. I know my tools, I care about them, I use them as well as I can according to my lights [2] and I try to produce as good a piece of furniture as I can with what I am given.
This tends to produce humble software, but it's software that has one redeeming feature: it knows what it should do, and does it as well as I can make it. For example, I wrote rst2pdf. It's a program that takes some sort of text, and produces PDF files. It does that as well as I could manage. It does nothing else. It works well or not, but it is what it is, it has a purpose, a description and a goal, and I have tried to achieve that goal without embarrasing myself.
My programs are outhouses, made of carefully selected and considered bricks. They are not fancy, but they are what they are and you know it just by looking at them. And if you ever need an outhouse, well, an outhouse is what you should get.
Also, people tend to do weird stuff with them I never expected, but that's just the luck of the analogy.
But why did I mention malls in the title? Because malls are not outhouses. Malls are not done with a goal by themselves beyond making money for its builders. The actual function of a piece of mall is not even known when it's being built. Will this be a McDonalds, or will it be a comic book store? Who knows!
A mall is built quickly with whatever makes sense moneywise, and it should look bland and recognisable, to not scare the herd. It's a building made for pedestrians, but it's intended to confuse them and make the path form A to B as long and meandering as possible. The premises on which its design is based are all askew, corrupted and self-contradicting.
They also give builders a chance to make lots of money. Or to lose lots of money.
Nowadays, we live in an age of mall software. People build startups, get financing, build crappy software and sometimes they hit it big (Twitter, Facebook) or, more likely, fade into obscurity leaving behind nothing at all, except money lost and sad programmers who spent nights coding stuff noone will ever see or use, and not much else.
Far from me saying startups are not a noble or worthy endeavour. They are! It's just that people who work on them should realize that they are not building software. That's why code doesn't look important to them, because they are actually selling eyeballs to advertisers, or collected personal data from their users to whoever buys that, or captive public for game developers, or whatever your business model says (if you have one!).
They are building malls, where the value is not in the building, which is pretty ghastly and useless by itself, but on the people in it, those who rent space in the mall, those who will use the mall, the software, the social network, whatever it is you are building.
Twitter is not software, Facebook is not software. If they were, identi.ca and diaspora would be bigger! What they are is people in one place, like a mall is not a real building, but a collection of people under a roof.
So, there is nothing wrong with building malls. Just remember that your ends and your means are one and a whole, that code is important, that without code Facebook and Twitter don't work, and that without people they are a badland, and know what you are doing.
Because the only hard thing in life is knowing what you want to do. The rest is the easy part. And because malls without toilets suck.
| [1] | If you really want to see the whole conversation, it's here: https://bettween.com/ralsina/iatrou (if anyone knows a better conversation tracker please post it in a comment). |
| [2] | Yet here I am, an Engineering Manager at Canonical. Sorry guys! |
lunes, 21 febrero
13:17
Facundo Batista: Margarita
sábado, 19 febrero
23:22
Diego Sarmentero: Despedida de Marianiten en Carlos Paz
Hoy nos fuimos a hacer la despedida a Marianiten (Si si, ud lo conoce, Mariano Guerra w0w m3n! jeje :P) que se va a hacer un largoooo viaje! Así que fue un buen día de asado en Carlos Paz, con pileta y las típicas charlas delirantes.
Y un par de Vídeos de las típicas vulgaridades galopantes que frecuentan estas juntadas :P
Había una vez... un circo!
Salto de Mariano
Tuza al Agua
16:45
Marcelo Fernández: Estableciendo conexiones HTTPS “bien seguras” en Python
Hace unos días que tenía pendiente colgar esto acá, ya que a alguien en PyAr le fue útil.
HTTPS es la manera de establecer conexiones HTTP pero seguras, en el sentido de que previo al diálogo HTTP estándar pero luego de establecerse la conexión TCP contra el servidor, se negocia entre los participantes una conexión/sesión “especial” entre ambos. Allí se intercambian certificados con el fin de autenticar contra quién se “está hablando”, para luego, si hubo éxito en la dicha comprobación, encriptar (o no) todo lo que va para el otro lado, tanto del Servidor al Cliente (generalmente un navegador), como del Cliente al Servidor.
Todo eso forma parte de SSL 3.0 (hoy TLS 1.0), y si bien se puede utilizar para cualquier conexión TCP (SMTP, IMAP, etc., lo pueden usar también), su uso más común se da cuando uno entra a su casilla de Webmail o su cuenta del Banco desde el navegador; lo que sucede allí es que nuestro navegador autentica al Servidor, y si todo va bien nos muestra el famoso “candadito” e informa que la sesión “es segura”. Ahora bien, en esos casos, el Banco o Webmail no nos autentica a nosotros como Cliente y deja que cualquiera se conecte a su página, ya que eso requiere varios pasos más (sería realmente engorroso que sea obligatorio).
Sin embargo, en nuestra vida de programadores nos solemos encontrar con necesidades del entorno que nos obliguen a esta situación un tanto extrema y bastante más segura: que tanto el Cliente que desarrollamos autentique al Servidor como que el Servidor autentique al Cliente, amén de que la conexión muy probablemente deberá estar encriptada. Esto nos permitirá asegurarnos que los Clientes (software) que se conecten a nuestro Servidor sean únicamente quienes queremos que sean (o casi).
Python, dentro del módulo httplib nos provee de la clase HTTPSConnection, que maneja y nos abstrae en varias de estas cuestiones de SSL/TLS y nos deja trabajar a nivel HTTP (una capa más arriba). Lo que hay que observar bien (y que recién en la versión 2.7 de la documentación apareció en rojo), es que esta clase aún cuando uno le puede pasar como parámetro los paths a certificados, en realidad no hace ninguna comprobación de validez del certificado que el Servidor exporta. Con lo cual, hay un potencial problema: que nuestro cliente mande los datos a cualquier lado menos a nuestro Servidor de confianza.
¿Y cómo se fuerza a que nuestro programa Cliente chequee el certificado del Servidor? Armé esta clase que extiende sólo lo necesario a HTTPSConnection, que funciona en Python 2.6.x y que me permite hacer eso.
Le agregué un ejemplo en la llamada a __main__ para mostrar cómo se usa:
#!/usr/bin/env python #-*- coding: utf-8 -*- import socket import ssl import httplib class HTTPSClientAuthConnection(httplib.HTTPSConnection): """ Class to make a HTTPS connection, with support for full client-based SSL Authentication. """ def __init__(self, host, port, key_file, cert_file, ca_file, timeout=None): httplib.HTTPSConnection.__init__(self, host, key_file=key_file, cert_file=cert_file) self.key_file = key_file self.cert_file = cert_file self.ca_file = ca_file self.timeout = timeout def connect(self): """ Connect to a host on a given (SSL) port. If ca_file is pointing somewhere, use it to check Server Certificate. Redefined/copied and extended from httplib.py:1105 (Python 2.6.x). This is needed to pass cert_reqs=ssl.CERT_REQUIRED as parameter to ssl.wrap_socket(), which forces SSL to check server certificate against our client certificate. """ sock = socket.create_connection((self.host, self.port), self.timeout) if self._tunnel_host: self.sock = sock self._tunnel() # If there's no CA File, don't force Server Certificate Check if self.ca_file: self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ca_certs=self.ca_file, cert_reqs=ssl.CERT_REQUIRED) else: self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, cert_reqs=ssl.CERT_NONE) if __name__ == '__main__': # Little test-case of our class import sys if len(sys.argv) != 6: print 'usage: ./https_auth_handler.py host port key_file cert_file ca_file' sys.exit(1) else: host, port, key_file, cert_file, ca_file = sys.argv[1:] conn = HTTPSClientAuthConnection(host, port, key_file=key_file, cert_file=cert_file, ca_file=ca_file) conn.request('GET', '/') response = conn.getresponse() print response.status, response.reason data = response.read() print data conn.close()
En cuanto a la generación de las claves de Cliente, Servidor y CA hay unos cuantos artículos y es relativamente sencillo una vez que se entiende qué se está haciendo. Por otra parte que en estos casos es muy común que el Servidor exija que el Cliente si o sí envíe su certificado o sino la conexión se deberá caer; esto en el caso del Servidor Apache está bien documentado.
Entiendo que en Python 3.2 esto está resuelto en la misma API standard de Python (en su momento abrí un ticket similar para usar esto con urllib2, que incluye cosas importantes como el manejo de cookies, por ejemplo), y comentaron eso.
Según me dijeron en PyAr, es casi seguro que este ejemplo no funcione en Python 2.7, así que en un futuro no muy lejano espero poder adaptar este código a dicha versión y seguramente lo estaré subiendo en esta página.
Saludos
11:41
Mariano Draghi (cHagHi): Speak To Me
Speak to me with tenderness
Speak to me with gracefulness
Speak to me with happiness and loveSpeak to me in loneliness
Speak to me in bitterness
Speak to me in faithlessness with loveYou want to hide when you’re alone
Where do you run to when you’re on your own?
You’re looking to find some peace of mind
But nothing’s in sight at the end of the line, oh no
Speak to me in emptiness
Speak to me in failed success
Speak to me in speechlessness with loveYou want to hide when you’re alone
Where do you run to when everything’s gone?
You’re looking to find a good thing in life
But nothing’s in sight at the end of the lineSo where do you hide when you’re alone?
Where do you run to when you’re on your own?
That dream in the dark just sank like a stone
That voice in your heart,
It won’t come to the phone,
It never comes?
Letra y música de Per Gessle.
No se bien por que, Speak To Me es, para mi, el mejor tema de Charm School.
jueves, 17 febrero
10:18
Mariano Reingart: Novedades PyAfipWs -Factura Electrónica- (instalador nsis, pythoncom, soap)
Recientemente liberé una nueva actualización de la biblioteca PyAfipWs, con varias mejoras:
https://www.pyafipws.com.ar/anuncios/nuevoinstalador106ayejemplosparawsfev1
A continuación se detallan los temas técnicos:
Extension a py2exe para generar un instalador NSIS:
Inicialmente usaba un .BAT para generar el instalador (7-zip autoextraible), para simplificar y mejorar el proceso (detectar archivos en uso, desinstalar copia previa, mostrar licencia, elegir directorio, internacionalización), desarrollé nsis.py, una extensión para py2exe, que agregando dos lineas a un setup.py crea un paquete unico con todo incluido, usando Nullsoft Scriptable Install System:
from nsis import build_installer
setup(
...
cmdclass = {"py2exe": build_installer}
)
Más info en:
https://code.google.com/p/pyafipws/source/browse/setup_wsfev1.py
https://code.google.com/p/pyafipws/source/browse/nsis.py
El código está adaptado de una ejemplo de py2exe para Inno Setup.
PythonCOM y la ruta de instalación
Para poder acceder a archivos locales en un ambiente empaquetado con py2exe, en general es trivial salvo que el script sea una DLL, ya que el interprete Python se "embebe" dentro del programa anfitrión, y los métodos estándard para determinar donde está ubicado el script fallan.
La solución mas simple fue usar:
- sys.executable para cuando el script es un .EXE
- win32api.GetModuleFileName(sys.frozendllhandle) para cuando el script es un .DLL
- __file__ cuando se ejecuta directamente el .PY
Más info en:
https://code.google.com/p/pyafipws/source/browse/wsfev1.py#129
Type Library y PythonCOM:
Algunos lenguajes de tipado estático (C#, versiones de Cobol) necesitan para las interfaces COM una librería de tipos (mejor conocidas como .TLB) para referenciar y determinar los métodos, parámetros y valores devueltos, ya que Python es un lenguaje dinámico que no ofrece dicha información.
Para mi sorpresa, las implementaciones en lenguajes de tipado estático tampoco parecen ofrecerla, y es necesario en todos los casos usar un compilador de un lenguaje especial de MS (IDL):
https://code.google.com/p/pyafipws/source/browse/pyafipws.idl
Para que lo reconozca hay que agregar al objeto python los atributos _typelib_guid_, _typelib_version_, _com_interfaces_
https://code.google.com/p/pyafipws/source/browse/pyafipws.py#57
Igualmente todo este tema esta deshabilitado ya que el tipado estático ocasiona más problemas que los que resuelve (sobre todo con el registro, DLL hell, falta de flexibilidad, etc.), y hay métodos alternativos más simples para acceder a PythonCOM desde C# y lenguajes similares.
Mi agradecimiento a Mark Hammond (el creador de python-win32) por señalar al ejemplo "pippo" en el directorio win32com\test, como muestra de una asociación entre un objeto Python COM y su TLB.
Mejorando la performance SOAP WSDL:
El protocolo SOAP es complejo, y analizar el XML de la descripción de un webservice (WSDL) para poder comunicarse con el, es un proceso un poco costoso.
Gracias a Python la solución se simplificó bastante, ya que permite guardar y recuperar las estructuras de datos ya procesadas, sin necesidad de artefactos o código generado como en otros lenguajes (.NET, Java, etc.):
https://code.google.com/p/pysimplesoap/source/browse/pysimplesoap/client.py#244
Con el módulo cPickle de la librería estándar (implementado en C) se mejoro el tiempo para cargar un WSDL de 0.4 segundos a aproximadamente a 0.001 segundos, ~ 400 veces más rápido. Con pickle nativo (implementado en python) la mejora era un poco menos significativa (~ 40 veces más rápido).
Los test fueron realizados en una netbook para un webservice medianamente complejo, YMMV
09:18
Manuel Kaufmann (Humitos): Es MUY temprano
08:50
Mariano Draghi (cHagHi): On running
Hace 8 meses que corro de manera más o menos regular, 2 o 3 veces a la semana, entre 7 y 8 km. Si hace un tiempo atrás me decías que iba a estar haciendo esto, y disfrutándolo, y hasta necesitándolo, me hubiera cagado de risa.
Y es que siempre pensé que esto del running era aburrido. Que hacía mucho calor, o mucho frío, o que la ciudad es fea, o que el terreno muy duro, o muy blando, o que hay mucho tránsito, o… excusas.
Para ser un poco más justo conmigo mismo, el año pasado, durante mi estadía en La Feliz, tuve intenciones de empezar a correr. La idea era contagiarme de la mucha gente que corre por la costanera, aprovechar esos meses, y transformarlo en un hábito, de manera que cuando volviera a Baires, iba a estar acostumbrado, e iba a dejar atrás las excusas. Era un plan brillante… pero nunca lo ejecuté. No conté con mi última excusa: las zapatillas. ¿Cómo iba a empezar a correr sin zapatillas especiales? Y entonces lo patié, y auto-jugué un juego del huevo y la gallina con el razonamiento “no voy a gastar $X en zapas si no estoy seguro de que vaya a aprovecharlo” y “no voy a empezar a correr con estas zapas de mierda que tengo y arriesgarme a lesionarme”. Y así pasaron mis cuatro meses en MDQ, donde hice varias cosas, pero correr… nah.
Y así pasó el tiempo, volví, seguí con mi vida, y en mayo del año pasado decidí volver a intentar un ascenso, en Vallecitos. Y estuvo buenísimo, pero volví a plantearme esta cuestión de “pucha, si tuviera más aire, más gambas, si estuviera mejor físicamente, cuanto más hubiera disfrutado esto…” Pero obviamente no hice nada al respecto. cHagHi y deportes nunca fueron una buena dupla… o eso creía yo.
Unas semanas después, Hielo Azul en conjunto con Rodrigo Mazzola arrancó con una propuesta de entrenamientos planificados para trekkings y ascensos (o simplemente para hacer actividad física y sentirte mejor), intitulada “Tu mejor cumbre”. Y decidí prenderme. Me cerraban los horarios. Era en grupo. Se prendían varios amigos que conozco de otros tantos viajes. ¿qué mejor?
Y fue un camino de ida. Entrenar con la guía de alguien que sabe, es buenísimo. Entrenar en grupo, aún más. Y eso hizo que además del entrenamiento específico de los sábados, empezara a salir por mi cuenta. Al principio fue solo para cumplir con la consigna de “hacer algo en la semana”, para hacer valer más la actividad del sábado. Era casi como una obligación auto-impuesta. Por suerte cuando se me pone algo en la cabeza soy bastante testarudo, así que a pesar de que todavía hacía un poco de frío, empecé a salir a la mañana temprano, muy temprano, antes de ir a laburar. ¡Masoquista!, dirán. Y sí… la verdad que un poco, sí.
Pero pasaron las semanas, y de pronto descubrí que correr está bueno, hace bien, no es aburrido, y se va transformando en una droga. Una droga buena y saludable.
En el medio me esguincé levemente un tobillo, y me agarró una pequeña tendinitis, y descubrí que mis zapatillas de mierda eran… bueno, eso, una mierda, y terminé invirtiendo en zapas como la gente. Pero son gajes del oficio, ¿no? Se sobrevive, y se sigue adelante
Otra “locura” que hice en el medio fue anotarme en una carrera. Y fue una muy linda experiencia, porque encima fue medio cross-country, nocturna, lo que le daba un condimento especial. Y me gustó tanto, que supongo que fue la primera, y que este año iré a por más.
Hace unas semanas atrás, en Domuyo, descubrí que el entrenamiento garpa. Garpa mucho. Ya lo sabía, lo sentía, pero bueno, fue una confirmación. Tener más fuerza en las piernas, y especialmente tener más estado aeróbico te permite disfrutar la película mucho, pero mucho mucho más.
¿Qué más? Encontré personas geniales. A algunos los conocía, pero no a todos, y formamos un grupo muy muy lindo, que fue trascendiendo el “juntarse el sábado a entrenar”.
Así que acá estoy. Entrenando. Corriendo. Y encima, disfrutándolo. ¿quién lo hubiera pensado?
miércoles, 16 febrero
20:00
Alejandro Santos: Space Players, 13 años más tarde (nostalgia)
La imagen de arriba es un juego llamado Space Players, corriendo con Wine en Debian Squeeze. Para jugar al Space Players hace falta el Runtime de VB5, disponible en la página de Microsoft.
Me da un poco de nostalgia.
Recorriendo viejos archivos encontré un link a mi primer sitio web hecho en Front Page 2.0, donde publiqué uno de los primeros juegos que hice. Estaba hecho en Visual Basic 5.0 y tenía música MIDI.
Dejenme repetirlo: ¡tenía musica MIDI!
Luego de 13 años el sitio sigue funcionando, aún cuando desde hace 12 años que dejé de ser cliente. Acabo de hacer un mirror en mi hosting actual, por las dudas. La empresa de hosting dejó de existir hace varios años, y hoy en día las oficinas se convirtieron en una heladería.
15:51
Facundo Batista: Haciendo dieta
No es la primera vez que hablo acá de hacer dieta, pero les traigo más data para que vean lo mal que me salió el año pasado esta cuestión, :p
Soy un firme creyente que una de las claves para controlar tu peso, es pesarte. Después, si tenés constancia para pesarte todos los días, mejor, porque vas teniendo feedback sobre cuan efectivo o no es lo que hacés para bajar de peso.
Y, si luego agarrás eso datos y tirás una curva, es que ya sos medio enfermito. Por eso:

(click en la imagen para verla más grande)
Como ven, arranqué el año a full, y bajé mucho, pero luego fui recuperando el peso poco a poco. Me di cuenta que las conferencias y los viajes jugaron muy en contra, :|
Este año sigo con la dieta, pero todavía no pude ponerme estricto con la misma, estoy rondando los 90 kilos... pero ahora, al pasar estos números y ver que bajé incluso de los 84, me dió mucha bronca, y veremos si podemos encauzar eso en ponernos firmes (y también espero aprovechar la presión social producto de publicar los valores acá).
martes, 15 febrero
18:51
Juan Rodriguez Monti: Me regalaron un Go !
Hace ya bastante tiempo que estoy esperando tener una versión de moléculas y no de bits del Juego Go. Y ayer me lo regalaron!.
Para quienes no lo conozcan, les recomiendo mirar el link de Wikipedia en donde se explica sobre el juego y hay algunos vínculos para aprenderlo. Es un juego que se juega hace mucho, mucho tiempo. Un juego interesantisimo.
Mi novia me regaló este hermoso juego de Go en madera con piedras y cajas contenedoras para las piedras!. El tablero es de 19 x 19.
La verdad es que estoy muy contento y entusiasmado con el regalo que me hizo el amor de mi vida. Te amo mucho!. Gracias!.
Les dejo unas fotos:
17:32
Mariano Draghi (cHagHi): Acuchillando lunares
Mientras esto aparece en la web, gracias a la magia de dejar un post programado para que se publique solito (hi-tech FTW! (¿?)), supuestamente yo estoy en un quirófano y me están haciendo una cirugía menor para extraer tres (o dos) lunares. Esperemos que tres, porque si no voy a tener que volver a por el otro en unos meses… pero depende.
Dos están muy juntos uno al lado del otro en el abdomen; dependerá de la elasticidad de la piel (algo que el cirujano solo puede evaluar en el momento) si da para hacer dos cortes tan juntos. Y con el tercero, que está en un costado es un tema de si le alcanza la anestesia para los tres. Así que puede que me saque uno del abdomen y el del costado, o los dos del abdomen, o los tres.
Son lunares que me acompañan desde hace muchos años, más de 15, y son producto de una quemadura fea fea de sol en La Lucila, un verano. Estoy seguro de eso.
Más o menos me los controlo regularmente, aunque tampoco con toda la regularidad que debería (anualmente). Los controles han variado de ir a una guardia cuando algún hospital hace la campaña de controles (se suele hacer todos los años), a ir a un dermatólogo particular. Lo primero sinceramente no lo recomiendo: las dos o tres veces que lo hice, el trámite fue: “A ver, sacate la remera. Aha, no, no es nada. ¡El que sigue!”. Por un lado se entiende porque son campañas de control masivo, y se deben concentrar en la gente que realmente muestra algún síntoma de que el lunar pasó a ser otra cosa.
En mi caso son lunares feos, pero en teoría siguen siendo “lesiones benignas”. Esto igual se va a estudiar bien una vez que los saquen. Y no es que sean feos estéticamente (bueno, sí, aparte), sino que tienen todas, pero todas las características de los lunares que pueden transformarse en otra cosa: son grandes, asimétricos, de forma irregular, de color irregular, el contorno no está bien definido. Son una mierda, bah.
Hace un par de meses me hice un nuevo control con una dermatóloga que me recomendó mi hermano, y la doctora enseguida decidió que mejor los sacamos. Hincha las pelotas, sí, porque es una cirugía (a lo mejor dos, o más, porque la verdad es que tengo más lunares feitos además de estos tres que son los más feitos), porque me obliga a estar en reposo “deportivo” unas semanas, y porque bueno, por más que sea una cirugía menor, es una cirugía al fin.
Pero supongo que en el fondo estaba buscando un especialista que se decidiera por el cuchillo y ya. Los sacamos, me quedo tranquilo de que son benignos, y no me preocupo más.
lunes, 14 febrero
18:36
Mariano Guerra: iterar por directorios con espacios en un shell script
la vida nos sonríe, nos sentimos cual neo escribiendo comandos en el shell a diestra y siniestra, estamos a punto de para las balas con las manos, corremos:
for i in $(ls); do echo $i; done
y nuestra ilusión hacker se nos cae a pedazos al ver que cada palabra de un directorio o archivo con espacios sale en una linea nueva.
no desesperaos (?) he aquí la solución.
reproduzcamos el error para después arreglarlo:
$ mkdir -p "t/folder 1" "t/folder 2" "t/folder 3 with more spaces" $ cd t $ for i in $(ls); do echo $i; done folder 1 folder 2 folder 3 with more spaces
vamos de nuevo ahora con la solución:
$ IFS="$(echo -e "\n\r")" $ for i in $(ls); do echo $i; done folder 1 folder 2 folder 3 with more spaces
y todos felices (incluso carlin calvo que puede seguir hackeando literalmente a dos manos en sus computadoras auspiciadas por fravega)
Administración y hosting cortesía de Net Managers SRL
Tema por Andrés Antista
Banner por Joaquín Sorianello
Blogs
Leito Monk
Gustavo Carmona
Manuel Muradás
Maximiliano Robaina
Gonzalo Sainz Trápaga
Marcos Vanetta
Nicolás César
Alberto Paparelli
Santiago Peresón (Yaco)
Margarita Manterola
Javier Castrillo
Santiago Bruno
Paul M. Dorr
Evita
Alejandro Santos
Manuel Kaufmann (Humitos)
Joaquin Sorianello
Angel Freire (cuerty)
Mariano Draghi (cHagHi)
Marcelo Fernández
Roberto Alsina
Pablo Benjamín Arroyo
Juan Pedro Fisanotti
Gabriel Patiño
Guillermo Heizenreder
Marcos Dione
Juan Bautista Cabral
John Lenton
José C. Massón
Ezequiel Gutesman
Mauro Lizaur
Mariano Guerra
Matías E. Gieco
Nicolás Miyasato
Martín Gaitán
Pablo Alejandro Costesich
Mario Zorz
PyAr en la OLPC
Carlos Joel Delgado Pizarro
Mariano Reingart
Ramiro Morales
Roberto Allende
San Cayetano
Alejandro Alvarez
Martín Cerdeira
PyDay Cordoba
Diego Sarmentero
Walter Alini
Sebastian Bassi
César Portela
Nicolás Echániz
Juanjo Conti
Juan Rodriguez Monti
Héctor Sánchez (Karucha)
Patricio Molina
Andrés Gattinoni
Facundo Batista
Francisco Malbrán





































![Validate my RSS feed [Valid RSS]](/web/20110307020851im_/https://planeta.python.org.ar/valid-rss.png)