sábado, 28 de dezembro de 2013

Tutorial GeoServer - SQL

Olá galera,

Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos abordar sobre uma layer gerada a partir de um SQL.

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.

domingo, 22 de dezembro de 2013

Tutorial GeoServer - PostGIS

Olá galera,

Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos abordar sobre o layer do tipo PostGIS.

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.

quarta-feira, 18 de dezembro de 2013

Ordenando uma consulta com o delimitador '/' no SQL Server 2008

Olá galera,

Hoje mostrarei como ordenar strings com delimitador '/' no SQL Server 2008. Imagine um campo cujo formato é 1/2013. O dígito antes da '/' é um número de autoincremento e após a barra é o ano corrente. Supondo que nossa tabela foi dada carga com as informações abaixo.

codigo
1/2013
2/2013
3/2013
9/2013
11/2013
12/2013
2/2014
12/2014
20/2014

Vamos executar uma simples consulta organizando pelo código.

SELECT codigo FROM tabela ORDER BY codigo ASC
codigo
1/2013
11/2013
12/2013
12/2014
2/2013
2/2014
20/2014
3/2013
9/2013

A informação foi organizada realmente mas o resultado ideal seria como a tabela abaixo.

codigo
1/2013
2/2013
3/2013
9/2013
11/2013
12/2013
2/2014
12/2014
20/2014

Para obter esse resultado, minha solução foi o SQL abaixo.

SELECT codigo FROM tabela ORDER BY RIGHT(codigo, CHARINDEX('/', REVERSE(codigo))-1) ASC,
CONVERT(INT, LEFT(codigo, LEN(codigo) - CHARINDEX('/', REVERSE(codigo)))) ASC

Citarei cada uma das funções utilizadas na consulta.

  • RIGHT - Retorna a parte da direita de uma cadeia de caracteres com o número de caracteres especificado.
  • CHARINDEX - Pesquisa uma expressão para outra e retorna sua posição inicial, se for localizada.
  • REVERSE - Retorna a ordem inversa de um valor da cadeia de caracteres.
  • CONVERT - Converte uma expressão de um tipo de dados em outro.
  • LEFT - Retorna a parte da esquerda de uma cadeia de caracteres com o número de caracteres especificado.
  • LEN - Retorna o número de caracteres da expressão da cadeia de caracteres especificada, excluindo espaços em branco à direita.

OBS: Todas as descrições de cada função foram retiradas do site http://technet.microsoft.com/pt-br/library/ms174318.aspx

Conhece outra forma de fazer essa ordenação ?! Compartilhe conosco postando sua solução.

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

sábado, 14 de dezembro de 2013

Tutorial GeoServer - GeoTIFF

Olá galera,

Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos abordar sobre o layer do tipo GeoTIFF.

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

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

quinta-feira, 12 de dezembro de 2013

1 Ano de CodeGeo

Olá galera,

Como não poderia deixar branco, esse post é para comemorar o primeiro aniversário do blog e anunciar a entrada de dois novos autores no CodeGeo, Gledson Cruz e Marcelo Lima. Dois excelentes profissionais que tive a imensa satisfação de trabalhar e que, com certeza, vem agregar conhecimento.

Hoje, o CodeGeo faz exatamente 1 ano de criado, graças ao incentivo do meu amigo Luís Lopes. Uma ilustre figura do Mundo Geo que tive a oportunidade de conhecer no Latinoware 2012.

Gostaria de agradecer também ao amigo Anderson Medeiros que tem dado aquela força na divulgação. E por fim, fica o meu muito obrigado a todos aqueles que vem acompanhando o blog.

Um abraço

sexta-feira, 6 de dezembro de 2013

Tutorial GeoServer - Shapefiles

Olá galera,

Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos abordar sobre o layer do tipo shapefile.

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

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

domingo, 1 de dezembro de 2013

Tutorial GeoServer - Dados

Olá galera,

Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos abordar sobre Workspace e Stores.

O shapefile utilizado no vídeo pode ser baixado aqui. Conforme mencionei no vídeo os GeoTIFFs serão disponibilizados com links externos.

Natural Earth (184.76 MB)

World NASA (174 MB)

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

segunda-feira, 25 de novembro de 2013

Obtendo o valor máximo de uma soma com PostgreSQL

Olá galera,

Hoje falarei sobre a consulta que precisei fazer em um projeto. A idéia é capturar somente os valores máximos das somas dessa consulta. Por se tratar de um "SQL" não muito básico, resolvi compartilhar minha solução utilizando SUM e MAX.

Para exemplificar a situação, vamos adotar uma tabela chamada loja com os valores hipotéticos abaixo:

categoria produto quantidade
Informática Notebook 15
Informática Notebook 20
Informática Mouse 45
Informática Mouse 30
Informática Monitor 25
Informática Monitor 5
Eletrônicos DVD Player 2
Eletrônicos DVD Player 15
Eletrônicos DVD Player 34
Eletrônicos Fone de ouvido 1
Eletrônicos Fone de ouvido 22
Eletrônicos Fone de ouvido 62
Eletrônicos Calculadora 6
Eletrônicos Calculadora 14
Eletrônicos Calculadora 9
Automotivos GPS 3
Automotivos GPS 7
Automotivos GPS 8
Automotivos Rodas 60
Automotivos Rodas 9
Automotivos Alarme 19
Automotivos Alarme 23

Executando a consulta somente com SUM.

SELECT categoria, produto, SUM(quantidade) AS quantidade
FROM loja 
GROUP BY categoria, produto

Obteremos o resultado.

categoria produto quantidade
Informática Notebook 35
Informática Mouse 75
Informática Monitor 30
Eletrônicos DVD Player 51
Eletrônicos Fone de ouvido 85
Eletrônicos Calculadora 29
Automotivos GPS 18
Automotivos Rodas 69
Automotivos Alarme 42

Até agora, não temos complexidade. Só que o resultado desejado é como a tabela abaixo.

categoria produto quantidade
Informática Mouse 75
Eletrônicos Fone de ouvido 85
Automotivos Rodas 69

A consulta seria simples se tivéssemos que exibir somente a coluna categoria e quantidade sem a coluna produto. Pensei em algumas possibilidades, que incluíam o uso do HAVING e WHERE, mas a obrigatoriedade do GROUP BY me fez pensar em outra alternativa. Segue abaixo minha solução.

SELECT a.categoria, a.produto, a.quantidade
FROM (
   SELECT i.categoria, i.produto, SUM(i.quantidade) AS quantidade
   FROM loja i
   GROUP BY i.categoria, i.produto
) AS a
INNER JOIN (
   SELECT t.categoria, MAX(t.quantidade) as quantidade
   FROM (
      SELECT j.categoria, j.produto, SUM(j.quantidade) AS quantidade
      FROM loja j
      GROUP BY j.categoria, j.produto
   ) AS t
   GROUP BY t.categoria
) AS b
ON a.categoria = b.categoria AND a.quantidade = b.quantidade;

Você realizou a consulta de uma forma diferente?! Envie seu comentário e compartilhe conosco.

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

segunda-feira, 18 de novembro de 2013

Tutorial GeoServer - Configuração

Olá galera,

Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos eliminar as mensagens de alerta da tela inicial.

O arquivo utilizado no vídeo pode ser baixado no link http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

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

quarta-feira, 13 de novembro de 2013

Tutorial GeoServer - Diretório Data

Olá galera,

Dando continuidade a série de vídeos tutoriais sobre o GeoServer, hoje iremos alterar o diretório padrão onde ficam armazenados os dados do GeoServer.

OBS: Essa modificação afeta os dados e configurações do GeoServer. Caso já tenha sido feita alguma alteração de senha ou nas camadas, esses dados serão "perdidos" conforme menciono no vídeo. No próximo vídeo tutorial iremos ignorar essa etapa e considerar que estamos adotando o diretório padrão.

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

domingo, 10 de novembro de 2013

Tutorial GeoServer - Instalação

Olá galera,

Hoje daremos início a série de vídeos tutoriais sobre o GeoServer. O vídeo que segue só vai abordar a montagem do ambiente e a instalação do servidor de mapas.

Abaixo segue o resumo dos comandos utilizados no vídeo.

Adicionando o repositório e instalando o Oracle Java

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

Instalando o Tomcat 7

sudo apt-get install tomcat7

Instalando o GeoServer

sudo cp geoserver.war /var/lib/tomcat7/webapps
sudo /etc/init.d/tomcat7 stop
sudo /etc/init.d/tomcat7 start

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

segunda-feira, 4 de novembro de 2013

Habilitando o JSON no PHP 5.5.3 no Ubuntu 13.10

Olá galera,

Após instalar o Ubuntu 13.10, resolvi remontar meu ambiente de desenvolvimento.

A versão do PHP disponível no repositório é a 5.5.3. Nessa versão, a extensão JSON já não é mais instalada por padrão. Com isso, podem ocorrer erros do tipo PHP Fatal error: Call to undefined function json_encode() ou PHP Fatal error: Call to undefined function json_decode() caso a aplicação utilize alguma dessas funções.

Abaixo segue o comando no qual vou instalar um PHP do zero. Caso você já tenha feito a instalação, verifique quais os pacotes que estão faltando.

sudo apt-get install php5 php5-gd php5-pgsql php5-cli php5-cgi libapache2-mod-php5 php-pear php5-dev

Instalando e configurando a extensão do JSON.

cd /usr/bin
sudo pecl install jsonc
cd /etc/php5/mods-available
sudo touch json.ini
sudo gedit json.ini

Adicione o conteúdo abaixo ao arquivo json.ini, salve e feche.

    ; configuration for php JSON module
    ; priority=20
    extension=json.so
  

Agora vamos habilitar a extensão para o PHP e para o Apache.

cd /etc/php5/cli/conf.d
ln -s ../../mods-available/json.ini 20-json.ini
cd /etc/php5/apache2/conf.d
ln -s ../../mods-available/json.ini 20-json.ini

Bem pessoal, espero que a dica tenha sido útil.

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

quarta-feira, 30 de outubro de 2013

Habilitando CGI no Virtual Host com Apache 2.4.6

Olá galera,

O primeiro passo é habilitar o módulo do CGI através de um link simbólico.

cd /etc/apache2/mods-enabled
ln -s ../mods-available/cgi.load cgi.load

O segundo é habilitar a extensão.

sudo gedit /etc/apache2/mods-enabled/mime.conf

Remova o # da linha AddHandler cgi-script .cgi e reinicie o Apache.

sudo /etc/init.d/apache restart

No seu Virtual Host, adicione a linha Include conf-available/server-cgi-bin.conf. Segue o exemplo de um arquivo.

  <VirtualHost *:80>
     ServerName aplicacao
     DocumentRoot /var/www/aplicacao/public
     <Directory /var/www/aplicacao/public>
        Options FollowSymLinks Indexes MultiViews
        AllowOverride All
        Require all granted
     </Directory>
     Include conf-available/server-cgi-bin.conf
   </VirtualHost>
  

OBS: A configuração acima foi feita no Ubuntu 13.10.

Espero que a dica tenha sido útil.
Grande abraço e até a próxima.

sexta-feira, 25 de outubro de 2013

Aplicação com Laravel 4 - Controllers e Views - Final

Olá galera,

Nesse último vídeo falaremos sobre Controllers e Views no Laravel 4. 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.

Antes de iniciar com a visualização do vídeo, faça o download do Select2 clicando aqui. Descompacte-o e coloque os arquivos dentro de suas respectivas pastas.

OBS: Assistindo o vídeo, notei alguns erros com relação aos títulos e vi que ficaram faltando os gêneros no detalhamento do filme. Já fiz as atualizações e encontram-se disponíveis para download através do link abaixo.

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, 20 de outubro de 2013

Comandos úteis para PostgreSQL - Parte 4

Olá galera,

Hoje vamos mostrar mais dois comandos. O primeiro é o CHAR_LENGTH que serve para contar a quantidade de caracteres em uma string.

SELECT CHAR_LENGTH(seu_campo) FROM sua_tabela;

Para o segundo comando, vamos imaginar a importação de um CSV que não contém uma sequência numérica e que precise ser criada. Suponha que criamos um campo id do tipo inteiro que vai armazenar essa sequência. Para criar a sequência, execute os comandos abaixo.

CREATE SEQUENCE minha_tabela_seq;
UPDATE minha_tabela SET id = nextval('minha_tabela_seq');

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

quinta-feira, 17 de outubro de 2013

Ubuntu 13.10 no VirtualBox

Olá galera,

Hoje foi lançado oficialmente o Ubuntu 13.10. No início do ano, publiquei o post Corrigindo a lentidão do Ubuntu 12.10 instalado no VirtualBox e, para minha surpresa, a solução não funciona com o Ubuntu 13.10 que também continua lento.

Dessa vez, a solução é mais simples. Vale lembrar que estou usando o VirtualBox 4.2.12 r84980.

Após ter instalado o Ubuntu 13.10 no VirtualBox, abra terminal dele e execute o comando abaixo.

sudo apt-get install virtualbox-guest-x11

Para que as alterações façam efeito, reinicie a máquina virtual. Bem mais simples não acham ?!

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

Erro do QGIS 1.7 no Ubuntu 13.04

Olá galera,

Há um tempo venho usando o QGIS 1.7 no Ubuntu 13.04 mesmo com um erro ao inicializar. Era exibida uma mensagem de que não foi possível carregar uma biblioteca. Entre outros problemas, o de não permitir gerenciar os complementos, para mim, era o pior.

A melhor solução que encontrei para solucionar o problema, foi atualizar a versão do QGIS para a mais recente. Abra o terminal e execute o código abaixo.

sudo gedit /etc/apt/sources.list

No final do arquivo adicione as linhas abaixo e salve.

deb http://qgis.org/debian raring main
deb-src http://qgis.org/debian raring main

Ainda no terminal, execute os códigos.

gpg --keyserver keyserver.ubuntu.com --recv 47765B75
gpg --export --armor 47765B75 | sudo apt-key add -
sudo apt-get update
sudo apt-get install qgis

A versão mais atual, no dia em quem escrevi o post, é a versão 2.0.1-Dufour.

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

domingo, 13 de outubro de 2013

Aplicação com Laravel 4 - Controllers e Views - Parte 2

Olá galera,

Nesse quinto vídeo falaremos sobre Controllers e Views no Laravel 4. 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.

Comentei no vídeo sobre a fonte que usei para dar carga na parte de tipos. Quem quiser utilizá-la como fonte de dados basta acessar o site http://www.filmesparadownloads.com/qualidades-de-video/.

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.

sábado, 5 de outubro de 2013

Aplicação com Laravel 4 - Controllers e Views - Parte 1

Olá galera,

Nesse quarto vídeo falaremos sobre Controllers e Views no Laravel 4. 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.

Antes de iniciar com a visualização do vídeo, faça o download do conteúdo (CSS, Javascript, Fontes) clicando aqui. Descompacte-o e coloque dentro da pasta public.

Comentei no vídeo sobre a fonte e o código que eu havia usado no CSS para gerar meus ícones. Quem quiser conferir o recurso e os códigos de cada ícone pode acessar o site http://astronautweb.co/snippet/font-awesome/.

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, 30 de setembro de 2013

Aplicação com Laravel 4 - Models e Validations

Olá galera,

Nesse terceiro vídeo falaremos sobre Models e Validations no Laravel 4. 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.

terça-feira, 17 de setembro de 2013

Aplicação com Laravel 4 - Migrations

Olá galera,

Nesse segundo vídeo, falaremos sobre as migrations no Laravel 4. A nossa aplicação inicial será um catálogo de filmes conforme a modelagem 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.

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, 12 de setembro de 2013

Aplicação com Laravel 4 - Configuração

Olá galera,

Conforme prometido estou postando meu primeiro vídeo tutorial. Falaremos sobre o Laravel 4. Para facilitar o entendimento de alguns recursos desse framework, vamos criar uma aplicação básica.

Nesse primeiro vídeo, trataremos somente da parte de configuração. No próximo post, falaremos sobre o projeto e iniciaremos com as migrations.

O código utilizado como base para a nossa aplicação pode ser baixado aqui.

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 alterados podem ser baixados aqui.

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

sexta-feira, 30 de agosto de 2013

Instalando e configurando o MySQL no Ubuntu 13.04

Olá galera,

No post de hoje, vamos instalar e configurar o MySQL para ser utilizado em uma aplicação em PHP. No terminal execute o comando.

sudo apt-get install mysql-server mysql-workbench php5-mysql libmysqlclient-dev

Assim que iniciar a instalação será solicitado uma senha e a sua confirmação.

Agora que tudo foi instalado, abra o MySQL Workbench e configure uma nova conexão. Clique em "Store in keychain" e coloque a senha que você setou na instalação.

Teste a conexão para ver se tudo foi configurado corretamente.

Crie um novo schema chamado aplicacao com o collation utf8.

Clicando com o botão direito em cima do banco aplicacao, selecione a opção "Set as Default Schema".

No próximo post, daremos início a nossa aplicação com PHP.

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

quarta-feira, 21 de agosto de 2013

Concatenando registros no PostgreSQL e SQL Server

Olá galera,

Hoje falaremos sobre a concatenação de registros com SQL. Vamos adotar uma tabela chamada compras que possui as colunas codigo, cliente, produto já com dados inseridos.

Abaixo o resultado de uma consulta simples com dados hipotéticos.

codigo cliente produto
1 João Cerveja
1 João Carne
1 João Queijo
2 Maria Sabonete
2 Maria Chocolate

Agora imagine um resultado, sem tantas repetições, como a tabela abaixo.

codigo cliente produto
1 João Cerveja, Carne, Queijo
2 Maria Sabonete, Chocolate

No PostgreSQL 9.1 usaremos a função string_agg que aceita uma expressão e um delimitador.

SELECT codigo, cliente, string_agg(produto, ', ') AS produto FROM compras GROUP BY codigo, cliente

Já no SQL Server 2008, já é um pouco mais trabalhoso. Usaremos a função STUFF que insere uma cadeia de caracteres em outra cadeia de caracteres e o comando FOR XML PATH para gerar documentos XML extraídos a partir de um banco de dados.

SELECT codigo, cliente, STUFF((SELECT ', ' + produto FROM compras AS b WHERE a.codigo = b.codigo FOR XML PATH('')), 1, 1, '') AS produto FROM compras AS a GROUP BY codigo, cliente

Conhece outras formas de fazer?! Tem experiências com outros bancos?! Poste um comentário e compartilhe seu conhecimento.

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

sexta-feira, 16 de agosto de 2013

Instalando o Laravel 4 no Ubuntu 13.04

Olá galera,

Hoje falaremos da instalação do Laravel 4 no Ubuntu 13.04. Nos próximos posts daremos início a construção de uma aplicação básica mostrando algumas funcionalidades desse framework.

Antes de realizar a instalação, temos alguns requisitos mínimos:

  • PHP >= 5.3.7
  • php5-mcrypt - Extensão MCrypt do PHP

O primeiro passo é fazer o download do framework através do link https://github.com/laravel/laravel. Crie um diretório chamado aplicacao dentro de /var/www e descompacte o conteúdo do download dentro dele.

Pelo terminal, acesse o diretório aplicacao.

cd /var/www/aplicacao

Vamos instalar e executar o Composer que é um gerenciador de dependências para o PHP.

php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"
php composer.phar install

Com esses procedimentos executados já temos nosso framework instalado.

Agora crie um Virtual Host para nossa aplicação. Para isso, siga os passos do post Criando Virtual Host com Apache no Ubuntu 12.10.

Ao se acessar a url http://aplicacao teremos uma tela de erro.

Corrigiremos o problema dando permissão na pasta storage.

sudo chmod -R 777 /var/www/aplicacao/app/storage

Tente acessar a aplicação novamente e deve ser exibida a tela abaixo.

Bem pessoal por hoje é só. Um bom final de semana a todos e até a próxima.

domingo, 4 de agosto de 2013

Dicas para o SQL Server

Olá galera,

No post Aplicação PHP rodando no Linux com banco de dados SQL Server no Windows, falei sobre o problema de strings acentuadas não aparecerem na aplicação. Após esse post, recebi alguns e-mails de visitantes solicitando que listasse quais os problemas que encontrei nessa aplicação.

Comentarei sobre alguns pontos para usuários que usam PostgreSQL e não possuem muita "intimidade" com SQL Server.

1º - Se utilizarmos na constraint de relacionamento o restrict, no SQL Server devemos usar o no action.

2º - No caso de scritps de inserção de dados, no SQL Server devemos utilizar o IDENTITY_INSERT.

No PostgreSQL, por exemplo, é suficiente fazermos INSERT INTO perfil VALUES (1, 'Administrador');, já no SQL Server devemos declarar as colunas explicitamente. Segue abaixo um trecho de código exemplificando.

    SET IDENTITY_INSERT perfil ON
    INSERT INTO perfil (id, nome) VALUES (1, 'Administrador');
    SET IDENTITY_INSERT perfil OFF
  

3º - As datas no SQL Server seguem o padrão YYYYmmdd sem os hífens.

4º - No SQL Server não existe o ILIKE, o LIKE já cumpre esse papel também. Para consultas com acento devemos usar o COLLATE SQL_Latin1_General_CP1_CI_AI. Segue abaixo um exemplo.

    SELECT nome FROM pessoas WHERE nome COLLATE SQL_Latin1_General_CP1_CI_AI LIKE '%Joao%'
  

5º - No update, a chave primária não pode ser atualizada como no PostgreSQL.

6º - A concatenação no SQL Server é feita através de "+" e não com "||" como no PostgreSQL.

Com certeza há vários pontos que não foram abordados. Os que citei se referem a uma aplicação que tive como experiência.

Você gostaria de compartilhar sua experiência com esse tipo de aplicação ?! Envie um comentário ou um e-mail que terei a maior satisfação em colocar sua dica no post.

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

segunda-feira, 29 de julho de 2013

Aplicação PHP rodando no Linux com banco de dados SQL Server no Windows

Olá galera,

Nesse post vou compartilhar uma solução para o caso de uma aplicação PHP rodando no Linux e o SQL Server no servidor Windows.

O primeiro ponto é ter instalado o pacote php5-sybase. Esse pacote fornece o módulo de conexão com bancos Sybase e SQL Server. No Ubuntu, basta executar o comando abaixo caso não o possua instalado.

sudo apt-get install php5-sybase

Supondo que nossa aplicação seja UTF-8 e o banco esteja usando collation Latin1_General_CI_AS. Assim que a aplicação for executada, todas as strings vindas do banco que possuem acento não vão ser exibidas.

Para solucionar o problema, vamos precisar editar um arquivo de configuração do FreeTDS. Para quem não conhece, o FreeTDS é um conjunto de bibliotecas que permite que seus programas "conversem" nativamente com SQL Server e Sybase.

No comando abaixo estou usando o VIM mas fique a vontade para utilizar editor um de sua preferência.

sudo vim /etc/freetds/freetds.conf

No trecho de configurações globais, altere o tds version para 7.0 e logo abaixo dessa linha acrescente client charset = UTF-8. Após a alteração o arquivo deve ficar similar ao trecho abaixo com as alterações em vermelho.

# Global settings are overridden by those in a database
# server specific section
[global]
    # TDS protocol version
        tds version = 7.0
        client charset = UTF-8

OBS: Não altere e nem remova os outros parâmetros nesse arquivo.

Com essa alteração o problema dos acentos devem ser resolvidos. Essa solução foi testada em servidores Ubuntu e CentOS mas deve funcionar com as demais distribuições Linux.

Bem pessoal, espero que a dica tenha sido útil.

Um abraço e até próxima.

terça-feira, 16 de julho de 2013

OpenLayers 3, o que vem por aí !!!

Olá galera,

Fiquei um tempo distante e sem postar nada devido a estar enrolado com alguns projetos. Estou dando uma passada rápida para falar sobre o OpenLayers 3 que se encontra em fase alpha.

No post Criando um cluster com Openlayers, há um bom trecho de código exibindo como é feito na versão 2.

O OpenLayers 3 foi reescrito completamente com base nas tecnologias mais recentes como HTML5, WebGL e CSS3. O que pude perceber nessa nova versão é que o código ficou muito mais limpo e simplificado. Abaixo segue um trecho de código na nova versão

  map = ol.map({
    renderTo: 'map',
    layers: [ol.layer.osm()],
    center: [5, 45],
    zoom: 10
  });
  

O mesmo código pode ser escrito da seguinte forma.

  map = ol.map()
    .renderTo('map')
    .layers([ol.layer.osm()])
    .center([5, 45])
    .zoom(10);
  

Caso alguém queira iniciar os teste com a nova versão, basta inserir o código abaixo dentro da tag <head/>

  <link rel="stylesheet" href="http://ol3js.org/en/r3.0.0-alpha.3/build/ol.css" type="text/css">
  <script src="http://ol3js.org/en/r3.0.0-alpha.3/build/ol.js"></script>
  

Fiz um pequeno exemplo de como ficaria o código final que pode ser baixado aqui.

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

domingo, 2 de junho de 2013

Comandos úteis para PostgreSQL - Parte 3

Olá galera,

Hoje vamos falar sobre mais alguns comandos úteis para o PostgreSQL. O primeiro deles é o INITCAP que deixa a primeira letra da palavra maiúscula. O exemplo abaixo irá atualizar o campo fazendo a transformação das primeiras letras.

UPDATE sua_tabela SET seu_campo = INITCAP(seu_campo);

Supondo que o texto fosse PROGRAMAR É PURA DIVERSÃO, o resultado com INITCAP seria Programar É Pura Diversão. Como você pode notar, esse recurso termina não sendo muito útil. Na maior parte dos casos precisamos somente da primeira letra maiúscula.

Você vai me falar que já entendeu e vai querer uma solução correto? A resposta está na nosso próximo código.

SELECT UPPER(LEFT(seu_campo, 1)) || LOWER(SUBSTRING(seu_campo FROM 2)) FROM sua_tabela;

Utilizando uma combinação do UPPER, LEFT, LOWER e SUBSTRING chegamos ao resultado esperado.

Explicação do código:

  • UPPER(LEFT(seu_campo, 1)) - A primeira letra da esquerda é transformada em maiúscula.
  • || - Utilizado para concatenação no SQL.
  • LOWER(SUBSTRING(seu_campo FROM 2)) - A frase a partir da segunda letra é transformada em minúscula.

Com o código acima, nosso texto de exemplo passaria a ser Programar é pura diversão.

A próxima dica é muito útil para salvar datas no formato do banco. Imagine um campo character varying com datas no formato dd/MM/YYYY que precisam ser convertidas para um campo date.

SELECT DATE(seu_campo) FROM sua_tabela;

Simples não?! É somente isso e dispensa comentários.

Nossa última dica de hoje serve para formatar números. Para exemplificar, podemos citar um campo bigint com o valor 11000.56 e saída tem de vir formatada com pontos e vírgulas.

SELECT to_char(11000.56, 'FM9G999G999D99');

O resultado do código acima é 11.000,56. O segredo está na "máscara" utilizada.

Explicação do código:

  • to_char - Converte em string.
  • D - Separador decimal.
  • G - Separador de grupo.
  • FM - Suprimi espaços em branco e zeros.

Bem pessoal, era isso que tínhamos para hoje. Um grande abraço e até a próxima.

segunda-feira, 29 de abril de 2013

Comandos úteis para PostgreSQL - Parte 2

Olá galera,

No post Comandos úteis para PostgreSQL - Parte 1 citei alguns comandos que uso no dia a dia. No post de hoje adicionarei mais alguns.

Importar um arquivo CSV:

COPY sua_tabela (campos) FROM 'path_para_o_arquivo' WITH DELIMITER ';'

Ex: COPY contatos (nome, telefone, email) FROM '/home/benicio/Documentos/contatos.csv' WITH DELIMITER ';'

Atualizar um campo do tipo POINT a partir de coordenadas:

UPDATE sua_tabela SET campo_geometrico = GeomFromText('POINT(' || campo_longitude || ' ' || campo_longitude || ')', projecao);

Ex: UPDATE localidade SET the_geom = GeomFromText('POINT(' || longitude || ' ' || latitude || ')', 4326);

Remover espaços em branco:

UPDATE sua_tabela SET seu_campo = TRIM(BOTH ' ' FROM seu_campo);

Ex: UPDATE eventos SET dias = TRIM(BOTH ' ' FROM dias);

Substituir strings ou parte delas:

UPDATE sua_tabela SET seu_campo = REPLACE(seu_campo, 'string_de', 'string_para');

Ex: UPDATE outorgas SET estado = replace(estado, 'TO', 'Tocantins');

Atualizar campos de tabelas em schemas diferentes:

UPDATE schema.tabela_destino SET campo_tabela_destino = campo_tabela_origem FROM schema.tabela_origem;

Ex: UPDATE public.domicilios d SET codigo_ibge = m.chave_municipio::integer FROM geo.municipio m WHERE d.cod_munic = m.cod_munic;

Gostaria de compartilhar seus comandos aqui no blog?! Basta enviar seu comando e seu contato que terei a maior satisfação em citá-lo aqui no blog.

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

domingo, 21 de abril de 2013

Ignorando acentos em consultas com PHP e PostgreSQL

.

Olá galera,

Nesse post mostrarei um forma prática de se fazer consultas onde acentos são ignorados na busca. Como ultimamente estou trabalhando com Laravel, utilizarei um trecho de código dele para ilustrar. Todavia você pode fazer os ajustes para o framework de sua preferência.

Primeiro utilizaremos o recurso unaccent presente no PostgreSQL 9.1 para tratar os acentos das strings cadastradas no banco. O unaccent é um dicionário de pesquisas textuais que remove os acentos.

O segundo recurso é o transliterator_transliterate presente no PHP 5.4 e transforma uma string ou parte dela através de um ICU transliterator.

    <?php
      $locais = Local::where(DB::raw('unaccent(nome)'), 'ILIKE', "%". transliterator_transliterate('Any-Latin; Latin-ASCII', Input::get('nome')) ."%"); 
    ?>
  

No código acima, estou pesquisando em uma tabela de locais cujo nome foi passado em um formulário de busca fictício. Supondo que o usuário entrou com a string no formulário e na nossa tabela de locais tenhamos cadastrados os nomes: Cuiabá, Barra, Iguatemi, Park Shopping.

O código resultante seria como o abaixo.

    SELECT * FROM locais WHERE unaccent(nome) ILIKE '%ba%'
  

E como resultado da nossa busca teríamos os nomes: Cuiabá, Barra.

OBS: Para que os códigos acima funcionem é necessário instalar o recurso no PostgreSQL e o pacote de internacionalização do PHP. Para o PHP 5.5.3 é necessário instalar o pacote php5-intl e para o PostgreSQL deve se executar CREATE EXTENSION IF NOT EXISTS unaccent

Não é realmente simples?! Um grande abraço e até a próxima.

terça-feira, 16 de abril de 2013

Shapefiles do Brasil para download

Olá galera,

Hoje precisei de alguns shapefiles atualizados do Brasil. Para ser mais preciso shapes de Regiões, Estados e Municípios do Brasil.

Depois de muita busca, consegui achar os de Estado e Municípios com uma boa qualidade. Já o de Regiões, eu mesmo tive de montar aqui unindo as feições dos Estados que compõe cada região.

Como minha finalidade é guardá-los no PostGIS, fiz alguns ajustes. Acrescentei algumas colunas e removi as que julguei desnecessárias. Abaixo seguem os links para download.

Regiões

Estados

Municípios

OBS: Todos os shapes estão na projeção EPSG:4326. Os dados referentes a população e PIB dos munícipios são dados retirados do IBGE do ano de 2010.

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

segunda-feira, 8 de abril de 2013

Wireless travando no Ubuntu 12.10

Olá galera,

Sempre que realizo muitos downloads simultâneos, nessa versão do Ubuntu, minha wireless trava. Você poderia sugerir para eu desconectar da wireless e conectar novamente não é verdade?! Também não funciona. Eu consigo conectar mas não navegar. A única solução que funcionava era reiniciar o notebook. Uma alternativa incômoda ainda mais quando se está muito atarefado.

Conversando com um amigo, ele comentou que já teve o mesmo problema usando uma versão do Ubuntu com o KDE e em um notebook com hardware diferente do meu.

Segue abaixo a solução que ele utiliza quando ocorre o problema.

sudo rmmod seu_adaptador_de_rede

O comando rmmod remove os módulos do kernel em execução.

O meu adaptador de rede aqui é o rtl8192se. Verifique qual o seu e substitua o trecho seu_adaptador_de_rede por ele.

Agora temos de subir o módulo novamente.

sudo modprobe seu_adaptador_de_rede

O comando modprobe carrega o módulo do kernel.

Bem galera espero que a dica do meu amigo Luiz tenha sido útil.

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

domingo, 31 de março de 2013

Criando elementos HTML com jQuery

Olá galera,

Outro dia precisei criar um elemento HTML dinamicamente usando jQuery. Como fazer isso?! Basta colocá-lo como objeto jQuery.

    var div = $("<div />");

    $("body").append(div);
  

Agora digamos que você quer criar o elemento já com os atributos.

    var div = $("<div />");

    div.attr({
      id: 'minha_div',
      title: 'estilo'
    });

    $("body").append(div);
  

Esse é o jeito mais tradicional. Vamos ver uma forma mais simplificada.

    var div = $("<div />", {
      id: 'minha_div',
      title: 'estilo'
    });

    $("body").append(div);
  

Mais elegante concorda?! Um dica básica porém muito útil em alguns projetos.

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

sábado, 30 de março de 2013

Padrão de nomenclatura para banco de dados

Olá galera,

Há algum tempo venho adotando um padrão de nomenclatura para tabelas e campos do banco de dados. Esse padrão é utilizado por muitos frameworks como: Ruby on Rails, Laravel, Yii Framework, CakePHP, entre outros.

Se você já usou algum desses frameworks ou pretende usar, vai notar que seguindo essa convenção terá que configurar e codificar menos.

Criei um exemplo de uma modelagem bem simples para demonstrar o padrão.

  1. Nome das tabelas no plural.
  2. Tabela em um relacionamento N:M - O nome das duas tabelas envolvidas no plural, em ordem alfabética e separado por "_"
  3. Chave estrangeira - Nome da tabela no singular com "_id".
  4. Chave primária - Somente "id"

Sintam-se a vontade para adotar ou não esse padrão. Resolvi segui-lo pois a maioria dos frameworks que trabalho usa ele.

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

segunda-feira, 18 de março de 2013

Criando um cluster com Openlayers

Olá galera,

A idéia desse post é criarmos um exemplo de cluster com Openlayers utilizando um GeoJSON. Utilizaremos um GeoJSON com as sedes dos municípios brasileiros por ser uma massa de dados com muitos pontos.

O primeiro passo é criar a estrutura do nosso projeto como abaixo.

Antes de começarmos a escrever código, faça o download do Openlayers. Atualmente, a última versão estável e a que vamos usar no nosso exemplo é a 2.12.

Após descompactar o arquivo baixado, copie o arquivo Openlayers.js que se encontra na raiz para a pasta js. Em seguida copie o arquivo style.css dentro de theme/default para a pasta css.

Faça o download do GeoJSON e salve na pasta js do nosso projeto. Além dele, baixe as imagens que vamos utilizar e salve na pasta img do nosso projeto.

O arquivo index.html deve conter o código abaixo.

    <!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <title>CodeGeo - Desenvolvimento é diversão</title>
        <link rel="stylesheet" type="text/css" href="css/cluster.css" />
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
        <script type="text/javascript" src="js/OpenLayers.js" defer></script>
        <script type="text/javascript" src="js/cluster.js" defer></script>
      </head>
      <body>
        <div id="map"></div>
      </body>
    </html>
  

Obs:. Explicarei somente sobre algumas linhas de código do nosso projeto já que as demais são bem comuns para quem desenvolve para web. Ainda assim, caso alguma parte do código não fique clara, terei a maior satisfação em responder sua dúvida.

Na linha 9, carregando a api do Google Maps já que utilizaremos uma camada do Google.

Nas linhas 10 e 11, note que estou usando defer. Este atributo indica que o bloco de script só será carregado após todo o carregamento da página.

Crie o arquivo cluster.css dentro da pasta css do nosso projeto e adicione o código abaixo.

  * {
    margin: 0;
    padding: 0;
  }
  body {
    font: normal 11px arial, sans-serif;
    text-align: justify;
  }
  #map {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
  }
  

Na linha 1, limpando as margens e espaçamentos de todos os elementos.

Na linha 9, setando o nosso mapa para ocupar 100% da páginal.

Para os que estão acompanhando o blog, devem ter notado que os códigos e análises acima são idênticos aos dos últimos posts. A parte que se vai diferenciar é exatamente o código que vem a seguir.

Crie o arquivo cluster.js dentro da pasta js do nosso projeto e adicione o código abaixo.

OpenLayers.ImgPath='img/';

var map = new OpenLayers.Map({
  controls: [
    new OpenLayers.Control.Navigation(),
    new OpenLayers.Control.Zoom(),
    new OpenLayers.Control.MousePosition(),
    new OpenLayers.Control.ScaleLine(),
    new OpenLayers.Control.LayerSwitcher()
  ],
  div: "map",
  projection: "EPSG:4326",
  layers: [
    new OpenLayers.Layer.OSM(null, null, {isBaseLayer: true}),
    new OpenLayers.Layer.Google("Google Streets")
  ],
  theme: 'css/style.css'
});

var renderCluster = function(feature, tipo) {
  var qtd = feature.attributes.count;
  if (qtd > 200) {
    return (tipo == 'img') ? 'img/m3.png' : 64;
  } else if (qtd > 20) {
    return (tipo == 'img') ? 'img/m2.png' : 48;
  } else {
    return (tipo == 'img') ? 'img/m1.png' : 32;
  }
}

var pontoStyle = new OpenLayers.StyleMap({
  'default': new OpenLayers.Style({
    externalGraphic: "${iconImg}",
    graphicWidth: "${iconSize}",
    graphicHeight: "${iconSize}",
    label: "${getName}",
    fontSize: "9px",
    fontFamily: "Trebuchet MS, sans-serif",
    labelAlign: "cm"
  },{
    context: {
      iconImg: function (feature) {
        return renderCluster (feature, 'img');
      },
      iconSize: function (feature) {
        return renderCluster (feature, 'size');
      },
      getName: function (feature) {
        return feature.attributes.count;
      }
    }
  })
});

var points = new OpenLayers.Layer.Vector('Cluster', {
  strategies: [
    new OpenLayers.Strategy.Fixed(),
    new OpenLayers.Strategy.Cluster(),
    new OpenLayers.Strategy.BBOX()
  ],
  visibility: false,
  protocol: new OpenLayers.Protocol.HTTP({
    url: "js/sedes.json",
    format: new OpenLayers.Format.GeoJSON()
  }),
  styleMap: pontoStyle
});

map.addLayer(points);

map.setCenter(
  new OpenLayers.LonLat(-5112108.4510014, -1854056.5578272), 4
);

Na linha 1, alterando a pasta padrão de imagens do Openlayers.

Na linha 3, instanciando nosso mapa.

Na linha 4, adicionando alguns controles como zoom, posição do mouse, escala, navegação e layerswitcher.

Na linha 11, o id da div onde carregaremos o mapa.

Na linha 12, a projeção que estamos utilizando.

Na linha 13, as camadas que usaremos como base layer, no caso Google Maps e OpenStreetMap.

Na linha 17, alterando o caminho e qual o arquivo css padrão do Openlayers.

Na linha 20, criei uma função que vai retornar as imagens e os tamanhos de cada uma delas de acordo com quantidade de pontos.

Na linha 31, instanciando o estilo que vai ser usado nos pontos.

Na linha 55, instanciando uma camada do tipo vector tendo como a fonte de dados o GeoJSON e setando o estilo que criamos na linha 31.

Na linha 69, adicionando a camada ao mapa.

Na linha 71, setando o enquadramento inicial no Brasil.

Como resultado devemos ter um mapa como o abaixo:

O arquivo final pode ser baixado clicando aqui.

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

domingo, 17 de março de 2013

Criando e exibindo um WMS com MapServer, PostGIS e Openlayers - Parte 2

Olá galera,

Dando continuidade ao nosso último post, iremos dar carga no banco de dados e criar o mapfile que será chamado pelo Openlayers.

Primeiro baixe o arquivo de estados em formato SQL. Caso você queira usar seu próprio shapefile, pode transformá-lo usando um comando que eu citei no post Alguns comandos úteis para PostgreSQL.

Caso você ainda não tenha instalado o PostgreSQL com PostGIS, recomendo olhar o post Instalando e configurando o PostgreSQL, PostGIS e pgAdmin no Ubuntu 12.04 antes de prosseguir.

Para gerar o banco e dar carga, usei o pgAdmin mas sinta-se a vontade para utilizar inclusive o terminal. É importante utilizar o template do PostGIS ao gerar o banco.

Agora que o banco de dados está pronto, cria na pasta raiz do projeto o arquivo fonts.list e insira o código abaixo:

    ubuntu /usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
  

Esse arquivo indica o caminho e nome da font que vamos utilizar no label do mapfile.

Ainda na pasta raiz do projeto, crie o arquivo codegeo.map e insira o código abaixo:

#
# Mapfile - CodeGeo
#

MAP
  NAME 'codegeo_wms'
  IMAGETYPE PNG
  EXTENT -73.9913940429688 -33.7520141601562 -32.3924560546875 5.27179002761841
  UNITS meters
  SIZE 800 600
  FONTSET '/var/www/codegeo/fonts.list'

#
# Definição da projeção do mapa
#
 
  PROJECTION
    "init=epsg:4326"
  END
 
#
# Formato de imagem que utiliza a biblioteca GD
#
 
  OUTPUTFORMAT
    NAME "aggpng"
    DRIVER "AGG/PNG"
    MIMETYPE "image/png"
    IMAGEMODE RGBA
    EXTENSION "png"
  END

#
# Definição WEB
#
 
  WEB
    TEMPLATE void
    IMAGEPATH "/var/www/codegeo"
    IMAGEURL "http://localhost/codegeo"
    METADATA
      "wms_title" "WMS PNG CodeGeo"
      "wms_onlineresource" "http://localhost/cgi-bin/mapserv?map=/var/www/codegeo/codegeo.map"
      "wms_srs" "EPSG:4326 EPSG:900913"
      "wms_abstract" "Serviço WMS PNG CodeGeo."
      "ows_enable_request" "*"
      "wms_feature_info_mime_type" "text/html"
    END
  END

#
# Camada de Estados do Brasil
#
  
  LAYER
    NAME 'estados'
    CONNECTIONTYPE postgis
    CONNECTION "user=postgres password=1234 dbname=codegeo host=localhost"
    DATA "the_geom FROM estados USING UNIQUE id USING SRID=4326"
    TYPE POLYGON
    STATUS default
    TRANSPARENCY 65
    LABELITEM 'nome'
    LABELCACHE ON

    CLASS
      NAME 'bahia'
      EXPRESSION ([codigo] eq 29)
      LABEL
        COLOR 0 0 0
        FONT ubuntu
        TYPE TRUETYPE
        POSITION CC
        PARTIALS FALSE
        SIZE 9
        BUFFER 5
        OUTLINECOLOR 255 255 255
      END
      STYLE
        OUTLINECOLOR 0 0 0
        COLOR 187 117 0
      END
    END

    CLASS
      NAME 'padrao'
      LABEL
        COLOR 0 0 0
        FONT ubuntu
        TYPE TRUETYPE
        POSITION CC
        PARTIALS FALSE
        SIZE 9
        BUFFER 5
        OUTLINECOLOR 255 255 255
      END
      STYLE
        OUTLINECOLOR 0 0 0
        COLOR 155 137 123
      END
    END
  END
 
END

De um forma geral, o mapfile criado vai exibir todos os Estados do Brasil com seus respectivos nomes e com a Bahia em destaque.

Farei um comentário das linhas que possuem uma relevância.

Linha 11 - Caso pretenda utilizar um outra fonte ou esteja usando um sistema operacional diferente, certifique-se de setar o caminho correto para a fonte do seu sistema.

Linha 58 - Certifique-se de fazer as alterações para as configurações da sua máquina.

Linha 63 - Esse é o campo da tabela utilizado para exibir qual o conteúdo estará no label do mapa.

Linha 68 - Nesse trecho, o campo da tabela codigo é igualado ao valor do código da Bahia no banco de dados.

Para finalizar, antes da linha que contém o código map.setCenter( no arquivo project.js, insira o trecho abaixo:

    var estados = new OpenLayers.Layer.WMS("Estados",
      "http://localhost/cgi-bin/mapserv?map=/var/www/codegeo/codegeo.map",
      {
        layers: "estados",  
        transparent: true
      },
      {
        isBaseLayer: false,
        visibility: false,
        singleTile: false
      }
    );

    map.addLayers([estados]);
  

No trecho acima, seto o caminho onde nosso mapfile está e qual layer vamos exibir.

O resultado final deve se parecer com a imagem abaixo:

A versão final do nosso aplicativo pode ser baixado clicando aqui.

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

domingo, 10 de março de 2013

Criando e exibindo um WMS com MapServer, PostGIS e Openlayers - Parte 1

Olá galera,

Conforme prometido, iremos criar um serviço WMS utilizando MapServer e PostGIS. Para visualizar nosso mapa, usaremos o Openlayers.

No post de hoje, vamos criar a estrutura inicial com alguns controles para exibir o nosso mapa. Abaixo segue a estrutura de pastas do nosso projeto.

Antes de começarmos a escrever código, faça o download do Openlayers. Atualmente, a última versão estável e a que vamos usar no nosso exemplo é a 2.12.

Após descompactar o arquivo baixado, copie o arquivo Openlayers.js que se encontra na raiz para a pasta js. Em seguida copie o arquivo style.css dentro de theme/default para a pasta css.

Faça, também, o download do arquivo e descompacte na pasta img do nosso projeto.

O arquivo index.html deve conter o código abaixo.

    <!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <title>CodeGeo - Desenvolvimento é diversão</title>
        <link rel="stylesheet" type="text/css" href="css/project.css" />
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
        <script type="text/javascript" src="js/OpenLayers.js" defer></script>
        <script type="text/javascript" src="js/project.js" defer></script>
      </head>
      <body>
        <div id="map"></div>
      </body>
    </html>
  

Obs:. Explicarei somente sobre algumas linhas de código do nosso projeto já que as demais são bem comuns para quem desenvolve para web. Ainda assim, caso alguma parte do código não fique clara, terei a maior satisfação em responder sua dúvida.

Na linha 9, carregando a api do Google Maps já que utilizaremos uma camada do Google.

Nas linhas 10 e 11, note que estou usando defer. Este atributo indica que o bloco de script só será carregado após todo o carregamento da página.

Crie o arquivo project.css dentro da pasta css do nosso projeto e adicione o código abaixo.

  * {
    margin: 0;
    padding: 0;
  }
  body {
    font: normal 11px arial, sans-serif;
    text-align: justify;
  }
  #map {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
  }
  

Na linha 1, limpando as margens e espaçamentos de todos os elementos.

Na linha 9, setando o nosso mapa para ocupar 100% da páginal.

Crie o arquivo project.js dentro da pasta js do nosso projeto e adicione o código abaixo.

   OpenLayers.ImgPath='img/';

   var map = new OpenLayers.Map({
    controls: [
        new OpenLayers.Control.Navigation(),
        new OpenLayers.Control.Zoom(),
        new OpenLayers.Control.MousePosition(),
        new OpenLayers.Control.ScaleLine(),
        new OpenLayers.Control.LayerSwitcher()
    ],
    div: "map",
    projection: "EPSG:900913",
    layers: [
        new OpenLayers.Layer.OSM(null, null, {isBaseLayer: true}),
        new OpenLayers.Layer.Google("Google Streets")
    ],
    theme: 'css/style.css'
   });

   map.setCenter(
      new OpenLayers.LonLat(-5112108.4510014, -1854056.5578272), 4
   );
  

Na linha 1, alterando a pasta padrão de imagens do Openlayers.

Na linha 3, instanciando nosso mapa.

Na linha 4, adicionando alguns controles como zoom, posição do mouse, escala, navegação e layerswitcher.

Na linha 11, o id da div onde carregaremos o mapa.

Na linha 12, a projeção que estamos utilizando.

Na linha 13, as camadas que usaremos como base layer, no caso Google Maps e OpenStreetMap.

Na linha 17, alterando o caminho e qual o arquivo css padrão do Openlayers.

Na linha 20, setando o enquadramento inicial no Brasil.

Como resultado devemos ter um mapa como o abaixo:

No próximo post, vamos dar carga no banco de dados e criar um mapfile com o serviço WMS. Um abraço e até a próxima.

sexta-feira, 1 de março de 2013

Utilizando .htaccess para hospedar uma aplicação Laravel em produção

Olá galera,

Há alguns dias precisei hospedar uma aplicação feita em Laravel em um servidor externo. O problema é que não tinha acesso para criar um Virtual Host que apontaria para o diretório onde está o arquivo index.php. No caso do Laravel, o diretório que contém esse arquivo é o public.

Aí me veio a idéia de utilizar o .htaccess que é um arquivo que permite subescrever configurações de escopo global.

Mãos à obra?! No diretório raiz da aplicação do servidor externo, que normalmente é "public_html" ou "www", crie um arquivo .htaccess com o seguinte conteúdo:

    <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteCond %{REQUEST_URI} !^public
      RewriteRule ^(.*)$ public/$1 [L]
    </IfModule>
  

Agora quando sua aplicação for acessada, ocorrerá o direcionamento automático para a pasta public. É algo bem simples porém muito útil.

No próximo post vou falar sobre Openlayers e MapServer. Grande abraço e até a próxima.

sexta-feira, 22 de fevereiro de 2013

Comandos úteis para PostgreSQL - Parte 1

Olá galera,

Tou passando rapidinho para falar de alguns comandos úteis que me salvaram.

Restaurar backup

psql seu_banco -f backup.sql

Converter um Shapefile para SQL

root@notebook:/usr/lib/postgresql/9.1/bin# shp2pgsql -s 4326 -W latin1 /home/seu_usuario/Downloads/estados_brasil_WGS84.shp > /home/seu_usuario/Downloads/estados_brasil_WGS84.sql

Criar um índice espacial

CREATE INDEX estados_idx ON estados USING gist(the_geom);

Grande abraço a todos e bom fim de semana.

quinta-feira, 21 de fevereiro de 2013

Configurando o ProxyHost do Openlayers no Ubuntu 12.10

Olá galera,

Há um tempo atrás, tive a oportunidade de trabalhar em um projeto utilizando Openlayers e GeoServer. Enquanto estive consumindo as camadas WMS não tive problemas, mas eles começaram quando utilizei as WFS. Pesquisando pela internet descobri que se tratava do ProxyHost. Após muita procura me deparei com uma solução para Windows no blog do nosso saudoso Fernando Quadros.

Para configurá-lo no Ubuntu seguiremos alguns passos.

O primeiro deles é fazer o download do ProxyHost no link http://svn.openlayers.org/trunk/openlayers/examples/proxy.cgi

Altere o proxy.cgi e acrescente mais 4 parâmetros ('localhost:8080', 'localhost', '127.0.0.1:8080', '127.0.0.1') sendo que o resultado final do trecho alterado deve se parecer com o abaixo:

    allowedHosts = ['www.openlayers.org', 'openlayers.org', 'labs.metacarta.com', 'world.freemap.in', 'prototype.openmnnd.org', 'geo.openplans.org', 'sigma.openplans.org', 'demo.opengeo.org', 'www.openstreetmap.org', 'sample.azavea.com', 'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080', 'vmap0.tiles.osgeo.org', 'www.openrouteservice.org', 'localhost:8080', 'localhost', '127.0.0.1:8080', '127.0.0.1']
  

Utilizando o terminal, acesse o diretório onde você fez o download do proxy.cgi e copie ele para a pasta cgi-bin. Além disso, vamos setar a permissão adequada.

sudo cp proxy.cgi /usr/lib/cgi-bin
sudo chmod a+x proxy.cgi

Vamos habilitar o CGI no Apache

sudo gedit /etc/apache2/mods-enabled/mime.conf

Remova o # da linha AddHandler cgi-script .cgi

Reinicie o Apache

sudo /etc/init.d/apache restart

Agora você pode setar o ProxyHost na sua aplicação web e testar.

OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";

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

sábado, 16 de fevereiro de 2013

Instalando e configurando o GeoServer com Tomcat 7 e Oracle Java 7

Olá galera,

Bem após alguns dias sem postar nada devido a uma rotina pesada de programação, estou voltando para mostrar como rodar o GeoServer com Tomcat 7 e Oracle Java 7.

Para instalar o Oracle Java, basta executar os comandos abaixo:

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

Aceitaremos os termos da licença e vamos aguardar a instalação ser concluída.

O próximo passo é setar o JAVA_HOME como variável de ambiente.

sudo gedit /etc/bash.bashrc

No final do arquivo, acrescentaremos as linhas abaixo:

  export JAVA_HOME= /usr/lib/jvm/java-7-oracle
  export PATH=$PATH:$JAVA_HOME/bin
  

Para que as alterações tenham efeito, reinicie a máquina e no terminal execute o código abaixo:

echo $JAVA_HOME

O resultado deve ser algo como /usr/lib/jvm/java-7-oracle.

Anexei abaixo algumas telas comprovando o funcionamento do plugin do Java no navegador.

Agora que o Java está funcionando, seguiremos com o Tomcat.

sudo apt-get install tomcat7

Logo após a instalação não será possível inicializar o Tomcat devido a um ajuste.

sudo gedit /etc/init.d/tomcat7

Encontre o trecho JDK_DIRS="/usr/lib/jvm/default-java ${OPENJDKS} /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun" e altere o trecho em negrito para que o resultado final seja JDK_DIRS="/usr/lib/jvm/default-java ${OPENJDKS} /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-7-oracle"

Com as correções efetuadas, inicie o Tomcat 7.

sudo /etc/init.d/tomcat7 start

Acessando pelo browser com a url http://localhost:8080, você terá como resultado a tela abaixo.

Agora vamos a nossa última etapa. Faça o download da última versão estável do Web Archive (WAR) através do link http://geoserver.org/display/GEOS/Stable.

Descompacte o arquivo baixado e usando o terminal acesse o diretório onde ele se encontra. Agora é copiar o arquivo para o diretório específico.

sudo cp geoserver.war /var/lib/tomcat7/webapps

Reinicie o Tomcat para que as alterações tenha efeito.

sudo /etc/init.d/tomcat7 restart

Abra o browser e inserindo a url http://localhost:8080/geoserver, teremos as telas abaixo. OBS: O login para acessar o GeoServer é admin e a senha é geoserver

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

terça-feira, 5 de fevereiro de 2013

Criando Virtual Host com Apache no Ubuntu 12.10

Olá galera,

A dica de hoje é bem básica mas muito útil para quem costuma desenvolver usando o Apache como servidor web.

Supondo que estejamos usando um framework feito em PHP e que seu acesso padrão seja http://localhost/aplicacao/public. Vamos criar um Virtual Host específico para essa aplicação.

Criaremos o arquivo aplicacao dentro do diretório /etc/apache2/sites-enabled.

sudo gedit /etc/apache2/sites-enabled/aplicacao

Dentro do arquivo criado colocaremos o seguinte conteúdo:

  <VirtualHost *:80>
     ServerName aplicacao
     DocumentRoot /var/www/aplicacao/public
     <Directory /var/www/aplicacao/public>
        Options FollowSymLinks Indexes MultiViews
        AllowOverride All
     </Directory>
   </VirtualHost>
  

Próximo passo é adicionar uma entrada chamada aplicacao ao lado de localhost.

Obs: Não altere os outros parâmetros presentes no arquivo.

sudo gedit /etc/hosts

O trecho alterado no arquivo deve ter ficado similar ao código abaixo.

    127.0.0.1       localhost aplicacao
  

Reiniciaremos o Apache para que as alterações passem a funcionar.

sudo /etc/init.d/apache2 restart

Pronto! Nossa aplicação agora pode ser acessada através da url http://aplicacao.

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

sexta-feira, 1 de fevereiro de 2013

Corrigindo erro do VirtualBox após atualização do kernel no Ubuntu 12.10

Olá galera,

Todas as vezes que ocorre uma atualização de kernel no Ubuntu e precisamos utilizar o VirtualBox, nos deparamos com a tela abaixo.

Até o Ubuntu 12.04, resolviamos esse erro através do terminal executando o comando abaixo.

sudo /etc/init.d/vboxdrv setup

No Ubuntu 12.10, mesmo executando o comando é exibido uma mensagem de erro.

Isto ocorre porque no Ubuntu 12.10 os pacotes linux-headers-* não são mais instalados por padrão.

Eu costumo utilizar o Synaptic para corrigir o problema mas nada impede de você utilizar o terminal. O primeiro passo é sabermos qual foi a última versão do Linux kernel image e procurarmos a versão dos pacotes linux-headers-* correspondentes no Synaptic.

Após instalar os pacotes que estavam faltando, basta voltarmos ao terminal e executar novamente o comando sudo /etc/init.d/vboxdrv setup

Com todos os procedimentos executados corretamente, o VirtualBox deve voltar a funcionar normalmente.

Bem pessoal espero que essa dica tenha sido útil. Bom final de semana a todos e até a próxima.

Sublime Text 2 no Ubuntu 12.10

Olá galera,

Há uns dias atrás, meu amigo Biguá comentou comigo sobre um framework em PHP chamado Laravel. Como não o conhecia, resolvi estudar para fazer uma avaliação.

Até o presente momento, estou gostando muito do que estou vendo e em breve devo postar alguma coisa. Mas porque contei sobre o framework ?! Foi vendo os vídeos dele que percebi como os desenvolvedores preferem utilizar o Sublime Text 2 como editor por possuir vários recursos. Decidi utilizá-lo já que possui vários pacotes para diversas linguagens e frameworks.

O primeiro passo é fazer o download no site http://www.sublimetext.com/2. Baixe a versão de acordo com o Ubuntu que você estiver utilizando. No meu caso, como é uma versão 64 bits, fiz o download da versão correspondente.

Após fazer o download, vamos descompactar e renomear o diretório gerado para SublimeText2.

Utilizando o terminal, moveremos o diretório SublimeText2 para /usr/lib. Segue abaixo o comando utilizado aqui no meu caso.

sudo mv /Downloads/SublimeText2 /usr/lib/

Para chamar o Sublime via terminal, criaremos um link simbólico para o diretório /usr/bin.

sudo ln -s /usr/lib/SublimeText2/sublime_text /usr/bin/sublime

Próximo passo é criar um lançador para Unity.

sudo gedit /usr/share/applications/sublime.desktop

Copie e cole o código abaixo no arquivo sublime.desktop.

[Desktop Entry]
Version=1.0
Name=Sublime Text 2
GenericName=Editor de Texto 

Exec=sublime
Terminal=false
Icon=/usr/lib/SublimeText2/Icon/48x48/sublime_text.png
Type=Application
Categories=TextEditor;IDE;Development
X-Ayatana-Desktop-Shortcuts=NewWindow 

[NewWindow Shortcut Group]
Name=New Window
Exec=sublime -n
TargetEnvironment=Unity

Após salvar o arquivo, vamos fazer uma busca como na imagem abaixo.

Com o Sublime aberto, instalaremos o Sublime Package Control. Vá no menu View->Show Console, copie e cole o código abaixo.

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')

Após inserir o código como na imagem acima, podemos dar um ENTER. Teremos a tela seguinte solicitando que reiniciemos o Sublime.

Com o Sublime aberto novamente, usaremos o atalho Ctrl+Shift+P. Surgirá uma lista de opções, escolha a Package Control: Install Package.

Um lista de repositórios será carregada e você poderá instalar os pacotes de seu interesse.

Nas imagens abaixo, você pode notar no rodapé do Sublime os pacotes sendo instalados e sem seguida a mensagem de sucesso.

Instalei alguns pacotes para desenvolver com o Laravel. Agora, o Sublime já fornece um autocomplete usando recursos do framework e exibe uma highlight para o código. Abaixo temos a imagem de uma engine de template do Laravel conhecida como Blade. Note que a sintaxe usada por ele já foi "identificada" pelo Sublime.

Bem pessoal, espero que a dica tem sido útil. Até a próxima.

terça-feira, 29 de janeiro de 2013

Instalando Apache 2 e PHP 5 no Ubuntu 12.10

Olá galera,

Passei alguns dias sem postar nada por estar viajando. Nesse post vou mostrar o passo a passo simples dessa instalação.

Instalação o Apache

sudo apt-get install apache2

Habilitando o mod-rewrite

sudo a2enmod rewrite

Ajustando a reescrita para URLs amigáveis

sudo vim /etc/apache2/sites-enabled/000-default

Pesquisaremos pelo bloco de código e faremos a alteração como abaixo

<Directory />
  Options FollowSymLinks
  AllowOverride All
</Directory>
<Directory /var/www/>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
</Directory>

Instalação do PHP

sudo apt-get install php5 php5-gd php5-pgsql php5-cli php5-cgi libapache2-mod-php5

Reiniciando o Apache

sudo /etc/init.d/apache2 restart

Alteraremos a permissão da pasta web deixando-a 100% acessível. Essa alteração só deve ser feita para o ambiente de desenvolvimento.

sudo chmod -R 777 /var/www

Para testar a configuração do PHP, criaremos um arquivo info.php dentro de /var/www contendo o código abaixo:

<?php phpinfo(); ?>

Se todos os passos foram executados corretamente, ao se acessar http://localhost/info.php deverá ser exibida uma página com todas as configurações e extensões habilitadas do PHP.

Bem pessoal, espero que a dica tem sido útil. Até a próxima.

quarta-feira, 9 de janeiro de 2013

Instalando o MapServer no Ubuntu 12.10

Olá galera,

Nesse post vamos instalar o MapServer e configurar a projeção para trabalhar com o Google Maps.

Executar no terminal o código abaixo

sudo apt-get install cgi-mapserver mapserver-bin

Para checar a versão instalada, basta executar

/usr/lib/cgi-bin/mapserv -v

Vamos setar a projeção do Google executando

sudo gedit /usr/share/proj/epsg

No final do arquivo, adicionaremos o código abaixo:

# 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 <>

Bem pessoal, apesar de ser bem básico é bastante útil. Até a próxima.