31 de July de 2014

The new TwoWayView

What if writing custom view recycling layouts was a lot simpler? This question stuck in my mind since I started writing Android apps a few years ago.

The lack of proper extension hooks in the AbsListView API has been one of my biggest pain points on Android. The community has come up with different layout implementations that were largely based on AbsListView‘s code but none of them really solved the framework problem.

So a few months ago, I finally set to work on a new API for TwoWayView that would provide a framework for custom view recycling layouts. I had made some good progress but then Google announced RecyclerView at I/O and everything changed.

At first sight, RecyclerView seemed to be an exact overlap with the new TwoWayView API. After some digging though, it became clear that RecyclerView was a superset of what I was working on. So I decided to embrace RecyclerView and rebuild TwoWayView on top of it.

The new TwoWayView is functional enough now. Time to get some early feedback. This post covers the upcoming API and the general-purpose layout managers that will ship with it.

Creating your own layouts

RecyclerView itself doesn’t actually do much. It implements the fundamental state handling around child views, touch events and adapter changes, then delegates the actual behaviour to separate components—LayoutManager, ItemDecoration, ItemAnimator, etc. This means that you still have to write some non-trivial code to create your own layouts.

LayoutManager is a low-level API. It simply gives you extension points to handle scrolling and layout. For most layouts, the general structure of a LayoutManager implementation is going to be very similar—recycle views out of parent bounds, add new views as the user scrolls, layout scrap list items, etc.

Wouldn’t it be nice if you could implement LayoutManagers with a higher-level API that was more focused on the layout itself? Enter the new TwoWayView API.

TWAbsLayoutManagercode is a simple API on top of LayoutManager that does all the laborious work for you so that you can focus on how the child views are measured, placed, and detached from the RecyclerView.

To get a better idea of what the API looks like, have a look at these sample layouts: SimpleListLayout is a list layout and GridAndListLayout is a more complex example where the first N items are laid out as a grid and the remaining ones behave like a list. As you can see you only need to override a couple of simple methods to create your own layouts.

Built-in layouts

The new API is pretty nice but I also wanted to create a space for collaboration around general-purpose layout managers. So far, Google has only provided LinearLayoutManager. They might end up releasing a few more layouts later this year but, for now, that is all we got.


The new TwoWayView ships with a collection of four built-in layouts: List, Grid, Staggered Grid, and Spannable Grid.

These layouts support all RecyclerView features: item animations, decorations, scroll to position, smooth scroll to position, view state saving, etc. They can all be scrolled vertically and horizontally—this is the TwoWayView project after all ;-)

You probably know how the List and Grid layouts work. Staggered Grid arranges items with variable heights or widths into different columns or rows according to its orientation.

Spannable Grid is a grid layout with fixed-size cells that allows items to span multiple columns and rows. You can define the column and row spans as attributes in the child views as shown below.



The new TwoWayView API will ship with a convenience view (TWView) that can take a layoutManager XML attribute that points to a layout manager class.


This way you can leverage the resource system to set layout manager depending on device features and configuration via styles.

You can also use TWItemClickListener to use ListView-style item (long) click listeners. You can easily plug-in support for those in any RecyclerView (see sample).

I’m also planning to create pluggable item decorations for dividers, item spacing, list selectors, and more.

That’s all for now! The API is still in flux and will probably go through a few more iterations. The built-in layouts definitely need more testing.

You can help by filing (and fixing) bugs and giving feedback on the API. Maybe try using the built-in layouts in your apps and see what happens?

I hope TwoWayView becomes a productive collaboration space for RecyclerView extensions and layouts. Contributions are very welcome!

11 de July de 2014

Attending GUADEC 2014

It’s been one of the toughest semesters I’ve ever gone through. I’m writing my graduation thesis, working, watching the World Cup, and taking classes. Besides all of that, I’ve been working hard to finish my duties before the end of July because that’s when we are having GUADEC.

Everything is ready for GUADEC 2014 in Strasbourg, France.

I’m attending the Documents & Photos BoF. Also, I’d like to engage in some GNOME Music hacking as well. And last but not least, I will be revenging Brazil in our annual football match.

I’d like to thank the GNOME Foundation and the travel committee for sponsoring my trip.


12 de May de 2014

Custom Layouts on Android

If you ever built an Android app, you have definitely used some of the built-in layouts available in the platform—RelativeLayout, LinearLayout, FrameLayout, etc. They are our bread and butter for building Android UIs.

The built-in layouts combined provide a powerful toolbox for implementing complex UIs. But there will still be cases where the design of your app will require you to implement custom layouts.

There are two main reasons to go custom. First, to make your UI more efficient—by reducing the number of views and/or making faster layout traversals. Second, when you are building UIs that are not naturally possible to implement with stock widgets.

In this post, I will demonstrate four different ways of implementing custom layouts and discuss their respective pros and cons: composite view, custom composite view, flat custom view, and async custom views.

The code samples are available in my android-layout-samples repo. This app implements the same UI with each technique discussed here and uses Picasso for image loading. The UI is a simplified version of Twitter app’s stream—no interactions, just the layouts.

Ok, let’s start with the most common type of custom layout: composite view.

Composite View

This is usually your starting point. Composite views (also known as compound views) are the easiest way of combining multiple views into a reusable UI component. They are very simple to implement:

  1. Subclass one of the built-in layouts.
  2. Inflate a merge layout in the constructor.
  3. Initialize members to point to inner views with findViewById().
  4. Add your own APIs to query and update the view state.

TweetCompositeViewcode is a composite view. It subclasses RelativeLayout, inflates tweet_composite_layout.xmlcode into it, and exposes an update() method to refresh its state in the adaptercode. Simple stuff.

Custom Composite View

TweetCompositeView will likely perform fairly well in most situations. But, for sake of argument, suppose you want to reduce the number of child views and make layout traversals a bit more efficient.

Although composite views are simple to implement, using general-purpose layouts has a cost—especially with complex containers like LinearLayout and RelativeLayout. As platform building blocks, they have to handle tons of layout combinations and might have to measure child views multiple times in a single traversal—LinearLayout‘s layout_weight being a common example.

You can greatly optimize your UI by implementing a custom logic for measuring and positioning child views that is specially tailored for your app. This is what I like to call a custom composite view.

A custom composite view is simply a composite view that overrides onMeasure() and onLayout(). So, instead of subclassing an existing container like RelativeLayout, you will be subclassing the more general ViewGroup.

TweetLayoutViewcode implements this technique. Note how it gets rid of the LinearLayout from TweetComposiveView and avoids the use of layout_weight altogethercode.

The laborious work of figuring out what MeasureSpec to use on each child view is done by the ViewGroup’s handy measureChildWithMargins() method—and getChildMeasureSpec() under the hood.

TweetLayoutView probably doesn’t handle all possible layout combinations correctly but it doesn’t have to. It is absolutely fine to optimize custom layouts for your specific needs. This allows you to write both simpler and more efficient layout code for your app.

Flat Custom View

As you can see, custom composite views are fairly simple to write using ViewGroup APIs. Most of the time, they will give you the performance your app needs.

However, you might want to go further and optimize your layouts even more on critical parts of your UI that are very dynamic e.g. ListViews, ViewPager, etc. What about merging all TweetLayoutView child views into a single custom view to rule them all? That is what flat custom views are about—see image below.

Custom Composite View (left) and Flat Custom View (right)

Custom Composite View (left) and Flat Custom View (right)

A flat custom view is a fully custom view that measures, arranges, and draws its inner elements. So you will be subclassing View instead of ViewGroup.

If you are looking for real-world examples, enable the “show layout bounds” developer option in your device and have a look at apps like Twitter, GMail, and Pocket. They all use flat custom views in their listing UIs.

The main benefit from using flat custom views is the great potential for flattening your view hierarchy, resulting in faster traversals and, potentially, a reduced memory footprint.

Flat custom views give you maximum freedom as they are literally a blank canvas. But this comes at a price: you won’t be able to use the feature-packed stock widgets such as TextView and ImageView. Yes, it is simple to draw text on a Canvas but what about ellipsizing? Yes, you can easily draw a bitmap but what about scaling modes? Same applies to touch events, accessibility, keyboard navigation, etc.

The bottom line is: with flat custom views,you will likely have to re-implement features that you would get for free from the platform. So you should only consider using them on core parts of your UI. For all other cases, just lean on the platform with composite views, custom or not.

TweetElementViewcode is a flat custom view. To make it easier to implement it, I created a little custom view framework called UIElement. You will find it in the canvascode package.

The UIElement framework provides a measure/layout API which is analogous to Android’s. It contains headless versions of TextView and ImageView with only the necessary features for this demo—see TextElementcode and ImageElementcode respectively. It also has its own inflatercode to instantiate UIElements from layout resource filescode.

Probably worth noting: the UIElement framework is in a very early development stage. Consider it a very rough sketch of something that might actually become useful in the future.

You have probably noticed how simple TweetElementView looks. This is because the real code is all in TweetElementcode—with TweetElementView just acting as a hostcode.

The layout code in TweetElement is pretty much analogous to TweetLayoutView‘s. It handles Picasso requests differentlycode because it doesn’t use ImageViews.

Async Custom View

As we all know, the Android UI framework is single-threaded. And this is for a good reason: UI toolkits are not your simplest piece of code. Making them thread-safe and asynchronous would be an unworthy herculean effort.

This single-threaded nature leads to some fundamental limitations. It means, for example, that you can’t do layout traversals off main thread at all—something that would be useful in very complex and dynamic UIs.

For example, if your app has complex items in a ListView (like most social apps do), you will probably end up skipping frames while scrolling because ListView has to measurecode and layoutcode each child view to account for their new content as they become visible. The same issue applies to GridViews, ViewPagers, and the like.

Wouldn’t it be nice if we could do a layout traversal on the child views that are not visible yet without blocking the main thread? This way, the measure() and layout() calls on child views would take no time when needed in the UI thread.

Enter async custom view, an experiment to allow layout passes to happen off main thread. This is inspired by the async node framework developed by the Paper team at Facebook.

Given that we can never ever touch the UI toolkit off main thread, we need an API that is able to measure/layout the contents of a view without being directly coupled to it. This is exactly what the UIElement framework provides us.

AsyncTweetViewcode is an async custom view. It uses a thread-safe AsyncTweetElementcode factorycode to define its contents. Off-screen AsyncTweetElement instances are created, pre-measured, and cached in memory from a background thread using a Smoothie item loadercode.

I had to compromise the async behaviour a bit because there’s no sane way of showing layout placeholders on list items with arbitrary heights i.e. you end up resizing them once the layout gets delivered asynchronously. So whenever an AsyncTweetView is about to be displayed and it doesn’t find a matching AsyncTweetElement in memory, it will force its creation in the UI threadcode.

Furthermore, both the preloading logic and the memory cache expiration would need to be a lot smarter to ensure more layout cache hits in the UI thread. For instance, using a LRU cachecode here doesn’t seem ideal.

Despite these limitations, the preliminary results from async custom views look very promising. I’ll continue the explorations in this area by refining the UIElement framework and using it in other kinds of UIs. Let’s see where it goes.

Wrapping up

When it comes to layouts, the more custom you go, the less you’ll be able to lean on the platform’s proven components. So avoid premature optimization and only go fully custom on areas that will actually affect the perceived quality and performance of your app.

This is not a black-and-white decision though. Between stock widgets and fully custom views there’s a wide spectrum of solutions—from simple composite views to the more complex async views. In practice, you’ll usually end up combining more than one of the techniques demonstrated here.

11 de May de 2014

FISL 15!

The latest edition of FISL was a blast! Even though I have noticed a smaller number of attendees compared to 2013, it is quality rather than quantity that matters.

We had less GNOMErs this year as well, but our community was definitely nicely represented. At day one, Luciana Fujii gave a talk about GLib, GObject and more G* stuff.

On day two, Adorilson Bezerra and I have conducted the GNOME Community Meeting. At first, Adorilson introduced GNOME 3.12 and, after that, I’ve presented a lightning talk about Gjs development. At the end of our Community Meeting we had an open space to discuss GNOME as a whole. It was all broadcasted live and recorded, you can check it out here (Portuguese audio).

I hope to see you all again next year at FISL 16!

10 de April de 2014

Barra de progresso no APT

No Ubuntu Trusty 14.04 Beta Final chegou com diversas atualizações  importantes, como o Mesa 10.x, Kernel 3.13.xe, etc… Dentre essas, o gerenciador de pacotes Debian, o APT (Advanced Package Tool) foi atualizado para a versão 0.9.15.x que possui um recurso de barra de progresso chamado Progress-Fancy. Com ela podemos visualizar o status do processo de instalação, remoção e atualização dos pacotes.

Esta barra de progresso está disponível, porém não vem habilitada por padrão. Para ativá-la, basta abrir o seu terminal e executar:

echo "Dpkg::Progress-Fancy \"1\";" | sudo tee -a /etc/apt/apt.conf.d/99progressbar >/dev/null

Pronto! Agora toda vez que você for instalar, remover ou atualizar programas através do apt ou apt-get, aparecerá uma barra de progresso como na imagem abaixo (Clique para ampliar):


Observação: Atualmente só funciona com o Ubuntu 14.04 e derivados.

Até a próxima!

01 de April de 2014

FLISOL 2014 – Salvador

FLISOL - Salvador

O Festival Latino Americano de Instalação de Software Livre – FLISol é um evento internacional, realizado anualmente, e que ocorre de forma simultânea em diversas cidades da América Latina. O Flisol é um evento descentralizado, onde diversas comunidades organizam e realizam seu festival, de forma voluntária, tendo como principal objetivo promover o uso de software livre, apresentando sua filosofia, alcance, avanços e desenvolvimento ao público em geral.

O Flisol acontece, historicamente, no 4º sábado de abril (em 2006 foi no 25 de março; em 2007, 28 de abril; 2008, 26 de abril; 2009 e 2010, no dia 24 de abril; 2011, no dia 9 de abril; 2012, no dia 28 de abril). O Flisol 2014 está marcado para o dia 26 de abrl na faculdade AREA1.

O evento é gratuito e aberto a todo o público: curiosos, interessados e amantes do Software Livre. Nesse dia os voluntários propõe a instalação de Software Livre, como distribuições de Gnu/Linux, sistemas BSD, e aplicativos livres para Windows em geral. Alguns eventos também contam com palestras, oficinas, sala de degustação e gravações de mídias (live-CD/DVD e/ou pendrives).

Programação do evento Endereço da Área1
Te vejo por lá! ;)

Quer saber se a sua cidade também terá o FLISOL? Clique aqui e saiba onde vai rolar o FLISOL pelo Brasil a fora…

Atualização: Realize sua inscrição no FLISOL Salvador, clicando aqui!

Obs.: Este post é melhor visualizado acessando direto da fonte: Blog do Ubuntuser

25 de March de 2014

Confira novidades da versão 0.46.0 "Uaris" do Noosfero!


Neste mês de fevereiro foi lançada uma nova versão do Noosfero, plataforma web livre para redes sociais. A versão 0.46.0 foi batizada de Uaris e conta com 14 novidades, entre melhorias de recursos e novas funcionalidades.

O Noosfero é uma plataforma web livre para redes sociais e redes de economia solidária na internet que agrega as funções de blog, Sistema de Gerenciamento de Conteúdo (CMS), chat, fórum, portfólio eletrônico, produção e consumo de feeds RSS, agenda de eventos etc. O Noosfero é também um projeto de software livre, com licença GNU Affero General Public License, desenvolvido pela Colivre com a contribuição de uma comunidade de desenvolvedores/as que garantem o lançamento de novas versões constantemente.

Entre as últimas melhorias para os/as usuários/as estão novos blocos, opções de layout e formas de recuperação de senha. Confira as novidades da versão 0.46.0 Uaris!


Novo botão para restaurar página inicial

Já se foi o tempo em que era preciso remover o artigo que estava como página inicial para ter nossa homepage de volta para o padrão da página de perfil. Agora, no Gerenciador de Conteúdos, há um botão com a opção "Restaurar página inicial". Ao clicar nele, a homepage do site volta a ser a página de perfil.


Recuperação de senha

O/A usuário/a não precisa mais ficar limitado a preencher seu login e e-mail para recuperar sua senha. Agora basta apenas preencher uma das opções.

A página também foi melhorada com a possibilidade para que plugins incluam novos campos de recuperação de senha. Como você pode ver na imagem abaixo, o StoaPlugin adicionou o campo "Número USP" como novo campo disponível para recuperação de senha.


Plugin para adicionar bloco para conteúdos recentes

Temos uma nova forma de mostrar nossos conteúdos mais recentes. É através do Plugin de Conteúdo Recente. Este plugin adiciona um novo bloco que mostra o conteúdo recente de um dos blogs do usuário.



Exceção para conteúdos privados

Este recurso permite que os/as usuários/as definam quem pode acessar seu conteúdo privado. Esta é uma boa maneira de garantir maior privacidade de conteúdos.



Bloco principal editável

Agora o Bloco Principal pode ser editado pelo/a usuário/a sem improvisos nem quebra-galhos. Os blocos passaram a fluir normalmente entre as caixas laterais e o box principal.


Inserção de imagem de capa no blog

O/A usuário/a está habilitado/a a adicionar uma imagem de capa para seu blog. Esta imagem é exibida no cabeçalho da página de visualização do blog.


Ambiente para gerenciamento de integrantes

O ambiente de administração agora é capaz de gerenciar todos os usuários. Na página de gerenciamento, é possível procurar por usuários, usar filtros para administradores ou usuários comuns, e usuários ativos ou inativos. O ambiente também permite transformar um usuário em administrador ou em usuário comum, além de ativar ou desativar usuários. Na mesma página, é possível exportar os usuários em forma to CSV ou XML.


Nova opção de layout

Uma nova opção de layout com coluna à esquerda junto com o rodapé foi adicionada à lista de layouts personalizados oferecidos pelo Noosfero.


Filtros para gerenciamento de grupos

Agora, na página "Gerenciar Grupos", o/a usuário/a é capaz de filtrar os grupos de acordo com a relação que tem com eles - se administrador, moderador ou integrante, por exemplo.

Bloco de vídeo

Boas notícias! Agora temos um Bloco de Vídeo. Esse bloco é gerado pelo Plugin de Vídeo e permite que o/a usuário/a faça referência a vídeos do Vimeo, Youtube ou Webm e incorpore-os ao bloco. Isso facilitará a vida de muitos usuários.



Melhorias na ferramenta Calendário

Nosso calendário recebeu mais atenção e ganhou melhorias em sua interface.

Novo bloco "Conteúdo Contextual"

Outro bloco é o Conteúdo Contextual, que agrupa os conteúdos a partir do contexto/tipo. Este bloco mostra "os filhos" do conteúdo que está sendo visualizado no momento pelo/a usuário/a. Ele também permite a escolha de qual tipo de conteúdo deve ser exibido.


Bloco que mostra o caminho de navegação

O bloco Breadcrumbs exibe o caminho de navegação percorrido pelo/a usuário/a. Isto permite uma navegação simples e rápida pelos conteúdos. Embora ainda faltem alguns ajustes, a ferramenta já está funcionando e pode ter sua aparência totalmente personalizada.


Para desenvolvedores: Ambiente de configuração para definir tamanho máximo de carregamento

Essa vai para os administradores do sistema! Depois de um longo tempo codificando o bom e velho 5mb como tamanho máximo de upload, nós temos agora uma maneira para os administradores do sistema definirem o tamanho máximo de upload para uma instalação Noosfero. Ainda não temos a possibilidade de ter vários ambientes no mesmo sistema com diferentes tamanhos máximos de upload, mas estamos a um passo disso. Esta configuração está em config/noosfero.yml e você pode ver um exemplo de como fazer isso no arquivo config/noosfero.tml.dist.


Para o lançamento desta versão do Noosfero, foi imprescindível o trabalho do pessoal do Serviço Federal de Processamento de Dados (Serpro), empresa brasileira considerada uma das maiores organizações públicas de TI no mundo. Obrigado galera!


Fonte: http://noosfero.org/pub/Development/NoosferoVersion00x46x00

18 de March de 2014

QtWebKit is no more, what now?

Driven by the technical choices of some of our early clients, QtWebKit was one of the first web engines Collabora worked on, building the initial support for NPAPI plugins and more. Since then we had kept in touch with the project from time to time when helping clients with specific issues, hardware or software integration, and particularly GStreamer-related work.

With Google forking Blink off WebKit, a decision had to be made by all vendors of browsers and platform APIs based on WebKit on whether to stay or follow Google instead. After quite a bit of consideration and prototyping, the Qt team decided to take the second option and build the QtWebEngine library to replace QtWebKit.

The main advantage of WebKit over Blink for engine vendors is the ability to implement custom platform support. That meant QtWebKit was able to use Qt graphics and networking APIs and other Qt technologies for all of the platform-integration needs. It also enjoyed the great flexibility of using GStreamer to implement HTML5 media. GStreamer brings hardware-acceleration capabilities, support for several media formats and the ability to expand that support without having to change the engine itself.

People who are using QtWebKit because of its being Gstreamer-powered will probably be better served by switching to one of the remaining GStreamer-based ports, such as WebKitGTK+. Those who don’t care about the underlying technologies but really need or want to use Qt APIs will be better served by porting to the new QtWebEngine.

It’s important to note though that QtWebEngine drops support for Android and iOS as well as several features that allowed tight integration with the Qt platform, such as DOM manipulation through the QWebElement APIs, making QObject instances available to web applications, and the ability to set the QNetworkAccessManager used for downloading resources, which allowed for fine-grained control of the requests and sharing of cookies and cache.

It might also make sense to go Chromium/Blink, either by using the Chrome Content API, or switching to one its siblings (QtWebEngine included) if the goal is to make a browser which needs no integration with existing toolkits or environments. You will be limited to the formats supported by Chrome and the hardware platforms targeted by Google. Blink does not allow multiple implementations of the platform support layer, so you are stuck with what upstream decides to ship, or with a fork to maintain.

It is a good alternative when Android itself is the main target. That is the technology used to build its main browser. The main advantage here is you get to follow Chrome’s fast-paced development and great support for the targeted hardware out of the box. If you need to support custom hardware or to be flexible on the kinds of media you would like to support, then WebKit still makes more sense in the long run, since that support can be maintained upstream.

At Collabora we’ve dealt with several WebKit ports over the years, and still actively maintain the custom WebKit Clutter port out of tree for clients. We have also done quite a bit of work on Chromium-powered projects. Some of the decisions you have to make are not easy and we believe we can help. Not sure what to do next? If you have that on your plate, get in touch!

15 de February de 2014

Entenda o systemd vs upstart

Originalmente publicado no PoliGNU.

Por quê mudar?

Recentemente o projeto Debian passou por um intenso debate para decidir que sistema de inicialização deveria substituir o venerável (porém antiquado) system v como padrão do sistema para a próxima release, codename jessie.
A razão para mudar pode não parecer óbvia, especialmente para os muito apegados à ideia de “UNIX” ou que simplesmente estão acostumados a como as coisas funcionam hoje, mas fica clara quando se analisa os principais problemas enfrentados por sistemas que ainda usam sistemas de init system v. Pra começo de conversa, o init não conhece muitas das novidades tecnológicas que apareceram nas últimas décadas.
Peguemos como exemplo o controle de hardware: um daemon que precise ser iniciado quando um determinado tipo de hardware é plugado não será executado automaticamente pelo init se for plugado, o que exige que além de ter lógica para tratar o caso no boot, também se tenha que ter outros mecanismos para reagir ao hot-plugging.
Ser um conjunto de scripts shell também causa uma infinidade de problemas. Como cada script deve reinventar a inicialização do daemon que controla, é bastante comum que eles não sejam 100% resilientes a problemas como deixar processos (principais ou filhos) para trás quando quem administra o servidor pede que o serviço seja parado. Isso acaba exigindo intervenção de quem administra, matando manualmente os processos.
O desempenho também é um problema que passou muito tempo sem solução. Com o aparecimento de computadores com múltiplas CPUs e com espera de rede se tornando um problema foi inventado um sistema de paralelizar a execução dos scripts de inicialização, o que trouxe consigo a enorme complexidade de ter que estabelecer dependências entre os scripts, para garantir que só sejam executados em paralelo scripts que possam sê-lo. Mas isso também é muito mais complexo do que parece – as dependências em sistemas modernos são muito mais sutis e variáveis do que pode parecer em primeira análise. Além disso, executar cada script desse gera um overhead não desprezível.
Por último, o diagnóstico de falhas de inicialização de serviços é absurdamente complexo; raramente se sabe em que arquivo de log estarão as mensagens relevantes e com alguma frequência sequer haverá logs da falha propriamente dita em algum lugar, restando a quem administra executar o serviço manualmente e ver o que acontece.
Para resolver alguns ou todos esses problemas vieram os novos sistemas de init. Na verdade o Mac OS X saiu na frente com o launchd, mas essa é história pra uma outra oportunidade, comecemos pelo upstart, que nasceu no Ubuntu há alguns anos atrás.


O upstart surgiu quando a principal preocupação das pessoas estava em melhorar o desempenho do boot através de paralelismo. A ideia é substituir a necessidade de estabelecer dependência entre os serviços de forma declarativa e ao invés disso estabelecer condições para que um serviço esteja “pronto” para ser executado.
No sistema de dependências inventado para o system v começa pelo objetivo: preciso rodar rodar o procedimento que monta sistemas de arquivo remotos, pra isso preciso rodar as dependências dele que são montar os sistemas de arquivo locais e estabelecer conexão de rede. O upstart inverte essa lógica e começa dos procedimentos que tem nenhuma dependência, o que vai tornando outros procedimentos “prontos” e os executa a partir daí.
A ideia é que o sistema de init reage a eventos, que podem ser um serviço estar estabelecido mas também podem ser de outra natureza: um hardware ser plugado, por exemplo. Isso resolve o problema do desempenho, em certa medida e cria um framework que permite ao sistema de init continuar cuidando do sistema enquanto ele estiver ligado, iniciando e parando serviços conforme as condições do sistema mudam.
Há alguns poréns a respeito dessa estratégia, que quem tiver curiosidade achará com facilidade nos frequentes debates travados entre Lennart Poettering e os proponentes do upstart, mas eu queria chamar a atenção para um em particular: usando eventos não existe garantia de que um serviço esteja de fato em execução plena quando o seu procedimento de inicialização conhecido pelo upstart termina – anote isso mentalmente.
Finalmente, o upstart acaba não resolvendo os problemas de diagnóstico, nem de processos perdidos sendo deixados pelo sistema (embora uma solução que adota a ideia do systemd para isso esteja sendo criada), principalmente por as receitas de init usadas pelo upstart serem ainda scripts shell customizados.


O systemd é criação de Lennart Poettering, que é funcionário da Red Hat e contribuidor do Fedora. Daí muita gente atribuir o systemd à Red Hat, no que se enganam: embora hoje a Red Hat tenha inúmeros projetos com o systemd no centro, a ideia original e o esforço original foram feitos por Lennart em seu próprio tempo e não como um projeto da empresa.
A motivação para sua criação é bem mais ambiciosa que a que originou o upstart: a ideia é que há inúmeras funcionalidades que o kernel Linux que são incríveis e extremamente avançadas e que acabam não sendo usadas a não ser em ambientes muito específicos, porque não há infra-estrutura comum no espaço de usuário para fazer uso da funcionalidade e disponibilizá-la para o resto do sistema.
Um exemplo: cgroups. Os Control Groups são formas de juntar processos em uma embalagem que permite tratar esse grupo de processos como um todo. Esses grupos podem ser usados por exemplo para limitar que partes do sistema os processos que o compõe podem ver, criando uma visão virtual mais limitada do sistema de arquivos, por exemplo, ou limitando as interfaces de rede que os processos podem ver. Também podem ser usados para tornar o agendamento de tempo das tarefas no processador mais adequado ao sistema, ou impor limites de uso de memória, de operações de I/O e assim por diante.
Uma das primeiras funcionalidades trazidas pelo systemd foi exatamente o uso de Control Groups. Cada serviço iniciado pelo systemd o é dentro de um cgroup próprio, o que significa por exemplo que todos os processos criados por aquele serviço podem ser – com certeza – terminados quando o serviço é parado. Também significa que apesar de seu apache estar consumindo muito CPU ou memória, seu servidor SSH ainda tem um naco suficiente do tempo de CPU para aceitar sua conexão que será usada para tratar do problema, já que o Linux tenta ser justo com os diferentes cgroups.
Além de tudo isso, o uso de cgroups ainda dá ao systemd a capacidade de garantir que não fiquem processos pra trás quando um serviço é parada: como processos criados por processos que foram colocados num control group também são colocados nesse control group, basta terminar todos os processos do control group para que não sobre nenhum. O pessoal do upstart pensou em adotar essa ideia.
Mas o systemd também atacou o problema do desempenho, de duas formas: a primeira foi a ideia de remover completamente scripts shell da jogada. Cada serviço é especificados num arquivo de configuração chamado “unit”, que descreve todas as informações que o init precisa para iniciar e cuidar do processo. Isso retira da equação a necessidade de iniciar um interpretador shell e de executar os complexos scripts usados atualmente com system v.
A segunda foi dando uma solução um pouco mais inusitada à questão das dependências. A ideia é simples: a maioria dos serviços abre sockets de algum tipo para receber pedidos de seus clientes. O X, por exemplo, cria um socket UNIX em forma de arquivo no /tmp. O que o systemd faz é criar todos os sockets dos serviços que controla (eles estão descritos nos arquivos unit) e, quando recebe uma conexão, inicia o serviço e passa pra ele o socket.
O interessante dessa solução é que ela 1) estabelece a relação de dependência na vida real: o serviço é iniciado quando alguém pede e 2) garante que os clientes que forem iniciados vão ter seu primeiro request atendido, não há mais o problema de não saber quando o serviço está plenamente ativo (lembra da nota mental no caso do upstart?).
Para completar, o systemd controla as saídas padrão e de erro dos serviços que inicia e pode facilmente mostrar as últimas linhas de log de um serviço quando sua execução falha, tornando muito simples o diagnóstico:
kov@melancia ~> systemctl status mariadb.service
mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled)
Active: active (running) since Seg 2014-02-03 23:00:59 BRST; 1 weeks 3 days ago
Process: 6461 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
Process: 6431 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
Main PID: 6460 (mysqld_safe)
CGroup: /system.slice/mariadb.service
        ├─6460 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
        └─6650 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plug...
	Fev 03 23:00:57 melancia mysqld_safe[6460]: 140203 23:00:57 mysqld_safe Logging to /var/log/mariadb/mariadb.log.
	Fev 03 23:00:57 melancia mysqld_safe[6460]: 140203 23:00:57 mysqld_safe Starting mysqld daemon with databas...mysql
	Fev 03 23:00:59 melancia systemd[1]: Started MariaDB database server.
	Hint: Some lines were ellipsized, use -l to show in full.

A questão de licenciamento

De extrema importância quando falamos de Software Livre são a questão de licença e de copyright do código. O systemd é licenciado sob a LGPL versão 2.1 ou superior, o que permite que programas proprietários sejam linkados com suas bibliotecas. O copyright das contribuições feitas ao código é mantido pelos colaboradores. Um projeto de software livre bastante comum desse ponto de vista.
Já o Upstart, sendo criação da Canonical segue o que tem sido sua política há algum tempo: usa uma licença GPL (versão 2) e exige que contribuidores assinem um Contributor License Agreement compartilhando os direitos de copyright com a Canonical. Com isso, a Canonical fica sendo a única dona do copyright do conjunto e pode fazer por exemplo alterações de licença, ou lançar uma versão proprietária se entender que deve.
Em primeira análise isso não parece ser um problema: de fato, há várias licenças mais permissivas usadas por outros softwares, como as licenças BSD, que permitem às pessoas fecharem o código. A grande questão aqui é que com esse modelo não é qualquer pessoa que pode fazer isso, só a Canonical pode. Essa acaba sendo uma forma de desnivelar as oportunidades artificialmente, criando um monopólio do privilégio de lançar versões proprietárias.


Atualmente dois sistemas importantes usam upstart: Ubuntu e Red Hat Enterprise Linux 6, que é a versão atual suportada da Red Hat. O systemd foi adotado inicialmente pelo Fedora, o que significa que a futura RHEL 7 também estará usando systemd. Algumas outras distribuições passaram a usar systemd ou como padrão ou como opção bem suportada, como o SuSE e o Arch Linux, por exemplo.
Com a adoção dele pelo Debian como padrão, todas as grandes distribuições base passarão a ser baseadas no systemd. Para surpresa de muitos (minha inclusive), Mark Shuttleworth anunciou que dada a decisão do projeto Debian, o Ubuntu também passaria a adotar systemd por padrão, aceitando graciosamente a derrota, em suas próprias palavras.
Com essa mudança é muito improvável que o upstart tenha um futuro depois de sua aposentadoria nas versões estáveis do RHEL e Ubuntu LTS, a menos que alguma outra distribuição se apresente para assumir sua manutenção.
Vida longa ao systemd!


Nota: ao tratar do CLA exigido pela Canonical o texto anteriormente usava a expressão “transferindo o copyright” , que dá a entender que o autor original da contribuição perdia os direitos, o que não é verdade e foi corrigido.

18 de December de 2013

Parasite, wake up!

Hi there!

In the last weeks I’ve been working on GTK+ themes, customizing some apps, and I missed the tools we have on the web world that allow us to to some live editing on CSS.

I remembered we had Parasite, a tool similar to Firebug, but for GTK+ apps. Unfortunately it didn’t support CSS tweaking. But it does now! I’ve made some improvements on it mainly to allow live editing of CSS, but not limited to that.

Some changes so far:

  • Live editing of CSS, for the whole application, or only for the selected widget
  • Ability to add/remove a CSS class for a specific widget. (Editing of pseudo-classes like :hover is planned)
  • In the Property inspector, if a property itself is another Object, we can also inspect it. (For example, you can inspect a Buffer inside a TextView)
  • A bit of UI change

I have made a small video showing the improvements:

Link to the video

The code is on the usual place, github: https://github.com/chipx86/gtkparasite

Please, test it and file bugs/wishes/pull requests. /me is now wearing the maintainer hat :)

Note: it requires GTK+ 3.10 (and optionally python+gobject introspection for the python shell)

22 de October de 2013

Rede Social baseada em Noosfero é premiada no Japão

Fonte: Colivre

Da Bahia, do Brasil para o Mundo! Um ambiente pedagógico que usa o Noosfero para promover a interação de professores e estudantes de pelo menos dez países foi premiado com o “Excellent Workshop Award” do Canvas Workshop Collection, evento realizado em 2012 no Japão. É o World Museum Project, rede coordenada pelo professor japonês Yoshiro Miyata com a proposta de estimular o poder criativo e a liberdade de expressão de crianças e adolescentes.

Segundo Miyata, World Museum Project é uma “rede mundial de pessoas interessadas em atravessar fronteiras culturais e geracionais para criações colaborativas que possam ampliar visões e aumentar paixões”.  Reúne usuários do Japão, Austrália, Taiwan, Hong Kong, Filipinas, Rússia, Grécia, Espanha, Estados Unidos, Honduras, entre outros países.

Com ferramentas básicas de criação, a rede permite o desenvolvimento de diferentes tipos de projetos, como animações, obras de arte e histórias. Tudo de forma compartilhada e conectada para propiciar um ambiente de aprendizagem criativa.

Yoshiro Miyata é professor da Universidade de Chukyo e pesquisa ambientes e teorias de aprendizagem. Realiza oficinas interculturais em escolas, museus e comunidades no Japão e em outros países.


18 de October de 2013

OpenWRT – Primeiros Passos!


Recentemente boa parte do meu trabalho ou talvez 95% do tempo tem sido com a plataforma OpenWRT, e tem sido feito diversos hackings, melhorias e afins. pretendo ao decorrer do tempo livre desenvolver materiais falando sobre o assunto desde como montar um “Media Center” utilizando seu roteador de internet a outros diversos hacks!! ;)

09 de September de 2013

ANÚNCIO: Final do Planeta GNU/Linux Brasil

The End

Em 2008, depois de algumas discussões sobre o tipo de conteúdo que meu blog estava gerando em alguns agregadores nacionais, eu tomei a decisāo de criar meu próprio agregador com o seguinte objetivo:

Planeta GNU/Linux nasceu da minha necessidade de querer ler blogs de pessoas relacionadas ao movimento Brasileiro de software livre, mas sem a censura bitolada que outros agregadores de blogs usam para filtrar o conteúdo que é publicado.

O critério para entrar no Planeta é super simples: eu tenho de gostar do material! Ao contrário dos outros agregadores que geralmente são vinculados a comunidades ou distribuições, este site aqui é completamente independente e sem censura nenhuma!

Desde entāo eu venho administrando o conteúdo e tentando adicionar material que seja relevante aos meus interesses e daqueles que também acompanham este “planeta”. Mas nos últimos 2 anos tanto o meu tempo como meu interesse por este tipo de fonte de notícias diminuiu bastante e o projeto ficou meio que jogado às traças… até a semana passada quando recebi um e-mail me avisando que estava na hora de renovar o meu domínio. Foi aí que eu resolvi que nāo fazia mais sentido em manter um projeto que eu nāo tenho mais interesse, e em outubro deste ano o Planeta GNU/Linux Brasil deixará de existir.

Agradeço a todos que apoiaram o projeto por tanto tempo e até a próxima :)

03 de September de 2013

Castálio Podcast - Enrico Nicoletto e Rafael Ferreira: Projeto GNOME


Depois de vários meses sem “fora do ar”, tenho o grande prazer em trazer mais um episódio sobre o projeto GNOME! Desta vez convidei o Enrico Nicoletto e Rafael Ferreira para conversar sobre o processo de traduçōes, que mais uma vez promete entregar mais uma versão completamente traduzida para o nosso bom português!

A entrevista aconteceu “na estrada” quando eu estava voltando de viagem, e acabei gravando o episódio de um hotel lá em Richmond no estado da Virgínia. Mesmo com alguns problemas iniciais (teve uma hora que minha conexão caiu, mas eu consegui voltar logo), eu consegui bater um papo super legal com o Enrico e Rafael sobre como todo o processo de traduçōes, desde como eles entraram para a equipe oficial, até como chegaram a ser os administradores da equipe brasileira.

O episódio todo ficou com um pouco mais de 30 minutos, mas para quem quizer assistir o vídeo vocês poderão escutar sobre outros temas que acabaram ficando de fora na hora da ediçã0 (devido ao tamanho final do podcast), como seus planos para o futuro da equipe.

Escute agora: [MP3] [Ogg] [AAC] [Youtube]

25 de August de 2013

seven years!

Even through times of high and low with the published post… here we are!! today, is a birthday of my blog, we seven years of life!! =]

21 de June de 2013

Textos do Prof. Nelson de Castro Senra

Reúno neste post alguns textos do Prof. Nelson de Castro Senra.

O Prof. Nelson é Doutor em Ciência da Informação pela UFRJ/Eco (Escola de Comunicação) e CNPq/Ibict (Instituto Brasileiro de Informação em Ciência e Tecnologia), com a tese "A Coordenação da Estatística Nacional. O equilíbrio entre o desejável e o possível". É Mestre em Economia pela FGV/EPGE (Escola de Pós-Graduação em Economia, sob a direção do Profº Mário Henrique Simonsen), com a dissertação "O fenômeno sazonal na construção de índices de preços ao consumidor", e economista pela Universidade Cândido Mendes, Faculdade de Ciências Políticas e Econômicas do Rio de Janeiro.

Fui aluno do Prof. Nelson nos anos de 1999 e 2000, quando participei do mestrado em Estudos Populacionais e Pesquisas Sociais (linha de Produção e Análise da Informação Geográfica) da Escola Nacional de Ciências Estatísticas (ENCE/IBGE, Rio de Janeiro). Das disciplinas que tive a honra e o prazer de cursar com o Prof. Nelson, destaco a de "Metodologia da Pesquisa Social", onde através de um conteúdo bastante diversificado (aulas expositivas, debates, filmes, e pequenos textos para reflexão) pude ter meu primeiro contato com essa forma específica de ver e (tentar) entender o mundo, chamada "ciência".

Torno público aqui o agradecimento que consta de minha dissertação de mestrado:

Aos professores do curso de Mestrado da ENCE, pela dedicação e orientação, e em especial ao professor Nelson Senra, quem primeiro me ensinou o que é verdadeiramente “fazer ciência”, de uma forma que é impossível esquecer.

Seguem os links para os textos:


Informação Estatística: política, regulação, coordenação.
Ciência da Informação, Brasília, vol. 28, n. 2, 1999.

Garantia de sigilo, a deontologia do Estaticista: sua conduta ético-moral.
Rio de Janeiro, IBGE, texto para discussão, maio 1999. 8 p.

Política de Informação (Quantitativa): concepção, formulação, aplicação.
Rio de Janeiro, IBGE, monografia para discussão, abril 1999. 54 p.


A coordenação, a argumentação e a comunicação das estatísticas, vértices de um mesmo triângulo.
São Paulo em Perspectiva, São Paulo, v. 12, n. 4, p. 92-98, out./dez. 98.

Os sistemas de informações estatísticas no limiar do terceiro milênio: o imperativo da coordenação. (O caso brasileiro).
2ª versão. CNPD - Comissão Nacional de População e Desenvolvimento, jan./fev. 98. 48 p.

As Sociedades Científicas e a Informação Estatística. O SBPC/GT-Informação, (des)encontro marcado entre usuários e produtores?
Rev. ANPEC, Brasília, n. 4, p. 199-211, fev. 98.


Um olhar sobre os anuários estatísticos.
Ciência da Informação, Brasília, v. 26, n. 1, p. 7-11, jan./abr. 97.


Governamentalidade, a invenção política das estatísticas.
Informare, Rio de Janeiro, v. 2, n. 1, p. 88-95, jan./jun. 96.
[Apresentado no I Encontro de Pesquisa da Pós-Graduação em Ciência da Informação, CNPq/Ibict e UFRJ/Eco, Rio de Janeiro, 9 ago. 95].

Cálculo econômico e a arte de governar ou A relação entre a contabilidade e a estatística.
Informare, Rio de Janeiro, v. 2, n. 2, p. 85-91, jan./jun. 96.
[Apresentado no Colóquio Organização do conhecimento e representação da informação: enfoques e perspectivas, CNPq/Ibict e UFRJ/ Eco, Rio de Janeiro, 27 set. 96]


Por uma disseminação democrática de informações.
São Paulo em Perspectiva, São Paulo, v. 8, n. 4, p. 40-45, out./dez. 94.


A Informação e a Formação do Mercosul.
Network. Cândido Mendes, v. 3, n. 2, abr./jun. 93.


Jon "Maddog" Hall em Ilhéus

No dia 1.junho.2009 tivemos a honra de receber "Maddog" aqui em Ilhéus, para uma palestra sobre a importância do Software Livre em atividades educacionais e de pesquisa.

Baixe aqui os slides da apresentação.

Baixe o áudio da palestra (com tradução "quase" simultânea...)

Áudio - parte 1
Áudio - parte 2

Free and open source in education: Software that teaches you twice


Ainda preparando...

Apresentando o palestrante e o Isamar Maia, que fez a gentileza de conduzir uma tradução "quase simultânea" :-)


Cerveja com alunos no final!

Obrigado, Maddog!!

Abraços! Carlão

10 de May de 2013

Joining Intel

Today is my last day at Oi WiFi.

It has been 1 year and a half since I moved from my small city (Maceió) to the biggest, craziest Brazilian city, São Paulo. I don’t regret!

I’m lucky to have joined a great company (Vex at the time. Oi WiFi nowadays), with great people where I learnt a lot. I’m glad for the things I helped to improve, I’m sure we have better products than before and I’m proud to be part of that progress. I leave as legacy the spirit of the Free Software, where we can (and should) contribute back to projects we use and improve internally. Every improvement we made here we submitted back to projects like Openwrt, busybox, glib, etc.
However things and priorities in the company have changed a bit in the last few months. Time to look for a new challenge in my career.

What a challenge!

At Intel I’ll join the OTC – Intel Open Source Technology Center, and will work on Open Source projects such as Tizen, EFL, Webkit and hopefully GTK+ :)
The team I’ll work with is formed by the former Profusion company, acquired by Intel in the beginning of the year. Profusion was a company that I admired even before it was acquired by Intel :)

I’m very excited to join Intel. It’s a great opportunity in a great company and I don’t want to disappoint them!

I hope to publish here very soon the things I’m working on under the Intel umbrella. See you!

20 de November de 2011


Do you have 3 minutes? I’m running a small user survey about the information architecture of the GNOME website and its services. If you do, here’s the link.

18 de November de 2011

About being late, spending time, delivering GSoC tasks and my final paper

It’s been a long time since Google Summer of Code ended, and I still haven’t posted anything since August. I know I am very late (it’s hard to believe that 2011 is already coming to a close — Desktop Summit seemed like it was yesterday!), but besides being extremely busy with my regular job and lots of others little projects and my final paper, I don’t have an excuse.

I got 5 big tasks in my GSoC TODO list. I knew it was a lot right from the beginning, but I didn’t want to worry about the short timetable I would get in the program. I already was contributing in the web team and keeping working on it after GSoC wouldn’t be an issue. From May to August I got intense days in my university (considering it was winter here) and this delayed me a lot. I need to thank to Federico again for his support as my mentor :) .

As for the 5 tasks I got, I only didn’t work in one (which was about reorganizing the developer area). Two of the tasks are ready to be deployed (the one to add support for translating the GNOME website and the other to have a new applications area), and the other two (the community website — which I must say it could be an entire Summer of Code project — and the template update for subdomains) are half-done.

I’m about to give more details about my nearly finished tasks and on deploying them in another post soon (like the new Damned Lies template above which is completely out of context in this post) basically because I’m catching a bigger fish right now. For the past month I’ve been working in my final paper for university. I’m finishing my bachelors in Design and this is consuming all my free time as I need to get it done in the beginning of December. The good part is that it is an analysis of the information architecture for the GNOME website!

And as part of my final paper study, I’m about to publish a user survey which might give me some data regarding how people use GNOME website and its services. Stay tuned!

Meanwhile, please be patient :) . Thank you!

22 de May de 2011

Meu ambiente de desenvolvimento em 7 itens

Resolvi participar deste meme e, aqui vai, meu ambiente de desenvolvimento em 7 itens:

1) Hardware e Sistema Operacional

Minha principalmente máquina para desenvolvimento é um Macbook Pro de 13 polegadas (modelo 2011), com 8GB de RAM, Intel Core i7 2.7Ghz e 256 GB SSD. Confesso que os 8GB de RAM não estão fazendo tanta diferença (utilizo bem menos que isso), mas o SSD faz milagres. Recomendo a todos que, assim que tiverem a oportunidade, substituam seus HDs por SSDs.

UPDATE: Muita gente me perguntou como consegui o SSD. Eu já comprei o Macbook com ele, na loja da Apple, com desconto para desenvolvedores. Na verdade, minha grande amiga e mac maníaca, Marília Guimarães, quem fez a compra nos EUA e o trouxe para cá. O desconto que a Apple dá para desenvolvedores é bem significativo (coisa de $250), mas exige que você tenha um endereço nos EUA. A vantagem de comprar o Macbook com SSD da própria Apple é que ele já vem com suporte a TRIM, o que melhora a vida útil do mesmo.

No Macbook rodo exclusivamente Mac OS X 10.6.8. Há alguns meses o Linux deixou de ser meu sistema operacional principal, apesar de continuar administrando diversos servidores (mas para isso preciso apenas de um Terminal :).

Quando estou desenvolvendo costumo ligar o macbook a um monitor externo de 22′. Programar com duas telas melhora bastante a produtividade, mesmo quando elas não possuem o mesmo tamanho.

2) Linguagens de Programação

Python é, provavelmente, a linguagem que mais utilizo. Escrevo ferramentas para Unix, utilitários no trabalho e estou portando todos meus scripts em bash para python. Entretanto, a cada dia que passa eu tenho programado mais em Objective C, pois tenho feito bastante coisa para iOS (iPhone e iPad). Acredito que em poucas semanas meus pontos na skill “Objective C” irão superar os da skill “Python”.

Também ainda programo um pouquinho em Bash, mantendo alguns scripts antigos.

3) Editores e IDEs

Minhas linhas de Python e Bash são praticamente todas feitas no Textmate, um fantástico editor para Mac OS X, cheio de atalhos e snippets que colocam sua produtividade lá em cima. Recentemente comecei a experimentar o Coda e o Espresso, pois o Textmate está sem atualizações há algum tempo.

Quando estou programando para iPhone e iPad (Objective C) eu sempre uso o Xcode. Não gosto muito dele, mas ainda é a melhor opção (se não for a única) para quem quer programar para estas plataformas.

4) Controle de Versão

No trabalho costumo usar o Git. Em projetos open source depende bastante do resto da equipe. Em alguns casos também uso o Git, hospedando no GitHub, mas em outros uso o Mercurial, hospedando no Google Code. Gosto muito de ambos.

5) Virtualização

Utilizo o Vmware Fusion para virtualizar outros sistemas operacionais quando preciso. Ele é muito bem integrado com o Mac e, sinceramente, não tenho nada a reclamar. Entretanto, minha necessidade de virtualizar algo está cada dia menor. Hoje tenho apenas uma VM para o Backtrack e outra com Cent OS.

6) Softwares

Os softwares que mais uso são:

  • Chrome: Na minha opinião, o melhor browser da atualidade. Leve, relativamente seguro e cheio de recursos. Faço questão de utilizar o build de desenvolvimento do Chrome que, apesar de ser considerado instável, me atende bem e permite que eu teste muitos recursos antes deles chegarem na versão estável.
  • Keynote: Ótimo para fazer apresentações para eventos, clientes e para a própria equipe. Deixa o PowerPoint no chinelo.
  • Adium: Sempre estou disponível no Gtalk e o Adium é um ótimo cliente para Mac.
  • PivotalTracker: Utilizamos SCRUM no trabalho e o PivotalTracker é um ótimo sistema para gerenciamento de tarefas, que se casa perfeitamente com o SCRUM.
  • Campfire: Quando a equipe toda precisa bater um papo online, nós utilizamos o campfire. Além do bate-papo, o sistema permite anexar arquivos e compartilhar códigos.
  • Git-Tower: uma ótima interface gráfica para gerenciamento de repositórios Git. Bonita, prática e funcional.
  • Ecoute: Não gosto do iTunes, então tive que procurar um bom player para o Mac. O Ecoute foi sugestão de um amigo e a escolha foi mais que certa. Possui os recursos que mais gosto como, por exemplo, lastfm, minimalismo, controle no desktop, capas etc.
  • Sparrow: Sou fanboy do Gmail e, quase sempre, o utilizo pela interface web mesmo. Ultimamente estou tentando utilizá-lo no desktop, para ver se tenho algum ganho de produtividade. Nestas ocasiões, uso o Sparrow Mail, o cliente para Mac que mais se aproxima da experiência real do Gmail.
  • Terminal: Vira e volta preciso fazer algo via linha de comando. Utilizo o próprio Terminal do Mac, mas com alguns recursos adicionais.
  • Things: Ótima ferramenta para gerenciamento de tarefas.
  • 1Password: Não dá para lembrar de todas as senhas, de todos os sites. Por isso, deixo o 1Password fazer o trabalho sujo para mim.

7) Música

Não dá para trabalhar sem música. Na verdade, eu conseguiria colocá-la em quase todos os momentos da minha vida. Prefiro escutar música com fones de ouvido, ao invés de som ambiente.

Só gosto do bom e velho Rock And Roll, Blues e Jazz. Led Zeppelin, Deep Purple, Pink Floyd, Black Sabbath, Beatles, Metallica, AC/DC, Neil Young, Creedence Clearwater Revival, Steve Ray Vaughan, BB King, ZZ Top e por aí vai. Axé, pagode e essas bandinhas emo, tipo NX Zero e Restart, são totalmente proibidas na playlist.

E seu ambiente de desenvolvimento, como é?

Agregador com blogs sobre desenvolvimento para iOS

Recentemente criei um agregador com diversos blogs sobre desenvolvimento para iOS.
 Criei dois, na verdade. Um com blogs em inglês e outro com blogs

A ideia é agregar os blogs como um todo, sem a censura bitolada que
outros agregadores de blogs usam para filtrar o conteúdo que é

Para participar do agregador não precisa falar apenas sobre
desenvolvimento para iOS, mas isto tem que ser o foco principal. Eu 
até aceito outros tipos de posts, já que há outros temas que podem nos
interessar (boas práticas, metodologia etc).

Gostaria de sugestões de blogs que podem ser adicionados ao planeta. Principalmente blogs nacionais.

15 de May de 2011

Minha primeira semana com o Xoom

Mensagens subliminares...

A pouco mais de uma semana estou usando o Xoom da Motorola, o primeiro tablet com o Android Honeycomb, e até o momento as impressões que tive são as melhores possiveis.

Desde de quando começou essa explosão de tablets,  sempre me perguntei duas coisas: para que eu teria um tablet e para que isso serve? A resposta para esses questionamentos estará no fim do post.

Logo que você liga o aparelho você tem uma pequena má surpresa, no modelo 3G ele requer um sim card para que você possa entrar no sistema, passado esse pequeno incomodo, logo você está configurando sua conta Google.

O xoom, como dito anteriormente, vem com o Android 3.0 e para quem está acostumado com o sistema Android logo percebe as diferenças, é uma interface bem diferente e com conceitos diferentes. O dispositivo não tem botões de navegação, ele tem apenas o botão de liga e desliga e os controles de volume, toda a navegação é feita por software na própria tela do Xoom.

Transição de tela

A primeira vista a transição de tela do Xoom é lenta ao se comparar com o Ipad, contudo, depois de muito pensar a respeito eu notei que o ambiente do Xoom é 3D e quando você vai mudar de ambiente ele gira o foco e renderiza os icones. Isso é o mais puro achismo e não tem o mínimo embasamento  técnico. De qualquer forma em qualquer programa a transição de telas no Xoom é rápida e suave.


O Xoom tem duas cameras, uma frontal para video chamadas e uma traseira para filmagens e fotos. As duas cameras me impressionaram bastante, mas a camera frontal numa chamada de video do Gtalk me surpreendeu.


Engraçado como ao ler reviews em alguns sites/blogs de tecnologia algo que sempre é colocado em evidencia, talvez por falta de imparcialidade e paixão pelo concorrente, é o fato de ter poucos aplicativos modificados/desenvolvidos para uma tela de 10.1 polegadas. Quando você começa a usar o xoom e instalar os aplicativos que você está acostumado a usar no seu celular, você não nota grandes diferenças ou impecilhos de uso. Por exemplo, uso o twicca que é um cliente para twitter e ele obviamente não é modificado para o tablet e simplesmente ele só amplia a experiência que eu tinha no celular.

As melhores surpresas no honeycomb são os apps do Gmail e Gtalk. A interface do Gmail para tablet é fantastica, dá até vontade de não usar mais a interface web ;) . O Gtalk como eu já disse, tem a capacidade de chat com video que é algo que sempre senti falta e o melhor, as chamadas podem ser feitas do xoom para qualquer outro device com Gtalk e suporte a video, sem restrições de sistema operacional!

Outro ponto forte, a Motorola antes de lançar o Xoom logo correu e fez diversas parcerias e assim é possivel ter app da Saraiva que te dá direito a 6 livros gratuitos, app da Folha e da Abril, entre outros. Eu não sou um grande fã da leitura digital, eu realmente gosto de ter o livro e le-lo da maneira que eu achar melhor. Lê no Xoom não é ruim, mas não chega a ser a experiencia mais agradavel e isso vale para qualquer tablet, o peso deles dependendo da posição gera um certo desconforto. Para leituras ocasionais acredito que ele se de muito bem.


O navegador é uma versão leve do chrome, que na pratica que dizer que você tem um browser normal no seu tablet apesar da maioria dos sites reconhece-lo como um navegador mobile, o que não é tão ruim, pois a leitura nas versões mobiles geralmente são melhores. Outro ponto forte é a possibilidade de sincronizar o chrome do Xoom, desse modo você tem um ambiente de navegação unico em todos os seus devices independente de sistema operacional.


Rá! Nenhuma até o momento, e olha que uso muito e já instalei tudo que é tranqueira nele.


O xoom americano tem software 100% Google, na pratica isso quer dizer que o Google é responsavel pelos updates. No Brasil, a Motorola usa uma room baseada na americana para atender as redes de telefonia 3G e talvez outras coisas mais. Em partes os donos do Xoom brasileiro precisam da motorola para terem versões atualizadas, na pratica isso pode ser um pouco diferente já que o bootloader do dispositivo é destravado…


A ideia aqui não era dar um review tecnico, as especificações estão por toda a internet, queria mesmo era passar um pouco da experiencia de uso.

Ainda continuo sem saber qual a utilidade de tablet, uma vez que ele faz um pouco de tudo. Acredito que o principal seja ter um ambiente, de certa forma ilimitado, a mão a qualquer momento.

Quer comprar um tablet, o Xoom é uma ótima opção e eu recomendo fortemente. Ótimo hardware e muito bom software fazem do Xoom de longe o melhor tablet que já tive contato.



07 de April de 2011

12 de March de 2011

Cheese 2.91.91 using Camerabin

In January I started changing Cheese to use Camerabin as its pipeline base. I blogged about it twice, but, in case you missed it or forgot everything about it, let me repeat myself: Camerabin is the high level GStreamer element that basically does what a camera does, that is, take pictures, record video and show preview. Since Cheese does all that and more, it makes sense to use this element instead of re-implementing it all. The news part is that this work is now in Cheese’s master branch and also in release 2.91.91.

There are some other things I haven’t posted about yet:

Event handling: There was a warning in Cheese after the change to Camerabin which said “Internal GStreamer error: clock problem“. Investigating that I discovered that it was a problem in the input-selector that Camerabin uses internally.

Right now Camerabin has a copy of input-selector, because it uses the “select-all” property that was removed from current input-selector. The problem was that the input-selector didn’t handle upstream events (from the sink to the source direction) when the input-selector had the “select-all” property set. Well, input-selector can have many inputs and choose among them, as you can guess from the name. So, when select-all is set you need to send the event to all of those inputs. Other than the warning, this actually has no effect in Cheese’s case, because the event that is not forwarded (a latency event) wouldn’t actually be handled by the elements that don’t get it. Even so, I submitted a patch which was committed to master branch of gst-plugins-bad.

Taking photo without saving: Cheese Camera has a method that takes a photo and then provides the picture as a GDK pixbuf without saving it. The api may not be the best and there were some nice comments on how to improve it, but at least in Cheese without Camerabin this worked and it was used inside of cheese-avatar-chooser. Well, I didn’t realize that before my last blog post about Camerabin, but this was totally broken in my Camerabin branch, in fact, I hadn’t implement it at all.

Camerabin can send a preview message after taking a photo if you set the preview-caps with the desired format for the preview. I thought using the preview message was the best way to implement cheese_camera_take_photo_pixbuf(). The problem is that Camerabin only took photos to save them too, meaning the file name of the photo to be saved had to be set. Right now Cheese works around that by setting the file name to /dev/null, but I also sent a patch to Camerabin to allow taking a picture without saving if preview-caps is set, meaning it won’t encode the image just to save it to /dev/null. I’m keeping the workaround for now, since the change wasn’t released yet, but we will be able to remove it in the future.

Many thanks to Thiago Santos, who held my hand when I met those and other problems in Camerabin and who always encourages me to fix stuff and send patches.

I’m very excited about this change in Cheese. I’m sure there will be bugs, but I think using Camerabin will make some improvements in Cheese easier and we will grow with Camerabin (and maybe Camerabin2 in the future) and also push it to be better.

02 de March de 2011

Terminator no GNOME

Sim, vamos falar de Terminator, e não, não estamos falando do Arnold ;)

O Terminator é um terminal simples e IMHO muito mais produtivo que os terminais mais comuns(gnome-terminal) ou mais alternativos(guake) encontrados para GNOME.

O principal recurso, que o diferencia dos outros, é o fator de poder dividir e sub-dividir a janela em pequenos terminais. Usando um monitor grande, ele é praticamente a ultima coca-cola do deserto!

Quando você abre o terminal a tela dele é comum

Com essa tela aberta você trata-la como um gnome-terminal e abrir abas com um simples Ctrl+t . Mas nossa ideia é aproveitar as funções de divisão de telas. Então com um Ctrl+shift+e você divide a tela verticalmente como mostrado abaixo.

Com essa tela eu geralmente movo o foco para o terminal da esquerda, você pode navegar entre terminais tanto clicando neles ou com ALT+seta direcional, e a divido-a horizontalmente com Ctrl+shift+o.  Essa é a minha tela padrão de trabalho. Uso o terminal comprido para atividades que requerem uma tela mais extensa e as menores para conexões locais e ssh usando screen(falarei mais e mostrarei dicas e meu arquivo de configuração no proximo post).

Em qualquer um dos terminais você pode maximiza-lo para preencher a tela inteira com um simples Ctrl+shift+x.

Esse é o modo em que eu o uso, eu já tentei faze-lo salvar esse estado mas não consegui e pela mais pura preguiça não tentei mais ou mesmo alterei o Terminator para fazer isso. Se você o usa, ou começou a usar agora por causa do post, conte aqui como é a sua configuração ideal de tela.

Você encontra o Terminator nos melhores repositórios da sua distro favorita. :)

Atualização: o Vitor deixou a dica aqui nos comentários de como fazer para salvar as configurações do Terminator, testei aqui e funcionou bem ;)

20 de February de 2011

My GTK3 porting story

It is now possible to run Cheese using GTK+ 3 getting it from Cheese’s branch gtk3.

Cheese has a gtk3 branch for a while, but until very recently it only had one patch changing mostly versions in configure.ac. Then Bastien Nocera made 3 more patches changing code of CheeseWidget, CheeseFlash and um-crop-area. I wanted to use the changes, and silly me, I thought the branch was going to compile when I first tried to run it. It turns out that I spent days on it until it finally compiled and then a little more time before I was able to run it.

Most of the changes were on build system and Cheese’s vala code. I have never programmed in vala before, so this was a learning opportunity with some challenges in the way.

Funny story

Cheese was still using libunique-1.0, but in order to work with gtk3 I would have to switch to libunique-3.0. There was no vala binding for libunique 3, but I also hadn’t found one for clutter-gtk-1.0 and I was using the GObject Instrospection one instead and it seemed to work at the time.

Using gir files didn’t work so well with libunique. Vala was loading the right gir file, but it said the namespace “Unique” did not exist. So, I asked for help on the #vala channel. The first piece of advice was to switch to GApplication instead of using libunique, but I didn’t know how hard that would be and I wanted to understand why I was unable to use libunique-3.0 first. With some more help from someone else in the #vala channel I found out that the Unique-3.0.gir file had the wrong package name on it. As I didn’t know how to fix that and I didn’t even know if it was a problem in libunique or a GObject Introspection parsing problem I asked for help in #introspection.

In the #introspection channel, Emmanuele Bassi (ebassi) was the one that helped me, libunique’s maintainer. Isn’t it nice when that happens? I mean, you’re just asking for anyone less clueless than you to help, but you can actually talk with people that work on what you’re using. Anyway, continuing with the long story, ebassi told me the problem was in libunique, that he wouldn’t work on it soon, but he encouraged me to file a bug for it and I did. It turned out that the bug was easy to fix (for him at least) and something like 15 mins later he had fixed it and pushed it to master already. That was a nice surprise!

But my problems didn’t end there. After I fixed some GObject Introspection annotation in libunique for my code to work, valac started to crash with a segfault. I reported it, but I still don’t know what the exact problem was. The only way I found to fix it was to switch to GtkApplication and stop using libunique. If only I had listened to that first advice! Using clutter-gtk with GObject Introspection did not work in the end either, but turns out I was just missing the recently released vala binding for it.

I learned many things on this quest. I had never looked at gir files or vapi files before and I learned a little trying to debug and fix problems. The non-technical lessons were: it’s really painful to use stuff that is new and not widely used (yet?), you will find problems. But it’s also very nice to be able to fix the problems and work with helpful people.

By the way, to share my love for GNOME I’m organizing a GNOME 3.0 Release party in my town – Belo Horizonte, Brazil. So, if you’re in the area, save April 9th and get in touch if you want to help with organization.

Update: Patricia Santana Cruz had already made a patch to port Cheese to Gtk.Application (which is also way better than mine), so if I was any smarter I wouldn’t have half of the work I did. And now I know she is also one of the responsibles for we having the clutter-gtk-1.0 binding for vala too and she is working on some more bugs in vala and going after the warnings that affects Cheese. In short, she is awesome!

13 de February de 2011

O Nícolas chegou.

Olá pessoal,

O Nícolas chegou :D . Na verdade ele chegou há 22 dias, mas confesso que ainda não tinha achado tempo e inspiração para escrever, foi mais falta de tempo do que inspiração, mas hoje saiu.

Bom, ele chegou com 36 semans, convertendo isso para meses foi no 8º mês que ele nasceu. Veio um pouco prematuro, mas veio saudável.

Ele, apesar de ter nascido com 8 meses, nasceu com bastante saúde. A data do  nascimento dele foi dia 21/01/2011, um dia depois do aniversário da Carol, minha esposa.

Penso que este foi o maior presente dela, e sem dúvida meu também.

Hoje, já com 22 dias, ele é um moleque esperto e sistemático (Sinto algo semelhante com minha pessoa no ar hehe).

Então para quem ainda não o viu, vou colocar a fotinha dele aqui para todos.

Nícolas Volpato Jorge

Nícolas Volpato Jorge

Não tem muito o que falar… quem é pai sabe o que eu to tentando falar neste pequeno post.

Um abraço para todos.

Ps.: Recomendo um filhão para quem ainda não tem :D

Google Bookmarks Technorati Favorites Twitter Facebook Google Buzz LinkedIn FriendFeed Identi.ca Orkut Tumblr Delicious Reddit WordPress Share

29 de January de 2011

27 de October de 2010

Listadmin: Administrando as filas do mailman de forma rápida e simples

Além de fazer parte do Sysadmin Team do GNOME também colaboro com o Moderator Team. Esta equipe de 02 pessoas é responsável por moderar todas as 250 listas existentes no Projeto GNOME. Até pouquissimo tempo este trabalho ultra-chato era feito através do ambiente de gerência Web, só que as coisas estão mudando. Christer Edwards, atual […]

09 de October de 2010

Palestras no IV ENSL e participação na H2HC Conference

Em novembro participarei de 02 grandes eventos. Iniciando com o IV ENSL e o VII Fórum Gnome dias 05 e 06 em Natal/RN onde farei 02 palestras. No VII Fórum Gnome que ocorrerá no IV ENSL o tema será “Por trás da Infra-estrutura do GNOME: Trabalho para Sysadmins”, nesta apresentação vou mostrar como funciona a […]

18 de February de 2010

Blog sobre Saúde da Família

Os leitores mais antigos devem lembrar que sou médico de família e comunidade, e que já publiquei um artigo sobre a estratégia Saúde da Família no Kanzler Melo Psicologia, um blog mantido pelo tradutor do GNOME e psicólogo Vladimir Melo e sua esposa. Há poucas semanas assumi a manutenção do Planeta Saúde Brasil, criado pelo mesmo Vladimir Melo, e no embalo dei início a um projeto de muito tempo, que é meu blog sobre saúde, o Doutor Leonardo.

Enquanto o blog que você está lendo agora é voltado para entusiastas do software livre, o Doutor Leonardo é voltado para quem não é profissional da saúde, ou pelo menos não com nível superior na área. A missão do Doutor Leonardo é contribuir para a que as pessoas possam cuidar melhor da própria saúde (ou da saúde de seus parentes), ou administrar melhor as eventuais doenças de forma que não interfiram no dia-a-dia. Os assuntos vão desde estilo de vida saudável até políticas públicas de saúde, sem esquecer de comentar notícias relevantes na área da saúde.

16 de February de 2010

Últimos acontecimentos

Pois é... faz tempo que não blogo :-( . O final de 2009 e começo de 2010 foi bastante corrido: tive que terminar meu trabalho de conclusão de curso e comecei a trabalhar. Mas agora as coisas já estão mais calmas.

Finalmente me formei. Agora posso me declarar cientista da computação e já estou aprovado no mestrado, que começa mês que vem. Minha colação de grau foi na quarta feira e agora fico no aguardo da colação de gala, na qual irão meus familiares e amigos.

Em dezembro comecei a trabalhar. Estou trabalhando na agência de publicidade Sabbre fazendo o desenvolvimento de aplicações web com Ruby on Rails. Um trabalho que tem me dado motivos para gostar do que faço e que me tem feito aprender muitas coisas.

Infelizmente, tive que abrir mão de algumas coisas, principalmente de software livre. Saí da equipe de desenvolvimento do archlinux Brasil, pois não estava conseguindo tempo para me dedicar. Como não gosto de assumir compromissos que não posso cumprir, eu acabei optando por sair. Desejo boa sorte e muito sucesso a todas as pessoas que continuam por lá. Continuo agora só gerenciando a equipe de tradução do GNOME, que aliás já está em pleno ritmo de tradução para o GNOME 2.30.


04 de February de 2010

Portugal define data para Acordo Ortográfico da Língua Portuguesa

Em 2008 o governo português tinha aprovado o Acordo Ortográfico da Língua Portuguesa com seu Segundo Protocolo Modificativo, e após uma audiência pública o Parlamento Português ratificou a aprovação. A questão era quando o acordo seria implementado. Pois bem, a nova ortografia começou a valer em Portugal neste ano, e até 2016 o país terá uma transição igual à brasileira, em que ambas ortografias são consideradas corretas.

Mais ainda, a Lusa, única agência de notícias de âmbito nacional em Portugal, adotou o Acordo Ortográfico. Na sequência, o semanário Sol adotou o acordo, bem como o jornal Barlavento e os jornais Expresso e Diário Econômico. O primeiro veículo de notícias a adotar o Acordo Ortográfico em Portugal foi provavelmente O Despertar, em janeiro de 2009!

De acordo com o professor Carlos Reis, a adoção do Acordo Ortográfico da Língua Portuguesa pelos meios de comunicação é importante para a língua portugesa.

21 de December de 2009

Barcelona campeão mundial

Parabéns ao Barcelona pelo título conquistado. Eu cheguei a pensar que daria Estudiantes.

Enquanto eles comemoram o primeiro título, lembro que já conquistamos três vezes (inclusive uma delas contra eles).

Um fato que eu não sabia e agora sei é que no mesmo ano da disputa ganhamos outro título (do Torneio Teresa Herrera) contra eles. E de 4 a 1!!! Na época o Barcelona era bem "maior do mundo" do que é hoje.

Saudações tricolores!

31 de October de 2009


Semana passada fui no Latinoware e foi bastante interessante. Lá palestrei sobre nossa equipe de tradução do GNOME e tive algumas experiências interessantes:

  • Foi bacana rever alguns e conhecer boa parte do pessoal do GNOME Brasil. Espero vê-los mais vezes;
  • Também revi o Farid, que trabalha comigo no Archlinux Brasil, ficamos de conversar mais como acabei não podendo ir no último dia devido ao atraso do motorista que ia buscar a gente no Paraguay, não conversamos :-( ;
  • As palestras também foram legais: o Lício falou sobre o GNOME Love, eu falei sobre a equipe de tradução do GNOME para nosso idioma, o Binhara falou sobre o Mono, a Izabel e a Luciana falaram sobre o GNOME Women (eu infelizmente perdi essa palestra :-( ), o Vinicius Depizzol falou sobre a experiência do usuário no GNOME e para finalizar o Tiago falou sobre personalização do GNOME. Um ótimo conjunto de palestras :-) ;
  • Foi legal discutir coisas, tanto técnicas como não técnicas, com as outras pessoas do GNOME e de outros projetos como o Fedora. Aliás esses eventos acabam proporcionando trocas de experiências que contribuem em muito com os projetos de SL. Aliás isso é uma das coisas mais importantes de eventos como esses e tenho que ser bastante grato à Fundação GNOME por me patrocinar e ter a oportunidade de fazer coisas como essa, além de poder participar do evento e conhecer mais pessoas;
  • Depois de assistir uma palestra interessante sobre o Mono com o Binhara e depois de ouvir o Everaldo falar horas e horas disso, fiquei com vontade de aprender a programar nesse ambiente;
  • Conversei com o João Sebastião sobre como podemos fazer a adequação do GNOME para a nova ortografia. Para corrigir algumas coisas nas versões antigas ele fez um script que pode ser bastante útil para agilizar nosso trabalho. Próximos capítulos desta trama serão divulgados aqui neste blog em breve ;-) ;
  • Conheci o Paraguay, e embora este país tenha muitos produtos interessantes a venda ele tem a pior poluição visual que já vi;
  • Não consegui ver as cataratas, aliás faltou tempo para isso :-( ;
  • Minha palestra não teve um grande público, mas acho que deu para passar a mensagem da equipe. O pdf aparecerá em breve por aqui;
  • Foz do Iguaçu é uma cidade bastante esquisita: lá é úmido pra caramba, escurece bem tarde e isso me faz perder a noção do tempo;
  • Não gostei muito de comida Baiana. Tem muita cebola. E eu odeio cebola. Aliás, a coisa que menos comi lá foi comida paranaense;
  • A organização do Latinoware também deixou muito a desejar, já fui em eventos mais bem organizados e acho que o Latinoware também podia ser;
  • Agradeço a fundação GNOME por me patrocinar, ao Leonardo por me indicar para palestrar e a Izabel, que correu atrás de tudo por lá (aliás, depois que organizei junto com amigos a ida do pessoal da minha faculdade pro FISL, aprendi a agradecer as pessoas que fazem acontecer);

É isso aí :-) Que o próximo evento venha logo e que eu tenha a oportunidade de vê-los em breve.

UPDATE:Aqui vão os slides.


10 de June de 2007

Violent swerves in life

One day, you’re writing code, packaging and translating it, administering systems and giving talks about free software. The next day, you realise you want to go to Law school.

It does not feel any different from starting all over. Fortunately, it feels like it is soon enough.

23 de September de 2006

Thanks, Murphy!

So yeah… I guess I’ll have to take back what I said about clearing the accounts backlog until the end of the weekend, even though I’ve already gone through more than half of it.

Why? Quite simple. My hard disk finally died, after a couple of months spitting out I/O errors and corrupting filesystems all around.

Oh well…