sábado, 28 de fevereiro de 2009

BDD com python: Pyccuracy

Achei muito interessantes esta biblioteca pra fazer BDD com python. Ela é baseada no Accuracy (para C# e .net).

Maiores informações: http://tinyurl.com/c64qpp

terça-feira, 24 de fevereiro de 2009

"Create Django Application" para TextMate

Criei um pequeno comando no editor de Bundles do TextMate pra criar uma aplicação no django. Ele cria já uma estrutura de diretórios que deixa tudo pronto pra escrever templatetags, novos templates, testes, etc.

A estrutura de diretórios fica assim:

app_name/
|
`- __init__.py
|
`- admin.py
|
`- fixtures/
|
`- models.py
|
`- templates/
|
`- templatetags/
| |
| `- __init__.py
|
`- tests/
| |
| `- browser_tests.py
| |
| `- model_tests.py
| |
| `- nav_tests.py
|
`- urls.py
|
`- views.py


Segue o código (também disponível em [1]):



res=$(CocoaDialog inputbox --title "Create Application" --informative-text \
"Application name:" --button1 "Ok" \
--button2 "Cancel")

[[ $(head -n1 <<<"$res") == "2" ]] && exit_discard

app_name=$(tail -n1 <<<"$res")

if [ -f "$TM_PROJECT_DIRECTORY/manage.py" ]; then
MANAGE="python manage.py"
else
MANAGE="django-admin.py"
fi

cd $TM_PROJECT_DIRECTORY
$MANAGE startapp $app_name
mkdir $app_name/templatetags $app_name/templates $app_name/tests \
$app_name/fixtures $app_name/media
touch $app_name/urls.py $app_name/admin.py $app_name/templatetags/__init__.py \
$app_name/tests/__init__.py
cat > $app_name/urls.py <<EOF
#insert your custom urls here.
from django.conf.urls.defaults import *

urlpatterns = patterns('',
)
EOF

cat > $app_name/admin.py <<EOF
from django.contrib.admin import site
from ${app_name}.models import *

EOF

cd $app_name/tests

for testtype in model browser nav; do
touch ${testtype}_tests.py
cat > ${testtype}_tests.py <<EOF
#${testtype} tests for ${app_name}
from django.test import TestCase
EOF
done

cd -

CocoaDialog ok-msgbox --title "Application Created." \
--informative-text "Application $TM_PROJECT_DIRECTORY/$app_name created." \
--button1 "Ok" --float
rescan_project
[1] http://pastebin.com/f1a862c33

quinta-feira, 19 de fevereiro de 2009

Incializando Daemons no Mac OS X

Olá, pessoal! Há muito tempo não posto aqui, mas prometo não ser mais tão relapso :)
Hoje vou contar aqui minha experiência com o launchd, o gerenciador de serviços do Mac OS X. Não é uma experiência muito vasta, mas acho que já é válida pra quem está procurando informações.
Durante este post, vamos ver os seguintes tópicos:
  • O que é e como funciona o launchd
  • Configuração do serviço
  • Opções gerais do arquivo launchd.plist
  • Aplicação real: Configurando o daemon de atualização do no-ip[3]
Ao final, estaremos executando o daemon automaticamente durante a inicialização do seu mac :-)

Termos Utilizados

  • agent - Programa que roda em background, e é inicializado quando o usuário faz login;
  • daemon - Programa que roda em background, e é inicializado juntamente com o Mac OS X.

O que é e como funciona o launchd

Configurar um serviço para rodar em background na inicialização de um sistema operacional nem sempre é uma tarefa simples (tome-se como exemplo a dor de configurar serviços no windows, ou mesmo fazer gerenciamento dos scripts rc*.d no linux). No Mac OS X, o sistema gerenciador de processos é o launchd. Ele gerencia tanto processos que são lançados quando o usuário inicializa a sessão (agents), quando os que são inicializados durante o boot (daemons), e você pode configurar ambos os tipos de aplicação para serem iniciados a seu gosto.
Para fazer o lançamento das aplicações durante o login, o launchd busca informações em arquivos .plist[1] nas seguintes pastas no sistema operacional:
  • ~/Library/LaunchAgents - para programas a serem inicializados no login de um usuário específico (provido pelo usuário);
  • /Library/LaunchAgents - para programas que serão inicializados no login de todos os usuários (provido pelo administrador do sistema);
  • /Library/LaunchDaemons - para programas a serem lançados durante a inicialização do sistema (provido pelo administrador do sistema);
  • /System/Library/LaunchAgents - para serviços internos do Mac OS X a serem lançados no login dos usuários;
  • /System/Library/LaunchDaemons - para serviços internos do Mac OS X a serem lançados durante o boot.

Configuração do serviço

Os passos para a configuração do serviço são poucos e simples. Primeiro, criamos um arquivo .plist com as configurações desejadas do serviço. Depois, colocamos o arquivo em uma das pastas acima citadas, conforme o fim desejado. E pronto! na próxima inicialização, o Leopard já vai inicializar seu serviço normalmente.
Um arquivo .plist nada mais é do que um tipo de arquivo XML, com algumas tags para definição de tipos de dados para a representação de dicionários, listas, strings, etc. É vastamente utilizado em softwares escritos em Objective-C, para serialização de dados.
Para editar um arquivo .plist podemos utilizar qualquer editor de texto. Para quem tem o Xcode instalado, podemos usar o Property List Editor:



Opções gerais do arquivo launchd.plist


A lista completa de opções para um arquivo .plist pode ser obtida em[5]. Seguem aqui os parâmetros mais geralmente usados:
  • Label (String) - Identifica únicamente o trabalho a ser executado pelo launchd;
  • Disabled (Boolean, false por padrão) - Coloque esta opção para desabilitar temporariamente a inicialização;
  • UserName (String) - Especifica o usuário que executará o programa. Somente aplicável se o launchd é executado como root.
  • GroupName (String) - Especifica o grupo que executará o programa. Somente aplicável se o launchd é executado como root.
  • Program (String) - Caminho completo para a execução do programa;
  • ProgramArguments (Lista de Strings) - Lista de parâmetros para a execução do programa;
  • RunAtLoad (Boolean, false por padrão) - Define se o serviço vai ou não ser carregado na inicialização;
  • RootDirectory (String) - Caminho para execução "engaiolada" (chrooted);
  • WorkinDirectory (String) - Caminho para execução da aplicação (chdir).

Aplicação real: Configurando o daemon de atualização do no-ip

Primeiro, precisamos baixar o cliente do no-ip em [4], e instalá-lo normalmente. Feito isto, vamos criar um arquivo chamado com.noip.noip2.plist, e editar as seguintes propriedades:
KeyTypeValue
UserNameStringroot
LabelStringcom.noip.noip2
GroupNameStringwheel
RunAtLoadBooleantrue
OnDemandBooleanfalse
ProgramString/usr/local/bin/noip2


Para quem quiser editar o arquivo em um editor de texto normal, o código deve ficar desta forma:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UserName</key>
<string>root</string>
<key>Label</key>
<string>com.noip.noip2</string>
<key>GroupName</key>
<string>wheel</string>
<key>RunAtLoad</key>
<true/>
<key>OnDemand</key>
<false/>
<key>Program</key>
<string>/usr/local/bin/noip2</string>
</dict>
</plist>


E pronto! ao reiniciar o computador, você pode checar o daemon rodando através do comando:


[rodolfocarvalho@imac-rox:~]$ ps aux |grep noip2
root 3717 95.8 0,0 132152 480 ?? Rs Qua10 1557:56.10 /usr/local/bin/noip2


É isto! espero que minha ajuda tenha sido útil! Qualquer sugestão ou dúvida, é só postar um comentário ;)

Referências:
[1] http://developer.apple.com/documentation/Darwin/Reference/ManPages/man5/plist.5.html
[2] http://developer.apple.com/documentation/Darwin/Reference/ManPages/man8/launchd.8.html
[3] http://www.no-ip.com
[4] http://www.no-ip.com/client/mac/noip3.1.2a.dmg
[5] http://developer.apple.com/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html#//apple_ref/doc/man/5/launchd.plist