quarta-feira, 17 de dezembro de 2014

Shapefiles do Brasil atualizados

Olá galera,

Conforme prometido, estou disponibilizando shapefiles do Brasil atualizados. Os shapes foram disponibilizados dia 09/12/2014 e retirados do FTP do IBGE.

Estou disponibilizando somente alguns já que o tamanho do arquivo original era bem grande. Separei em arquivos compactados e com os nomes dos shapes para facilitar o download.

Através do link https://1drv.ms/f/s!Aq1Z5mSs_16MjU6CWivY-M5iTmpI, é possível realizar o download dos seguintes shapes: país, municípios (5.570), estados, capitais, cidades e vilas.

Caso esteja necessitando ou possua um shapefile que considere importante para a comunidade, entre em contato conosco.

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

terça-feira, 16 de dezembro de 2014

2 Anos de CodeGeo

Olá galera,

Dia 12/12/2014, o nosso blog completou 2 anos. Estou comemorando um pouco atrasado, devido a correria com os projetos que estou trabalhando.

Gostaria de agradecer a todos os leitores pela assiduidade e pelas mensagens enviadas.

Peço desculpas por não responder no prazo ou não conseguir atender algum pedido específico.

Nosso planejamento para 2015, é realizar mais vídeos tutoriais sobre algumas tecnologias e dar uma atualizada com relação aos temas abordados no blog.

Como não poderia deixar de fazê-lo, quero agradecer mais uma vez aos amigos Luís Lopes por incentivar a criação do blog e ao Anderson Medeiros que vem apoiando e divulgando o nosso trabalho.

Para finalizar, fica aí o meu MUITO OBRIGADO a todos que incentivam e apoiam a nossa iniciativa de compartilhar o conhecimento.

Grande abraço.

sexta-feira, 5 de dezembro de 2014

Corrigindo o erro de Datetime field overflow no PostgreSQL 9.3

Olá galera,

No post de hoje iremos mostrar como corrigir um erro como este: Datetime field overflow: 7 ERROR: date\/time field value out of range: \"27\/11\/2014\"\nHINT: Perhaps you need a different \"datestyle\" setting.

No meu caso, o problema ocorreu porque as versões do PostgreSQL, no ambiente de desenvolvimento e testes, encontravam-se em idiomas diferentes.

Após muita pesquisa, encontrei uma dica que mandava executar o seguinte comando: SET datestyle = mdy;

O problema do comando acima é que ele é válido somente para aquela sessão e não resolve de forma definitiva. Para solucionar de forma permanente, é necessário alterar o arquivo /etc/postgresql/9.3/main/postgresql.conf.

Utilize um editor da sua preferência e abra o arquivo postgresql.conf. Pesquise pela palavra datestyle, no meu arquivo está na linha 506, e altere o seu valor para que fique assim datestyle = 'iso, dmy'

Agora basta reiniciar o PostgreSQL para que a atualização passe a funcionar.

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

domingo, 30 de novembro de 2014

Bloqueando múltiplas autenticações com o mesmo usuário no Laravel 4.2

Olá galera,

Há algum tempo, precisei destruir a sessão mais antiga de um usuário caso ele efetuasse login em outra máquina ou em outro navegador. Dessa forma, queria garantir que teríamos o mesmo usuário logado somente uma única vez com a sessão mais nova.

Fiz uma implementação que acredito não ser a melhor solução mas resolveu o meu problema. Vale lembrar que a solução foi utilizando o Session Driver do tipo file.

O código abaixo foi utilizado no controller de usuário após validação dos dados de login onde foi retornado o id do usuário.

    $files = \File::allFiles(storage_path().'/sessions');
    $name = Auth::getName();

    foreach ($files as $file) {
      $session  = unserialize(\File::get($file));
      if(isset($session[$name])) {
        if($session[$name] == $usuario_id) {
          \File::delete($file);
        }
      }
    }
  

Na linha 1, são acessados todos os arquivos de sessão gerados na aplicação.

Na linha 2, é capturado o valor do identificador único da sessão.

Nas linhas 4 e 5, são capturados o conteúdo de cada arquivo da sessão e convertido para dados serializados para o formato de array.

Na linha 6, é realizada uma checagem para ver se existe algum usuário logado com aquele identificador único.

Na linha 7, é feita uma comparação entre o id do usuário retornado na consulta do login com o id da sessão já armazenada no file.

Na linha 8, é apagado o arquivo da sessão mais antiga que se encontra armazenado no diretório sessions.

OBS: Com a remoção do arquivo gerado na sessão é necessário realizar a checagem com Auth::check() e fazer o redirecionamento caso a sessão do usuário não exista mais.

Conhece outra solução ou fez de outra forma? Compartilhe conosco.

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

domingo, 9 de novembro de 2014

OpenLayers 3 - Parte 4

Olá galera,

Hoje vamos falar de estilo e popup no OL3, recursos presentes no OpenLayers 2. Abriremos uma exceção ao que foi falado nos vídeos anteriores e utilizaremos os códigos do OpenLayers 3 - Parte 3 para esse vídeo.

Os códigos utilizados podem ser baixados através do https://github.com/larsurilch/ol3

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

terça-feira, 4 de novembro de 2014

OpenLayers 3 - Parte 3

Olá galera,

Dando continuidade a nossa série, hoje vamos falar sobre geolocation no OpenLayers 3. Iremos utilizar como base os códigos que criamos no primeiro vídeo da série OpenLayers 3 - Parte 1

Os códigos utilizados podem ser baixados através do https://github.com/larsurilch/ol3

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

quarta-feira, 29 de outubro de 2014

OpenLayers 3 - Parte 2

Olá galera,

Dando continuidade a nossa série, hoje vamos falar sobre camadas no OpenLayers 3. Iremos utilizar como base os códigos que criamos no primeiro vídeo da série OpenLayers 3 - Parte 1

Os códigos utilizados podem ser baixados através do https://github.com/larsurilch/ol3

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

sexta-feira, 24 de outubro de 2014

OpenLayers 3 - Parte 1

Olá galera,

Hoje daremos início a série sobre o OpenLayers 3. Começaremos com um exemplo mais básico e evoluíremos nos próximos vídeos.

Os códigos utilizados podem ser baixados através do https://github.com/larsurilch/ol3

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

domingo, 12 de outubro de 2014

Validando unicidade com múltiplos campos no Laravel 4.2

Olá galera,

No post Aplicação com Laravel 4 - Models e Validations são apresentadas alguns tipos de validações, entre elas a unique. Hoje iremos demonstrar como validar a unicidade envolvendo vários campos.

Para exemplificar, vamos utilizar um model de bairro que possui uma chave estrangeira de município. Os campos do nosso model bairro: id, descricao, municipio_id. A idéia que é não tenhamos uma descrição repetida de um bairro dentro do mesmo munícipio.

    protected $table = 'bairros';

    protected $fillable = array('descricao', 'municipio_id');

    public static $rules = array(
      'descricao' => 'required|min:3|max:80|unique:bairros,descricao',
      'municipio_id' => 'required|integer'
    );
  

No código acima estão somente as regras, não há nenhuma novidade. No seguinte iremos escrever a validação.

    public static function validate($data)
    {
      $id = 'NULL';
      $municipio_id = $data['municipio_id'];

      if(Request::getMethod() == 'PUT')
        $id = $data['id'];

      self::$rules['descricao'] .= ", {$id}, id ,municipio_id, {$municipio_id}";
      return Validator::make($data, self::$rules);
    }
  

Na linha 3, é atribuído ao $id o valor NULL que será usado na inclusão.

Na linha 4, é capturado o valor do munícipio submetido pelo formulário.

Nas linha 6 e 7, é checado se o request é do tipo PUT (alteração). Se for é capturado o id do registro submetido.

Na linha 9, são adicionados os parâmetros para o unique.

Bastante simples não é verdade?

Fica aí a dica. Grande abraço

sábado, 27 de setembro de 2014

Campos customizados para autenticação com Laravel 4.2

Olá galera,

O Laravel, por padrão, utiliza os campos username e password para autenticação. Dessa forma, nós podemos utilizar o método Auth::attempt sem que seja necessário fazer nenhuma alteração.

Agora supondo que a nossa tabela utilize campos como email e senha, quais alterações precisam ser feitas para que o método Auth::attempt passe a funcionar?

A primeira delas deve ser feita no seu model de usuário, onde é implementado o método getAuthPassword com o meu atributo.

    public function getAuthPassword()
    {
       return $this->senha;
    }
  

Abaixo eu implementei um método, no controller de usuário, chamado validate que será chamado quando um formulário de login foi submetido.

    public function validate()
    {
       $user = array(
            'email' => Input::get('email'),
            'password' => Input::get('senha'),
            'ativo' => 1
        );

        if (Auth::attempt($user, false)) {
            echo 'Logado com sucesso!';
        } else {
            echo 'Não foi possível efetuar o login.';
        }
    }
  

Note que o segredo está no campo da senha. A chave que eu utilizo no array tem que ser exatamente password. Os demais parâmetros terão que ser o nome dos nossos campos na tabela de usuários. Inclusive podem ser passados vários atributos para serem validados como foi o caso do ativo.

Fica aí a dica. Grande abraço

segunda-feira, 8 de setembro de 2014

Trabalhando com Openlayers e Mapserver no Windows

Olá galera,

Esse post é atendendo a solicitação de uma leitora aqui do blog, nossa amiga Fernanda Franciele. Não vou entrar em muitos detalhes sobre os códigos porque não é o foco. Quem tiver interesse em saber mais, pode ler o post Criando e exibindo um WMS com MapServer, PostGIS e Openlayer.

Vamos começar com a instalação do MS4W. Faça o download do instalador ms4w-3.0.6-setup.exe no link http://www.maptools.org/ms4w/index.phtml?page=downloads.html e instale conforme as telas abaixo.

Após a instalação, adicionaremos a projeção do Google que não vem por padrão. Abra o arquivo epsg com o bloco de notas que se encontra no diretório abaixo.

Inclua o código abaixo na última linha.

# Google Maps
<900913> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs <>

Abaixo segue a organização dos arquivos criados no MS4W.

Você pode fazer o download do arquivo utilizado AQUI. A diferença dele pra o post Criando e exibindo um WMS com MapServer, PostGIS e Openlayer é que estou utilizando um shapefile ao invés do banco e não estou utilizando labels no mapa.

O resultado final deve ter ficado como abaixo.

Espero ter ajudado aos usuários que trabalham com o Windows.

Grande abraço a todos.

domingo, 7 de setembro de 2014

Trabalhando com mutators no Laravel 4.2

Olá galera,

O Eloquent fornece um forma de modificar os atributos do model. Para exemplificar seu uso, vamos analisar o UsuariosController.php da série Autenticação e ACL com Laravel 4.1.

Nos métodos que salvam e atualizam os dados do usuário, o hash da senha é feito manualmente antes de salvá-la no banco de dados.

$input['password'] = Hash::make(Input::get('password'));

Utilizando mutator, nós podemos remover essa "transformação" e criar um método no model Usuario.php.

    public function setPasswordAttribute($value) {
    $this->attributes['password'] = Hash::make($value);
    }
  

A partir de agora quando for atualizar ou inserir uma senha no banco o hash dela será feito automaticamente.

Vale lembrar que o nome do método deve seguir o padrão setNomedoatributoAttribute

Fica aí a dica. Grande abraço

segunda-feira, 1 de setembro de 2014

Exibindo menu de acordo com o perfil

Olá galera,

Após receber inúmeras solicitações, vou mostrar como exibir somente itens do menu que o usuário tem permissão.

Recomendo que você dê uma olhada nos comentários do post Autenticação e ACL com Laravel 4.1 - Final para saber do que estamos falando.

Tomando como base os códigos da série Autenticação e ACL com Laravel 4.1, abra o arquivo app/macros.php e adicione a macro abaixo.

    HTML::macro('mountMenu', function() {
      $menu = null;
      $cache = Cache::get('actions' . Auth::user()->id);
      $index = preg_grep('/index|\*/', $cache);

      $links = array(
        'veiculo' => 'Veículos',
        'usuario' => 'Usuários',
        'perfil' => 'Perfis',
      );

      foreach($links as $key => $value) {
        foreach($index as $i) {
          if($key == current(explode('.', $i)) || $i == '*')
            $menu .= '
  • ' . link_to($key, $value) . '
  • '; } } return $menu; });

    Já no arquivo app/views/partials/_navigation.blade.php, remova as tags 'li' que contém os links do menu e adicione {{ HTML::mountMenu() }}

    Explicando a macro que gera o menu.

    Linha 3: Recuperando as permissões do usuário logado

    Linha 4: Retorno as entradas do array de acordo com o padrão que pode ser o 'index' ou '*'

    Linhas 6 a 10: Array de itens do menu com chave e valor, sendo que a chave é minha rota e o valor é o label a ser exibido.

    Linhas 12 a 14: Percorro os dois arrays comparando se as chaves são iguais

    Linha 15: Concateno os itens de menu que atendem a minha condição

    Bastante simples não é verdade? Fica aí a dica.

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

    terça-feira, 12 de agosto de 2014

    Salvando uma imagem com background a partir de canvas

    Olá galera,

    Esses dias precisei salvar uma imagem a partir do canvas. Só clicando com o botão direito e pedindo para salvar como imagem funciona. Então qual o problema? O click com o botão direito já tinha um evento mapeado e o background do PNG gerado era transparente.

    O problema foi solucionado com Javascript através de uma simples página HTML com um botão.

    Código HTML:

        <!DOCTYPE html>
        <html lang="pt-br">
          <head>
            <title>Canvas</title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
          </head>
          <body>
            <canvas id="canvas" width="200" height="200"></canvas>
            <button>Baixar</button>
            <script defer="defer" src="canvas.js"></script>
          </body>
        </html>
      

    Código Javascript:

        var button = document.getElementsByTagName('button');
    
        button[0].addEventListener('click', function() {
          var canvas = document.getElementById("canvas");
          var w = canvas.width;
          var h = canvas.height;
          var context = canvas.getContext('2d');
          var data = context.getImageData(0, 0, w, h);
          context.fillStyle = "rgb(255,0,0)"; 
          context.fillRect(0,0,w,h);
          window.location.href = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
    
          context.clearRect (0,0,w,h);
          context.putImageData(data, 0,0);
        });
      

    Explicando o código do Javascript:

    Linha 3 - Adicionando o evento de click ao botão.
    Linha 7 - Retorna o objeto com métodos e propriedades para desenhar na tela.
    Linha 8 - Retorna o objeto ImageData que copia os dados do pixel para a geometria com largura e alturas definidas.
    Linha 9 - Retorna a cor usada para preencher o desenho.
    Linha 10 - Desenha o retângulo "cheio".
    Linha 11 - Conversão e exportação do desenho do canvas em uma URL codificada PNG de 64 bits.
    Linha 13 - Limpa os pixels especificado dentro do retângulo.
    Linha 14 - Coloca os dados da imagem (a partir do objeto ImageData especificado) de volta para a tela.

    Fica aí a dica de hoje.

    Um grande abraço a todos.

    segunda-feira, 30 de junho de 2014

    Ignorando endereços locais no proxy do Ubuntu 14.04

    Olá galera,

    Há alguns dias, precisei ignorar endereços locais no proxy do Ubuntu 14.04. No Linux Mint, é possível adicionar esses endereços na mesma tela onde você configura o proxy mas no Ubuntu não existe essa opção.

    A solução, que encontrei, foi utilizar o dconf. Caso não o tenha instalado, basta utilizar a Central de Programas do Ubuntu e fazer a instalação conforme a tela abaixo.

    Abra o dconf, navegue na árvore até system -> proxy e insira os endereços a serem ignorados em ignore-hosts conforme a tela abaixo.

    Espero que a dica tenha sido útil.

    Um grande abraço a todos.

    sexta-feira, 30 de maio de 2014

    Tutorial MapServer - Parte 1

    Olá galera,

    Hoje daremos início a série de vídeos tutoriais sobre o MapServer. Será necessário ter o Apache e o MapServer instalados. Caso você ainda não os tenha, basta pesquisar sobre a instalação de ambos aqui no blog.

    Para o nosso exemplo, será necessário fazer o download do shapefile do mundo. Você pode baixá-lo aqui.

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

    domingo, 25 de maio de 2014

    Utilizando recursos unicode em páginas web

    Olá galera,

    Sempre busco minimizar o uso de imagens nos sistemas que desenvolvo a fim de deixá-los mais leves.

    O Bootstrap, por exemplo, utiliza a fonte Glyphicon Halflings para adicionar ícones/imagens como alternativa. Todavia é necessário fazer o carregamento de uma fonte que nem sempre é o que queremos.

    Pesquisando na internet sobre o assunto, terminei me deparando com o site Alan Wood’s Unicode resources que contém uma lista de caracteres unicode.

    Segue abaixo um exemplo de como utilizá-lo com CSS. O código do emoticon foi obtido aqui.

      <style>
      #emoticon:before {
        content: '\1F60E';
        padding-right: 3px;
      }
      </style>
      <div id="emoticon">Emoticon</div>
      
    Emoticon

    Acima podemos ver o resultado e mais alguns exemplos a seguir.

    Dominó
    Sol
    Avião

    Bem pessoal, fica aí a dica.
    Um grande abraço a todos e até a próxima.

    sexta-feira, 16 de maio de 2014

    Ambiente Ruby 2.1.1 no Ubuntu 14.04 LTS

    Olá galera,

    Nesse post vamos fazer a instalação do Ruby 2.1.1 que não está, por padrão, disponível no repositório do Ubuntu 14.04 LTS.

    No terminal, execute os comandos abaixo.

    sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev
    sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
    curl -L https://get.rvm.io | bash -s stable
    source ~/.rvm/scripts/rvm
    echo "source ~/.rvm/scripts/rvm" >> ~/.bashrc
    rvm install 2.1.1
    rvm use 2.1.1 --default

    Você pode conferir a versão do Ruby instalada através do comando abaixo.

    ruby -v

    Caso alguém queira instalar o Rails com essa versão do Ruby, será necessário instalar o Node.js.

    sudo apt-get install nodejs

    Agora é só instalar o Rails.

    gem install rails

    De forma similar ao Ruby, você pode conferir a versão do Rails através do comando abaixo.

    rails -v

    Fica aí a nossa dica de hoje.

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

    domingo, 11 de maio de 2014

    Valores nulos com LEFT JOIN e COUNT no MySQL

    Olá galera,

    Hoje vamos demonstrar como exibir registros cujo valores sejam nulos com LEFT JOIN e COUNT. Adotaremos o modelo hipotético abaixo para exemplificar.

    OBS: Recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.

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

    terça-feira, 6 de maio de 2014

    Corrigindo conflito do yield do Laravel 3.2 com PHP 5.5

    Olá galera,

    O PHP 5.5 trouxe algumas novidades das quais podemos destacar o suporte ao generators. Com isso, o yield passou a se tornar uma palavra reservada e gerou um conflito com o Laravel 3.2.

    Quem quiser saber mais informações sobre o yield, pode clicar aqui.

    Voltando a correção do conflito, encontrei-a no próprio GitHub do Laravel. Apesar de estar claro quais alterações devem ser feitas, vou replicá-las aqui no blog por segurança.

    O trabalho consiste em adicionar "_" (underline ou underscore) antes do yield.

    OBS: Conforme já citei em outros posts, recomendo que qualquer alteração seja devidamente comentada e documentada para evitar problemas futuros.

    Arquivo: laravel/blade.php linha 364.

    * The Blade @yield statement is a shortcut to the Section::_yield method.

    Arquivo: laravel/blade.php linha 373.

    return preg_replace($pattern, '$1<?php echo \\Laravel\\Section::_yield$2; ?>', $value);

    Arquivo: laravel/documentation/views/templating.md linha 47.

    <?php echo Section::_yield('scripts'); ?>

    Arquivo: laravel/helpers.php linha 563.

    function _yield($section)

    Arquivo: laravel/helpers.php linha 565.

    return Section::_yield($section);

    Arquivo: laravel/section.php linha 72.

    return static::_yield(static::stop());

    Arquivo: laravel/section.php linha 131.

    public static function _yield($section)

    Arquivo: laravel/tests/cases/blade.test.php linha 81.

    $this->assertEquals("<?php echo \\Laravel\\Section::_yield('something'); ?>", Blade::compile_string($blade));

    Espero ter ajudado as pessoas que encontraram o mesmo problema.

    Um abraço e até próxima.

    quinta-feira, 1 de maio de 2014

    Rails 4.0.1 com Ruby 2.0

    Olá galera,

    Já faz quase um ano que publiquei o post Instalando Ruby on Rails 3.2.9 no Ubuntu 12.04 e ainda vejo em alguns fóruns dúvidas sobre qual a melhor forma de fazer a instalação. Alguns usam o RVM (Ruby Version Manager) mas, particulamente, prefiro instalar os pacotes separadamente. Vale lembrar que estou usando o Ubuntu 13.10 para esse tutorial.

    No terminal digite:

    sudo apt-get install ruby2.0 ruby2.0-dev nodejs

    Partindo do príncipio que adoteremos o SQLite, será necessário instalar os pacotes abaixo.

    sudo apt-get install sqlite3 libsqlite3-dev sqliteman

    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.

    Com tudo instalado, faça o download da última versão do rubygems no link http://rubygems.org/pages/download. Hoje, a última versão do arquivo é o rubygems-2.1.7.tgz.

    Descompacte o arquivo baixado e acesse o seu diretório pelo terminal. Ex: cd /home/meu_usuario/Downloads/rubygems

    Após estar dentro do diretório, execute o comando abaixo.

    sudo ruby setup.rb

    Caso você já tenha instalado uma versão do RubyGems, pode atualizá-lo pelo terminal.

    sudo gem update --system

    Agora é só instalar o Rails.

    sudo gem install rails

    Bem prático não concordam?! Caso tenham alguma dúvida é só postar.

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

    Habilitando o php5-mcrypt no Ubuntu 14.04

    Olá galera,

    Montei meu ambiente de desenvolvimento no Ubuntu 14.04. Para minha surpresa, após executar o sudo apt-get install php5-mcrypt, a extensão foi instalada conforme a imagem abaixo mas não estava habilitada.

    Vamos corrigir o problema criando um link simbólico no diretório /etc/php5/apache2/conf.d.

    cd /etc/php5/apache2/conf.d
    sudo ln -s ../../mods-available/mcrypt.ini /etc/php5/apache2/conf.d/20-mcrypt.ini

    Após executar os comandos acima e darmos um ls -l teremos a imagem abaixo.

    sudo php5enmod mcrypt

    Reinicie o Apache para que a configuração tenha efeito.

    sudo service apache2 restart

    Espero que a dica tenha sido útil.

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

    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.

    domingo, 30 de março de 2014

    Restaurando backup no SQL Server 2008

    Olá galera,

    Hoje mostraremos como restaurar um backup no SQL Server 2008. O procedimento foi feito no Microsoft SQL Server Management Studio. O primeiro passo é descobrir o LogicalName do arquivo de backup.

        RESTORE FILELISTONLY
        FROM DISK = N'C:\meu_diretorio\meu_banco.bak'
        WITH FILE = 1
      

    Supondo que os resultados obtidos tenham sido conforme a tabela abaixo.

    LogicalName PhysicalName Type FileGroupName ...
    BancoDados C:\BancoDados.mdf D PRIMARY ...
    BancoDados_log C:\BancoDados_log.ldf L NULL ...

    Execute o script abaixo.

        USE master
        GO
        
        RESTORE DATABASE [BancoDados]
        FROM DISK = N'C:\meu_diretorio\meu_banco.bak'
        WITH FILE = 1,
        MOVE N'BancoDados' TO N'C:\meu_diretorio\BancoDados.mdf',
        MOVE N'BancoDados_log' TO N'C:\meu_diretorio\BancoDados_log.ldf',
        NOUNLOAD, REPLACE, STATS = 10
        GO
      

    Com esse procedimento, o banco de dados será restaurado no diretório escolhido. Espero que a dica tenha sido útil.

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

    terça-feira, 25 de março de 2014

    Corrigindo erros BADSIG e GPG key no Ubuntu 13.04

    Olá galera,

    Após fazer alguma atualização, meu Ubuntu começou a apresentar alguns erros como: W: Erro GPG: http://archive.canonical.com raring Release: As seguintes assinaturas eram inválidas: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key .

    Para resolver o problema, segui a solução encontrada no site Ubuntu Geek. Seguem abaixo os comandos executados no terminal.

    cd /var/lib/apt
    sudo mv lists lists.old
    sudo mkdir -p lists/partial
    sudo apt-get clean
    sudo apt-get update

    No meu caso, ainda continuaram ocorrendo dois erros: W: Erro GPG: http://ppa.launchpad.net raring Release: As assinaturas a seguir não puderam ser verificadas devido à chave pública não estar disponível: NO_PUBKEY 2123E2FF0A72BFA6 e W: Erro GPG: http://ppa.launchpad.net raring Release: As assinaturas a seguir não puderam ser verificadas devido à chave pública não estar disponível: NO_PUBKEY C2518248EEA14886.

    Verifique as chaves a serem importadas e execute o comando no terminal.

    OBS: Pelos erros exibidos minhas chaves são essas: 2123E2FF0A72BFA6 e C2518248EEA14886.

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 2123E2FF0A72BFA6
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C2518248EEA14886
    sudo apt-get update

    Agora não será exibido mais nenhum erro. Espero que a dica tenha sido útil.

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

    quarta-feira, 19 de março de 2014

    NicEdit com Laravel 4

    Olá galera,

    Nesse vídeo tutorial vamos aprender como integrar o editor NicEdit com o Laravel 4. Apesar da sua última versão datar do ano de 2012, eu o escolhi pela simplicidade e pelo seu tamanho. Fiz algumas alterações na versão original para atender as minhas necessidades. Dessa forma, recomendo que você faça o download da versão utilizada no vídeo tutorial clicando aqui.

    Os arquivos que foram alterados podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.

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

    sexta-feira, 14 de março de 2014

    Populando combo com Ajax no Laravel 4

    Olá galera,

    Esse vídeo tutorial é para atender uma solicitação do nosso amigo Carlo Caetano. Para exemplificar o pedido, vamos utilizar Estados e Municípios em combos. Como nos vídeos anteriores, recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.

    Os arquivos do projeto base podem ser baixados aqui.

    Os arquivos que foram alterados e criados podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.

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

    domingo, 9 de março de 2014

    Customizando mensagens de erro no Laravel 4.1

    Olá galera,

    Hoje vamos customizar as mensagens de erro que são exibidas pelo Laravel. Por padrão, as mensagens exibidas são algo como Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException ou Whoops, looks like something went wrong. quando o debug está setado como false.

    Para realizar a alteração, abra o arquivo global.php, que se encontra dentro de app/start, e pesquise pela linha App::error(function(Exception $exception, $code).

    Troque-o pelo código abaixo.

        App::error(function($exception, $code)
        {
          switch ($code)
          {
            case 403:
              return Response::view('errors.message', array('error' => '403 - Acesso proibido'), 403);
    
            case 404:
              return Response::view('errors.message', array('error' => '404 - Página não encontrada'), 404);
    
            case 500:
              return Response::view('errors.message', array('error' => '500 - Erro interno do servidor'), 500);
    
            default:
              return Response::view('errors.message', array('error' => 'Erro código - ' . $code), $code);
          }
        });
      

    O código é bem autoexplicativo. Estamos pegando o código de resposta e passando uma mensagem para a view message.blade.php que deve ser criada dentro do diretório app/views/errors.

    Dentro do arquivo message.blade.php, adicione o código abaixo.

        @extends(((Auth::check()) ? 'layouts.master' : 'layouts.autentication'))
    
        @section('content')
          
    {{ $error }}
    @stop

    No meu caso estou checando se o usuário está logado e setando um layout correspondente. Esse é somente um exemplo de como customizar as messagens de erro. Faça as adequações de acordo com seu projeto.

    Espero que a dica seja de grande utilidade.

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

    terça-feira, 4 de março de 2014

    Instalando PhoneGap/Cordova no Ubuntu 13.10 64 bits

    Olá galera,

    O objetivo desse post é detalhar o passo a passo da instalação e configuração do PhoneGap/Cordova com Android no Ubuntu 13.10 64 bits.

    OBS: Alguns procedimentos desse post são relativamente demorados. Dependem da configuração do hardware e da velocidade da internet.

    1 - Oracle Java 7

    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    sudo apt-get install oracle-jdk7-installer

    2 - Pacotes para compilar o Node.js

    sudo apt-get install g++ curl libssl-dev apache2-utils

    3 - Apache Ant

    Apache Ant é uma ferramenta utilizada para automatizar a construção de software.

    sudo apt-get install ant

    4 - Pacotes 32 bits

    O compilador do Android SDK usa programas em 32 bit.

    sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386 libz1:i386

    5 - Node.js

    Faça o download da última versão do Node.js, no período do post é a v0.10.25, no site http://nodejs.org/. Descompacte o arquivo, acesse o diretório criado utilizando o terminal e execute os comandos abaixo.

    ./configure
    make
    sudo make install

    Você pode verificar as versões do Node.js e NPM através dos comandos abaixo.

    node -v
    npm -v

    6 - Android SDK

    Faça o download do ADT (Android Developer Tools) Bundle no site http://developer.android.com/sdk/index.html. Descompacte o arquivo e sete o PATH no final do arquivo bashrc.

    sudo geany ~/.bashrc
    PATH=$PATH:/home/adt/sdk/platform-tools:/home/adt/sdk/tools
    source ~/.bashrc

    OBS: Note que o nome do meu diretório é adt e se encontra dentro de home.

    Execute o comando abaixo para criar o seu dispositivo virtual.

    android avd

    Antes de executar o dispositivo virtual criado, vamos corrigir o problema do carregamento da libGL.so.

    sudo apt-get install libgl1-mesa-dev

    7 - Cordova/PhoneGap

    A última versão, na data desse post, é a 3.3.

    sudo npm install -g cordova

    Acesse o diretório, via terminal, onde o projeto será criado e depois execute os comandos abaixo.

    cordova create hello com.example.hello "HelloWorld"
    cd hello
    cordova platform add android
    cordova build
    cordova emulate android

    Se tudo ocorreu normalmente, o dispositivo virtual será inicializado e será exibida aplicação criada.

    Bem pessoal qualquer dúvida é só mandar um comentário.

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

    sexta-feira, 28 de fevereiro de 2014

    Criando uma ISO do Ubuntu 13.10 instalado

    Olá galera,

    Sempre realizo vários testes em máquinas virtuais. O maior problema é ter que "matar" essa máquina, quando ocorre algum problema, e começar tudo novamente. Iniciar o processo de instalação, configuração de programas e atualizações de sistema do zero é um processo demorado e chato.

    Após algumas pesquisas na internet, encontrei uma ferramenta de backup Linux para Debian/Ubuntu chamada Remastersys. Com ela é possível fazer backup do sistema completo incluindo dados pessoais. Também é possível gerar cópias instaláveis. O único problema da ferramenta é que o tamanho máximo da ISO a ser gerado é de 4Gb.

    No meu caso, fiz a instalação, atualização e acrescentei alguns programas básicos no Ubuntu 13.10 64 bits.

    Vamos a instalação do Remastersys. Abra o terminal e execute os comandos abaixo.

    sudo su
    wget -O - http://www.remastersys.com/ubuntu/remastersys.gpg.key | apt-key add -
    echo 'deb http://www.remastersys.com/ubuntu precise main' >> /etc/apt/sources.list
    apt-get update
    apt-get install remastersys

    Agora removeremos os pacotes desnecessários e arquivos .deb do cache do sistema que estão ocupando espaço extra.

    apt-get clean
    apt-get autoremove -y
    exit

    Antes de criar um nova ISO, dê um clean no sistema para limpar backups anteriores.

    sudo remastersys clean

    Como queremos fazer uma imagem de instalação e não um backup com dados pessoais, utilizaremos o parâmetro dist. Se você for fazer um backup completo do sistema, inclusive com dados de usuário, utilize o parâmetro backup.

    sudo remastersys dist

    OBS: Ao executar o comando acima pode ser necessário a instalação de algum pacote adicional. Por isso, o faça conectado na internet.

    Após concluir o processo, será gerado um arquivo customdist.iso dentro da pasta /home/remastersys/remastersys. Agora basta gravá-lo num CD/DVD ou em um pen drive.

    Espero que a dica tenha sido útil.

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

    segunda-feira, 24 de fevereiro de 2014

    Autenticação e ACL com Laravel 4.1 - Final

    Olá galera,

    Nesse último vídeo, vamos adicionar o filtro de ACL a nossa aplicação. Como nos vídeos anteriores, recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.

    Os arquivos que foram gerados podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.

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

    quinta-feira, 20 de fevereiro de 2014

    Autenticação e ACL com Laravel 4.1 - Parte 4

    Olá galera,

    Nesse quarto vídeo, vamos adicionar o cadastro de perfis a nossa aplicação. Como nos vídeos anteriores, recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.

    Os arquivos que foram gerados podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.

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

    domingo, 16 de fevereiro de 2014

    Autenticação e ACL com Laravel 4.1 - Parte 3

    Olá galera,

    Nesse terceiro vídeo, vamos adicionar o cadastro de usuários a nossa aplicação. Como nos vídeos anteriores, recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.

    Os arquivos que foram gerados podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.

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

    segunda-feira, 10 de fevereiro de 2014

    Autenticação e ACL com Laravel 4.1 - Parte 2

    Olá galera,

    Nesse segundo vídeo, vamos adicionar o login e logout a nossa aplicação. Como nos vídeos anteriores, recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.

    Os arquivos que foram gerados podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.

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

    quinta-feira, 6 de fevereiro de 2014

    Autenticação e ACL com Laravel 4.1 - Parte 1

    Olá galera,

    Hoje daremos início a uma série de vídeos tutoriais onde abordaremos sobre autenticação e ACL com Laravel 4.

    Antes de iniciarmos, será necessário que você faça o download do código que iremos utilizar clicando aqui.

    Nesse primeiro vídeo, vamos mostrar a aplicação sendo acessada sem nenhum controle. Somente nos próximos vídeos, adicionaremos um login, uma senha e perfis de usuários. Vamos seguir também o modelo de dados conforme a figura abaixo.

    Recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.

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

    sábado, 1 de fevereiro de 2014

    Linha de comando para backup e restauração com PostgreSQL

    Olá galera,

    Apesar de ser um assunto já batido na internet, acho que vale a pena mostrar exemplo e detalhar cada parâmetro do comando.

    Por questões de comodidade, as vezes utilizo o pgAdmin para criar e restaurar backups. O problema de utilizá-lo é que um backup gerado em uma determinada versão do pgAdmin não pode ser restaurado em uma versão superior.

    Utilizaremos duas ferramentas do próprio PostgreSQL: pg_dump e pg_restore. Vale lembrar que para executar os comandos abaixo, você deve estar usando o usuário postgres.

    pg_dump -Ft -f meu_arquivo.tar nome_do_banco

    No comando acima, estamos gerando o backup do banco no formato tar através do parâmetro -Ft e o parâmetro -f determina o nome do arquivo de saída. Segue abaixo a listagem de parâmetros do pg_dump.

    • -p, --port=PORT porta do servidor do banco de dados
    • -i, --ignore-version ignora a versão do servidor
    • -h, --host=HOSTNAME host do servidor do banco de dados
    • -U, --username=NAME conecta ao servidor do banco de dados com um usuário específico
    • -W, --password solicita a senha do usuário
    • -d, --dbname=NAME conecta ao banco especifícado
    • -v, --verbose modo verboso
    • -F, --format=c|t|p especifíca o formato de saída (custom, tar, plain text)
    • -c, --clean limpa (apaga) o schema antes de recriar
    • -b, --blobs inclui blobs no dump
    • -f, --file=FILENAME nome do arquivo de saída
    pg_restore --dbname=nome_do_banco --verbose path_para_o_arquivo/meu_arquivo.tar

    Neste comando, estamos restaurando o backup com o parâmetro dbname especificando o nome do banco de dados. Segue abaixo a listagem de parâmetros do pg_restore.

    • -p, --port=PORT porta do servidor do banco de dados
    • -i, --ignore-version ignora a versão do servidor
    • -h, --host=HOSTNAME host do servidor do banco de dados
    • -U, --username=NAME conecta ao servidor do banco de dados com um usuário específico
    • -W, --password solicita a senha do usuário
    • -d, --dbname=NAME conecta ao banco especifícado
    • -v, --verbose modo verboso

    Essas ferramentas são bastante úteis, principalmente quando não temos interface gráfica.

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

    domingo, 26 de janeiro de 2014

    Enviando e-mail com Laravel 4

    Olá galera,

    No post de hoje vamos mostrar como enviar e-mail usando o Laravel 4 com SMTP. Vamos aos códigos.

    No arquivo app/routes.php. Crie duas novas rotas.

        Route::get('form', 'ContatosController@form');
        Route::post('send', 'ContatosController@send');
      

    Dentro de app/controllers, crie o ContatosController.php e adicione o código abaixo.

        <?php
        class ContatosController extends BaseController {
          public function form()
          {
            return View::make('contatos.form');
          }
    
          public function send()
          {
            $input = Input::all();
            Mail::send('emails.contatos.index', $input, function($message) {
              $message->to('email@dominio_do_site.com.br')->replyTo(Input::get('email'))->subject('Contato do site');
            });
            return Redirect::to('form');
          }
        } 
      

    Criei o controller bem simples, mas você pode adicionar validações e messagens de erro e sucesso. Note que na linha 12, estou capturando do formulário o e-mail informado.

    Crie dentro de app/views/contatos, o arquivo form.blade.php. Como criar o formulário não é o foco desse post, vou deixar que você monte um formulário a sua escolha. Para exemplificar, vou adotar que o formulário tenha os seguintes campos: nome, email, telefone, assunto.

    Crie dentro de app/views/emails/contatos, o arquivo index.blade.php e adicione o código abaixo.

        <!DOCTYPE html>
        <html lang="pt-br">
          <head>
            <meta charset="utf-8">
          </head>
          <body>
            <h2>Dados do contato</h2>
            <p>Nome: {{ $nome }}</p>
            <p>E-mail: {{ $email }}</p>
            <p>Telefone: {{ $telefone }}</p>
            <p>Assunto: {{ $assunto }}</p>
          </body>
        </html>
      

    Perceba que estou usando como nome das variáveis os nomes dos campos do formulário.

    Se você fizer o submit vai notar que não funciona, pois não temos os parâmetros do e-mail configurado. O arquivo a ser configurado é o app/config/mail.php. Para exemplificar, vamos usar a configuração de dois servidores de hospedagem.

    Primeiro a configuração para o KingHost.

        <?php
        return array(
          'driver' => 'smtp',
          'host' => 'smtp.dominio_do_site.com.br',
          'port' => 465,
          'from' => array('address' => 'email@dominio_do_site.com.br', 'name' => 'Meu site'),
          'encryption' => 'ssl',
          'username' => 'email@dominio_do_site.com.br', //Utilize um e-mail criado com o seu domínio
          'password' => 'minha_senha', //Utilize a senha do e-mail criado
          'sendmail' => '/usr/sbin/sendmail -bs',
          'pretend' => false,
        );
      

    Segundo a configuração para o HostGator.

        <?php
        return array(
          'driver' => 'smtp',
          'host' => 'gator2024.hostgator.com',
          'port' => 465,
          'from' => array('address' => 'email@dominio_do_site.com.br', 'name' => 'Meu site'),
          'encryption' => 'ssl',
          'username' => 'meu_usuario', //Utilize o usuário informado na criação da conta do HostGator
          'password' => 'minha_senha', //Utilize a senha recebida por e-mail pelo HostGator
          'sendmail' => '/usr/sbin/sendmail -bs',
          'pretend' => false,
        );
      

    A configuração do mail.php vai depender muito do servidor onde a aplicação vai ser hospedada.

    Espero que vocês tenham gostado e qualquer dúvida é só postar no blog.

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

    segunda-feira, 20 de janeiro de 2014

    Tutorial GeoServer - Estilos

    Olá galera,

    Após um longo período sem postar nada devido a merecidas férias, estamos retornando para dar continuidade a série de vídeos tutoriais sobre o GeoServer. Hoje abordaremos sobre estilos.

    Os arquivos utilizados no vídeo tutorial podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.

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

    quinta-feira, 2 de janeiro de 2014

    Tutorial GeoServer - Grupo de Camadas

    Olá galera,

    Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos abordar sobre agrupamento de camadas.

    Qualquer dúvida é só enviar seu comentário.

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