Archive Page 2

07
out

PHP Conference 2008

Como todos já sabem pois já anunciamos em alguns ( vários ) lugares, este ano a Add4 Comunicação dará uma palestra sobre ORMs e seus benefícios no desenvolvimento ágil e estruturado no PHP Conference Brazil 2008.

Pois bem, estamos organizando um grupo para nos acompanhar no evento. Estaremos com camisetas ( limitadíssimas ) da Add4 e do PhpBURN para os membros da nossa comunidade e círculo de amigos, noivas, namoradas, amantes, etc. Quem tiver interesse em participar nos mande um email com Nome, Rg e palestras de interesse, pois organizaremos uma caravana ( sim isso vai tornar a entrada mais barata ) e assim nos integrarmos melhor.

Mandem os emails para phpconf (arroba) add4.com.br

Aguardamos vocês

02
out

Tradução: Rails Database Migration - Parte I

Aqui na Add4 Comunicação trabalhamos com Tecnologia, com isso nosso leque é enorme e uma das tecnolgias que estamos querendo começar a brincar é com Rails.

Uma das funcionalidades que mais tenho inveja de não ter em outros frameworks como Zend Framework e CodeIgniter é a migração de dados. Basicamente funciona da seguinte forma: Escreva o SQL em sua linguagem favorita, versione e navegue entre as várias versões do banco de dados.

Para entender um pouco mais sobre o funcionando das Migrations, eu comecei a traduzir um Guia Oficial que explica detalhadamente como funciona as migrações de dados no Rails.

Dividi em quatro partes, a primeira parte foi originalmente postada no meu blog e agora vou reproduzir aqui na integra.

Migrações em Banco de Dados em Rails

Migrações é a forma conveniente de você alterar seu banco de dados de uma maneira organizada e estruturada. Você poderia editar fragmentos de SQL na mão mas você teria a responsabilidade de comunicar aos outros desenvolvedores que eles precisam ir lá e executá-los. Você também necessita acompanhar as mudanças na máquina de produção na próxima vez que você for fazer deploy. O Active Record marca as migrações que já foram executadas e tudo que você precisa fazer é atualizar seu código e rodar rake db:migrate. O Active Record irá trabalhar para que suas migrações sejam executadas.

Migrações é a forma de você descrever essas transformações usando Ruby. A grande coisa disso tudo (como muito das funcionalidades do Active Record) é a independência do banco de dados: você não precisa se preocupar com mais nenhuma sintaxe para CREATE TABLE, ou que você se preocupe sobre variações de SELECT * (você pode abstrair os requisitos específicos de banco de dados SQL). Por exemplo, você poderia usar SQLite 3 no desenvolvimento, mas MySQL em produção.

Você aprenderá tudo sobre migrações incluindo:

  • Os geradores que você pode usar para criá-los
  • Os métodos que o Active Record provê para manipular seu banco de dados
  • As tarefas Rake que você pode manipular
  • Como eles são relativo ao schema.rb

1. Anatomia de uma migração

Antes de eu mergulhar nos detalhes de uma migração, aqui estão alguns exemplos curtos de coisas que você pode fazer:

class CreateProducts < ActiveRecord::Migration
  def self.up
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end

  def self.down
    drop_table :products
  end
end

A migração adiciona uma tabela chamada products com uma coluna string chamada name e uma coluna text chamada description. Uma chave primária chamada id também será adicionada, no entanto por padrão não precisamos pedir isso. As colunas timestamps created_at e updated_at que o Active Record preenche automaticamente também são adicionadas. Revertendo essa migração simplesmente remove a tabela.

Migrações não tem limite para alterar o esquema. Você pode usar para corrigir dados errados no banco de dados ou popular novos campos:

class AddReceiveNewsletterToUsers < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.boolean :receive_newsletter, :default => false
    end
    User.update_all ["receive_newsletter = ?", true]
  end

  def self.down
    remove_column :users, :receive_newsletter
  end
end

Esta migração adiciona a coluna receive_newsletter para a tabela users. Nós queremos que o padrão seja falso para novos usuários, mas para os usuários existentes nos consideramos que eles já fizeram a sua opção, então nos usamos o modelo User para setar a bandeira para true para usuários existentes.

1.1 Migrações sao classes

A migração é uma subclasse de ActiveRecord::Migration que implementa dois métodos: up (para realizar as transformações exigidas) e down (reverte o que foi feito).

O Active Record prover métodos para executar as tarefas comuns na definição dos dados independente do banco de dados (Você verá mais detalhes mais tarde):

  • create_table
  • change_table
  • drop_table
  • add_column
  • remove_column
  • change_column
  • rename_column
  • add_index
  • remove_index

Se você precisa executar tarefas específicas para seu banco de dados (por exemplo, criar uma chave estrangeira) então a função execute permite executar SQL arbitrarias. As migrações é apenas uma classe regular em Ruby, então você não esta limitado a apenas essas funções. Por exemplo, após adicionar uma coluna, você pode escrever código para setar o valor dessa coluna para dados existentes (se necessário usando seus modelos).

1.2 O que está no nome

Migrações sao armazenadas em arquivos em db/migrate, uma para cada classe de migração. O nome dos arquivos é na forma de YYYYMMDDHHMMSS_create_products.rb, ou seja, uma hora UTC identificando a migração seguida de um sublinhado e seguido do nome da migração. O Nome da classe de migração deve bater com a ultima parte do arquivo. Por exemplo, 20080906120000_create_products.rb deveria definir CreateProducts e 20080906120001_add_details_to_products.rb deveria definer AddDetailsToProducts. Se você acha que necessita mudar o nome do arquivo, então você deve atualizar o nome da classe dentro do arquivo ou então o Rails ira queixar-se que não existe a classe.

Internamente Rails usa apenas o numero da migração (data) para identificá-lo. Antes do Rails 2.1 os números das migrações eram iniciados em 1 e apenas incrementado cada vez que era gerado uma nova migração. Com múltiplos desenvolvedores era mais fácil haver colisões, necessitando você voltar e reordena-los. Você pode reverter para o esquema da velha numeração setando config.active_record.timestamped_migrations para false no environment.rb.

A combinação do tempo e o registro que permite executar as migrações foram a forma como o Rails fez para manipular as situações comuns que ocorrem com múltiplos desenvolvedores.

Por exemplo Alice adicionou a migração 20080906120000 e 20080906123000 e Bob adicionou 20080906124500 e rodou. Alice finaliza suas mudanças e checa nas suas migrações e Bob puxa as mais recentes atualizações. Rails sabe que ele não rodou as duas migrações de Alice assim rake db:migrate irá executá-los (Apesar que a migração do Bob seja executada uma hora mais tarde), e similarmente fazendo regreção da migração não teria executado esses dois métodos.

Claro que isso não substitui a comunicação dentro da equipe, por exemplo, na migração da Alice ela removeu uma tabela que Bob assumiu a existência na sua migração, então claro que um problema irá acontecer.

1.3 Mudando migrações

Ocasionalmente você comete um erro enquanto escrevia a migração. Se você já tiver executado a migração, então você não pode simplesmente editar e executar novamente a migração: Rails acha que a migração já foi executada, então ele não fará nada quando você rodar rake db:migrate. Você deve voltar a migração (por exemplo, com rake db:rollback), editar sua migração e rodar rake db:migrate para a correta versão.

No geral, editar migrações existentes não é uma boa idéia: você criará trabalho extra para você mesmo e para seus parceiros de trabalho e causar um maior problema se a versão da migração for rodada em uma máquina de produção. Em vez disso, você deve escrever uma nova migração para realizar as alterações que você solicita. Editando uma recém migração gerada e que ainda não foi commitada para o controle de versão (ou que geralmente não foi propagada além da sua máquina de desenvolvimento) é relativamente inofensivo. Apenas use com bom senso.

Até a próxima!

01
out

Php Conference Brasil

É com muito orgulho que eu, Kléderson Bueno, divulgo aqui no blog da Add4 Comunicação que estaremos participando do PHP Conference Brasil. A palestra enviada por mim para falar um pouco sobre ORM, Orientação a Objetos e nossa ferramenta em produção phpBurn, foi aprovada e está marcada para o dia 29/11/2008.

Esperamos atender todas as necessidades e desde já começamos a produzir um material para distribuir e apresentar durante a palestra. Aos que acompanham o blog eu estendo o convite e deixo aqui o banner para o PHP Conference. ( http://www.php.net/cal.php?id=3210&cm=11&cy=2008 )

PHP Conference Brasil - Add4 Comunicacao

Apareçam, a palestra vai ser bem interessante e será de grande valia para aumentarmos nossa comunidade em torno da ferramenta que agora foi transferida para o github .

Gostaria de confirmar também a presença de uma comunidade e equipe da Add4 Comunicação na Campus Party Brasil 2009 , este ano estaremos lá novamente agora como comunidade e família Add4.

Um grande abraço e nos vemos nestes eventos.

Klederson Bueno

07
set

Frameworks e coisas “OpenSource”

Baseado em um post no trackback

Bom, eu concordo com o cairo existem usuários e USUÁRIOS, nós na Add4 Comunicação utilizamos diversos frameworks como Lumine, CI, SimplePie, e phpBURN ( em producão própria ) mas não nos reduzimos a isso, quando surge uma nescecidade não suprida pelo(s) framework(s) ( como por exemplo o citado pelo Cairo.

O uso de memória que foi corrigido ou melhorado por ele ou níveis mais básicos como os relacionamentos mais simples ou mesmo paginação em relacionamentos.. afinal ninguem quer 1000 itens de um relacionamento, apenas os 10 primeiros ou mesmo paginar os mesmos, sei lá quaisquer necessidades básicas ) vamos um pouco além, o modificamos, o alteramos à nossa necessidade, então por exemplo temos um repositorio público do lumine por exemplo que está anos luz da versão convencional ( assim como a ibm faz com n softwares opensource como por exemplo o eclispe* ) então não acho que utilizar um framework seja um problema, o problema é se acomodar, aceitar erros e limitações:
- Alias é um problema sério dos desenvolvedores PHP** brazucas INFELIZMENTE ANÚNCIO: Se vc é diferente desse perfil “padrão” entre em contato conosco através do site ou contribua com os projetos openSource como o phpBURN.

A maioria dos desenvs ( principalmente em PHP e SIM, nós conhecemos outras linguagens o.O como rails, java, javascript, actionscript, .NET ( C#, VB, etc… e salvando as devidas proporções eles são mais “dinâmicos” ou ao menos sabem usar melhor o google e documentacao de suas api’s ) então minha conclusão sobre o uso de frameworks é que eles são muito úteis e quando chegam ao limite de uso é preciso adapta-los afinal são OpenSource sob licença GPL ou MIT ou CREATIVE então enjoy.

Frameworks ORM:
phpBURN: http://svn.phpburn.com/ ( made in Brazil by ADD4 Comunicação ) ainda em fase alpha e a propósito aceitamos contribuições de bom grado pois eh um projeto OpenSource ;)

Lumine (Customizado) o SVN é http://lumine.add4.com.br ( possível incompatibilidade com a versão corrente do site oficial porem tentando ser o mais compativel possível ) e não nos responsabilizamos pelo seu uso. Use por sua conta e risco :D pois eh uma versão beta ( moda da internet by google )

CastleProject ( .NET sim M$ é a mensageira do apocalipse mas não se pode esquecer de que vivemos num mundo capitalista e o mercado manda )

Hibernate e NHibernate ( inspirações para o phpBURN e para o Lumine )

06
set

Ainda insistindo em Windows?

Pois é, não querendo fazer apologia a nada ( uso mac os como OS primario e sou um appleaddict já ) mas coisas como este video abaixo nos fazem pensar no mundo, na fome, nas vergonhas que o windows nos faz passar, etc.

15
ago

Add4Maps e Google Maps = Rock’n'Roll

Olá,

Como prometido há um tempo atrás vou postar a versão alpha de um lib que tenho trabalhado como projeto pessoal para um mais fácil manuseio do google maps. Vou ser sucinto por que estou com pressa :)

vamos lá primeiro de tudo vamos ver o que usaremos para funcionar:

jQuery.js
ADD4Maps.js
Greversegeocoder.js (opcional)
GoogleMapsApi

No seu html a você deverá colocar:





Feito isso vamos ao ADD4Maps.js

A única parte que você precisa entender neste javascript para iniciar seu trabalho com os mapas é esta que está logo no início do arquivo:

	//Always charge it in frist load
	//Isso irá chamar o google Maps API
	google.load("maps", "2.x");

	//Global var
	//Define sua variável ( voce pode ter mais de um mapa tendo mais de uma variável )
	var userMap = "";

	jQuery(document).ready(function() {
		//Se quiser controlar melhor as inicializacoes dos mapas comente este funcao
		//basicamente ela inicia nosso mapa assim que o gmaps carrega
		google.setOnLoadCallback(initializeMaps);
	});

	//Funcao responsavel pela inicializaçao do mapa.
	//As únicas configs devem ficar aqui.
	function initializeMaps() {
		//Cria seu mapa na variavel userMap
		userMap = new ADD4Map({
			'divMap':'mapBlock', //Diz qual vai ser o id que receberá o mapa
			'addressContainer':'addressContainer', //Container para exibir endereços do stringToAddress
			'directionsContainer':'directionsContainer',//Container para receber as informacoes do gdirections
			'locale' : 'pt_BR', //Idioma do mapa
			'startLat': -23.555581, //Latitude inicial
			'startLon': -46.657533,//Longitude inicial
			'defaultIcon': "public/images/myIcon.png", //Define um icone próprio pra exibir no mapa bem legal se bem utilizada
		})
		//Inicializa o mapa de userMap
		userMap.initialize();
	}

Feito isso temos nosso mapa pronto e rodando? Não vamos montar a estrutura html BÁSICA ( receber apenas o mapa não vamos exemplificar endereços e direções aqui, a lib está bem documentada, basta dar uma olhada nos metodos e suas documentações afinal de contas ainda não estamos em uma versão final )

Pois é, realmente muito difícil fazer nosso mapa funcionar :)

Bom feito isso agora vamos pra parte divertida, usar o mapa, temos uma enorme lista de métodos nesta versão alpha e que funcionam muito bem vou exemplificar os mais básicos deles:

Afim de evitar muito trabalho eu preferi nesta versão manter o esquema de pontos por array de coordenadas eles funcionam da seguinte forma:

var ponto = {”latitude”:-23.555581,”longitude”:-46.657533};

Bem auto explicativo feito isso vamos para nosso primeiro método:

userMap.viewPoint

var ponto = {"latitude":-23.555581,"longitude":-46.657533};
userMap.viewPoint(ponto);

Simples e rápido, isso mostra um ponto no mapa sem muita coisa apenas exibe o ponto. Agora vamos pra algo um pouco mais elaborado:
userMap.addMark

var ponto = {"latitude":-23.555581,"longitude":-46.657533};
userMap.addMark(ponto,"Olá Mundo
Vejam só eu sei falar!!”,true)

Isso irá criar um ponto no mapa com um click no ponto que exibirá o famoso “balãozinho” com um conteudo html e o último parâmetro true define que o ponto será o centralizado no mapa. No próximo exemplo a gente vai usar o recurso de directions baseado em mão e contramão do google maps para achar rotas:

userMap.traceDirections

pontos[0] = {”latitude”:-23.555581,”longitude”:-46.657533};
pontos[1] = {”latitude”:-23.555581,”longitude”:-46.657533};
pontos[2] = {”latitude”:-23.555581,”longitude”:-46.657533};
pontos[3] = {”latitude”:-23.555581,”longitude”:-46.657533};

userMap.traceDirections(pontos)

No nosso caso estamos sempre no mesmo ponto mas mudando as coordenadas é possível traçar as rotas. Por último ( mas não o último recurso da lib, lembrando que temos mais muitos métodos e que a combinação deles e de um pouco de jogo de cintura nos permite fazer de tudo e mais um pouco ):

userMap.setPointFromAddress

userMap.setPointFromAddress("Rua Augusta,1000,Consolação,São Paulo,SP,01304-001,Brazil","Rua do rock!“,true);

Bem bacana não? Este método é limitado pelo google por 10.000 consultas/dia por ip ou seja a não ser que todo mundo que conectar no seu site veja mais de 10.000 vezes este recurso isso é mais que suficiente lembrando que é por CLIENTE IP e não SERVIDOR IP :) vamos só explicar um pouco:

O primeiro parâmetro é o endereço do cidadão, quanto mais completo mais preciso, eu usei o mais completo dos completos exemplos aí vai de você o quão preciso você pretende ser, o segundo método define um conteudo html como já vimos anteriormente e o terceiro define se o ponto vai ser o centro do mapa.

Bom, por hora é só, relembrando que a lib está em estágio alpha e que as pessoas usem por conta e risco, contribuições são bem vindas, usem e abusem e mantenham os créditos para que possamos continuar fornecendo ferramentas úteis e free para os amigos desenvolvedores e comunidade em geral.

Vale lembrar para dar uma olhada no código pois temos outros exemplos e uma documentação bem bacana e explicativa sobre os diversos métodos desta ferramenta, os arquivos estão disponíveis para download:

jquery (obrigatório)
add4maps (obrigatório)
greversegeocoder (opcional)
php (obrigatório em alguns métodos pois usei para facilitar o desenvolvimento, basicamente ele tem funcoes com o mesmo nome do php e sintaxe mas para javascript )

17
jul

Novo cliente World of Warcraft ( WoWBR ) Shopping

Com muito orgulho que anúncio esta mais nova parceria entre ADD4 Comunicação e WoWBR Shopping, então para os clientes WoWBR: Aguardem muitas novidades por aí, enquanto isso continuem comprando e se divertindo. Boas vindas ao novo cliente, sucesso e paz.

Kléderson Bueno

16
jul

As não-fronteiras do digital

Como muitos devem saber o trabalho digital requer muita concentração, disciplina, técnica, criatividade e inúmeros outros elementos, pois bem se conseguíssemos reunir todos estes elementos em um ambiente agradável e funcional?

Pois bem a ADD4 Comunicação trabalha de forma integrada com seus funcionários e colaboradores que estão virando notícia como vocês poderão conferir nesta reportagem do Jornal 180 Graus de Teresina/PI. Provando que competencia e responsabilidade são mais importantes do que uma reunião no escritório no centro da cidade.

Isso aí, este é um dos exemplos dos orgulhos da ADD4 Comunicação. Parabéns.

Kléderson Bueno

02
jul

Lançamento do site Jornal de Debates

É com orgulho que a ADD4 Comunicação anuncia o lançamento do site desenvolvido por nossa equipe para o cliente Jornal de Debates ( www.jornaldedebates.ig.com.br ).

Confiram mais este trabalho da ADD4 Comunicação.

Até a próxima.

Kléderson Bueno

28
jun

ADD4Labs - GMaps ADD4 Javascript Class

Olá caros,

Bom copiando um pouco o estilo do Cairo de postar um pouco na série “O que andamos fazendo?!” gostaria de deixar um pouco de agua na boca até o lançamento da nossa ferramenta para trabalhar com Google Maps Ajax.

Trata-se de uma classe em javascript para tornar a vida de quem pretende, quer, anseia, sofre em usar o GMaps, um pouco mais fácil, sim usando JQuery e o GMaps estamos testando uma nova classe escrita por Kléderson Bueno em javascript. Assim que os testes forem bem sucedidos vamos disponibilizar o(s) arquivo(s) e uma documentação para tal, por hora apenas o que posso dizer é que vale muito a pena esperar por esta ferramenta partindo do princípio do digite menos, faça mais, mais rápido e com mais qualidade, por exemplo:

Para criar um ponto no mapa com um conteudo html antes tinhamos:

var thisPoint = new GLatLng(point['latitude'],point['longitude']);
var thisMarker = new GMarker(thisPoint);

GEvent.addListener(thisMarker, “click”,
function() {
thisMarker.openInfoWindowHtml(htmlContent);
}
);

gmap.addOverlay(thisMarker);

e hoje temos:

add4Map.addMark(pointCoords,htmlContent);

Bem mais fácil hein?

Bom é isso até o final da semana lançaremos a classe para testes pela comunidade.

Continuem acompanhando.

Até Breve!

Kléderson Bueno