Fiquei sabendo hoje por um comentário aqui no site que a 4Linux, uma das mais importantes escolas de Linux e Open Source, está ministrando um curso de PHP e usando o meu livro como material didático. Muito legal isso!
Encontrei esse plugin para o Wordpress que faz highlight em códigos nos posts:
http://wordpress.org/extend/plugins/highlight-source-pro/
Muito útil
TCC sobre customização de distribuição Linux
Semestre passado orientei um acadêmico em um Trabalho de Conclusão de Curso (TCC) intitulado:
Customização de uma Distribuição Linux Live-CD para ser utilizada nos Cursos de Ciência da Computação e Sistemas de Informação
É um assunto interessante. O aluno sofreu um pouco pra finalizar o protótipo devido a complexidade do tema. Vale uma leitura para quem tiver interesse em não passar pelos mesmos problemas
O site do projeto, com o arquivo .iso, é:
http://www2.unochapeco.edu.br/~clemente/livecd/index.html
e o pdf do trabalho encontra-se aqui.
Aproveitando o lançamento da nova versão do Ubuntu, aproveito para fazer o lançamento da versão 1.1 do framework slimPHP. Este é um framework que desenvolvi a algum tempo atráz e foi adotado como principal ferramenta de desenvolvimento de novos aplicativos na universidade onde trabalho, a Unochapecó.
Esta nova versão contou com a colaboração dos desenvolvedores da Unochapecó Odair Lopes, Francis Perini, Clemente Scaratti e o professor Jorge Antônio Di Domenico.
As novas features do framework são:
Classe tabela
- Adicionado método getAllData() que retorna todos os dados da consulta na forma de um array
Exemplo:
$tab = new tabela(”pessoa”);
$tab->get(array(”*”));
$dados = $tab->getAllData();
unset($tab);
app::showView(”view/index_view.php”,$dados);
- Adicionado método setData() que automaticamente seta os valores para a tabela apartir dos dados vindos do $_POST ou $_GET
Exemplo:
$tab = new tabela(”pessoa”);
$tab->setData($_POST);
$tab->insert();
$tab->save();
unset($tab);
- Adicionado campo opcional $order no método get() na forma de uma string para poder escolher os campos de ordenação do SQL
Demais inclusões
- Adicionado o crudGenerator na pasta extra. Manual
- Foram adicionados os arquivos header.php e footer.php no diretório de visões representando o cabeçalho e o rodapé das visões.
- Adicionada a classe report.
Exemplo
Controlador
< ?
include("../slimphp/classes/app.php");
include("../slimphp/classes/tabela.php");
/**
* Objetivo: Descrição
* Autor: Nome
* Data: Data
*/
class XXX extends app {
function index() {
$tab = new tabela("pessoa");
$tab->get(array(”*”));
$dados = $tab->getAllData();
unset($tab);
app::showView(”view/index_view.php”,$dados);
}
}
$app = new XXX(”mysql://root:@localhost/slimphp”);
?>
Visão
< ?php
include("../slimphp/classes/report.php");
$r = new report('Titulo do Relatório');
$header = array('Código','Nome','CPF','RG'); //cabeçalho da tabela
$r->Table($header,$dados,’Pessoas’); //gera uma tabela
$r->Text(’Total de Pessoas ‘.count($info)); //gera uma linha de texto
?>
O download desta nova versão pode ser feito neste link
Ontem participei do evento VI Seminário de Sistemas de Informação - FIE, com a palestra as Oportunidades do Software Livre. Fui muito bem recebido pela organização e pela platéia. Depois da palestra participei de um debate sobre a profissão, mercado de trabalho e perspectivas de futuro na área de TI aqui no Oeste de Santa Catarina. Foi com muito orgulho que participei deste evento. A palestra foi muito bem e o debate melhor ainda, com assuntos de grande importância e com pessoas muito inteligentes, tanto da mesa quanto da plateia. Parabéns novamente para a organização.
O material da palestra que ministrei pode ser copiado aqui
Semestre passado orientei o acadêmico Jhony Maseto em seu Trabalho de Conclusão de Curso, intitulado “ANÁLISE AVALIATIVA ENTRE FRAMEWORKS DE PHP”, onde ele fez uma comparação entre o Cake, Symfony e o Prado.
O trabalho ficou muito bom, e ele está disponibilizando o PDF para consulta
No último fim de semana (dia 1 e 2 de Dezembro) aconteceu em SP o primeiro PHP Conference Brasil.
Foi a primeira vez que tive a oportunidade de participar de um evento deste porte como palestrante. Posso dizer que foi uma das melhores experiências de minha carreira. Conheci muita gente legal, algumas inclusive já conheciam meu site e os textos que escrevi. É muito legal saber que você ajudou alguém a resolver algum problema ou conseguiu ensinar algo.
Mas vamos aos relatos das palestras que assisti:
- Estendendo o padrão MVC com Zend Framework: o palestrante fez um resumo das principais características e vantagens do framework desenvolvido pela Zend, com apoio de diversas empresas de grande porte. Mostrou alguns códigos bem interessantes. A parte que mais me interessou foi sobre a idéia de Token Transactions que eles estão implementando. Resumindo evita o problema do usuário clicar diversas vezes no botão de submit ou no botão “back” do navegador. Vale uma pesquisa melhor sobre isso.
- GTK2: o Pablo apresentou sobre a integração do PHP5 com o GTK2. A palestra foi bem parecida com a que ele apresentou no FISL deste ano, mas valeu pela demonstração de alguns aplicativos que ele desenvolveu, como um mp3 player e um gerenciado de fotos.
- PHPUnit: esse é um assunto que eu preciso aprender cedo ou tarde, e esta palestra serviu para ajudar um pouco nesse aprendizado. O palestrante mostrou algumas dicas e exemplos muito úteis para desenvolver as classes de testes automatizados. A principal dica que anotei é desenvolver os testes antes de desenvolver as classes finais. Assim evita-se os testes “viciados”. Acho importante começar a usar estas técnicas para aumentar a qualidade dos aplicativos PHP.
- Javascript, Ajax e Microformats, parte 1 e 2: As palestras feitas pelo Elcio e pelo Diego, da Visie, mostram que eles são mesmo “popstars” do desenvolvimento web no país. A palestra sobre Tableless do Diego estava completamente lotada, nem perto da porta consegui chegar. Por isso tiveram que mudar a palestra do Elcio para o auditório. Ele mostrou como usar o Javascript para garantir a interação da página sem perder a acessibilidade. Na segunda parte ele mostrou a utilização do JSON para trabalhar com Ajax. Eu já conhecia a tecnologia, mas gostei bastante da maneira como ele usou e apresentou, além da biblioteca Javascript que eles desenvolveram. Muito útil. Outra coisa que achei legal foi a qualidade dos “slides” usados. Fiquei com vergonha da minha apresentação heheh
O segundo dia era o mais esperado para mim. Primeiro porque eu iria fazer minhas apresentações e porque as palestras que mais esperava seriam neste dia. Para começar bem o dia, encontrei o Maddog tomando café no meu hotel, acompanhado de uma pessoa do projeto Debian. Queria tirar uma foto, mas fiquei com vergonha de atrapalhar o café do americano. Pena. As palestras:
- Efficient debugging with Xdebug: a melhor palestra que assisti. Foi apresentada pelo alemão Derick, que trabalha na eZ Systems, empresa que desenvolve um framework bem legal, que já testei algum tempo atrás. Sua apresentação sobre o Xdebug vai ser muito útil para mim. Ele mostrou como usar esta extensão do PHP para facilitar o debug de aplicações PHP. Depois disso var_dump e print nunca mais! Vou configurar e testar no meu ambiente e quem sabe escrevo mais sobre o assunto. Uma coisa curiosa é que no primeiro dia o cara da Tempo Real me confundiu com o Derick no saguão do Hotel. Depois nós rimos disso quando eu fui comprar uma camiseta com ele. Bom, pelo menos não me confundiram com o Maddog.
- CakePHP: essa palestra eu não posso dizer que foi boa ou ruim porque fui eu quem apresentou. Da minha parte só posso dizer que foi uma excelente platéia. A apresentação correu muito melhor do que eu imaginava. Sala cheia e pessoal participativo. Fizeram muitas perguntas e comentários, o que deixou a palestra muito melhor do que eu tinha planejado. Consegui desenvolver toda a aplicação de exemplo sem a lei de Murphy atrapalhar. Passei do tempo estipulado mas foi ótimo
- Symfony: o mesmo da palestra anterior. Tinha menos pessoas que a de Cake, mas o pessoal também foi muito participativo. A grande maioria tinha assistido a palestra anterior o que foi legal, pois assim eles conseguiram fazer um paralelo entre as duas. Também passei do tempo. Desculpas novamente para o palestrante de Webservices que era logo em seguida.
Depois da palestra de Symfony eu fiquei conversando com algumas pessoas que se interessaram pelos frameworks. É muito legal isso, poder trocar informações com pessoas de outros lugares e com outras experiências.
Assisti um pedaço da palestra do Michelazzo sobre o Mambo e acabei indo embora. Estava bem cansado e além disso fiz alguns novos e excelentes amigos. Um pessoal muito legal de Brasília me convidou para racharmos o taxi e fazermos um turismo por SP. Fomos de metrô até o bairro da Liberdade, o bairro Japones. Muito bonito e exótico. Deu para comprar uma lembrancinha para a família. Além disso eles estão organizando um evento de PHP em Brasília em 2007 e surgiu a idéia de eu participar também. Legal! Tomara que dê tudo certo para eles.
E assim acabou o PHP Conference. Na minha opinião o evento foi muito bom. Alguns problemas com as salas no primeiro dia, mas nada que atrapalhasse a qualidade do evento. O Brasil precisa mesmo de mais eventos sobre PHP. Estou esperando o próximo PHP Conference e outros eventos do gênero. Parabéns para o pessoal da ProPHP e da Tempo Real pela organização e obrigado a todos que participaram das minhas palestras.
As apresentações das minhas palestras estão aqui: Cake e Symfony
Algums fotos: http://www.flickr.com/photos/75298286@N00/
Introdução
O Parallel Virtual File System é um sistema de arquivos distribuído desenvolvido para prover alta performance e escalabilidade paralela para clusters de PCs linux.
Em geral, o PVFS promete 4 características:
* Um espaço de nomes consistente para todo o cluster
* Acesso transparente para programas e aplicações já existentes, sem ter que recompilá-los
* Distribuição física de dados em múltiplos discos e múltiplos nós
* Alta performance de acesso em modo usuário
Download
Pode-se fazer download do arquivo de instalação no site:
http://www.pvfs.org/pvfs2/download.html
O arquivo de instalação foi copiado para o diretório /usr/src e descompactado:
cp pvfs2-1.5.1.tar.gz /usr/src
cd /usr/src
tar xfvz pvfs2-1.5.1.tar.gz
cd pvfs2-1.5.1
Construindo e instalando os pacotes
O ambiente usado para estes testes foi um laboratório com 4 computadores com o CentOS 4.4, kernel 2.6.9-34.ELsmp. Para instalar é necessário os pacotes de compiladores e dos fontes do kernel, disponíveis em RPM no CD da distribuição.
Os passos padrão para compilar e instalar o PVFS2 são os seguintes:
./configure –with-kernel=/usr/src/kernels/2.6.9-34.EL-smp-i686
make
make install
make kmod
make kmod_install
Para executar os comandos make install e make kmod_install é necessário acesso a conta root.
Para carregar o módulo do kernel:
/sbin/insmod /lib/modules/2.6.9-34.ELsmp/kernel/fs/pvfs2/pvfs2.ko
Estes passos devem ser executados em todas as máquinas que vão compartilhar seu espaço de disco para o PVFS2.
Configurando o ambiente de testes
É importante ter em mente os papéis que cada máquina (ou nó) vai exercer no sistema PVFS2. Existem três papéis que uma máquina pode exercer:
* servidor de metadados: nó que mantém metadados (como permissões e data de criação) para o sistema de arquivos.
* servidor de I/O: nó que realmente armazena uma porção dos dados do PVFS2
* cliente: é um nó que lê e grava arquivos PVFS2
Uma máquina pode exercer um, dois ou os três papéis simultaneamente. Além disto, podem haver vários servidores de metadados, de I/O e clientes.
O ambiente onde foram realizados estes testes é formado de quatro máquinas:
* lrac.unochapeco.edu.br (servidor de metadados e de I/O)
* et-015.unochapeco.edu.br (servidor de I/O e cliente)
* et-016.unochapeco.edu.br (servidor de I/O)
* et-017.unochapeco.edu.br(servidor de I/O)
Configuração do servidor
Neste passo é considerado que a instalação do PVFS2 já foi realizada em todas as quatro máquinas, conforme descrito anteriormente.
Agora será gerado um arquivo de configuração principal e 3 arquivos com as configurações de cada uma das máquinas restantes. É importante lembrar de informar corretamente os nomes dos computadores e que eles possam ser acessados pelos seus nomes. Recomenda-se que sejam criadas entradas no arquivo /etc/hosts de cada computador para facilitar.
Para gerar os arquivos de configuração:
root@lrac:~# /usr/local/bin/pvfs2-genconfig /etc/pvfs2-fs.conf /etc/pvfs2-server.conf
As perguntas abaixo são apresentadas. Os comentários abaixo foram adicionados na criação deste documento para facilitar a compreenção.
**********************************************************************
Welcome to the PVFS2 Configuration Generator:
This interactive script will generate configuration files suitable
for use with a new PVFS2 file system. Please see the PVFS2 quickstart
guide for details.
**********************************************************************
You must first select the network protocol that your file system will use.
The only currently supported options are “tcp” and “gm”.
* Enter protocol type [Default is tcp]:
deixar tcp
Choose a TCP/IP port for the servers to listen on. Note that this
script assumes that all servers will use the same port number.
* Enter port number [Default is 3334]:
usar a porta padrão
Next you must list the hostnames of the machines that will act as
I/O servers. Acceptable syntax is “node1, node2, …” or “node{#-#,#,#}”.
* Enter hostnames [Default is localhost]: lrac, et-015, et-016, et-017
neste passo é necessário indicar as máquinas que irão atuar como servidores de I/O.
Now list the hostnames of the machines that will act as Metadata
servers. This list may or may not overlap with the I/O server list.
* Enter hostnames [Default is localhost]: lrac
indicar a máquina que irá atuar como o servidor de metadados: lrac
Configured a total of 4 servers:
4 of them are I/O servers.
1 of them are Metadata servers.
* Would you like to verify server list (y/n) [Default is n]? y
se digitar a opção y os servidores serão testados. Pode-se colocar n e deixar este passo para mais tarde
****** I/O servers:
tcp://lrac:3334
tcp://et-015:3334
tcp://et-016:3334
tcp://et-017:3334
****** Metadata servers:
tcp://lrac:3334
* Does this look ok (y/n) [Default is y]? y
Confirmar se tudo está ok
Choose a file for each server to write log messages to.
* Enter log file location [Default is /tmp/pvfs2-server.log]:
Escolher um arquivo de log.
Choose a directory for each server to store data in.
* Enter directory name: [Default is /pvfs2-storage-space]:
Diretório onde será armazenado os arquivos pertencentes ao PVFS2. Este diretório será criado automaticamente mais tarde em todas as máquinas
Writing fs config file… Done.
Writing 4 server config file(s)… Done.
Configuration complete!
Agora temos todos os arquivos de configuração criados:
root@cluster1:~# ls /etc/pvfs2*
-rw-r–r– 1 root root 793 Out 10 18:55 /etc/pvfs2-fs.conf
-rw-r–r– 1 root root 91 Out 10 11:21 /etc/pvfs2-server.conf-et-015
-rw-r–r– 1 root root 91 Out 10 11:21 /etc/pvfs2-server.conf-et-016
-rw-r–r– 1 root root 91 Out 10 11:36 /etc/pvfs2-server.conf-et-017
-rw-r–r– 1 root root 94 Out 10 11:21 /etc/pvfs2-server.conf-lrac
Agora os arquivos devem ser copiados para as máquinas. Podemos fazer isso usando o ssh ou outra forma de cópia remota (ou copiando em disquete mesmo e gravando em cada uma das máquinas)
root@lrac:~# scp /etc/pvfs2-server.conf-et-015 root@et-015:/etc/
root@lrac:~# scp /etc/pvfs2-fs.conf root@et-015:/etc/
root@lrac:~# scp /usr/src/pvfs2-1.5.1/examples/pvfs2-server.rc root@et-015:/etc/rc.d/init.d/pvfs2-server
O mesmo deve ser feito para as outras máquinas (et-016 e et-017).
Também pode ser copiado para o servidor original o arquivo de inicialização:
root@lrac:~# cp /usr/src/pvfs2-1.5.1/examples/pvfs2-server.rc /etc/rc.d/init.d/pvfs2-server
Este arquivo será usado para iniciar e parar o servidor do PVFS2.
Iniciando os servidores
Em cada uma das máquinas deve ser executado o comando:
/usr/local/sbin/pvfs2-server /etc/pvfs2-fs.conf /etc/pvfs2-server.conf-(nome_da_maquina) -f
Exemplo:
/usr/local/sbin/pvfs2-server /etc/pvfs2-fs.conf /etc/pvfs2-server.conf-et-015 -f
Desta forma será criado o espaço onde será armazenado os arquivos (/pvfs2-storage- space) e o servidor será inicializado. Este comando é necessário ser executado somente na primeira inicialização. Das próximas vezes pode ser usado o serviço:
/etc/init.d/pvfs2-server start
e para interromper:
/etc/init.d/pvfs2-server stop
Configuração do cliente
Na máquina, ou máquinas, que irá atuar como cliente é preciso adicionar a seguinte linha no arquivo /etc/fstab
tcp://localhost:3334/pvfs2-fs /mnt/pvfs2 pvfs2 default,noauto 0 0
Esta entrada será usada pelo Linux para poder montar e desmontar o sistema de arquivos PVFS2. Além disto é necessário criar um arquivo chamado /etc/pvfs2tab que irá conter a mesma entrada e será usado pelos aplicativos próprios do PVFS2. Os passos abaixo mostram como criar o diretório onde será montado a partição e a criação do arquivo:
[root@et-015 /root]# mkdir /mnt/pvfs2
[root@et-015 /root]# touch /etc/pvfs2tab
[root@et-015 /root]# chmod a+r /etc/pvfs2tab
Agora é preciso adicionar no arquivo criado a mesma entrada que foi adicionada no /etc/fstab.
Testando a instalação
Existe duas maneiras de testar a instalação. A primeira é usar as ferramentas que são fornecidas com o PVFS2: pvfs2-ping, pvfs2-cp, e pvfs2-ls. Estas ferramentas testam, a saúde do sistema de arquivos, permitem copiar arquivos e listam o conteúdo dos diretórios.
bash-2.05b# /usr/local/bin/pvfs2-ping -m /mnt/pvfs2
(1) Parsing tab file…
(2) Initializing system interface…
(3) Initializing each file system found in tab file: /etc/fstab…
PVFS2 servers: tcp://localhost:3334
Storage name: pvfs2-fs
Local mount point: /mnt/pvfs2
/mnt/pvfs2: Ok
(4) Searching for /mnt/pvfs2/ in pvfstab…
PVFS2 servers: tcp://localhost:3334
Storage name: pvfs2-fs
Local mount point: /mnt/pvfs2
meta servers:
tcp://lrac:3334
data servers:
tcp://lrac:3334
tcp://et-015:3334
(5) Verifying that all servers are responding…
meta servers:
tcp://lrac:3334 Ok
data servers:
tcp://lrac:3334 Ok
tcp://et-015:3334 Ok
(6) Verifying that fsid 1224940272 is acceptable to all servers…
Ok; all servers understand fs_id 1224940272
(7) Verifying that root handle is owned by one server…
Root handle: 1048576
Ok; root handle is owned by exactly one server.
=============================================================
The PVFS2 filesystem at /mnt/pvfs2/ appears to be correctly configured.
Para listar:
bash-2.05b# /usr/local/bin/pvfs2-ls /mnt/pvfs2/
bash-2.05b# /usr/local/bin/pvfs2-cp -t /usr/lib/libc.a /mnt/pvfs2/testfile
Wrote 2310808 bytes in 0.264689 seconds. 8.325842 MB/seconds
bash-2.05b# /usr/local/bin/pvfs2-ls /mnt/pvfs2/
testfile
bash-2.05b# /usr/local/bin/pvfs2-ls -alh /mnt/pvfs2/
drwxrwxrwx 1 pcarns users 0 2003-08-14 22:45 .
drwxrwxrwx 1 pcarns users 0 2003-08-14 22:45 .. (faked)
-rw——- 1 root root 2M 2003-08-14 22:47 testfile
Copiando arquivos:
bash-2.05b# /usr/local/bin/pvfs2-cp -t /mnt/pvfs2/testfile /tmp/testfile-out
Wrote 2310808 bytes in 0.180621 seconds. 12.201016 MB/seconds
bash-2.05b# diff /tmp/testfile-out /usr/lib/libc.a
Outra forma de utilizar o PVFS2 é montando o diretório da mesma maneira que faríamos com o NFS ou outro sistema de arquivos.
No cliente, após ter carregado na memória o módulo do kernel como foi explicado anteriormente, pode-se executar os seguintes comandos:
[root@et-015 linux]# /usr/local/sbin/pvfs2-client
[root@et-015 linux]# mount -t pvfs2 tcp://localhost:3334/pvfs2-fs /mnt/pvfs2
Após isso é possível acessar o diretório normalmente, como se fosse um diretório local.
Referências
http://www.ime.usp.br/~carvalho/monografia-sad/
http://www.pvfs.org/pvfs2/pvfs2-quickstart.html
Material do curso de Python que ministrei no Jocetec - Unochapecó
Texto que usei na disciplina de Sistemas Operacionais Distribuídos que estou ministrando. É uma implementação em Python de um programa usando sockets para demonstrar a comunicação em um sistema distribuído.
O que é o Engage
O engage é um dock similar ao do OS X que está sendo desenvolvido em conjunto com o Enlightenment 17. A vantagem é que ele pode ser usado também em outros ambientes como o Gnome ou o XFCE.
Instalando
Para instalar no Dapper é preciso adicionar no /etc/apt/sources.list :
deb http://soulmachine.net/breezy/ unstable/
Depois é preciso importar a chave pública do repositório com o comando
sudo wget soulmachine.net/public.key && sudo apt-key add public.key
depois é só atualizar e instalar:
sudo apt-get update
sudo apt-get install engage
Configurando
É preciso criar os diretórios onde será gravado as configurações:mkdir -p ~/.e/e/applications/allmkdir -p ~/.e/e/applications/engage
O engage quando executado irá procurar no diretório acima os módulos a apresentar. Estes módulos estão em um formato especial, o .eap, que contém as instruções do executável e do ícone a apresentar. Neste link pode ser encontrado alguns arquivos:
Estes arquivos devem ser descompactados no diretório ~/.e/e/applications/engage
Para alterar as informações do arquivo eap deve-se instalar outra ferramenta:
sudo apt-get install eutils
E para alterar um dos arquivos:
e_util_eapp_edit ~/.e/e/applications/engage/gnome-terminal.eap
Executando
O executável do engage possui várias opções como tamanho dos ícones, transparência, etc. Eu estou usando o seguinte comando:
engage -G 1 -g 1 -b #00000000 -B #00000000
Sendo:
* -G 1 : capturar os ícones de todos os aplicativos executando
* -g 1 : capturar os ícones de todos os aplicativos minimizados
* -b e -B : cor de fundo e principal. Usando zeros o engage fica completamente transparente
É possível colocar este comando para executar no início da sessão do gnome para que execute automaticamente.
Funcionamento
Com o botão esquerdo são executados os aplicativos. Com o botão central sobre um aplicativo aberto todas as janelas deste aplicativo em execução são abertas. Segurando o botão esquerdo sobre o ícone do aplicativo minimizado este é aberto. O botão direito abre o menu de configurações do engage
Screenshot
Fonte
Um framework interessante que já é antigo, está na versão 5.5, e é pouco comentado é o Achievo ATK. Segundo o site, o ATK é ” um framework de aplicações orientadas a objeto escrito em PHP. Seu público alvo são desenvolvedores que desejam focar na lógica de negócios ao invés de codificar HTML. Enquanto outros frameworks proveem uma grande quantidade de classes utilitárias, ATK prove um framework completo que requer apenas pequenas quantidades de código para criar aplicações usáveis, enquanto mantém completa flexibilidade.”
Além dos manuais existentes no site, foi publicado um texto bem completo no site da Oracle com exemplos para esta base de dados. A minha pequena contribuição foi ajudar na tradução para o pt_BR. Esse é mais um exemplo de framework que pode ajudar bastante nós desenvolvedores.
Seguindo a idéia do meu Miniframework PHP criei o Miniframework AJAX. Não tem nada de complexo, a idéia e “escrever menos código sem ter que aprender muita coisa nova”.
ajax.js - arquivo com os comandos JavaScript
ajax_frame.php - Exemplo de uso
Um dos conteúdos que estou trabalhando na disciplina de Algoritmos e Estruturas de Dados III é Padrões Algoritmicos.
Dentre estes padrões existem os chamados “Algoritmos de Força Bruta (brute force algorithms)” e os “Algoritmos Gulosos (greedy algorithms)”.
Segundo [1], “um algoritmo de força bruta resolve um problema da maneira mais simples, direta e óbvia. Como resultado esse algoritmo terminar realizando muito mais trabalho para resolver um certo problema do que um algoritmo mais sofisticado. Por outro lado, um algoritmo de força bruta é em geral mais fácil de implementar do que um outro mais sofisticado e, por causa da sua simplicidade, às vezes ele é mais eficiente.”
O mesmo autor sugere um exemplo de problema a ser resolvido usando essa abordagem, o problema da Contagem de Dinheiro. “Considere o problema que um caixa de banco resolve sempre que ele ou ela precisa dar ao cliente uma certa quantidade de dinheiro. O caixa tem à sua disposição um conjunto de várias notas e moedas de valores diferentes e precisa contar uma certa quantia usando o menor número possível de peças.”
Um algoritmo usando a abordagem de força bruta iria testar todas as combinações possíveis até encontrar a melhor combinação. Fiz um código em Python para ilustrar esse algoritmo:
forca_bruta.py
Executando o script:
bash-3.00$ python forca_bruta.py
Digite o valor a encontrar
20
Solucoes encontradas
Solucao [1, 1, 1, 1, 1, 15]
Solucao [10, 10]
A melhor solucao eh
[10, 10]
O algoritmo encontrou duas soluções e sugeriu como a melhor a que usou menos moedas. Nesta abordagem ele testa todas as possibilidades até encontrar a melhor.
Já com a abordadem de algoritmos gulosos uma lógica mais sofisticada é utilizada. O caixa de um banco não iria testar todas as possibilidades até encontrar a melhor. Ele iria pegar as moedas com maior valor primeiro e iria encontrar uma solução para o problema. A idéia dos algoritmos gulosos é encontrar uma resposta não sabendo se é a melhor delas, mas torcendo para que seja. O algoritmo abaixo resolve o mesmo problema usando esta abordagem:
guloso.py
Sua execução retorna o seguinte:
bash-3.00$ python guloso.py
Digite o valor a encontrar
20
Solucao
[15, 1, 1, 1, 1, 1]
Ele mostra a primeira solução que encontrou. É mais rápido do que o força bruta e é uma solução correta, mas não é a melhor solução, que neste caso seria [10,10].
Mais um exemplo de python com ferramenta didática.
Em uma das disciplinas que ministro, Algotimos e Estruturas de Dados III, consta o conteúdo de Teoria de Conjuntos aplicada em computação e Estruturas de Dados para Conjuntos. A primeira é a aplicação das teorias matemáticas de conjuntos nas linguagens de programação. O livro que utilizo [1] traz exemplos em Pascal. Pesquisando um pouco na internet encontrei exemplos em Python:
A outra matéria trata sobre conjuntos disjuntos [2]. Segundo [3] “algumas aplicações envolvem o agrupamento de n elementos distintos em uma coleção de conjuntos disjuntos. Duas operações importantes são encontrar o conjunto a que pertence um dado elemento e unir dois conjuntos.” Em C é possível desenvolver estas estruturas de dados utilizando listas ou usando árvores. O código da versão em C usando listas é
Além disso, fiz uma pesquisa na internet para encontrar uma implementação em Python. Encontrei a classe Grouper [4]. Um exemplo do uso da classe é:
Uma das aplicações dos conjuntos disjuntos é a determinação dos componentes conectados em um grafo não orientado.
A implementação deste algoritmo usando C e listas é:
E a implementação usando Python:
[1] http://www.temporeal.com.br/produtos.php?id=169855
[2] http://en.wikipedia.org/wiki/Disjoint-set_data_structure
[3] http://www.livrariasaraiva.com.br/produto/produto.dll/detalhe?pro_id=466688&ID=C8F434217D5051E1012260358
[4] http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/387776
Nas últimas semanas fiz uma pesquisa para encontrar um framework PHP que eu pudesse usar em meus aplicativos/sites. Encontrei vários frameworks interessantes como:
- Symphony
- Prado
- Code Igniter
- Zend Framework
Depois de ver vários deles uma pergunta me ocorreu: “realmente preciso de um framework?”. Realmente utilizar um destes frameworks auxilia bastante o desenvolvimento, evitando que você refaça coisas que já existem. Mas muitas vezes estes frameworks possuem alguns problemas:
- são muito maiores do que você precisa;
- a documentação é confusa;
- poucos estão suficientemente maduros;
- é preciso aprender uma nova sintaxe ou maneira de se desenvolver;
- você fica “engessado”, é difícil fazer coisas mais avançadas ou que saem do padrão CRUD;
Então pensei que o que eu preciso é somente uma maneira de separar a lógica da apresentação, uma maneira de facilitar o acesso a bancos de dados e algo que me ajude a trabalhar com AJAX. Assim, peguei algumas idéias que vi nas documentações que li e algumas coisas que já utilizava e uni tudo para suprir minhas necessidades.
Modelo de aplicação
MVC Architecture?
Segundo Rasmus Lerdorf, criador da linguagem PHP, “MVC é palavra do momento em arquiteturas de aplicação web. Ela vem do design de aplicações para desktop orientadas a eventos e não se aplica muito bem no design de aplicações web. Mas felizmente ninguém sabe exatamente o que MVC significa, então você pode chamar seu mecanismo de separação de camada de apresentação de MVC e seguir em frente.”
Então, o que estou usando aqui é somente um mecanismo de separar o layout (html+css) do código PHP. Ao invés de usar as três camadas do MVC eu resumi para duas, Visão e Controle.
A parte da visão é representada por templates. Seguindo outra tendência que percebi em outros frameworks a parte de visão é representada por simples scripts PHP ao invés de utilizar uma das ferramentas de Templates como Fast Template, Smarty, etc. É mais simples de trabalhar e não é necessário aprender uma nova sintaxe.
Para a parte do controle eu desenvolvi uma classe chamada app. Nesta classe eu controlo as ações do usuário. Ela age como o controlador das aplicações testando qual ação o usuário escolheu e invocando o método correto (que deverá ser reescrito nas suas subclasses, as novas aplicações). A idéia é que cada aplicação seja uma subclasse da classe app.
Este é o código da classe app:
Outra classe desenvolvida é a classe tabela. Esta classe é responsável por abstrair e facilitar a manipulação de tabelas de bancos de dados. Seu código fonte é descrito abaixo.
Exemplo de aplicação
Para ilustrar o funcionamento eu criei uma pequena aplicação com as classes. A aplicação é um sistema de blog, com posts e comentários.
A estrutura de diretórios ficou assim:
classes/ - diretório com as classes
classes/app.php – classe app
classes/tabela.php – classe tabela para tratamento de tabelas no banco de dados
classes/adodb - classes adodb para abstração de bancos de dados. necessário para a classe tabela.
classes/JSON.php – para utilizar JSON, usado por algumas páginas que usam AJAX
blog/ – diretório da aplicação
blog/index.php – subclasse da classe app
blog/view/ - diretório com as visões
blog/view/index_view.php – visão inicial
blog/view/login_view.php – visão da página de login
blog/view/comentario_view.php – visão dos comentários
blog/view/admin_view.php – visão da página de administração
blog/view/estilo.css – arquivo com as definições de CSS para as visões
blog.sql – arquivo sql com os comandos para criar as tabelas da aplicação
A primeira tarefa é criar a base de dados e as tabelas que serão utilizadas no exemplo. Para isso foram executados os seguintes comandos sql (gravados no arquivo blog.sql):
create database blog;
use blog;
create table post (id_post int primary key auto_increment, tit_post varchar(255), ds_post text, dt_post date);
create table comentario(id_com int primary key auto_increment,ds_com text, email_com varchar(100), id_post int);
A base de dados usada neste exemplo é o MySQL.
O código do arquivo index.php do diretório blog deve ser uma subclasse da classe app. O código inicial ficou desta forma:
O primeiro método a ser escrito é o método index(). Este método é o método inicial da aplicação. O construtor da classe app sempre vai invocar este método caso não tenha sido escolhida outra opção.
Complementando o código:
O código do arquivo view/index_view.php é o seguinte:
O método showView da classe app vai transformar cada índice do vetor $dados em uma variável ou
em um novo vetor. Então o script index_view.php vai simplesmente imprimir seus valores.
Uma nova linha deve ser adicionada no final do arquivo index.php :
$blog = new blog(”mysql://root:@localhost/blog”);
Nesta linha é instanciado um novo objeto da classe blog criada. Como parâmetro para o construtor da classe é enviado a string de conexão com a base dados. Esta string é no formato usado pelo ADODB e a sintaxe para diversos bancos de dados podem ser encontradas no site da ferramenta.
Executando-se a aplicação deve-se obter o seguinte resultado:
![]()
Todas as definições de cores, fontes e estilos foram adicionadas no arquivo estilo.css utilizando-se as técnicas de CSS. Desta forma, os arquivos de visão não possuem formatações de estilo e sim somente informações dos dados que devem ser gerados. A parte de formatação fica em separado, o que facilitaria caso fosse necessário alterar as definições de layout da aplicação. O código do arquivo estilo.css é o seguinte:
O próximo passo é criar as outras ações da aplicação. Por exemplo, quando o usuário clicar no link comentários ele será direcionado para:
http://localhost/blog/index.php?op=comentarios&id_post=15
Como a variável op controla a ação que o usuário escolheu precisamos definir um novo método na classe blog para atender a esta requisição. Então o seguinte código deve ser adicionado aos métodos da classe blog (arquivo index.php):
index.php - método comentario()
O método comentarios() faz uso da visão comentario_view.php. Seu código é:
Assim, quando o usuário clicar no link “Adicionar comentário” na página inicial serão apresentados os comentários existentes e um formulário para adição de um novo comentário, conforme a imagem abaixo ilustra:
![]()
Quando o usuário submeter os dados do novo comentário a ação “addComentario” será executada, como indicado pelo input hidden chamado op na linha 26 do comentario_view.php. Para que esta ação seja executada o seguinte código deve ser adicionado no arquivo index.php.
index.php - método addComentario()
Quando o usuário clica no link Admin da página inicial ele é redirecionado para a visão que mostra o formulário de login. O método da classe blog que realiza esta ação é:
index.php - método mostraLogin()
E o código fonte do arquivo login_view.php pode ser visualizado abaixo:
O método login da classe blog é responsável pela validação do usuário e por mostrar a visão de administração. Neste exemplo não é feito nenhuma validação específica, isso é deixado a cargo do leitor, podendo implementar algum método de autenticação que seja pertinente.
A visão de administração é a mais complexa de todas. Além de mostrar os posts já cadastrados na tabela ela fornece opções de exclusão e de alteração dos mesmos. Para melhorar a interação com o usuário é usado técnicas de AJAX para buscar os dados do post antes do usuário realizar a alteração.
O código do arquivo admin_view.php é mostrado abaixo, com seus comentários.
Quando o usuário clica no link “Alterar” uma conexão assíncrona é aberta com o servidor via AJAX solicitando os dados do post. Os dados são codificados no formato JSON. JSON é “um formato leve para troca de informações. É facil para humanos lerem e escreverem. E é fácil para as máquinas processar e gerar.” Uma espécie de XML ligth. É baseado na notação de objetos do JavaScript, o que cai como uma luva para usar com o XMLHttpRequest. A classe blog utiliza o include JSON.php para gerar os dados neste formato. Este script pode ser encontrado no repositório PEAR, no endereço http://pear.php.net/pepr/pepr-proposal-show.php?id=198 e mais informações sobre o JSON podem ser encontrados no http://www.json.org.
Um exemplo da visão de administração é mostrado na figura abaixo:
![]()
Abaixo é mostrado o código final da classe blog com todos os métodos comentados acima e os métodos restantes, addPost(), del(), altPost() e buscaPost().
Tenho usado estas classes em alguns novos projetos que estou desenvolvendo e o ganho de produtividade tem sido interessante. Se ajudar para alguém fica aí minha contribuição.
Lendo a edição 63 da revista www.com.br tomei conhecimento de uma biblioteca chamada C-Paint. Segundo uma livre tradução do site:
“CPAINT (Cross-Platform Asynchronous INterface Toolkit) é um toolkit multi-linguagens que ajuda os desenvolvedores web a implementar aplicações AJAX com facilidade e flexibilidade. Ela nasceu da frustração e desapontamento do autor com outros toolkits open-sorce para AJAX. É construído nos mesmos princípios do AJAX, usando JavaScript e objetos XMLHTTP no lado do cliente e uma linguagem de script apropriada no lado do servidor, para completar o círculo de envio dos dados do cliente para o servidor e vice-versa.”
Como é citado acima, do lado do servidor pode-se usar tanto PHP quanto ASP, o que confirma a flexibilidade desejada.
Fiz alguns testes e achei o código resultante muito mais limpo que usando-se o SAJAX, por exemplo. Além de ser bem mais simples de entender e programar. Refiz o exemplo que tinha feito antes com o SAJAX para demonstrar.
Código do “Cliente”
Este é o código na página html
Código do “Servidor”
Este é o código do script PHP que será executado
É um toolkit realmente interessante. Eu estou substituindo os códigos que fiz com o SAJAX pelo C-Paint. O legal é unir no funcoes_ajax.php todas as funções que podem ser usadas pelo sistema, assim reaproveitando código e centralizando a manutenção nesse arquivo.
Fica aí essa dica de ferramenta.
Documento que usei em uma apresentação que fiz sobre Grid Computing no Dia da Computação, na Unochapecó.
Download
Vasculhando meu /home achei alguns pequenos documentos onde anotei algumas dicas sobre a configuração do Samba, Proftpd e do próprio Linux para autenticar no OpenLDAP. Pode ser que ajude alguém:
Autenticação do Linux no OpenLDAP
Autenticação do ProFTPD no OpenLDAP
Autenticação do Samba no OpenLDAP
São documentos um pouco antigos então pode ser que alguma coisa já venha configurado nas versões atuais
