Ha pasado un poco más de una semana desde que decidí usar un tiling window manager "en serio".
Claro, estoy haciendo un poquito de trampa porque estoy usando KDE más Kröhnkite
pero mis ventanas hacen mosaicos y me gusta.
Por qué esto y no i3 u otra cosa?
Porque no quiero cambiar mi estilo de vida, nada más quiero que mis ventanas no se solapen todo el tiempo.
Kröhnkite me da suficiente funcionalidad "tiling" que obtengo (creo) los beneficios sin el masivo
despelote de abandonar todas las cosas de mi escritorio a las que estoy acostumbrado. Todavía uso la tecla
Windows (ok, ok, la tecla "Meta") para lanzar apps, sigo teniendo un panel de plasma con plasmoides en la parte de abajo de mi monitor. ¡Puedo hacer que las ventanas floten si quiero! Puedo usar la mayoría de los atajos de teclado
de mis 24 años usando KDE (sí, en serio) etc.
¿Cuáles cosas tuve que cambiar para adaptarme?
Tuve que pasar a focus-follows-mouse. PERO por primera vez desde que empecé a usar FVWM en 1993
me gusta más que click-to-focus. Resulta que la implementación de KDE está buena y básicamente "hace lo
que uno quiere". Como dice en la documentación, "es como click to focus, pero no hacés click".
Saqué las decoraciones de las ventanas. Sí, se pueden dejar, pero se ve raro.
Puse bordes más gruesos. Cambiar el tamaño de las ventanas con el teclado no está bueno, así que los bordes
más gruesos ayudan.
¿Cuáles cosas me gustaron?
Tener layout tiling en un monitor y floating en el otro está muy bueno cuando se necesita. Y lo puedo activar
o desactivar con una tecla. En general: layouts dinámicos y separados por pantalla son muy, muy útiles.
Tener un WM "tiling" pero que todavía respeta las convenciones de la mayoría de los WMs está bueno. Los popups
flotan, ok?
El atajo Alt+Enter para hacer que una ventana sea la "importante" está genial.
Me encanta como maneja maximización/minimización.
¿Cuáles cosas no me gustaron?
El layout "tiled" tiene múltiples versiones que se cambian con Ctrl+I/D ... y a veces ninguna es exactamente
lo que quiero? También suele pasar que las mas "altas" no parecen hacer nada, probablemente porque no tengo
suficientes ventanas en el mosaico.
Ya que no tengo decoraciones en las ventanas, la inconsistencia brutal acerca de cual es el atajo para cerrar una
aplicación es muy molesto. Puede ser ctrl+q o ctrl+x o esc o ninguno de ellos. Termino haciendo alt+f4 que
se siente como Windows 3.11
La experiencia de scripts para KWin no es perfecta. Instalé otro hace un tiempo, llamado Quarter-Tiling, y lo
desinstalé, hasta donde sé no hay rastros de él en mi sistema ... excepto por sus atajos de teclado, que van
a ensuciar mi diálogo de atajos para siempre.
Entonces hoy en la hora del almuerzo me puse a limpiar la basura. Este post
describe con qué terminé, que es el server mínimo que me sirve para algo.
Hosting
Es un VPS barato provisto por los amigos de burst.net que no me pagan para decir cosas buenas de su servicio.
Sin embargo, las digo igual:
Muy barato (U$S 5.50 pero tengo 20% de descuento para siempre)
Bastante transferencia cada mes
Mucho espacio
Buen uptime
Red rápida
Muy barato
Performance decente
Barato
Distribución
Ya tenía CentOS 5, y sigue ahí. Si burst alguna vez ofrece Ubuntu Precise, capaz
que cambio. O, ya que esto anda, capaz que no.
Lo bueno de CentOS: estable y aburrido.
Lo malo de CentOS: es un poco demasiado aburrido. Montones de cosas simplemente
no están empaquetadas.
Web Server
Tengo que servir una cantidad de dominios, pero con una peculiaridad: son todos
sitios estáticos. Lo que quiero es:
Bajo uso de recursos
Performance decente (con rangos y negociación de contenidos)
Estable
Con índices de directorio
Fácil de configurar
Dominios virtuales por nombre
Casi cualquier servidor anda para esto. Hasta Apache, excepto por eso de la
configuración sencilla. Terminé con gatling
porque cumple esos criterios bastante bien.
Usa alrededor de 1.4MB de RAM que está bueno en un VPS.
Esta es la configuración: "-c /srv/www -P 2M -d -v -p 80 -F -S" (no, no hay archivo de configuración)
Los dominios virtuales son carpetas y symlinks adentro de /srv/www que es lo más fácil posible.
Soporta proxy inverso para cuando quiero probar una webapp python en la que estoy trabajando.
Mail Server
No quiero un mail server. Tengo gmail y un server de verdad para eso. Lo que quiero son los
mails de cron. Para eso usé ssmtp
y una cuenta extra de gmail. Funciona, y esta es toda la configuración:
Lo mejor que puedo decir es que funciona, y no involucra correr un server.
Misc
Para cuando tengo que estar en dos lugares al mismo tiempo: OpenVPN es lo más, y
no se aceptan discusiones. Tengo un squid corriendo a veces, y hay un Quassel core para IRC. Instalé mosh
para que el ssh sea menos doloroso, rsync hace deployments
y guarda backups, cron ejecuta cosas, y nada más.
Status
Montones de RAM y CPU libres (sí, esa es la lista completa de procesos):
[root@burst1 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2156 664 ? Ss 22:01 0:00 init [3]
root 1135 0.0 0.1 2260 576 ? S<s 22:01 0:00 /sbin/udevd -d
root 1518 0.0 0.1 1812 572 ? Ss 22:01 0:00 syslogd -m 0
root 1594 0.0 0.1 7240 1032 ? Ss 22:01 0:00 /usr/sbin/sshd
root 1602 0.0 0.2 4492 1112 ? Ss 22:01 0:00 crond
root 1630 0.0 0.1 5684 716 ? Ss 22:01 0:00 /usr/sbin/saslauthd -m /var/run/saslauthd -a pam -n 2
root 1631 0.0 0.0 5684 444 ? S 22:01 0:00 /usr/sbin/saslauthd -m /var/run/saslauthd -a pam -n 2
root 1636 0.0 0.2 3852 1372 ? S 22:01 0:01 /opt/diet/bin/gatling -c /srv/www -P 2M -d -v -p 80 -F -S
root 1677 0.0 0.2 4284 1232 ? Ss 22:02 0:00 SCREEN /root/quasselcore-static-0.7.1
root 1678 0.0 2.1 36688 11148 pts/0 Ssl+ 22:02 0:03 /root/quasselcore-static-0.7.1
root 3228 1.0 0.7 12916 4196 ? Ss 23:28 0:13 mosh-server new -s -c 8
root 3229 0.0 0.3 3848 1588 pts/2 Ss 23:28 0:00 -bash
root 3275 0.0 0.1 2532 908 pts/2 R+ 23:48 0:00 ps aux
[root@burst1 ~]# w
23:49:03 up 1:47, 1 user, load average: 0.00, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 186.153.52.253 23:28 0.00s 0.01s 0.00s w
[root@burst1 ~]# free
total used free shared buffers cached
Mem: 524800 49100 475700 0 0 0
-/+ buffers/cache: 49100 475700
Swap: 0 0 0
Teniendo en cuenta todo, bastante contento con el resultado.
Así que acá va un pequeño tutorial acerca de como usar algunas de esas APIs. Lo hice usando Python y PyQt por varios motivos:
Son excelentes herramientas para prototipos
Tienen excelente soporte para las cosas que necesito (DBus, HTTP, OAuth)
Es lo que sé y me gusta. Lo hice un domingo, no lo pienso hacer en PHP
y Gtk.
Dicho eso, no hay nada específico de python o de Qt en este código. Donde hago
un request HTTP usando QtNetwork, podés usar libsoup o lo que fuere.
Vayamos a los bifes entonces. Las piezas más importantes de Ubuntu One, desde el
punto de vista de infraestructura, son Ubuntu SSO Client, que se encarga de
login, registración, etc, y SyncDaemos que maneja la sincronización de archivos.
Para interactuar con ellas, en Linux, ofrecen interfaces DBus. Así que, por ejemplo,
este es un fragmento mostrando como obtener las credenciales de Ubuntu One (esto
normalmente sería parte del __init__ de un objeto):
# Get the session busbus=dbus.SessionBus():::# Get the credentials proxy and interfaceself.creds_proxy=bus.get_object("com.ubuntuone.Credentials","/credentials",follow_name_owner_changes=True)# Connect to signals so you get a call when something# credential-related happensself.creds_iface=dbus.Interface(self.creds_proxy,"com.ubuntuone.CredentialsManagement")self.creds_proxy.connect_to_signal('CredentialsFound',self.creds_found)self.creds_proxy.connect_to_signal('CredentialsNotFound',self.creds_not_found)self.creds_proxy.connect_to_signal('CredentialsError',self.creds_error)# Call for credentialsself._credentials=Noneself.get_credentials()
Tal vez notaste que get_credentials no devuelve las credenciales. Lo que hace es, le
dice a SyncDaemon que las obtenga, y entonces, si/cuando aparecen, se emite una de esas
señales, y uno de los métodos conectados se llama. Esto está bueno porque no tenemos
que preocuparnos de que se nos bloquee la aplicación mientras SyncDaemon está buscando
las credenciales.
¿Y qué hay en esos métodos? ¡No mucho!
defget_credentials(self):# Do we have them already? If not, get'emifnotself._credentials:self.creds_proxy.find_credentials()# Return what we've got, could be Nonereturnself._credentialsdefcreds_found(self,data):# Received credentials, save them.print"creds_found",dataself._credentials=data# Don't worry about get_quota yet ;-)ifnotself._quota_info:self.get_quota()defcreds_not_found(self,data):# No credentials, remove old ones.print"creds_not_found",dataself._credentials=Nonedefcreds_error(self,data):# No credentials, remove old ones.print"creds_error",dataself._credentials=None
Así que básicamente, self._credentials contiene unas credenciales, o None. Felicitaciones, ya
entramos a Ubuntu One.
¡Hagamos algo útil! ¿Que tal preguntar cuánto espacio libre hay en la cuenta? Para eso, no
podemos usar las APIs locales, si no conectarnos a los servers, que son los que saben
si estás excedido de quota o no.
El acceso se controla via OAuth, por lo que para acceder a esa API necesitamos firmar
nuestros pedidos. Aquí se ve como se hace. No es particularmente iluminador, yo no lo
escribí, solamente lo uso:
defsign_uri(self,uri,parameters=None):# Without credentials, return unsigned URLifnotself._credentials:returnuriifisinstance(uri,unicode):uri=bytes(iri2uri(uri))print"uri:",urimethod="GET"credentials=self._credentialsconsumer=oauth.OAuthConsumer(credentials["consumer_key"],credentials["consumer_secret"])token=oauth.OAuthToken(credentials["token"],credentials["token_secret"])ifnotparameters:_,_,_,_,query,_=urlparse(uri)parameters=dict(cgi.parse_qsl(query))request=oauth.OAuthRequest.from_consumer_and_token(http_url=uri,http_method=method,parameters=parameters,oauth_consumer=consumer,token=token)sig_method=oauth.OAuthSignatureMethod_HMAC_SHA1()request.sign_request(sig_method,consumer,token)print"SIGNED:",repr(request.to_url())returnrequest.to_url()
¿Y cómo pedimos el estado de quota? Accediendo al punto de entrada https://one.ubuntu.com/api/quota/
con la autorización adecuada, se obtiene un diccionario JSON con el espacio total y el usado.
Acá hay una muestra de como hacerlo:
# This is on __init__self.nam=QtNetwork.QNetworkAccessManager(self,finished=self.reply_finished):::defget_quota(self):"""Launch quota info request."""uri=self.sign_uri(QUOTA_API)url=QtCore.QUrl()url.setEncodedUrl(uri)self.nam.get(QtNetwork.QNetworkRequest(url))
De nuevo: get_quota no devuelve la quota. Sólo lanza un pedido HTTP a los servers de
Ubuntu One, que (eventualmente) responden con los datos. No querés que tu app se quede
ahí trabada mientras tanto, por eso QNetworkAccessManager va a llamar a self.reply_finished
cuando tenga la respuesta:
¿Qué más queremos? ¿Qué tal notificación cuando cambia el status de SyncDaemon? Por ejemplo,
cuando la sincronización está al día, o cuando te desconecta. De nuevo, esas son señales
DBus a las que uno se conecta en __init__:
self.status_proxy=bus.get_object('com.ubuntuone.SyncDaemon','/status')self.status_iface=dbus.Interface(self.status_proxy,dbus_interface='com.ubuntuone.SyncDaemon.Status')self.status_iface.connect_to_signal('StatusChanged',self.status_changed)# Get the status as of right nowself._last_status=self.process_status(self.status_proxy.current_status())
la función process_status is código aburrido para convertir la info de status de syncdaemon en
una cosa legible como "Sync is up-to-date", así que guardamos eso en self._last_status y
actualizamos el menú.
¿Qué menú? ¡Un menú contextual de un QSystemTrayIcon! Lo que leyeron son las piezas principales
que se necesitan para crear algo útil: una aplicación de SystemTray para Ubuntu One que se puede usar
en KDE, XFCE u Openbox. O, si estás en unity y tenés sni-qt instalado, un app indicator.
¿Cómo pasó esto? ¿Qué me pasó? ¿Qué estaba pensando? Es una historia aburrida y poco interesante.
Entré a trabajar a Canonical. A mi notebook vieja no le daba el cuero. La nueva no quería que le instalara Ubuntu. Dije "ma sí, me voy a vivir a una VM". La VM era más lenta que el Checho Batista. Tenía que desarrollar cosas en Windows (sí). Algunas cosas no funcionaban bien en la VM. Y de a poquito, las cosas y los archivos se juntaban en windows, en el hardware real, Windows 7 Home Premium.
En general, Windows 7 es no horrible. La mayoría de las cosas andan. Lo que sí, para un programador, es cultivar en el desierto. Podés hacer que crezcan cosas, pero hay que ponerle muchas ganas.
Así que hoy instalé Kubuntu Oneiric (¡ningún problema!), junté todos los datos de la notebook vieja, de la Vm, de windows, borré windows, y me mudé a Linux, y ahora Windows es la VM.
Conswguí la imagen de testing de Android 2.0 de http://android-x86.org. Probé la "estable" 1.6 "stable" pero... era horrible, la mitad de las teclas o opciones de menú hacían que se colgara, reiniciara o se prendiera fuego.
Entonces... ¿cómo va? ¡Lento, pero con potencial!
Lo malo:
Arranca rápido... pero mi Arch Linux arranca más rápido.
Es leeeeento, podés ver cada letra individaual cuando escribís en el coso de búsqueda. Leí que es temporal. Ojalá!
Estoy con una experiencia limitada en aplicaciones porque los "android stores" libres no están tan provistos como el "android marketplace" oficial (¿y porqué corno no puedo bajar apps gratis de ahí????)
Veo agujeros obvios en el panorama de aplicaciones que supongo están bien cubiertos en el marketplace (como, ¿hay un reemplazo para RadioTray?)
¿No hay editor de texto?
¿No hay un procesador de texto semi-decente? ¿Ni siquiera uno que genere HTML?
El web browser es patético. Tal vez esté bien para un teléfono, pero ¿para un sistema "real"? Es horrible. Te da la versión móbil de todos los sitios (obvio) y muchos no te dejan pasar a la "real" (hasta google con el Google Reader), y por supuesto, no hay flash.
El cliente de correo es terrible. No podés no hacer top-posting!!!! "In-Reply-To" está roto!
Las opciones de WiFi están demasiado escondidas. Deberían poderse sacar del icono de wifi.
Lo bueno:
Se apaga muy rápido.
Algunas apps están buenas, especialmente el Aldiko book reader es buenísimo (y puedo compartir los ePub con el fbReader del lado de arch.
El cliemte SSH tiene buenas ideas.
Me gusta mucho el enfoque de "todas tus cosas están en el SD". Hago exactamente lo mismo en Linux. De hecho tengo exactamente la misma organización en los dos sistemas operativos.
La pantalla home con el cajón deslizante de aplicaciones: lindo
La barra de notificaciones "agarrable": muy lindo
Lo de "apretá la tecla menú para ver el menú"? Genio ;-)
Lo de "todo fullscreen todo el tiempo"? Funciona en esta pantalla.
La instalación de aplicaciones es un problema solucionado.
Sé que voy a tener Qt nativo y no puedo esperar!
Todavía no estoy convenciso, Arch es mucho más rápido por ahora, y hace muchas más cosas pero...
Me encargué una pantalla táctil para tener la experiencia como se supone que hay que tenerla.
Lo uso mucho para leer de noche en la cama (Recién terminé Makers, léanlo, está bueno!).
Lo estoy usando para leer correo de vez en cuando (me niego a responder con esa porquería)
Es un despertador bastabte bueno, así que ahora es mi sistema operativo de mesa de luz.
Voy a escribir otro reporte una vez que tenga la pantalla táctil y/o una versión nueva (y ojalá que más rápida).