Martín Cerdeira: Django-IDE: Ahora en GitHub!

   Publicado:

Ya está subido el código de lo que hay hasta ahora, de la IDE que estoy cocinando:

Introducing: Django-IDE 

Hay mucho por hacer y mucho por mejorarle, por lo que, colaboradores bienvenidos!

Ramiro Algozino: Nuevo Theme

   Publicado:

Sólo quería comentarles eso.. Cambié el theme del sitio por uno un poco más limpio y liviano, con colores claros. Me cansé del anterior con colores tan oscuros y pesados, creo que el nuevo tema ayuda a la lectura. :-D El tema que elegí se llama Reddle por si alguien se lo preguntaba ;-)

 

Saludos!


Andrés Gattinoni: Resolver problema con la resolución de un monitor ViewSonic con nVidia en Linux

   Publicado:
X.Org

X.Org

Resumen

Un monitor ViewSonic VG2021wm y una placa de video nVidia GeForce 6500 dejan de entenderse espontáneamente en Linux Mint y el Xorg pasa a funcionar sólo en modo 640×480. ¿La solución? Deshabilitar el uso de EDID y configurar manualmente los datos del monitor en el xorg.conf.

Desarrollo

Ayer me sucedió algo muy raro. Hace varios meses vengo usando Linux Mint sin mayores inconvenientes en mi máqunia. Cuando ayer fui a encender la máquina (sin que mediara ningún cambio extraño, ningún update de los drivers de la placa de video ni ninguna instalación de software), el X iniciaba sesión solamente en resolución 640×480. Teniendo un monitor de 20″, cuya resolución óptima es de 1680×1050, se darán cuenta que la imagen era espantosa: no entraba nada en la pantalla.

Después de varias horas sin entender bien cuál era el problema, postear en el foro de Linux Mint sin respuesta, y buscar en Internet, me puse a revisar los logs del X y encontré que mencionaba errores para leer el EDID. Por ejemplo:

Unable to get display device CRT-0's EDID; cannot compute DPI

¿Qué es el EDID? Extended display identification data, es una estructura de datos que ofrecen los dispositivos de visualización (ej.: los monitores) y que permiten, por ejemplo, a una placa de video conocer sus cualidades. De esta manera, la operatoria normal habría sido que mi placa de video obtuviera los datos del monitor de su EDID y conforme a ello me diera las opciones adecuadas para configurar mi pantalla. Más concretamente, el Xorg lo que hace es obtener a través de la placa de video, entre otros datos, la frecuencia horizontal (HorizSync) y la tasa de refresco vertical (VertRefresh) (para más información sobre qué es cada una de estas variables, pueden consultar esta página).

La cuestión es que de buenas a primeras, el Xorg dejó de poder leer el EDID de mi monitor y por eso levantaba con los datos default para un monitor CRT (por cierto, entre las cosas que aprendí ayer, el driver de nVidia le pone de nombre “CRT” a cualquier dispositivo que se conecte al puerto VGA, no tiene nada que ver con lo que efectivamente esté conectado). Eso quiere decir que tomaba un HorizSync y un VertRefresh que solamente eran compatibles con una resolución de 640×480@50 Hz.

¿Por qué pasa esto? La verdad, no lo sé a ciencia cierta. Encontré a este usuario que le pasó lo mismo, y levantando de un Live CD se dio cuenta que no era un problema de configuración, entonces lo resolvió cambiando su cable DVI por un cable VGA con un adaptador. Yo comprobé lo mismo, el problema no estaba en la configuración de mi Xorg, pero como yo sólo tenía cable VGA, probé cambiandolo por otro cable VGA, pero no hizo diferencia. Entonces seguí buscando y llegué a este otro post donde alguien lo resolvió sencillamente cambiando los HorizSync y VertRefresh en el xorg.conf.

Me bajé el manual de mi monitor (ViewSonic VG2021wm) y busqué los datos correspondientes (HorizSync y VertRefresh), y los puse en el xorg.conf. Este tipo de configuración manual del Xorg es lo que viene a evitar el EDID. El tema es que al reinicar el X, el Xorg seguía intentando leer el EDID y como no podía, seguía dando el mismo problema.

Finalmente, y casi por casualidad, me di cuenta que el nvidia-xconfig tenía unos parámetros para que configurara el xorg.conf indicándole al Xorg ignorar el EDID. Entonces ejecuté el siguiente comando:

sudo nvidia-xconfig --no-use-edid --no-use-edid-dpi --no-use-edid-freqs --mode=1680x1050

Y con eso me quedó generado el siguiente xorg.conf

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 280.13  (pbuilder@cake)  Mon Aug  8 15:37:15 UTC 2011

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "InputDevice"

    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"

    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"

    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "LCD-1"
    HorizSync 24.0 - 82.0
    VertRefresh 50.0 - 85.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
EndSection
Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option "UseEdidFreqs" "False"
    Option "UseEdid" "False"
    Option "UseEdidDpi" "False"
    SubSection     "Display"
        Depth       24
        Modes      "1680x1050" "1680x1050_60.00"
    EndSubSection
EndSection

Si ven los parámetros resaltados, en la sección Monitor defino el HorizSync y el VertRefresh. Y luego en la sección Screen, los parámetros que evitan que se use el EDID (anteriormente existía una opción IgnoreEDID que fue deprecada, ver los comentarios de este artículo).

Una vez modificado el xorg.conf solamente tuve que reiniciar el X y volvió a la normalidad. Después tuve que pelearme un rato con GDM para volver a configurar la resolución adecuada (1680×1050@60 Hz) utilizando nvidia-settings. Pero esto puede tener que ver con todas las vueltas que dí antes de encontrar la solución.

Mariano Reingart: Trazabilidad de Medicamentos, Operaciones Cambiarias y Remito Electrónico

   Publicado:

En el proyecto PyAfipWs se ha agregado soporte para varios webservices:


Con estos servicios web el proyecto PyAfipWs se ha expandido más allá de los webservices de AFIP, incluyendo otras entidades y servicios, completando e integrando las funcionalidades más usadas por sistemas de gestión en Argentina, no solo para python sino que con la interfaz COM se pueden usar desde otros lenguajes en Windows (Visual Basic, Visual Fox Pro, Delphi, ABAP - SAP, etc.) e incluso con interfaces de texto o por linea de comando en otras plataformas (DOS, UNIX).
Próximamente se agregará soporte para archivos CSV, DBF (dBase, FoxPro, Clipper, etc.), extendiendo y facilitando aún más el acceso a estos servicios web desde lenguajes de programación legados.

Respecto a la librería PySimpleSOAP, se realizaron las siguientes mejoras para soportar los nuevos webservices:

  • Mejoras en analisis de WSDL (separando nombres de elementos y tipos complejos, reconocimiento de las diferentes partes de los mensajes, tag vacios)
  • Soporte de SOAP Header (encabezados para autenticación)
  • Soporte básico para WSSE (WebService-Security Extensions)
  • Ajustes por servidor, para formar el requerimiento según cada plataforma evitando incompatibilidades (por ej., no enviar tag vacio a JBoss-AS pero si )
Las modificaciones experimentales están en una rama propia del repositorio, ya que algunos cambios pueden introducir incompatibilidades hacia atrás o todavía no son del todo definitivos. Más información en:

http://code.google.com/p/pysimplesoap/

Gracias a tener un desarrollo propio para la comunicación SOAP se pudieron solucionar estos y otros inconvenientes, incluso cuando otras soluciones para webservices fallaban o no se ajustaban a los requerimientos (que por cierto, ningun servicio web ha sido igual a otro, cada nuevo webservice introduce ligeras incompatibilidades, interpretaciones diferentes del standard SOAP o nuevas características).

El servicio COT no es un webservice tradicional ya que no utiliza XML para el requerimiento ni SOAP para la respuesta, teniendo su propio esquema, por lo que solo se uso SimpleXMLElement de PySimpleSOAP (manejo de xml simple estilo objetos), y se adapto un WebClient para codificar los métodos POST. 
Gracias a Matias Gieco por aportar los ejemplos iniciales que posibilitaron desarrollar el componente.

Más información sobre el proyecto en:

http://code.google.com/p/pyafipws/

Anuncios completos:

Ramiro Algozino: Cómo actualizar Fedora 15 a 16 sin dolor

   Publicado:

Después de un tiempo de usar Ubuntu 11.10 bastante conforme, con la llegada de Unity me ví en la encrucijada (?) de decidir si seguir con Unity o irme para el lado de Gnome3. Con la salida de Fedora15 teniendo la mejor implementación de Gnome3 a la fecha, decidí volver a la distro que había dado tantas satisfacciones.

Estuve usando Fedora 15 sin mayores problemas prácticamente desde que salió, incluso la personalicé bastante y quedé muy conforme con el resultado. Particularmente el tema Faience (del creador de los íconos Faenza) sumado a Zukitwo hace una combinación espectacular!

#EsTodoRisasHastaQue salió Fedora16, dado que había personalizado bastante mi instalación de F15, me daba mucha fiaca tener que instalar de cero F16 y reinstalar todas las aplicaciones y personalizaciones que había hecho (ni hablar que ni siquiera recuerdo como hice la gran mayoría). Investigando un poco me encuentro con preupgrade, que resulta ser un método soportado oficialmente para hacer upgrades de versiones en Fedora! :-)

Cómo uso PreUpgrade?

Primero que nada hagan backup por las dudas! una vez que tengan listo el backup, hagan un update del sistema a las últimas actualizaciones  (yum update). Ahora que tienen todo actualizado y bonito, fijensé si tienen instalado preupgrade, en caso contrario con un ‘yum install preupgrade’ es más que suficiente, está en los repos oficiales de Fedora.

Cuando tengan todo esto listo, como root ejecutan el comando “preupgrade” y se les va a abrir una ventana desde la cual van a poder seleccionar a cuál versión de Fedora quieren actualizar, seleccionan, le dan siguiente y el ayudante comienza a bajar todos los paquetes necesarios, en mi caso fueron un poco más de 600 MB.

Una vez que el asistente haya terminado reinician el sistema y ya tienen F16 instalado! :-D

Oh no!

Si al reiniciar se encuentran con un hermoso cartel que dice “Oh no! Something has gone wrong. A problem has ocurred and the system can’t recover. Please contact a system administrator” y tienen la versión de 64 bits de Fedora instalada lo más probable es que este error se deba al paquete caribou. PreUpgrade lamentablemente instala la versión de 32 bits de este software y crashea el sistema. Para solucionarlo basta con un simple:


yum remove caribou

yum install caribou

Yum se debería encargar de instalar la versión de 64 bits con el último comando.

Se preguntarán.. ¿cómo hago para desinstalarlo e instalarlo si está Gnome no responde? Fácil, presinando Alt+Ctrl+F1, Alt+Ctrl+F2, etc. van alternando entre las distintas tty del sistema. Elijan alguna, logueensé como root o como su usuario y reinstalen caribou con los comando anteriores. Una vez reinstalado vuelvan a la tty que tiene la sesión de Gnome3 y presionen Ctrl+Alt+BackSpace y Voilá!! Disfruten de Fedora 16 :-D

Nota: PreUpgrade tiene un montón más de opciones, como por ejemplo usarlo a través de VNC, o desde la CLI (consola). peguenlé una mirada a la entrada en la wiki aquí: http://fedoraproject.org/wiki/How_to_use_PreUpgrade

Actualización: Nautilus no arranca

Después de unos días me doy cuenta que nautilus no arranca.. :-( Craseha con el siguiente error:

Traceback (most recent call last):
 File "/usr/lib64/python2.7/site-packages/gi/__init__.py", line 23, in <module>
 from ._gi import _API, Repository
ImportError: could not import gobject (error was: ImportError('When using gi.repository you must not import static modules like "gobject". Please change all occurrences of "import gobject" to "from gi.repository import GObject".',))

(nautilus:1733): Nautilus-Python-WARNING **: nautilus_python_init_python failed
Traceback (most recent call last):
 File "/usr/share/nautilus-python/extensions/nautilus_terminal.py", line 48, in <module>
 from gi.repository import Nautilus, Gtk, Gdk, Vte, GLib
 File "/usr/lib64/python2.7/site-packages/gi/__init__.py", line 23, in <module>
 from ._gi import _API, Repository
ImportError: cannot import name _API
Violación de segmento

Según éste bug, este error se da sólo en la versión de 64bits de Fedora y con la extensión nautilus-terminal. Para que arranque nautilus nuevamente debemos desinstalar este plugin de nautilus con el siguiente comando como root:

yum remove nautilus-terminal

Y listo… Nautilus debería funcionar nuevamente sin problemas :-D


Gonzalo Martinez: OnLine

   Publicado:

Volvemos? Veremos esta parece ser una mera prueba pero la intención es grande. Cambié de trabajo hace menos de un mes, y quedarme hoy viernes después de las 12 hs escuchando algo de música electrónica y leyendo NewsSquares, Chrome mediante, es un buen estimulo. No leer un RSS por unos días hace parecer que todo el mundo ha avanzado diez mil pasos mientras vos te pasabas el día intentando configurar un Nagios en la Pyme donde trabajás (para sacarle algún valor agregado al tiempo muerto), intentando innovar con cero pesos, o reclamando a proveedores externos que por ser parte de una Pyme no te dan ni bola.
Fuera de eso hoy quisiera empezar de vuelta. Como amante de la técnología a escribir espero no quedarme en la intención como lo he hecho varias veces.
Pronto nos veremos.

alecu: Adding Proxy support to Ubuntu One

   Publicado:

(TL;DR: Proxy support is a complex matter. We asked our Ubuntu One users to help us with a Proxy survey to understand how proxies are used. We’re releasing the results so other developers can benefit from it.)

During the past few weeks I’ve been working on researching the intricacies of adding proxy support to the Ubuntu One client. Allowing proxies to be used is not as easy as it sounds: our codebase relies on many different libraries and frameworks to access the network, and each of those libraries has a range of support for all the various proxy protocols and the many proxy authentication schemes, that varies from “incomplete” to “non-existent”.

Also we need it to work both for the Linux client and for the new Windows client; we need to test all this with a combination of Proxy server software, protocols, authentication schemes and configurations; and we need to take into account that our file synchronization protocol is not based on the very common and well supported HTTP protocol, but instead it uses a custom protocol optimized for our file synchronization use case, and like all non-HTTP protocols it requires special handling when crossing some types of proxies.

After multiplying of all the above issues, Proxy support ends up sounding a bit complicated in fact. So we decided to run a survey with the Ubuntu One users, asking them about the Proxies that they need to use, to help us understand the most common scenarios and to focus our development efforts.

At this point I need to send a huge “THANK YOU” to our Ubuntu One users: just a day after our initial tweet we got the help of a lot of users that need Proxy support. They filled in our small survey, but they gave us a lot of insight into this matter.

Here are the summary graphs (pdf, 93kb), and since the results of this survey may be useful for other developers wanting to implement Proxy support in their own projects we decided to also release the raw survey data (csv, 43kb).

And a few of my thoughts on the survey:

  • I expected most users to use a Proxy at work or at an educational institution, but did not expect so many people using proxies at home. From the “other” descriptions, they are mostly used for VPNs and for anonymizing proxies.
  • Most people don’t know the proxy brand, nor type of authentication that they need to use. I expected this, and it’s just fine! All proxy enabled software should just work.
  • Authentication schemes are more important than the small number of replies, since they are needed to support the big percentage of users that need to use credentials.
  • Site filtering may prove a big issue for some users: many proxy servers are configured to disallow access to video sites, likely on the basis of conserving network bandwidth, and those network admins may be reluctant to allow file synchronization services like Ubuntu One.
  • Protocol filtering will be a challenge for us: a significant number of proxy installations do not allow network traffic other than HTTP and HTTPS, so we’ll need to tunnel our synchronization protocol thru some of the allowed protocols, probably using the CONNECT HTTP method of some proxy servers. And there’s no easy solution for proxy servers that allow only HTTP or HTTPS but not CONNECT.
  • I didn’t expect so many answers in so short a time. Ubuntu One users rule!

Marcos Vanetta: MongoDB con Mongoid

   Publicado:

MongoDB con Mongoid

Estoy en la RubyConfArg, y hace unos minutos pasaron las LightTalks, en las que por suerte pude hablar sobre Mongoid, un ODM para MongoDB que cumple muy bien con su filosofía propuesta:

The philosophy of Mongoid is to provide a familiar API to Ruby developers who have been using Active Record or Data Mapper, while leveraging the power of MongoDB's schemaless and performant document-based design, dynamic queries, and atomic modifier operations. Aquí les dejo la presentación, cuando tenga fotos las subo.

View more presentations from [malev](http://www.slideshare.net/malev)

Marcos Vanetta: gemsets are the awesomeness

   Publicado:

gemsets are the awesomeness

Cada vez que tenía que usar un proyecto con python, empezaba creando un ambiente particular con virtualenv. En ruby, en principio no podía hacer eso. Después conocí RVM y trabajaba con varias versiones de Ruby en mi PC, sobre todo para trabajar algunos proyectos legacy. Sin embargo, tenía un popurrí de gemas instaladas que ya empezaban a conflictuarse entre sí. Apareció bundler y su magia de bundle exec para solucionar muchos problemas (nota: en futuras versiones de bundler esto ya no va a hacer falta). En fin, la ensalada de gemas seguí ahí, hasta que por fin conocí gemset.

Mi workflow es más o menos así:

  ~  cd code
  code  mkdir proyecto_nuevo
  code  cd proyecto_nuevo
  proyecto_nuevo  rvm use malev@proyecto_nuevo --rvmrc --create
Using /home/malev/.rvm/gems/ruby-1.9.2-p290 with gemset proyecto_nuevo
WARN: .rvmrc is not empty, moving aside to preserve.
  proyecto_nuevo  rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/malev/.rvm/gems/ruby-1.9.2-p290)
   global
   mobilenews
=> proyecto_nuevo
   webui

  proyecto_nuevo

Es decir, voy a mi directorio donde guardo mis proyectos / experimentos, creo un directorio, creo un nuevo gemset y listo! Todas las gems que instale en ese gemset van a estar aisladas del resto. Lo interesante es que gracias a la magia de rvm, cada vez que entre en el directorio de mi proyecto nuevo, rvm me va a cambiar al gemset ahí usado:

  code  pwd
/home/malev/code
  code  rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/malev/.rvm/gems/ruby-1.9.2-p290)
=> global
   mobilenews
   proyecto_nuevo
   webui

  code  cd proyecto_nuevo
=========================================================
= NOTICE                                                                     =
=========================================================
= RVM has encountered a new or modified .rvmrc file in the current directory =
= This is a shell script and therefore may contain any shell commands.       =
=                                                                            =
= Examine the contents of this file carefully to be sure the contents are    =
= safe before trusting it! ( Choose v[iew] below to view the contents )      =
=========================================================
Do you wish to trust this .rvmrc file? (/home/malev/code/proyecto_nuevo/.rvmrc)
y[es], n[o], v[iew], c[ancel]> yes
  proyecto_nuevo  rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/malev/.rvm/gems/ruby-1.9.2-p290)
   global
   mobilenews
=> proyecto_nuevo
   webui

  proyecto_nuevo

Si no tienes rvm instalado, corred e instaladlo por favor!

Marcos Vanetta: Sobre callbacks en Rails

   Publicado:

Sobre callbacks en Rails

¿Qué son los callbacks? Son métodos que son llamados en determinados momentos del ciclo de vida de un objeto. Esto nos permite escribir código que se va a ejecutar cuando nuestros objetos (ActiveRecord u otros) son creados, grabados, actualizados, borrados, validados o cargados desde la base de datos (created, saved, updated, deleted, validated, or loaded). Supongamos que nosotros queremos que inmediatamente después de haber creado un usuario, se cree automáticamente una cuenta para ese usuario. Podríamos hacer esto (por favor no lo intenten en sus casas, puede ser peligroso):

class UsersController < ApplicationController
  def create
    @user = User.new(params[:user])
    @account = Account.create :user => @user
  end
end

Sin embargo, estaríamos contaminando nuestro controller con lógica de modelo. Una primera aproximación, podría ser, usar un callback: after_create. Se ejecuta siempre que se crea un objeto y se lo guarda en la base por primera vez:

class User < ActiveRecord::Base
  #...
  def after_create
    Account.create :user => self
  end
  #...
end

Esta aproximación funciona y está buena, pero tiene algunos problemillas: el nombre del método no describe lo que hace y si tenemos que hacer varias cosas, tendríamos un método gigante. Aquí entran en acción el método de clase: after_create:

class User < ActiveRecord::Base
  #...
  after_create :create_account

  def create_account
    Account.create :user => self
  end
  #...
end

Una vez creado el objeto, ActiveRecord buscará un método llamado "create_account" y lo ejecutará. Esto nos permite tener varios métodos que se ejecuten como callbacks, he inclusive podemos llamarlos de manera secuencial:

class Snippet < ActiveRecord::Base
  after_create :test1
  after_create :test2

  def test1
    puts "test 1"
  end

  def test2
    puts "test 2"
  end
end

y los resultados:

ruby-1.9.2-p136 :002 > s = Snippet.new
 => #<Snippet id: nil, content: nil, user_id: nil... private: false> 
ruby-1.9.2-p136 :003 > s.save
test 1
test 2
 => true
ruby-1.9.2-p136 :004 >

Por supuesto, after_create no es el único callback. Hay mucha información al respecto aquí. Aquí solo voy a listar los callbacks disponibles:

Creando un objeto

  • before_validation
  • after_validation
  • before_save
  • before_create
  • around_create
  • after_create
  • after_save

Actualizando un objeto

  • before_validation
  • after_validation
  • before_save
  • before_update
  • around_update
  • after_update
  • after_save

Eliminando un objeto

  • before_destroy
  • after_destroy
  • around_destroy

Su uso es ampliamente recomendable y una cosa a tener en cuenta es... no podemos evitarlos! No son como las validaciones, en las que a veces podemos no ejecutarlas. Aquí si alguna vez necesitamos saltearlos algún callback, vamos a tener que repensar la lógica del modelo de vuelta. Usar con responsabilidad.

Share