sábado, 26 de abril de 2014

Setando o locale no Laravel 4

Olá galera,

Estou utilizando o Carbon que é uma API para trabalhar com Datetime e vem junto com o Laravel 4. Para quem nunca ouviu falar, pode ver mais detalhes aqui.

{{ Carbon::now()->formatLocalized('Brasília %d de %B de %Y') }}

O código acima exibe o dia atual formatado. Ex: Brasília 07 de April de 2014. O problema aqui é o mês em inglês. Há várias formas de resolver o problema, inclusive criando arrays com os meses em português e etc. Adotaremos uma solução mais elegante.

No meu Ubuntu, abri o terminal e digitei locale -a. Foi exibida uma lista de locales disponíveis e entre eles, o que vou utilizar: pt_BR.utf8.

OBS: Caso não seja exibido o locale do Brasil, é bem provável que não esteja instalado. Para fazer a instalação, abra o terminal e digite

Abra o arquivo app/filters.php e dentro de App::before, adicione setlocale (LC_ALL, 'pt_BR.utf8');. O resultado final deve ficar como abaixo.

  App::before(function($request)
  {
    setlocale (LC_ALL, 'pt_BR.utf8');
  });
  

Agora o resultado exibido será Brasília 07 de abril de 2014.

Um grande abraço e até a próxima.

segunda-feira, 21 de abril de 2014

Instalando Ruby 2 e Rails 4 no Mac OS X Mavericks

Olá galera,

Depois de alguns anos voltei programar em Rails e precisei montar meu ambiente no Mac (agora uso Mac, antes era Linux). Foi aí que tive um pouco de trabalho. Vou expor abaixo uma forma bem simples de fazer isso.

A melhor forma que achei até o momento de instalar Ruby e Rails é usando o Ruby Version Maneger (RVM). Ela é uma ferramenta de linha de comando que ajuda a instalar e gerenciar diferentes versões do Ruby na mesma máquina. Ela facilita muito a sua vida.

O Mac OS X vem com uma versão do Ruby instalada mas é melhor deixá-la intacta, pois é utilizada pelo sistema operacional. Não queremos bagunçar nosso ambiente, certo? Olha o RVM ajudando aí. Utilizaremos uma versão separada para nosso ambiente de desenvolvimento, conforme abaixo.

Instale o Xcode command line tool xcode.

xcode-select --install

Aparecerá a tela abaixo, clique em Install.

Se estiver utilizando o Lion ou Mountain Lion, baixe o Command Line Tools do site da Apple.

Verifique a instalação do gcc e do git, ambos são necessários para instalar o RVM e Ruby.

gcc --version
git --version

Para instalar o RVM, digite no terminal.

curl -L https://get.rvm.io -s stable

Atualize para a última versão.

rvm get stable --autolibs=enable

Instale o Ruby.

rvm install ruby

O RVM irá verificar se todas as dependências estão satisfeitas para instalá-lo. Após executar o comando acima, poderá aparecer uma tela pedindo para instalar o Command Line Tools e o MacPorts caso ainda não os tenha instalado.

Aparecerá também uma tela solicitando a instalação do Homebrew, que é um gerenciador de pacotes extra para o Mac. Através dele, você pode atualizar o Git, o Ruby, o PostgreSQL, instalar apps, enfim, muita coisa que demora a ser disponibilizada no repositório oficial.

Para verificar se a instalação do brew foi realizada corretamente e para atualizar o repositório digite na seqüência.

brew doctor brew update

Informaremos ao RVM qual a versão a ser utilizada.

rvm --default use ruby-2.1.1

Verifique a versão instalada do Ruby.

ruby -v

Atualize seu repositório de gems.

gem update

Instale o rails.

gem install rails

Verifique a versão do Rails.

rails -v

Partindo do príncipio que adoteremos o SQLite como nosso banco de dados, será necessário instalar o pacote abaixo.

brew install sqlite3

OBS: Caso você utilize outro banco, faça a instalação dele antes de criar o projeto. Lembre-se de alterar a gem do banco escolhido no Gemfile.

Agora é só correr pro abraço e criar uma app rails.

rails new app

Dúvidas, correções ou sugestões serão mais do que bem vindas.

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

terça-feira, 15 de abril de 2014

Ajustando o datetime no Laravel 4 para o SQL Server

Olá galera,

No último post, mencionei sobre o problema da migration com SQL Server e Laravel 4. Agora ao tentar acessar uma página que contém datas com timestamp (Ex: created_at e updated_at), ocorreu o erro da imagem abaixo.

.

Para corrigir o erro será necessário fazer alguns ajustes no framework. Mais uma vez, recomendo que qualquer alteração seja devidamente comentada e documentada para evitar problemas futuros.

Pesquise pelos métodos typeDateTime e typeTimestamp no arquivo /vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php e altere o return 'datetime'; para return 'datetime2';.

Para finalizar, pesquise pelo método getDateFormat no arquivo /vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php e altere o return 'Y-m-d H:i:s.000'; para return 'Y-m-d H:i:s.0000000';.

Para funcionar será necessário recriar o banco de dados, executar as migrations e os seeds caso existam. A outra solução é ajustar os campos manualmente via SQL.

Espero ter ajudado as pessoas que tiveram o mesmo problema.

Um abraço e até próxima.

quinta-feira, 10 de abril de 2014

Corrigindo erro ao executar migration no SQL Server com Laravel 4

Olá galera,

Peguei um projeto com Laravel 4 e SQL Server 2008. Para minha surpresa ao tentar instalar a migration no banco obtive a seguinte mensagem de erro.

Depois de muito pesquisar, vi que o problema estava ligado a variável $wrapper no Grammar do SQL Server.

Apesar de não gostar muito da idéia, fiz uma alteração no framework para solucionar meu problema.

OBS: Recomendo que qualquer alteração seja devidamente comentada e documentada para evitar problemas futuros.

Abra o arquivo /vendor/laravel/framework/src/Illuminate/Database/Schema /Grammars/SqlServerGrammar.php. e altere a variável $wrapper de '"%s"' para '[%s]'.

O resultado final deve ficar como abaixo.

protected $wrapper = '[%s]';

Espero ter ajudado.

Um abraço a todos

sábado, 5 de abril de 2014

Unir polígonos de outra tabela espacial no Postgis

Olá galera,

Há tempos me deparei com a seguinte situação:

A cidade em que moro é dividida em setores, esses setores nada mais são que a união de determinados bairros, como não tínhamos essa tabela de setores, ela foi criada e o insert desses setores ficou da seguinte forma:

INSERT INTO setores_op(descricao, the_geom) VALUES ('Setor 6', (SELECT ST_Union(ARRAY(SELECT the_geom FROM bairros WHERE gid IN (22,23)))));

Nesse caso, estou unindo os bairros de gid = 22 e 23, gerando um polígono que vai ser denominado Setor 6, poderia unir quantos polígonos fosse necessário acrescentando o gid na cláusula IN do nosso SQL. O problema desse código é que as vezes ficam alguns buracos no meio do polígono criado, caso isso aconteça pode-se executar o seguinte SQL:

UPDATE setores_op SET the_geom=(SELECT ST_Polygon(ST_ExteriorRing(the_geom), 29193) FROM setores_op WHERE gid = 10)WHERE gid = 10;

A função St_ExteriorRing() vai levar em consideração apenas os vértices exteriores, descartando os vértices que se encontram no interior do polígono.

Espero que a dica tenha sido útil.

Um grande abraço a todos e até a próxima !

sexta-feira, 4 de abril de 2014

Concatenando registros no MySQL

Olá galera,

Há um tempo atrás, fiz um post sobre concatenar registros no PostgreSQL e no SQL Server. Você pode vê-lo clicando aqui. Se você pesquisar no Google, verá que no MySQL não tem muito segredo. Mostrarei somente uma dica para consultas que envolvem muitos registros.

Supondo que precisamos coletar e-mails de um banco de dados para enviar um e-mail de marketing.

SELECT GROUP_CONCAT(DISTINCT c.email SEPARATOR '; ') FROM clientes c;

O resultado da consulta acima já retorna TODOS os e-mails correto ?! ERRADO. O limite padrão para o tamanho desse resultado é de 1024 bytes. Para que o resultado possa ser exibido na sua totalidade é necessário acrescentar mais um comando nesse script.

    SET SESSION group_concat_max_len = 1000000;
    SELECT GROUP_CONCAT(DISTINCT c.email SEPARATOR '; ') FROM clientes c;
  

No script acima, modifiquei o valor padrão para 1000000 bytes através da variável de sistema group_concat_max_len.

Espero que a dica tenha sido útil.

Um grande abraço a todos e até a próxima.