terça-feira, 27 de agosto de 2013

Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library

Pessoal.. hoje tive o erro:

[8/27/13 15:17:23:188 BRT] 00000043 CustomExcepti E   Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
                                 javax.faces.FacesException: Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
    at org.primefaces.renderkit.HeadRenderer.encodeTheme(HeadRenderer.java:130)
    at org.primefaces.renderkit.HeadRenderer.encodeBegin(HeadRenderer.java:92)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:579)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:519)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:533)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1581)
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:264)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1224)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:928)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1025)
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:895)
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)

[8/27/13 15:17:23:188 BRT] 00000043 SystemOut     O
 DEBUG ERROR
[8/27/13 15:17:23:188 BRT] 00000043 SystemOut     O


O erro foi pois eu tinha isso no meu web.xml:

    <context-param>
        <param-name>primefaces.THEME</param-name>
        <param-value>bootstrap</param-value>
    </context-param>

porém eu não tinha a dependência no meu pom.xml para o primefaces-bootstrap.. por isso acontecia o erro..

Abraços!
Adriano Schmidt

sexta-feira, 2 de agosto de 2013

Buscar cidade pelo IP

Oi pessoal : )

Hoje tive que, pelo IP, descobrir a cidade do usuário.

Estou fazendo este post para repassar minhas descobertas : )

Antes de mais nada, caso você queira saber o seu IP é só acessar: http://www.whatismyip.com/

FreeGeoIP


Resumindo (e correndo o risco de que você não termine de ler este post) o jeito mais simples é esse:

http://freegeoip.net/json/170.130.90.30

Esse serviço Rest é free e retorna em JSON a cidade e outras informações pelo IP. Você pode acessá-lo diretamente pelo browser ou via programação fazendo uma chamada Rest.

Essa busca é feita com base em um banco de dados gigante que é atualizado diariamente. Ele não é 100% preciso mas ajuda bastante!

Existe a possibilidade de que o retorno seja XML, CSV.

Mais detalhes e limitações em: http://freegeoip.net/

O freegeoip utiliza um banco de dados free da MaxMind

MaxMind


Você pode utilizar diretamente o serviço rest da MaxMinds, ela tem 2 modelos de serviço:

Free: Tem um número limitado de consultas e você tem que botar um link para o site da MaxMind no seu site
Pago: Mais precisão e garantia que o serviço estará no ar.. são 20 dólares para 50.000 consultas, tem outros planos também.

Mais detalhes e limitações em: http://www.maxmind.com/pt/geolocation_landing

API de GeoLocation do HTML5


Outra possibilidade é usar a API de GeoLocation do HTML5:

http://www.w3schools.com/html/html5_geolocation.asp

Aí você consegue pegar latitude e longitude aproximada da pessoa, e com isso pode buscar a cidade.

Existe uma diferença, talvez desvantagem, em fazer dessa forma é que o usuário terá que autorizar o sistema a utilizar sua localização. Aparecerá uma janela com a mensagem "Deseja compartilhar sua localização com este site?"

Enfim, a busca pela cidade por lat e lng pode ser feita de duas formas:

Serviço Google:
Procure por Geocodificação reversa (busca de endereços) em: https://developers.google.com/maps/documentation/geocoding/?hl=pt-br

Observação: a Google Geocoding API só pode ser usada junto com um mapa do Google; é proibido usar os resultados da geocodificação sem exibi-los em um mapa

Banco de dados próprio
É possível buscar em um banco de dados ou arquivo de cidades com suas respectivas latitudes e longitudes.. aí é só você fazer um algoritmo simples de aproximação.

Esse site tem uma lista das maiores cidades do Brasil com lat e lng: http://www.mapsofworld.com/lat_long/brazil-lat-long.html

Você também pode pegar essa lista direto do IBGE, procure no google por Cidades_do_Brasil_2008.rar que você via achar.


Abraaço!!!
Adriano Schmidt

PS: Agradeço ao Rafael dos Santos que fez esta pesquisa comigo!