Eugeni's blog

One blog to rule them all. Kinda.

Browsing the 2008 October archive

Quem usa o netspeed-applet do gnome e atualizou ele para versão 0.15, descobriu que esta versão não permite mais modificar o tamanho da fonte. Para mim isso é essencial (as fontes que vem pode padrão são muito grandes), por isso decidi fazer um patch para dar suporte a isso.

Para quem usa ArchLinux, o PKGBUILD já está no AUR :) .

Para quem não usa ele, esse é o patch:

netspeed-applet with editable font size option

diff -ru netspeed_applet-0.15.2/src/netspeed.c netspeed_applet-0.15.2.fontsize/src/netspeed.c
--- netspeed_applet-0.15.2/src/netspeed.c   2008-09-13 16:59:52.000000000 -0300
+++ netspeed_applet-0.15.2.fontsize/src/netspeed.c  2008-10-23 14:57:41.000000000 -0200
@@ -85,6 +85,7 @@
    gboolean show_sum, show_bits;
    gboolean change_icon, auto_change_device;
    GdkColor in_color, out_color;
+   int font_size;
    int width;

    GtkWidget *inbytes_text, *outbytes_text;
@@ -664,8 +665,11 @@

    /* Refresh the text of the labels and tooltip */
    if (applet->show_sum) {
+       add_markup_size(&applet->devinfo.sum_rate, applet->font_size);
        gtk_label_set_markup(GTK_LABEL(applet->sum_label), applet->devinfo.sum_rate);
    } else {
+       add_markup_size(&applet->devinfo.rx_rate, applet->font_size);
+       add_markup_size(&applet->devinfo.tx_rate, applet->font_size);
        gtk_label_set_markup(GTK_LABEL(applet->in_label), applet->devinfo.rx_rate);
        gtk_label_set_markup(GTK_LABEL(applet->out_label), applet->devinfo.tx_rate);
    }
@@ -891,6 +895,7 @@
    return;
     }
     panel_applet_gconf_set_string(PANEL_APPLET(applet->applet), "device", applet->devinfo.name, NULL);
+    panel_applet_gconf_set_int(PANEL_APPLET(applet->applet), "font_size", applet->font_size, NULL);
     panel_applet_gconf_set_bool(PANEL_APPLET(applet->applet), "show_sum", applet->show_sum, NULL);
     panel_applet_gconf_set_bool(PANEL_APPLET(applet->applet), "show_bits", applet->show_bits, NULL);
     panel_applet_gconf_set_bool(PANEL_APPLET(applet->applet), "change_icon", applet->change_icon, NULL);
@@ -901,6 +906,15 @@
     applet->settings = NULL;
 }

+/* Set the font size to the new value
+ */
+static void
+font_size_adjust_cb(GtkSpinButton *spinbutton, NetspeedApplet *applet)
+{
+   applet->font_size = gtk_spin_button_get_value_as_int(spinbutton);
+   applet->width = 0;
+}
+
 /* Called when the showsum checkbutton is toggled...
  */
 static void
@@ -944,7 +958,12 @@
    GtkWidget *category_header_label;
    GtkWidget *network_device_hbox;
    GtkWidget *network_device_label;
+   GtkWidget *label_font_size_hbox;
+   GtkWidget *label_font_size_hbox2;
+   GtkWidget *label_font_size_label;
+   GtkWidget *label_font_size_spinbutton;
    GtkWidget *indent_label;
+   GtkWidget *points_label;
    GtkWidget *show_sum_checkbutton;
    GtkWidget *show_bits_checkbutton;
    GtkWidget *change_icon_checkbutton;
@@ -1033,6 +1052,31 @@
    gtk_combo_box_set_active(GTK_COMBO_BOX(applet->network_device_combo), active);
    g_object_set_data_full(G_OBJECT(applet->network_device_combo), "devices", devices, (GDestroyNotify)free_devices_list);

+   label_font_size_hbox = gtk_hbox_new(FALSE, 6);
+   gtk_box_pack_start(GTK_BOX(controls_vbox), label_font_size_hbox, TRUE, TRUE, 0);
+
+   label_font_size_label = gtk_label_new_with_mnemonic(_("Label _font size:"));
+   gtk_label_set_justify(GTK_LABEL(label_font_size_label), GTK_JUSTIFY_LEFT);
+   gtk_misc_set_alignment(GTK_MISC(label_font_size_label), 0.0f, 0.5f);
+   gtk_size_group_add_widget(category_label_size_group, label_font_size_label);
+   gtk_box_pack_start(GTK_BOX(label_font_size_hbox), label_font_size_label, FALSE, FALSE, 0);
+   
+   label_font_size_hbox2 = gtk_hbox_new(FALSE, 6);
+   gtk_box_pack_start(GTK_BOX(label_font_size_hbox), label_font_size_hbox2, TRUE, TRUE, 0);
+   
+   label_font_size_spinbutton = gtk_spin_button_new_with_range (5.0, 32.0, 1.0);
+   gtk_spin_button_set_value(GTK_SPIN_BUTTON(label_font_size_spinbutton), (double) applet->font_size);
+   gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(label_font_size_spinbutton), TRUE);
+   gtk_spin_button_set_digits(GTK_SPIN_BUTTON (label_font_size_spinbutton), 0);
+   gtk_label_set_mnemonic_widget(GTK_LABEL(label_font_size_label), label_font_size_spinbutton);
+   gtk_box_pack_start(GTK_BOX(label_font_size_hbox2), label_font_size_spinbutton, TRUE, TRUE, 0);
+   
+   points_label = gtk_label_new(_("points"));
+   gtk_label_set_justify(GTK_LABEL (points_label), GTK_JUSTIFY_LEFT);
+   gtk_misc_set_alignment(GTK_MISC (points_label), 0.0f, 0.5f);
+   gtk_size_group_add_widget(category_units_size_group, points_label);
+   gtk_box_pack_start(GTK_BOX (label_font_size_hbox2), points_label, FALSE, FALSE, 0);
+   
    show_sum_checkbutton = gtk_check_button_new_with_mnemonic(_("Show _sum instead of in & out"));
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_sum_checkbutton), applet->show_sum);
    gtk_box_pack_start(GTK_BOX(controls_vbox), show_sum_checkbutton, FALSE, FALSE, 0);
@@ -1048,6 +1092,9 @@
    g_signal_connect(G_OBJECT (applet->network_device_combo), "changed",
             G_CALLBACK(device_change_cb), (gpointer)applet);

+   g_signal_connect(G_OBJECT (label_font_size_spinbutton), "value-changed",
+            G_CALLBACK(font_size_adjust_cb), (gpointer)applet);
+
    g_signal_connect(G_OBJECT (show_sum_checkbutton), "toggled",
             G_CALLBACK(showsum_change_cb), (gpointer)applet);

@@ -1343,6 +1390,30 @@
    }
 }  

+/* Tries to get the desktop font size out of gconf
+ * database
+ */
+static int
+get_default_font_size(void)
+{
+   int ret = 12;
+   char *buf, *ptr;
+   
+   GConfClient *client = NULL;
+   client = gconf_client_get_default();
+   if (!client)
+       return 12;
+   buf = gconf_client_get_string(client, "/desktop/gnome/interface/font_name", NULL);
+   if (!buf)
+       return 12;
+   ptr = strrchr(buf, ' ');
+   if (ptr)
+       sscanf(ptr, "%d", &ret);
+   g_free(buf);
+       
+   return ret;
+}
+
 static gboolean
 applet_button_press(GtkWidget *widget, GdkEventButton *event, NetspeedApplet *applet)
 {
@@ -1526,6 +1597,7 @@
    applet->show_sum = FALSE;
    applet->show_bits = FALSE;
    applet->change_icon = TRUE;
+   applet->font_size = -1;
    applet->auto_change_device = TRUE;

    /* Set the default colors of the graph
@@ -1553,6 +1625,9 @@
        applet->show_bits = panel_applet_gconf_get_bool(applet_widget, "show_bits", NULL);
        applet->change_icon = panel_applet_gconf_get_bool(applet_widget, "change_icon", NULL);
        applet->auto_change_device = panel_applet_gconf_get_bool(applet_widget, "auto_change_device", NULL);
+       applet->font_size = panel_applet_gconf_get_int(applet_widget, "font_size", NULL);
+       if (!applet->font_size)
+           applet->font_size = -1;

        tmp = panel_applet_gconf_get_string(applet_widget, "device", NULL);
        if (tmp && strcmp(tmp, "")) 
@@ -1587,6 +1662,9 @@
        }
    }

+   if (applet->font_size < 1)
+       applet->font_size = get_default_font_size();
+   
    if (!applet->devinfo.name) {
        GList *ptr, *devices = get_available_devices();
        ptr = devices;

O Camelo da Sibéria voltou à ativa!

Leia a seguir duas matérias excepcionais by Eugeni e Buzon, que vão transformar o mundo como o conhecemos! :)

Camelo da Sibéria » O futuro da leitura

Descobertas (by Buzon)

Agora nois vai que vai! :)


First HDR attempt, originally uploaded by eugeni_dodonov.

Hoje no lifehacker.com saiu uma matéria sobre criação de HDR. Curiosamente, eles citaram link para uma tag no flickr. E, curiosamente, a minha foto aparecia em primeiro lugar na página linkada.

Como conclusão – em menos de 1 dia a foto recebeu mais de 1300 visitas! Mais de que todas as outras fotos juntas em um período de 1 ano!

:)

Sem comentários! Reuters diz que não é montagem! Achei aqui!

Mais um exemplo do poder de python + gtk. Para tirar um screenshot da tela, salvando-o em formato JPEG, o seguinte código é suficiente:

from gtk.gdk import *
screenshot = Pixbuf(COLORSPACE_RGB, False, 8, screen_width(), screen_height())
screenshot.get_from_drawable(get_default_root_window(), colormap_get_system(), \
    0, 0, 0, 0, screen_width(), screen_height())
screenshot.save("tela.jpg", "jpeg", {"quality": "75"})

(Tá certo, dividi em 5 linhas para melhorar a legibilidade, mas no fundo são só 4 linhas mesmo).

Uma das maiores vantagens do python para mim é a legibilidade do código, facilidade de programação, e eficiência. Com quantas linhas de código seria possível fazer esse exemplo em qualquer outra linguagem? (Não vale apelar para import -window root tela.jpg porque aí é ImageMagick que faz toda a mágica!) :)


First HDR attempt, originally uploaded by eugeni_dodonov.

…e agora, primeira tentativa de criar um HDR.

Na verdade, não sei se isso é um HDR de verdade, ou somente um tone-mapping.. Mas a gama de cores ficou muito superior à da imagem original.

Hoje decidi gastar um tempo para aprender a fazer panoramas (em outras palavras, fotos compostas de forma contínua a partir de fotos menores). Por exemplo, você quer tirar foto da paisagem inteira, mas.. a sua camera só consegue pegar 1/3 dela. Solução? Tirar 3 fotos e juntar todas elas depois.

Para fazer isso, usei o Hugin. Usei 2 fotos que eu tirei no fim da semana, juntando-as para formar uma paisagem só.

Para a minha surpresa, foi absurdamente fácil o processo. Demorou menos de 5 minutos, sendo que o Hugin conseguiu fazer tudo sozinho (encontrar os pontos comuns entre as figuras, juntar elas, ajustar a exposição, etc).

Dá para ver o resultado da brincadeira no flickr.

Ahh, e tutorial que ensina a fazer tudo isso está aqui.

Bem, hoje saiu nova versão “estável” de Mandriva – Mandriva 2009. Aproveitando que estava com conexão rápida, baixei o CD de instalação (Mandriva ONE, versão que vem com Gnome) e instalei no meu note.

Concluindo em poucas palavras – essa versão de Mandriva não se deu bem com o meu notebook (ASUS G1S). Logo após a instalação, na hora de reiniciar o micro, o notebook travou de vez. Ao bootar, ele pediu para adicionar usuários (eu já tinha montado o meu /home antigo na instalação), e decidi usar o mesmo UID para o meu usuário, para continuar com os arquivos que eu tenho. Assim que eu adicionei um usuário, ele ficou mexendo sem parar no disco, rodando algum comando gigante com um grep e consumindo 100% de CPU. Aparentemente, ele quis mudar todos os arquivos do meu $HOME (tem 100GB.. hehehe) para.. para.. para algo o que eu não consegui descobrir :) . Quando matei o grep, tudo continuo normalmente, até carregar o gnome.

Carregando o gnome, a tela tornou-se pouca usável – ao mexer o mouse, o display fica cheio de pequenos pixels pretos (algo parecido acontecia com antigas placas de vídeo da S3, onde o driver de video corrompia a memória de vídeo das placas). Pelo que eu vi, Mandriva usa o driver beta de Nvidia, o que causa este problema. Entretanto, no meu notebook eu usei todos os drivers beta também (173.08, 173.14.09, 177.13, 177.67, 177.70, 177.78 e 177.80), e nunca deu esse problema.

Também por algum motivo ele detectou 2 bluetooth’es e não detectou placa de wireless (iwl4965). Durante o boot, dá a impressão de que ele fica se divertindo com o sistema – a tela apaga e acende, e depois fica com menos brilho (será que é o notebook mode?), a webcam integrada pisca, liga e desliga…

Enfim, a primeira impressão que eu tive é que o mandriva 2009 não gostou do meu notebook. Vou esperar alguns dias para sair updates, aí eu tento atualizar, para ver se melhora alguma coisa. No entanto, continuo com o meu querido Arch Linux já faz 1 ano e meio! Até então o recorde foi do Slackware (4 anos consecutivos), mas ele perdeu justamente para o Arch Linux.

Trains of Russia – uma coleção impressionante de diversos tipos de trens que tem na Rússia.

Quando morava lá, tinha várias ferrovias perto da casa.. Lembro até agora!

Linus Torvalds, o criador de Linux, também tem um blog.

E, logo neste blog, ele anunciou mais um software que ele fez nos últimos tempos – tracker, um sistema para monitorar o tempo que as crianças ficam na internet, desconectando-as depois de um tempo determinado.

O cara realmente é demais.. Faz o kernel do Linux, num fim da semana faz o GIT, e no outro desenvolve mais um software simples e eficiente como esse..

Além disso, lá tem uma bom review dos novos discos SSD de Intel, falando bem a verdade sobre o estado dos SSDs hoje em dia. Realmente, até Intel entrar neste mercado, discos SSD eram mais “moda” de que tecnologia. Agora as coisas estão diferente – só acompanhar as notícias dos novos lançamentos que grandes empresas logo depois do lançamento dos modelos da Intel. Só esperar abaixar o preço agora (umas 10x :) ).


Storm is coming.., originally uploaded by eugeni_dodonov.

Nokia n73 é f**a!

Depois de apanhar muito do openoffice (tanto 2.4.1 quanto do 3.00_m6), decidi experimentar o IBM Lotus Symphony – conjunto de aplicações de escritório de IBM. Diz a lenda que ele é baseado no OpenOffice 1.1.

A alma corajosa que tem vontade de ver como que ele funciona, precisa passar por diversos desafíos:

  1. Primeiro, é necessário baixar um arquivo de 300MB, passando por diversas páginas que pedem seu registro no IBM.
  2. Segundo, é necessário dar um jeito de instalar o arquivo auto-executável que vem com alguns problemas embutidos (por exemplo, mktemp usa alguns parâmetros que o meu ArchLinux não suporta.. Por isso precisei extrair os arquivos na mão – nada que less + awk não resolva :) ).
  3. Finalmente, tem que instalar ele.

Bem, neste item 3 que começam os problemas. A aplicação inteira é em Java. Se você achava que o OpenOffice é lento (nota rápida – OpenOffice 3 é MUITO mais rápido que o 2.4!), você vai se delirar com o Lotus Symphony. Eu acho que ele foi o 1o software que conseguiu travar o meu asus g1s (core 2 duo 2.0, 3GB de RAM) por mais de 1 minuto só para se iniciar.

Logo após iniciar, ele conseguiu se confundir internamente, mostrando diversos exceptions na tela (não no log, no meio da tela mesmo!).

Testando ele com os arquivos do OpenOffice e Office, também não consegui muito sucesso. Os arquivos .DOC/.ODT ele abriu certo. Mas com as apresentações ele se confundiu feio. Perdeu toda a formatação, fontes, itens, etc.

Visualmente, a interface dele é bem diferente do OpenOffice, e é parecida com o StarOffice original (tem tipo um menu “Iniciar”, e todos os documentos ficam abertos em tabs). O lado bom é que ele tem um menu com ações mais comuns de lado direito – algo que faz falta no OpenOffice.

Na tentativa de fechar os tabs ou sair, ele deu diversos exceptions e permaneceu aberto, não querendo abandonar este mundo cruel e injusto :) . Ele também é praticamente impossível de ser iniciado a partir da linha de comando – o comando para iniciar a aplicação é: /opt/ibm/lotus/Symphony/framework/shared/eclipse/plugins/com.ibm.productivity.tools.standalone.launcher.linux.x86_1.5.0.20080827-1548/IBM\ Lotus\ Symphony

Resumindo, depois dessa breve experiência negativa que eu tive com ele, acabei voltando para o OpenOffice 3 que estava usando. Ele tem seus problemas existenciais (não tem dicionários, não tem como definir a língua do documento de jeito “convencional”, documentos ODF que ele salva são parcialmente incompatíveis com o OpenOffice 2 e 1), mas pelo menos dá para usar ele sem precisar ficar treinando paciência.

Infelizmente, até agora o Office 2007 da Microsoft é o melhor ambiente de escritório que já usei :( . Tirando Latex, é claro, mas aí já é outra história..

Cada vez mais e mais eu gosto dos recursos de programação funcional em python. E, como eu uso essa linguagem para resolver tarefas mais variáveis, não dá para não perceber que a velocidade de desenvolvimento e eficiência do código tornam-se cada vez melhores, por simplesmente aplicar técnicas de programação funcional.

Por exemplo, sem a programação funcional, eu usava o seguinte código antes para ler um arquivo com uma série de números, e determinar a média dos valores:

fd = open("data.log")
data = fd.readlines()
valores = []

le os dados

for line in data: line_val = float(line.strip()) valores.append(line_val)

calcula a media

media = 0 for item in valores: media += item media /= len(media)

Re-escrevendo isso com técnicas de programação funcional, temos o seguinte:

le os valores do arquivo, transformando-os para floats, e ignorando strings vazias

valores = [float(val) for val in open("data.log").readlines() if len(val) > 1]

calcula a media, somando todos os valores e dividindo pelo número de elementos no vetor

media = reduce(lambda x, y: x+y, valores) / len(valores)

(É óbvio que é só um exemplo rápido, não estou tratando as excessões aqui, mas para resolver problemas simples do dia-a-dia é mais de que suficiente!)

O essencial são as funções lambda, map, reduce e filter. Todos os detalhes interessantes sobre esse estilo de programação eu achei aqui, e recomendo essa apresentação para todos!

Após roubarem o som do meu carro na semana passada, decidi comprar um novo (barato, que tenha só o mínimo do mínimo).

Para isso, procurei em alguns lugares, e decidi comprar no Submarino, por diversos fatores (entrega gratuita, compra pelo site, etc).

Chegou hoje o brinquedinho, mas, uns 15 minutos depois de instalar, o painel dele parou de funcionar. A música continua, os controles também, mas o painel está completamente apagado (é um Hyundai baratinho, caso alguém fique em dúvida :) ).

Éééééé… lei de murphy está me atacando novamente. Vamos ver se consigo trocar ele no Submarino..

Apareceu hoje:

 [29716.863265] TCP: Treason uncloaked! Peer 125.46.3.227:17140/60001 shrinks window 2742629828:2742629837. Repaired.

Essa é melhor que lp0 on fire! :)

Uma hora de busca no google, 150MBs downloadeados, e o meu antigo N73 ME da vivo se transforma em um N73 ME de verdade (e.g., desbloqueado, e com todas as funcionalidades previstas!). (No meio deste percurso, deu alguns erros de firmware meio bizarros, mas nada impossível de contornar).

A VIVO tem um talento para estragar celulares bons com seu firmware de m***a. O meu celular anterior (motorola v3c) tive que desbloquear para ele ser útil, e o n73 – depois de 1 ano de uso – também.