Avançar para a área de conteúdo

ir para o conteúdo principal

developerWorks Brasil  >  Linux  >

Perl Elaborado: Perl e a nuvem Amazon, Parte 3

Faça Upload de Imagens e Crie, Edite e Exclua Comentários

developerWorks
Opções de documento

Opções de documento que necessitam de JavaScript não são exibidas

Código de amostra


Classificar esta página

Ajude-nos a melhorar este conteúdo


Nível: Intermediário

Teodor ZlatanovGold Software Systems

14/Jun/2009

Esta série de cinco partes o conduz pela construção de um Web site simples de compartilhamento de fotos utilizando Perl e Apache para acessar o SimpleDB e o Simple Storage Service (S3) do Amazon. Nesta parte, siga a interação do seu site com o SimpleDB aprendendo como a URL cria um registro do SimpleDB para o arquivo transferido por upload. Além disso, aprenda como criar, editar e excluir componentes como registros do SimpleDB em uma foto para um usuário específico.

Já passou algum tempo desde a última parte, então vamos recapitular:

  • A Parte 1 explicou as arquiteturas S3/SimpleDB e como utilizá-las através de exemplos práticos.
  • A Parte 2 mostrou como fazer o upload de um arquivo no S3 a partir de uma página da Web através de um formulário HTML, minimizando a carga no servidor.
Para Tirar o Máximo Proveito desta Série

Esta série requer conhecimento de nível principiante de HTTP e HTML, assim como conhecimento de nível intermediário de JavaScript e Perl (em um processo mod_perl Apache). Um pouco de conhecimento em bancos de dados relacionais, armazenamento em disco e redes também será útil. A série fica cada vez mais técnica, portanto, consulte a seção Recursos se precisar de ajuda com qualquer um desses tópicos.

Agora vamos realmente entrar de cabeça na interação do site de compartilhamento de fotos com o SimpleDB do Amazon aprendendo como uma URL bem-sucedida cria um registro do SimpleDB para o arquivo transferido por upload e aprendendo como criar, editar e excluir componentes como registros do SimpleDB em uma foto para um usuário específico. (Lembre-se, não estamos comparando SimpleDB com o BigTable do Google ou com soluções independentes como CouchDB.)

Como nas partes anteriores, vou utilizar share.lifelogs.com como nome de domínio.

Mas Primeiro, a Estrutura do Banco de Dados

Referindo-se novamente à Parte 1, nós configuramos uma estrutura de tabela semelhante à da Lista 1:


Lista 1. A Estrutura de Tabela da Parte 1

share_photos:
"http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif"
{ user: "ted", name: "Amazon Logo"}

"http://images.share.lifelogs.com/funny.jpg"
{ user: "bob", name: "Funny Picture",  s3bucket: "images.share.lifelogs.com" }

share_users:
"ted" { given: "Ted", family: "Zlatanov" }
"bob" { given: "Bob", family: "Leech" }

share_comments:
"random-string"
{
 url: "http://images.share.lifelogs.com/funny.jpg",
 comment: "Ha ha",
 posted_when: "2009-03-01T19:00:00+05"
}

"random-string2"
{
 user: "ted",
 url: "http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif",
 comment: "No it doesn't",
 posted_when: "2009-03-01T20:00:01+05"
}

"random-string3"
{
 url: "http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif",
 comment: "No it doesn't",
 reply_to: "random-string2",
 posted_when: "2009-03-01T20:00:01+05"
}

Nesta versão da estrutura, você pode armazenar todos os comentários em um encadeamento dentro de uma estrutura de comentário, mas isso tornaria perigoso permitir que os usuários excluam ou editem um comentário no mesmo encadeamento ao mesmo tempo.

Como observei na Parte 1, essa estrutura está sujeita à mudança. Uma grande vantagem do SimpleDB é sua flexibilidade, então vamos usá-lo. "Uma consistência tola é o fantasma das mentes pequenas," disse Emerson. É claro, ele também disse "Detesto citações." Esqueça esses transcendentalistas que só falam bobagens.

Achei a área de rascunho do SimpleDB menos útil do que fazer as chamadas diretamente a partir do código, mas talvez você goste. Veja a seção Recursos para conhecer a URL da área de rascunho. Também é possível comprar várias ferramentas de gerenciamento do SimpleDB, utilizar a gratuita do Firefox ou experimentar o shell típico. Tudo isso está na seção Recursos; siga em frente e gerencie.



Voltar para parte superior


Fazendo Upload e Modificando Imagens

Primeiro de tudo, observe que o SimpleDB permite vários valores para uma única chave. A URL da imagem que mencionei ou o texto do comentário poderiam ser arrays, e não valores únicos. Nós não utilizamos esse recurso, mas preferimos manter as coisas simples com um valor por chave.

Vamos começar com a atualização da imagem. Cada vez que um upload for realizado, você vai executar o código para incluir a nova imagem na tabela share_photos. A Parte 2 mostrou o formulário de upload do S3; e da próxima vez, você vai conectar esse formulário ao código gravado aqui.

Por enquanto, vamos gravar um script simples para incluir uma imagem. Você receberá um nome de usuário, uma URL, um nome de imagem e um nome de depósito do S3 opcional. O depósito do S3 será apenas um campo na tabela; a URL será suficiente para exibir e utilizar a imagem. Nós gostaríamos de rejeitar uploads com URL duplicada. Mas nós podemos?

O problema com um armazém de dados distribuído é que os dados que você acabou de colocar nele podem não ter progredido para a borda da rede. É como fazer uma ligação da Europa para o Japão (ou fazer qualquer coisa em um lugar onde você esteja enfrentando a latência da rede ou sinal de voz): há um pequeno atraso após cada sentença enquanto o outro lado se sincroniza com você. Você pode começar a conversar sem pausa, mas as respostas da pessoa do outro lado começarão a sobrepor as suas palavras e você vai se sentir como o Verdadeiro Gerente em uma Reunião Importante. Portanto, embora a latência seja boa para um discurso vigoroso, ela não é tão agradável se você quiser uma conversa civilizada.

Da mesma forma, quando você coloca dados no sistema SimpleDB, existe uma pausa enquanto os dados fluem para um datacenter. Bem, essa parte não foi confirmada pelo Amazon, mas eu ouvi dizer que ele fará parte de uma consciência galática e vai melhorar a vida dos seres lentos no sistema Runu (três parsecs a partir da Betelgeuse, espere um pouco e continue até vê-lo). Você vai fazer um favor para os seres lentos no sistema Runu cada vez que usar o SimpleDB. E você achou que este artigo não fosse educativo.

De qualquer forma, em paralelo com o aprimoramento da consciência galática, seus dados permanecem ativos e suas consultas o verão. Mas se você fez consultas antes de tudo isso acontecer, não só a consciência galática não vai melhorar, mas você só terá dados velhos. Portanto, não é tão simples quanto trabalhar com um banco de dados clássico como DB2, no qual seus dados permanecem ativos e existe o ACID garantindo que suas transações sejam confirmadas quando o banco de dados disser que elas estão. Com SimpleDB e outros bancos de dados "eventualmente consistentes", você apenas tem que conviver com a incerteza.

O ponto é que a atualização de imagens não é tão simples. Nós gostaríamos de rejeitar uploads com URL duplicada, mas nem sempre isso é possível. Imagine se Alice fizer o upload de http://horsey.com/wilbur.png e Bob também fizer o upload de http://horsey.com/wilbur.png ao mesmo tempo. Se o upload da Alice for concluído primeiro e o Bob não vir, o upload do Bob irá sobrescrevê-lo. Então, o que fazer?

Primeiro de tudo, você pode se perguntar "qual é o problema?". Os usuários ficam incomodados, mas isso não é um grande problema. Além disso, não é uma ocorrência provável. Bem, queremos usuários felizes e, se estivermos obcecados quanto à qualidade, lançar algo que obviamente não funciona direito vai nos incomodar até o dia da nossa morte.

Em vez de levarmos essa infelicidade para a cova, vamos modificar o design da nossa tabela para imagens, como mostra a Lista 2:


Lista 2. O Design da Tabela Modificado

share_photos:

"random-string10"
{ url: "http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif",
        user: "ted", name: "Amazon Logo"}

"random-string11"
{ url: "http://images.share.lifelogs.com/funny.jpg", user: "bob", name: "Funny Picture",
        s3bucket: "images.share.lifelogs.com" }

As random-strings que você viu até aqui são os UUIDs. Isso não está perfeito, mas pelo menos nossas imagens não vão se colidir se as URLs forem as mesmas. Mas espere... e os comentários das imagens? Fácil; vamos apenas mudar a chave estrangeira como na Lista 3:


Lista 3. Alterando a Chave Estrangeira

share_comments:

"random-string3"
{
 image_id: "random-string10",
 comment: "No it doesn't",
 reply_to: "random-string2",
 posted_when: "2009-03-01T20:00:01+05"
}

Agora temos que estar cientes de que podem existir várias entradas em share_photos com a mesma URL, mas, caso contrário, o sistema parecerá estar bem.

Entenda que em vez de mostrar a você a versão final artificialmente pronta das tabelas, estamos trabalhando juntos nela. Isso me permite mostrar a flexibilidade do SimpleDB e também o desenvolvimento ágil no seu melhor: inventar, testar, refinar, repetir. Em vez de planejar tudo, planejamos apenas o suficiente para chegarmos ao próximo estágio:

  • Nós não nos esquecemos do mais importante em nenhum momento.
  • Decisões de arquitetura não são tomadas ou alteradas tão facilmente quando decisões específicas de uma tarefa.

Então o upload de uma imagem é simples, certo? Basta incluir uma nova entrada no SimpleDB com a URL, o nome da imagem e o nome de usuário fornecidos. Um depósito S3 é opcional. Isso é feito com uma chamada PutAttributes.

Modificar uma imagem é igualmente fácil, mas vamos permitir apenas uma mudança de nome por enquanto. Isso também é feito com PutAttributes.



Voltar para parte superior


Incluindo e Modificando Comentários

Consulte a seção anterior para conhecer a tabela share_comments. Muito simples, de verdade: a inclusão de um comentário vai exigir o texto do comentário, o ID da imagem e, opcionalmente, o ID do comentário pai e um nome de usuário. A modificação de um comentário permitirá mudanças somente no texto do comentário por enquanto.



Voltar para parte superior


O Script Independente

Eu incluí um script Perl independente (simple_go.pl; você pode obtê-lo na seção Download na parte inferior deste artigo) para executar as tarefas que listei (incluir e modificar a imagem, incluir e modificar o comentário). Isso não criará os domínios, portanto, você vai precisar criar os domínios do SimpleDB share_photos.share.lifelogs.com e share_comments.share.lifelogs.com externamente. Isso é comum com o uso de qualquer conjunto de ferramentas de gerenciamento do SimpleDB. Observe que o comutador --domain mudará share.lifelogs.com para outra coisa para o nome de domínio completo (armazenado em $full_domain).

O script usa o módulo CPAN Data::UUID para gerar novos identificadores exclusivos.

O script é absolutamente cavalheiro quanto à manipulação de erros, optando por die() em cada oportunidade. Essa ação é pouco ativa e não é recomendada, e você deve evitá-la, a menos que esteja escrevendo artigos e queira mostrar ao mundo a perversidade absoluta dos programadores que escrevem artigos.

Seja bem-vindo.

As últimas tarefas envolvem o envio de uma instrução SELECT e a exclusão de um item. Vou mostrar como implementá-las aqui porque elas são simples e você vai precisar delas depois.

Para listar imagens, você chama o script, conforme mostrado na Lista 4:


Lista 4. Listando Imagens

./simple_go.pl -l -i --ak=accesskey --sk=secretkey

Cuidado: certifique-se de que a máquina na qual você está executando isto não esteja sendo utilizada por outras pessoas. Essas pessoas podem olhar na lista de processos e ver sua chave secreta do Amazon. Da mesma forma, se você estiver em um shell que mantém históricos, sua chave secreta acabará em seu arquivo de histórico. A melhor abordagem é passar um nome de arquivo e obter a senha desse arquivo, mas em benefício da simplicidade, eu não fiz essa implementação.

Para listar comentários:


Lista 5. Listando Comentários

./simple_go.pl -l -c --ak=accesskey --sk=secretkey

Bem simples até aqui. Internamente, o script chama o método $service->select(), analisa os resultados e imprime os dados com show_list(). Tudo é feito supondo-se que uma chave tem apenas um valor (observe que especificamos Replace=true no método put()), portanto, esse não é um script do SimpleDB de propósito geral.

Por que não um script de propósito geral? Porque não precisamos disso. Vejamos uma solução simples funcionando agora. Se precisarmos de diversos valores, podemos adaptar o script depois ou apenas gravar um novo código. Esse script é o playground para a criação das estruturas de banco de dados do nosso Web site.

Não se sinta tentado a utilizar esse script no site real ("Apenas vou chamar system() e permitir que os erros vão para um arquivo de log"). Sim, são apenas algumas centenas de linhas de código, e isso funciona, mas cada protótipo deve ser descartado sem pesar para que um programa real possa ser escrito. Não vamos abrir uma exceção para esse caso, mesmo que tenhamos crescido presos de alguma forma ao seu layout casual (quer dizer, "criativo") com indentações de um único espaço.

Voltando ao script. Criar uma nova imagem é simples (o depósito é opcional):


Lista 6. Criando uma Nova Imagem

./simple_go.pl -i --ak=accesskey --sk=secretkey -u ted --url="any url"
  --name="any name you like" --bucket=mybucket

A edição do nome da imagem (-l -i nos deu um ID de 25EC17B8-0F6B-11DE-A1A1-944E07F9DEC1). Agora isso cria uma imagem com um UUID exclusivo:


Lista 7. Criando uma Nova Imagem com um UUID Exclusivo

./simple_go.pl -i --ak=accesskey --sk=secretkey --name="new name"
  --id=25EC17B8-0F6B-11DE-A1A1-944E07F9DEC1

Da mesma forma, criar um comentário é fácil (user e refcommentid são opcionais):


Lista 8. Criando um Comentário

./simple_go.pl -c --ak=accesskey --sk=secretkey -u ted --refimageid="any image ID"
  --text="the text" --refcommentid='any comment ID'

Mais uma vez, o ID do comentário será um UUID exclusivo. A edição do texto do comentário é feita assim (-l -c nos deu um ID de 4BE2EA0A-0F6B-11DE-976B-A542FC6BD07C):


Lista 9. Criando um Comentário com um UUID Exclusivo

./simple_go.pl -c --ak=accesskey --sk=secretkey --text="the text"
  --id=4BE2EA0A-0F6B-11DE-976B-A542FC6BD07C

Por fim, a exclusão de imagens ou comentários funciona da seguinte forma:


Lista 10. Excluindo Imagens e Comentários

./simple_go.pl --delete -i --ak=accesskey --sk=secretkey
  --id=25EC17B8-0F6B-11DE-A1A1-944E07F9DEC1
./simple_go.pl --delete -c --ak=accesskey --sk=secretkey
  --id=4BE2EA0A-0F6B-11DE-976B-A542FC6BD07C



Voltar para parte superior


Encerramento

Esta parte mostrou como as imagens e os comentários são criados, editados e excluídos no banco de dados SimpleDB que suporta o site de compartilhamento de fotos que estamos construindo.

Nós estabelecemos o esquema (livremente) e implementamos uma ferramenta para incluir, listar, modificar e excluir imagens e comentários. Nós decidimos os UUIDs como chave primária para as imagens e os comentários para prevenir o improvável cenário de dois usuários fazendo o upload da mesma URL de imagem ao mesmo tempo.

Também estabelecemos que usaríamos apenas um valor único por chave, já que, atualmente, nosso esquema não requer mais e nosso objetivo é manter a simplicidade. Essa falha pode precisar ser abordada mais tarde no código, mas por enquanto vamos ter que conviver com isso.

Na Parte 4, você verá como começar a construir tudo isso em um Web site mod_perl.




Voltar para parte superior


Download

DescriçãoNomeTamanhoMétodo de download
Sample script for this articlesimple_go.zip4KBHTTP
Informações sobre métodos de download


Recursos

Aprender

Obter produtos e tecnologias

Discutir
  • Envolva-se na comunidade do My developerWorks; com seu perfil pessoal e sua página inicial customizada, você pode padronizar o developerWorks de acordo com seus interesses e interagir com outros usuários do developerWorks.


Sobre o autor

Teodor Zlatanov surgiu com um Mestrado em Ciências em engenharia da computação da Boston University em 1999. Trabalha como programador desde 1992, usando Perl, Java, C e C++. Seus interesses estão em trabalho em análise de textos de software livre, arquiteturas de banco de dados, interfaces com o usuário e administração do sistema UNIX.




Avalie esta página


Reserve um instante para completar este formulário para nos ajudar a servi-lo melhor.



 


 


Não
são úteis
Extremamente
úteis
 






Voltar para parte superior