2007-08-24 06:55:12
tags: 

Novo Wasabi: novidades no Blogcamp Sampa

Amigos,

Tenho estado um pouco sumido por aqui, mas garanto que é por um bom motivo, ou melhor, por vários bons motivos.

Um destes motivos é o Wasabi. Temos muitas novidades neste front, e gostaria muito de poder conversar sobre elas no blogcamp deste fim de semana.

Desde que lançamos o primeiro beta do Wasabi muita coisa aconteceu nessa nossa blogosfera tupiniquim. Naquela época, olhamos para nossa bola de cristal e vimos um futuro no qual acompanharíamos a vida dos nossos amigos simplesmente seguindo sua produção de conteúdo: seus blogs, fotologs, listas de links, podcasts e outros conteúdos, atualizados frequentemente, formariam um rico mosaico de tudo o que acontece com estas pessoas. Trata-se de um conceito difícil de implementar em forma de software, mas se você é um dos beta-testers do Wasabi sabe que nós temos alguma coisa interessante nesse sentido. Sabemos que a coisa ainda está incompleta: como a gente sempre fez o Wasabi como uma experiência, no tempo livre que temos, nunca conseguimos terminá-lo, de fato. Nosso site, diferentemente de alguns outros eternos betas que existem por aí, é beta pq realmente ainda não está pronto. :-)

Um dos motivos pelos quais nunca saímos ativamente atrás de investidores ou mesmo angels é porque não tínhamos um modelo de negócio fechado. Apesar de ser original em vários aspectos, a primeira versão de nosso querido agregador social não oferecia nenhum diferencial que nos deixasse seguros pra montar um business case que fizesse sentido pra nós e para os investidores. Assim, mantivemos o site em beta e fomos novamente olhar na nossa bola de cristal.

O que vimos desta vez foi bem diferente. Se hoje já somos quase 2 milhões de blogueiros só no Brasil, um número que cresce exponencialmente a cada ano, percebemos que no futuro vamos acompanhar não só a vida dos nossos amigos, mas tudo o que acontece no mundo, simplesmente seguindo esta produção de conteúdo. De fato, seguir a produção de conteúdo de todos estes blogs, fotologs, podcasts e sites de links (pra não falar na produção de vídeos e outras coisas que nem imaginamos ainda) é tão interessante que vai nos fazer
conhecer gente nova, fazer novos amigos... E aí percebemos que o conceito fundamental do Wasabi precisava mudar.

Como aumentar ainda mais o alcance desse conteúdo? Como potencializar a sinergia entre os conteúdos gerados por diferentes pessoas? Como fazer que o consumidor encontre conteúdo relevante em blogs que ele ainda não descobriu? E, fundamentalmente, como recompensar quem cria ou seleciona conteúdo de
qualidade?

Bem, amigos, acho que encontramos a resposta para essas perguntas, e encontramos também um modelo de negócios que parece muito interessante, e que você, blogueiro, é quem vai ganhar mais com ele.

No blogcamp que rola neste sábado e domingo, gostaria muito de conversar com todos os participantes sobre essa história, e, mais importante que tudo, saber o que vocês acham, o que gostam, o que não gostam, e como podemos fazer tudo isso realmente acontecer. De nossa parte, já estamos ativamente buscando investidores e desenvolvendo a nova versão.

Até lá!

4 Comentários:

[Avi Alkalay]  WTF é Wasabi? Entrei lá e só tem login.  [REPLY]

[tigo]  Owww Danilo, estou mesmo aguardando inovações no Wasabi.  [REPLY]

[Sergio Lima]  Desta vez vou acompanhar pelso feeds :-( Mas torcendo pra que as conversações sejam ótimas! Sucesso ao wasabi!  [REPLY]

[danilo]  Ô Serjão, você fez falta! Abraço grande e obrigado!  [REPLY]

2007-08-08 04:57:36
tags: 

O 1º Encontro B.L.S

Iniciativa maravilhosa do Beto Largman, o primeiro encontro B.L.S juntou uma galera muito boa na última segunda feira. Presentes no evento vários amigos virtuais como Nick Ellis (Digital Drops), Fábio Seixas, Carlos Cardoso, Alexandre Inagaki, Alexandre Fugita, Bernardo Bauer, Veridiana Serpa, Guga Frullani, Romullo Pontes, Cris Dias e o meu grande amigo Paulo Mussoi, coordenador dos blogs do Globo Online. Até o mestre Jorge Aragão marcou presença no evento.

Veja a cobertura no Geekchic.

6 Comentários:

[Romullo Pontes]  Ótimo blog meu querido! O encontro foi muito bom mesmo! Que venha o próximo!  [LINK]  [REPLY]

[Thiago]  Cara, não me leve a mão, sua serie sobre POO em PHP é otima, mais a sua demora para escreve-la desanima qualquer um =/ Abraços !!  [REPLY]

[Fabiano M]  Estamos sedentos em busca de tão preciosas informações sobre oop. Quem mandou começar, agora aguenta os chatos... hehehhee  [LINK]  [REPLY]

[danilo]  Valeu Romulo!  [REPLY]

[danilo]  Ô Thiago, eu sei que tá demorando muito. Mas prometo que volto assim que tiver um tempo, a coisa tá preta por aqui! Grande abraço!  [REPLY]

[danilo]  É, sou tipo um traficante que não sabe administrar seu negócio hahahaha grande abraço!  [REPLY]

2007-07-07 07:47:03
tags: 

São Paulo precisa de doações de sangue

Minha amiga de Barcamp Lúcia Freitas manda um aviso muito importante:

"Desta vez o assunto é sério. A Secretaria de Saúde avisa: a reserva de sangue nos bancos só dá conta do recado até o dia 13, próxima sexta. A razão é simples: as doações caíram, já em junho, de 7 mil para 4.200 - mais de 50%.
Segundo o release da Secretaria é o normal - faz frio, o povo doa menos. Meu convite? Vamos usar os blogs para fazer uma corrente de doação. O assunto grave é aqui em São Paulo, mas tenho certeza de que os bancos de sangue dos outros estados também ficarão gratos com todas as doações que aparecerem."

Doe. Divulgue. Ajude.

1 Comentário:

[Daniel Passos]  O RJ tambem principalmente com o inicio do PAM  [REPLY]

2007-07-03 04:58:16
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 17)

Para ver os artigos anteriores desta série, clique aqui.

Olá pessoal. Obrigado por todos os comentários e emails! Estou tendo um prazer enorme escrevendo essa série, e fico ainda mais feliz quando vejo que realmente tem gente curtindo.

Mas vamos ao que realmente interessa. No nosso último encontro expliquei que existem diferentes formas, ou patterns, para lidar com buscas e coleções de objetos, mas que eu ainda não estava satisfeito com aquilo que conheço. Como já disse em outras oportunidades, aprendi o pouco que sei de PHP nos becos escuros da internet, entre latões de lixo e scripts procedurais escritos por sabe-se lá quem. Não tenho, portanto, nenhuma pretensão de conhecer todos os sutras da programação orientada a objetos. Mas, outro dia, eu tive uma idéia que achei interessante, nada original, mas um pouco diferente das duas implementações que mostrei pra vocês.

Um dos design patterns mais interessantes (e, para mim, mais difíceis de entender) que conheço chama-se Iterator. Devo ter lido as definições e exemplos umas 1000 vezes sem entender direito como usar essa coisa. Pra quem vem de um passado procedural, especialmente usando uma linguagem como o PHP que lida muito bem com arrays, é muito difícil entender o benefício de usar os tais iterators.

Os iterators, juntamente com um outro pattern chamado Collection, vão formar a base do nosso novo desenho. O que estou pensando é relativamente simples: assim como temos a classe base Model, para operações com modelos, quero criar uma classe ModelCollection, que vai cuidar das operações com coleções de modelos. Dessa forma, temos um paralelo interessante: assim como podemos carregar as informações do modelo fazendo $model->load e assim por diante, poderemos carregar as informações de coleções fazendo $modelcollection->load.

O que eu gosto nesse desenho é que tudo fica claramente definido: um $model é sempre um objeto, enquanto que os $modelcollections são sempre coleções de objetos. Uma função de um $model jamais vai retornar uma coleção de objetos; uma $modelcollection jamais vai retornar um objeto (caso uma busca retorne apenas um resultado, ainda assim será uma coleção com apenas um objeto).

Parêntesis: uma das coisas que me deixa maluco no PHP é o fato de você poder misturar absolutamente tudo - uma mesma função pode retornar uma string, um array, um objeto... É o que os estudiosos chamam de loosely typed language, uma linguagem que não exige a definição dos dados usados pelas variáveis. Claro que essa característica pode ser usada para o bem: muitas implementações interessantes usam essa característica para flexibilizar e agilizar o desenvolvimento. Mas com o tempo, depois de passar anos da minha vida tentando decifrar códigos de scripts PHP por aí, eu afirmo categoricamente: tentar entender um script ou classe de alguma outra pessoa escrita em uma linguagem loosely typed é muito mais difícil.

Mas por que esse parêntesis tão grande? Porque no desenho que estou propondo vamos sempre lidar com objetos; Porque as Collections nos oferecem possibilidades muito, mas muito interessantes mesmo pra trabalhar com objetos e coleções de classes diferentes de forma transparente.

Não entendeu? Bom, vamos aos nossos exemplos então. Imagine que temos dois modelos completamente diferentes. Tipo "Post" e "Carro". Logicamente, dentro do nosso desenho, vamos ter os modelos $post e $carro, além das collections $postcollection e $carrocollection. Onde queremos chegar? Bem, como tanto a classe PostCollection quanto a classe CarroCollection são "filhas" da classe ModelCollection temos a certeza que estas subclasses implementam as mesmas funções. E por que isso é lindo? Porque eu posso agora implementar, por exemplo, a classe HtmlHelper, cuja função buildTable aceita qualquer ModelCollection e imprime uma tabela html. Pra usar, basta fazer $htmlhelper>buildTable($postcollection) ou $htmlhelper->buildTable($carrocollection).

Sacaram a beleza? Esse é só um exemplo do que podemos fazer com as collections e os iterators, mas o importante é ver que esse design faz com que qualquer coleção se comporte de forma igual, pra que a gente possa implementar coisas genéricas que funcionam pra qualquer uma delas. A coisa que imediatamente vêm à mente é que essa classe ModelCollection vai ter um método genérico pra fazer paginação, um pra fazer ordenação dos dados, e assim por diante.

Quando nossas classes estiverem prontas, olha só o que vamos precisar fazer pra imprimir uma tabela html:

(controller)

/* A função ModelController::loadPage() carrega a página indicada no $_GET['page'] e no $_GET['pagesize']

já na ordem indicada por $_GET['orderby'] e $_GET['direction'] */

$this->postcollection->loadPage();

(view)

$htmlhelper->buildTable($postcollection); // imprime a tabela

$htmlhelper->createPreviousPageLink($postcollection); //cria o link para a próxima página

$htmlhelper->createNextPageLink($postcollection); //cria o link para a próxima página

E acabou. Não é legal isso?

Até a próxima!

16 Comentários:

[toninho]  ôpa. só agradecendo a iniciativa. tá me salvando e incentivando  [REPLY]

[danilo]  Valeu Toninho!  [REPLY]

[Thiago]  Isso ai Danilão ! Só não deixe agente esfriar !!! Quando vamos começar a codar ? Grande abraços !!!  [REPLY]

[danilo]  Oi Thiago! Olha, segura a onda, ainda demora um pouco, temos que definir muita coisa ainda! Mas esse é o caminho: pensar bastante antes de começar a codar, pra ter menos dores de cabeça depois! hehehe Grande Abraço!  [REPLY]

[Fabiano M]  É... bye bye php de rua. Muito bom, muito bom mesmo!!!   [REPLY]

[danilo]  Valeu Fabiano! Grande abraço.  [REPLY]

[Murilo Adriano]  Olá Danilo, primeiramente quero te parabenizar pelos artigos série que realmente estão ficando bons. E te dizer que estou fazendo um sistema para um site de anúncios de empresas com PHPOOP5 (saindo da marginalidade do "php de rua") e vi no parte 16 que não era só eu quem tinha a seguinte dúvida: de quem é a responsabilidade de buscar? (o $tenista->findAll() lembra?). No meu caso a classe é uma empresa e eu simplesmente não concordava na idéia de uma empresa buscar outras empresas(e foi procurando uma solução cabível que achei seu blog, aproveitei e li a série toda). A solução que...  [REPLY]

[danilo]  Oi Murilo! Pois é exatamente isso: nesse desenho você teria uma EmpresaCollection que colecionaria EmpresaModelos. Eu só não modelaria usando EmpresaBusca: colocaria uma função "load" na colecao, assim como já temos no Modelo. Você faria, então, EmpresaCollection->load() pra buscar no banco, assim como vc já faz EmpresaModelo->load(). Entendeu? Grande Abraço!  [REPLY]

[danilo]  É um problema de semantica chato esse! É por isso que eu prefiro usar "load", ou "carregar", pois estamos "preenchendo" o modelo com dados... então, talvez ficasse melhor usar EmpresaCollection->loadByCondition("NumeroEmpregados >100") e EmpresaModelo->loadById(35). Aqui estamos dizendo "Carregue uma coleção com todas as empresas cujo numero de empregados seja maior que 100". Deu pra entender? Abraço grande.   [REPLY]

[Murilo Adriano]  Olá novamente Danilo. Obrigado pela resposta tão rápida! Olhe só, ontem eu tinha comentado apenas imaginando como seria a implementação. Após comentar eu fui modelar o UML para ter uma idéia de como as classes irão ficar dispostas. Resultado: bani o EmpresaBusca e implementei as buscas no EmpresaModelo mesmo. Construí também uma classe chamada EmpresaLista (que é mais ou menos uma collection de empresas com um modelo de iterator bastante simples). Olhe só minha idéia: $modelo = new EmpresaModelo; $lista = $modelo->buscarPorCategoria(5); //Retorna um objeto do tipo EmpresaLista com...  [REPLY]

[danilo]  Oi Murilo, então esse é exatamente o padrão ActiveRecord... Minha questão com ele é que o modelo pode retornar uma lista de objetos ou um objeto... Mas é uma ótima implementação, se faz sentido pra você vá em frente! Vou fazer um novo post sobre isso pra tentar levar essa discussão pra frente. Abraço grande e obrigado!  [REPLY]

[danilo]  Acho que a diferença que estou propondo é que as funções nunca retornam objetos, só TRUE or FALSE. A função $model->loadById(5) retornaria TRUE se os dados do registro com id 5 fossem carregados corretamente no objeto. Assim sempre estamos operando no próprio objeto, e não passando objetos por aí... Sacou?  [REPLY]

[Murilo Adriano]  Então, será sempre uma lista. Mesmo se for com 1 ou zero elementos será uma lista. Assinei seu feed e vou aguardar ansiosamente os próximos posts. Valeu.  [REPLY]

[danilo]  Entendo, Murilo. Este realmente é o padrão do Active Record, talvez com a diferença de retornar, no caso do Cake, um array, e não um objeto da classe lista. O que não gosto é justamente o fato de vc pedir para o modelo uma lista. Vou escrever mais sobre isso. Grande Abraço e boa sorte!  [REPLY]

[Junio]  Legal?-Excelente a idéia, principalmente sua forma didática de transmitir conhecimento.Paz e saúde para ti!  [REPLY]

[Friv Games]  thanks all for sharing  [LINK]  [REPLY]

2007-06-20 15:11:27

Dica: codeshow em agosto

O Diego, grande chapa lá da Visie, avisa que no dia 17 de agosto vai rolar Codeshow. Nesse evento super inovador os meus amigos e criadores do Tableless vão construir uma aplicação web de cabo a rabo, detalhando cada etapa, mostrando o que realmente interessa na prática. Vale a pena conferir!

Veja os detalhes em:

http://visie.com.br/codeshow

2007-06-05 04:32:35
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 16)

Para ver os artigos anteriores desta série, clique aqui.

Olá amigos, estamos de volta. Semana de muitas emoções pra quem gosta de Tênis: Roland Garros é sempre uma festa. Este seu humilde autor confessa que, em sua tenra juventude, chegou a disputar alguns torneios; Lembro-me claramente de ganhar uma cesta com catchup, mostarda, mini-pepinos, azeitonas e mais alguns outros enlatados da empresa patrocinadora de um dos torneios de que participei. Minha melhor colocação, 3o colocado. Pensando bem, acho que fiz bem em não seguir a carreira.

Mas, deixando Jankovics, Vaidisovas, Sharapovas e Ivanovics de lado por alguns momentos, quero voltar nossa atenção novamente para os modelos do MVC. Muito bem amigos, hoje vamos tentar definir o que todos os nossos modelos devem minimamente fazer. Nosso objetivo hoje é listar os métodos da nossa classe Model, a classe base para todos os modelos que criarmos. Não tenho a pretensão de fazer um estudo teórico detalhado; dentro de nossa filosofia PHP de Rua® o que estamos buscando é somente o básico, o essencial.

Então, caros amigos, quais seriam estas funções essenciais, compartilhadas por todos os modelos que vamos criar? Lembrando nossas conversas anteriores, o modelo é um ajudante, uma classe que só existe para ler e gravar informações em nosso banco de dados, e sua estrutura de dados será sempre mapeada à estrutura de uma tabela que existe no BD.

Por exemplo, se criarmos um modelo Tenista, que possua as variáveis $id$nome$ranking, é certo que teremos uma tabela que guardará esta informação, que pra facilitar (nomes têm poder, lembrem-se disso) chamaremos de Tenistas. Essa tabela terá, minimamente, os campos id, nome e ranking. Sacou?

Estamos, de fato, mapeando uma classe à uma tabela, e instâncias da classe a registros da tabela. Essa técnica é chamada de ORM, Object-Relational Mapping. A coisa é mais interessante ainda: como estamos falando de OOP, em algum de nossos métodos vamos bolar um jeito de fazer esse mapeamento da forma mais simples e genérica possível, pra que não tenhamos que criar queries sql específicas para cada novo modelo que criamos.

Vejam a beleza dessa solução, caros leitores! Quando terminarmos a classe Model, qualquer novo objeto de uma classe que a estenda poderá ser salvo ou lido direto do banco sem precisar que nós façamos uma query específica!

Sendo assim, creio que já ficou bastante claro que precisamos das funções save() e load() em nosso modelo-base. A gente não precisa gastar muitos neurônios pra perceber que também precisamos da função delete() além da função __construct() que todos as classes já nos oferecem para criar novos objetos.

Nesse ponto começa uma saudável polêmica: onde devem ficar as funções para buscar objetos? Se eu quiser pegar todas as tenistas que estão no banco, pra quem eu devo pedir? Em alguns frameworks MVC, como o CakePHP, estas funções ficam na classe Model mesmo. Então vocë encontra funções como findAll(), findById(), findByName() e coisas assim, dentro da classe Model.

Pra ser muito sincero, eu acho meio esquisito pedir pra uma tenista buscar as outras tenistas. É assim que fica no CakePHP:

$tenista = new Tenista();

$todasastenistas = $tenista->findAll();

Cara, eu acho isso muito esquisito. A semantica da coisa, sabe? Acho que é um pouco de preciosismo, eu sei. Adoro o Cake, estou realmente impressionado com sua facilidade de uso, mas acho o design da classe model um pouco confusa.

Outros frameworks e ORMs fazem diferente. Criam uma classe só pra fazer isso. Um gnomo, lembram-se? Então, o cara faz o seguinte:

$gnomo = new DbManager();

$todasastenistas = $gnomo->findAll('tenista');

 Nesse caso, a classe DbManager tem todos os tais métodos pra retornar arrays buscados no banco. Hm. Acho um pouco melhor, mas ainda acho estranho não termos uma classe mais esperta, que possamos estender para criar comportamentos diferentes caso a gente precise. A resposta está próxima, caros amigos. Mas não posso perder a chance de continuar no próximo capítulo, não é mesmo?

Até a próxima.

16 Comentários:

[Walter]  O primeiro padrão é o Active Record, enquanto o segundo é o DataMapper(?). Confesso que a princípio a semântica do primeiro parece meio esquisita mesmo. Ainda não sei por qual optar, embora esteja namorando o SQL Alchemy (Python)  [REPLY]

[Emiliano ESB]  Maravilha!!! Também partilho da mesma opinião   [REPLY]

[Renan Reis]  Os artigos estão ótimos, finalmente alguém resolveu escrever sobre código de qualidade com PHP. Parabéns pela série!  [REPLY]

[Renato Elias]  Engraçado você postar sobre tenista, roland garros, bem quando eu acabei de terminar um projeto de scout, veja se vc gosta: http://www.datatennis.com foi feito em phpontrax, bem parecido com o cake que você cita, abraços  [REPLY]

[Thiago]  A série realmente está muito boa, pena é o grande intervalo entre os posts :( Grandes abraços e sucesso ... você merece !!  [REPLY]

[Filipe Boldo]  Ótima epopéia cavaleiresca, com direito a gnome e tudo (rs). Está sendo muito agradável e proveitoso ler esses artigos, parabéns mesmo! Abraço, até mais!  [REPLY]

[Fabiano M.]  Muito bom, continuo acompanhando. Eu estou iniciando no mundo framework com cakePHP, mais jah olhei outros. Falando sobre OOP, na parte sobre interface, kara eu acho muito confuso ainda interfaces, tanta volta para um resultado. Estou ainda meio perdido em compreender interface. Mas agradeço por poder aprender mais por aqui no seu blog. Valeu!!!  [REPLY]

[Pagelkopf]  Parabens pela série, lendo ela eu descobri porque meu ultimo projeto em PHP não funcionou, eu sentei e comecei a digitar sem o minimo de planejamento. Ta sendo realmente muito proveitosos seus artigo. No final vai dar até pra fazer um livro.  [REPLY]

[Fabiano M.]  Tenho acompanhado o blog DigitalMinds, muito bem explicado os conceitos. Moro no Rio, como até hoje não encontrei nenhum curso PHP bom, tenho aprendido na web muito do que sei hoje. Iniciando em OOP, DigitalMinds sem dúvidas é um dos melhores conteúdos online. Como estamos no mundo dos 64Bits, bem q a 32Bits poderia ser 32²Bits. :) Valeu, abraço!  [REPLY]

[LuRsT]  Estou a adorar sua serie cara, continue assim, graças a ela eu começei a estudar OOP em php. Abraço cá de Portugal ;)  [REPLY]

[danilo]  Valeu Walter! Abraço grande!  [REPLY]

[Luiz]  Opa, to ansioso para continuar a aprender! Cadê o resto!? hehe, ok, ok, sei que o tempo é curto! Obrigado por gastar um pouco compartilhando conhecimento! Abraços.  [REPLY]

[danilo]  Valeu Luis! O próximo artigo já tá quase pronto! Aguarde só mais um pouco! hehehe Grande abraço.  [REPLY]

[danilo]  Um grande abraço pra os gajos daí Lurst!  [REPLY]

[danilo]  Fabiano, interface é um contrato. Se uma classe utiliza uma determinada interface, ela é obrigada a ter aquelas funcões. E isso é muito, muito importante, pq se vc sabe que uma classe implementa uma determinada interface, você já sabe do que ela é capaz sem precisar saber como ela faz. Faz sentido? Grande abraço!

[Fabiano]  Oq houve com os comentários???   [REPLY]

2007-05-02 05:25:23
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 15)

Para ver os artigos anteriores desta série, clique aqui.

Olá meus caros. De volta. "Que você viva em tempos interessantes". Esta antiga maldição chinesa (!?) explica muito bem a sensação que toma conta deste seu humilde autor. Muito a fazer, muito a compreender, pouco tempo. Desculpas à parte, retorno à esta série para falar mais um pouco sobre Exceptions, um conceito fundamental que talvez ajude alguns de vocês a poupar um tanto desse tão precioso tempo; afinal, como bem disse Benjamin Franklin, o tempo perdido nunca mais será encontrado.

Muito bem, senhores, o que faz nossas Exceptions tão especiais? Para entender, precisamos pensar na forma como gerenciamos erros em nossas aplicações. Ou melhor, precisamos pensar na forma como lidamos com erros em nossas vidas. Talvez isso complique as coisas, mas falar sobre a vida sempre é mais interessante, não?

Joãozinho trabalha numa fábrica de automóveis. (é um exemplo, ok? Não quero entrar em discussões morais sobre trabalho infantil, capitalismo, revolução industrial, etc e tal. Tudo bem, é um exemplo estúpido. Podemos ir em frente?) Joãozinho aperta parafusos na linha de montagem, e sua supervisora é a Mariazinha. O chefe da Mariazinha é o Aristides, que fica lá em cima no escritório.

Bom, você sabe que numa fábrica todo tipo de problema pode acontecer. Alguém pode esquecer de mandar o parafuso para o Joãozinho, o parafuso que foi mandado pode estar com defeito, o próprio Joãozinho pode vacilar e não apertar o parafuso... Sabe lá o que pode acontecer. Diante desse cenário, como você faz para gerenciar todos os erros que podem acontecer? Dá uma lista de IFs infinita para o Joãozinho para que ele mesmo resolva tudo? "Se o parafuso estiver com defeito, corra até a sala do Aristides e aperte o botão para parar as máquinas". "Se você dormir no ponto e não apertar o parafuso, corra até a sala do Aristides e aperte o botão para parar as máquinas", e assim por diante? Hmm... não sei se vocês estão entendendo, mas já está dando preguiça só de pensar em fazer essa lista. E a preguiça, amigos, é o nosso sentido-aranha, é nosso superpoder psiônico que avisa quando alguma coisa está esquisita no ar. Imagina se a Mariazinha tiver 50 funcionários sob sua supervisão, vai ter gente correndo pra tudo o que é lado, a sala do Aristides vai ficar totalmente destruída, e produção que é bom nada.

Apresento-lhes, então, as Exceptions, e seus companheiros inseparáveis Try, Catch e Throw. Vamos olhar para o problema acima de um outro ângulo. Imagine se a gente pudesse dizer o seguinte pro pessoal da fábrica:

Olha, Joãozinho, você vai tentar apertar o parafuso. Qualquer problema que você tiver, escreve num papel, amassa até virar uma bola e arremessa pra Mariazinha. A Mariazinha pega a bola, e se não for um problema que ela saiba resolver, amassa de novo e arremessa pro Aristides. Se ele também não souber resolver, a gente para a linha de produção na hora.

Tentar... Pegar... Arremessar... Vocês... sacaram? (se você viu Warriors, na versão legendada, está rolando no chão de rir nesse momento). [Agora relendo esse artigo me parece claro que o criador deste conceito gostava muito de baseball, ou cricket] Se vocês ainda não sacaram, vamos escrever um pouco de (pseudo)código:

/*
* Created on 02/05/2007
*
*/

class Apertador {

    function apertarParafuso(){

        echo "parafuso apertado!";

    }

    function oopa($descricao){

        echo "Apertador: oopa! Deu pau! Segura aí supervisor!";
        throw new Exception($descricao); // amassa e joga a bolinha pra cima!

    }

}



class Supervisor{

    function mandaApertar(){

        try {

            $joaozinho = new Apertador();

            $joaozinho->apertarParafuso();

            $joaozinho->oopa("Parafuso com defeito");

        }

        catch (Exception $e){
            echo "Supervisor: xi! Exception! Não sei o que fazer! Toma aí chefe!";
            throw $e; // peguei a bolinha, mas não sei o que fazer com ela... manda pra cima!

        }

    }

}



class Chefe{

    function vamosTrabalhar(){

        try {

        $mariazinha = new Supervisor();

        $mariazinha->mandaApertar();

        } catch (Exception $e) {
            
            echo "Chefe: Para tudo! Quero saber o que aconteceu aqui!"
		echo $e;
            die("Parando as máquinas!");

        }

    }

}


// Muito bem, agora a gente contrata o Aristides:


$aristides = new Chefe();

$aristides->vamosTrabalhar();

?>

 

Rode esse script e veja o resultado. Que interessante! Basta o Joãozinho mandar o erro pra cima que todos na cadeia (as classes que chamam a classe Apertador, neste caso) recebam aquela Exception, graças ao uso do comando Try. Tudo o que roda dentro de um bloco Try é monitorado, e caso uma Exception seja "jogada" ou "arremessada" pra cima o controle vai para o bloco Catch imediatamente abaixo.

Perceba também que ao gerarmos uma Exception, ela já é criada com um monte de informações importantes automaticamente: em qual arquivo e linha que o erro aconteceu, um Trace completo passando por todo o código até o Catch que "pegou" aquela Exception e muito mais. Para ver um bom resumo, basta mandar imprimir a variável que contém a Exception; mas você também pode acessar as propriedades do objeto separadamente usando métodos como $e->getMessage(), $e->getLine(), $e->getFile() entre outras. Não é bom isso?

Com as exceptions nosso trabalho passa a ser somente colocar os Throws nos locais onde erros acontecem, deixando o tratamento desses erros para classes mais acima na hierarquia. Mesmo que você não trate estas Exceptions com blocos Try/Catch a coisa funciona: você pode deixar a exception subir na hierarquia até chegar ao topo, pois toda exception que chega ao topo sem ser "pega" gera um erro fatal. Então, caros amigos, vocês podem trabalhar inicialmente só colocando throws no código, e, ao final, refinar o tratamento distribuindo blocos try/catch pelas classes da hierarquia. Muito bonito.

Mas tem uma coisa ainda mais bonita. Sim, amigos, a classe Exception pode ser estendida. É uma classe como outra qualquer. Isso quer dizer que no nosso caso você poderia criar a exception DefeitoParafusoException, que já conteria a mensagem de erro e mais outras informações que você necessita sem precisar nunca mais digitar. Exemplo:

 

class DefeitoParafusoException extends Exception {
     function __construct(){
        parent::__construct();
        $this->message = "Defeito no parafuso!";
    } 
} 

 

Sacaram? Agora toda vez que você criar uma nova Exception do tipo DefeitoParafusoException a mensagem já será colocada por default na variável $this->message da Exception em questão! Imagine o que você pode fazer com isso. Mas ainda tem mais. Imagine agora que você não quer parar a produção simplesmente por causa de um parafuso com defeito. Muito bem, então vamos fazer com que os Supervisores comecem a "Pegar" este tipo de Exception para não incomodar o chefe:

 

 class Supervisor{

    function mandaApertar(){

        try {

            $joaozinho = new Apertador();

            $joaozinho->apertarParafuso();

            $joaozinho->oopa("Parafuso com defeito");

        }

        catch (DefeitoParafusoException $e){
            echo "Supervisor: é só um maldito parafusinho, diabos! Continuem!";
        }
        
        catch (Exception $e){
            echo "Supervisor: xi! Exception! Não sei o que fazer! Toma aí chefe!";
            throw $e; // peguei a bolinha, mas não sei o que fazer com ela... manda pra cima!

        }

    }

}

 

pra ver isso funcionando, precisamos alterar a função Apertador::oopa() para mandar uma DefeitoParafusoException:

 

 function oopa(){

        echo "Apertador: oopa! Deu pau! Segura aí supervisor!";
        throw new DefeitoParafusoException(); // não precisa mais da descrição...
} 

 

E pronto. Vocês perceberam que podemos utilizar vários blocos de catch um embaixo do outro? Essa é a beleza desta solução. Podemos começar com um tratamento de erros bem genérico, e depois ir especializando com novas subclasses, sempre lembrando de colocar as subclasses mais específicas, neste caso a DefeitoParafusoException nos blocos anteriores, deixando o catch genérico (Exception $e) por último.

Por hoje é só, pessoal, dúvidas, reclamações, elogios e doações são bem-vindas. Grande abraço a todos.

 

6 Comentários:

[Emiliano ESB]  Dúvidas: N/A; Reclamações: N/A; Elogios: Excepcional trabalho, nobre Danilo; Doação: Opa! qual conta?  [REPLY]

[danilo]  Muito obrigado, Emiliano! Fico emocionado em saber que tem alguém realmente disposto a ajudar! Um dos meus sonhos é transformar essa série em um e-book muito bem feito, acho que só aí me sentiria bem em aceitar sua doação! hehehe Grande Abraço!

[Emiliano ESB]  Cara, tenha certeza de que com a linguagem que utiliza nesta série, você pode sonhar ainda mais alto! Mas um ebook ja é um ótimo próximo passo! :)  [REPLY]

[Fabiano M.]  Muito bom, estou acompanhando desde o início.

[Lucas Vasconcelos]  Diego, a série está fantástica! A metáfora que você usou para exemplificar o uso de exceptions não poderia ser melhor. Parabens!  [REPLY]

[leo]  Mais um post muito bom,, gosto muito do seu trabalho é como ler um livro estilo senhor dos aneis sobre poo... continue assim  [REPLY]

2007-04-03 17:05:26

Mais sobre a EMI e DRM: Steve Jobs escolheu aumentar o preço

Sim, amigos: segundo o site Gizmodo e de acordo com a EMI, foi a mesma EMI quem procurou a Apple para oferecer músicas sem DRM, e não sugeriu preço nem formato. A Apple decidiu cobrar um premium e aumentar a qualidade. Acho que não fui muito justo com a EMI quando agradeci a Mr. Jobs... Obrigado, EMI. Steve, você precisa baixar esse preço e oferecer a versão mp3 normal sem DRM. Ou tudo o que você falou vai por água abaixo.

4 Comentários:

[Felipe Cepriano]  Eu acho que depois de um tempo as músicas de U$$0.99 também não terão DRM. Acho que agora é só pra testar o mercado. Quanto a MP3, acho inutil. A qualidade do AAC é muito melhor e ele é um padrão. Se eu precisar de MP3 é só converter.  [REPLY]

[Henrique]  O Jobs gosta de parecer alternativinho e bom moço, por isso aparece na imprensa falando mal de DRM, enquanto na verdade pouco importa desde que esteja entrando dinheiro em caixa e os fanboys continuem comprando Macs. Concordam?  [REPLY]

[danilo]  Ô Henrique, também não precisa esculachar o Jobs... hehehe ele é um cara fundamental pra essa indústria, focado em inovação... mesmo que algumas vezes ele entregue mais hype que qualquer outra coisa... Grande Abraço!  [REPLY]

[cachopo]  E a arte cavalheiresca da programação orientada a objeto? =~  [REPLY]

2007-04-02 09:05:54

Um pequeno passo para a EMI, um grande passo para a humanidade...

EMI anuncia a venda de músicas sem DRM, com mais qualidade, por um preço premium. Steve Jobs, mais uma vez, à frente do seu tempo.

 Via Meio Bit 

2 Comentários:

[Eduardo Marques]  Bom, né?  [REPLY]

[silici0]  Você coda com Mac ? Gostaria de saber qual é a esperiência com MAC e PHP....  [REPLY]

2007-03-27 08:17:10
tags: 

BarcampSP: valeu

Gostei muito do BarcampSP. A idéia é legal: sair daquele velho esquema tradicional das palestras e conferências, abrindo a participação para todos os presentes. Claro que esse modelo depende das pessoas que estão ali, o que às vezes pode decepcionar uns e outros; Mas eu gostei, e boto fé que a coisa vai continuar crescendo. 

Veja mais sobre o evento aqui e aqui.

7 Comentários:

[Marco Gomes]  Também achei super fera! Foi bom demais trocar idéia com tanta gente fera, tenho certeza que o evento pode crescer muito.  [LINK]  [REPLY]

[Tarcísio Sassara]  agora posso dizer que conheci o cara que fala de gnomos como eles fossem velhos amigos.  [REPLY]

[danilo]  Grande Tarcísio! Prazer conhecer você, cara! Grande Abraço!  [REPLY]

[Sergio Lima]  Que tal um Barcamp -RJ ? Ia ser legal!  [REPLY]

[Mário]  Graaande Danilo! Foi um prazer conhecer você, rapá! Muito sucesso por aí!!  [REPLY]

[danilo]  Valeu Mário! Igualmente, grande abraço!  [REPLY]

[marcelo toscano]  Muito bom mesmo ... principalmente sobre startups .... gostei muito  [REPLY]

2007-03-26 08:38:40
tags: 

32Bits™ contrata Estagiários

Olá pessoal. Minha empresa, a 32Bits™ Criações Digitais está crescendo mais um pouquinho, e estamos contratando dois estagiários com conhecimentos de (x)HTML e css. O salário é legal, damos vale-transporte e o horário é super flexível. Nossas exigências são simples: tem que ser esperto, e tem que gostar de aprender coisas novas. Html e Css são os conhecimentos básicos, e outros, especialmente Actionscript, são muito desejáveis. 

Currículos para contato[arroba]32bits.com.br aos meus cuidados, ok? Também é importante ter algum trabalho online pra gente dar uma olhadinha no código.

 

P.S. Nossa empresa fica no centro do Rio, ao lado do metrô Cinelândia e do cinema Odeon. 

6 Comentários:

[thiago]  Em que cidade e estado se situa a Empresa 32bits ?  [REPLY]

[danilo]  Oi Thiago, estamos no Rio de Janeiro, mais especificamente no Centro. Grande Abraço!  [REPLY]

[silici0]  e o MVC ? go`! go! Que to aprendendo coda com o CakePHP.. :P  [LINK]  [REPLY]

[André Valongueiro]  Adoraria estar morando no RJ e que as vagas não fossem para estagiários, mas sim para profissionais. =] Penso muito em mudar de estado, começar vida nova e ser feliz. Vou ficar de olho nas oportunidades que surgirem na 32Bits. Continue com a divulgação de oportunidade por aqui, Danilo! Muito obrigado e um grande abraço!   [REPLY]

[Diogo Menezes]  Olá como entro em contato com a empresa ? abraços   [REPLY]

[danilo]  Oi Diego, pode mandar um email para o endereço que está acima no texto, ok? Grande Abraço!  [REPLY]

2007-03-16 10:11:23
tags: 

Mais uma jóia da Web 2.0: Gliffy

Gliffy é uma ferramenta web para desenho de diagramas e gráficos de forma colaborativa. Muito interessante. Confira no endereço http://www.gliffy.com.

2 Comentários:

[joaojose]  Muito legal!! Isso vai ser uma grande ferramenta para desenvolvimento! A web esta revlucionando  [REPLY]

[Neto]  Conheço e achei ele bem interessante!  [REPLY]

2007-03-15 03:25:34
tags: 

Encontro vocês no BarCamp Sampa

É isso aí pessoal, já vi que alguns de vocês também vão estar em Sampa no próximo fim-de-semana, então não vamos deixar de nos encontrar! Já fiz algumas sugestões de temas no grupo, tem muita gente boa e assunto pra falar. 

3 Comentários:

[Jean]  a gente se ve la entao... ou nao ja que eu nao faco a menor ideia de como você é! :D  [REPLY]

[Tarcísio Sassara]  Espero que o evento seja construtivo. Nos vemos lá, se isso for possivel!  [REPLY]

[marcelo toscano]  legal você ir agente se vê lá então.  [REPLY]

2007-03-04 03:21:08
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 14)

Para ver os artigos anteriores desta série, clique aqui.

Estamos de volta, caríssimos leitores. Mais uma vez agradeço pelos comentários e emails. No último artigo nós fechamos o conceito de controllers, e vimos alguns exemplos práticos de como usá-los. Nos artigos anteriores, definimos as outras partes do MVC, models e views (ou templates). Tudo isso sem escrever uma só linha de código.

Bem, depois de tanto tempo sem digitar um único if, alguns de vocês começam a manifestar uma patologia cientificamente conhecida como "fome de código", ou "Síndrome da abstinência de programação". Os sintomas são variados: suor nas mãos, digitação de códigos procedurais aleatórios, criação randômica de scripts, e, nos estágios mais avançados da doença, envio de emails e comentários para o site deste autor bradando palavras de ordem "Código! Queremos código!".

Para todos que estão desesperados para colocar a mão na massa, uma pequena história Zen talvez ajude a acalmar o espírito:

"Um monge perguntou a seu mestre:

– Mestre, quanto tempo vai demorar para que eu atinja a iluminação?

O mestre respondeu:

– Dez anos.

O discípulo respondeu, agitado:

– Mas e se eu trabalhar duro, estudar todos os sutras, praticar dez horas por dia, quanto tempo vai demorar?

– Nesse caso, respondeu o mestre, vai levar 20 anos."

Se existe uma coisa que é fundamental em OOP é paciência. É praticamente impossível fazer alguma coisa que funcione bem usando essa filosofia de trabalho simplesmente abrindo o seu editor e digitando código. Paciência, esse é o caminho.

Mas é necessário desenhar TODO o sistema, cada detalhe, cada vírgula? Certamente não. Mas como saber qual é o momento de parar de desenhar e começar a programar de fato? Ah, jovem monge, nós saberemos. Acredite, nós saberemos. Chegará a hora em que não teremos mais dúvidas, que vamos olhar nosso desenho do sistema e vamos dizer "é, acho que agora já dá pra começar". Ao longo dos anos muitas metodologias e processos foram criadas para tentar desvendar este mistério. Mas só o próprio desenvolvedor, em seu íntimo, sabe quando está pronto. Por mais documentação que um sistema já possua, por mais discussões que se tenha, por mais diagramas e casos de uso e o que for, sempre existe o momento da iluminação, quando tudo aquilo a que fomos submetidos simplesmente "clica" e começa a fazer sentido. Todas as nossas questões sobre como o sistema funciona começam a ser respondidas claramente, e não há mais nenhuma pulga atrás de nossas orelhas.

É, talvez essa seja uma boa definição: a hora de começar a programar é a hora em que não encontramos nenhuma pulga atrás de nossas orelhas. E nesse momento, ainda tenho algumas quando penso em nosso Digitalminds Blogging Engine. Por exemplo: Já sabemos quais são as classes principais que vamos usar, e como vamos usá-las. Mas ainda não sabemos quais métodos e variáveis elas vão apresentar. Qual a vantagem de termos as superclasses Model, View e Controller se não encontrarmos métodos e variáveis que efetivamente facilitem nosso trabalho de criar um sistema? Isso, caros leitores, é precisamente o que vamos fazer nos próximos artigos. Mas ainda nesse artigo quero tentar responder a uma outra questão que está na minha cabeça: Será que não precisamos de mais nenhuma classe nessa história toda?

Bom, eu sempre costumo dizer que a preguiça é uma das minhas grandes virtudes; ela já me ajudou a resolver inúmeros problemas e a ganhar muito tempo pra fazer o que realmente importa na vida, ou seja, nada. De qualquer modo, o que quero dizer com isso é que sim, acredito que teremos algumas outras classes nos ajudando a fazer coisas repetitivas ou chatas demais.

A primeira coisa que me vem à cabeça é "o que fazemos se um erro acontecer?". Sim, amigos, erros vão acontecer, e nós precisamos estar prontos para lidar com eles de uma forma civilizada. E quem já escreveu um sistema qualquer em linguagem procedural sabe como é chato fazer tratamento de erros. São tantas possibilidades, tantas combinações de erros, tantos ifs e tantos switches que só os mais corajosos acabam fazendo tratamento de erro de uma forma realmente completa.

Mas os criadores da programação orientada a objeto, em sua infinita sabedoria, olharam para nós mortais com piedade e com o som de mil trombetas bradaram "Que se criem as Exceptions!" E então, o mar turbulento do tratamento de erros se abriu, e o povo programador pôde passar em paz. Os criadores do PHP, em sua razoável e confusa sabedoria, olharam para nós, os loucos que usam essa linguagem idiossincrática, e também bradaram "Que se criem as Exceptions em PHP5!". E em um segundo, tudo o que já foi feito em PHP para tratamento de erros se tornou obsoleto e bizarro.

O conceito de Exception, senhores, é uma das coisas mais impressionantes que já foram criadas. E, como todo conceito mais complexo de OOP, é muito difícil de entender, justamente por ser uma coisa relativamente simples. Entendeu? Certamente não. Então fique ligado e não perca o próximo artigo.

Grande abraço pra todo mundo.

 

11 Comentários:

[ms*]  Legal :-) Quem não programa ainda assim pode levar a lição da paciência...  [REPLY]

[Thiago]  Paciencia .... paciencia ... to louco pra colocar esses gnomos pra trabalhar ... mas ... tenhamos paciencia ...  [REPLY]

[Emiliano ESB]  Malditos Erros!!! Que assim seja Senhor dos Gnomos! 10 anos ta bom pra mim!  [REPLY]

[Cristóferson Bueno]  Opa Danilo, blz? Cara como sempre sua saga Tolkie do programação está ótima, mas em seu mar de conhecimento e algumas palávras rebuscadas você escorregou : ) idiosincrático é com SS rsrs idiossincrático. E sim, PHP é idiossincrático, mas eu gosto :D  [REPLY]

[Cristóferson Bueno]  E como sempre quem atira pedra no telhado dos outros tem o próprio telhado feito de vidro :) eheheh como PHP é uma linguagem portanto, PHP não é idiossincrático e sim idiossincrática mas com SS rsrs... até!  [REPLY]

[danilo]  Valeu pela revisão Cristóferson! Grande abraço!  [REPLY]

[Thiago]  Danilão, não esqueceu dos nossos Gnomos guardados em algum lugar não né ?  [REPLY]

[Filipe]  Pô cara, cadê a parte 15??? É o melhor estudo de OOP que eu já vi! ;-)  [LINK]  [REPLY]

[Filipe]  Pô cara, cadê a parte 15??? É o melhor estudo de OOP que eu já vi! ;-)  [LINK]  [REPLY]

[danilo]  Ô Pessoal, desculpa, é realmente falta de tempo... Mas assim que tiver um tempinho prometo que continua! Grande Abraço a todos!  [REPLY]

[Cyro]  Dude! we are lost... !!!! Cara, cadê a prox parte...??  [REPLY]

2007-02-26 07:06:40
tags: 

Produção Web: Subverta sua forma de trabalhar com arquivos

Vamos fazer um teste rápido: você montou uma página html muito legal, o css já está fechado, tudo está validando, acessível, etc. e tal. Nesse exato momento, o seu cliente liga e faz um pedido infame:    

— Olha, vamos precisar colocar esses 15 logos na página, mas precisamos que você coloque um em cada parágrafo, ok?

Bom profissional que você é, aceita resoluto a solicitação do cliente e insere uma a uma as imagens na página, transformando a sua linda criação em uma quase-árvore-de-natal feita de símbolos e logotipos que não têm absolutamente nada a ver uns com os outros. Pra que a coisa fique minimamente interessante, você perde mais 45 minutos ajustando o css, mexendo no tamanho das imagens, enfim, fazendo o rejunte e o acabamento.

Considerações estéticas à parte, a página eventualmente fica pronta e você pede a aprovação do cliente. Então, caro amigo, o inesperado acontece:

— Olha, ficou poluído demais. Pode voltar atrás.

O que?! Voltar atrás?

É aqui que entra nosso teste: nessa momento de tensão, caro leitor, o que você faria:

Opção 1: aceita, emburrado, e recomeça de imediato a corrigir o código, removendo uma a uma cada modificação feita. Depois, precisa revisar tudo novamente pra ver ser não ficou nenhum erro, se o layout está igual ao original (mas peraí, eu detonei o original!)

Tempo total: 30 minutos.

Opção 2: aceita, levemente aborrecido, e começa a procurar os arquivos de backup que você havia feito antes de alterar os arquivos. Depois, precisa revisar tudo novamente pra ver se realmente tudo está certo, se aquele “salvar como” foi feito com todas as últimas alterações, se aquela modificação de texto que a menina pediu por telefone estava incluída.

Tempo total: 7 minutos.

Opção 3: aceita, com um sorriso cativante no rosto, e clica com o botão direito do mouse no ítem “TortoiseSVN->Exibir histórico”, escolhe a revisão anterior, e clica com o botão direito novamente “Reverter para essa revisão”. Pronto.

Tempo total: 5 segundos.

Muito bem, meu amigo, minha amiga, o que este teste mostra para nós? Se você respondeu opção 1 ou opção 2 você precisa de um sistema de controle de versão. Fato.

Um sistema de controle de versão guarda diferentes versões de um mesmo documento em um repositório e é capaz de fazer operações com elas. Assim, é possível não só voltar a uma versão anterior de um arquivo instantaneamente, mas também comparar e ver exatamente as diferenças entre duas versões, linha a linha. Mais que isso, duas ou mais pessoas podem trabalhar ao mesmo tempo em um arquivo texto, combinando as partes alteradas quando terminarem. Não é feitiçaria, é tecnologia!

Existem várias soluções para controle de versão disponíveis no mercado. Uma das mais populares é a chamada Subversion, ou simplesmente svn.

O Subversion usa uma interface de linha de comando, mas graças à bondade da comunidade open-source já foi desenvolvida uma interface gráfica para Windows chamada TortoiseSVN que é bem mais fácil de usar. Faça o download da aplicação e da tradução para o português brasileiro no endereço

http://tortoisesvn.net/downloads

Observação: Para quem usa mac, existe o SvnX. É um pouco confuso, mas talvez ajude:

http://www.apple.com/downloads/macosx/development_tools/svnx.html

Depois de instalar o TortoiseSVN (será necessário reiniciar o Windows), você já pode criar seu primeiro repositório:

- crie uma pasta nova para conter seu repositório

- clique com o botão direito do mouse nessa pasta e escolha “TortoiseSVN->Criar repositório aqui”.

Pronto, já temos um repositório. Você não vai trabalhar nessa pasta: os repositórios svn guardam os arquivos num formato proprietário que não pode ser usado; Para trabalhar, é preciso fazer um “checkout” do repositório em outra pasta, ou, em português, “Obter” os arquivos do repositório:

- crie uma pasta para guardar seus arquivos de trabalho;

- clique com o botão direito e escolha “SVN Obter”

- Agora é necessário digitar no campo “URL do Repositório” a url do repositório que você criou. Como trata-se de um folder no sistema de arquivos, use o prefixo file:/// antes do caminho da pasta. Exemplo: file:///C:meurepositorio

- clique OK

Pronto. A partir de agora, os arquivos desta pasta poderão ser “Submetidos” clicando com o botão direito sobre ela e selecionando “TortoiseSVN->Submeter” . Uma janela se abrirá e você vai poder selecionar os arquivos que deseja submeter.

Dica importante: nunca apague ou renomeie um arquivo obtido de um repositório subversion pelo Windows; sempre use o menu do TortoiseSVN. Quando isso acontece, o banco de dados interno do subversion fica perdidinho e você pode ter algumas surpresas.

Para saber mais não deixe de ler o livro “Controle de Versão com Subversion”, que já está parcialmente traduzido para o português no endereço

http://svnbook.red-bean.com/

Nos próximos posts da série, vou mostrar como usar um repositório online do Dreamhost.

Divirtam-se!

11 Comentários:

[Rodrigo Maia]  Muito bom, vou novamente fazer os testes com esse software. A primeira vez que entrei em contato com ele nem sabia do que se tratava. Estou aguardando o uso dos servers da dreamhost. t+  [LINK]  [REPLY]

[Felipe Tonello]  Estou ancioso para saber usar o svn pelo Dreamhost. Parabéns Danilo, continue assim! Abraços  [REPLY]

[Renato]  Cara, muito legal essa dica, já aguardo ansioso o do Dreamhost, abração.  [REPLY]

[Andre]  se você pudesse comentar alguma coisa sobre como o controle de versão trabalha com multi-usuários em rede, seria bastante interessante. valeuz  [REPLY]

[Rozen]  Esse Subversion serve pra qualquer tipo de arquivo, tipo, um arquivo do Flash ou CorelDraw?  [REPLY]

[danilo]  Oi Rozen, funciona sim com todos os tipos de arquivos binários, mas, é claro, não é possível fazer comparações ou diffs. Mas ele guarda as versões dos arquivos sem problemas. Só cuidado porque para cada versão é uma cópia do arquivo... abraço  [REPLY]

[Rozen]  Valeu pela dica! Eu ainda faço controle de versão inteiramente manual, ou seja, fazendo uns backup de vez em quando, e isso sempre gera vacilos. Mas essa tarefa já vinha pedindo pra ser automatizada. Sua dica foi um achado para mim, pois não conhecia essa ferramenta. Vou aprender a usá-la. Agora, arquivos do Corel realmente é melhor fazer o controle manual, senão não vai ter HD que chegue :), mas do Flash e linguagem de programação, vai ser muito últil.  [REPLY]

[Anderson Sá]  Aqui na empresa onde eu trabalho, usamos o "CA Harvest Change Manager". Funciona bem, porém ele é bem conplexo, pois trabalha em rede com muitos acessos simultâneos. Inclusive, ele simula os abientes de "Desenvolvimento", "Aceite", "Piloto" e "Produção". Eu só recomendo se a empresa for grande e houver tempo para personalizá-lo.  [REPLY]

[Felipe Vaz]  Fala Danilo! Grande série! Só uma obs: quando vc versiona arquivos binários no SVN ele só envia as diferenças, sei lá como -- controlo desde IA a layouts de Photoshop com o SVN e os commits são minúsculos. Perfeito pra recuperar aquele layout em que seu estagiário deu um flatten.  [REPLY]

[danilo]  Valeu Felipe, tem razão! Abraço!  [REPLY]

[danilo]  Olá Rozen, o Felipe acaba de me corrigir: ele não duplica os arquivos não, somente as modificações binárias! Grande abraço!  [REPLY]

2007-02-12 16:05:01
tags: 

A web 3.0 chegou

http://pipes.yahoo.com. A nova web está chegando.

6 Comentários:

[Felipe]  será que a yahoo vai comecar a bater de frente com a google com esse novo produto? realmente sensasional o que é possível fazer com esse pipes, agora é esperar pra ver...   [REPLY]

[danilo]  Ah, Felipe... Brigar nunca é a saída mais simples. Eu apostaria muito mais em um casamento Yahoo! + Google... Grande abraço!  [REPLY]

[Thiago]  Cade os Gnomos ??  [REPLY]

[Thiago]  Desculpe, não vi o post abaixo pois ele naum apareceu no leitor de RSS :S  [REPLY]

[Luciana]  olá, não sou desenvolvedora, sou curiosa, pois trabalho com projetos web. Entrei no link deste post e gostei muito do que vi. Principalmente pq eu não entendi direito os pipes. Confesso tb que olhei rápido, mas vc, uma mente digital pensante e desenvolvedora, poderia me explicar melhor o que consiste, quais mudanças na web isso pode representar e sobretudo o pq vc esta denominado tal coisa como web3.0?  [REPLY]

[danilo]  Oi Luciana! Com sites como o Yahoo! Pipes, aplicações inteiras podem ser construídas por usuários comuns. A web 2.0 foi uma revolução na produção e consumo de conteúdo; acredito que a web 3.0 será uma revolução no desenvolvimento de aplicações... Prometo que ainda falo mais disso assim que tiver um tempo. Grande abraço e obrigado!

2007-02-12 13:34:41
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 13)

Para ver os artigos anteriores desta série, clique aqui.

Olá caros amigos caçadores de gnomos. Estamos de volta. Ainda precisamos fechar bem fechado este conceito fundamental chamado controller. Pegando do ponto onde paramos, que tal darmos alguns exemplos práticos de como nossos controllers vão funcionar? Gostou da idéia? Então entra aí e vamos lá.

Onde queremos chegar com toda essa conceituação? Bem, alguma coisa simples que torne o desenvolvimento e o uso de novas funcionalidades bem fácil. Vamos a alguns exemplos.

Primeiro, quero ver uma lista de posts simplesmente acessando a URL

http://meublog/posts/listar

Simples assim. Para criar um novo post:

http://meublog/posts/criar

Ah, e para ver um determinado post, o chamado permalink, quero acessar

http://meublog/posts/ver/xxxx

onde xxxx é o id do post, seja ele um texto ou um número.

Da mesma forma, para editar um post, quero acessar

http://meublog/posts/editar/xxxx

Para apagar um post

http://meublog/posts/apagar/xxxx

e assim por diante. Gostou? Muito bem, meu amigo, você acaba de definir o nosso primeiro controller, e suas primeiras funções ou métodos. Sim, veja a beleza da solução MVC, você está presenciando um mapeamento direto entre classes e métodos diretamente na url que o usuário acessa! Nas urls acima temos um controller chamado posts que tem 5 métodos: listar, criar, ver, editar e apagar.

Repare que ajuda bastante manter a coerência de linguagem - controllers normalmente são substantivos no plural (já que normalmente eles "controlam" dados de um modelo, no caso o controller "posts" lida com as informações do modelo "post") e os métodos normalmente são verbos. Alguns até chamam os métodos de "actions" ou ações, já que realmente nada mais são do que ações de fato. Capisce?

Bom, a essa altura já deve estar claro pra vocês (caso não esteja prometo que devolvo o dinheiro de volta) que já que temos dois modelos (posts e comentarios) precisamos, no mínimo, de dois gnomos: um pra cuidar de posts, e outro pra cuidar de comentários. Nasce, então, o controller "comentarios". Já sabem as urls e métodos que vamos ter que criar?

Por hoje é só. Até a próxima!

10 Comentários:

[Leandro]  É isso aí Danilo, voltou a toda. Legal cara.... to começando a entender tudo de MVC em Teoria e meus dedos estão coçando pra colocar tudo em prática. Continue assim, são pessoas como você que fazem a diferença.  [REPLY]

[danilo]  Valeu Leandro... e são pessoas como você que me animam a continuar! Grande abraço!  [REPLY]

[Joana]  Bom que retornou, esse tipo de enfoque que eu estava procurando. Obrigada por seus artigos.  [REPLY]

[danilo]  Obrigado Joana! Que bom que gostou. Grande abraço!  [REPLY]

[Leandro]  E aí Danilo, tudo blz... Quando é que vamos colocar esse gnomos pra trabalhar?  [REPLY]

[Emiliano ESB]  Que a paz seja contigo Senhor dos Gnomos. MVC Assimilado. Pronto para o próximo passo. (risos) Ta muito boa a série, cara! Isso vai dar um livro, hein?!  [REPLY]

[danilo]  Valeu Emiliano!!! Grande abraço e obrigado pela força!  [REPLY]

[silici0]  Gostaria de saber até aonde vai essa série. Tem algum tipo de diagrama ? hehehe queremos codar.. vai vai.. ;P  [REPLY]

[danilo]  Já vai, amigo!!! Nesse fim-de-semana nossa história continua! Grande abraço!  [REPLY]

[silici0]  Então segunda tenho compromisso marcado... hehehe. To querendo aprender para implementar MVC aqui na empresa logo depois da OO  [REPLY]

2007-02-10 02:49:00
tags: 

Produção Web: Ambientes de trabalho

Ao longo dos anos aprendi que uma boa estratégia é ter 3 ambientes distintos de trabalho: Produção, Validação e, finalmente, um ambiente de testes internos. O primeiro, intocável, é o ambiente onde os clientes acessam a versão do site atual. O segundo ambiente é o ambiente de validação, onde o cliente aprova as alterações feitas no site. O terceiro é o ambiente onde você testa as modificações antes de apresentar ao cliente.

Acredito que a coisa realmente importante desse approach é ter um ambiente separado de validação para o cliente. Assim você não corre o risco de "quebrar" o site enquanto ele revisa alguma outra coisa que você já fez.

Mas como fazer isso na prática? Um dos motivos da minha simpatia pelo Dreamhost é a possibilidade de criar subdomínios ilimitados. Assim, crio dois subdomínios, um de validação para o cliente e um de teste para mim. Exemplo:

Para criar um subdomínio no Dreamhost é muito fácil: acesse o painel de controle, clique na opção "Domains", e em seguida no link "Add New Domain / Sub-Domain". O painel de controle vai configurar automaticamente o subdomínio pra você e já vai criar a pasta com o mesmo nome no seu diretório home. 

Trabalhe localmente e suba os arquivos para o ambiente de teste. Se tudo estiver bem lá, inicie o procedimento de atualização:

  1. Renomeie a pasta atual cliente.digitalminds.com.br para cliente.old (se alguma coisa inesperada acontecer é so voltar atrás)
  2. Duplique a pasta teste.cliente.digitalminds.com.br e renomeie para cliente.digitalminds.com.br

Tudo pronto, seu cliente já pode fazer a validação das mudanças. Assim você não interrompe o site de validação durante o upload e tem certeza de que tudo está funcionando no servidor.

Existem formas ainda mais bonitas de fazer este tipo de atualização, especialmente se você tem Subversion disponível. Mas aí é outra dica. Pra coisas simples isso funciona muito bem, e você ainda pode fazer um pequeno script bash pra automatizar tudo.

É isso, gente. Até a próxima. Para ver todos os artigos desta série, acesse http://www.digitalminds.com.br/tags/pw

3 Comentários:

[Felipe]  pow..olha quem apareceu ;p legal a 1ª dica..vamos ver o q vem pela frente =)  [REPLY]

[danilo]  Valeu Felipe! Grande Abraço!  [REPLY]

[Felipe Tonello]  Muito boa dessa dica.. eu nunca tinha pensado nisso.. Realmente experiencia conta muito!! abraços  [REPLY]

2007-02-10 02:32:20
tags: 

Produção Web: nova série

Olá pessoal. Começo hoje uma nova série na qual vou tentar passar dicas rapidinhas de produção web. São coisas simples e rápidas que aprendi ao longo desses 16 anos trabalhando nessa industria vital, que de repente ajudam vocês a resolver alguns problemas e ganhar tempo. A série vai se chamar Produção Web, e você vai poder encontrar os artigos no link http://www.digitalminds.com.br/tags/pw . Espero que gostem.

5 Comentários:

[Silfar]  Ué mais e a série sobre cms ? Vai acabar ?  [REPLY]

[danilo]  De jeito nenhum Silfar! Essa nova série é de coisas curtinhas, não vai atrapalhar o andamento da outra não. Grande abraço!  [REPLY]

[Silfar]  A bom, pois estou acompanhando a serie com entusiasmo e tô ansioso pra dar ccontinuidade  [REPLY]

[Felipe Tonello]  Opa, que legal essa série Danilo. Parabéns pelo seus posts! Abraços  [REPLY]

[danilo]  Valeu Felipe! Grande abraço e obrigado!  [REPLY]

2007-02-07 08:26:38

Steve Jobs: Thoughts on Music

Vale muito a pena ler o que Mr. Jobs tem a dizer.

Via Alfarrábio, do Bicarato

2007-02-04 06:11:55
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 12)

Para ver os artigos anteriores desta série, clique aqui.

E estamos de volta, amigos, em dia de Superbowl (você nem precisa gostar do esporte, mas assistir à final é quase uma obrigação. Os comerciais mais esperados do ano são exibidos durante o evento, o show do intervalo vai ser de Prince, e quem ainda não ouviu o comentarista da ESPN de futebol americano não sabe o que está perdendo - é a coisa mais engraçada da televisão brasileira). Mas nós não estamos aqui para falar de futebol americano, não é? Nosso assunto de hoje, isso sim, são gnomos!

Os gnomos, como todos sabemos, são criaturas lendárias que geralmente usam chapéus ponteagudos e barbas enormes. Presentes na mitologia européia e nos jardins de muitas pessoas de gosto duvidoso, nossos pequenos amigos têm a fama de ter poderes mágicos e de viajar pelo mundo.

Muito bem, caros leitores, chegou finalmente a hora de revelar a todos o porquê da presença desses furtivos seres em nossa história. O que têm em comum, afinal, os gnomos e a programação orientada a objeto?

(rufar de tambores) (trilha de "psicose") (silêncio absoluto)

A resposta é muito simples. Absolutamente nada.

Mas peraí! Peraí! Antes de pegar os ancinhos, enxadas e outras ferramentas agrícolas e se dirigirem até minha casa bradando "IMPOSTOR! IMPOSTOR! MORTE AO IMPOSTOR" preciso de algumas linhas para me explicar.

Dentro da minha filosofia "PHP de Rua®" procuro sempre usar metáforas para explicar alguns conceitos que considero mais complexos. Ok, algumas dessas metáforas não são tão interessantes assim, mas acho que algumas já ajudaram alguns de vocês a compreender um pouco mais do assunto em pauta. Os gnomos, meus caros, são mais uma dessas metáforas, como vocês já devem ter percebido.

A idéia de usar os gnomos me veio à cabeça quando comecei a entender melhor o conceito de "manager" em orientação a objeto. Muito bem, vamos recapitular um pouco pra lembrar alguns conceitos importantes. Todos se lembram que definimos classes para Automóveis, Seres Humanos, e outros objetos? Agora quero pedir que vocês procurem ver uma característica que todas essas classes têm em comum, do ponto de vista conceitual: todas elas são criadas a partir de objetos que, de um modo ou de outro, são coisas de verdade no mundo real. Um automóvel existe como "coisa" tanto abstratamente quanto concretamente. Não sei se vocês estão entendendo, mas talvez ajude dar um exemplo de alguma coisa que não exista na realidade para que fique mais claro.

Na nossa série temos focado em um tipo de modelagem chamada "Real World Modeling", ou modelagem do mundo real. Ou seja, sempre que falamos de classes e objetos, falamos de alguma coisa que efetivamente existe no "mundo real". Automóveis e Seres Humanos são exemplos disso. Poderíamos falar também de Registros (de um banco de dados) ou Fichas de Cadastro; mas sempre partimos de uma "coisa" que já existe na realidade, um conceito pré-existente. Sempre tive mais facilidade de entender este tipo de modelagem; é o que me parece mais lógico. Mas, como vamos ver, muitas vezes em programação orientada a objeto um sistema é modelado usando conceitos que não são reais, ou melhor dizendo, usando conceitos que são criados somente para o sistema que se está desenhando.

Os Controllers, peça fundamental do design pattern MVC, são justamente um exemplo deste problema. Explico: é fácil imaginar que um sistema de gerenciamento de blogs tenha as classes Post e Comment, pois no mundo real estes ítens são componentes de um blog. O conceito de Controller, no entanto, jamais apareceria se nós tentássemos encontrá-lo simplesmente olhando um blog. Trata-se de uma classe criada a partir de uma metáfora de uso criada especificamente para resolver um problema de programação. Na prática, estas classes são normalmente muito importantes em um sistema, e ao mesmo tempo são as mais difíceis de criar, já que não têm uma contrapartida no mundo real.

Mas muito bem, ok, já entendemos que os tais Controllers são diferentes dos outros objetos, mas o que eles são exatamente? Aha, aí é que está. Eles são gnomos, amigos. Criaturas imaginárias que fazem coisas pra nós. Eles recebem ordens e as executam, não recebem salário e não reclamam (bom, se a gente programa tudo certo eles não reclamam).

Os Controllers são fundamentais no modelo MVC, pois são os responsáveis por receber as ordens, ou requests, dos usuários do sistema, interpretá-las e mandar novas ordens para que outras classes executem seus métodos. Eles mandam no pedaço. São os reis da cocada preta. Os maiorais.

Muitos de vocês talvez já saibam que existem dois métodos muito importantes para se requisitar (request, sacou?) coisas quando no protocolo http. Eles são os superpoderosos GET e POST. O método GET pode ser visto na maioria dos sites, é só procurar uma url que tenha uma interrogação. Nesse tipo de request o pedido é feito na própria url, passando muitas vezes pares de variáveis separados por um & (e comercial). Um request GET típico seria:

http://www.google.com.br/search?q=oop

Este request, como vocês podem imaginar, está passando a variável "q" com o valor de "oop" para o sistema. Tudo bem simples e trivial.

Um request post é muito parecido. Na teoria, estes requests teriam funções diferentes, o primeiro para "pegar" informações do servidor e o segundo para "colocar" ou "postar" informações lá. Mas, na prática, essa regra não se aplica muito, a coisa é bem misturada. Para nós, essa distinção não é importante, e para um Controller de verdade ela também não deveria ser, já que queremos que esse gnomo entenda qualquer tipo de ordem que o usuário passe para ele.

Esse é exatamente o ponto. Um controller "recebe" ordens, ou requests e executa métodos de acordo. Ou seja, qualquer request que chege em nosso site irá ser tratado por um gnomo, ou Controller, que irá dizer para modelos e outras classes "ei, você, post número 25, apareça aqui que o usuário quer editá-lo!" ou "Ei template Lista de Posts, tome aqui esta lista de posts e desenhe-se na tela". Em um sistema que implementa autenticação de usuários, por exemplo, os Controllers perguntariam "Ei, autenticador, este cara aqui pode editar este post?" e coisas assim. Deu pra entender?

Até a próxima. Alguém aí já está se coçando pra escrever algum código? Calma, gafanhoto... Ainda temos que decidir que gnomos precisamos. Vejo vocês por aí. Grande abraço.

10 Comentários:

[Nelson]  Gostei dessa abordagem de controllers como criaturas imaginárias, nunca tinha visto alguem relacionar controllers ou algo desse tipo com alguma coisa que existe (afinal, tem doido que ve gnomos por ai).  [REPLY]

[Thiago Bernabé]  Vamos logo escolher nossos Gnomos !!!  [REPLY]

[Marco Gomes]  "A resposta é muito simples. Absolutamente nada." Eu quis MESMO arrancar seus olhos com um garfo quando li isso...  [LINK]  [REPLY]

[danilo]  Valeu Nelson! Grande Abraço!  [REPLY]

[danilo]  hahahhahahaha valeu marco! grande abraço!  [REPLY]

[danilo]  Vamos nessa Thiago! Abraço

[Rafagd]  Legal vc ter falado em posts anteriores que dá pra tirar as queries do código... dae eu fiquei me perguntando como vc faz essa mágica ae XD  [REPLY]

[Faculade de Teologia]  Muito legal esse blog!  [LINK]  [REPLY]

[Junio]  Um grande abraço!

[Rogerio]  Estou impressionado com a didatica usada por você. Parabéns, Muito boa mesmo. Espero que o restante seja tão bom quanto o que foi escrito até aqui.  [REPLY]

2007-01-31 03:38:21

Google Earth disponibiliza ruas e estradas brasileiras

Um post rapidinho só pra dar uma notícia importante: a Google está lançando o novo Google Earth 4, que além de inúmeros updates está disponibilizando uma camada de ruas e estradas brasileiras. Vale a pena conferir!

 

http://earth.google.com/earth4.html

 

Volto já com a continuação da "Arte". Grande abraço a todos!
 

 

5 Comentários:

[Leandro]  Ops Danilo, achei que tinha desaparecido cara.... Estamos no aguardo da continuação...  [REPLY]

[danilo]  Muito trabalho meu amigo! Mas volto sim, quem sabe este fim de semana já consigo fazer o próximo! Grande Abraço  [REPLY]

[Leandro]  É eu sei como é... tô tentando arrumar uma folga pra fazer algum curso mas não tá fácil. Se tiver alguma coisa forma que eu possa ajudar, qualquer coisa que não seja grana estou disposto, não tenho condições de manter um blog sozinho mas posso arrumar um tempo para ajudar em outro  [REPLY]

[kawikbr]  Cara, o Google Earth 4 ja foi divulgado tem mais de 1 mes.... voce ta viajando? Eu ja to com ele instalado, com ruas e tudo mais tem MUITO tempo!!  [REPLY]

[danilo]  ô meu amigo, eles mandaram a newsletter ontem, ainda não estava sabendo... o lançamento oficial foi dia 8... grande abraço!  [REPLY]

2007-01-08 02:09:46
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 11)

Olá todo mundo. Estamos de volta depois de um final de ano chuvoso, marcado pelos excessos gastronômicos e pela total e absoluta imobilidade. Àqueles que conseguiram viajar, meus cumprimentos. A minha viagem vai ficar para o carnaval, não pude viajar desta vez. Acho que a melhor definição dessas "férias" de fim-de-ano foi "uma grande seqüência de sábados, seguida pelo maior domingo de todos os tempos". Mas, quem sou eu para reclamar! Deu pra descansar bastante, curtir um pouco e ganhar a Master League na dificuldade Professional duas vezes. 

No nosso último episódio falamos um pouco sobre Views,  a letra V do MVC. Pra quem está chegando agora, vale a pena dar uma olhadinha nos artigos anteriores. Hoje vamos falar de modelos. Um assunto muito mais interessante, não? Mas, calmaí. Antes que você se decepcione, não vamos falar de modelos, mas sim de modelos, ok?  

Bom, de forma bem simples, o M do MVC é o cara responsável pelo gerenciamento dos dados da aplicação. Toda vez que você precisar ler alguma coisa do banco de dados, ou atualizar alguma informação, você vai utilizar um modelo. A chave para entender os benefícios do MVC é perceber que cada uma das três partes faz um trabalho específico, o que torna tudo no final das contas mais simples e seguro.  Na implementação, normalmente se cria uma clase base (normalmente chamada model ou appmodel) que contém quase todas as variáveis e métodos que você precisa para acessar dados no banco. A partir dessa classe, outras classes são criadas, estendendo os métodos para cumprir funcões mais específicas para cada um dos tipos de informação.

A palavra "modelo" talvez seja um pouco difícil de entender. Acho que a tradução foi feita ao pé-da-letra pra manter o acrônimo MVC; mas eu sempre tive dificuldade de entender esse conceito, muito mais do que tive pra entender "View" e "Controller". Pra deixar o conceito mais claro na minha cabeça inventei uma metáfora, talvez ela ajude alguns de vocês. Penso em modelo como um modelo 3d, tipo um robozinho de computação gráfica, responsável por "buscar e levar" os dados até o banco. Assim quando a gente fala que vai criar um modelo para um Post, estamos na verdade construindo um robozinho chamado Post que irá realizar todas as operações com o banco, e guardar informações importantes para nos passar depois. Esse robozinho é criado a partir de um robô genérico, chamado Model, que contém todos os métodos genéricos de todos os robôs. Lembrem que como estamos no mundo da orientação a objeto, podemos criar, na verdade, vários robozinhos Post a partir da classe Post. Esses robôs são instâncias ou objetos da classe Post.

Aliás, pra coisas simples, vocês vão perceber que quase todas as funções ou métodos são muito similares para quase todas as informações. Essa é a beleza dos frameworks MVC como o Rails: só de instalar você já "ganha" uma série de métodos prontos pra usar. Mas essa é uma outra história, que vamos falar um pouco mais tarde.

Muito bem. Quais seriam os modelos que teremos que construir para nossa aplicação funcione? Alguém se arrisca? Vou pelo caminho mais simples, como bom preguiçoso que sou. O primeiro modelo, e mais óbvio, é o modelo de "Post". Sim, amigos, sem posts, não temos um blog. Concordam? Então vamos em frente. Que informações um post deve guardar? Essa é fácil: no mínimo temos que guardar o título do post, seu conteúdo e seu permalink. Pra poder identificar este post de uma forma simples, vamos guardar também uma identificação única, que pode ser um número, por exemplo.

Outro modelo importante pra nosso DBE é o modelo "Comment", que representa um comentário feito em um post. Os comentários vão  guardar o conteúdo do comentário e a identificação do post ao qual ele se refere.

Pra nossa primeira versão, que vai ser muito simples, acho que estes dois modelos serão suficientes. O que vocês acham? Ficou faltando alguma coisa?  Mandem seus comentários!

Grande abraço e até a próxima.

 

8 Comentários:

[Ian Liu Rodrigues]  Muito bom! No aguardo :)  [REPLY]

[Landjunior]  Cara, bem bolada está série. Auto-explicativa e aborda o assunto de forma descontraida.  [REPLY]

[Leandro]  Poxa cara tava demorando pra sair o n11, tava quase desistindo :)... mas é isso cara, agora to começando a entender bem como funciona o MVC, tá faltando só o C... continue assim  [REPLY]

[Tarcísio Sassara]  Não deveria haver um modelo para as Tags? Tags para categorizar os Posts? Estou acompanhando, Abraço!!!  [REPLY]

[Fábio]  Muito legal os artigos do seu blog, mas gostaria de fazer uma critica referente seu blog, o fundo preto com o texto em laranja traz muitas dificuldades para a leitura, ach

[Fábio]  Muito legal os artigos do seu blog, mas gostaria de fazer uma critica referente seu blog, o fundo preto com o texto em laranja traz muitas dificuldades para a leitura, acho que voce poderia explorar outras cores para o texto ou ate mesmo o fundo, as vezes deixo de ler algum artigo ou indicar pela dificuldade que encontro, e sem contar q a fonte é muito pequena.

[tigo]  é Fábio... o lance do Danilo é shell/prompt... hehehe. Desligue o estilo e aumente a fonte. Com FF tua faz isso em 3/4 cliques.  [REPLY]

[Emiliano ESB]  Ao meu ver, falta nada não!   [REPLY]

2006-12-28 17:29:08
tags: 

Feliz Natal e um ano novo maravilhoso para todos!

$ano = 2007;

while ($ano >= 2007){

    $felicidade = true;

    $paz = true;

    $ano = $ano + 1;

}

2 Comentários:

[Fernando Gonzaga]  $ano = 2007; (para o próximo comentario, obrigado!)  [REPLY]

[Rafael Barros]  pq não $ano += 1;  [LINK]  [REPLY]

2006-12-18 11:47:21
tags: 

Algumas Perguntas

O leitor Silfar Goulart me fez algumas perguntas por email que prometi responder por aqui. Então vamos lá:

Por que vc escolheu PHP ?

Na verdade, acho que foi PHP que me escolheu. Era uma das poucas opções disponíveis em servidores compartilhados linux. A outra era Perl. Quem conhece Perl gosta bastante, mas sabe que não é uma linguagem muito amigável. Então comecei com PHP.

Por que escrevo esta série em PHP? Bom, porque, como já disse antes, sou preguiçoso e estou muito mais interessado em me aprofundar na parte de design do que em conhecer outras linguagens. Eu realmente acredito que uma aplicação bem desenhada pode ser feita em qualquer linguagem. Dizem que Python é ótima, e eu já andei olhando Ruby e me pareceu muito interessante. Mas como meu tempo é limitado preferi me aprofundar em outras questões que estou achando mais legais no momento.

Agora, por que você vai usar PHP? Bom, primeiro porque ela está disponível em quase todos os servidores compartilhados do mundo. Claro que estas opções estão melhorando a cada dia, cada vez mais provedores estão disponibilizando Ruby e Java, por exemplo. Mas por enquanto, PHP ainda é quase sinônimo de sites dinâmicos no mundo linux.

Segundo, porque é uma linguagem muito gostosa de usar, especialmente simpática para quem está aprendendo. As funções para lidar com arrays são simplesmente maravilhosas, e a versão 5 é bastante esperta, não só em relação a Orientação a Objetos, mas também tem muitas coisas interessantes disponíveis na instalação. Não menos importante é a comunidade de desenvolvedores, muito ativa e prestativa.

Você trabalha mesmo com PHP ?

Sim, trabalho. Não sou um programador full-time, mas eu cuido do desenvolvimento de nossas aplicações server-side aqui na 32Bits™. Não tem nada muito complexo, mas nossas coisas são limpinhas :-)

No Wasabi, quem manda é meu sócio e guru Bruno Goyanna, e aí a coisa é muito mais séria. O Wasabi é todo escrito em Java, com Struts, Velocity, etc e tal. Performance é a palavra chave, e o Bruno é simplesmente "o" cara.


O que acha de python e ruby ?

Conheço muito pouco, mas as duas me parecem muito interessantes, especialmente Ruby. Só fico meio com medo de usar uma linguagem tão nova, sou meio conservador nisso. Quando Ruby estiver há uns 10 anos no mercado aí sim vamos saber se ela é toda essa Coca-cola que andam dizendo.

(UPDATE) O Cris Dias, que além de ser o dono do Vilago é programador Ruby, puxa minha orelha e diz que Ruby nasceu em 1995 também, assim como o PHP. E eu achando que o japa tinha inventado Ruby ano passado. Ignorância minha. É que a linguagem realmente só começou a aparecer por aqui nessa época, mesmo sendo bem forte no Japão. Acho que meu sentimento tem mais a ver com a abundância de recursos na internet disponíveis para PHP. O Cris, faz um artigo aí dando o caminho das pedras pro pessoal!

E sobre os frameworks feitos em python Django e TG ? e em ruby Ruby on Rails ?

Não conheço Django nem TG, mas o Rails é demais. Quem não conhece tem que conhecer, mas acho que é quase impossivel conhecer Ruby sem conhecer Rails, não? Pra quem programa em PHP, o CakePHP é um port muito bom do Rails pra PHP, embora ainda jovem. O que mais me impressiona no Rails é o cuidado com a documentação.

 

11 Comentários:

[Silfar]  Danilo, obrigado pelas respostas, coloquei um link para o seu site no meu blog, pois achei seus artigos muito bons mesmo, espero que não se importe. Eu também tenhho ouvido falar muito do cake. Acho que vou dar uma olhadinha., abraços  [REPLY]

[danilo]  Imagina Silfar! Muito obrigado a você. Aproveito e coloco também aqui no LINK uma página comparando vários frameworks MVC para PHP. Grande Abraço!  [LINK]  [REPLY]

[ms*]  tão nerdzinho ele ! :-)  [REPLY]

[Cristiano Dias]  Ué, mas Ruby e PHP são de 1995... 11 anos de mercado, portanto. ;-)  [REPLY]

[Tarcísio Sassara]  As respostas foram bem elaboradas e me convenceram de que estava certo em escolher o PHP entre as soluções gratuitas encontradas no mercado. Abraço e até a próxima!  [REPLY]

[danilo]  ô cris, eu não tinha ouvido falar de Ruby até esse pessoal da 37 signals aparecer... no Brasil a gente não tinha nenhum provedor que disponibilizasse Ruby até você lançar no Villago! :-) Grande Abraço!  [REPLY]

[danilo]  Valeu Tarcisio. Mas não deixe de acompanhar o desenvolvimento de outras linguagens legais como o Ruby, é sempre bom manter a cabeça aberta!  [REPLY]

[Cristiano Dias]  Eu sei Danilo, só estava enchendo o saco. É que esse "ataque" no Ruby já é manjado. Java também tem basicamente o mesmo tempo de mercado e ninguém pareceu importar-se. Mas realmente Ruby só decolou agora, com o Rails. Mas um dos motivos de "todo mundo usar PHP" é justamentes porque "todo mundo usa PHP". Até vir o dinamarquês maluco (programador de PHP por profissão) e inventar o Rails. Eu abri um sorriso quando você falou que PHP é "gostosa de programar". Bicho... brinque um pouco com Rails e você vai apagar essa frase, ehehe.  [LINK]  [REPLY]

[danilo]  hmmm... perai. Você usa mac? Acha que o OS X é melhor que o Windows XP e que o Windows só existe porque todo mundo usa? eu to fora dessas discussões! hehehehe  [REPLY]

[Cristóferson Bueno]  Vou discordar de você Cristiano, todo mundo usa PHP pq ela é flexível, tem uma base sólida (C e Perl), é estável, como disse o Danilo, muito fácil de aprender, principalmente pela excelente documentação comunitária on-line. Sobre Ruby, quando vi o Danilo falando que ela tinha q ter uns 10 anos no mercado quase que escrevi um e-mail sem ler o resto :) Ruby é fantástica! prazerosa e bem completa, vale a pena conhecer!  [LINK]  [REPLY]

[Tarcísio Sassara]  Parei, estou me apoixonando por Rails!! HAUhUAHuAH.... Muito legal!!! Quero aprender mais sobre MVC e tudo mais. Estou ralando pois são novos conceitos que estou aprendendo. (Foi o Danilo que me colocou na cabeça: "não deixe de acompanhar o desenvolvimento de outras linguagens...")  [REPLY]

2006-12-17 07:20:18
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 10)

Para ver os artigos anteriores desta série, clique aqui.

Olá todo mundo, escrever nesse calor que está aqui no Rio é quase uma insanidade, mas enquanto houverem leitores a série deve continuar! Hoje vamos começar a detalhar melhor nosso plano falando de uma das partes importantes que compõem o pattern MVC. Mais precisamente, o "V", ou View.

Decidi começar por aí (sei que parece estranho para quem já conhece o funcionamento do MVC) por uma razão bem simples: eu sou preguiçoso, e gosto sempre de começar pelo mais fácil. Na minha modestíssima opinião, o conceito de View é o mais simples dos três, e certamente o mais simples de implementar também.

Quem já trabalhou com algum template engine (como o Smarty, por exemplo), já conhece o conceito de View com outro nome: Template. Basicamente, uma View é um gabarito que permite a visualização de dados dinâmicos dentro de uma determinada formatação. Bom, na verdade é um pouco mais que isso, é também um conjunto de classes que suportam o uso destes templates, afinal se você simplesmente gravar um arquivo com html ele não vai se tornar dinâmico sozinho, não é mesmo?

Uma definição mais careta de View é a seguinte: "uma representação de um estado do modelo". Cuma? Bom, pensei numa metáfora razoavelmente idiota para explicar esse conceito, me perdoem se parecer meio ridículo, mas juro que estou fazendo o melhor que posso :-)

Primeiro, você vai precisar de um caderno, um lápis e um estilete. (?!) É isso mesmo. Vá lá no quarto e pegue um caderno, um lápis e um estilete. Se não tiver um estilete, nosso pseudo template não vai funcionar. Depois você vai entender por quê.

Arranque uma folha do caderno e escreva no topo "Template para criação de Posts". Esse será o nosso template 1. Logo abaixo, escreva "Título do Post:", e embaixo disso, "Texto do Post:". Tudo bem? Bom, você já tem um pseudo template html, mas ainda falta o fundamental, a conexão com o nosso pseudo banco de dados, também conhecido como caderno. O estilete, essa tão importante ferramenta, vai funcionar para fazer a conexão.

Pegue o estilete, e, ao lado do texto "Título do Post", faça um buraco (ou, em nosso pseudo html, um ítem de formulário Input Text) que permita mais ou menos 255 caracteres. Do lado de "Texto do Post:" abra um buraco ainda maior, simulando um TextArea. Eu falei que era uma metáfora meio idiota, não falei?

Muito bem, senhores, vocês têm em suas mãos um Template. Ou uma View, como queiram. Agora podemos usá-la tanto para escrever em nosso "banco de dados" quanto para visualizar seu conteúdo de forma bonita, formatada. Se quiser, você pode editar esse template pintando com hidrocor, sabe como é, dá pra fazer bastante coisa com Hidrocor Style Sheets. OK, deixa pra lá.

Para adicionar um "registro" no "banco de dados" basta "carregar" o seu template, colocando-o sobre uma página vazia do caderno, e escrevendo os dados dentro dos buracos no template. Para adicionar outro registro, vire a página e repita o procedimento. Nesse exemplo, o estado do modelo é a página que você está vendo. Mudar o estado do modelo, portanto, é como mudar de página nesse exemplo tosco. Vocês entenderam?

Claro que um modelo que não é feito de papel pode mudar de estado de outras formas, mudando quais informações estão disponíveis e a forma como elas estão sendo visualizadas. (Ainda preciso ver como fazer sort nesse banco de dados, mas ele possui a grande vantagem de ser portátil, de fácil utilização e ser facilmente expansível "conectando" outros "bancos de dados" quando o espaço acabar. Muito interessante, não? O chato é fazer backup.)

Bom, resumindo, uma View é uma espécie de gabarito que contém partes estáticas (escritas em html, no nosso caso) e outras dinâmicas (escritas em php simplificado, para garantir que não vamos colocar lógica dentro de nossos templates). Claro que os templates que vamos construir são mais poderosos e flexíveis que os feitos em PHTML ou Pseudo Html ou Papel html, sei lá.

Vou dar um exemplo: nosso blog, claro, vai disponibilizar um feed RSS para seus leitores. Usando templates, isso é muito simples: pegamos as mesmas informações que mostramos no blog usando um template bonitinho em html e as mostramos usando um template escrito em XML, no formato Atom, por exemplo. Pra isso funcionar, é só fazer um novo template trocando, por exemplo, a tag "h1" usada no html por uma tag "title", usada no formato Atom. Muito mais fácil do que ficar copiando queries, scripts inteiros, e coisas do gênero.

Em termos práticos, pra nós uma View vai ser um arquivo php que praticamente só contém html. As únicas coisas que estarão escritas em PHP serão os dados que vêm do banco de dados ou algumas funções bem simples para realizar loops, imprimir constantes na tela e pouca coisa mais. Vamos manter nosso DBE bem simples, se depois alguém precisar de mais funcionalidades vamos permitir que se use o Smarty ou qualquer outro template engine pra renderizar nossas Views.

Até a próxima.

10 Comentários:

[Tiago Madeira]  Muito bom... Esses artigos desta série e as suas metáforas estão excelentes! Mesmo no calor, continue escrevendo... =)  [LINK]  [REPLY]

[Thiago Bernabé]  Tamo junto em busca dos gnomos :) Continue escrevendo !!!  [REPLY]

[Exper Aguiar]  muito bom texto, continue escrevendo. pelas minhas contas, só tem amis 2 posts na série, né? pq os gnomos tem contrato até o ultimo, e como eles são o C..... zuera, claro que vai ter muito mais ^^ abraço.  [LINK]  [REPLY]

[Caio Mancini]  Muito boa esta série, acompanho ela sempre. Estou aprendendo muito!!! Continue cara!!!  [REPLY]

[Alisson Patrício]  Nunca comentei no seu blog, primeira fez, mas juro que acompanho sempre pelo feed rsrs! parabens pela seria esta otima! seus textos são muito divertidos e muito facil de entender! continue assim...  [REPLY]

[Leandro]  É isso aí Danilo, continue assim, estou aguardando a próxima. Por falar em próxima, você tem alguma previsão para ela?   [REPLY]

[Júnio]  Quero mais!-Obrigado, muito obrigado mesmo.  [REPLY]

[Cynthia]  Oi! ainda não sei seu nome... comecei a ler a série sobre OO e não estou conseguindo parar...rs. Comecei a programar estudando Java. Bom, não fiz nada profissionalmente, pois como a pressão para fazer grana foi maior....nem preciso falar mais nada né... trabalho fazendo sites...Queria dizer que estou adorando a série, que vc escreve super bem e claramente, e que gostei de vc de cara! Parabéns! Aquele abraço! obs: parei pra comentar no meio da série, depois comento mais, ok!  [REPLY]

[danilo]  Valeu Cynthia! Grande abraço!  [REPLY]

[Junio]  Bem didático, obrigado.Paz e saúde para ti!!  [REPLY]

2006-12-04 13:22:49
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 9)

Olá a todos. Mais uma vez estamos aqui (excepcionalmente escrevo numa segunda-feira, já que meu fim-de-semana foi totalmente dominado pelo PES6, também conhecido como Winning Eleven 10) pra falar de OOP, ou object-oriented programming. No último post, deixei bastante suspense no ar. O que é o design pattern MVC? Por que usar MVC neste projeto?

Como muitos que nos acompanham já sabem, muitas vezes este esquizofrênico autor acaba fazendo novas perguntas e dando respostas totalmente desvairadas às perguntas feitas anteriormente. Desvairadas no bom sentido, claro - para chegar à essência de qualquer coisa, primeiro temos que entender muito bem suas particularidades; portanto minha resposta à pergunta "O que é o design pattern MVC" vai ter duas etapas (consegui colocar 3 acentos graves em um só parágrafo. Uau.)

Etapa 1: O que é "Design Pattern"?

Design Pattern é o termo utilizado para definir uma prática bem estabelecida em arquitetura de software, uma solução clássica para um problema recorrente. Ou seja: meu amigo, esse problema que você está tendo muito provavelmente alguém muito mais inteligente e com mais disponibilidade de tempo já teve e já resolveu com uma classe, uma beleza que muito provavelmente você não conseguiria. É isso mesmo, o primeiro passo para se tornar um grande desenvolvedor (ou um chutador barato como eu) é aceitar a humildade em seu coração e perceber que as soluções mais bonitas já estão por aí. É só achar. E os design pattern clássicos são pura poesia em forma de código.

"Mas tudo bem, Danilo, eu sou humilde, mas ainda não entendi". Bom, aí, só mostrando na prática, não é mesmo? Então vamos lá, chegou a hora de não explicar o que é MVC.

Etapa 2: O que é "MVC"?

Model, View, Controller. É isso. Entendeu? Olha, se você ainda não entendeu, pode desistir. Não vai adiantar. Invente alguma outra coisa pra fazer, vá mexer no Photoshop, sei lá.

Brincadeirinha. O difícil dessa história de design pattern é compreender a beleza da solução. Só com o uso você pode entender. Eu poderia copiar e colar várias definições sobre o que é MVC, falar sobre toda a teoria, mas, como vocês já sabem, esta não é uma série convencional, e eu estou me propondo a mostrar essas coisas de um ponto de vista mais tosco. Algo como um PHP de rua, se é que vocês me entendem.

Então, pra mostrar ná prática o que é MVC, vou começar listando as coisas que mais me irritavam quando desenvolvia scripts PHP. Aí, se você não entender, realmente vai ser melhor ir fazer gifs animados lá no Photoshop, saca? :-)


- Lógica no meio do desenho da tela

Não existe nada mais desesperador do que lógica no meio do desenho da tela. Digo isso com conhecimento de causa, já que este é um dos piores problemas deste blog que vocês leêm nesse exato momento. É um inferno. Quero trocar o conteúdo de um link, mas ele está no meio de infindáveis ifs (perdoem o trocadilho) e depende de uma outra infinidade de variáveis que não sei mais de onde vieram e pra onde vão. Para criar o RSS feed do blog? Tive que começar do zero, o trabalho de editar o código que já existia nem valia a pena. Um outro exemplo clássico é a versão 2 do OsCommerce, o software open-source de comércio eletrônico. Tentem mudar qualquer coisa ali pra ver. Tem um milhão de condicionais e funções que rodam nas páginas de apresentação de conteúdo, entre um div e um p por exemplo. É coisa pra deixar qualquer um maluco. Um trabalho que poderia levar alguns dias me tomou 3 meses. Eu odeio isso com todas as minhas forças.

- Segurança $_GET e $_POST

Se você usa scripts php diversos para cada uma das páginas do seu site sabe muito bem que cada input do usuário, em cada página, precisa ser validado. Aí, digamos que você tenha 12 páginas php em seu site, e você copia e cola código em todas elas. Ok, agora, imaginemos ainda que 3 variáveis mudaram. Você tem que ir lá e copiar tudo de novo, doze vezes. Os mais espertinhos vão dizer "ah, mas é só fazer um include!", ao que eu respondo "mas, hey, amigo, cada página tem diferenças sutis em relação às outras, os dados comuns têm uma validação diferente de acordo com a situação do usuário e - deus que me livre - de acordo com seus níveis de permissão". Aí, cara, você cai duro, imaginando que aquele orçamento que você deu foi totalmente por água abaixo e que você vai ficar copiando e colando código para toda a eternidade, até que um dia não exista mais PHP no mundo e finalmente você possa descansar em paz.

OBSERVAÇÃO: Claro que dá pra fazer um site ou uma aplicação assim. O que nós estamos falando é de produtividade e capacidade de evolução com o tempo. Todo bom desenvolvedor que conheci é preguiçoso; afinal o computador foi criado pra que nós não tivessemos tanto trabalho, não é mesmo?


- Includes em múltiplos arquivos

Ah, includes. Os includes são uma bênção. Mas quando se tem 30 arquivos php para trabalhar, gerenciar includes se torna uma tarefa muito chata. Uma das soluções que a comunidade desenvolveu ao longo do tempo é o pattern "top.php", um arquivo que é incluído em todas as páginas do site, no topo, que por sua vez inclui outros 30 arquivos necessários ao funcionamento do site. Preciso dizer que tem desperdício de recursos aí? Aquela página que só precisa dos arquivos 1.php e 2.php acaba carregando o 3.php até o 30.php sem precisar. Bons desenvolvedores são higiênicos também; não gostam que tenha sujeira embaixo do tapete.

- SQL misturado com scripts php

Ah, essa é de doer. Já cansei de fazer código que tem SQL misturado, no meio dos scripts PHP. Sim eu era um "lousy coder", um desenvolvedor mixuruca, mas se você olhar tem muito código open source por aí assim. Meu Deus, como eu não via a gravidade desta heresia? Como eu não pude perceber que lugar de SQL não é no script que desenha minha tela? Que sql é coisa muito séria, que deve estar protegido, separado em classes que deixe tudo bem seguro pra que nenhum engraçadinho detone meus dados? Bem, acho que eu realmente não ligava. Mas quando a coisa começou a tirar a minha produtividade, e eu perdia horas procurando "cadê aquela query, acho que deve ser essa aqui" etc e tal a coisa ficou mais clara pra mim. Tinha que haver uma solução melhor pra isso.


Bom, o que posso dizer para vocês é que o pattern MVC resolve estes e muitos outros problemas, e uma vez tendo usado MVC você não vai querer mais voltar para o inferno. Mas tem uma questão: a coisa toda é mais complicada. Fato. Precisa pensar um pouco antes de sair escrevendo código. Precisa planejar. E esse planejamento é precisamente o que vamos começar a fazer no próximo artigo. Até lá.

p.s. o gnomo é o c...

21 Comentários:

[Tarcisio Sassara]  Cara, sem palavras. Esse foi o post para esclarecer os temores e erros dos desenvolvedores. E tudo que você falou sobre o OsC, eu assino em baixo como sendo verdade. Quem quiser tornar aquela coisa tableless valido ou apenas fazer algumas mudanças, tem que suar. Suar o dobro do que seria necessário.  [REPLY]

[Marcus]  Esses dias eu criei um artigo explicando o básico do MVC, caso queira compartilhar com seus leitores o endereço está no campo "Seu Website". No mais parabéns pela iniciativa, abs.  [REPLY]

[danilo]  Muito obrigado Marcus! Pessoal, não deixem de visitar o artigo, vale a pena: http://www.revistaphp.com.br/artigo.php?id=50  [LINK]

[Uirá]  Vc sabe dizer onde eu arranjo um crack do Photoshop 7.0.1?? Huahuahuahu Q nd, mto bom o artigo... até o momento o tico e o teco não pifaram  [REPLY]

[danilo]  Uirá, certamente este não é o lugar pra você perguntar uma coisa dessas. Já pensou em usar o Gimp? É uma excelente opção open-source. Grande abraço!  [REPLY]

[Leandro]  É isso aí Danilo. Estou tentando me livrar desse tipo de mistura (php, sql e html), aos poucos estou conseguindo. E por isso não vejo a hora de ler a próxima parte. Passo todo dia aqui uma duas vezes pra ver se ele não está aqui.  [REPLY]

[Négris]  Bicho, eu sei muito bem do que você tá falando (eu acho)... brincadeira, eu trabalho num aempresa onde o foco é: solução funcionando! isso quer dizer: códigos todos acochambrados (remendados)... eu sou o webmaster, quando pego escopos e arquivos pra finalizar é uma eternidade pensando em como otimizar e "secar" os ifs e fors da vida... detalhe: a base de tudo na empresa e java  [LINK]  [REPLY]

[Exper Aguiar]  o gnomo é o cardoso? o.O  [REPLY]

[danilo]  hehehehe ô aguiar, eu falando de mvC e vc falando do Cardoso! hehehehe grande abraço  [REPLY]

[Exper Aguiar]  eu tbm gostei mto do pattern MVC, mas sua ultima linha me chamou a atenção ("p.s. o gnomo é o c...")  [REPLY]

[Bernardo]  Cara, achei hoje teu blog e, mesmo sendo um programador com uma boa bagagem nas costas, achei muitíssimo interessante essa série. Para o povo que está começando a aprender OOP, creio que tem sido muito esclarecedor. Parabéns pela iniciativa e pela didática.  [REPLY]

[danilo]  é o "c" do MVC, meu caro Aguiar! O Gnomo é o Controller! heheheh  [REPLY]

[danilo]  Muito obrigado Bernardo! Seja bem-vindo!  [REPLY]

[Rodrigo Maia]  Muito bom essa série de artigos. Você falou de retirar o SQL do PHP ou retirar o SQL da apresentação? Não ficou muito claro, pois não seria o PHP que executa querys etc etc ? Abraços. PS: Por acaso você está pensando em voltar com os podcasts?  [REPLY]

[Rodrigo Slompo]  Maneiro, e que venham os próximos posts!!!  [REPLY]

[DGmike]  Cara, eu pensei num palavrão quando vi que "gnomos é o c...", obrigado pela série de artigos, são de ótima serventia.  [REPLY]

[Lucas Vasconcelos]  Tenho a mesma dúvida do Rodrigo Maia. Quando você fala em separar SQL do PHP estaria sugerindo algo como XML Mapping?? ... Parabéms pela didatica que está usando nos artigos. Só não gostei muito do fato de você estar postando como uma novela, deixando sempre uma ponta de curiosidade sobre o que virá no próximo capítulo! ... Grande abraço.  [REPLY]

[danilo]  Na verdade estava somente me referindo à logica; Como esse é um artigo para iniciantes estou tentando falar tudo da forma mais simples possível... Reescrevi pra tentar deixar mais claro, muito obrigado! Imagina falar de xml mapping para alguém que nem conhece oop! hehehe grande abraço!  [REPLY]

[danilo]  Oi Rodrigo, respondi também ao Lucas, tentei reescrever pra deixar mais claro essa questão da separação; me referia a scripts php, na verdade. Valeu!

[Lucas Vasconcelos]  Ae Danilo, depois da reescrita ficou mais claro o que você quis diser :) .... quando será o próximo capítulo?? Abraço.  [REPLY]

[Leo]  Adorei o artigo,, quando sai o proximo?  [REPLY]

2006-11-25 04:23:17
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 8)

Olá todo mundo. Tudo pronto? Cintos de segurança afivelados? Mesinhas fechadas e travadas? Hoje começamos nossa longa jornada com um primeiro passo importante: definir algumas premissas do novo e nada revolucionário Digitalminds Blogging Engine 2.0, o primeiro software open-source para gerenciamento de blogs desenvolvido pela comunidade Digitalminds (o DBE 1.0, como vocês já sabem, é um script todo remendado, feito nas horas vagas, que não tinha código livre por que o autor tem vergonha de mostrar o ninho de rato que a coisa é).

Muito bem, então vamos às premissas:

do Lat. praemissa
cada uma das duas proposições, maior e menor, de um silogismo;
facto ou princípio que serve de base a um raciocínio ou a um estudo

Nossa primeira premissa é que nossas premissas serão as bases do nosso projeto, e que premissas só são alteradas para novas versões. Essa frase ficou um pouco redundante, eu sei, mas vocês vão ver que redundância é uma coisa muito importante quando se trabalha em grupo. Tudo precisa ser muito, muito, mas muito bem explicado para que não haja nenhum problema.

Que fique claro para todos, então, que depois da definição de nossas premissas para a primeira versão do projeto, só poderemos ter novas premissas para uma nova versão. Um dos maiores erros que podemos cometer é mudar de premissas durante o projeto. E, amigos, acreditem, vai ser muito tentador. Muitas vezes em projetos complexos dá muita vontade de mudar o que foi acordado antes, simplesmente por que todos aprendem ao longo do processo e percebem que algumas definições não fazem muito sentido. Mas como diz aquele deputado que não lembro mais o nome, "Versão boa é versão finalizada". É melhor ter um software na mão do que dois voando. Como estamos tentando aprender com o processo, vamos tentar manter a ordem e fechar a primeira versão conforme as premissas originais, ok?

Muito bem, senhores, então quais seriam as outras premissas para o projeto? Tenho algumas idéias que gostaria de sugerir:

- O DBE 2.0 vai rodar necessariamente em ambientes LAMP (Linux, Apache, MySql, PHP). Claro que não será difícil portar o sistema para outras configurações, mas não será nosso objetivo.

- O código será disponibilizado em um repositório Subversion(SVN), e todos poderão atualizá-lo sem restrições. A responsabilidade é sempre deixar a versão do trunk funcionando. Se você não entendeu nada dessa premissa, não se desespere. Vamos explicar diretinho o que é SVN, e dar todas as dicas para usar esse sistema de controle de versão fantástico.

- A versão 2.0 do DBE vai ter apenas o estritamente necessário, do ponto de vista das funcionalidades. Ponto final. Vamos tentar fazer para essa versão apenas o essencial. Se tivermos qualquer dúvida sobre uma funcionalidade, ela fica pra próxima.

- Como simplicidade é a palavra de ordem, não vamos construir nesse momento um sistema de autenticação. Vamos usar a autenticação Digest do Apache, ou mesmo a Basic, caso alguém não seja tão paranóico quanto eu. Trata-se de uma configuração bem simples que pode ser feita em um arquivo .htaccess no seu servidor. A vantagem da Digest é que ela usa criptografia para proteger a sua senha durante o envio. Pra quem não conhece os termos técnicos, autenticação do apache é aquela janelinha que abre em alguns sites pedindo pra você digitar a senha. Nada muito bonito, mas é bem seguro e fácil de implementar.

- A versão 2.0 do DBE vai ser escrita em PHP 5.1.4, usando orientação a objeto. Por quê esta versão? Bom, acho que esta é a primeira versão na qual a programação OOP realmente funciona 100%. Enfim, acho que não vai ser problema pra ninguém, praticamente todos os provedores bons já estão com esta versão, que por sinal tem outros updates importantes na área de segurança.

- Nosso DBE vai ser desenvovido usando modelo simplificado do design pattern mvc. por que usar o pattern mvc? O que é o pattern mvc?

Não perca o próximo capítulo! Só posso dizer que os gnomos estão chegando, amigos, e mais premissas também!


10 Comentários:

[Tiagomac]  Opa, como falei anteriormente, to presente e na escuta, esse vai ser um projeto bem bacana, pois até como você citou, será open source, podendo terceiros modifica-lo também.  [LINK]  [REPLY]

[Leandro]  Gostaria de discordar da primeira premisa "O DBE 2.0 vai rodar necessariamente em ambientes LAMP". Gostaria de sugerir a utlização do ADOdb, http://adodb.sourceforge.net/ ou algum outro componente para a conexão com a base de dados, assim se for necessário trocar de banco fica bem fácil. Outra coisa, você falou em patterns mvc, não entendo muito disso, mas basicamente é separar a camada de apresentação da camada de "negócios". Será utilizado alguma pronta tipo Smarty, ou será desenvolvido?  [REPLY]

[danilo]  Oi Leandro, claro, existem muitas bibliotecas excelentes, não só ADODB, mas também a PEARDB, entre outras. Mas como a idéia aqui é simplificar e aprender, vamos construir uma solução simples que não dependa de nenhuma biblioteca maior. O nosso design permitirá que depois se use qualquer biblioteca, mas pra facilitar, vamos começar com o mysql e as funções nativas do PHP, ok?  [REPLY]

[danilo]  Com relação ao Smarty, apesar de usá-lo quase que diariamente e adorar, acredito que vai ser mais interessante pra quem quer aprender um pouco mais de oop que a gente construa nosso próprio framework mvc, bem simples, mas que tenha os conceitos mais importantes, incluindo como você bem disse a separação da camada de apresentação da camada de negócios. Ao final, se tivermos sucesso até poderemos usar o Smarty para cuidar da camada de apresentação, sem problemas. No próximo post detalho melhor qual é a idéia, ok? Grande Abraço!
  [REPLY]

[Marco Gomes]  "Waiting for orders". Um pedido desesperado e urgente: Que tal mudar o campo de "comentário" para uma textarea? Me sinto com claustrofobia tendo que digitar tudo em apenas uma linha.  [LINK]  [REPLY]

[Tarcísio Sassara]  Gostei da idéia do repositório! Vou poder aprender mais. Conheço apenas o basico com o TortoiseSVN. Espero que o projeto siga de vento em popa.  [REPLY]

[Cristóferson Bueno]  Apenas completando o que o Danilo disse, Smarty é muito bom sim, mas ele cobre apenas uma parte do MVC, que seria a View ou camada de apresentação. MVC não é uma simples separação em três camadas, alguns conceitos são bem distintos da arquitetura 3-Tiers convencional.  [LINK]  [REPLY]

[Leandro]  É isso aí, por isso é bom aprender com quem sabe... Estou aguardando a continução do artigo para poder aprender mais e contribuir no que for possível também.  [REPLY]

[Emiliano ESB]  Opa! sugestões bem recebidas! Exceto, há sempre um exceto, a primeira! Por que LAMP e não LAPP? Acho que nem é questão de portar, mais o free MyISA não é confiável!  [REPLY]

[Emiliano ESB]  MyISAM! hehehe

2006-11-18 03:25:25
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 7)

Olá pessoal, depois de mais um longo e tenebroso outono(?!) de muito, muito trabalho estamos de volta. Muito obrigado por todos os comentários e emails, mesmo estando totalmente atolado de trabalho na 32Bits™ eu tento ler todos e respondê-los o mais rapidamente possível. Pra quem tá chegando agora no blog, meu email é danilo[arroba]digitalminds.com.br e você pode ver todos os artigos dessa série clicando no título deste post, ok?

Bom, muitos escreveram perguntando sobre os gnomos. Quando eles vão aparecer nessa tão complexa trama? Qual é sua verdadeira identidade? O máximo que posso dizer é que eles tem contrato para 7 temporadas, e que talvez as respostas ainda demorem um pouco a vir... (funciona pro Lost, não? ;-)

Mas voltando ao que realmente interessa, OOP, ou object-oriented programming, hoje quero preparar o terreno para os próximos episódios. Agora que os conceitos principais já foram apresentados a vocês (se você ainda não sabe o que são classes, subclasses, interfaces, etc, talvez seja bom dar uma olhadinha nos artigos anteriores) gostaria de começar a parte Zen de nossa série. Como nossa marca registrada é gastar metade do artigo falando sobre coisas que são apenas marginalmente relacionadas ao assunto principal, vou tentar explicar o que é Zen em apenas uma palavra, sem nenhum compromisso de conseguir. Vamos lá:

Prática.

Talvez seja mais simples enumerar tudo o que o Zen não é. Zen não significa calma. A frase "Fulaninho é Zen, não se irrita com nada" basicamente não significa nada. Zen não é um conceito esotérico. Zen não é magia, tampouco feitiçaria.

Prática. Contar diariamente de um até dez. Koan. Tornar-se um com o arco. Concentração. Mente de principiante. Buda. E por aí vai.

E o que tudo isso tem a ver com OOP? Bem, caros leitores, a experiência de programação em oop só pode ser totalmente vivida na prática diária. Ler sobre oop é ótimo, mas é como olhar para o dedo que aponta para a Lua, e não olhar a Lua propriamente dita. Como verdadeiramente aprender estes conceitos? Vivendo-os. Como quebrar os Koans das classes, interfaces e patterns?

Recebi alguns emails pedindo que desse exemplos do uso da OOP em situações do dia-a-dia. Muito bem, então vamos começar uma nova etapa dessa série: Digitalminds 2.0.

Já faz tempo que quero refazer o Digitalminds Blogging Engine, que mesmo tendo esse nome bastante pomposo é um script muito furreca, todo remendado, escrito na correria entre trabalhos. Então, vamos nessa? Vamos refazer juntos o DBE, usando os conceitos que falamos, e, ao final do projeto, lançamos o DBE como um produto open source para livre download?

Acho que é uma idéia legal. Tudo bem que já existe o WordPress, etc e tal, mas... se a gente for por aí, TUDO já existe. A idéia é aprender e curtir o processo. Quem se habilita?

Até a próxima. Não percam o próximo artigo, vamos listar nossas premissas para o projeto e quero as opiniões de vocês. Abraço.

23 Comentários:

[Nelson]  Finalmente apareceu :), eu me habilito.  [REPLY]

[Tarcísio Sassara]  Oh! Essa vai ser boa. Estarei acompanhando de perto.  [REPLY]

[Diego]  Muito boa essa série... Cheguei aqui pelo RSS do Bruno Torres... Gostei muito dos artigos ... A parte de OOP sempre foi meio obscura para mim... E seus artigos esclareceram bem o conceito!!! Vou continuar acompanhando...   [LINK]  [REPLY]

[Filipe]  Tô nessa, tb!!!  [LINK]  [REPLY]

[Edi Eco]  Muito bom o artigo. Há algum tempo estou tentando melhorar minha codificação, com certeza essa série irá ser de grande ajuda no meu caminho. Também comecei a programar há muitos anos, em um TK85 usando as antigas revistas Inputs como referência, e depois de todos esses anos vejo que está na hora de evoluir. Obrigado e Abraços.  [REPLY]

[danilo]  Valeu Nelson! Grande Abraço  [REPLY]

[danilo]  Obrigado Tarcísio! Até lá.  [REPLY]

[danilo]  Muito obrigado Diogo, o Bruno é chapa faz tempo! Abração.  [REPLY]

[danilo]  Valeu Filipi!

[danilo]  Muito obrigado, Edi. Vamos nessa!  [REPLY]

[Sérgio]  Beleza de artigo, Danilo! Muito divertido e explanatório como poucos conseguem. Vim também pelo rss do Bruno Torres e agora vou voltar sempre. []´s  [REPLY]

[Cristóferson Bueno]  Opa Danilo, sumido cara. O DM só não tá mais parado que o ConversaDeBar rsrs... To pra te falar que apesar de já existir WordPress, Typo e afins eu topo ajudar nesse projeto, to querendo mudar o CdB também, talvez esse seja o momento :) Abração até mais.  [REPLY]

[Leandro]  Olá Danilo, até que enfim :) ... Achei muito boa a idéia, to engatinhando no OO, e estou querendo ajudar no que for possível. Ainda não tenho nenhum site porque sempre quis fazer o meu sem utilizar alguma coisa pronta como o wordpress e acho que essa é a hora. Até mais...  [REPLY]

[tigo]  não tenho o nível da galera aqui mas se der eu ajudo.  [REPLY]

[Tiagomac]  Opa, vamos nessa, eu já to presente :)!  [REPLY]

[danilo]  Valeu Sérgio, vamos lá!

[danilo]  É isso aí Leandro. Espero que curta.   [REPLY]

[danilo]  Cristóferson! Até que enfim apareceu! Grande Abraço.  [REPLY]

[Cristóferson Bueno]  Pois é cara, to sumido mesmo, as coisas andam meio agitadas pro meu lado, to estudando pro mestrado e desenvolvendo um framework web em C# para a empresa que trabalhando atualmente. Isso tá me consumindo tempo de mais : ) Mas to querendo me organizar e voltar a ter uma vida ativa na web tbm rsrs... nem meus feeds tenho lido ultimamente! Os artigos de OO estão legais, vou escrever alguns sobre Design Patterns, assim aproveito o que eu já tenho estudado e trabalhado ;) Um abraço Danilo!  [REPLY]

[Négris]  Excelente post cara!!! Adorei mesmo... Se quiser mais uma cabeça pensante no upgrade do DigitalMinds pode contar comigo!!  [LINK]  [REPLY]

[danilo]  Valeu Négris! Conto com você!  [REPLY]

[Emiliano ESB]  Opa! tamos aê! Me hablite!  [REPLY]

[Junio]  Estou curtindo muito seus artigos, lendo, relendo-os e digitando linha por linha vou aprendendo contigo.Um forte abraço e sucessos par ti!  [REPLY]

2006-09-17 05:34:55
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 6)

(Para ver todas as partes desta série clique aqui)

Olá, pessoal, já estamos aqui de volta para falar mais um pouquinho sobre OOP, PHP, e outras siglas igualmente ininteligíveis. Hoje quero falar sobre um tema que sempre gera muita confusão: interfaces. E, é claro, não podemos falar de interface sem olhar a etimologia dessa palavra.

O prefixo inter- vem da preposição latina inter, que significa "entre, no meio de". A palavra face, também de origem latina (fascia), significa "camada externa". Juntando as duas coisas, temos um termo genérico que significa praticamente qualquer coisa em tecnologia. Temos interfaces gráficas, interfaces com o usuário, interfaces RS232, interfaces usb, e por aí vai.

O conceito denominado de interface em OOP é bastante diferente disso tudo. No nosso mundo imaginário de carros, superpoderes, gnomos e outras criaturas fantásticas orientadas a objeto, interfaces são simplesmente definições padronizadas de acesso a funções que estão dentro das classes que as implementam. Falando assim parece bem complicado, mas não é não. Na verdade, na verdade, se a gente olhar com muito cuidado, nós de fato já usamos o conceito de interface aqui mesmo nos artigos anteriores.

Explico: quando nós criamos uma classe, estamos criando também uma interface. Lembra que nós construímos dois carros, um FiatUno e uma FerrariF1, e ambos podiam ->acelerar() ? Justamente! Ajoelhe-se diante do poder das interfaces!

Ao estender a classe Automovel para criar a classe FiatUno e a classe FerrariF1 nós estamos automaticamente implementando a interface usada na classe automóvel nas duas. Assim, temos absoluta certeza que todas as classes-filhas da classe Automovel vão poder ->acelerar(). Esse é exatamente o conceito de interface: a padronização do acesso aos dados e funções de uma classe ou objeto.

Mas o que é realmente interessante é que algum desses gênios malucos que inventaram os conceitos de OOP acordou um belo dia e teve uma idéia brilhante: "Perai, mas eu não preciso ter que criar classes-filhas toda hora pra usar uma interface!". Nasciam as palavras-chave interface e implements, que permitem a criação de interfaces que podem ser usadas entre classes que não tem nenhum parentesco entre si.

E eu estou aqui para provar tudo isso implementando Superpoderes em Automóveis! Você há de concordar que um Automovel não tem nada a ver com um SerHumano, já que eles não têm nenhum parentesco. Como ter certeza que essas classes e todos os seus filhos possam usar objetos da classe SuperPoder de forma padronizada? É fácil:

Primeiro, criamos a interface SuperHeroi:

 interface SuperHeroi {
    public function ativar(SuperPoder $superpoder);
} 

Bom, como você pode notar, a função ativar só vai funcionar se você mandar pra ela o SuperPoder desejado durante a chamada da função. Se mandar texto, número ou qualquer outra coisa vai ganhar um erro de presente.

Agora vamos alterar nossas classes Automovel e SerHumano para implementar a interface SuperHeroi:

Class SerHumano implements SuperHeroi { 	
    public $nome;
    public $vivo; 	
    public function __construct($nome) {
        $this->nome = $nome;
        $this->vivo = true;  	
    }
    public function taVivo() { 
        if($this->vivo == true) {             		
            print "Sim, eu estou vivo, e meu nome é $this->nome!"; 	
        } else {             	
            print "..."; 	
        }  	
    }
    public function ativar(SuperPoder $superpoder){
        $superpoder->ativar()
    }
} 

e agora a classe Automovel:

 abstract class Automovel implements SuperHeroi {
     public $aceleracao;
     public $velocidade_atual;
     public $cor;

     public function acelerar() {
        $this->velocidade_atual = $this->velocidade_atual + $this->aceleracao;
        print "Acelerando! Agora a velocidade é de " . $this->velocidade_atual . "Km/h!";
     }    
    public function ativar(SuperPoder $superpoder){
        $superpoder->ativar();
    }
 }

 

Agora, tanto os objetos SerHumano quanto objetos da classe Automovel (incluindo aqueles das classes FiatUno e FerrariF1, já que pela herança um FiatUno ou uma FerrariF1 sempre têm todas as propriedades e funções da classe Automovel) já podem ->ativar() um SuperPoder. Como a classe SuperPoder é abstrata e ninguém consegue ativar um SuperPoder abstrato, vou ativar a SuperForca:

$meucarro = new FerrariF1('vermelha'); 
$meucarro->ativar(new SuperForca);
// Meu deus, posso levantar um caminhão! 

E os gnomos, você deve estar se perguntando. Eles virão... Eles virão...

18 Comentários:

[Marco Gomes]  Acho que vc fez uma confusão aí nos códigos, vc criou uma interface interface SuperHeroi e, no automóvel, implementou SuperPoder. Quem está confuso sou eu ou você?  [LINK]

[danilo]  Fala Marco! Tem toda razão fiz uma confusão por aqui. Já corrigi, grande abraço!  [REPLY]

[João Antônio]  Essa orientação que o ZEN demonstra é muito boa!! Esse é o mesmo ZEN do CSS, porque é muito bom tb!! Abraço  [REPLY]

[Tarcísio Sassara]  Nossa, colega. Muito bom! Acredito que meu QI aumentou 15%!!  [REPLY]

[danilo]  Valeu João! Grande Abraço!  [REPLY]

[danilo]  Obrigado Tarcísio! Grande Abraço também!

[Tarcísio Sassara]  Danilo, estou prestes a adquirir um livro, você poderia indicar alguns outros livros que seja legal para quem está começando com o php? Eu tenho conhecimento de Lógica, programo em VB, mas agora estou migrando para a plataforma WEB. E escolhi o PHP pelas vantagens que ele oferece. Segue o link do livro que irei comprar.  [LINK]  [REPLY]

[danilo]  Olha Tarcisio, infelizmente acho que os melhores livros são em ingles... o melhor é o da Apress chamado PHP 5 Objects, Patterns, and Practice...

[Tarcísio Sassara]  Concordo, os melhores títulos são os escritos na língua inglesa, estou lendo também o titulo "PHP 5 and MySQL Bible", este peguei emprestado, o inglês não é um problemão, mas é muito chato, ainda por enquanto para mim, ficar lendo muitas horas me cansa. O titulo que comentei anteriormente anteriormente, é uma tradução do americano: PHP and MySQL Web Development. Agradeço pela dica, vou dar uma olhada no livro que você citou!  [REPLY]

[Giovanni]  eu queria um convite pro Wasabi, leio há tempos sobre ele, mas nao consegui um convite... agradeço a atenção ! bom final de semana !  [REPLY]

[danilo]  Já te mando, Giovanni! Grande Abraço.  [REPLY]

[André Valongueiro]  Q blza garotão! Uma das séries de artigos mais legais que já li na blogosfera. Clareou a vida! Cheguei atrasado mas estou em dia com as leituras, aguardando o próximo artigo. Meus parabéns veinho! Abração.  [REPLY]

[Leandro]  Tá muito bom seus posts sobre OO. Estou aguardando a aparição dos gnomos.  [REPLY]

[Danilo]  Oi Junio, veja a parte 4, as definições das classes FerrariF1 e FiatUno estão lá, precisa digitar tudo, ok? Abraço grande!  [LINK]  [REPLY]

[Junio]  Olá Danilo Medeiros estou estudando PHP, tendo você como professor, escrevi todas estas linhas de códigos e quando vou executar aparece: "Fatal error: Class 'FerrariF1' not found ".Agradeço desde já.  [REPLY]

[Junio]  Danilo Medeiros, irei criar três arquivos ".php", automovel, serhumano e interface ?  [REPLY]

[danilo]  Voce pode colocar cada classe em um arquivo, sim, Junio, mas vai ter que fazer um include no seu arquivo principal para que eles sejam lidos, ok?  [REPLY]

[Junio]  Muito obrigado pela atenção Danilo, desejo paz e saude para ti.  [REPLY]