Python for Unix and Linux System Administration

Estou lendo o livro Python for Unix and Linux System Administration e estou gostando muito, por isso estou aqui escrevendo sobre ele.

Este livro da editora O’Reilly, escrito por Noah Gift e Jeremy M. Jones é uma coleção de problemas-solução em Python. Nele você encontra de quase tudo. Seu lançamento recente (Agosto de 2008) contempla as novidades do Python 2.5, apesar de já estamos com Python 2.6 pronto para instalarmos em nossas máquinas.

Ele está voltado para administradores de sistemas que precisam resolver problemas recorrentes e repetitivos e necessitam de uma ferramente ágil e completa. Python pareceu ser a escolha adequada, apesar dos autores confessarem que a escolha ter sido bem subjetiva.

Ao ler suas páginas fica claro que  o material contido nele serve para todos os programadores. É uma forma maravilhosa de conhecer bibliotecas e funções nunca antes utilizadas por nós, ou descobrirmos novas formas de fazer as coisas com as que já conhecíamos (eu descobri).

Logicamente, tem coisas que são quase exclusivamente para administradores de redes e nos deleitamos como tarefas complexas podem ser resolvidas em poucas linhas de código. Sinaliza também o fato de que a vida de um administrador de redes já é dura e não precisa ficar pior. Desenvolver suas próprias ferramentas em Python é algo prazeroso.

Há um maravilhoso capítulo chamado Package Management explanando coisas como Setuptools e os Python Eggs, os ovos de cobra, os conhecidos arquivos de distribuição. Só por este capítulo eu compraria o livro.

E tem mais. Sobre persistência de dados, temos o simples shelve, o ZODB, SQLite, Storm ORM e SQLAlchemy. É uma aula de atualidades do mundo Python.

Há coisas que já li a respeito mas não me aprofundei, como, por exemplo, Buildout, Twisted, Scapy, entre outros.

Vou continuar lendo. Leitura recomendada.

2007 foi o Ano do Python

A minha linguagem de programação favorita foi a que mais cresceu em 2007, tornando-a segundo o TIOBE e seus fãs a Linguagem do Ano em 2007.

Leio essa notícia em vários blogs atualmente. Para saber mais sobre isso, assine o feed do Planeta PythonBrasil. Um boa leitura!

Powered by ScribeFire.

O tempo e outras coisas

Ultimamente voltei a ficar ocupado mais que o normal. Envolvido num projeto à tarde, não posso usar um tempo maior para meus projetos em Python e Rails, o que pode me levar a escrever menos aqui. Possivelmente com menos qualidade.

Não sei se cheguei a comentar em algum post, mas há algum tempo estou desenvolvendo novamente em Java. Estamos usando Struts 2, Spring e a boa IDE Eclipse. Tá bacana, mas sinceramente, quando você conhece outras coisas, tais como um framework TurboGears ou Rails, sente a diferença de produtividade. É chato envolver-se em projetos onde a produtividade é baixa.

O framework Struts 2 é notadamente mais produtivo que o seu antecessor. Usa a filosofia “Convenção sobre Configuração”, amplamente conhecida na comunidade Ruby, agora espalhando-se por outros “mundos”. Entretanto, sua documentação ainda é pobre, algumas coisas não funcionam como o esperado. Não seria necessário descrever um problema que estou tendo aqui, mas como estou preso nele, não há jeito. No Struts 2, para validar campos de formulários, basta que criemos um arquivo com o nome convencionado NomeAction-validation.xml. Isso é bacana quando há somente uma ação a ser executada por Action. Não é o meu caso. Meus actions possuem vários métodos. Nem todos os métodos são posteriores ao envio de campos de formulário, além de métodos que recebem formulários diferentes.

Segundo a documentação, você pode usar o padrão NomeAction-alias-validation.xml para mapear o arquivo de validação a um “action name”, digamos UsuarioAction-salvar-validation.xml. Porém, isso não está funcionando. O que me faz perder tempo, ou seguir adiante até que encontremos como fazer isso prestar.

As reclamações sobre Java são muitas. É bastante difícil defender essa linguagem. Como argumentar com um desenvolvedor Delphi que eu não consigo implementar rapidamente um funcionalidade que ele é capaz de concluir em poucas horas? É mais fácil esconder isso num ambiente onde só exista Java. Não é o meu caso. Convivemos com aplicações em PHP, Delphi, VB, ASP, etc. Entre fazer algo urgente em Java ou Delphi, estão escolhendo o último. Porém, há mais programadores livres em Java. Os outros estão envolvidos com o legado.

Depois de alguns anos desenvolvendo profissionalmente em Java, aprendi que para ser mais produtivo, devemos procurar sempre o melhor modelo arquitetural, depois manter-se nele. No começo, nosso modelo é sempre desorganizado e improdutivo. Mesmo que usemos padrões de projeto e de arquitetura reconhecidíssimos, trabalhamos ele incorretamente. Muitas vezes usamos padrões desnecessariamente.

Antigamente, ao implementar o modelo de camadas em Struts, como Action -> BO -> DAO, a camada de regra de negócio (BO) e os DAOS possuiam interfaces. Mesmo sabendo que isso não seria preciso, colocávamos porque fazia parte do jeito do javista programar. Aumentávamos gratuitamente o número de coisas a fazer. Hoje, quando sabemos que não vamos largar uma tecnologia, ignoramo o uso de interfaces. Se algum dia (improvável) precisar delas, eu refatoro. O Eclipse esta aí para isso.

Estou aprendendo a trabalhar simples, como os antigos programadores faziam e uma nova safra de programadores estão fazendo. Estou saindo da educação javista. Aprendo muito com outras comunidades: desenvolvedores do mundo Linux, Ruby e Python me ajudaram a ser um programador um pouco melhor. Claro que Java trouxe para mim vários ensinamentos utéis que vou levar comigo.

Espero que os defensores ferrenhos de uma linguagem, qualquer que seja, não fiquem restritos somente a uma linguagem. Uma linguagem não serve perfeitamente para tudo. Ñão perca tempo em teimosia. Podemos usar várias linguagens dentro de nossas empresas e órgãos.

Carpem Diem!

Conhecendo uma nova linguagem

Quem acompanha este blog sabe que estou escrevendo pequenos artigos sobre a linguagem funcional Haskell. A novidade para todos é que eu desejo além de percorrer a linguagem também estou interessado em ver como andam as tecnologias e ferramentas implementadas em Haskell.

De antemão, posso dizer que vamos brincar de acessar bancos de dados, usar um gerenciador de pacotes chamado Cabal e outras coisas que forem me atraindo.

Acompanhem-me nessa viagem pelo mundo Haskell, pois estamos começando agora. Acredito que será muito divertido, porém advirto: abram a mente, sequem o copo, mudem de canal, etc. pois veremos muitas coisas diferentes, a começar pelo sistema de tipos da linguagem.

Bom final de semana a todos. A propósito, vocês irão assistir 300?

A Linguagem Haskell: Listas – Parte 2

HaskellListas

As listas são parecidas com as tuplas mas diferente destas você pode ter quantidades variadas de elementos, em contra-partida homogêneos (de mesmo tipo). Uma lista é representada por elementos separados por vírgulas todos eles cercados por colchetes.


Prelude> [5,2]
[5,2]
Prelude> [1,2,3]
[1,2,3]
Prelude> [] -- uma lista vazia
[]

Como as listas são mutáveis, podemos com facilidade acrescentar elementos a elas. O operador para fazer isso chama-se cons, representado por dois pontos. A sintaxe para isso é mostrada nos exemplos abaixo:


Prelude> 3 : [2,2]
[3,2,2]
Prelude> 3 : []
[3]
Prelude> 1 : 6 : [7, 5]
[1,6,7,5]
Prelude> 3: [] == [3]
True
Prelude> 'c' : 'a' : 's' : 'a' : []
“casa”
Prelude> “casa” == 'c' : 'a' : 's' : 'a' : []
True

A sintaxe de [5,2] é um açucar sintático de 5 : 2 : []. Relembrando que as listas somente aceitam elementos homogêneos. Para não esquecermos, vejamos mais exemplos:


Prelude> ['c','a','s','a']
“casa”
Prelude> [ (1,1), (1,2), (1,3)]
[ (1,1), (1,2), (1,3)]
Prelude> [ [2], [7], [-1] ]
[ [2], [7], [-1] ]

Podemos concatenar listas com o operador ‘++’.


Prelude> [1] ++ [3,4]
[1,3,4]
Prelude> [1] ++ [3] ++ [4]
[1,3,4]
Prelude> “ca” ++ “sa” -- claro que vale para strings
“casa”

Se desejamos realizar operações aritméticas com números que são strings, usamos a função read para converter. Já quando queremos tratar um número como uma string, convertemos o mesmo com a função show. Os exemplos demonstram isso:


Prelude> read ('3' : []) + 5
8
Prelude> read “20” * read “5"
100
Prelude> tail “came” ++ show 32
“ame32”

Existem duas funções em Python que foram herdadas de Haskell, penso eu. É a map e a filter. Map toma uma função e uma lista como argumentos, e retorna uma lista do resultado da operação da função sobre cada elemento da lista-argumento. Já filter somente adiciona na nova lista os elementos que operados com a função retorne True. Exemplos são melhores que minha explicação:

Prelude> map Char.toUpper "escola"
“ESCOLA”
Prelude> filter Char.isUpper "Kodumaro"
"K"

Com isso terminamos mais um post sobre Haskell. No tutorial anterior esqueci de colocar os links para os materiais de referência. Eles podem ser encontrados no site oficial da linguagem. No entanto, minha leitura principal é Yet Another Haskell Tutorial.

Exercício: Use map para converter uma string em uma lista de booleanos, cada elemento na nova lista representando se o elemento original estava em maiúsculas ou não. Exemplo: “teSte” produzirá [False, False, True, False, False]

Prelude> :quit

A Linguagem Haskell

O blog comunitário Kodumaro é voltado para linguagens de programação. Pensei então em escolher uma linguagem a mais para comentar. As linguagens que programei durante a minha vida foram: Pascal, C, Object Pascal, Haskell, Prolog, LISP, Java, Python, PHP e VB, nessa ordem. Talvez hajam outras mas como não lembrei foram fracamente utilizadas. Então acabei escolhendo Haskell por ser uma linguagem diferente das demais.

Haskell é uma linguagem de propósito geral, puramente funcional com características diversas tais como, tipagem estática, funções de alta ordem, polimorfismo, classes de tipo e efeitos monádicos. Existem vários compiladores disponíveis livremente para diferentes plataformas.

Poderia dizer que é uma linguagem que irá surpreendê-los, assim como ocorreu comigo no tempo da faculdade. Aos interessados em acompanhar este tutorial recomendo baixar imediatamente alguma implementação de Haskell. Sugiro duas: Hugs e GHC (Vejam nesse site). Para usuários do Windows, eu diria que seria interessante usar a primeira. Já para os geeks do Linux, por favor procurem por GHC. Puxando um pouco para meu lado de usuário Linux da distribuição Ubuntu baixem com esse comando:

sudo aptitude install haskell-compiler

Antes de chegar nos exemplos, gostaria de explicar meu modo de operação para que acompanhem com comodidade. Um jeito cômodo – inclusive primeiramente conheci estudando Haskell – é o uso de um interpretador interativo. Esta ferramenta permite que você interaja com o programa em tempo real. Ou seja, ao inserir uma expressão na linha de comando e clicar no Enter, o interpretador processa a expressão retornando seu valor. A comodidade está no fato de você testar um algoritmo como mais rapidez para integrá-lo ao fonte de uma aplicação em desenvolvimento, ou estudar o funcionamento de alguma biblioteca.

O ghci é o interpretador do GHC. Num terminal de comandos do Linux (ou usando o Hugs no Windows) executemos:

chackero@lain:~$ ghci

Haskell é um resolvedor de expressões. Ele computaciona uma expressão até deixá-la no seu modo mais simples. Assim sendo, o modo mais simples da expressão 2 + 3 é 5. O que funciona para expressões aritméticas funciona para a resolução de funções. Por isso, a explicação. Vejamos no hgci:

Prelude> 2 + 4
6
Prelude> 2 * 4

8

Haskell possui infixação de operadores. É possível colocar o símbolo dos operadores antes dos operandos. Senão, vejamos:

Prelude> (+) 2 4
6

Prelude> (*) 2 4

8

Prelude> (*) 2.0 4

8.0

Para infixação é necessário o uso dos parênteses. No exemplo, vemos polimorfismo quando o operador de multiplicação aceita inteiros e reais como argumentos. Haskell possui funções embutidas. Na verdade, os operadores são açucares sintáticos de funções. Isso é percebido pela forma como se comportam. Alguns exemplos a seguir incluem funções que tratam também de strings.

Prelude> div 10 3
3

Prelude> abs (-23) -- parênteses necessários para que -23 seja tratado como argumento

23

Prelude> negate 10

-10

Prelude> reverse "Kodumaro"

"oramudoK"

Prelude> "Kodumaro" ++ " é legal" -- exemplo de concatenação de strings

"Kodumaro é legal"

Prelude> length "Teste"

5

Prelude> 'a' < 'z' -- operação entre tipo Char

True

Prelude> True && False -- &&: operador booleano E

False

Prelude> True || False -- ||: operador booleano OU
True

Dois sinais de menos iniciam um comentário. Comentários em Haskell só existem para um linha, não para um conjunto delas.

Funções podem ser tratadas como operadores. Isso é visto no exemplo abaixo:

Prelude> 10 `div` 3
3

Além dos números, booleanos e strings, Haskell possui outros tipos de dados, como as tuplas e as listas. São tipos muito usados na linguagem.

Tupla é uma seqüência fixa de elementos. Esses elementos podem ser de tipos diferentes. Tuplas são representadas por elementos entre parênteses:

Prelude> ("Cláudio",29)
("Cláudio", 29)

Prelude> fst ("Cláudio", 29) -- fst retorna o primeiro elemento da tupla

"Cláudio"

Prelude> snd ("Cláudio", 29, "Computação") -- snd retorna o segundo

29

Prelude> () -- Uma tupla vazia

()

Acredito que exemplos explicam melhor que palavras. Exposto isso vamos às listas, tão importantes para Haskell.

Listas são seqüências de elementos de um mesmo tipo.

Prelude> [2,3,4][2,3,4]

Prelude> ['c','a','s','a']

['c','a','s','a']

Prelude> length [2,3,4] -- olha o exemplo de polimorfismo!

3

Prelude> [1..4] -- uma particularidade das listas.

[1,2,3,4]

Prelude> head [1..4] -- a cabeça da lista

[1]

Prelude> tail [1..4] -- a cauda da lista

[2,3,4]

Prelude> "Kodumaro" == ['k','o','d','u','m','a','r','o'] -- Uma string é uma lista de Char!

True

Prelude> head "Kodumaro" -- então isso funciona!

"K"

Prelude> elem 'm' "Kodumaro" -- existe 'm' na string "Koduramo"?

True

Prelude> elem 5 [1..4]

False

Esse primeiro post serve para dar uma amostra do que é Haskell. Ainda veremos muitas coisas daqui em diante. Estou revisando novamente a linguagem e sei que há muitas coisas que não consegui estudar na faculdade, como as tais mônadas, conceito complicado por sinal. Espero que tenham gostado. Obrigado!

Prelude> :quit