21 February 2012

Years later...

Quick catchup:
  1. TWU kicked ass. Surpassed any expectations I had about it. Bangalore is an amazing city, my mates there were great people and so were the trainers.
  2. So far I've worked in two different projects on ThoughtWorks. Professional growth has been amazing. Hell, personal growth has been amazing too. ThoughtWorks greatest asset is really its people. 
  3. Unexpectedly, I've became a proficient Java developer. I had amazing project mates both on TWU and my first client facing project to help me get there. With a critical view and the right development practices and tools, Java is not as bad as I thought it would be. I'm still not fond of the language, but I've learned that TDD, good OO practices, a CI pipeline, and a good team make the productivity gap between technologies much smaller than it did for my small personal projects.
  4. The office in Porto Alegre is a great environment and I have to say it again: it's because of the people. It was great even when it was in the improvised space of unoccupied research labs in the CompSci building in TecnoPuc.
  5. I've been to San Francisco, US for 4 weeks. Had a great time in there, had the chance to create strong bonds with my team and meet the client. Really cool experience. It's amazing being a developer with a mere 1 year experience and have the chance to be close to the business you're helping out.
And right now, here I am, on my first paid vacations ever, in Aguas Dulces, Uruguay for the last day. But it's just end of part one, Letícia and I are soon getting a bus to Montevideo for part two of our trip.

Well, there I go, removed the stigma of not posting in the blog for ages. Now I can start using this again.

24 September 2010

Semi-Automatic Translation and SVG Card Walls

Yesterday I was helping translating part of a chapter written by Paulo Caroli for a book about agile development to be released in brazilian portuguese. My workflow went as follows:
  1. Copy a paragraph and paste it on Google Translate to get a rough translation
  2. Paste the translation back on the original document right bellow the original paragraph
  3. Make adjustments on the rough translation, consulting the original text when needed, until it seemed good enough
The reason I've used an automatic translation tool is because there's many trivial things that the tool get right. So it makes my job much easier. I've seen many people (including myself, sometime ago) that would disregard automatic translation tools for being inaccurate. However, as I was discussing one day with my former classmate Daniel Beck (who does research in Natural Language Processing), current automatic translation can help a lot in getting the easiest parts done and leave only the hard stuff for you to work on.

Anyway, as I worked today on this translation I saw some features that could enhance my workflow. As far as I know, the larger the context the translation tool have the better is the translation, so it would be nice to me if I could paste all of the chapter text as a context for the paragraphs that I want to translate. I know I could paste the whole text and get the whole translation, but I've wanted a way to have a improved translation and still be able to work in smaller chunks of text each time. 

Another thing is some common expressions that occur that can have several possible translations but you want to have a single one. For instance, "card wall" appeared several times on the text, and each time it was translated for different expressions (parede cartão, cartão de muro, muro cartão), even on the same paragraph. In this case it was very important to maintain consistency because it's a key concept and it need to have the same name through the whole text. It would be very useful to be able to say that some expression should always use the same translation.

Paulo also asked for some help at doing some images. I gave a shot at doing a card wall using Inkscape. This is how it looks at this moment:

The svg is here in case you want to play with it.

23 September 2010

Shortcut Trap

So, I was writing a draft post and, as an Emacs user, I instinctively used one of the readline movement shortcuts that also work on most Mac OS X applications: C-p (Ctrl + P for those not familiar with Emacs shortcut notation). What I found out is that this shortcut publishes your post on blogger... I thought I was fast enough deleting so it wouldn't show up on feeds, but I've just noticed it appeared on the TWU bloggers feed. Bummer.

Well, I don't think that "Publish Post" is a function that should have a keyboard shortcut. It's not undoable (you can delete the post, but even just a few seconds later it still shows up in your feed) and it's something that you do only one time per post, and just after you finished writing it (or editing it) so I can't say it would be a huge sacrifice to have to move my hands out of the home row to use the mouse and click in "Publish Post". Well, it's not the first time that I get an incomplete post published due to clunky keyboard shortcuts on online blog editors. Maybe the problem is with me, but still I believe that there should be a way to prevent an accidental publish showing up in all your feeds.

Just for extra irony, I published this post using the dreaded keyboard shortcut.

17 September 2010

How I got into ThoughtWorks (and TWU)

Disclaimer: This post is about a life changing story. You can listen to cheesy victory/enlightenment/triumph songs while you read it. Also, I'm not a native english speaker, but I like correct writing. I appreciate any corrections!

About 2 months ago I was pretty lost. I was finishing the first semester of my master's course, but it felt like it passed too fast and nothing really happened. I don't know exactly what was going on with me, but for some reason I couldn't do any of my assignments, I was skipping classes and my days felt pretty empty. It couldn't be stress of having to many things to do. I've had semesters much more stressful than that during graduation with a lot of big assignments piling up. The thing that was missing this time was the final jolt of motivation that would make me got through those blissful "A-ha!' moments and come up with solutions for the problems that were keeping me from going forward. They never came this time. I was only getting sad and totally burnt out.

During a specially stressing day I've come to realize I was going on for all the wrong reasons. I didn't want to keep doing what I was doing. I've got saturated from academic life. My main motivation was not letting other people down. My advisor, my professors, my father. This shouldn't be a valid reason for keeping doing something. After talking about it with my girlfriend and my mother, the more supportive side of my family, I've got the confidence needed to make the decisions that would change my life. And so I did.

It wasn't easy at first. But since I've did the first step, it just seemed that everything began to fall into place. I've talked to one of my professors to explain that I wasn't doing a presentation I should do that day because I was dropping out. To my surprise, he was very calm and supportive. Then I spoke with my advisor and she was very supportive too. I've started to realize that a lot of the pressure I was feeling came from my own head! Soon I started to feel light and calm again, like I hadn't in weeks, maybe months. From that moment I decided that life was going to be about me and what makes me happy. First thing, I've decided to get a job. But not just any job. I wanted a job that would make me happy.

To make the most from my job hunting I went to FISL (International Forum of Free Software) for do some networking and have some fun as well. There I've met Pedro Pimentel, my former classmate at UFRGS. I  commented with him I was looking for a job. That was the first time I heard about ThoughtWorks. He told me about the company in a quick chat and I've got interested. So he put me in touch with Camila Tartari so she would invite me to an assessment. As I've waited for it to happen I started reading about ThoughtWorks and my excitement started to build. Soon I was called to the assessment and got even more excited.

In the very beginning I was a bit nervous, but the whole process went so smoothly that it didn't feel like a selection process at all. As the process went further, in a very counter-intuitive manner, I've got more comfortable. Interviews felt like conversations, and I got to meet very smart and nice people. Also, everyone seemed happy! "Hey, that's what I was looking for! I want to be happy like these people too!" I've thought. And so it was becoming pretty clear that the place that I was looking for when I've decided to change my life was ThoughtWorks.

In my very last interview, some issues came into light. People liked me, they thought I've had the right attitude, the feedback was great, but (there's always a but) I didn't have enough experience with Java, and neither with enterprise level software projects. Well, normally that would be when they say "Thank you for participating in our process, but we're very sorry to inform...", but instead that was the first time where ThoughtWorks University was mentioned. That time it was brought to the subject as a "possibility", as in "maybe". To me it was a very remote possibility. I went home to wait for an answer and some very long days came along. I tried to distract myself in every way.

After a week or so of waiting, I was getting out of distractions having killed a lot of my NetHack characters. So I sent Camila an email and she replied saying she was out of town and would call me next morning to talk about an opportunity. My mind was pretty fast connecting the dots, and "opportunity" probably meant TWU. Well, that doesn't mean I could really believe my logical conclusion. Then came next morning, a tuesday, and Camila called me and I've came to know that "opportunity" really meant TWU. I still couldn't believe it. Only on friday, when I've sat down face to face with Camila and Amit and they told me again about TWU, the possibility of going, and stuff I've started believing. I've asked if it was certain, if it was real and they told me that all they needed was for me to say "yes". My mind was blown. I've got so excited I couldn't speak english anymore. Words won't come out, it was impossible to express how I was feeling. When I've got out of the office I walked to the exit of the PUCRS campus only with a big smile on my face, but in my head it was a glorious 80's movie moment where I ran and high-fived everyone I found on my way ending in a big jump with my right fist up on a victorious pose.

After getting the news definitely, it was time to celebrate. On that same friday I've got to go to my father's so I've decided to go to a bar next to his apartment. A friend suggested we could go to Lagom, a recently opened pub where they brew they own beer. Sounded great. So we got there and I was walked in I've stumbled with a lot of ThoughtWorkers celebrating the closing of a huge project! What are the odds? The beer was truly great and I've got to meet more of my future coworkers.

From that day until now I'm anxiously waiting for the end of the month when I'll be departing to Bangalore to start what will probably be the most exciting 6 weeks of my life until now. I'm not relaxing though! After swimming against huge tsunamis of bureaucracy – I'm exaggerating, obviously – to get my passport and visa, I'm already investing my time on pre-course materials that consists of books and more courses. And it's being a lot of fun :-)

15 April 2009

Horóscopo do Kao

Tão bom quanto qualquer outro.

Áries
Inesperadamente você recebeu uma herança que já estava esquecida. Receba 100.

Touro
Seus filhos já vão para a escola. Pague a primeira mensalidade. Pague 50.

Gêmeos
O seu cachorro policial tirou o 1º prêmio na exposição do Kennel Club. Receba 100.

Câncer
A geada prejudicou sua safra de café. Pague 50.

Leão
O médico lhe recomendou repouso num bom hotel da montanha. Pague 45.

Virgem
Você apostou com os parceiros desse jogo e ganhou. Receba 50 de cada um.

Libra
Você vai casar e está comprando um apartamento novo. Pague 25.

Escorpião
Você tirou o primeiro lugar no Torneio de tênis do seu clube. Parabéns! Receba 100.

Sagitário
A prefeitura mandou abrir uma nova avenida, para o que desapropriou vários prédios. Em consequência seu terreno valorizou. Receba 25.

Capricórnio
Você foi promovido a diretor de sua empresa. Receba 100.

Aquário
Você achou interessante assistir a estréia da temporada de ballet. Compre os ingressos. Pague 30.

Peixes
Seus parentes do interior vieram passar umas férias na sua casa. Pague 45

Ofiúco
Saída livre da prisão. Conserve esse cartão para quando lhe for preciso ou negocie-o em qualquer ocasião, por preço a combinar.

02 March 2009

Firefox de Volta (aka Teclado Rulz)

Já faz um tempinho que eu tinha voltado a usar Windows XP no meu laptop e por conta disso acabei tendo a oportunidade de experimentar e me apaixonar pelo Google Chrome. Depois de muito tempo usando Firefox, o Chrome me conquistou por sua simplicidade, as abas em cima (um pequeno detalhe que eu acho muito legal) e também por ser muito rápido. Tudo isso bastou até pra me convencer a abandonar minhas extensões, aliás, um dos argumentos que eu mais vi usuários do Firefox usarem para torcer o nariz para o Chrome.

Eu achei que ia demorar pra encontrar um motivo para voltar a usar o Firefox, mas finalmente voltei a usá-lo. Começou quando eu vi um link para o Bespin, um editor de código online desenvolvido pelo Mozilla Labs, na lista Python Brasil. Para testá-lo precisa do Firefox 3.0 ou do Safari 4.0, então, depois de muito tempo abri meu Firefox novamente.

Na onda de testar coisas que pareciam legais, dei uma olhada no Ubiquity. Eu já tinha ouvido falar nele tempos atrás e mais recentemente o Juan tinha me mostrado ele em ação, mas o que realmente me fez ficar com ele foi a atratividade enorme que comandos por teclado passaram a ter para mim desde que eu comecei a usar o Emacs. Agora me parece muito mais prático ter uma lista de comandos fáceis de lembrar e com autocompletar para ajudar quando a memória falha.



Lendo as referências do Ubiquity também descobri o Enso, um launcher de aplicações que segue conceitos muito parecidos com os do Ubiquity (na verdade seria mais correto afirmar o contrário). Comecei a usar e é muito mais divertido abrir os programas assim do que navegar pelo menu Iniciar.



A única coisa que eu não gostei foi o jeito padrão de digitar comandos (segurar Caps Lock, digitar o comando e soltar), mas isso é configurável. Pra mim foi essencial, já que meu teclado não tem mais uma tecla Caps Lock.

E eu estava pronto para escrever que um dos problemas era a falta de extensibilidade do programa, mas após uma rápida pesquisa acabei de encontrar uma versão beta que é extensível em Python!

23 January 2009

Emacs

Já faz um tempo que eu estou ciente da guerra sagrada dos editores de texto. Como o primeiro deles que eu vi sendo usado foi o vi (trocadilho não intencional) foi ele o primeiro a ganhar minha atenção também. No entanto nunca me motivei o suficiente para me adaptar à interface. Como minha história de programador foi marcada por editores bem normais (para os padrões de hoje) eu acabava sempre caindo para uma alternativa simples e confortável quando eu realmente tinha que fazer algo sério, ou então para um ambiente especializado caso precisasse trabalhar com uma linguagem específica.

No entanto, eu sempre me senti atraído pelas lendas de poder infinito prometido àqueles que dominam um desses editores lendários. Um pouco frustrado pela falta de flexibilidade da minha opção atual, resolvi voltar a investir no aprendizado de uma dessas ferramentas. Baixei e instalei os dois, mas apesar da minha maior simpatia com o Vim, resolvi que deveria experimentar o GNU Emacs dessa vez.

Bom, os comentários sarcásticos sobre o Emacs dizendo que ele é “um grande sistema operacional, faltando apenas um editor decente” estão perto de ser verdade: o Emacs é um sistema bem complexo. Ele vem com diversos modos de edição diferente que são divididos em dois tipos: major-modes e minor-modes. Os major-modes governam o comportamento geral do editor para um determinado buffer (o que você chamaria de "arquivo" em um editor comum, mas que não necessariamente está associado a um arquivo no disco), enquanto os minor-modes adicionam comandos e comportamentos que podem complementar um major-mode. Para um determinado buffer apenas um major-mode pode estar ativo, mas minor-modes podem ser vários. Um exemplo: o major-mode Text serve para editar arquivos de texto normais e o minor-mode Autofill pode ser usado para que as linhas sejam quebradas automaticamente para formar parágrafos uniformes. Existem também major-modes para linguagens de programação e marcação como o c-mode, o python-mode e o html-mode. Além de comandos adicionais, aparecem menus para executar alguns dos comandos mais comuns.

Bom, até agora parece que tudo isso é só uma nomenclatura rebuscada pra coisas comuns que todos os editores tem, mas a diferença é o grau de customização que é possível no emacs. Cada um desses modos são implementados como programas em um dialeto específico de Lisp chamado Emacs Lisp ou ELisp. O que acontece é que cada tecla (ou combinação de teclas) pressionada pode estar associada com uma função ELisp, inclusive as teclas alfanuméricas, o que quer dizer que quando você digita a letra A no seu teclado, existe uma função Lisp que insere o caractere A na posição atual do cursor. Porém, não precisa ser assim! Nada impede você de associar qualquer tecla ou combinação com qualquer outro comando fazendo seu próprio programa Lisp. E é graças a essa flexibilidade que o Emacs vem com uma míriade de modos que não tem nada a ver com editar texto, por exemplo, um psicoterapeuta virtual, um jogo de tetris, um navegador de arquivos, leitor de notícias online e MUITOS outros, tanto já incluídos no GNU Emacs como disponíveis na internet. Fora minor-modes adicionais que acrescentam ferramentas muito legais como essa aqui:



Vale também mencionar que um dos major-modes chamado org-mode tem uma palestra de mais de 40 minutos do Google Tech Talks para explicar o seu funcionamento.

Apesar de todas essas maravilhas, existem razões pelas quais é difícil começar a usar o Emacs.
  • A pletora de funcionalidade pode ser um tanto desgastante. São tantos comandos e opções que é enlouquecedor no início.
  • Os atalhos de teclado costumam envolver malabarismos não tão comuns em outros editores. Existem atalhos como Ctrl+x, b significando que você precisa primeiro apertar Ctrl+x e depois apertar b, até porque Ctrl+x, Ctrl+b é outro atalho que ativa outro comando.
  • O programa foi criado bem antes de algumas convenções que muitos de nós estamos acostumados (Ctrl+C, Ctrl+V, Ctrl+Z, alguém?). Para se ter uma idéia, o comando padrão de desfazer é Ctrl+_ e como o caractere é um underscore, isso significa que você precisa apertar Shift junto em um teclado QWERTY convencional. Felizmente isso tem uma solução simples: existe o modo CUA que é fácil de ativar e que faz com que muitas coisas passem a funcionar do jeito que é convencional nos editores atuais.
  • O programa é um tanto feio para padrões estéticos atuais e tem cara de antigo.
  • Customizar o comportamento do programa significa editar um arquivo Lisp ou usar uma interface um tanto poluída chamada Custom (que, adivinhem, é implementada em Lisp dentro do próprio Emacs)
Apesar dessas desvantagens eu estou gostando de aprender a usá-lo. Já fiz minhas primeiras funções em Lisp para adicionar uns comandos que eu sentia falta de outros editores e foi bem fácil. A impressão que eu tenho é que é um tipo de ferramenta que tem uma interface nem um pouco convencional, mas que compensa aprender. É mais ou menos a impressão que eu tenho do Blender também.

Meu principal objetivo é usá-lo como a IDE perfeita para Python e ele tem umas features bastante impressionantes para isso:



O Rope é usado para uma parte da funcionalidade mostrada nesse vídeo. É uma biblioteca com recursos de refatoração e funções de introspecção úteis para IDE's. No Emacs ele é usado através do Ropemacs.

Uma dica para quem estiver iniciando: aprenda os comandos por nome. Todo comando tem um nome que está relacionado com a função que ele desempenha. Aperte Esc e depois x (ou segure a tecla Meta - Alt normalmente - e pressione x) que você irá para o minibuffer e poderá executar um comando digitando seu nome. Além disso, você não precisa saber todo o nome do comando, basta apertar tab para mostrar uma lista de opções de autocompletar. Se o comando que você executar tiver um atalho de teclado, uma mensagem aparecerá no minibuffer dizendo qual é o atalho, logo após a execução. Assim você pode ir memorizando os atalhos dos comandos que você usa com mais frequência, enquanto os comandos novos que você aprender dá pra memorizar pelo nome que é muito mais fácil.

20 November 2008

Melhor ferramenta EVER!

Sério, isso é muito genial! Funciona assim:
  1. Alguém te faz uma pergunta que ela obviamente não pesquisou antes de perguntar, digamos "Onde eu encontro pentes para macacos?"
  2. Você acessa o site, digita a pergunta da pessoa ou palavras chaves relacionadas.
  3. Você manda o link resultante para pessoa e não dá o peixe, ensina a pescar!
Não é lindo, altruísta e bonito?

Créditos a Renato Besen por ter postado isso na lista Python Brasil.

FazerJogos.org

Eu e o Andrews Medina, um amigo que conheci através da lista do Python, acabamos de iniciar um blog: o Fazer Jogos. A idéia do blog é compartilhar tutoriais baseados em nossas experiências como entusiastas de programação de jogos e também notícias relevantes ao assunto.

Como somos pessoas do Python vai haver um certo viés a favor da linguagem, mas não necessariamente todos os posts envolverão Python. O importante é que tudo tenha a ver com fazer jogos.

20 October 2008

A diferença entre quem sabe fazer e quem não sabe

Pra produzir uns artworks para um pequeno projeto pessoal de jogo em que estou trabalhando eu resolvi usar o Blender. Meu objetivo era produzir uns blocos que parecessem feitos de gelo. Comecei a mexer, fuçar, brincar, etc. e consegui chegar nisso aqui:



Na hora eu achei bem razoável e até fiquei muito contente. Coloquei o gráfico no meu joguinho e achei bonitinho. Como eu não tinha internet no momento em que eu fazia isso, resolvi deixar para depois uma busca no google por "blender ice material". O primeiro link que apareceu foi um tutorial explicando como fazer um material de gelo. Depois de alguns minutos copiando os parâmetros do pdf para o meu material do blend eu renderizei outra vez o meu singelo bloquinho, dessa vez com o material novo. Eis o resultado:



Moral da história: PQP!

14 October 2008

Uma dura verdade

Writer's Block: acontece na programação também.

26 September 2008

Lento

Eu sabia que não devia ter comprado esse HD que grava os dados como ranhuras em um pedaço de rocha...


Pra ser justo, um pouco depois o Vista se deu conta que era mesmo um meio magnético e conseguiu apagar em menos de um minuto.

24 July 2008

15 July 2008

Nesse semestre

Eu...
  1. ... fiz um visualizador de transformações no plano projetivo usando Python + PyOpenGL;
  2. ... fiz um parser para uma linguagem com sintaxe parecida com C - mas com várias simplificações - usando o ANTLR;
  3. ... projetei um processador muito simples no Max+PLUS II;
  4. ... implementei um contador como uma máquina de Moore no Max+PLUS II e depois passei o programa para um FPGA e vi ele funcionando;
  5. ... implementei em software parte do que o OpenGL faz em hardware (transformações geométricas e projetivas), renderizei um modelo 3D usando a minha implementação e o OpenGL e comparei os dois lado a lado;
  6. ... fiz um jogo para Xbox 360 usando o XNA Game Studio 2.0, com a ajuda de um colega na programação e de minha namorada na arte, onde implementei a física do zero e fiz até alguns shaders;
  7. ... implementei alguns algoritmos de métodos numéricos;
Isso é o que eu lembro de prático que eu fiz. Pode parecer pouco para alguns, mas deu pra cansar bastante.

O importante é que terminou e eu passei em todas as cadeiras! \o/

12 June 2008

LinkedIn

Depois de procrastinar por muito tempo, finalmente resolvi começar a completar meu perfil no LinkedIn (para procrastinar outras tarefas que, simplesmente, precisavam ser procrastinadas para a minha saúde mental).

Pra quem não conhece, o LinkedIn é uma rede social com um foco profissional. No perfil vai a formação, a experiência profissional da pessoa e outras informações relevantes desse ponto de vista. Dizem que é uma boa e é realmente levado a sério, então ter um perfil lá pode trazer coisas boas de verdade.

Quem quiser acessar meu Public Profile é só clicar no botãozinho bonito aí embaixo:

View Kao Félix's profile on LinkedIn

05 June 2008

Python: pseudo-código executável

Depois de várias noites mal dormidas tentando fazer funcionar minha função de rasterizar triângulos, finalmente consegui! O jeito que eu encontrei foi escrever ela em Python, debugar até funcionar e só depois traduzir ela pra C++.

Mais uma vez Python me serviu como pseudo-código executável e testável. É a única linguagem em que eu consigo pensar e escrever código quase diretamente.

29 May 2008

Minha Primeira Experiência como Professor

Hoje pela manhã, junto com o Leonardo Santagada, ministrei a aula do Minicurso Python na Semana Acadêmica do Instituto de Informática da UFRGS. O curso surgiu expontâneamente por demanda de alguns alunos da graduação na nossa lista de discussão. O Santagada e eu então nos propusemos a ministrar uma aula para passar adiante a nossa experiência com a linguagem Python.

A experiência foi muito legal pra mim e me diverti bastante dando essa aula. O interessante foi ver 2 professores acadêmicos que me deram aula na universidade - e inclusive estão me dando aula nesse semestre também - inscritos como alunos do curso. Acho que isso serve como exemplo de que a troca de conhecimento é algo independente de hierarquia ou posição acadêmica. Todos nós temos conhecimento para compartilhar e é legal se dispor a fazer isso.

O material usado no curso está publicado no Google Documents aqui e pode ser conferido abaixo também:



Obrigado a todos que assistiram!

15 May 2008

Familiaridade

Por alguma razão eu me identifiquei com esse comic.

12 May 2008

Page Rank do Post do Porão

Minha colega Nadjia procurou as seguintes palavras no Google: 17 de maio porão do beco. O primeiro resultado foi esse post aqui.

Bizaaaarro O.o

21 April 2008

Pushing Daisies

Wow. Acabo de assistir os quatro primeiros episódios e só parei porque minha amada acompanhante caiu no sono e não foi por ela ter desgostado!

A série é ótima. Os personagens são muito bem construídos. Eu sinto uma enorme simpatia por eles e apesar deles serem de certa forma esterotipados, cada um tem características distintas que os tornam únicos.

A história se desenrola de uma maneira gostosa, sem o compromisso de parecer realista ou verossímil fazendo com que situações deus ex machina se tornem uma parte de sua composição e não um elemento empobrecedor.

Ah, sem falar das cores, as cores são lindas!