Micro projeto em CakePHP
12.11.2008 | CakePHP, Projetos
Tags: CakePHP, nada, php

Ontem e hoje eu passei o dia desenvolvendo uma pequena aplicação com o CakePHP. Foi a primeira que eu efetivamente concluÃ. :P
Esses dias, houve uma grande promoção de CDs na Submarino, no meio de tanto cd interessante, deixei de comprar alguns simplesmente pq eu não lembrava se eu já tinha ou não. Por mais bizarro que isso possa ser para alguns, eu costumo não lembrar os cds que tenho. :P Então ele basicamente me diz isso e pronto, acabou.
Desenvolver com o Cake foi bem tranquilo, continuo não me agradando do Form Helper, mas o utilizei da mesma forma. Primeiro fiz a parte de programação, comecei ontem depois do almoço e terminei ontem mesmo. Hoje passei o dia todo somente fazendo o layout. :O
Obviamente esse “projeto” não é aberto ao público, uma vez que o fiz somente para controlar meus CDs, mas quem sabe não vai rolando uns upgrades no futuro? ;P
CakePHP e seu form Helper
28.10.2008 | CakePHP
Tags: CakePHP, php
Utilizar os Helpers ajudam e facilitam muito o desenvolvimento, isso todo mundo deve saber. Mas uma coisa que me incomoda bastante é o código automático gerado algumas vezes. Eu tenho sindrome de Deus e gosto de ter controle de tudo, o que não é possÃvel as vezes utilizando o Form Helper.
Por exemplo, vamos criar um formulário com o campo username e brincar com ele. Basicamente, seria um formulário para cadastrar usernames em um sistema. Na view add.ctp temos o seguinte código:
echo $form->create('User'); echo $form->input('username'); echo $form->end('Save');
Ele vai gerar o seguinte HTML no navegador:
<div class="input text"> <label for="UserUsername">Username</label> <input id="UserUsername" maxlength="25" name="data[User][username]" type="text" /></div>
Se eu tiver algum erro na validação dos dados (feitos no model), a mensagem de erro será exibida abaixo no input.
<div class="input text"> <label for="UserUsername">Username</label> <input id="UserUsername" maxlength="25" name="data[User][username]" type="text" /> <div class="error-message">Username required!</div> </div>
Mas, e se eu quiser essa mensagem de erro em outro lugar? Em cima do input, por exemplo? E se eu não quiser esse label? Supondo que eu queira exibir somente o input e a mensgem de erro em cima dela, tenho que fazer o seguinte:
echo $form->error('username'); echo $form->input('username', array('label'=>false, 'div'=>false, 'error'=>false));
Coloco a mensagem de erro onde eu quiser através do método error. Depois oculto as tags que não quero na criação do input. A div estou ocultando por causa da semântica, senão a mensagem de erro ficaria do lado de fora da div que contém o input. Estou setando o error do input como false pq senão além dele exibir a mensagem através do método error, ele também ira criar a div com o erro embaixo do input, ficando assim duas mensagens.
Deve ter uma solução melhor para casos assim, mas como não encontrei nada na minha pesquisa, tive que dar meu jeito.
A Novela HP – 2º Temporada
28.10.2008 | Devaneios
Tags: hp, nada, ninguém merece
Para quem perdeu a eletrizante 1º temporada:
Vamos então a um resumo do que nos aguarda dessa vez:
O conector do cabo de energia está com mau contato. Não importa a “posição” que você plugue. Não importa a superfÃcie onde esteja o notebook. Não importa nada! A luz indicado conectividade acende, mas a bateria não carrega. O que seria um simples caso de mau contato não seria tão simples assim. Claro que não! Pq seria? Sabe-se lá o motivo, mas algumas poucas vezes, parece que esse mau contato simplesmente não existe. Tudo funciona perfeitamente bem.
Após o famigerado contato telefônico e alguns minutos de musiquinha, fui informado que teria que ser submetido a todo o processo de envio de equipamento que fui submetido da última vez. E tenho que aguardar de 20 a 30 dias úteis para ter um parecer.
Não vejo a hora de ser transferido para o setor de “”"”"”"”"”"”"”"”qualidade”"”"”"”"”"”"”"”".
CakePHP e o Banco de Dados
23.10.2008 | CakePHP
Tags: CakePHP, php
Quem mexe com o CakePHP já deve ter percebido que ele “exige” uma conexão com um Banco de Dados, mesmo se você não for precisar de um. Criar um banco de dados vazio só pra constar e deixar o Cake feliz é tosco. Mas mais tosca ainda foi a única solução que encontrei pesquisando pela internet: Criar um driver de conexão próprio para enganar o Cake!
O primeiro passo seria criar um arquivo, por exemplo, dbo_sem_bd.php na pasta app/models/datasources/dbo/ com o seguinte código:
1 2 3 4 5 6 7 8 9 10 | class DboSemBd extends DboSource { function connect() { $this->connected = true; return $this->connected; } function disconnect() { $this->connected = false; return !$this->connected; } } |
Depois, bastava alterar o arquivo database.php na pasta app/config e dizer que o driver utilizado nas conexões será o sem_db. E pra finalizar com chave de outro, em cada model do sistema, setar a variável $useTable como FALSE.
Eu sinceramente prefiro criar um banco de dados vazio e deixar pra lá, mas o que me deixa mais espantado é o fato de uma ferramenta tão cheia de recursos quanto o CakePHP não tenha uma opção onde eu possa colocar que não vou utilizar um banco de dados.
Uma outra “solução”, e aqui posso estar falando besteira já que não vi isso a fundo, seria criar todas as páginas dentro da pasta pages. Mas ai eu teria que criar rotas para todos os meus arquivos para não ter que chamar sempre esse controller (pages) na url. Isso também geraria um trabalho tosco.
Mudança
19.10.2008 | Devaneios
Tags: nada
Andei um tempo afastado daqui, não que as atualizações fossem frequentes antes, mas dessa vez, até os spams demoraram a ser deletados. O motivo: Estou mudando de empresa.
Foi 1 ano e 9 meses trabalhando na 3jane, nesse tempo vi pessoas entrando e saindo, conheci mentes sagazes da programação (=P), enfim… foram ótimos meses onde aprendi e cresci muito como profissional.
Mas a vida, ahhh a vida! Ela é uma caixinha de surpresas! Coisas bestas são feitas. Merdas (muitas) são faladas. O desânimo é inevitável. E numa bela manhã (!!!) em que estava puto com algumas coisas, um link me chamou a atenção em um email e cliquei. A vaga era interessante e resolvi tentar a sorte.
Terça-feira, dia 21, começo a trabalhar na área de tecnologia da CTIS. Estou trocando o horário flexÃvel de uma empresa americana onde podia ir de blusa de banda e all star por horário fixo numa empresa brasileira e roupa social. E, estranhamente, estou empolgado com isso. =o
No mais, boa sorte aos amigos que deixei na 3jane (com certeza Pedrinho vai me chamar de emo no momento em que ler isso) e boa sorte pra mim também, vou precisar. =P
Avatares do Tux! [Parte 2]
09.10.2008 | Devaneios, Linux
Tags: bowa, Linux, tux

Continuando o primeiro post, no site CrystalXP tem mais um monte de avatares que podem ser baixados (individualmente).
phpGACL
23.09.2008 | php
Tags: acl, dicas, php
Um dia depois de eu atualizar o blog, o Rafael me mandou um link pro phpGACL, uma ferramente Genérica de controle de acessos em PHP. Sendo genérica, não importa se você utiliza alguma framework ou se desenvolve PHP na unha, é só incluir a classe e utilizar.
Ao contrário da ACL do Cake, ela é muito melhor documentada e bem mais complexa, mas nem por isso menos simples. Vem com instalador, suporta praticamente todos os bancos de dados (foi desenvolvido utilizando o ADOdb) e ainda possui uma interface de administração.
No pacote vem um manual explicando o conceito da ACL (aqui eles utilizam os personagens de Star Wars) e a documentação da API das classes para referência.
Nesse link tem um tutorial de instalação de um pacote para integrar o phpGACL no CakePHP. Particularmente não fui com a cara desse plugin/componente (talvez pelo fato de ser argentino :P) e preferi fazer a integração na mão e criei meu próprio componente.
Utilizando o ACL no CakePHP
18.09.2008 | CakePHP
Tags: acl, CakePHP, dicas, php
Estamos começando um novo projeto aqui na empresa e para ele decidimos usar o CakePHP como framework de desenvolvimento. Desde semana passada estou estudando a utilização do ACL para controle de acesso às páginas do sistema, mas como muitos devem saber, o book do site do Cake não é tão explicativo quanto deveria. :P
Quer dizer, o exemplo do conceito sendo explicado utilizando os personagens d’O Senhor dos Anéis é sensacional! Mas só serve pra isso mesmo, explicar o conceito. Por que na prática, a coisa é um pouco mais complexa.
Pra tentar entender o funcionamento, criei o blog de exemplo do próprio “Livro de Receitas” do CakePHP. Porém ele é simples demais e nem tem usuários. Então criei uma tabela para armazenar somente um login e senha de acesso. Nada muito difÃcil para quem já mexeu com o Cake pelo menos uma vez.
Aà vem outro problema: por padrão, o ACL vem pronto pra trabalhar com CRUD, e dificilmente teremos um sistema que só utilize os métodos do CRUD. O que fazer então? Depois de dias lendo documentação sobre o assunto, chegou até mim um texto (perdi o link, desculpem. :/) que dizia, resumidamente, que era só associar os actions como ACOs normalmente, e na hora de salvar no banco, dar acesso total nos
Então, supondo que esteja tudo pronto, vamos resolver o grande problema que encontrei nos blogs que li: Os métodos de criação dos AROs e dos ACOs, bem como seus relacionamentos, não devem ficar espalhados pela aplicação. Crie um arquivo PHP separado para executar somente quando você precisar popular o banco de dados com as informações de acesso.
Então vamos começar criando um pequeno script que cria os AROs do nosso “sistema”:
1 2 3 4 5 6 7 8 9 10 | $aro = new aro(); $groups = array( 0 => array( 'alias' => 'Admins' ), 1 => array( 'alias' => 'Authors' ), 2 => array( 'alias' => 'Spammers' ) ); foreach( $groups as $group ) { $aro->create(); $aro->save( $group ); } |
Esse script vai gerar grupos de usuários do sistema. temos os administradores, os autores do blog e spammers, que são usuários que não terão acesso a nada.
Agora vamos criar alguns usuários:
1 2 3 4 5 6 7 8 9 10 | $aro = new aro(); $users = array( 0 => array( 'alias' => Pedro, 'parent_id' => 1 , 'model' => 'User', 'foreign_key' => 1 ), 1 => array( 'alias' => Rafael, 'parent_id' => 2 , 'model' => 'User', 'foreign_key' => 2 ), 2 => array( 'alias' => Adriana, 'parent_id' => 3 , 'model' => 'User', 'foreign_key' => 3 ) ); foreach( $users as $user ) { $aro->create(); $aro->save( $user ); } |
Acima estou criando 3 usuários apenas, um para cada grupo. O campo parent_id aponta para o grupo que o usuário faz parte. O campo model, como o próprio nome diz, especifica um modelo. No caso, ele guarda o nome do modelo que o id armazenado em foreign_key pertence. Então no exemplo acima, o id do Pedro na tabela User é 1.
Agora vamos criar algumas ACOs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $aco = new aco(); $group = array( 'alias' => 'Post' ); $aco->create(); $aco->save( $group ); $actions = array( 0 => array( 'alias' => 'index' , 'parent_id' => 1 ), 1 => array( 'alias' => 'view' , 'parent_id' => 1 ), 2 => array( 'alias' => 'add' , 'parent_id' => 1 ), 3 => array( 'alias' => 'delete' , 'parent_id' => 1 ), 4 => array( 'alias' => 'edit' , 'parent_id' => 1 ) ); foreach( $actions as $action ) { $aco->create(); $aco->save( $action ); } |
O processo para criação é exatamente o mesmo do utilizado no ARO. Aqui, primeiro criei um grupo com o nome do próprio controller, assim fica mais fácil organizar. Depois, criei uma ACO para cada action do controller e as relacionei com o grupo criado anteriormente.
Se você não definir nenhum tipo de permissão de acesso, por padrão, é tudo negado. Então vamos definir algumas permissões:
1 2 3 4 | $this->Acl->allow( 'Admins' , 'Post' , '*' ); $this->Acl->allow( 'Authors' , 'Post' , '*' ); $this->Acl->deny( 'Authors' , 'Post/delete' , '*' ); $this->Acl->deny( 'Spammers' , 'Post' , '*' ); |
Na primeira linha, dei acesso total à todas as actions do controller Post para os usuários que fizerem parte do grupo Admins. Na segunda linha, dei acesso total também aos autores do blog, mas na terceira eu tirei a permissão deles de deletar algum post, ou seja, eles podem tudo, menos deletar o texto que escreveram. Assim é mais fácil do que ficar fazendo um allow para cada action do controller. Na quarta linha tirei a permissão de acesso à todas as actions do controller para quem for do grupo spammers.
Para verificar quem tem acesso ou não, dentro do seu controller, no método beforeFilter por exemplo, basta fazer o seguinte:
1 | $this->Acl->check( 'Authors' , 'Post/delete' ) |
No nosso caso vai retornar FALSE.
Basicamente é isso. Tem outras coisas interessantes para se trabalhar junto com o ACL, como o ACLBehavior e o ACL Management Plugin. Uma boa leitura que pode ajudar um bocado é esse tutorial de utilização que um cara fez pro caso dele, tem até um sitezinho de exemplo.
Dinheiro não é tudo
15.09.2008 | Devaneios
Tags: bowa, kibada
Em pleno século XXI, eu, cidadão das Américas (ainda que do Sul), venho com esse papo mole de que dinheiro não é tudo. Sei que a proposta do post não é nova, mas sei também que tem muita gente que vai concordar comigo que dinheiro não é tudo.
Nós como meros desenvolvedores que somos, por vezes somos a menor parte do processo de desenvolvimento de um software ( que paradoxo não?). Constantemente trabalhamos sobre pressão, com prazos apertados, especificações falhas e com legados de softwares que sofremos pra manter. Mas se é tão ruim assim, por que continuamos? Simples: por que amamos desenvolver software. Achamos mágico construir soluções que acelerem o processo de comunicação entre os seres humanos, sejam eles quem forem. Gostamos de bits, patterns, miracle driven developments, aprender coisas novas pra agilizar os processos e por ai vai.
Por isso nos envolvemos muito com o nosso trabalho. Saimos da empresa onde trabalhamos e vamos pra casa fazer o que? Programar ou estudar programação ainda mais – e isso normalmente invade nossos finais de semana. Por essa razão não é difÃcil imaginar que nos envolvemos e muito com o que fazemos, já que fazemos por que somos apaixonados por isso.
E o que acontece quando percebemos que no ambiente onde trabalhamos existem processos ruins, que podiam ser otimizados mas que por “força maior” não os são ? Perdemos nosso humor. Parece que a “inspiração” para programar acabou, perdemos o ânimo para digitar um ponto-e-vÃgula sequer. Programador que ama o que faz não consegue digerir muito bem essa coisa de “isso é problema da empresa, as 18h vou pra casa tranquilo”.
E é ai que entra o titulo do post “Dinheiro não é tudo”. Ok, gostamos de dinheiro por que precisamos e por que nos trás conforto, mas dinheiro não compra entusiasmo – muito menos patrimônio intelectual.
Por exemplo, sempre tem aquele papo de que todo programador deve virar gerente de projetos. Por quê? Simples, porque gerente ganha mais. Mas, e se eu não gostar de ficar “o dia todos de frente pro Project?” (hei isso foi uma piada, por favor, ria). E se eu achar graça em outra coisa? E se o que me deixa feliz é digitar um bando de palavras em inglês e apertar o F5? (preciso dizer que foi outra piada?). Quem disse que eu estou programando só por dinheiro?
Por isso saiba discernir se você esta construindo o seu futuro simplesmente pelo que vai ganhar ou pelo que vai viver. Não deixe seu prazer em desenvolver softwares da maneira correta enferrujar junto com os processos administrativos da sua empresa. Dinheiro é bom, mas quando a gente morre fica tudo pra um bando de filhos ingratos que não vão saber quantas linhas de código você teve que escrever para consegui-lo. E se você morrer sem filhos, alguma mulher vai acabar gastando sua grana mesmo. (…) Não substitua talento por desculpas. Se quando você esta no trabalho, só fica pensando em ir embora e quando esta em casa fica com aquela sensação de frustação de voltar pra empresa, é melhor você dar uma olhada nesse vÃdeo aqui.
Texto copiado e colado descaradamente do Blog do Pedrinho.
Avatares do Tux!
12.09.2008 | Devaneios, Linux
Tags: bowa, Linux, tux

Para quem gosta do Tux, no site Free Avatars Download tem um pacote com 946 images dele caracterizado como vários personagens da cultura pop. :P
Para baixar o pacote basta ir direto no post ou direto no Rapidshare.
