SharpRêve

Unrandom thoughts, unheard ideas, unseen entries, unwritten facts, nonsensical dreams, improbable plans, unmatched soul.

QT ‘n Plot – Simple Ones Julio 9, 2009

Archivado en: Programming thingies — sharpreve @ 10:46 pm
Tags: , , , , ,

Los gráficos pueden hacer divertidas cosas que no lo son, pueden convertir números fríos que no dicen mucho en cosas que cobran sentido, pueden poner una sonrisa en tu cara y hacerte ver el mundo color de rosa. Bah, no tanto, pero están buenos. Un ejemplo es este, cortesía de xkcd

fucking_blue_shells

Matplotlib es una librería (vulg. biblioteca) de Python basada en MATLAB, que nos permite hacer super-gráficos de muchas formas y colores, y si andamos con ganas,podemos integrarlos a nuestros programas de todos los días.

Lo que voy a hacer ahora es mostrar cómo trazar un par de gráficos (y cuando digo un par me refiero a 2) e incrustarlos en una aplicación que tiene una GUI basada en PyQt4 (léase Pie Cute). Los gráficos están inspirados en el clásico chiste de Ramón, que tenía un camón y se iba para Gijón. No cuento el chiste acá por respeto al señor Ramón.

 

 

 
Cuando terminemos, la cosa va a quedar algo así:

 
CamionDeRamon

Los requisitos mínimos para poder hacer esto son:

  • Python (yo uso la versión 2.6)
  • Numpy (tiene clases y funciones para trabajar con arreglos)
  • Matplotlib: hay un instalador para windows y una versión independiente de la plataforma (en este último caso va a haber que usar distutils, como lo indiqué en mi post anterior)
  • PyQt
  • (opcional) Un buen entorno de desarrollo, como Eclipse+PyDev, o Wing IDE Professional si andan platudos

Empecemos por el principio:

  1. Importamos las cosas que vamos a usar:
    import sys
    
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    
    import matplotlib
    import matplotlib.pyplot as plot
    
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    import numpy as np
  2. Creamos e inicializamos la ventana en la que va a transcurrir la acción:
    class FormMain(QMainWindow):
        def __init__(self, parent=None):
            super(FormMain, self).__init__(parent)
    
            self.cc = plot.matplotlib.colors.ColorConverter()
            self.__initialize__()
  3. Escribimos el código de inicialización de la ventana:
    def __initialize__(self):
            self.setWindowTitle(QString(u"El camión de Ramón"))
    
            # mainWidget
            mainWidget = QWidget(self)
            self.setCentralWidget(mainWidget)
    
            # layoutMain
            self.layoutMain = QVBoxLayout()
            mainWidget.setLayout(self.layoutMain)
    
            # Figure and canvas configuration
            self.fig = Figure((6.0,6.0), dpi=100,\
    facecolor=self.cc.to_rgb("lightsteelblue"))
            self.fig.subplots_adjust(hspace=0.25)
            self.canvas = FigureCanvas(self.fig)
            self.canvas.setParent(mainWidget)
            self.layoutMain.addWidget(self.canvas)
            self.axes = self.fig.add_subplot(211)
            self.axes.get_xaxis().set_visible(False)
            self.axes2 = self.fig.add_subplot(212)
    
            #layoutSettings
            self.layoutSettings = QHBoxLayout()
            self.layoutMain.addLayout(self.layoutSettings)
    
            #lblInitialSpeed
            self.lblInitialSpeed = QLabel("Velocidad inicial:")
            self.layoutSettings.addWidget(self.lblInitialSpeed)
    
            #spnInitialSpeed
            self.spnInitialSpeed = QSpinBox()
            self.spnInitialSpeed.setValue(6)
            self.spnInitialSpeed.setMaximum(20)
            self.layoutSettings.addWidget(self.spnInitialSpeed)
            self.connect(self.spnInitialSpeed, SIGNAL("valueChanged(int)"),\
    self.UpdatePlots)
    
            self.layoutSettings.addSpacing(12)
    
            #lblAcceleration
            self.lblAcceleration = QLabel(u"Aceleración:")
            self.layoutSettings.addWidget(self.lblAcceleration)
    
            #spnAcceleration
            self.spnAcceleration = QSpinBox()
            self.spnAcceleration.setValue(7)
            self.spnAcceleration.setMaximum(10)
            self.layoutSettings.addWidget(self.spnAcceleration)
            self.connect(self.spnAcceleration, SIGNAL("valueChanged(int)"),\
    self.UpdatePlots)
    
            self.layoutSettings.addSpacing(12)
    
            #lblTime
            self.lblTime = QLabel("Tiempo:")
            self.layoutSettings.addWidget(self.lblTime)
    
            #spnTime
            self.spnTime = QSpinBox()
            self.spnTime.setValue(20)
            self.spnTime.setMinimum(1)
            self.spnTime.setMaximum(20)
            self.layoutSettings.addWidget(self.spnTime)
            self.connect(self.spnTime, SIGNAL("valueChanged(int)"),\
    self.UpdatePlots)
    
            self.layoutSettings.addStretch()
    
            self.UpdatePlots()

    Ahora la explicación por partes:

    self.fig = Figure((6.0,6.0), dpi=100, facecolor=self.cc.to_rgb("lightsteelblue"))

    Definimos una figura de 6 pulgadas por 6 pulgadas, con una resolución de 100dpi y un fondo de color lightsteelblue.

    self.fig.subplots_adjust(hspace=0.25)

    Establecemos una distancia entre los dos subgráficos igual a 1/4 del tamaño de ellos.

    self.canvas = FigureCanvas(self.fig)
            self.canvas.setParent(mainWidget)
            self.layoutMain.addWidget(self.canvas)

    Creamos un Canvas que es el mismísimo QWidget que se va a mostrar en la ventana, y lo agregamos al layout principal.

    self.axes = self.fig.add_subplot(211)
            self.axes.get_xaxis().set_visible(False)
            self.axes2 = self.fig.add_subplot(212)

    Creamos los dos subgráficos. De los números que se le pasan a add_subplot, elprimer dígito indica el número de filas que va a haber, y el segundo indica el número de columnas (estos dos dígitos tienen que ser iguales en ambos subgráficos, o van a pasar cosas muy desagradables, que ni el más macho de los machos soportaría ver). El tercer dígito indica en qué orden va a aparecer el subgráfico.

    Lo que viene después es código de creación de componentes visuales (Spinboxes y Labels) que se explica solo, lo único que hace falta aclarar es que conectamos las Spinboxes al método UpdatePlots, que vamos a definir a continuación, para que se actualicen los gráficos cada vez que se modifican los valores de velocidad, aceleración y tiempo. Finalmente llamamos a ese método para mostrar los gráficos por primera vez.

  4. Actualizamos los gráficos de velocidad y de posición, y reflejamos los cambios en el Canvas:

    def UpdatePlots(self):
            # Update the subplots
            self.UpdateSpeedPlot()
            self.UpdatePositionPlot()
            self.canvas.draw()
    
  5. Definimos dos pequeños métodos para obtener la velocidad y la posición dados los parámetros especificados por el usuario. Es importante aclarar que como el parámetro time va a ser un arreglo, estos métodos van a devolver arreglos.

    def Speed(self, initialSpeed, acceleration, time):
            return initialSpeed + acceleration * time
    
        def Position(self, initialPosition, initialSpeed, acceleration, time):
            return initialPosition + initialSpeed * time + 0.5 * acceleration \
    * (time ** 2)
    
  6. Cada uno de estos métodos actualiza uno de los gráficos, no explico nada porque ya está todo dicho en los comentarios :) (notarán que antes estaban en inglés y cambiaron súbitamente de idioma, pero es que lo hice para ahorrarme la explicación aparte)

    def UpdateSpeedPlot(self):
            v0 = self.spnInitialSpeed.value()
            a = self.spnAcceleration.value()
            t = self.spnTime.value()
    
            # x es un arreglo con cada segundo, desde 0 a t.
            x = np.arange(0, t + 1)
            # y es un arreglo con la velocidad en cada segundo.
            y = self.Speed(v0, a, x)    
    
            # Limpiamos el gráfico y asignamos lo que va a decir cada eje.
            self.axes.clear()
            self.axes.set_ylabel("Velocidad (m/s)")
            self.axes.set_xlabel("Tiempo (s)")
            # Hacemos que se muestre la cuadrícula.
            self.axes.grid(True)
    
            # Creamos una línea que utilice el arreglo x en el eje x e y en el eje y.
            line = plot.Line2D(x, y, linewidth=2,\
    color=self.cc.to_rgb("yellowgreen"))
            # Agregamos la línea al gráfico y la trazamos.
            self.axes.add_line(line)
            self.axes.plot()
    
            # Las tres últimas instrucciones son equivalentes en este caso a
            # self.axes.plot(x, y, linewidth=2,\
    color=self.cc.to_rgb("yellowgreen"))
            # pero es más prolijo trabajar cada línea por separado, especialmente cuando
            # trabajamos con varias.
    
            # Fijamos los límites de los ejes coordenados.
            self.axes.set_xlim(0, t)
            self.axes.set_ylim(0, 220)
    
        def UpdatePositionPlot(self):
            v0 = self.spnInitialSpeed.value()
            a = self.spnAcceleration.value()
            t = self.spnTime.value()
    
            # x es un arreglo con cada segundo, desde 0 a t.
            x = np.arange(0, t + 1)
            # y es un arreglo con la posición en cada segundo.
            y = self.Position(0, v0, a, x)
    
            # Limpiamos el gráfico y asignamos lo que va a decir cada eje.
            self.axes2.clear()
            self.axes2.set_ylabel(u"Posición (m)")
            self.axes2.set_xlabel("Tiempo (s)")
            # Hacemos que se muestre la cuadrícula.
            self.axes2.grid(True)
    
            # Creamos una línea que utilice el arreglo x en el eje x e y en el eje y.
            line = plot.Line2D(x, y, linewidth=2,\
    color=self.cc.to_rgb("yellowgreen"))
            # Agregamos la línea al gráfico y la trazamos.
            self.axes2.add_line(line)
            self.axes2.plot()
    
            # Fijamos los límites de los ejes coordenados.
            self.axes2.set_xlim(0, t)
            self.axes2.set_ylim(0, 2500)
    

Bueno, ya estamos, acá dejo el código completo, diviértnse haciendo gráficos y no se lastimen :)

#coding=utf-8

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *

import matplotlib
import matplotlib.pyplot as plot

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np

class FormMain(QMainWindow):
    def __init__(self, parent=None):
        super(FormMain, self).__init__(parent)
        self.cc = plot.matplotlib.colors.ColorConverter()
        self.__initialize__()

    def __initialize__(self):
        self.setWindowTitle(QString(u"El camión de Ramón"))

        # mainWidget
        mainWidget = QWidget(self)
        self.setCentralWidget(mainWidget)

        # layoutMain
        self.layoutMain = QVBoxLayout()
        mainWidget.setLayout(self.layoutMain)

        # Figure and canvas configuration
        self.fig = Figure((6.0,6.0), dpi=100, facecolor=self.cc.to_rgb("lightsteelblue"))
        self.fig.subplots_adjust(hspace=0.25)
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(mainWidget)
        self.layoutMain.addWidget(self.canvas)
        self.axes = self.fig.add_subplot(211)
        self.axes.get_xaxis().set_visible(False)
        self.axes2 = self.fig.add_subplot(212)

        #layoutSettings
        self.layoutSettings = QHBoxLayout()
        self.layoutMain.addLayout(self.layoutSettings)

        #lblInitialSpeed
        self.lblInitialSpeed = QLabel("Velocidad inicial:")
        self.layoutSettings.addWidget(self.lblInitialSpeed)

        #spnInitialSpeed
        self.spnInitialSpeed = QSpinBox()
        self.spnInitialSpeed.setValue(6)
        self.spnInitialSpeed.setMaximum(20)
        self.layoutSettings.addWidget(self.spnInitialSpeed)
        self.connect(self.spnInitialSpeed, SIGNAL("valueChanged(int)"), self.UpdatePlots)

        self.layoutSettings.addSpacing(12)

        #lblAcceleration
        self.lblAcceleration = QLabel(u"Aceleración:")
        self.layoutSettings.addWidget(self.lblAcceleration)

        #spnAcceleration
        self.spnAcceleration = QSpinBox()
        self.spnAcceleration.setValue(7)
        self.spnAcceleration.setMaximum(10)
        self.layoutSettings.addWidget(self.spnAcceleration)
        self.connect(self.spnAcceleration, SIGNAL("valueChanged(int)"), self.UpdatePlots)

        self.layoutSettings.addSpacing(12)

        #lblTime
        self.lblTime = QLabel("Tiempo:")
        self.layoutSettings.addWidget(self.lblTime)

        #spnTime
        self.spnTime = QSpinBox()
        self.spnTime.setValue(20)
        self.spnTime.setMinimum(1)
        self.spnTime.setMaximum(20)
        self.layoutSettings.addWidget(self.spnTime)
        self.connect(self.spnTime, SIGNAL("valueChanged(int)"), self.UpdatePlots)

        self.layoutSettings.addStretch()

        self.UpdatePlots()

    def Speed(self, initialSpeed, acceleration, time):
        return initialSpeed + acceleration * time

    def Position(self, initialPosition, initialSpeed, acceleration, time):
        return initialPosition + initialSpeed * time + 0.5 * acceleration * (time ** 2)

    def UpdatePlots(self):
        # Update the subplots
        self.UpdateSpeedPlot()
        self.UpdatePositionPlot()
        self.canvas.draw()

    def UpdateSpeedPlot(self):
        v0 = self.spnInitialSpeed.value()
        a = self.spnAcceleration.value()
        t = self.spnTime.value()

        # x es un arreglo con cada segundo, desde 0 a t.
        x = np.arange(0, t + 1)
        # y es un arreglo con la velocidad en cada segundo.
        y = self.Speed(v0, a, x)    

        # Limpiamos el gráfico y asignamos lo que va a decir cada eje.
        self.axes.clear()
        self.axes.set_ylabel("Velocidad (m/s)")
        self.axes.set_xlabel("Tiempo (s)")
        # Hacemos que se muestre la cuadrícula.
        self.axes.grid(True)

        # Creamos una línea que utilice el arreglo x en el eje x e y en el eje y.
        line = plot.Line2D(x, y, linewidth=2, color=self.cc.to_rgb("yellowgreen"))
        # Agregamos la línea al gráfico y la trazamos.
        self.axes.add_line(line)
        self.axes.plot()

        # Las tres últimas instrucciones son equivalentes en este caso a
        # self.axes.plot(x, y, linewidth=2, color=self.cc.to_rgb("yellowgreen"))
        # pero es más prolijo trabajar cada línea por separado, especialmente cuando
        # trabajamos con varias.

        # Fijamos los límites de los ejes coordenados.
        self.axes.set_xlim(0, t)
        self.axes.set_ylim(0, 220)

    def UpdatePositionPlot(self):
        v0 = self.spnInitialSpeed.value()
        a = self.spnAcceleration.value()
        t = self.spnTime.value()

        # x es un arreglo con cada segundo, desde 0 a t.
        x = np.arange(0, t + 1)
        # y es un arreglo con la posición en cada segundo.
        y = self.Position(0, v0, a, x)

        # Limpiamos el gráfico y asignamos lo que va a decir cada eje.
        self.axes2.clear()
        self.axes2.set_ylabel(u"Posición (m)")
        self.axes2.set_xlabel("Tiempo (s)")
        # Hacemos que se muestre la cuadrícula.
        self.axes2.grid(True)

        # Creamos una línea que utilice el arreglo x en el eje x e y en el eje y.
        line = plot.Line2D(x, y, linewidth=2, color=self.cc.to_rgb("yellowgreen"))
        # Agregamos la línea al gráfico y la trazamos.
        self.axes2.add_line(line)
        self.axes2.plot()

        # Fijamos los límites de los ejes coordenados.
        self.axes2.set_xlim(0, t)
        self.axes2.set_ylim(0, 2500)

app = QApplication(sys.argv)
frmMain = FormMain()
frmMain.show()
app.exec_()
 

Another Round Against Python Junio 23, 2009

Archivado en: Programming thingies — sharpreve @ 5:43 pm
Tags: ,

No tengo nada contra Python. Nada, me encanta y es hermoso, es lindo poder definir conjuntos por comprensión, poder hacer lo que uno quiera con las funciones, y parsear texto en dos patadas. Pero todo se vuelve oscuro y sombrío cuando empieza haber problemas con las distribuciones y uno se pasa medio día leyendo esas mail lists horribles que a veces pueden ser inspiradoras pero que nunca presentan una solución clara para nada.

El otro día me pasó tratando de empaquetar mis programas escritos en Python para que puedan ejecutarse sin ningún problema en Windows. Probé PyInstaller y Py2Exe, después de muchas horas pude hacer andar el segundo, pero ambos presentaban problemas de alguna u otra manera relacionados con Python 2.6, e indirectamente con los elementos del runtime y compiladores de C++ 2008.

Hoy otra vez, a tirarme piedras con distutils, que no me compilaba ninguna de las clases de C vinculadas a alguna biblioteca de Python que quería instalarme, y notificandome con un clarísimo (está titilando el detector de sarcasmo) mensaje que decía “error: none”.
Casi me volví loco buscando por todos lados el VS2008 C++ compiler, tratando de encontrar el problema en los archivos fuente de distutils y haciendo treinta mil cosas frustrantes más.

Al final bajé el instalador para Windows del compilador mingW, lo instalé (por supuesto), agregué \bin al PATH y en el terminal donde estaba tratando de instalar lo que estaba tratando de instalar puse:
python setup.py build –compiler=mingW32 install

Para mi total y absoluta sorpresa, anduvo, y tan sorprendido sigo que todavía ando con la boca abierta.

Conclusiones:

  • Las cosas open-source son muy lindas y me encantan, pero cuando hay problemas, hay problemas (a diferencia del software propietario, que cuando hay problemas, qué se le va a hacé’)
  • Esto lo estoy escribiendo como una forma de recordarme en el futuro cómo hacer si me vuelve a pasar.
  • Debería estar estudiando física y epistemología, chau. :)

P.D.: ¡post número 42!

 

Tokyo Clear Zero Degrees Celcius Junio 1, 2009

Archivado en: Musique — sharpreve @ 7:42 pm
Tags: , ,

There are moments in my life or situations to which I find impossible not to attach a song. Today has been a very cold day, and as I walked to and from university, the lyrics of Eastern Youth’s Tokyo Clear Zero Degrees Celcius kept running through my head, so simple, soothing and deep.

As I felt the sharp cold in my face and walked past a playground, full of all kinds of colourful things, I got stuck on the verse Colors burst at the freezing point. The refrain left me thinking about something sad but unavoidable, We are alike in that we both have no destination. There’s nothing to do about it but to leave your hands tucked away in your pockets and keep on walking.

Spread over the sky. the white sculpture afloat
cruises slowly and magnificently
Down on earth, my footsteps sound
Down on earth, my humming sounds
Tough to laugh right now
But I’ll see you off with a bitter smile

See you, bye, so long
We are alike in that we both have no destination

Yes
Moments pass in that way
At a dizzying speed,
probably at the pace of my heartbeat
Colors burst at the freezing point
An Up-train tears through the town
In the serene winter winds
Silhouettes rush to and fro

See you, bye, so long
We are alike in the way we drift

Blue and white, red and yellow
Green and gray
Ordinary colors are just as good
Only wish I felt them
at the bottom of my hearts

See you, bye, so long
We are alike in that we both have no destination

(thanks http://www.geocities.com/eyfansite/ for the lyrics)

 

Returning Arrows Mayo 28, 2009

Archivado en: Fun and Games — sharpreve @ 12:44 pm
Tags: , , ,

Jugando un rato al Civilization con Gabriel y Martín el Sábado, después de una de las semanas más complicadas que tuve en lo que va del año, vimos (y escuchamos de la boca del magnífico y español narrador del Civilization IV) el proverbio kurdo “No dispares la flecha que pueda volverse contra ti.”. Más allá de su sentido metafórico, que supongo que quiere decir algo como “no hagas algo de lo que después te puedas arrepentir”, pensamos en lo más importante, que es ¿cuándo puede una flecha tirada por vos mismo volverse contra vos?

Lo primero que se me pasó por la mente fue algo así:

flecha que puede volverse hacia ti.jpg

pero después me di cuenta que no tenía mucho sentido así que descarté la idea (aunque me hubiese gustado que sea así).

Martín se quedó un poco al margen de la discusión, quizá porque no está tan de gusto, quemado y obsesionado con física (materia con la que mantenemos una fuerte relación amor-odio) como nosotros, pero Gabriel y yo pensamos en las siguientes posibilidades (las más razonables pensadas por Gabriel, obviamente :) ):

  1. Tirar la flecha verticalmente hacia arriba y quedarse a esperarla
  2. Hacer un tiro oblicuo de la flecha y correr hasta el lugar donde va a caer antes de que llegue (esto puede ser un poco complicado de lograr, a menos que tengamos las zapatillas de Detective Conan o algo por el estilo)
  3. Colgar un hilo o soga del techo, atar la flecha al extremo y dispararla sin demasiada fuerza. No va a venir muy derecha que digamos, pero vuelve al fin y al cabo.
  4. Atar una soga a un palo, atar la flecha al extremo libre y pedirle a alguien que nos haga el favor de sostener el palo horizontalmente, con el brazo extendido, asegurándole que no le va a doler. Después de eso, disparar la flecha, que va a dar la vuelta y nos va a dar en la mismísima cabeza.
  5. Disparar la flecha con punta de metal e inmediatamente poner un imán con una atracción colosal delante nuestro.
  6. Disparar la flecha contra alguien, fallar, y que la otra persona la levante y nos la tire a nosotros. Este punto es seguramente el menos convincente ¡pero nuestra flecha se vuelve contra nosotros después de todo!

Eso concluye el inusual y poco serio post de hoy. Ahora me voy a seguir con la lengua dormida por la anestesia que me puso la dentista. Chau :)

 

Not so transparent Mayo 22, 2009

Archivado en: Digital World — sharpreve @ 10:21 pm
Tags: , ,

Mucha agua ha corrido bajo el puente desde la última entrada en este blog, y la última entrada fue precisamente otra queja por un problema parecido. ¿Qué pasó? Cada vez que quería entrar a ver algún blog alojado en WordPress (o sea, nombre de dominio + .wordpress.com) pasaban varios minutos antes de que terminara de mostrarse, si es que se mostraba (lo más gracioso es que en mi blog lo único que tardaba mucho en cargarse eran las puntitas de los recuadros de cada post). Además de eso (y el principal problema), es que no podía llegar de ninguna manera a la página de creación de posts. Es una sensación de impotencia terrible estar ahí, a un paso de escribir lo que uno quiere escribir y no poder, y ver que desde cualuier lado menos desde mi casa podía entrar.

Hipótesis

Cuando hice este post creía que ya había solucionado el problema, pero no, porque los DNS que estaba usando dejaron de funcionar. Probé con un chillón de otras direcciones de DNS, pero las cosas solamente empeoraban. Fueron muchas las cosas que creí que podían estar pasando:

  • Speedy tiene bloqueado WordPress (como había hecho Jazztel en un momento)
  • Los DNS de Speedy son malos, y se pierden hasta en un pasillo (aunque esta afirmación es completamente verdadera, no fue del todo el problema esta vez)
  • La gente de WordPress mandó mi blog a un servidor en la Isla Cuadrada de Kookamonga, donde los datos son transportados por una persona que llega nadando, a 2bps
  • El firewall de mi router se está haciendo el vivo
  • Mi MTU es demasiado alto (cosa que me había pasado en Ubuntu, y que conté acá)
  • El hombrecillo encargado de La Internet no me quiere

Lo que realmente pasó

Fue entonces, al borde de la desesperación, cuando decidí usar Wireshark (un analizador de paquetes, que nos deja mirar toda la información que pasa por nuestra red totalmente desnuda) para ver qué onda (como diría con mucho atino el señor Álvarez cuando hablaba de funciones senoidales). Y ahí, en esa selva de información, vi cosas que erizarían los pelos del honvre más intrépido, y me di cuenta de que Speedy estaba haciendo cosas a mis espaldas. Haciendo un poco más de investigación por mi cuenta y leyendo otro poco (uno de las cosas que leí fue este post de Javier Smaldone, terriblemente inspirador), me di cuenta de que estoy atrás de un proxy transparente que Speedy puso sin permiso de nadie, y como todo lo que Speedy toca, anda mal.

Soluciones

La solución a esto es bastante simple, aunque quizá sea un poco molesta y no la mejor (la mejor sería que Speedy dejara de molestar y sacara este proxy). Consiste en acceder desde un proxy online como Proxify, o bajarse algún add-on de firefox como PhProxy. PhProxy es muy cómodo, porque lo activamos cuando queremos cliqueando su ícono, que está en la barra de direcciones o en la barra de estado (abajo de todo). Lo que puede pasar a veces es que el servidor proxy que elige no anda, pero eso se arregla bastante fácil haciedo click derecho sobre su pequeño ícon y eligiendo otro.

Eso es todo por ahora, fue una semana terriblemente cansadora, y un día particularmente cansador. Me voy, pero dejo una frase del sabio usuario de WordPress thesacredpath:

Ah yes, the infamous transparent proxy servers: responsible for more problems than we can ever imagine.

 

Another Problem, Another Solution Abril 13, 2009

Archivado en: Digital World, Rants & Raves — sharpreve @ 9:39 pm
Tags: , ,

Al parecer, al matar un problema aparece otro nuevo. Una vez que ya había arreglado la cosa que no me dejaba entrar a WordPress, que conté hace un tiempo en este post, no podía ver muchas de las imágenes de flickr.
¿Qué había pasado? no sé exáctamente, pero alguien piensa que estoy en un país autoritario que levanta firewalls que censuran ciertas imágenes y no me deja verlas. Por un lado, es una vergüenza que todavía sigan censurando, jugando a un juego del gato y el ratón que no termina más. Por otro lado, ¡soy argentino!.
Les agradezco muchísimo a los desarrolladores del add-on de Firefox Acces Flickr!, que me solucionó el problema.

Todo esto pasó cuando traté de ver las fotos de David Giral, que son de las que más me gustan de toda la Internet :)

 

Holy Saturday Abril 11, 2009

Archivado en: Life, Musique — sharpreve @ 1:49 pm
Tags: , ,

La semana pasada fue bastante rara, la primera mitad fue horrible, como dije en mi anterior post en el que están las letras de Corrected Eyesight 0.6, andaba algo triste; la segunda parte fue totalmente lo opuesto, ya me había resignado a estar mal toda la semana, pero no pude evitar sentirme bien y reírme de las cosas que me habían estado molestando, aunque sepa que no es para reírse.

Vi La Era de Hielo, que aunque no rankee entre mis favoritas estuvo muy buena, y El Arca Rusa, una película… rusa que tiene de raro que está toda filmada en una sola toma, y en un solo lugar, el Hermitage de San Petersburgo. Está buena porque muestra cosas que no se ven comunmente, hay una cantidad muy grande de actores, todos bien vestidos y coordinados, y tiene un buen mensaje. Por otro lado, es muy lenta, tanto que puede hacer que algunas personas caigan irremediablemente dormidas. En este blog está explicada un poco mejor, es una película bastante interesante para ver.

Por otra parte, estuve escuchando las canciones de Ozma que nunca escucho, como Come Home Andrea, Turtleneck Coverup y Curve in the Old 1-9, y ahora no puedo parar de cantarlas. Eso me hizo acordar del repositorio de archivos de Ozma, donde se pueden bajar directamente muchísimas canciones de shows en vivo, de proyectos paralelos de los miembros de la banda y b-sides. El nombre de usuario es ozma y la clave 14domino, por supuesto.
Ahí hay también un cover muy bueno de Karma Police, de Radiohead, tocada por Daniel Brummel and The Contraband.

Los últimos tres días no estuve haciendo casi nada de la universidad, así que hoy trataré de volver al tren :)

 

Corrected Eyesight: 0.6 (Kyousei Shiryoku 0.6) Abril 6, 2009

Archivado en: Musique — sharpreve @ 12:31 pm
Tags: , , , , , ,

El nombre de esta canción llama la atención ¿no?
A diferencia de muchas de las canciones de Eastern Youth, acá no hay gritos, pero como en casi todas, se mantiene la introspección y el estilo haiku de las letras (no por la métrica, sino por la forma de describir las escenas). Es una canción melancólica, y creo que como me siento ahora no había mejor momento para escucharla otra vez y hacer este post.

Smashed my cellphone and was barely connected to society… cómo me gusta esta parte.

La traducción al inglés de las letras la hizo Michael Hart, al que le agradezco un montón, porque además se tomó la molestia de sacarle fotos a cada una de las páginas del booklet de What Can You See from Your Place? y mandármelas cuando no podía encontrar las letras por ninguna parte.

 
Japanese:

Nankai datte yarinaosu
Nankai datte yarinaosu
Kanashimi nante kawa ni suterunda
Kanashimi nante kawa ni suteru
Hontou wa uchi-poketto ni shimatta mama da
Shiyou ga nai kara tsurete aruku
Gogo no hi ga kagettekite
Ore wa me wo agu
Nanimo miecha inai ga

Asa na yuu na ni oretachi hitori
Anna machi konna machi sa
Soko de kaze wo mitari, tsuki wo mitari sa
Surechigatte sugu
Mienaku naru

Keitaidenwa wo hakai shite
Youyaku sekai to tsunagatta
Baka na ore wa itsudemo
Tsumasaki-dachi de
Heddoraito ni obiete aruku
Tooku de inu ga hoeteiru
Ore wa te wo furu
Daremo furimukiya shinai ga

Biru-ma ni, yoru ni ame wa ochite
Anna hito konna hito sa

Soko de yume wo mitari, hana wo mitari sa
Yotsukado de mata mienaku naru

Nankai datte yarinaosu
Nankai datte yarinaosu
Nankai datte yarinaosunda
Nankai datte yarinaosu
Shizuka ni asa ga yattekite
Sore wo mukaete
Namida wo gutto nomikondeiru
Hoomu no ichiban densha ni wa wazato norazu ni
Akai sora wo miteita

Yoake ni kumo ga moete hikatte
Yokogao nijimaserunda
Soshite ore wa migi ni, kimi wa hidari sa
Furimukeba mou mienaku naru

Asa na yuu na ni oretachi hitori
Anna machi konna machi sa
Soko de kaze wo mitari, tsuki wo mitari sa
Surechigatte sugu
Mienaku naru

 
English:

How many times must I start over?
Throw all that grief into the river!
In truth, I put in my inside pocket, as it is
Nothing to be done but walk
The evening light begins to fade
I raise my eyes
But there is nothing to be seen

Morning and evening, we are alone
Such a town, this kind of town
So, I watch the wind and I watch the moon
pass each other
soon to disappear

Smashed my cell phone
and was barely connected to society
Stupid me, always standing on tiptoes,
walking frightened in the headlights
Far off, a dog is barking
I wave my hand
but no one turns around

The rain falls on an alley at night
Such a person, this sort of person
So, I dream and see a flower
At the crossroads, it again disappears

How many times must I start over?
How many times must I start over?
Be quiet! Morning comes around
I go out to meet it, firmly swallowing my tears
Consciously missing the first train,
watching the red sky

At dawn, the clouds burn away and the sun shines
And profiles blur
And I am to the right, you, left
Turn a bit more and we will disappear

Morning and evening, we are alone
Such a town, this kind of town
So, I watch the wind and I watch the moon
pass each other
soon to disappear

 

Ubuntu and the Unemptyable Trash Bin Abril 3, 2009

Archivado en: Digital World — sharpreve @ 10:53 pm
Tags:

¿Cuál es la peor pesadilla de alguien que usa Ubuntu y tiene que deshacerse rápidamente de archivos comprometedores? Que sean inborrables. Aunque lo que probablemete quería borrar yo eran canciones malas que me habían quedado por ahí, debo decir que es muy molesto saber que en la papelera quedan a veces archivos o carpetas que no pueden ser borrados.

Lo que hay que hacer es abrir una terminal, loguearse como superusuario (con sudo o su), moverse usando cd hasta /home/ /.local/Share/Trash/ y borrar lo que haga falta usando rm (puede hacer falta moverse a algna de las subcarpetas de Trash antes).

A mich y a mí ya nos pasó, esperemos que no haya más víctimas :p

 

Speedy and its mother Abril 2, 2009

Archivado en: Digital World — sharpreve @ 6:21 pm
Tags: ,

Hacía un rato bastante largo queno posteaba nada acá. En parte admito mi culpa, pero por otro lado, debo felicitar a la gente de Speedy, porque con esfuerzo y perseverancia han demostrado de forma definitiva e irrefutable que son unos inútiles.

Desde hace casi un mes venía sin poder acceder a mi dashboard de WordPress, o sea, no podía postear, editar, ni hacer nada con mi blog. Apenas podía verlo, y había muchísimos blogs más de wordpress a los que no podía entrar, las páginas se empezaban a cargar, pero ahí se quedaban. Hasta que hoy, con la paciencia al límite y aprovechando el tiempo libre que dan los feriados, me puse a buscar la solución, y después de casi una hora la encontré: cambiar los freaking DNS automáticos de Speedy por otros, no importa cuales, siempre que sean un poco confiables.

Así que supongo y espero que ahora, con este asunto solucionado y ayuda del clima otoñal que inspira a escribir, postearé un poco más en el tiempo que sigue, para suerte o desgracia de quien lea :)