Outro dia me deparei com a necessidade de mudar o nome do Host Name de um Node Agent do WebSphere isso pode ocorrer por vários motivos, como por exemplo: para corrigir a propagação do plugin do IBM HTTP Server ou simplesmente porque a máquina irá mesmo ser migrada para um outro nome ou ainda para migrar um profile de máquina, dentre outras possibilidades.
Para visualizar, navegue no Admin console do WebSphere(Domain Manager - DMGR):
System Administration > Nodes
Você deve então visualizar o Host Name do Node desejado conforme ilustrado na imagem abaixo:
Neste caso vou mudar o Host Name do NodeAgent para ao invés de ser localhost passar a ser mmaia.ibm
Para fazer isso o primeiro passo é baixar todos os processos de WebSphere rodando neste ambiente e então fazer um backup do profile que será atualizado para caso seja necessário restaurar posteriormente. Veja este link para fazê-lo.
Feito o backup vamos agora executar o utilitário do WebSphere wsadmin, isso deve ser feito no diretório bin do profile do Domain Manager(Dmgr) ou não funcionará corretamente. Execute o comando:
./wsadmin.sh -conntype NONE -lang jython
Isso irá colocar o shell no modo jython, conforme mostrado na imagem abaixo, se for primeira execução do wasadmin no seu ambiente você deverá ver o processamento de várias libs antes de entrar no modo de execução do wasadmin:
Execute agora a função jython AdminTask.changeHostName no modo iterativo, o que irá fazer com que os parâmetros da função sejam solicitados no console wsadmin, e salve as configurações, conforme ilustrado abaixo:
AdminTask.changeHostName('[-interactive]')
Preencha com os novos valores e coloque F no final para salvar a alteração, depois salve a alteração executando a função AdminConfig.save().
Pronto, saia do modo wasadmin digitando exit e reinicie seu profile(node e servers).
O novo valor deve aparecer no NodeAgent agora:
Constantemente é necessário fazer alguma alteração em um ambiente WebSphere e para ambientes críticos onde não pode haver erros ou indisponibilidade do ambiente é importante que seja feito um backup do Profile para que, emergencialmente, caso seja necessário façamos o rollback das alterações para um estado estabilizado.
Para fazer este backup utilizando a ferramenta que acompanha o WebSphere basta executar o script backupConfig.sh de um profile e passar o arquivo de destino que você quer salvar, por exemplo:
Executando o comando acima o utilitário de backup irá parar todos os processos relacionados ao profile e irá fazer o backup, resultando em um arquivo chamado AppSrv_1_mutual_authentication_profile_bkp.zip neste mesmo diretório. Este Profile poderá posteriormente ser restaurados utilizando o script manageprofiles.sh:
É bastante comum eu me deparar com um cenário onde preciso liberar porta de entrada para acessar algum servidor em um ambiente linux. Então segue a dica para liberar as portas desejadas no IPTables.
Para liberar portas usando o iptables edite o arquivo:
/etc/sysconfig/iptables
Se você quer liberar a porta 8080 no protocolo tcp, adicione a seguinte linha:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
Feito isso basta reiniciar o iptables(se estiver logado como root não precisa do comando sudo):
Já me deparei mais de uma vez com a necessidade de descobrir o PID de um processo que está ocupando uma porta do S.O mas não consigo liberar a porta por não ter o id do processo podendo assim forçar que ele pare de executar.
Então segue a dica de como fazê-lo:
Linux:
netstat -tulpn
Você deverá ver uma saída como a imagem abaixo, perceba que o PID aparece na última coluna(PID/Program name) e a porta na quarta coluna (Local Address):
Se você quiser ver somente uma porta específica utilize o grep:
netstat -tulpn |grep ${NUMERO_DA_PORTA}
A saída será conforme a imagem abaixo:
Uma outra opção no Linux e outros unix like O.S é usar o lsof:
lsof |grep ${NUMERO_DA_PORTA}
Solaris:
No solaris siga a dica e execute os scripts que o Fabio Morais postou
neste link.
Apesar de raramente ser necessário ou mesmo recomendado, já passei por situações onde a persistência de sessão(HttpSession) do usuário tivesse como requisito de arquitetura a necessidade de ser persistida em base de dados quando normalmente o recomendado é fazer em memória por motivos de performance. Quando for necessário fazer isso com utilização de weblogic é bem simples.
Primeiro precisamos da base de dados, neste exemplo vou usar o postgresql, que é free e fácil de usar e instalar. Fiz, a algum tempo, um quickstart em um outro post que sempre me é útil.
Bem, uma vez instalado o postgres basta criar uma base de dados, que nesse exmplo tem as configurações:
-Nome da Base: wl_session
-Usuário: weblogic
-Senha: weblogic
Feito isso deve-se criar a base de dados para persistência de sessão conforme script disponibilizado, perceba que existem scripts específicos para diversos banco de dados como Oracle, DB2, etc.
Bem, neste caso utilizo o script que adaptei para o Postgres:
Após a criação da tabela na base baixar o driver e criar um pool de conexões no weblogic apontando para esta base. Neste exemplo utilizei os atributos de pool:
- Nome do Pool: PostgresDS
- jndi name do pool: jdbc/Postgres
Com o pool feito, é só configurar no weblogic.xml da sua aplicação web para utilizar o pool configurado, conforme no exemplo abaixo:
10.3.2sessaodbJDBCPostgresDSjdbc/Postgres
Pronto, agora ao acessar uma página da aplicação uma nova sessão será criada na base de dados e o weblogic irá persistir as sessões de usuário nesta tabela, enquanto as mesmas estiverem ativas, conforme a imagem abaixo ilustra.
Lembre-se que esta não é uma opção que melhor se adeque se sua aplicação precisar de foco em performance e escalabilidade e normalmente deve ser utilizada somente se for uma necessidade específica do projeto.
[]s
Connecting to Node Manager ...
This Exception occurred at Wed Jan 27 11:31:34 BRST 2010.
weblogic.nodemanager.NMException: Access to domain 'testescripts' for user 'weblogic' denied
at weblogic.nodemanager.client.NMServerClient.checkResponse(NMServerClient.java:298)
at weblogic.nodemanager.client.NMServerClient.checkResponse(NMServerClient.java:311)
at weblogic.nodemanager.client.NMServerClient.connect(NMServerClient.java:253)
at weblogic.nodemanager.client.NMServerClient.checkConnected(NMServerClient.java:196)
at weblogic.nodemanager.client.NMServerClient.checkConnected(NMServerClient.java:202)
......
WLSTException: Error occured while performing nmConnect : Cannot connect to Node Manager.Access to domain 'testescripts' for user 'weblogic' denied Use dumpStack() to view the full stacktrace
Este problema ocorre porque a senha definida pelo nodemanager no domínio está diferente da senha de administração do domínio. A solução para o problema é alterar a senha do nodemanager no Console de Administração do Weblogic e colocá-la igual a senha utilizada para gerenciar o domínio.
Para fazer isso no console de administração do weblogic altere a senha do nodemanger navegando em:
Na árvore de navegação (Domain Structure) clique no nome do domínio > Security > Advanced
Procure por "NodeManager Username", "NodeManager Password" e "Confirm NodeManager Password" e altere a senha para ser igual à senha de administração do domínio. Salve e ative as configurações. Reinicie o nodemanager.
Pronto o script deve funcionar corretamente. Se o problema persistir, verifique no nodemanager.domains se o domínio onde está o servidor que deve ser controlado está registrado corretamente.
Estou começando alguns estudos sobre JBoss Seam. Já a alguns anos utilizo struts2 e previamente webwork, que é muito parecido com struts2 e no qual ele foi inspirado e utilizado como base. Ultimamente tenho visto muitos desenvolvedores que considero de alta qualificação falarem muito bem do JBoss Seam e por isso resolvi fazer alguns estudos e o primeiro desafio nestes casos é reunir tudo o que precisamos para configurar o ambiente de desenvolvimento para poder fazer alguns testes e aprofundar nos estudos. Neste post eu coloco os links de downloads que efetuei para deixar o ambiente pronto para trabalhar com o Seam.
Os softwares que utilizo para esta configuração são:
*Eclipse Galileo.
*JBoss 5.1.
*JBossTools para eclipse galileo. Utilizei o site configurado no eclipse galileo. A configuração que funcionou melhor no meu caso foi a Development. O update site é: http://download.jboss.org/jbosstools/updates/development/
*Seam 2.0.2.SP1 - Estou usando o 2.0 pois a maioria da documentação, atualmente, cobre essa versão.
*Mysql 5.1. - Baixei com o gerenciador de pacotes do Ubuntu.Foi necessário baixar também o driver JDBC do Mysql para configurar no JBoss Tools no eclipse.
Depois de baixar todos os softwares basta abrir o eclipse e criar um novo projeto do Seam. Alguns wizards irão aparecer para configurar os ambientes do JBoss App Server,JBoss Seam e Base de dados o driver do banco utilizado será necessário e a criação de uma base de dados com usuário e senha para utilizar durante os estudos. Com isso em mãos não tem segredo e depois é só começar a conhecer as ferramentas do JBoss Tools para começar os estudos.
Minha primeira impressão com o Seam foi bastante encorajadora. O ambiente do JBoss Tools parece bem amigável e fornece alguns wizards interessantes que facilitam e agilizam o desenvolvimento.
[]s
Neste artigo estou reunindo informações úteis para um quickstart de Postgres com Linux, se vc estiver usando uma versão que use o yum ao invés do apt-get basta substituir o comando. As versões utilizadas nestes comandos são Postgres 8.4 e Ubuntu 9.10.
Os comandos devem ser dados utilizando um terminal do ubuntu.
Instalação da base de dados Postgres:
sudo apt-get install postgresql
Instalação da ferramenta de administração pgAdmin III:
sudo apt-get install pgadmin3
Iniciar o postgresql
sudo service postgresql start
Para cadastrar uma senha default do usuário postgres ou resetar a senha deste usuário que é o superusuário da base de dados utilizar:
sudo su postgres
Com o usuário do postgres no terminal execute o psql para conectar na base de dados de senhas do postgres e modificá-la:
psql -d template1
O terminal irá mostrar o console postgres:
#template1
Dê um alter table no terminal modificando a senha:
ALTER USER postgres WITH PASSWORD '${SUA_NOVA_SENHA}';
Para sair do console do postgres utilize \q no terminal conectado.
Caso seja necessário alterar permissão de acesso para a base criada deve-se editar o arquivo de configuração do postgres que por default fica no caminho: /etc/postgresql/8.4/main/pg_hba.conf no ubuntu e no red hat usualmente no /var/lib/pgsql
O weblogic server possibilita a administração de um domínio mesmo quando o servidor de administração estiver fora do ar através do Node Manager que já deve ter sido devidamente configurado para gerenciar o domínio que será administrado.
O Node Manager é um serviço do weblogic server que possibilita a adminsitração de vários servidores configurados em vários hardwares diferentes através de um único console de administração ou de scripts WLST.
Neste post vou mostrar um script que pode ser utilizado para conectar no nodemanager de uma máquina e enviar comandos para inicializar servidores previamente configurados em um determinado domínio administrado por este nodemanager. O script assim como o arquivo de propriedades está comentado e seu código segue abaixo com comentários em seguida:
from java.util import Properties
from java.io import FileInputStream
from java.io import File
#import thread
from string import split
#============DEFINICAO DE FUNCOES============
#funcao que carrega dados de arquivo de propriedades
def carregaArquivoPropriedades(nomeArquivo) :
print 'carregando propriedades do arquivo: ' + nomeArquivo
#arquivo de propriedades a ser carregado
myProps = Properties()
#carrega arquivo de propriedades
myProps.load(FileInputStream(File(nomeArquivo)))
return myProps
#função que recupera servidores especificados no arquivo de propriedades.
def listaServidores(arquivoPropriedades):
print 'selecionando servidores da lista de propriedades'
servidores = []
propriedades = arquivoPropriedades.propertyNames()
while propriedades.hasMoreElements():
#carrega os nomes de todas as chaves carregadas do arquivo de propriedades
chave = propriedades.nextElement()
#recupera tipo da chave para verificar se é um servidor se for adiciona no array de servidores.
elemento = split(chave, '_')
#checa se elemento carregado do arquivo de properties é um servidor e adiciona na lista de servidores
if elemento[0] == 'SERVIDOR':
servidores.append(chave)
#while que imprime lista de servidores recuperada
print '=======================AVISO================================================================'
print'LISTA DOS SERVIDORES A SEREM INICIALIZADOS'
for servidor in servidores:
print 'Servidor ==>> ' + arquivoPropriedades.get(servidor)
print '=======================AVISO================================================================'
return servidores
def inicializaInstancias():
usuario = arquivoPropriedades.get('USUARIO_ADM')
senha = arquivoPropriedades.get('USUARIO_ADM_SENHA')
ipNodeManager = arquivoPropriedades.get('NODEMANAGER_IP')
portaNodeManager = arquivoPropriedades.get('NODEMANAGER_PORT')
nomeDominio = arquivoPropriedades.get('DOMINIO_NOME')
diretorioDominio = arquivoPropriedades.get('DOMINIO_DIRETORIO')
print '\n================================================================================================'
print 'tentando conexao com o nodemanager...'
print 'usuario: ' + usuario
print 'ip Node Manager: ' + ipNodeManager
print 'porta Node Manager: ' + portaNodeManager
print 'Nome do dominio: ' + nomeDominio
print 'Diretorio do dominio no servidor: ' + diretorioDominio
print '================================================================================================'
nmConnect(usuario,senha, ipNodeManager, portaNodeManager, nomeDominio, diretorioDominio, 'plain', 'true')
for servidor in servidores:
print 'solicitando inicializacao do servidor ' + arquivoPropriedades.get(servidor)
nmStart(arquivoPropriedades.get(servidor), diretorioDominio)
#==========execucao (Main)========
arquivoPropriedades = carregaArquivoPropriedades('servidores.properties')
servidores = listaServidores(arquivoPropriedades)
inicializaInstancias()
O script carrega a lista de servidores de um arquivo de propriedades e inicializa cada um dos servidores declarados no arquivo. Abaixo um arquivo de propriedades de exmplo que pode ser utilizado com este script.
#colocar o IP e porta do nodemanger onde os servidores estão configurados. Caso houver
#necessidade de inicializar ou parar serviores em mais de um hardware o script deverá ser
#executado 1 vez para cada configuração de nodemanager e após feitos os devidos ajustes de ip e
#porta onde o nodemanager se encontra em execução.
NODEMANAGER_IP=localhost
NODEMANAGER_PORT=5559
#colocar o nome do diretório do domínio que será gerenciado pelo script.
DOMINIO_NOME=testescripts
#colocar o caminho completo do domínio que será gerenciado pelo script.
DOMINIO_DIRETORIO=/home/mmaia/weblogic10/domains/testescripts
#usuário e senha de administração deste domínio. Devem ser iguais aos do nodemanager configurados
#para gerenciamento deste domínio e armazenados no arquivo nm_password.properties do domínio.
USUARIO_ADM=weblogic
USUARIO_ADM_SENHA=weblogic
#lista de nomes das instancias a serem inicializadas ou paradas, deve seguir o padrao SERVIDOR_X=
#pode-se registrar quantas instânciasforem necessárias. As instâncias listadas devem estar
#configuradas no ambiente onde o nodemanager configurado está.
SERVIDOR_1=teste-1
SERVIDOR_2=teste-2
SERVIDOR_ADMIN=AdminServer
Escrevi este post com o intuito de acelerar a criação de projetos do Appfuse que fossem funcionais no ambiente eclipse. O Appfuse é um excelente projeto que ajuda na integração de vários projetos opent source e com isso acelera o início do ciclo de desenvolvimento. Para criar um projeto com Appfuse é utilizado o maven e portanto para executar o script deste post o maven deve estar configurado no seu ambiente e deve ter um JDK 1.5 ou superior configurado.
Após alguma experiência com o Appfuse cheguei a um padrão na criação de projetos e portanto para acelerar o procedimento consolidei em um script.
O script cria um projeto de testes e para mudar o pacote e nome do projeto criado basta alguma edição no script. O script está bem documentado e é auto-explicativo. É um script que foi testado no ambiente linux com java 6 e para reutilizá-lo basta uma rápida adaptação para utilizar o JDK de sua preferência, o JDK deve ser 1.5 ou superior. Segue o script.
PATH=/home/mmaia/tools/jdk1.6.0_13/bin:${PATH}
export PATH
echo ${PATH}
#cria o projeto, o maven deve estar configurado no ambiente para funcionar.
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=br.com.maweb -DartifactId=TestesJOFC2
#entra no diretório do projeto criado
cd TestesJOFC2
#baixa o código do core do appfuse para possibilitar evolução no seu projeto posteriormente.
mvn appfuse:full-source
#baixa todas as dependências para o repositório do maven executa todos os testes unitários do projeto.
mvn
#baixa parte web do projeto
mvn war:inplace
#remove no linux libraries para rodar aplicativo com container jetty de forma expandida o que facilita durante o desenvolvimento por refletir mais diretamente as alterações.
rm -r src/main/webapp/WEB-INF/lib/
rm -r src/main/webapp/WEB-INF/classes/struts.xml
#configura projeto para ser importado pelo eclipse.
mvn eclipse:eclipse
Após a execução do script o projeto criado pode ser importado como um projeto do eclipse normalmente. Abra o pom.xml do projeto criado e configure a os dados de usuário e senha da base de dados que irá ser utilizada no projeto sendo a default a mysql com usuário root e sem senha, se tiver dificuldades veja este post. Após configurar a base de dados então em um comando de linha para testar basta inicializar o jetty utilizado no desenvolvimento com o seguinte comando:
mvn jetty:run
Para ver o projeto acesse com o browser http://localhost:8080 e utilize usuário/senha = user/user.
Bem se o script não foi alterado teremos um projeto chamado TestesJOFC2 que é um projeto de testes para uma librie de geração de gráficos chamada Open Flash Chart que descrevo em outro post.
Durante o desenvolvimento de um projeto pessoal sempre tive um sentimento de que os gráficos que estava utilizando que são gerados utilizando a Google chart api que é excelente mas por se basear em imagem não fornece o nível de gráficos que eu desejo para o meu projeto. Após alguma pesquisa encontrei a API Open Flash Chart 2 que pelas minhas pesquisas apresenta funcionalidades muito mais próxima das que eu desejo para o projeto. Este post tem por objetivo mostrar a configuração necessária e também minhas primeiras impressões na utilização da API Open Flash Chart 2 em meu projeto.
O projeto que estou desenvolvendo e onde irei testar a integração desta API utiliza a estrutura fornecida pelo Appfuse com Struts 2.
Na própria página do projeto existe uma referência a uma librarie java que pode ser utilizada para integrar o Open Flash Chart em um projeto J2EE, que é o meu caso, decidi então utilizar a librarie chamada jofc2 no projeto por considerar que é a que está mais evoluída. Neste primeiro post sobre o assunto vou demonstrar a configuração básica do OFC com um projeto do AAFuse utilizando HTML simples e um arquivo JSON seguindo o exemplo 1 dos tutoriais do JOFC2.
Como esta API é em flash seu funcionamento se baseia em baixar um arquivo flash já pronto e depois configurá-lo utilizando Json. A API jofc2 que irei utilizar permite que fiquemos abstraídos do JSon utilizando somente java para configurar os gráficos.
Para iniciar os testes o primeiro passo é criar um projeto funcional do appfuse. Após o projeto ser criado vamos executar um primeiro exemplo simples de gráfico OFC utilizando html puro e json.
Para isso copie para a raiz web do seu projeto do appfuse criado o arquivo do pacote OFC chamado open-flash-chart.swf e crie os arquivos chart.htm e data.json na estrutura do projeto e copie o arquivo open-flash-chart.swf colocando-os sob o diretório src/main/webapp conforme mostrado na imagem abaixo:
Segue código a ser inserido no arquivo chart.htm(as tags de abertura e fechamento de html e body do código foram omitidas para compatibilidade de postagem com o blogspot e devem ser corrigidas antes de rodar o exemplo) :
Após ter configurado estes 3 arquivos para ver o seu primeiro gráfico OFC funcionando execute o projeto do Appfuse gerado com o comando mvn jetty:run e acesse a url: http://localhost:8080/chart.htm?ofc=data.json
Se tudo tiver sido feito corretamente um gráfico como o mostrado na imagem abaixo deverá ser renderizado. Em um próximo post irei detalhar como utilizar a biblioteca JOFC para renderizar os gráficos utilizando struts2 e jsp.
O cluster de servidores de aplicação nos dá um certo conforto em relação à disponibilidade de nossas aplicações corporativas hoje em dia. O ambiente de tolerância a falhas e redundância proporcionado pelos clusters possibilita, dentre outras coisas: manutenção de ambiente de produção em tempo real, agregar poder de processamento a uma aplicação crítica, certa estabilidade em caso de falhas de aplicação, dentre várias outras funcionalidades extremamente importantes nos ambientes corporativos e competitivos da internet de hoje em dia.
Uma das exceções neste ambiente é quando a arquitetura de uma aplicação foi construída utilizando como base um Singleton que neste caso não pode ser distribuído para todo o cluster pois traria inconsistência no funcionamento da aplicação.
No weblogic server utilizando o serviço de migração automática de um cluster conseguimos ter uma boa opção para este tipo de serviço implementando o que é chamado de Serviço de Singleton(Singleton Services). Esta implementação nos garante a migração automática do serviço disponibilizado para um outro nó(servidor) do cluster em caso de falhas no servidor onde o Sigleton está sendo executado.
Como funciona?
No weblogic existe um componente chamado "Singleton Master" que é um componente que monitora os serviços que podem ser migrados automaticamente em caso de falha do nó do cluster onde um Singleton esteja atendendo requisições dos clientes e então ele controla o serviço de singloton para inicializar em um outro nó disponível do cluster. Por padrão o Singleton Master considera todos os servidores disponíveis em um cluster como candidatos para migração de um Singleton Service que venha a falhar, entretando uma lista pode ser especificada se for o caso. Se o Singleton Master tentar ativar o serviço que falhou em todos os nós da lista ou do cluster e falhar, o serviço ficará desativado.
Como é a implementação de um Singleton Service no Weblogic?
Para implementar a classe do Singleton deve implementar uma interface do Weblogic chamada weblogic.cluster.singleton.SingletonService e prover a implementação de 2 métodos para alocar e desalocar os recursos necessários ao Singleton respectivamente: activate() e deactivate() .
Feito isso basta escolher uma forma de registrar seu Singleton service com o Singleton Master do cluster que pode ser feito via Admin Console ou configurando no weblogic-application.xml o Singleton service(tem que ser um componente .ear).
Para configurar via Admin console, selecione o cluster e depois clique em Singleton Services, lá pode-se registrar a classe do Singleton Services diretamente. Para que isso funcione esta classe deverá ter sido disponibilizada no classpath dos servidores candidatos a rodarem o serviço.
Bem, é isso, o gerenciamento da disponibilização do serviço é feita então automaticamente pelo cluster do Oracle Weblogic Server que estiver sendo utilizado.
Motivado por um post no javaranch fiz este script simples que checa status e saúde de uma aplicação em um servidor weblogic.
O script é bem simples e por isso estou omitindo maiores explicações. Segue o script.
#variable definitions================
username='weblogic'
password='weblogic'
urladmin='t3://localhost:7001'
appName='applicationName'
serverName='serverName'
#end variable definitions============
#connects to admin server
connect(username, password, urladmin)
cd('domainRuntime:/AppRuntimeStateRuntime/AppRuntimeStateRuntime')
#get intended state for application
intendedState = cmo.getIntendedState(appName)
print 'Intended state for app ' + intendedState
#get current real state for app in specific server
currentState = cmo.getCurrentState(appName, serverName)
print 'Current state in server '+ serverName + ' ==>> ' + currentState
cd('domainRuntime:/ServerRuntimes/'+ serverName +'/ApplicationRuntimes/'+appName)
#shows app attributes including current health.
print 'Current information for app ' + appName + ' in server ' + serverName + ' ==>> ' + ls('a')
Neste post irei mostrar o passo a passo para fazer a integração do kit de desenvolvimento nokia para plataforma S60 com Eclipse Ganymede.
Atualmente utilizo para desenvolvimento JME a seguinte configuração:
Com esta configuração e após deixar no meu projeto somente as APIs compatíveis para a plataforma S60 do meu celular(MIDP 2.0 e CLDC1.1) eu fui capaz de baixar e rodar minha aplicação no device, mas ainda com alguns erros e portanto o emulador da nokia se tornou essencial para que eu possa evoluir meu projeto.
Para instalar o kit é necessário também ter instalado o kit de desenvolvimento da nokia chamado Carbide.J que pode ser baixado aqui
1) Instalar o Carbide.j 1.5
Este passo é bem simples para isso após baixar o arquivo .zip do Carbide.j descompacte em uma pasta e execute o setup.exe o processo de instalação é simples, basta seguir as instruções selecionando a versão para Eclipse no momento apropriado e apontando para o diretório de instalação do seu eclipse quando solicitado.
2) Configurar o debugger do eclipse
Neste passo no menu do eclipse vá em Windows > Preferences > Java > Debug . Nesta tela desmarque todas as opções de suspend debug e aumente o tempo de "Debug Timeout" para 50000 ms conforme orientação da nokia. Isto é necessário para que o timeout default configurado não impeça a execução do emulador.(ver imagem)
3) Adicionar o emulador do S60 ao eclipse.
Este passo foi o mais problemático no eclipse estranhamente tive que instalar novamente o Carbide.j para que o menu do eclipse apresentasse a opção correta(não reiniciei na segunda instalação). Para executar esse passo no menu do eclipse primeiro selecione um projeto JME na perspectiva java e depois ir em Tools > Carbide.j > Configure Emulators . Clique em add e selecione o diretorio de instalação do Kit de desenvolvimento para S60 e depois que ele aparecer na lista de Emuladores selecione a entrada dele e clique no botão Set as Default. Pronto o emulador está pronto para ser utilizado.
Para utilizá-lo selecione Tools > Carbide.j > Start Emulators
Na tela que irá abrir em Application aponte para um .jad de exemplo que vem com o SDK da plataforma S60 em %S60_HOME%\devices\S60_3rd_MIDP_SDK_FP1\S60examples\helloworldplus\bin e clique em Emulate. A aplicação deve aparecer após algum tempo. Tenha paciência pois isso pode levar alguns minutos dependendo da configuração da sua máquina.
No final consegui rodar minha aplicação no emulador mas fiquei um pouco decepcionado com a lentidão desse ambiente.
[]s
Para iniciar os testes com Java ME de minha aplicação estou utilizando um celular Nokia n96 que utiliza a plataforma para smartfones S60
Inicialmente tentei fazer upload direto da minha aplicação JME para meu servidor transferindo o .jar e o .jad e acessando pelo celular. A aplicação foi encontrada e eu confirmei a instalação mas ao terminar o aparelho informou que a aplicação não estava com a especificação correta para o device e por isso eu pesquisei até encontrar a plataforma de desenvolvimento fornecida pela nokia e irei começar a estudá-la.
Neste post irei descrever um guia rápido para instalação da plataforma de desenvolvimento provida pela Nokia para S60 em sistema operacional Windows XP.
Aí vai uma dica rapida. Para mostrar a data de hoje formatada no jsp uma maneira simples, rápida e que não exige importação é utilizar o velho scriplet:
Data de Hoje: < %= new java.text.SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date())%>
Quando quiser mostrar uma data que está armazenada em um objeto armazenado no request ou em algum objeto de action do struts ou jsf pode-se utilizar jstl para formatar a variável. No exemplo abaixo existe um objeto user armazenado no request que tem um atributo dataCadastroSistema e quero mostrar esta data. O que faço é armazenar a variável utilizando c:set em uma variável chamada dataCadastro e depois faço a formatação, facilitando o entendimento. Você poderia recuperar a data do request direto na tag de formatação fmt se desejar.
Esta é uma questão frequente nos fórums de weblogic e por isso estou postando aqui.
É comum que uma aplicação web precise acessar conteúdo estático existente em algum diretório compartilhado em servidor, disco de storage externo ou até mesmo em um diretório no Sistema operacional em ambientes não clusterizados.
No weblogic tem uma maneira bem simples de resolver este problema para isso utiliza-se uma tag no arquivo weblogic.xml que irá apontar para um diretório especificado e criará um url-pattern de acesso ao conteúdo desejado.
Para ilustrar o exemplo, suponhamos que seja desejado compartilhar o conteúdo estático que está disponível no caminho: /var/docs/weblogic/estatico no servidor onde o weblogic está instalado. Imagine que exista um arquivo chamado meuPdf.pdf que está diretamente neste diretório, para acessar este arquivo queremos que uma url direta aponte para o pdf em questão. Para isso deve-se configurar a tag virtual-directory-mapping, local-path e url-pattern no weblogic.xml:
/var/docs/weblogic/estatico/*
Isso irá permitir que uma url como: http://seudominio.com/estatico/meuPdf.pdf encontre corretamente o arquivo desejado. Se houver pastas no diretório basta apendar a pasta depois do url-pattern definido para acessar corretamente o conteúdo.
Esta dica possibilita também que conteúdo estático seja disponibilizado e acessado corretamente fora do pacote dinâmico no weblogic, tornando o pacote dinâmico bem menor facilitando as atualizações.
Fiquei algum tempo sem postar código fonte no blog pois como um blogueiro recente ainda não tinha conhecimento de como fazer para formatar o código fonte de uma maneira aceitável nos posts.
Bem, como este é um blog técnico ficou impossível continuar dessa forma e portanto hoje resolvi pesquisar uma forma de fazer formatação de códigos fonte para postagens no blog. Pesquisando um pouco decidi primeiramente experimentar mais um produdo hospedado no Google code chamado SyntaxHighlighter http://code.google.com/p/syntaxhighlighter/ . A última versão(quei irei tratar neste artigo) migrou para http://alexgorbatchev.com/wiki/SyntaxHighlighter
Minha maior curiosidade é ver como uma linguagem como Jython, que uso muito no weblogic e tenho alguns posts aqui, vai ficar formatada imagino que java deve ficar bem bacana por ser mais comum.
Segue um passo-a-passo do que fiz para fazê-lo funcionar e alguns links de postagens deste blog já formatadas com este utilitário.
O pacote contém um conjunto de javascript + css para formatação dos códigos.
Este conjunto deve ser disponibilizado na web para que possa ser acessado e essa foi minha primeira dificuldade, já estava pensando em fazer o upload para o ambiente que tenho contratado na locaweb(que por sinal é um excelente Hosting, não conheço melhor no Brasil) quando pesquisando a documentação do produto encontrei este link: http://alexgorbatchev.com/wiki/SyntaxHighlighter:Hosting
O criador do produto disponibiliza um repositório na web para acesso ao css e javascript e portanto vou testá-lo, se for o caso e eu sentir problemas de performance aí sim vou utilizar a Locaweb. Para utilizar o repositório disponibilizado nem havia necessidade de baixar o pacote!!!
O padrão para utilizar o hosting do autor, conforme documentação é: http://alexgorbatchev.com/pub/sh/[VERSION] e todas as versões disponíveis podem ser encontradas no link: http://alexgorbatchev.com/pub/sh/
Para utilizar o formatador o primeiro passo é declarar nas postagens desejadas o seguinte trecho de código que deve ser inserido no template de página no painel de administração do seu blog . No caso do blogger ir em Layout > Editar Html e colocar o javascript entre dentro da tag head do template, sugiro colocar imediatamente antes do fechamento da tag /head> depois salvar . (Eliminei tag de abertura html pois estava tendo problemas para mostrar!!! Alguém tem uma dica???):
Importante lembrar, e o autor do produto cita isso, que os caracteres de tag html e xml devem ser corretamente substituídos:
< por < > por > (ok.. ok.. esse não é obrigatório mas é uma boa prática).
Outra coisa é que se for usar o repositório disponibilizado deve-se mudar as referências passando o caminho completo, ex:
link type="text/css" rel="stylesheet" href="/styles/shCore.css">
Fica para versão 2.0.296:
link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/2.0.296/styles/shCore.css">
Lembrem-se que retirei a tag de abertura <
e assim segue para todas as referências.
Feito isso deve-se usar tags pre de html para formatar os códigos desejados e definir o que o autor chama de Brush relacionando ao padrão de fontes que está sendo formatado (java, javascript, etc).
Ver lista completa em: http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes
Exemplo formatação javascript:
pre class="brush: js">alert("Hello world")/pre>
Um link em que já utilizo o recurso como referência:
P.S - Para cada brush que você decidir utilizar tem um javascript diferente que deve ser carregado.
P.S2 - Implementei em todo o blog a formatação de código. Deu um trabalho considerável(umas 4 horas para revisar cerca de 30 posts, ainda bem que sou blogueiro mirim ainda!!!!) pois tive que desabilitar a quebra automática de linha em Configurações > Formatação > Converter quebras de linha tive que colocar não pois caso contrário a ferramenta de edição deste blogger colocava automáticamente quebras de linha(br) nos códigos!!!
[]s
Recentemente um problema simples me tomou algumas horas de pesquisa e o problema, como usual, era simples de ser resolvido.
Utilizando Struts 2 do Appfuse para desenvolvimento de uma aplicação quando colocava um tooltip no formulário percebia um erro mostrado pelo firebug no firefox o tooltip era:
E o erro mostrado pelo firebug:
dojo is not defined:dojo.requ...);dojo.require("dojo.fx.html");
Fiz uma postagem na lista de discussão do appfuse em :
http://www.nabble.com/Using-struts-2-tooltip-causes-error!-td22669446s2369.html
E a solução do problema foi bem simples e envolve 2 passos:
1) Mudar a extensão do mapeamento do struts 2 de .html que é o default do appfuse pois isso causa conflito com dojo. (Esse passo eu já havia feito no meu projeto).
2) Adicionar a tag s:head do struts ao head html da página.
O problema foi resolvido, no meu caso, só com a s:head adicionada. Bem simples e me tomou um tempo considerável.
[]s
Este final de semana instalei o Ubuntu 8.10 no meu desktop para utilizar como ambiente de trabalho e desenvolvimento de software. Durante a instalação encontrei algumas dificuldades básicas que me tomaram algum tempo e por isso segue aqui algumas dicas e links de sites de como eu resolvi tais problemas para futura referência.
Instalação do Mysql, Mysql Admin Tools e Maven - A melhor forma de instalar o Mysql que encontrei foi utilizando a ferramenta Synaptic Package Manager(System > Administration > Synaptic Package Manager). Basta procurar por Mysql na busca da ferramenta, selecionar o que deseja instalar, e pronto, bem prático. Já para instalar o maven basta abrir um console e digitar sudo apt-get install maven2 aguarde os pacotes e dependências serem baixados e instalados configure o caminho para seu repositório em : /usr/share/maven2/conf/settings.xml e pronto o Maven está pronto para usar. Veja o vídeo ilustrativo da instalação do maven em: http://www.screencast.com/t/eeP2P8jws3
Configuração do Mysql - Um problema que senti assim que tentei utilizar o mysql é que não conseguia fazer conexão das ferramentas de administração. Isso acontece porque por default ele é habilitado para escutar conexões somente no localhost(127.0.0.1). Para mudar isso editar o arquivo: /etc/mysql/my.cnf e comentar a linha onde aparece: bind-address:127.0.0.1
Depois reiniciar o mysql com o comando: mysql restart
Habilitar efeitos 3D no Ubuntu - Por último uma coisa opcional mas bem legal é a instalação do pacote de efeitos de Desktop no Ubuntu o que vai dar visual mais legal e efeitos 3D(cubo) no O.S . Para fazer a instalação é bem fácil, utilizando o Synaptic Package Manger basta procurar por compizconfig-settings-manager e depois utilizar o menu do Ubuntu em System> Preferences> ConpizConfig Settings Manager para acessar o painel de configurações de efeitos, são vários, bem legal!