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
Erlang (BEAM) emulator version 5.6.3 [source] [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.
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).
{ok,exemplo}
E agora veja o resultado chamando o nosso “programa”:
2> exemplo:double(10).
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
-module(fatorial).
-export([fac/1]).
fac(1) -> 1;
fac(N) -> N * fac(N - 1).
Compile o programa no erl:
1> c(fatorial).
{ok,fatorial}
E faça um teste calculando o fatorial de 4:
2> fatorial:fac(4).
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 :)
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.
Desligando o Linux com o botão Power do Computador
Essa já não é novidade nenhuma e eu tenho plena certeza de que há mais meios de configurar esta tarefa porém nenhuma mais POG do que esta.
Na realidade não tão POG, pois o nosso amigo Gnome utiliza-se da mesma técnica que o Paulo Matias usou para realizar esta simples tarefa. Então vamos à grande explicação com um pouco de história.
Estava eu, sentado na frente do computador, quando tive a brilhante idéia de que meu Linux não tinha algum monitor do botão de power, e sempre conversando com o Paulo via Jabber ou IRC terminei falando pra ele, pois num teste recente pude conferir que o FreeBSD já vinha com essa opção ativada por padrão.
O que me assustou foi que ele já veio falando todos os métodos de como montar a tal e já tendo em mente todas as possíveis linguagens de programação (na mente dele Python e C) logo pensando no quesito de que o arquivo iria ficar aberto pelo tempo que o computador ficasse ligado, o Paulo levou em consideração criar o programa na linguagem C.
A técnica se baseia em ter um arquivo aberto sendo lido sempre para que quando você apertar o botão de liga/desliga do computador (não o do teclado) o mesmo acesse o arquivo e desligue o computador.
Eu realizei os testes no meu Archlinux, e como o Paulo também usa Archlinux, tudo ocorreu como esperado, vamos então a instalação e configuração de tal script.
A instalação dá-se de maneira bem simples, copie e cole o código abaixo em um arquivo com nome de acpi-power-button-monitor.c em qualquer lugar de seu computador (no meu caso eu copiei na ~/).
acpi-power-button-monitor.c
/* ACPI power button monitor.
* Copyright (c) 2008 Paulo Matias
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main() {
static char buf[128];
FILE *fp;
assert((fp = fopen("/proc/acpi/event", "r")));
while(1) {
fgets(buf, sizeof(buf), fp);
if(!strcmp(strtok(buf, " "), "button/power")) {
system("halt");
break;
}
}
fclose(fp);
return 0;
}
Depois só precisamos compilar o código com o seguinte comando:
$ gcc -Os acpi-power-button-monitor.c -o acpi-power-button-monitor
E então copiar o arquivo compilado (programa já pronto para execução) para a pasta padrão dos programas da sua distribuição Linux. No caso do Archlinux esta pasta fica em /usr/bin:
# mv acpi-power-button-monitor /usr/bin
# chmod 755 /usr/bin/acpi-power-button-monitor
E depois também precisamos chamar este programa na inicialização do Linux, modificando no arquivo /etc/rc.local no caso do Archlinux:
# vi /etc/rc.local
#!/bin/bash
#
# /etc/rc.local: Local multi-user startup script.
#
/usr/bin/acpi-power-button-monitor &
Com o programa sendo inicializado juntamente com o Linux, podemos então simplesmente testá-lo a partir da próxima vez que ligarmos o computador.
Lembrando que o mesmo consome 380Bytes de memória ram, irrisório para os computadores de hoje.
Obrigado e até a próxima.
About
Leandro Pincini:
Quase formado Tecnólogo em Processamento de Dados pela Faculdade de Tecnologia (FATEC) de Taquaritinga. Sim, estou naquela faze chata de final de curso em que temos que escrever nossas monografias.
Áreas de interesse:
Arch Linux, Programação (Java, Python, Ruby), Tecnologia.