Posts filed under 'Programação'
Hospedando repositórios git com gitosis em um servidor Arch Linux
Ontem resolvi me propor novos desafios e criar um repositório git dentro do meu servidor para projetos pessoais. Antes, eu somente era um usuário da ferramenta, e para montar tal repositório, fui buscar informações com quem havia me dado algumas dicas no início: visitem a wiki do nofxx. Além de algumas explicações e configurações rápidas para o aprendizado da linguagem, também há um screencast muito interessante.
Depois de procurar sobre informações na internet, ele me indicou a gitosis. Uma ferramenta para hospedar repositórios git. Sendo assim, achei alguns artigos que me fizeram ter uma ou outra dor de cabeça, e eis que resolvi escrever o meu.
Instalando a gitosis
Antes de mais nada, faz-se necessária a instalação do git (obviamente) e da python (para instalar a gitosis). Para os dois há pacotes prontos no repositório oficial extra. Utilizando o pacman:
# pacman -S git python
Já com os programas instalados, é preciso criar um novo usuário onde vão residir os arquivos hospedados em disco. Para tal criei um usuário denominado git:
# adduser
Obs: Atenção na hora de criar o usuário, o mesmo pode ter qualquer nome, porém não será possível realizar acesso ao mesmo através do ssh mais tarde, somente acesso físico. Ou seja, uma vez os repositórios criados, o gitosis bloqueia o ssh do usuário para somente acesso via git.
Com o novo usuário já logado, baixe a gitosis através do repositório:
$ cd
$ git clone git://eagain.net/gitosis.git
Para instalá-la, execute o seguinte procedimento:
$ cd gitosis
# python setup.py install
A instalação da gitosis irá criar um repositório inicial na pasta ~/repositories/gitosis-admin.git.
Volte ao seu computador. Caso não haja uma chave de ssh pública ainda, crie uma através do comando:
$ ssh-keygen -t rsa
A chave pública criada geralmente fica em ~/.ssh/id_rsa.pub, utilize o scp para copiar o arquivo para o servidor:
$ scp ~/.ssh/id_rsa.pub git@ENDERECO_DO_SEU_SERVIDOR:/tmp
Obs: Note que git é o nome do usuário criado no servidor anteriormente.
Voltando para o servidor, inicie o servidor da gitosis com a chave copiada e altere a permissão do arquivo post-update:
$ gitosis-init < /tmp/id_rsa.pub
$ chmod 755 ~/repositories/gitosis-admin.git/hooks/post-update
Agora, no seu computador, clone o repositório da gitosis para manipulação do servidor criado:
$ mkdir ~/projects
$ cd ~/projects
$ git clone git@ENDERECO_DO_SEU_SERVIDOR:gitosis-admin.git
Adicionando um novo repositório
Toda manipulação dos repositórios controlados pela gitosis se faz através do arquivo gitosis.conf, encontrado dentro do repositório clonado. Para criar um novo repositório, adicione o seguinte conteúdo ao arquivo gitosis.conf:
$ emacs ~/projects/gitosis-admin/gitosis.conf
[group nome_do_projeto]
writable = nome_do_projeto
members = usuario_do_seu_computador
Obs: não esqueça de apertar <ENTER> ao terminar a linha members.
Obs2: para encontrar encontrar qual conteúdo correto para utilizar na variável usuario_do_seu_computador procure no final da chave pública gerada anteriormente. Por exemplo, usuario@archlinux.
Com o arquivo editado, crie um commit para o mesmo:
$ git commit -a -m "Adicionando permissão ao usuário usuoario_do_seu_computador para o projeto nome_do_projeto."
E logo após de um push para o repositório no seu servidor:
$ git push
Logo em seguida, crie um repositório local para o novo projeto:
$ mkdir ~/projects/new_project
$ cd ~/projects/new_project
$ git init
$ git remote add origin git@ENDERECO_DO_SEU_COMPUTADOR:new_project.git
Então crie algum conteúdo, um commit e faça o push inicial.
$ touch README.txt
$ git add README.txt
$ git commit -m "Criando o repositório"
$ git push origin master:refs/heads/master
Obs: caso ocorra algum erro, preste atenção nas chaves públicas utilizadas e nos dados no arquvio gitosis.conf.
Adicionando novos usuários
O processo pra adicionar novos usuários aos repositórios controlados pela gitosis é bem fácil. Basta copiar os arquivos de chaves públicas dos mesmos para a pasta keydir do repositório renomeando para o nome de usuário e host aos quais os arquivos pertencerem. Segue um exemplo:
Usuário lhe manda o arquivo id_rsa.pub como usuario_pog@computer_do_pog, para achar esses detalhes basta ler o final do arquivo com o cat:
$ cat id_rsa.pub
Sendo assim, faz-se necessário copiar o arquivo para a pasta com o nome alterado:
$ cp id_rsa.pub ~/projects/gitosis/keys/usuario_pog@computer_do_pog
Depois é só adicionar o arquivo a um novo commit e realizar o push do mesmo:
$ cd ~/projects/gitosis/
$ git add keys/usuario_pog@computer_do_pog
$ git push
Pronto, o novo usuário já poderá acessar o repositório permitido no arquivo gitosis.conf.
DICA
Caso você tenha trocado sua porta do ssh, edite o arquivo ~/.ssh/config:
$ emacs ~/.ssh/config
host nome_do_computador
HostName 127.0.0.1
port numero_da_porta
Com essas modificações basta acessar usuario_do_computador@nome_do_computador, não precisando digitar o endereço IP do mesmo.
DICA 2
Adicione o branch master ao arquivo .git/config do repositório do novo projeto:
$ emacs ~/projects/new_project/.git/config
[branch "master"]
remote = origin
merge = refs/heads/master
Realizando esta operação para os branchs não é necessário indicar qual você gostaria de atualizar ao executar o comando git pull.
Add comment Março 4, 2009
Começando no Erlang
Olá, sou o mais novo membro do Pognation (vulgo blog do Stallone xD) e vou começar a postar sobre minhas experiências malucas com linguagens, começando com ERLANG.
Segundo o sagrado Wikipedia, Erlang é uma linguagem de programação concorrente e funcional, dinâmicamente tipada. Originalmente desenvolvida pela Ericsson, liberada como opensource em 1998.
O paradigma funcional (Haskell, OCaml, F#, só para citar alguns outros exemplos) é difícil de “digerir” para o desenvolvedor acostumado somente com Orientação a Objetos (no meu caso, Delphi, Ruby, C#, Java, Python). Mas como acredito que aprender uma linguagem nova me torna melhor em outras (know your enemy! Brincadeirinha ^^), vamos matar esse leão!
Ah, estou no Archlinux, então se virem para instalar o Erlang em suas distros favoritas :P
01 – Instaladno o Erlang
# pacman -S erlang
Assim teremos o ambiente Erlang instalado e sua shell, o erl.
Abra a shell do Erlang:
$ erl
<em>Erlang (BEAM) emulator version 5.6.3 [smp:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.3 (abort with ^G)
1>
Vamos brincar com a calculadora:
1> 4*4.
<em>16
2>
OBS.: Nunca se esqueça do ponto(.) no final da expressão!
Ficar mofando no shell é maçante, então vamos criar um programa de exemplo (feche o erl com CTRL + C, depois A):
Abra seu editor favorito e crie o arquivo exemplo.erl com este conteúdo:
-module(exemplo).
-export([double/1]).
double(X) -> 2*X.
Programação funcional é meio estranha, mas não é difícil entender que este programa dobra o valor de um número.
Agora abra o erl novamente, na mesma pasta do programa de teste e compile-o:
1> c(exemplo).
<em>{ok,exemplo}
E agora veja o resultado chamando o nosso “programa”:
2> exemplo:double(10).
<em>20
3>
Agora vamos explicar algumas coisas neste programa:
-module(exemplo).
Programas Erlang são criados em arquivos de texto com a extensão .erl, e o nome do arquivo deve ser igual ao nome do módulo(uma convenção semelhante ao Java). Quando usamos uma função em outro módulo, a sintaxe padrão é nome_do_módulo:nome_da_função(argumentos). Por isso temos:
2> exemplo:double(10).
A segunda linha do programa nos informa que o módulo exemplo contém uma função chamada double que recebe um argumento(X em nosso exemplo) e que esta função pode ser chamada fora do módulo exemplo(algo como encapsulamento público):
-export([double/1]).
Tudo bem até aqui, certo? Respirem fundo para o exemplo clássico de programa que calcula o fatorial de um número:
fatorial.erl
<em>-module(fatorial).
-export([fac/1]).
fac(1) -> 1;
fac(N) -> N * fac(N - 1).
Compile o programa no erl:
1> c(fatorial).
<em>{ok,fatorial}
E faça um teste calculando o fatorial de 4:
2> fatorial:fac(4).
<em>24
Agora vamos às explicações:
A primeira linha de código da função:
fac(1) -> 1;
Nos diz que o fatorial de 1 é 1, e o “;” indica que há mais “exemplos” desta função.
Na segunda e última linha:
fac(N) -> N * fac(N-1).
Utilizamos a recursividade para calcular o fatorial do argumento que será passado à função, aliás, acostumem-se com isso, pois loops são todos feitos assim no Erlang! *head explodes*
Esse foi o primeiro de uma série de posts sobre minhas aventuras no paradigma funcional, estou aprendendo ainda, mas espero poder dividir isto com a galera esperta que frequenta o blog :)
2 comments Julho 18, 2008
Django Pagination – Paginação fácil no Django
Estava eu, rodando pela internet no site da comunidade oficial do django quando me deparei com dois novos screencasts nesse site, e como sou bem curioso fui olhar.
O primeiro nem me chamou muito a atenção, a não ser pelo nível de organização do cara que é bastante interessante, porém no segundo ele apresentou uma aplicação chamada django-pagination, que torna muito fácil fazer paginação utilizando o framework django.
A utilização da mesma se dá de maneira bem fácil e é sobre isso que vou discorrer neste artigo, de acordo com as alterações que o autor do artigo original citou no screencast.
01 – Instalando a django-pagination para ser usada em todos os projetos;
Como feito no primeiro screencast (que citei o site acima) eu instalei a django-pagination junto com o meu django e em seguida linkei para o site-packages para poder ser usada em qualquer projeto, vamos então aos passos:
a) Baixe o source do google-source pelo SVN:
# cd /var/www/apps/python/
svn checkout http://django-pagination.googlecode.com/svn/trunk/ django-pagination
Logo após terminar, registre no site-packages do seu sistema, como eu uso o Archlinux, e sendo ele um *nix que suporta bash… resolvi usar o script pylink citado pelo autor para fazê-lo de maneira mais prática:
b) Crie o script em um arquivo chamado pylink:
pylink
#!/bin/bash
ln -s `pwd`/$1 `python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"`/$1
c) Dê permissão para que os usuários possam utilizá-lo:
# chmod 755 pylink
Aqui no Archlinux eu também linkei ele para uma pasta de binários locais que eu utilizo:
# ln -s `pwd`/pylink /usr/local/bin/pylink
d) Agora é só utilizá-lo para adicionar o pagination no site-packages do seu sistema:
# cd django-pagination/
# pylink pagination
Com o django-pagination instalado podemos então modifcar o projeto:
02 – Alterando o arquivo settings.py do projeto;
Primeiramente é preciso adicionar os TEMPLATES_CONTEXT_PROCESSORS logo embaixo das MIDDLEWARE_CLASSES no arquivo settings.py do projeto no qual estaremos instalando a aplicação django-pagination:
settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.request",
)
Logo após também é necessário adicionar a aplicação pagination no seu settings.py:
settings.py
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'twitter',
'pagination',
)
E, em seguida adicionar o middleware da aplicação também no arquivo settings.py do projeto:
settings.py
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
'pagination.middleware.PaginationMiddleware',
)
Por incrível que pareça não é necessário alterar nada nos models nem nas views do projeto e simplesmente alterando o templete conseguimos implementar a paginação utilizando a django-pagination.
03 – Alterando o template:
As alterações no template consistem em:
a) Adicionar a tag {% load pagination_tags %} no topo do template:
public.html
{% load pagination_tags %}
<html>
b) Adicionar a tag {% autopaginate v n %} antes do loop que vai preencher a página. Onde v é a variável que contém os registros que vamos carregar no loop e n é o número de registros que queremos exibir por página, sendo o n padrão igual a 20. Segue um exemplo:
public.html
{% autopaginate tweets 10 %}
{% for tweet in tweets %}
<p><b>{{ tweet.user.username }}</b> said: {{ tweet.message }}</p>
{% endfor %}
c) Adicionar a tag {% paginate %} logo após o loop, para aparecer o rodapé de navegação na página:
public.html
{% autopaginate tweets 10 %}
{% for tweet in tweets %}
<p><b>{{ tweet.user.username }}</b> said: {{ tweet.message }}</p>
{% endfor %}
{% paginate %}
E vualá, você terá 10 registros sendo exibidos por página…
Você pode se perguntar: Eu estou carregando todos os registros para somente apresentar 10 por vez, e vou recarregar toda vez que eu mudar de página? Isso vai ficar muito lento!
Exatamente, se você adicionar a tag {% autopaginate v n %} antes do seu loop só serão carregados os registros dá página em que você estará navegando. Então segundo as palavras do próprio autor: Você não precisa nem hesitar em não usar a django-pagination em seus projetos.
Obrigado pela atenção e até a próxima.
7 comments Julho 18, 2008