Thread dumps e stack traces

Ian Daniel, engenheiro de suporte da Atlassian recomendou através do blog da empresa dirigido a desenvolvedores o seguinte artigo - 0xCAFEFEED: Of Thread dumps and stack traces … .

O artigo é bastante interessante, e começa com uma introdução básica sobre exceções em Java que todo mundo que começa a programar nessa linguagem deveria ler - isso evitaria cerca de 50% dos posts em fóruns de usuários de diversas aplicações. Depois da introdução, ele começa a discutir sobre formas inovadoras de uso de stack traces que as exceções provêem: por exemplo, o uso do método printStackTrace() da classe Exception para descobrir como se chegou à execução de um determinado trecho de código. Por fim, o autor do artigo fala sobre thread dumps - como obtê-lo, explica as informações que são visualizadas, e como utilizá-las para debugar uma aplicação.

Um artigo bastante simples, mas muito informativo, e com conhecimentos que são úteis para a maioria dos programadores Java. Recomendo.

Powered by ScribeFire.

É real…

Pequeno comentário: alguns podem achar que a juice lib, devido ao fato de ter sido colocada no ar no dia 1 de abril, é uma brincadeira. Mas eu confirmo: É REAL !!!

Inclusive, acabei de colocar a versão 0.1.1, corrigindo pequenos bugs do IE.

Comentários, críticas e sugestões continuam sendo bem vindas.

Quebra-cabeça em C

Segue uma lista de perguntas-pegadinhas sobre C.

http://www.gowrikumar.com/c/index.html

Útil para amantes de problemas de computação e programação em geral, e essencial para candidatos a grandes empresas de software multinacionais que prezam a qualidade de seus programadores.

Dez dicas sobre Python para programadores Java

1. Python não suporta a instrução switch. A solução mais trivial para obter o mesmo comportamento seria usar if else encadeado. Mas a solução mais pythonica (se é que o termo existe) é usar dicionários para isso, aproveitando o fato que a implementação desta estrutura de dados é extremamente eficiente e que funções são first-class objects.

Exemplo:


def funcA()
def funcB():
switch = {1: funcA, 2:funcB}
switch[valor]()

2. Em Python, tudo é objeto, desde os tipos primitivos int, boolean até o arquivo onde o código é gravado (chamado de módulo), passando por funções.

3. A cultura Java diz que o acesso a atributos de um objeto deve ser feito por meio de métodos getters e setters. Portanto, quando um programador Java escreve em Python, a tendência é criar estes métodos. A cultura Python define que o acesso aos atributos se faz através da chamada direta ao atributo. Por exemplo, se tenho o objeto meuObjeto, que possui o atributo meuAtributo, então o acesso se faz via meuObjeto.meuAtributo. Este padrão pode parecer estranho à primeira vista, pois estaria quebrando alguns paradigmas de programação orientada a objeto permitindo acesso direto à variável. E se eu quiser fazer validações antes de definir o valor do atributo? Está tudo previsto! Python por trás dos panos chama os métodos _get_<atributo> e _set_<atributo>. O comportamento padrão é simplesmente obter ou gravar o valor do atributo. Mas caso o desenvolvedor deseje determinar um comportamento específico, basta sobreescrever o método.

4. Variáveis e métodos privados em Python são definidos com dois _ antes do nome. Porém, eles não estarão completamente inacessíveis de fora. Simplesmente, o nome dele será concatenado com o nome da classe (name mangling) para dificultar o acesso. A idéia geral por trás disso é que ao definir um método ou atributo como privado, o desenvolvedor sinaliza que o uso da variável diretamente pode causar efeitos indesejáveis. Aquele que o fizer estará fazendo por sua conta e risco!

5. Métodos estáticos em Java são no fundo uma forma de contornar o fato que a linguagem exige que todos os métodos tem que estar em uma classe. É um recurso muito utilizado para se criar coleções de funções utilitárias genéricas (como a classe Collections). Em Python, o equivalente pode ser feito por meio de funções definidas no módulo, fora de um objeto.

6. Python suporta programação orientada a objetos, procedimental e funcional! Use e abuse desta liberdade.

7. Dicionários são extremamente eficientes e muito simples se operar em Python. Se estiver pensando em criar uma classe apenas para transportar dados, pense duas vezes se usar um dicionário não é a melhor solução.

8. Existem duas formas de se criar atributos de uma instância de um objeto em Python: ou dentro do método _init_, utilizando self.minhavariável, ou em qualquer ponto do código após a criação. Em Python, os atributos e variáveis são criados no momento do primeiro uso. Por exemplo:

class MinhaClass:
pass

instancia = MinhaClass()
instancia.variavel=1

O código acima cria uma classe MinhaClasse, uma instância desta classe e adiciona um atributo variável. Atributos criados dentro do código da classe e fora do método _init_ são equivalentes a variáveis estáticas em Java.

9. Variáveis e atributos tem escopo de módulo, classe, método ou função, mas não tem escopo de bloco. Isso significa que uma variável criada dentro de um if continuará viva fora dele. Cuidado!

10. A questão de uso de indentação para delimitação de blocos pode parecer estranho à primeira vista. Mas não é. Basta usar um editor decente, como PyDev para Eclipse ou python-mode para Emacs. O efeito colateral é que o código fica naturalmente organizado e fácil de ler.

Burlando o castigo…

..ou “Diferentes formas de se simplificar a tarefa de escrever 500 vezes na lousa ‘Nunca mais irei jogar aviões de papel nos meus colegas’ quando se é um geek”.

http://www.jeffpalm.com/fox/index.html

ECMAScript

A ECMA International é uma associação de industrias fundada em 1961 cujo propósito principal é criar padrões de tecnologia de informação e comunicação e de eletrônicos para consumidores.É esta associação que mantém a linguagem ECMAScript, conhecida também como Javascript.

A linguagem Javascript foi desenvolvida pela Netscape e pela Sun Microsystems em 1995, e incorporada ao Netscape Navigator em 1996. Neste mesmo ano, a Netscape submeteu a linguagem de script para a ECMA. Em 1996, começaram os trabalhos para padronização da linguagem ECMA-262, cuja primeira versão foi oficialmente aceita em 1997.

A versão atual é a 3.0, lançada em 1999. Uma versão 4.0 está em andamento.

A especificação completa da versão 3.0 pode ser encontrada aqui, em formato PDF. Eu diria que este documento é uma fonte essencial para aspirantes a Jedi Hackers Masters em Javascript.

Exemplos

Uma das melhores formas de se aprender a programar é lendo códigos alheios. Quanto melhor o código, maior o aprendizado. Mas nem sempre se procura por códigos de qualidade…as vezes apenas precisamos de um caminho das pedras. E o site http://www.java2s.com/ é uma ótima fonte para isso: tem exemplo de vários tipos de códigos. A lista é bem grande. E apesar de aparentemente o site inicialmente ter sido concebido pra java (notem a URL), existem links com exemplo para várias linguagens.

Probleminhas em LISP

Hoje, um dos links no meu leitor de RSS retirado da lista de populars do del.icio.us apontava para uma página com pequenos probleminhas a serem resolvidos em LISP, com código fonte.  Os problemas eram muito parecidos com alguns que eu tive que resolver quando aprendi LISP na universidade, e não por acaso: a página em questão era do meu ex-professor do curso João Meidanis. Coincidências a parte, a página é uma otima fonte para quem quer aprender ou relembrar esta linguagem.

Frase do dia

There are just two kinds of languages: the ones everybody complains about and the ones nobody uses.”

Por Bjarne Stroustrup, criador da linguagem C++, em entrevista à revista online TechReview do MIT.

Gosto bastante também da seguinte crítica ao processo de desenvolvimento de softwares hoje em dia:

“I think the real problem is that ‘we’ (that is, we software developers) are in a permanent state of emergency, grasping at straws to get our work done. We perform many minor miracles through trial and error, excessive use of brute force, and lots and lots of testing, but–so often–it’s not enough.

Software developers have become adept at the difficult art of building reasonably reliable systems out of unreliable parts. The snag is that often we do not know exactly how we did it: a system just ’sort of evolved’ into something minimally acceptable…”

Otimização de código javascript

O artigo Efficient Javascript apresenta várias dicas para otimizar códigos em javascript. Importantíssimo para quem desenvolve aplicações web que usam a scripts de forma intensiva.

Funções inline 2

O meu último artigo com o título de “Funções inline” acabou gerando uma contestação interessante, dizendo que o artigo ao qual eu me referenciava não se tratava de funções inline mas, sim, de conceitos relativos a uso de funções em linguagens que suportam programação funcional.

Bom, como não sou dono da verdade, fui atrás de uma definição formal de funções inline e eu estava errado. Certamente um melhor título para o artigo seria “Funções e programação funcional” ou alguma coisa do tipo.

Para deixar os conceitos mais claros, segue uma boa definição de funções inline. Segundo a definição formal, funções inline são parecidas com o conceito de macros que aparece em muitas linguagens de programação. Eu acabei usando o termo funções inline de forma indiscriminada no meu artigo para referenciar a capacidade de se declarar funções anonimamente na mesma linha em que se está chamando uma outra função (isto, em inglês, acaba sendo chamado como “inline” também, mas significa outra coisa).

Enfim, espero que esteja esclarecido este ponto. Sempre é bom ouvir outros pontos de vista e esclarecer nomenclaturas! :)

Funções inline

Seguindo a onda do Miguel, segue mais um artigo muito interessante do Joel sobre funções inline e sua grande aplicabilidade.

É interessante como são poucas as lingugens ditas comercias e amplamente difundidas que possuem está funcionalidade. Tudo bem que está não é uma funcionalidade extremamente essencial nem sempre útil, mas pode facilitar muito a vida em determinadas situações.

É impressionante também como o Joel escreve bem. :)
Ah, e não sei se vocês perceberam, mas agora sou um colaborador oficial deste blog! :) Obrigado Miguel!

Java X Ruby

Eu nunca programei em Ruby. Mas tenho ouvido falar muito, muito bem, desta linguagem. E sobretudo tenho ouvido falar muito bem do Ruby On Rails. Mas como não se pode fazer tudo ao mesmo tempo, acabei optando por inicialmente aprender Python. Anyway, é sempre bom estar acompanhando o que se passa no mundo das outras linguagens.

O artigo “Ruby for the Java world” é um artigo bem interessante que faz uma comparação entre Ruby e Java (e interessante para programadores java como eu) e apresenta a ferramenta JRuby que permite que uma use recursos da outra e vice-versa.

[Python] Primeiras impressões

Bom, lendo meus últimos artigos, dá pra perceber que ultimamente andei brincando com Python. Fazia algum tempo que queria aprender esta linguagem, mas sempre rolava aquela preguiça básica. Há 3 semanas atrás tomei coragem, e comecei a programar.

Os motivos que me fizeram ficar interessado foram vários. Ouvi pela primeira vez falar de Python quando trabalhava no projeto AURORA, no CenPRA. Na época, a definição que me deram era que Python era uma ótima linguagem para integração de sistemas: uma espécie de cola. Depois li vários artigos que elogiavam a linguagem pela limpeza sintática e pela facilidade e velocidade de desenvolvimento de código. Além do mais, eu frequentemente preciso escrever alguns scripts para execução de tarefas cotidianas: a solução adotadas por outros desenvolvedores que trabalham comigo é Perl, que apesar de ser altamente poderosa, eu tenho sérios bloqueios com a sintaxe. No final, acabava optando por Java que pra pequenas tarefas cotidianas não é a mais adequada em geral, apesar de ser minha linguagem preferida e na qual tenho maior fluência. O argumento derradeiro foi saber que o Google utiliza muito Python

O fato é que acabei começando a aprender, e devo dizer que gostei. A estratégia de aprendizagem foi simples: comecei programando algoritmos básicos de computação (merge sort, quicksort, selection sort, heap sort, lista ligada, fibonacci, fatorial), para exercitar comandos básicos da linguagem como recursão, chamada de funções, if-then-else, loops, declaracão de variáveis, manipulação de listas, dicionário, tuplas e outras estruturas de dados. Depois, comecei a usar Python para escrever scripts “real life”, ou seja, scripts que tinham alguma funcionalidade no meu dia a dia. Veio a calhar pois atualmente estou processando algumas dezenas de milhares de arquivos contendo dados genéticos, e preciso executar operações como leitura e escrita de arquivos, análise de textos utilizando expressões regulares e geração de relatórios simples.

Não sou expert na linguagem ainda. Longe disso. Apenas escrevi algumas centenas de linhas de código, e não utilizei todos os recursos disponíveis (como orientação a objeto), portanto as impressões que colocarei aqui são apenas preliminares…

De fato a linguagem é bem limpa sintaticamente, e bem fácil de escrever. A questão do uso de indentação para separação dos blocos, que é o motivo principal de reclamação das pessoas que não gostam de Python, não chega a ser um problema quando se tem um editor apropriado (no meu caso estou usando Emacs com Python Mode): o efeito colateral é que o código é naturalmente organizado e fácil de ler. A documentação, centralizada no site www.python.org, é bem feita, com tutoriais para vários níveis, referencias, livros e mini how-tos, além de listas de discussões bem ativas.

As listas, tuplas e dicionários (também conhecidos como hashes) são o grande forte da linguagem, que possui funções e recursos sintáticos muito poderosos para manipulação destas. Segundo artigos que li, a implementação de hash de Python é uma das mais eficientes que existe. As variáveis em Python são dinamicamente tipadas: não se declara tipo de uma variável, mas uma vez que se atribui um tipo de variável, não se pode atribuir outro tipo de objeto.

O processo de IO (leitura e escrita básica de dados em arquivo) é muito simples e eficiente, assim como a implementaçnao de regexp. O modo de uso deste último não é tão direto quanto Perl, e se assemelha muito ao modelo implementado por Java, com patterns e matchers. Não consegui encontrar nenhum artigo comparando a performance das duas linguagens nesse quesito, mas minha experiência atual mostra que não existe uma grande diferença de velocidade…algum dia verifico isso.

Um ponto que eu não gostei muito: o fato de que Python, ao contrário de Perl, Java, C, C++ e outras linguagens, não possui escopo de bloco para variáveis. Ou seja: variáveis declaradas dentro de um bloco for, if ou while são válidas e visíveis fora dele. O escopo de variáveis é função, módulo, objeto ou método. Também não gosto muito do fato de bastar atribuir um valor a uma variável que ela passa a existir: um modo strict semelhante ao Perl seria bem vindo.

Alguns pontos importantes restam a ser analisados e aprendidos, como orientação a objeto, reflection, organização de pacotes e uso de bibliotecas como processamento de XML, sockets, HTTP e acesso à base de dados. Isso fica para um próximo artigo.

[Linux Shell] Mão na roda

Nos últimos meses eu andei processando e extraindo dados de algumas centenas de milhares de arquivos de genética. Na maioria dos casos eu uso Perl ou Python para fazer o processamento mais pesado e gerar arquivos de resumo…relatórios simplificados: em geral, um conjunto de colunas. Eu costumava fazer o processamento final desses relatórios em programas de planilha como Excel ou OpenOffice. Mas graças a alguns hackers jedi que trabalham comigo eu aprendi alguns truques velhos conhecidos dos usuários antigos de linux, e antes de abrir esses programas, eu vejo se eu consigo extrair as informações necessárias usando os programinhas utilitários do Shell do Linux. É incrível a quantidade de pequenos utilitários de linha de comando que executam tarefas muito simples e que podem ser uma mão na roda (isso sem mencionar awk e sed..mas aí já complica). Como eu sou um mero iniciante na arte de processamento simples de texto em shell, conheço apenas alguns que vou citar aqui. Se conhecer outros, let me know :-)

  • cut : pega um arquivo contendo colunas separadas por algum delimitador (tipo csv) e extrai uma ou mais colunas.
    Por exemplo cut -f1,2 -d” ” meuarquivo extrai as colunas 1 e 2 do arquivo meuarquivo cujas colunas estão delimitadas por espaços.
  • sort: Lê linhas de um arquivo e imprime a versão ordenada crescentemente. A opção -n indica que as linhas representam números, a opção -r ordena decrescentemente o arquivo e -u elimina elementos duplicados.
  • uniq: Lê um arquivo e descarta linhas idênticas sucessivas, imprimindo o resultado. Caso o arquivo esteja ordenado, elimina linhas duplicadas. A opção -c imprime o número de vezes sucessivas que uma linha apareceu no arquivo.
  • grep: Esse é um clássico. Recupera linhas que contenham uma palavra ou expressão regular: muito útil para filtros. A opção -v faz com que o comando imprima as linhas que não contenham a palavra passada como filtro (inverte o processamento).
  • wc: analisa um arquivo e conta quantas linhas, palavras, caracteres o arquivo possui. A opção -l imprime apenas o número de linhas de um arquivo.

Encadeando esses comandos de forma apropriada, é possível se obter informações bem interessantes de forma muito rápida. Por exemplo, se considerarmos o seguinte arquivo:

SCEP 2 PERFECT SCBF 2 P ERFECT SCCC 1 MISC
SCCC 3 P
ERFECT SCSG 2 MISC SCCC 3 MISC SCSG 1 MISC
SCSB 1 P ERFECT SCRF 1 PERFECT SCAC 1 PERFECT

Digamos que eu queira saber quantas vezes cada número aparece na segunda coluna, apenas nas linhas contendo a flag PERFECT. O comando em shell seria o seguinte:

grep PERFECT file | cut -f2 -d” ” | sort -n | uniq -c

C.Q.D. Have fun !

« Previous PageNext Page »