Posts Tagged ‘fotos’

Imprudência no trânsito de Curitiba

Postado em 02 ago 2009
Categoria(s) Reflexões

No dia 02/08/2009 por volta das 02h40min da madrugada, na Rua Alfredo Brufen. Um veículo Troller Prata de placa ALY-0228 conduzido em alta velocidade chocou-se com dois outros veículos estacionados, um Escort Perua e uma Pajero TR4. O veículo Troller fugiu do local da batida.

Testemunhas alegam que antes de chocar-se nos dois carros acima, o veículo Troller já havia se chocado com outro veículo e fugido.

Após a colisão com o Escort Perua e Pajero TR4, o veículo Troller saiu fugindo em alta velocidade, passando no sinal vermelho no cruzamento das Ruas Amintas de Barros e Mariano Torres, nesse cruzamento o veículo Troller provocou mais um acidente, chocou-se com um Renault Clio Sedan, onde havia uma família que estava retornando de uma festa, fugindo novamente do local.

Fotos da colisão do Troller com o Escort Perua e Pajero TR4

foto

foto_1

foto_2

foto_4

foto_5

foto_6

foto_7

foto_3

Fotos da colisão do Troller com o Renault Clio Sedan

Img00003

  • Share/Bookmark

Ruby on Rails ActiveRecord como excluir registros dependentes e arquivos anexados com o Paperclip

Postado em 10 jun 2009
Categoria(s) Ruby on Rails

Digamos que você tenha uma mensagem, e essa mensagem possa ter várias fotos e vídeos relacionadas com ela.

Com o model message.rb da forma abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Message < ActiveRecord::Base
  # associações
  belongs_to :user
  has_many :photos
  has_many :videos
 
  # validações
  # presença
  validates_presence_of :title
  validates_presence_of :content
 
  # tamanho máximo
  validates_length_of :title, :maximum => 255
end

Se você usar Paperclip para anexar as fotos e vídeos, quando você apagar uma mensagem os arquivos de fotos e vídeos iram continuar a existir no disco rígido.

Para forçar que todas as relações filhas sejam apagadas quando você excluir a mensagem, você deve adicionar :dependent => :destroy na declaração has_many, ficando assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Message < ActiveRecord::Base
  # associações
  belongs_to :user
  has_many :photos, :dependent => :destroy
  has_many :videos, :dependent => :destroy
 
  # validações
  # presença
  validates_presence_of :title
  validates_presence_of :content
 
  # tamanho máximo
  validates_length_of :title, :maximum => 255
end

Essa alteração força para que todos os dependentes sejam excluídos.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Sistema de gerenciamento de torneios de futebol

Postado em 02 abr 2009
Categoria(s) CSS, Projetos, Ruby on Rails, WEB, Web 2.0

Essa semana eu entreguei um sistema de gerenciamento de torneios de futebol, eu já tinha feito esse sistema há um tempo atrás em PHP, mas percebi que estava muito enrolado para dar manunteção no código então resolvi refazer ele do zero em Ruby on Rails 2.2.2, aproveitei também para fazer diversas melhorias e implementar novos conceitos.

Esse sistema está disponível em http://campeonatos.centroirai.com.br, ele é um sistema universal de gerenciamento de torneios de futebol, ou seja, é possível colocar nele vários formatos diferentes de torneios de futebol e o sistema consegue gerenciar todo o conteúdo.

Página Inicial

O sistema é composto de duas áreas, a primeira é a área de visualização do visitantes http://campeonatos.centroirai.com.br a segunda é a área administrativa http://campeonatos.centroirai.com.br/admin, através da área administrativa é possível administrar todos as informações que compõem um determinado torneio.

Área Administrativa

Área Administrativa

O sistema trabalha em cima de torneios, desta forma o principal conteúdo é o torneio e todos os demais conteúdos estão relacionados com o torneio.

No gerenciamento do torneio é possível definir se ele está ativo, uma imagem para ilustrar, data de início, data de término, também é possível definir se o torneio está aberto para receber pré-inscrições de jogadores, essa opção permite que as pessoas interessadas possam fazer a sua pré-inscrição para participar do torneio.

Cadastro de Torneio

Cadastro de Torneio

A grande parte dos conteúdos do sistema aceitam descrição, para os campos de descrição foi usado o MCE Editor, desta forma é possível dar uma maior flexibilidade para o usuário alimentar o conteúdo do sistema.

Através da área administrativa é possível gerenciar os jogadores, gerenciar as equipes, fazer a associação entre jogadores e equipes, definir as etapas do torneio, os grupos dentro de cada etapa, gerenciar os jogos (definindo o confronto, data e hora), gerenciamento de placares dos jogos, gerenciamento de empresas que apoiam o torneio, gerenciamento de álbum de fotos, gerenciamento de vídeos com upload no formato flv e conteúdo do YouTube. O sistema também proporciona a criação de banners no topo, rodapé e menu lateral para cada torneio, desta forma é possível ter patrocinadores específicos para cada torneio. Todas as pré-inscrições recebidas também podem ser gerenciadas através da área administrativa, bem como o regulamento do torneio, que aceita descrição ou upload de um arquivo PDF com o regulamento.

Associação de jogadores x equipes

Associação de jogadores x equipes

Tanto as etapas como os grupos podem ser ordenados através de drag e drop, esse ordenamento é levando em consideração na exibição dos jogos e classificações na área de visualização dos visitantes.

Ordenação de etapas drag e drop

Ordenação de etapas drag e drop

Cadastro de jogo

Cadastro de jogo

Na definição do placar e possível definir a quantidade de gols que cada jogador de cada time vez, desta forma o sistema consegue obter a artilharia do torneio.

Cadastro de placar

Cadastro de placar

O sistema aceita N álbuns de fotos, e N fotos relacionadas com o álbum, os formatos de imagens aceitos são jpg, gif ou png. Todos os conteúdos que tem imagens trabalham com lightbox para exibição das imagens e navegação entre próxima e anterior.

Lightbox para as imagens

Lightbox para as imagens

Para agregar mais informação e interesse no sistema foi adicionado a parte de vídeos, onde e possível fazer upload de arquivos FLV ou vincular o conteúdo com o YouTube.

Vídeos do YouTube

Vídeos do YouTube

Vídeo FLV

Vídeo FLV

Já na área de visualização pelos visitantes existe a funcionalidade acompanhar o desempenho da equipe, ver os próximos jogos, classificação no torneio, os jogadores que fazem parte de cada equipe, regulamento, artilharia, fotos, vídeos, empresas que apoiam o torneio e banners de patrocionadores no topo, rodapé e menu lateral.

Página da equipe

Página da equipe

Classificações do torneio

Classificações do torneio

Jogos do torneio

Jogos do torneio

Artilharia do torneio

Artilharia do torneio

Álbuns de fotos

Álbuns de fotos

Vídeos

Vídeos

Para construir esse projeto em Ruby on Rails eu usei as gems: fastercsv (para exportar os contatos dos jogadores para csv), will_paginate, paperclip e os plugins: activerecord_i18n_defaults e lightbox.

  • Share/Bookmark

Instalando e usando o plugin paperClip no Ruby on Rails

Postado em 18 dez 2008
Categoria(s) Ruby on Rails

O plugin paperClip do Ruby on Rails é muito bacana, agiliza muito a vida, com ele é possível fazer upload de imagens e já gerar várias dimensões da imagem.

Vou explicar como instalar e como usar.

Instalação:

Faça o download do paperClip: http://github.com/tarballs/thoughtbot-paperclip-18c0246c11c51dafa77b6367ddaf730684d0e752.zip

Descompacte o arquivo e renomei o diretório extraído para paperclip.

Coloque esse diretório dentro de seu_projeto/vendor/plugins/paperclip.

Você vai precisar do imageMagick, através dele o paperClip faz o resize nas imagens. Para instalar no Ubuntu 8.04 faça:

1
sudo apt-get install imagemagick

Configuração:

Para o paperClip funcionar você vai precisar que exista 4 novas colunas na sua tabela são elas: image_file_name, image_content_type, image_file_size, image_updated_at.

Esse nome image_… pode ser qualquer outra coisa por exemplo: avatar_…, foto_…

Seguindo essa ideia você poderia ter um migrate mais ou menos assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CreateTournaments < ActiveRecord::Migration
  def self.up
    create_table :tournaments do |t|
      t.column :name,               :string,    :limit => 100, :null => false
      t.column :description,        :text,      :null => true
      t.column :image_file_name,    :string
      t.column :image_content_type, :string
      t.column :image_file_size,    :integer
      t.column :image_updated_at,   :timestamp
      t.column :is_active,          :boolean,   :null => false, :default => false
      t.column :start_date,         :date,      :null => false
      t.column :end_date,           :date,      :null => false
      t.column :created_at,         :timestamp, :null => false
      t.column :updated_at,         :timestamp, :null => false
    end
  end
 
  def self.down
    drop_table :tournaments
  end
end

Agora é necessário informar o seu model que existirá anexos e que formatos são aceitos:

1
2
3
4
5
6
7
8
9
10
class Tournament < ActiveRecord::Base
  has_attached_file :image,
                    :styles => {:large => '600x600>', :medium => '300x300>', :small => '150x150>', :thumb => '50x50>'},
                    :path => ":rails_root/public/images/:class/:id/:style_:basename.:extension",
                    :url => "/images/:class/:id/:style_:basename.:extension"
 
  validates_uniqueness_of :name
  validates_presence_of   :name, :start_date, :end_date
  validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/png', 'image/gif']
end

O interessante da linha abaixo, é que posso definir todos os tamanhos de imagens que desejo gerar em cima da imagem original, nesse trecho de código eu também alterei o path de armazenamento das imagens, fiz as imagens ficarem no diretório public_html/images/tournaments/id_do_banco_de_dados/imagens_em_diversas_dimensões:

1
2
3
4
  has_attached_file :image,
                    :styles => {:large => '600x600>', :medium => '300x300>', :small => '150x150>', :thumb => '50x50>'},
                    :path => ":rails_root/public/images/:class/:id/:style_:basename.:extension",
                    :url => "/images/:class/:id/:style_:basename.:extension"

A linha seguinte informa os tipos de mime types aceitos:

1
  validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/png', 'image/gif']

Agora você precisa definir que o seu formulário de cadastro trabalha com multipart, para enviar dados binários:

1
2
3
4
  <% form_for :tournament, @tournament, :url => { :action => 'create' }, :html => { :multipart => true } do |form| %>
    <%= render :partial => 'form', :locals => { :form => form } %>
    <div class="submit"><%= submit_tag "Criar" %></div>
  <% end %>

No código acima eu chamo o partial _form.rhtml, segue o seu conteúdo abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%= error_messages_for 'tournament' %>
 
<!--[form:tournament]-->
<p><label for="tournament_name">Nome</label>
<%= form.text_field :name  %></p>
 
<p><label for="tournament_description">Descrição</label>
<%= form.text_area :description  %></p>
 
<p><label for="tournament_image">Imagem</label>
<%= form.file_field :image %></p>
 
<p><label for="tournament_is_active">Ativo</label>
<%= form.check_box :is_active  %>
 
<p><label for="tournament_start_date">Data de início</label>
<%= form.date_select(:start_date, :order => [:day, :month, :year], :use_month_numbers => true) %></p>
 
<p><label for="tournament_end_date">Data de término</label>
<%= form.date_select(:end_date, :order => [:day, :month, :year], :use_month_numbers => true)  %></p>
<!--[eoform:tournament]-->

Nesse partial _form.rhtml é declarado o campo para upload da imagem:

1
<%= form.file_field :image %>

Perceba que na tabela do banco de dados não existe a coluna chamada image, mas sim aquelas 4 que criei no migrate. Aqui que entra a mágica do paperClip juntamente com o model, ele consegue fazer o upload da imagem e definir os valores para os 4 campos no model.

Para exibir as imagens e suas diversas proporções use:

1
2
3
4
<%= image_tag @tournament.image.url(:thumb)  %>
<%= image_tag @tournament.image.url(:small)  %>
<%= image_tag @tournament.image.url(:medium)  %>
<%= image_tag @tournament.image.url(:large)  %>

Pronto! Depois de pegar o jeito com o paperClip você vai dar risada a toa. ;-)

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Como foi o Yahoo! Hack Day 2008 no Brasil

Postado em 10 nov 2008
Categoria(s) Reflexões

Pessoal,

Eu e o Nei nesse final de semanas participamos do Yahoo! Hack Day e construímos essa aplicação: http://www.patrickespake.com/hacktrip/web/ busque por cidades internacionais.

O objetivo da nossa aplicação era buscar informações sobre uma determinada cidade, mostrando informações sobre hotéis, notícias, restaurantes, dúvidas, trips, fotos e mapa.

Para construir o projeto nós usamos o symfony, svn (unfuddle.com), Prototype, Scriptaculous e algumas Api’s do Yahoo descritas abaixo:

1. Para Hotéis nós usamos a api: Yahoo local (http://developer.yahoo.com/local/) essa api é meio estranha não funciona muito legal, os parâmetros de configuração na documentação não funcionam como o esperado e as vezes trazem uns destinos malucos, funciona +- para destinos internacionais;
2. Para Restaurantes usamos a api: Yahoo local mesmo problema descrito acima;
3. Para Notícias usamos a api: BOSS (http://developer.yahoo.com/search/boss/), essa api foi mais tranquila de usar e a documentação está funcionando legal para ela, ela server para fazer buscar dos resultados do mecanismo de busca do Yahoo para uma determina string, fotos e notícias;
4. Para Trips usamos a api: Travel (http://developer.yahoo.com/travel/) essa api é bem enrolada, ela disse que trás uma porção de coisas e na verdade só traz trips marcadas pelas pessoas;
5. Para Fotos usamos a api: Flickr (http://developer.yahoo.com/flickr/) essa api permite puxar fotos uma determinada tag e conjuntos de tags ficou um recurso interessante para puxar fotos de uma determinada cidade, mas ela é meio enrolada na parte que informa onde essa api pode ou não pode ser usada;
6. Para Mapa usamos a api: Google Maps, nós tentamos usar a api de mapas do Yahoo, mas ela é muito ruim e o mapa é feio para caramba, se contar que a gente mandava setar os marcadores no mapa e algumas vezes ele se perdia, nós construímos dois mapas um com o Yahoo e outro com o Google e mandamos setar os marcadadores o do Yahoo alguns marcadores ficaram errados. Essa api de mapa deles é meio bichada.

Uma coisa legal que a gente fez foi implementar a api do geonames.org, essa api permite buscar cidades no mundo inteiro, nós usamos ela para fazer o autocomplete do campo de busca, você digita o nome da cidade e ele começa a buscar as informações de geo desse destino.

A minha conclusão sobre as Api’s do Yahoo! são as seguintes:

Elas são ruins, não são muito boas, falta documentação de qualidade e muitas vezes elas tem um comportamento estranho. As únicas api’s que parecem ser melhores são as do Yahoo! Respostas, Delicious e Flickr, as demais são meio problemáticas. O mais interessante é que a gente conversou com várias pessoas do Yahoo! sobre essas deficiências e eles nós aconselhavam a usar as api’s do Google ou de outros, é molé. Eu esperava que eles falassem que as api’s deles tem problemas e estão trabalhando para melhorar, mas na verdade não.

Bom na verdade eu esperava mais em termos de tecnologia legal deles, e fiquei meio desencatado para usar essas Api’s. Muitas só permitem sugar informações e não permitem interação.

O Nei perguntou sobre as Api’s Local e Travel e os caras nem sabiam que existiam, teve que aparecer um dev gringo para testar e descobrir algumas informações para a gente.

No geral os outros devs do evento também tiveram a mesma sensação que a nossa, essas críticas eram os comentários gerais do evento e até nas apresentações dos projetos o pessoal aproveitou para criticar esses problemas.

Eu acredito que o evento acabou tendo um efeito contrário, ao invés do pessoal querer usar as api’s do Yahoo eles agoram sabem todos esses problemas e perderam o interesse.

Para quem tiver interesse pode baixar o projeto: http://www.patrickespake.com/hacktrip.tar.gz

Abraço.

  • Share/Bookmark