domingo, 3 de abril de 2011

Download de arquivos no FreeBSD

Olá, prometi e estou cumprindo, novos posts...

Bom, essa é uma dica rápida. Quem trabalha com servidores linux (sem ambiente gráfico), está acostumado a usar o carinha gente boa chamado wget. Esse cidadão faz, em sua mais básica função, o download de arquivos da internet. Não vou entrar em detalhes (caso queira, acesse a pagina oficial, a wikipédia ou seja macho e de um man wget no terminal linux).

No querido amigão FreeBSD, não temos o wget nativamente, mas temos seu primo, o fetch. Muita gente se perde quando utiliza o FreeBSD no começo, principalmente na hora de baixar algo (sim sim prezado leitor, estou nessa estatística).

Ao grosso modo, para baixar um arquivo, basta fazê-lo da seguinte forma "bruta e obscura":

$ fetch http://link_do_arquivo

Para mais informações, acesse o man fetch.

Até a próxima.

blá...blá...blá....Cadê as postagens?

Salve pessoal.

Pois é, faz tempo hein?!? Vou tentar voltar com as publicações.

Estive ausente nos últimos meses, sem postagens, sem comentários em outros blogs/sites, nem no twitter estive presente!


Mas uma boa notícia veio a partir desse tempo: estudei muito, aprendi muito e vou compartilhar um pouco do conhecimento que adquiri.

Estive/estou envolvido com servidores FreeBSD, virtualização de servidores, servidor de e-mail postfix, desenvolvimento (Django/Python, extenções para firefox e até integração Django e MSSQL Server) e outras coisitas mais.

Espero ter tempo (prometo que farei o máximo possível) para postar tutoriais, experimentos, informações e até dicas daqui em diante.

Enquato meu blog em Django não sair do papel, estarei por aqui mesmo...rsrs


Até a próxima (vai ter, eu prometo..=P).

terça-feira, 3 de agosto de 2010

Procurando arquivos com o grep

Olá,

hoje me deparei com um problema, eu queria saber qual módulo Python estava importando um outro modulo, mas não tinha a mínima idéia de que módulo era esse ou onde ele estava. A única coisa que sabia era que, com certeza, ele era um arquivo de texto e tinha a seguinte string:
import modulo

Pesquisando encontrei uma solução muito, mas muito simples, o maravilhoso grep.
Vamos ao mundo mágico do shell:


$ grep -rin "string" /*

Esse comando retorna todas os arquivos de texto que contenham a string

/home/cleiton/arquivo.txt:7:  'Essa era a string que eu queria'
/etc/arquivo.conf:263: 'Outra string que o grep retornou'

Vamos as explicações:

grep

grep é um aplicativo para linha de comando de sistemas Unix/Linux que faz buscas no conteúdo dos arquivos (ou input) procurando linhas que respeitem a expressão regular mencionada.(Wikipédia)

-rin


São parametros do grep.

-r indica recursividade, ou seja, ele vai procurar em todos os arquivos de todos os subdiretórios.

-i indica que não será case-sensitive , ou seja, não fará distinção entre maiúsculas e minúsculas. Caso queira diferenciar, remova o i dos parametros.


-n adiciona o número da linha correspondente à string.


"string"


Indica a string a ser procurada. No meu caso, a "string" foi substituida por "import modulo".



/*

Indica o caminho do diretório onde serão "iniciadas as buscas". Nesse caso é para quem não faz a mínima ideia de onde o arquivo esteja, assim ele começa do diretório raiz. Caso saibam onde ele possa estar, como /usr/local/lib/, por exemplo, substitua o /* por /usr/local/lib/*.



Para alguns, poderia ser utilizado o find (para recursividade) com o sed (para procurar a strig por método de expressão regular). Mas seria um pouco mais complicado e meu objetivo era ser o mais simples e rápido possível. Além disso o grep atendeu perfeitamente minha necessidade.

Abraços.

quarta-feira, 14 de julho de 2010

Usando o Mercurial no Gedit

Olá a todos...

Sei que acabei deixando o blog um pouco de lado, apesar de ter prometido não deixá-lo parado. Bom, meu motivo foi a faculdade, e sim, o temível mas prazeroso TCC (prazeroso depois de pronto, é claro..=])

Mas vamos ao que interessa...
Quem utiliza o Mercurial como controle de versão (ou outro, como Git por exemplo) para seus projetos sabe o quanto é "chato" ter que alternar para o console a cada novo commit, adição de arquivos ou visualização do log.
Como trabalho com o editor Gedit, pesquisei até achar uma forma de suprir a necessidade de facilitar o uso do Mercurial com esse maravilhoso editor.
Enfim achei algo que me ajudasse, o plugin 'Ferramentas Externas', presente no Gedit.
Com esse plugin é possível criar funcionalidades através de linguagens de script. Não sei ao certo quais linguagens ele suporta, mas testei com Shell Script e Python e occoreu tudo bem.


Vamos a prática.

Lembrando que estou trabalhando com Ubuntu 10.04, então pode haver a necessidade de alterar alguma coisa para sua plataforma ou distro.

Não vou me ater a como instalar e configurar o Mercurial, então, estude ele antes, caso não o conheça.
Certifique que o repositório Mercurial esteja iniciado antes de utilizar os recursos desse post.

Para utilizar o plugin, é preciso ativá-lo. Para isso vá em Editar  > Preferências > Plugins. Ative o plugin Ferramentas Externas.

Adicionando o arquivo ao repositório

 

Vamos criar a função de adicionar um arquivo do Mercurial (hg add ). Essa função adiciona ao repositório somente o arquivo que está sendo editado, então, para adicionar todos de uma vez, utilize o bom e velho terminal ou abra cada arquivo e execute a tarefa.

Vá em Ferramentas > Gerenciar Ferramentas Externas. Clique no botão adicionar e dê um nome (sugiro hgAdd). No painel ao lado você substitua o texto pelo seguinte:
#!/bin/sh

DOCPATH=$GEDIT_CURRENT_DOCUMENT_PATH

hg add -v "${DOCPATH}"

Logo abaixo tem algumas opções, não há necessidade de alterar, mas se quiser, recomendo colocar um atalho para executar a função e a opção Saída colocar o valor Mostrar no Painel Inferior. Feche a janela.

A variavel GEDIT_CURRENT_DOCUMET_PATH é uma variável do plugin, que determina o path do arquivo.

Para testar crie um arquivo no diretório do repositório e edite com o Gedit, salve e pressione as teclas de atalho (caso tenha configurado) ou vá até Ferramentas > Ferramentas Externas > nome. Pronto, o arquivo em questão foi adicionado ao repositório.

Efetuando o commit


A seguinte funcionalidade efetua o commit (hg commit -m ) no repositório referente ao arquivo que está sendo editado.

Adicione outra funcionalidade em Ferramentas > Gerenciar Ferramentas Externas. De um nome para ela ( sugiro hgCommit ) e escreva o seguinte código no painel ao lado:
#!/bin/sh

DOCPATH=$GEDIT_CURRENT_DOCUMENT_DIR #define o path do documento

#define o comentário do parametro -m.
COMENTARIO=`zenity --entry --title="Mercurial Commit" \
--text="Entre com um comentário e pressione OK para concluir o commit"`

ESCOLHA=`echo $?` #verifica se deu OK

#caso OK, executa o commit do mercurial
if [ "${ESCOLHA}" -eq 0 ]
then
 #caso o comentário for em branco, adiciona um comentário
 if [ -z "${COMENTARIO}" ]
 then
  COMENTARIO="Commit em branco - `date`"
 fi
 hg commit -v -m "${COMENTARIO}" "${DOCPATH}"
fi

As configurações podem ser iguais ao da funcionalidade anterior, exceto o atalho, que deverá ser outro.

Para testar, basta editar o arquivo, adicionar ele ao repositório (caso não esteja) e pressionar as teclas do atalho ou ir em Ferramentas > Ferramentas Externas >nome

Ver o log


Para visualizar o log (hg log), basta adicionar uma nova funcionalidade em Ferramentas > Gerenciar Ferramentas Extras. Adicione o seguinte código:

#!/bin/sh

DOCPATH=$GEDIT_CURRENT_DOCUMENT_DIR #define o path do documento

#joga em uma janela do zenity o log do repositório do arquivo
hg log "${DOCPATH}" | zenity --text-info --width 530 --height 400

Nas configurações idem a funcionalidade citadas acima.


Estude um pouco de Shell Scrip, Python, Zenity (para interagir seus scripts) e o plugin External Tools. Você pode elaborar ferramentas para tornar o Gedit mais poderoso e fácil para trabalhar.

Espero que tenha ajudado, qualquer dúvida ou sugestão, é só postar nos comentários.

Abraços.

terça-feira, 23 de fevereiro de 2010

Usando MD5 em python

Olá,

muitos já devem conhecer o algoritmo md5, utilizado amplamente em transferencias de arquivos, pois ele efetua um teste de intefridade dos dados.
Ele funciona mais ou menos da seguinte forma: analisa os dados e gera um número único de 128 bits(esse número pode variar conforme o software ou algoritmo que utilizar).
Então a melhor forma(e praticamente única) é testar dois arquivos e analisar seus códigos MD5, se forem iguais é porque os dois arquivos são exatamente iguais ( e quando digo exatamente é porque é, pois a mínima diferença, por menor que seja, gera dois códigos diferentes).

Em python existe um módulo MD5, chamado de ...md5 (sinistro...=P)
Para importar basta digitar no interpretador python:


>>> import md5


Não se preocupe, o md5 é um módulo built-in.

Para gerar o código:


>>> md5.new("string para teste").hexdigest()
'a16ee9e06b3d8f40a5d5d2dc7d88074a'
>>> var = 1
>>> md5.new("%s" % var)
'c4ca4238a0b923820dcc509a6f75849b'
>>> arquivo = open('[arquivo_a_ser_comparado]', 'r').read()
>>> md5.new(arquivo).hexdigest()
'valor_depende_do_arquivo'


Apartir do python 2.5 um novo módulo comessou a ser utilizado, o hashlib, deixando de lado o md5 ( mas ele ainda está presente nas versões superiores, mas com um alerta de preterido).
Uma vantagem do módulo hashlib (além de estar com suporte ativo) é que pode-se obter números de checagem de até 512 bits.
As opções de tamanho de chave são: sha224 para 224 bits, sha256 para 256 bits, sha384 para 384 bits, sha512 para 512 bits e o antigo md5, para 128 bits.


>>> hashlib.sha244('string ou buffer de leitura') #224 bits
>>> hashlib.sha256('string ou buffer de leitura') #256 bits
>>> hashlib.sha384('string ou buffer de leitura') #384 bits
>>> hashlib.sha512('string ou buffer de leitura') #512 bits
>>> hashlib.md5('string ou buffer de leitura') #128 bits


Um exemplo de uso, para quem estiver iniciando em python:
case: se dois arquivos forem identicos, exclua um(em linux):

>>> import hashlib
>>> import os
>>> path_arquivo_1 = '[path].arquivo'
>>> path_arquivo_2 = '[path].arquivo'
>>> arquivo_1 = open(path_arquivo_1).read()
>>> arquivo_2 = open(path_arquivo_2).read()
>>> if hashlib.sha512(arquivo_1) == hashlib.sha512(arquivo_2):
...     print "Excluindo %s, pois ja existe outro arquivo igual a esse." % path_arquivo_2
...     os.system('rm %s' % path_arquivo_2)
... else:
...     print "Os arquivos São diferentes"


É isso aí pessoal, qualquer dúvida, consultar a documentação do python ou perguntar nos comentários.


sexta-feira, 19 de fevereiro de 2010

Módulo python-twitter. Tuitar nunca foi tão legal...

Olá.

Se a maioria tem alguma coisa em comum, é o fato de usarem o twitter.
O twitter se tornou popular por ser um serviço de microblog onde as pessoas "tuitam" frases de no máximo 140 caractéres e seguem outras pessoas. O legal é poder expressar seu status pessoal, idéias, dúvidas, baboseiras e até usar como meio de marketing social.

Pensando em seu público e em como eles podem utilizar o twitter de forma produtiva, seus desenvolvedores disponibilizaram uma API para utilizar o twitter da forma que for melhor para os usuários ou até onde sua criatividade os levar.
Lembrando aos que desconhecem o termo API(Application Programming Interface) ou Interface de Programação de Aplicativos para nós usuários da língua portuguesa, são conjuntos de rotinas e funções para acesso á funcionalidades de um determinado software que podem ser utilizados por terceiros sem que esses tenham acesso ao código do projeto ou tenham que participar do desenvolvimento.
A API geralmente é utilizada em conjunto com outro software como mash-ups.

Mas para que usar a API do twitter? Não é mais fácil somente ir ao site e "tuitar"?

Para alguns (como eu) a interface em modo texto é mais emocionante, leve e prática. Então pode-se utilizar a API para "tuitar" sem necessitar de um navegador (para conexões lentas deve ser uma maravilha, já que não é preciso baixar todo o código do website antes de "tuitar").

Podemos ir muito além disso. Um exemplo seria integrar a API á um CMS ou sistema de website para que, ao postar um artigo, o título ou resumo seja automáticamente "tuitado" com um link para acesso. Ou criar um sistema para marketing social, agilizando o processo de propaganda via twitter.
Enfim, as idéias são muitas.
Na pagina wiki da API do twitter existe uma lista de bibliotecas da API para algumas linguagens, como Python, PHP, C++, Ruby, JavaScript, Java ente outras.

Vou falar da API python-twitter, que como podem reparar é para python.

O download pode ser feito diretamente daqui: http://bit.ly/9tjfjh.
Para instala-lo, basta digitar no terminal:

 $ cd pasta_onde_esta_o_download/ 
 $ tar zxf python-twitter-0.6.tar.gz
 $ cd python-twitter-0.6
 $ python setup.py build
 $ sudo python setup.py install


Se utiliza Debian e suas variantes, como root digite:

 #aptitude install python-twitter


Se quiser testar no terminal. digite esse comando para iniciar o interpretador python:


 $ python


Pronto, agora você está no interpretador python. =P

Importando o módulo:


 >>> import twitter


Fazer a autenticação:


 >>> api = twitter.Api(username='usuario', password='senha')


Para listar quem você está seguindo:


 >>> following = api.GetFriends()
 >>> for amigo in following:
 >>>     print "%s - %s" % (amigo.name, amigo.screen_name)


Para "tuitar":


 >>> msg = 'Estou usando o python-twitter'
 >>> status = api.PostUpdate(msg)


Para ver seu ultimo post:


 >>> print status.text


Para mandar uma Messagem Direta:


 >>> api.PostDirectMessage('usuario', 'Mensagem')


Para seguir um usuário:


 >>> api.CreateFriendship('usuario')


Mais detalhes no manual da API:


 $ pydoc twitter
 $ pydoc twitter.Status
 $ pydoc twitter.User
 $ pydoc twitter.DirectMessage


Ou no site da API - http://code.google.com/p/python-twitter/

Até a próxima.

segunda-feira, 15 de fevereiro de 2010

Projeto para feriadão fictício

Olá...
Chegou o feriado de carnaval, que para mim existe fictíciamente. Decidi então a criar um script,  ou mesmo uma aplicação que faça uma identação em códigos HTML/xHTML, que ja batizei de HTML-CSI(HTML Code Script Indention), que foi dica de Klaus P. Laube.

E qual o objetivo desse projeto, já que o código você identa na hora(é o melhor a se fazer)??

Simples, por duas razões, uma pessoal e outra pra facilitar.
Pessoal porque estou desenvolvendo um projeto de Iniciação Científica(PROINPES) e necessito fazer uma leitura e interpretação de código para efetuar a real função do projeto, analisar o website baseado em SEO.
Então, desenvolvendo um projeto que faça a análise do código e reescreva efetuando a identação, aprendo a fazer essa leitura.
Facilitar porque muitas vezes o código HTML pode não estar identado, ou porque o desenvolvedor anterior não usava essa técnica maravilhosa ou porque o código passou por um processo onde tudo o que não é necessário é eliminado, inclusive espaços e quebra de linha.
Então, utilizando essa ferramenta, se obtém um código legível.

Ele está sendo desenvolvido em Python e utilizando o HTMLParser.

O projeto está hospedado no bitbuket. Basta digitar em seu console o comando(necessita login):
hg clone https://mittmann@bitbucket.org/mittmann/html-csi/

Claro que precisa ter o mercurial instalado. http://mercurial.selenic.com/.

Postarei sobre ele assim que eu termina-lo.