Corrigindo problema do Jboss no Windows 7
Se você esta encarando o erro abaixo ao iniciar seu servidor Jboss no windows:
C:\jboss-5.1.0.GA\bin>run.bat 'findstr' is not recognized as an internal or external command, operable program or batch file.
Traduzindo, o comando de sistema operacional findstr não foi reconhecido/encontrado.
O Windows 7 fez o favor de “esconder” algumas funcionalidades básicas do sistema operacional, tais como: ping e ipconfig. Se você esta acostumado em apenas digitar esses comandos no prompt, no Windows 7 é necessário modificar a variável de ambiente %path%.
Vá até Painel de Controle > Sistema > Configurações Avançadas > Variáveis de Ambiente
Acrescente o caminho ;%SYSTEMROOT%\System32;
Agora abra uma nova instância do prompt de comando, e faça o teste com ping e ipconfig.
Isto é o suficiente para que o servidor Jboss volte a funcionar normalmente.
Namastê.
Maven2 com Oracle JDBC
Se você é um dos milhares que sofre com o erro abaixo, fique calmo, o seu problema está resolvido!
[INFO] Unable to find resource 'com.oracle:ojdbc14:jar:10.2.0.3.0' in repository central (http://repo1.maven.org/maven2) [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to resolve artifact. Missing: ---------- 1) com.oracle:ojdbc14:jar:10.2.0.3.0 Try downloading the file manually from the project website. Then, install it using the command: mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.3.0 -Dpackaging=jar -Dfile=/path/to/file Alternatively, if you host your own repository you can deploy the file there: mvn deploy:deploy-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.3.0 -Dpackaging=jar -Dfile=/path/to/file - Durl=[url] -DrepositoryId=[id] Path to dependency: 1) br.com.ninecon.core:isupport:war:0.0.1-SNAPSHOT 2) com.oracle:ojdbc14:jar:10.2.0.3.0
É possível configurar o repositório do Maven, utilizando a biblioteca localmente, ou seja, se você já tem o arquivo .jar em seu computador, pode corrigir o problema adicionando este arquivo ao repositório.
No meu caso foi simples, pois eu já tinha o banco de dados Oracle instalado localmente, mas caso você não tenha, faça o download library OJDBC.
Acesse o diretório onde esta o arquivo jar.
C:\Users\luciano>cd %ORACLE_HOME%/jdbc/lib
Execute o comando de instalação da library conforme abaixo passando os parametros necessários. No exemplo o banco utilizado é o 10.2.0.3.0.
c:\oracle\product\10.2.0\db_1\jdbc\lib>mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=oracle -Dversion=10.2.0.3.0 -Dpackaging=jar -DgeneratePom=true
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'install'.
[INFO] org.apache.maven.plugins: checking for updates from central
[INFO] org.codehaus.mojo: checking for updates from central
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [install:install-file] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [install:install-file {execution: default-cli}]
[INFO] Installing c:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar to C:\Users\luciano\.m2\repository\com\oracle\oracle\10.2.0.3
.0\oracle-10.2.0.3.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Wed Jun 09 20:32:02 BRT 2010
[INFO] Final Memory: 3M/15M
[INFO] ------------------------------------------------------------------------
'cmd' is not recognized as an internal or external command,
operable program or batch file.
c:\oracle\product\10.2.0\db_1\jdbc\lib>
Perceba que o artifactId esta como oracle, portanto o seu pom.xml deve ser modificado também.
Com este simples comando você resolverá um problemão chato! ;)
Autenticação e Autorização com a API do Twitter
O Twitter veio para ficar e isto eu não discuto e, este blog quando empolgado com o micro-blog público um exemplo simples de como utilizar o Twitter4j. Agora estou tentando mostrar uma forma mais avançada de comunicação com o Twitter, utilizando o modo de autenticação/autorização.
No exemplo anterior além de obter o Customer Key e Secret, você irá precisar do Usuário e Senha do Twitter, para assim obter a comunicação devida. Bem, nem todo mundo sente-se disposto a oferecer seus dados confidênciais para um software ou site qualquer. Portanto, este novo exemplo mostrará como você deve comunicar com o Twitter deixando a autenticação por parte do micro-blog e autorização por parte do próprio usuário.
Dando sequência ao assunto, inicialmente você precisará registrar uma aplicação no Twitter caso ainda não a tenha, guarde os dados Consumer Key e Secret. Existem dois tipos de aplicações a Client (Desktop) e Browser (Web), sendo que a segunda precisará de uma url que receberá o Token de autenticação.
Infelizmente, este post foi prejudicado pela falta de um web hosting que suporte Java, a Locaweb (atual host deste blog) cobra valores mensais absurdos, que inviabiliza blogs com intuito simplesmente acadêmico, como este, de realizar testes utilizando a linguagem Java.
Consegui descobrir lendo aqui, aqui e aqui que é possível configurar o seu localhost como Callback URL no Twitter, assim não será necessário ter um site publicado na internet para seus testes.
Web Autenticação
Durante o registro você irá informar o tipo de aplicação Browser e uma Callback URL, é para onde o navegador será redirecionado após a autorização do usuário. Já o campo Application Website, é a origem da sua aplicação web, ou seja, serão aceitas as chamadas feitas apenas a partir deste site.
O código abaixo irá fazer iniciar o processo de autenticação, o navegador vai ser redirecionado para a página de login do Twitter.
final String CALLBACK_URL = "http://127.0.0.1:8080/BlogTwitt4u/"; // a mesma configurada na aplicação
final String CUSTOMER_KEY = "6MWotGxvuNVGfK4lDqAqhg";
final String CUSTOMER_SEC = "oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUpqSY";
OAuthConsumer consumer = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);
OAuthProvider provider = new DefaultOAuthProvider( "https://twitter.com/oauth/request_token",
"https://twitter.com/oauth/access_token",
"https://twitter.com/oauth/authorize" );
//
// Solicita a autorização
//
String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
session.setAttribute("token", consumer.getToken());
session.setAttribute("tokenSecret", consumer.getTokenSecret());
//
//
// Redireciona para o Twitter solicitar o Usuário e Senha, e Autorização para a aplicação
// Em seguida será redirecionado para a callback url
response.sendRedirect(authUrl);
Após fazer o login e autorizar a sua aplicação, o navegador será redirecionado novamente para o seu site, com dois parâmetros preenchidos, como esta abaixo:
http://127.0.0.1:8080/BlogTwitt4u/?oauth_token=RQVPENBxDbQuI1bJ1rjELuVSyZhMYqr8Fcs5eqyZw&oauth_verifier=a8FuEeitfdCR2IfgisfsHopMAUevs4cDyRWkbZz4
Pronto, ai você já pode colher as informações que desejar, veja:
if( oauthVerifier!=null && !oauthVerifier.trim().equals("") ){
String token = (String) session.getAttribute("token");
String tokenSecret = (String) session.getAttribute("tokenSecret");
//
consumer.setTokenWithSecret(token, tokenSecret);
//
//
provider.setOAuth10a(true);
provider.retrieveAccessToken(consumer, oauthVerifier);
out.println("<h1>AUTORIZADO!</h1>");
out.println("<pre>");
out.println("token:\t\t" + consumer.getToken());
out.println("tokenSecret:\t\t" + consumer.getTokenSecret());
out.println("oauthVerifier:\t\t" + oauthVerifier);
out.println("oauthToken:\t\t" + oauthToken);
//
//
URL url = new URL("http://twitter.com/statuses/mentions.json");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
consumer.sign( urlConnection );
urlConnection.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()) );
String inputLine = "";
String content = "";
while ((inputLine = in.readLine()) != null){
content += inputLine;
}// while end
in.close();
int statusCode = urlConnection.getResponseCode();
out.println("statusCode: " + statusCode);
out.println("</pre>");
JSONArray json = JSONArray.fromObject( content );
out.println("<hr>");
out.println("<h3>Mentions</h3>");
out.println("<pre>");
for(int i=0; i<json.size(); i++){
JSONObject obj = (JSONObject) json.get(i);
if( obj!=null ){
// JSONString str = (JSONString) obj.get("text");
out.println(obj.getString("text"));
}
}// for end
out.println("</pre>");
}
Desktop Autenticação
Este é um exemplo comum, muito conhecido em qualquer pesquisa no Google, para utiliza-lo você deve ter uma aplicação do tipo Client.
O código pede para que o usuário abra o navegador, acesse uma determinada URL e depois informe o código númerico no programa, nada eficaz né? Muitos programadores utilizam uma maneira nada elegante que é a de “hackear” esta página e pegar o código automáticamente, facilitando a vida de todo mundo. Faça isto por sua conta e risco. Perceba que quando comparado ao código de autenticação Web a única mudança é a utilização do código PIN, que não necessário informar na web.
<pre>
<pre><pre>// Lembre-se de modificar estes valores para os seus
//
final String CUSTOMER_KEY = "6MWotGxvuNVGfK4lDq";
final String CUSTOMER_SEC = "oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUp";
try {
HttpURLConnection request = null;
URL url = null;
OAuthConsumer consumer = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);
OAuthProvider provider = new DefaultOAuthProvider( <a href="https://twitter.com/oauth/request_token">https://twitter.com/oauth/request_token</a>,
"https://twitter.com/oauth/access_token",
"https://twitter.com/oauth/authorize");
String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
//
// URL Que irá retornar o PIN, necessário para formar o Token
System.out.println(authUrl);
String pinCode = JOptionPane.showInputDialog("Acesse o endereço:\n" + authUrl + "\nE Informe o PIN:");
System.out.println("PIN Code: " + pinCode);
//
provider.retrieveAccessToken(consumer, pinCode);
String tokenKey = consumer.getToken();
String tokenSec = consumer.getTokenSecret();
System.out.println("Token Key : " + tokenKey);
System.out.println("Token Sec : " + tokenSec);
consumer.setTokenWithSecret(tokenKey, tokenSec);
url = new URL(<a href="http://twitter.com/statuses/mentions.xml">http://twitter.com/statuses/mentions.xml</a>);
request = (HttpURLConnection) url.openConnection();
// sign the request
consumer.sign(request);
// send the request
request.connect();
// response status should be 200 OK
int statusCode = request.getResponseCode();
System.out.println("Status Code : " + statusCode);
} catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Foram utilizadas as seguintes bibliotecas:
Apache Commons BeansUtil 1.8
Apache Commons Codec 1.4
Apache Http Client 3.1
Apache Commons Lang 2.4
ezmorph 1.0.6
json-lib 2.3
Faça download do projeto, que contêm ambos exemplos de autenticação.
Usando a API LastFm em Java
A LastFm é a queridinha das rádios online, mesmo com diversos concorrentes de alto nível como iLike, Pandora, Imeem, e outros tantos, aqui no Brasil a LastFm é um grande sucesso, seus milhões de usuários brasileiros ignoraram o bloqueio de alguns recursos e continuam fazendo scrobbling de seus áudios diáriamente.
Além de um database music, o LastFm é uma rede social e grande parte de suas informações são públicas e podem ser acessadas facilmente através de sua API.
Vamos dar inicio a um exemplo de como consumir os dados utilizando a library para Java lastfm-java. Antes de tudo, se você não tiver uma conta no LastFm, crie-a agora e depois obtenha a API Key. Neste mesmo link você encontrará a documentação da API, que detalha claramente a funcionalidade de cada método disponível e como é o seu acesso e se necessita ou não de autenticação.
Em nosso primeiro exemplo vamos fazer uma página web que irá listar as últimas faixas ouvidas e a lista de amigos de um usuário específico, com isto, você perceberá que nenhuma autenticação é necessária pois os dados são públicos.
Criei a classe LastFmClient, para facilitar os casts necessários e centralizar as chamadas da API.
public class LastFmClient {
// altere para a sua api key
private static final String APIKEY = "XyZaBc001";
private String uName = null;
/**
*
* @param uName
*/
public LastFmClient(String uName){
this.uName = uName;
}
/**
*
* @return User/Friends List
*/
public ArrayList<User> getFriends(){
return (ArrayList<User>) User.getFriends(uName, APIKEY);
}
/**
*
* @return Tracks List
*/
public ArrayList<Track> getTracks(){
return (ArrayList<Track>) User.getRecentTracks(uName, APIKEY);
}
}
Isto é o suficiente para você montar a lista como descrito acima, veja:
String userName = request.getParameter("username");
if( userName!=null && !userName.trim().equals("") ){
// instancia a classe de backend
LastFmClient client = new LastFmClient(userName);
// seu código aqui
}
Ouvidas recentemente.
<table border="0" cellpadding="2" cellspacing="1">
<% for(Track t : tracks){ %>
<tr>
<td valign="top" align="left">
<br/><strong><%=t.getAlbum() %></strong>
<br/><em><%=t.getArtist() %></em>
</td>
</tr>
<% }// for end tracks %>
</table>
Lista de amigos.
<table border="0" cellpadding="2" cellspacing="1">
<tr>
<%
ArrayList<User> friends = client.getFriends();
int count = 1;
for(User f : friends){
%>
<td valign="top" align="center">
<% if( f.getImageURL()!=null ){ %><img src="<%= f.getImageURL() %>"><% } %>
<br><strong><%=f.getName() %></strong>
<br><a href="<%= f.getUrl() %>"><%= f.getUrl() %></a>
<br/>
</td>
<%
if( count%5==0 ) out.print("</tr><tr>");
count++;
}// for end friends
}//
%>
Faça download do código completo.
Pronto, você conseguiu acessar dados do LastFm, usando o caminho correto e fácil, sem autenticação. Mas alguns dados são restritos e necessitam da autorização do usuário, informações básicas como a quantidade de músicas ouvidas, data de cadastro, nome, etc. são de acesso restrito.
crontab
Algumas coisas só recebem o devido valor quando você precisa realmente delas!
Não é a primeira vez que utilizei o cron, muito pelo contrário já fiz uso desta ferramenta diversas vezes, mas na maioria delas alguma pessoa me auxiliou para montar o agendamento, porém, hoje foi diferente, então aproveitei para estudá-la um pouco mais.
Os parâmetros são separados por espaço nesta sequência mm hh dd MM ss <script>
mm = minuto (0-59)
hh = hora (0-23)
dd = dia (1-31)
MM = mes (1-12)
ss = dia da semana (0-6)
script = comando a ser executado.
A linha de comando abaixo para o cron, agenda uma chamada de programa para ocorrer a cada dez minutos, de segunda a sexta, das 06h00 as 23h00, durante todo o ano.
0-59/10 06-23 * 1-12 1-5 /u01/BugzillaOracleInterfaceNinecon/run.sh
Perceba que na linha de comando utilizada como exemplo, fiz uma divisão 0-59/10 isto significa a cada minuto múltiplo de 10 (ex: 09:10, 09:20, 09:30, etc.) o comando será executado. Se ao crontrário tivesse sido especificado apenas o número 10, o cron iria executar no décimo minuto do horário (ex: 13:10, 14:10, 15:10, etc.).
A vírgula corresponde a um “E”, então 10,20, programa a execução para as 10h00 e 12h00 apenas, já o hífen a um “Intervalo”, logo 06-23, diz que será executado entre 06h00 as 23h00.
Por fim o (*) asterisco corresponde a “Todos”, e pode ser colocado em qualquer um dos parâmetros.
Você encontrará mais sobre o assunto com uma simples pesquisa no Google, veja aqui e aqui também.
