Quatro livros até ao fim do ano

Reparei há uns meses que não andava a despender tempo nenhum com literatura. Sempre gostei de ler, mas com a excepção de alguns livros técnicos no início da faculdade, costumava optar por obras relativamente light. Estava na altura de tomar a iniciativa e ver se aprendia uma coisinha ou duas. Infelizmente entre o trabalho e a faculdade não sobra muito tempo, pelo que me desafiei a ler (apenas) quatro livros durante este ano. Aqui ficam os escolhidos:

The Pragmatic Programmer – From Journeyman to Master

Andrew Hunt e David Thomas

The Pragmatic ProgrammerO “The Pragmatic Programmer” foi recomendado por uma miríade de programadores no Stack Overflow, e foi por essa razão que o escolhi. Apesar de já ter alguns anos, aborda os principais assuntos relacionados com o desenvolvimento de código e manteve-se surpreendentemente actual. Está dividido em pequenas tranches, cada uma abordando uma boa prática de programação. Foi um dos melhores livros que já tive o prazer de ler, e tenho a certeza que o irei reler muitas mais vezes. Os bons conselhos são tantos que é difícil interiorizar toda a informação apenas numa passagem. É um livro para redescobrir, mudar hábitos, e recomendar a todos os que tenham uma paixão pela arte de programar e queiram passar de prosa a poesia com o código que escrevem.

Evolutionary Robotics – The Biology, Intelligence, and Technology of Self-Organizing Machines

Stefano Nolfi e Dario Floreano

Evolutionary Robotics

Este livro apresenta uma análise em profundidade do trabalho mais relevante na área da Robótica Evolucionária até à data de publicação (2000). Também dá uma excelente visão geral dos processos envolvidos no desenvolvimento de metodologias evolucionárias, particularmente as que utilizam robótica ou simulação de agentes. A abordagem de auto-organização do comportamento tem várias vantagens relativamente às tradicionais soluções codificadas “à mão”, vantagens essas que são exploradas nos primeiros capítulos.

Na minha opinião, este livro é uma óptima introdução a este enorme mundo, com muitos exemplos de como desenhar e realizar experiências. Fiquei surpreendido com a quantidade de possibilidades que podem ser exploradas e investigadas, desde arquitecturas reactivas, a co-evolução, aprendizagem durante a vida, e mudanças de morfologia. Este livro é uma referência e recomendo a quem tenha interesse na área de Aprendizagem Automática e Robótica.

Code Complete: A Practical Handbook of Software Construction

Steve McConnell

Code Complete

Mais um livro que descobri através das recomendações do Stack Overflow. Na realidade, é mais uma bíblia que um livro, com quase 1000 páginas. Não posso falar muito sobre este visto que é o que está a ficar para o fim, por ser tão intimidante.  Aqui fica uma quote do Joel Spolsky: “The encyclopedia of good programming practice, Code Complete focuses on individual craftsmanship — all the things that add up to what we instinctively call “writing clean code.” This is the kind of book that has 50 pages just talking about code layout and whitespace“. Para quem conhece os meus hábitos de programação e já “sofreu” com isso (sou extremamente picuinhas) dirá que é um livro adequado a mim :)



97 Things Every Software Architect Should Know

Rebecca Parsonns

97 Things Every Software Architect Should Know

Este livro foi parte do espólio do Codebits 2010. Contém uma compilação de conselhos de muitos arquitectos de software sobre os mais variados tópicos relacionados com esta profissão. É relativamente pequeno, quando comparado com qualquer um dos outros. Ainda por cima cada secção tem 2 páginas e inclui uma pequena biografia de cada autor, pelo que se torna numa leitura bastante leve que pode ser feita aos poucos. Mesmo que só tenhamos 5 minutos para ler, dá para avançar sem ficar com capítulos a meio. Este livro está disponível online gratuitamente aqui. Se quiserem ver uma ou duas secções, posso recomendar (até onde li) a Stand Up! e a Don’t put your resume ahead of the requirements.

Se tiverem que escolher apenas um livro de programação, certifiquem-se que esse livro é o “The Pragmatic Programmer”. Caso queiram ver mais livros interessantes deixo aqui o link para a pergunta no Stack Overflow com dezenas de recomendações. Recomendo também o Good Reads para gerirem os vossos livros e a vossa wishlist.

read more

O fim dos LulzSec

LulzSecA segurança é, cada vez mais, um ponto fulcral de qualquer sistema informático. Os ataques multiplicam-se, os prejuízos são cada vez maiores e, com os nossos dados espalhados por inúmeros serviços na internet, todos estamos vulneráveis. Muitas entidades não têm qualquer mecanismo de segurança e estão à mercê de hackers que agem por maldade. A possibilidade de existirem backdoors ocultas e activamente usadas é algo que deveria provocar arrepios e noites em branco a qualquer sysadmin ou responsável de sistemas.

O fim está a chegar rapidamente para os membros dos LulzSec. Estão a ser feitas apreensões todas as semanas e os cabecilhas começam a ser apanhados. Esta telenovela dos tempos modernos já dura há alguns meses e gerou muita discussão sobre os métodos utilizados pelo grupo de “hacktivistas”. De certo modo, foi algo completamente novo no mundo da tecnologia: a mediatização da verdadeira anarquia digital.

A minha opinião divide-se um pouco entre os dois lado da barricada.

Por um lado, este tipo de acontecimentos costumam provocar rupturas de comportamento. Por exemplo, o surgimento do Firesheep em 2010 apressou o ritmo da implementação de ligações seguras por SSL no Facebook e outros sites de grande porte. Só quando sentimos na pele as consequências é que tomamos acções drásticas. Existem entidades que não têm qualquer respeito pelos dados dos seus utilizadores. Quantas bases de dados terão dados confidenciais em plain-text? O caso da Sony foi flagrante e deverá servir de exemplo para qualquer um. Ao menos este grupo teve a “decência” de fazer um grande alarido da situação e não ficou a utilizar os dados pela calada, o que teria sido ainda mais grave.

Por outro lado, milhares de inocentes foram apanhadas nesta situação. Os LulzSec divulgaram os dados de cartões de crédito, e-mails e passwords, provocando prejuízo na vida das pessoas. Este tipo de ataques sem regras tem consequências reais graves, razão pela qual não consigo apoiar totalmente esta ideologia.

A fama, a vaidade e o poder subiram-lhes rapidamente à cabeça. Afinal de conta, não é todos os dias que se tem os olhos do mundo concentrados em cada passo que damos, para além do medo incutido nos cibernautas. Este excesso de confiança foi, na minha opinião, a morte do artista. Deixaram pegadas por todo o lado e não acredito que consigam sair incólumes depois de tudo o que fizeram.

As acções dos LulzSec ficarão marcadas na história da internet. Espero que toda a situação não tenha sido em vão e que haja uma mudança de hábitos radical. A cultura da segurança deveria ser a primeira prioridade de qualquer entidade com presença na web. Cada vez mais piratas navegam nestes mares: quem não se proteger, mais cedo ou mais tarde acaba saqueado.

LulzBoat

read more

Primeiras impressões sobre o Mac OS X Lion

OS X LionOntem saiu a versão 10.7 do OS X. Juntamente com cerca de 1 milhão de pessoas, perdi o amor a cerca de 24€ na App Store. Ao fim de dois dias já tenho alguma noção do que gosto e do que não gosto nada. Não é que a minha opinião (ou qualquer outra) tenha alguma influência: a Apple é famosa por seguir o seu caminho, com o sem o consentimento dos seus utilizadores. No final, a maioria de nós será mais um carneirinho às ordens do Deus Jobs, e os defeitos (antigos ou recentemente introduzidos) do OS X serão esquecidos ou aceites. Sad, but true.

Sobre o processo de instalação, só tenho a dizer bem. O download demorou um pouco, mas é normal visto que são quase 4GB. O processo de instalação é seamless e dura cerca de meia hora. Até aqui, tudo perfeito. Quando finalmente entramos no sistema operativo, é apresentada uma caixa para testarmos o scroll. Fui apanhado de surpresa ao verificar que o inverteram verticalmente! Esta alteração vai de encontro com a estratégia da Apple de tentar aproximar o OS X com o iOS, visto que nos dispositivos tactéis como o iPad e o iPhone o scroll é feito ao “empurrar” o conteúdo. A habituação tem sido relativamente fácil, devido (penso eu) à utilização regular do meu iPad.

Após o ambiente de trabalho carregar, uma das primeiras coisas que saltou à vista foi que os Spaces tinham desaparecido. Para além disso, o Exposé foi substituído pelo Mission Control e foi introduzido o Launchpad para gerir as aplicações instaladas. Vamos por partes:

Mission Control: eu era bastante Exposé-dependente. Usava e abusava desta feature para trocar entre várias janelas, que era acessível através de um swipe para baixo. Agora podemos aceder ao Mission Control com swipe para cima. Não percebo bem porque é que inverteram a direcção. Para além disto, já não é possível afastar as janelas, mostrando o ambiente de trabalho, com um swipe para cima (3 dedos), que também era extremamente útil. Agora temos que fazer um pouco de malabarismo com um gesto rebuscado: uma espécie de pinch para fora com o polegar e 3 dedos. 80% das vezes activo o Mission Control em vez de conseguir afastar as janelas, talvez devido ao pequeno touchpad do meu Air. Useless!

Spaces: demorei um pouco a descobrir como se adicionavam novos Spaces. É necessário ir ao Mission Control e  arrastar uma janela em direcção ao canto superior esquerdo. Se antes podiamos ter Spaces verticais e horizontais, agora só é possível serem horizontais. O Dashboard de widgets vem por default como um Space, mas removi-o imediatamente. Por default também vem a opção de reordenar os spaces de acordo com os que são mais usados. Também removi isto porque prefiro saber exactamente em que space é que está determinada aplicação. Apesar do novo sistema não me parecer tão flexível, penso que me vou adaptar bem.

Launchpad: Quase nem vale a pena falar disto. Para quem usa o Quicksilver ou o Alfred (ou outro launcher qualquer) esta feature é inútil. No entanto não é possível ignorá-la totalmente: ao instalar uma aplicação, o Launchpad abre para mostrar o progresso, quer queiramos quer não. Uma minor annoyance.

Outra coisa que reparei é que as aplicações que tenho abertas não estão a ficar nos spaces onde as deixo. Gosto de ter um space para o Mail.app e Twitter, outro para o browser, outro para o Photoshop e ainda outro para o Coda/TextWrangler. Por vezes ao clicar numa dessas aplicações, em vez de ir para o space correspondente, a aplicação abre no space actual e tenho que a arrastar para o sítio certo. Não sei se é por o Lion fechar aplicações que não estão a ser usadas, mas torna-se chato.

As alterações cosméticas são súbteis mas agradáveis. Deixámos de ter barras de scroll explícitas e é necessário fazer scroll para que apareçam. Algumas aplicações que usava deixaram de funcionar: o cliente de VPN da Cisco crasha com estilo e o TotalFinder recusa-se a iniciar. Ainda não tive oportunidade de experimentar bem algumas funcionalidades como o AirDrop, Resume, Auto Save e Versions, mas já ouvi dizer que funcionam bem.

Uma coisa que me irrita profundamente foi terem arruinado a aplicação DigitalColor Meter. Antes era possível ver o código RGB em hex, bem como copiá-lo. Agora nem uma coisa, nem outra. Esta aplicação era excelente para webdesign, porque podíamos rapidamente pegar no valor de uma cor para aplicar no CSS ou mesmo no Photoshop. Gostaria de saber quem foi o [escolher um daqui] que olhou para a aplicação e pensou “Hmm… Isto é bastante útil. Vamos tirar features, só para os lixar”, principalmente quando o OS X é utilizado en masse por designers.

Esta foi a primeira migração de versão pela qual passei no OS X. Não sei se as outras foram assim tão leves, mas não se compara à alteração de um Windows XP para um Windows Vista, por exemplo. É mais parecido com a passagem do Windows Vista para o Windows 7, na medida em que não há assim tanta diferença. É óbvio o esforço que a Apple está a fazer para tentar fundir o iOS com o OS X. Não sei se esse caminho é o mais correcto, mas safaram-se (bastante) bem com as escolhas que fizeram ao longo dos últimos anos, pelo que irei dar-lhes o benefício da dúvida. É esperar para ver.

read more

Mann–Whitney U com a ferramenta de estatísticas R

Por vezes é necessário comparar 2 data sets independentes para saber qual é o maior. Um algoritmo muito utilizado para isto é o Mann–Whitney U (também conhecido por Mann–Whitney-Wilcoxon). Neste post deixo um script que utiliza 2 ficheiros, cada um com um data set, e que os compara utilizando este algoritmo. Para isto é necessário recorrer a um script que é executado com o R.

Primeiro, um sample de um dos ficheiros de input:

1
4
6
4
2
4

O script está preparado para receber um valor por cada linha e deverão haver 2 destes ficheiros. Depois basta criar o ficheiro wilcox.r que recebe 2 argumentos e os compara utilizando o Mann-Whitney U:

a = commandArgs(trailingOnly=TRUE)[1]
b = commandArgs(trailingOnly=TRUE)[2]
a = read.table(a)
b = read.table(b)
wilcox = wilcox.test(a[,1],b[,1],alternative=”greater”,paired=TRUE,conf.level=0.95)
cat(wilcox[3][[1]])

O script deverá ser executado com o seguinte comando, no terminal:

R –vanilla –slave –args “file1.txt” “file2.txt” < “wilcox.r”

O resultado, caso seja inferior a 0.05, indica que os valores do primeiro ficheiro são maiores que os do segundo ficheiro. Quanto mais perto de 1, menor os valores do primeiro ficheiro são. Quanto mais perto de 0.5, mais os valores são equivalentes.

read more

Como usar o gnuplot num Mac

Há pouco tempo necessitei de utilizar a excelente ferramenta gnuplot no meu Mac. Aqui deixo um guia de como instalar e utilizar alguns comandos. Primeiro, instalem o MacPorts. Depois, basta abrirem o terminal e correrem o seguinte comando:

sudo port install gnuplot

É normal que demore bastante tempo a instalar, pois são necessárias muitas dependências. No final do processo de instalação, deverão poder escrever gnuplot no terminal e entram na aplicação.

A maneira mais fácil de utilizar o gnuplot é ter um ficheiro com os valores separados por espaços e por linhas. Em baixo está um exemplo de um ficheiro com 2 data sets numerados:

1 2 5
2 3 5
3 7 6
4 6 6
5 9 7

Neste caso, a primeira coluna irá ser utilizada para o eixo do x e as outras colunas pertecem a data sets individuais, que serão mapeados no eixo do y. Admitindo que estes valores estão guardados no ficheiro test.txt no working directory actual, poderemos mapeá-los desta maneira:

plot “test.txt” using 1:2, “test.txt” using 1:3

Aqui dizemos para mapear o data set 2  e o 3 usando o data set 1 como eixo do x. No entanto, tal como podemos ver em baixo, o resultado não é muito impressionante.

gnuplot  - exemplo 1

Existem alguns problemas com o resultado: os títulos dos data sets não estão correctamente configurados, não se percebem bem os dados por causa dos pontos, e o eixo do y poderia começar a partir do 0, e não do 2. Começando a passar os pontos para linhas, com o parametro with lines:

plot “test.txt” using 1:2 with lines, “test.txt” using 1:3 with lines

gnuplot - exemplo 2

Em alternativas ao with lines temos o smooth bezier e smooth csplines, que fazem aproximações de maneira a criar uma linha mais fluída:

plot “test.txt” using 1:2 smooth bezier, “test.txt” using 1:3 smooth csplines

gnuplot - exemplo 3

De maneira a corrigir a escala e os títulos, corremos os seguintes comandos:

set yrange[0:10]
plot “test.txt” using 1:2 smooth bezier title “primeiro”, “test.txt” using 1:3 smooth csplines title “segundo”

gnuplot - exemplo 4

E pronto, o básico do gnuplot encontra-se explicado. Esta ferramenta é bastante complexa e poderosa, mas estes comandos devem chegar para análises rápidas e simples.

read more

Desmistificando o mundo do LaTeX

O LaTeX (pronunciado “latek”) é um sistema de preparação de documentos bastante utilizado para artigos científicos e matemáticos. Apesar de poder ser um pouco intimidante ao início, é muito melhor que o Word na maioria das situações. Não só é mais fácil de usar e formatar os documentos sem subjectividade, como ficamos com uma apresentação muito mais profissional.

Neste post pretendo introduzir alguns dos comandos básicos que podemos utilizar para formatar um documento, começando por um pequeno hello_world.tex:

\documentclass{article}
\title{Hello LaTeX}
\author{Miguel Duarte}
\date{Junho 2011}
\begin{document}
\maketitle
\begin{abstract}
Aqui podem, opcionalmente, escrever um abstract.
\end{abstract}
Olá mundo!
\section{Secção}
\subsection{Subsecção}
Conteúdo
\end{document}

Para produzir um documento é necessário ter o LaTeX instalado no vosso sistema. Gerar um documento PDF é tão simples como correr o seguinte comando no terminal:

pdflatex hello_world

Para criar secções, basta utilizar o comando \section{Nome da Secção} e \subsection{Nome da Subsecção}. Isto torna a nossa vida muito mais fácil do que andar a brincar com os headers do Microsoft Word.

Se o documento for muito grande ou se utilizarem um sistema de versões para histórico ou colaboração, torna-se uma boa prática separar cada capítulo/secção em ficheiros separados. O ficheiro capitulo_um.tex pode ser referenciado no ficheiro principal colocando \input{capitulo_um} na zona correspondente.

Se quisermos referenciar uma imagem, podemos fazê-lo com o comando figure:

\begin{figure} \begin{center} \includegraphics{figures/imagem_um.png} \caption{Caption da imagem um.} \label{fig:imagem_um} \end{center} \end{figure}

Existem bastantes alterações que podemos aplicar à imagem. Visto que as imagens são flutuantes no LaTeX, não podemos garantir que ficará no sítio exacto onde a colocamos. Para tentar força-la a ficar num determinado local, podemos usar \begin{figure}[h!]. Se quisermos alterar o tamanho ou ângulo da imagem, podemos indicá-los com:

\includegraphics[width=45mm,angle=-90]{figures/imagem_um.png}

Também pode ser necessário colocar várias imagens no mesmo local. Isto pode ser feito com uma ou mais scaleboxes. Ao usar o \setlength estamos a colocar uma border:

\begin{figure} \begin{center} \scalebox{1}{ \setlength\fboxsep{0pt} \setlength\fboxrule{0.5pt} \fbox{% \includegraphics{figures/imagem_dois_1.png} } \fbox{% \includegraphics{figures/imagem_dois_2.png} } } \caption{Caption imagem dois.} \label{fig:imagem_dois} \end{center} \end{figure}

Podemos referenciar estas imagens facilmente no texto, sem ter que colocar o número hardcoded, o que nos poderia trazer problemas ao inserir/remover imagens. O comando \ref{fig:imagem_dois} irá ser substituído pelo número da imagem na altura da compilação do documento, facilitando o referenciamento.

Neste sistema, existem vários caracteres especiais que podem ser acedidos através do backslash (\). O símbolo utilizado para comentários é o de percentagem (%), pelo que se quisermos utilizá-lo normalmente no texto temos que fazer o escape com o backslash(\%). Existe também um poderosíssimo sistema de fórmulas. Aqui fica um exemplo:

\begin{equation*}
b_{i,s} = \frac{N_{i,s}}{T_{i,s}} \cdot 10^{-1} +
\sum_{j=1}^{\mbox{n$^\circ$ P}}\frac{\Delta_{\phi} – dist(p_j,\mbox{$\theta$})}{L}
\end{equation*}

Fórmula em LaTeX

Estas são as funcionalidades básicas. Existem muitas mais opções que podem ser pesquisadas à medida que vão sendo necessárias. Caso seja necessário de uma secção de referências no documento, o mais indicado é o BibTeX. Aviso também que fazer tabelas pode ser doloroso! Dois recursos bastante bons são o StackExchange para TeX (o TeX é um subset do LaTeX) e um livro em formato wiki, totalmente gratuito.

read more