quinta-feira, 19 de janeiro de 2012

Inkscape, solte sua criatividade livremente.

Olá a todos,

dessa vez trouxe algo diferente, que não está ligado a a programação, mas está ligado ao software livre e como ele pode estar nas mais variadas áreas.

Existe um lado obscuro na humanidade, que a muito tempo tentam entender e até mesmo dominar, é a criatividade. 
Pessoas criativas são tão importantes que me arrisco a dizer, seriam capazes de, sozinhas, mudar o mundo.

Bom, sem mais baboseiras... Existem várias ferramentas para expressar e transpassar essa criatividade através de um computador, são as ferramentas de imagens. São as mais variadas possíveis, que vão desde manipulação de imagens planas, passando por criação de imagens vetoriais chegando até a criação de imagens tridimensionais.

Muitas são famosas, como Photoshop, Corel Draw, Ilustrator e 3D Max. Mas, apesar de excelentes ferramentas, são caras, possuem seus códigos fechados e são incompatíveis com plataformas livres (Linux e companhia), tendo geralmente suas versões para Windows e para o queridinho dos designers, Mac OS X.

Mas se você estiver perguntando "E nós que usamos Linux? Não podemos expressar nossa criatividade?" Respondo-lhe (mesmo que não tenha perguntado): Yes, we can!!!

Existem ferramentas excepcionais para isso em formato opensource: GIMP, para manipulação de imagens, Inkscape para imagens vetoriais e Blender para manipulação 3D. Existem diversas ferramentas que não comentei que são tão boas quanto essas, mas essas são as mais populares.

Acesse o blog do Edu Agni, mais especificamente esse artigo que fala sobre isso.

Eu gosto muito de usar o Inkscape, pois além de ter uma interface objetiva, ele permite que eu crie imagens vetoriais conforme minha criatividade (praticamente nula eu reconheço, mas existe) quiser. Uso ele para criar ícones e imagens para criar páginas web (até os wireframes faço nele), para fazer uma montagenzinha e até mesmo pra distrair (sabe aqueles que pintam quadros em casa pra relaxar?)

Não vou explicar aqui como trabalhar nele, porque não tenho conhecimento suficiente ainda, mas sigam esses links que tem muita informação (além do site oficial, é claro):

Bom, é isso aí pessoal. Pra mostrar que qualquer um pode expressar, segue uma imagem que fiz usando o inkscape. Lembrando que não sou designer gráfico, não sei que estilos usei nem mesmo sei porque fiz assim, só fui "desenhando". Imagina o que um profissional não consegue fazer...




Luna (Moon Rider), Herói do jogo DoTa (Warcraft) 

sexta-feira, 16 de dezembro de 2011

Dica rápida: tabular várias linhas no VIM

Essa é uma rapidinha muito bacana para o VIM que encontrei após pesquisar uma solução para uma incoveniência: tabular várias linhas no VIM.

Más por quê isso? Simples, em python respeitamos a identação, pois ela serve para declarar blocos (como classes, métodos, condições, etc.) como função primária. Isso ajuda a deixar o código mais fácil de se entender.

As vezes decidimos criar uma estrutura acima de um código existente (um if é comum..rsrs). Aí é que entra a incoveniência, pois temos que identar em mais um nível o trecho de código existente que queremos que pertença a essa estrutura, isso no VIM, sendo um mero "utilizador básico" pode ser um tempo perdido dando TAB em cada linha.

Mas isso se resolve fácilmente com um comando (dos infinitos comandos apaixonantes do VIM):

n>>

onde n é o número de linhas a partir de onde o cursor está.

Explicando: o comando >> adiciona uma tabulação na linha corrente.
Adicionando um número antes, ele irá adicionar a tabulação na quantia de linhas especificadas.

Referência: http://www.tocadoelfo.com.br/2009/06/99-comandos-do-vim-que-todo-programador_15.html

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.