quinta-feira, 10 de novembro de 2011

Telnet no Windows Vista


O Windows Vista tem telnet client sim! Só não está habilitado, afinal de contas, por que as vovózinhas iriam querer essa funcionalidade?

Para habilitar, vá no Menu Iniciar, clique em "Executar...", digite "optionalfeatures" (sem aspas) e clique OK.

A janela 
"Windows Features" vai aparecer, então você pode habilitar o telnet client. Aproveite para habilitar uns jogos também :-). Clique OK e espere muitos minutos.

Precisa reiniciar para se divertir com o telnet.

terça-feira, 1 de novembro de 2011

Como encontrar a tabela de UtcTimeOffsetCode em arquivos TAP3


Uma das informações nos registros Moc (Mobile Originated Calls) e Mtc (Mobile Terminated Calls) é o Call Event Start Time Stamp.

O Call Event Start Time Stamp é formado pelo Local Time Stamp (YYYYMMDDHHMMSS) e pelo Utc Time Offset Code.

Utc Time Offset Code (5F-81-68) pode ser qualquer número inteiro de 0 a 99 e com esta informação, você será capaz de descobrir o UTC Time Offset (5F-81-67).



O problema é esta informação não é padronizado para todos os arquivos TAP, é uma informação auto-contida nos arquivos TAP3, em outra seção. Em outras palavras, cada arquivo TAP3 tem o sua própria lista de Utc Time Offset Code mapeada para um UTC Offset real.

Esta tabela é chamada de Utc Time Offset Info e está localizada na seção Network Information. A sessão Utc Time Offset Info pode ter um ou mais Utc Time Offset Definition e cada Utc Time Offset Definition tem seu o mapeamento entre o Utc Time Offset Code e o Utc Time Offset.


No exemplo das figuras, o código 65 foi mapeado para o UTC Offset -05:00:

O TAP3 foi projetado desta forma para minimizar a quantidade de dados transferidos e para evitar a repetição de informações idênticas no nível de chamada / evento.

Dica:
Programas para trabalhar com arquivos TAP3:
TAP3 Editor (http://www.combil.com/tap3ed2.htm): Usado para ver os registros do TAP3 de forma estruturada
ASN1VE (http://www.obj-sys.com/asn1-viewer.php): Usado para ver o conteúdo binário dos dados ASN.1

quinta-feira, 20 de outubro de 2011

Log4j mistura logs entre as aplicações no Weblogic


Tenho um Web Service JWS executado em Weblogic 10.2 e seus logs estavam sendo misturados com outra aplicação web rodando no mesmo servidor.

Eu pensei que as aplicações foram totalmente independentes dentro do servidor, mas elas não são. Elas compartilham alguns classloaders. Veja imagem abaixo:



Esse problema ocorre porque o jog4j.jar é compartilhado entre as aplicações e isto ocorre porque ele é buscado do mesmo classloader.

Para resolver este problema, é necessário que cada aplicativo tenha o seu próprio log4j.jar dentro do .war. (ou .ear quando aplicável). É importante que todas as aplicações tenham seu próprio log4j. Se um deles não tiver, o problema vai continuar.

Além de ter o log4j.jar, também é necessário editar o weblogic-application.xml para avisar o Weblogic para  usar as classes do log4j do classloader da aplicação.

Segue um exemplo de weblogic-application.xml:

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<prefer-application-packages>
   <package-name>org.apache.log4j.*</package-name>
</prefer-application-packages>
</weblogic-application>


Se você estiver usando ant para construir o seu webservice JWS no Weblogic com a task jwsc, segue um trecho de build.xml que você pode usar para colocar o log4j no .war e usar um weblogic-application.xml personalizado.

No .war o log4j.jar deve ser colocado na pasta WEB-INF/lib e no .ear o weblogic-application.xml deve ser colocado na pasta META-INF.

<target name="jwsc" description="build web service">
  
    <delete dir="${build.dir}"/>
    <mkdir dir="${build.dir}"/>  
  
    <jwsc
        srcdir="${webapp.dir}"
        destdir="${build.dir}" 
     verbose="on" debug="on"
     keepGenerated="no" >

     <jws file="${jwsc.file}"
           compiledWsdl="${jwsc.jws.compiledWsdl}"
           contextPath="${jwsc.jws.contextPath}" 
           type="JAXWS" explode="false" >
</jws>
    </jwsc>
  
    <war destfile="${war.built}" update="true" >
        <fileset dir="${webapp.dir}">
           <include name="**/*.jar" />
   </fileset>
    </war>

    <copy file="${service.src}/resource/weblogic-application.xml" todir="${build.dir}/META-INF/" overwrite="true" />
  
 </target>



É importante que ${war.built} aponte para o ,war e o ${webapp.dir} aponte para a pasta com o fonte do webservice que possui pasta WEB-INF, que possui pasta lib, que possui log4j.jar.


Links:
http://download.oracle.com/docs/cd/E12840_01/wls/docs103/programming/classloading.html
https://forums.oracle.com/forums/thread.jspa?threadID=689458
http://www.coderanch.com/t/554020/Web-Services/java/adding-jar-files-building-war
http://ant.apache.org/manual/Tasks/war.html

quarta-feira, 19 de outubro de 2011

Por que o log4j não está logando?


Recentemente tive um problema com o mecanismo de log em um sistema que tive que dar manutenção.


Ele simplesmente estava ignorando a configuração log4j.properties e logava as mensagens com nível INFO.


Depois de algum tempo eu descobri que ele estava usando common-logging ao invés do log4j puro.


Não há nenhum problema em usar o commons-logging, ela funciona bem. O problema real era que apenas o commons-logging-api.jar e o log4j.jar foram incluídos no classpath. Estava faltando o commons-logging.jar.


Para suportar o log4j, o commos-logging precisa de dois jars no classpath: commons-logging e commons-logging-api.


Depois de adicionar o commons-logging.jar no classpath, o log4j.properties começou a ser lido e respeitado.


Leia mais sobre commons-logging aqui: http://commons.apache.org/logging/guide.html#Jars Included in the Standard Distribution

quinta-feira, 22 de setembro de 2011

1Z0-894 Oracle Certified Expert Java Platform, Enterprise Edition 6 JavaServer Pages and Servlet Developer

Comecei a me preparar para certificação de desenvolvimento Java para Web, antiga SCWCD - Sun Certified Web Components Developer.

Na versão mais nova dessa certificação, e já no mundo Oracle, o código dessa certificação é 1Z0-894, e o nome é Oracle Certified Expert, Java Platform, Enterprise Edition 6 JavaServer Pages and Servlet Developer.

Você encontrará mais detalhes sobre essa prova no site da Oracle: http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_894

O site da EPractize Labs também tem informações interessantes, inclusive um simulador de quanto tempo você vai precisar para se preparar para a prova: http://www.epractizelabs.com/blog2/?p=106

Como essa prova é relativamente nova, e eu já havia lido o livro Head First Servlets & JSP JEE 1.4 por duas vezes, resolvi me preparar somente com o Study Guide e o Mock Exam do EPractize Labs:
http://www.epractizelabs.com/certification/sun/oce-jsp-servlet-exam-6.html

Esse material custa $40.5 dólares, mas a EPractize Labs garante o dinheiro de volta caso não passe na prova.

Esse Study Guide tem alguns erros de Ctlr-C/Ctrl-V, vários typos e o conteúdo é muito superficial, mas eu pretendo preencher a lacuna com pequisas na internet.

Também montei um projeto no Eclipse para ir fazendo na prática o que eu aprendo no Study Guide.

O meu objetivo é fazer a prova na primeira semana de Dezembro/2011, tomara que dê tempo!

Depois em conto como me saí.

Se você tiver dicas ou dúvidas sobre essa certificação, compartilhe comentando este post.

--
PS: Confira o resultado http://pontodebug.blogspot.com/2011/12/passei-1z0-894-oracle-certified-expert.html

quarta-feira, 3 de agosto de 2011

Função Oracle PL/SQL para testar se uma string representa um número: isNumber ou isNumeric

TAGs: Oracle, SQL, PL/SQL, isNumber, isNumeric

Não existe uma função para testar se o conteúdo de uma string representa um valor numérico, mas existe um workaround.

LENGTH(TRIM(TRANSLATE(string1, ' +-.0123456789', ' ')))

Essa função vai retornar null se o valor for numérico, assim você pode testar com "is null" em uma cláusula where. Por exemplo:

select * from tabela where LENGTH(TRIM(TRANSLATE(campoString, ' +-.0123456789', ' '))) is null

A função translate troca os dígitos por espaços '  '. A função trim remove os espaços. A função length retorna o tamanho da string. Se a string não for numérica, o tamanho será positivo, caso seja numérica, length retornará null.

Fonte: http://www.techonthenet.com/oracle/questions/isnumeric.php

quinta-feira, 9 de junho de 2011

Comandos do vi

    Sintaxe para executar o vi:
    $ vi nome_do_arquivo
    
    Uma vez carregado o arquivo, você pode navegar com as teclas direcionais (up, down, left, right), mas para editar o arquivo é necessário usar os comandos abaixo:
    Observação: Use o ESC para voltar ao modo de comando.
    Comandos básicos de inserção de texto:
    iInsere texto antes do cursor
    aInsere texto depois do cursor
    rInsere texto no início da linha onde se encontra o cursor
    AInsere texto no final da linha onde se encontra o cursor
    oAdiciona linha abaixo da linha atual
    OAdiciona linha acima da linha atual
    Ctrl + hApaga o último caracter
    Comandos básicos de movimentação:
    Ctrl+fMove o cursor para a proxima tela
    Ctrl+bMove o cursor para a tela anterior
    HMove o cursor para a primeira linha da tela
    MMove o cursor para o meio da tela
    LMove o cursor para a ultima linha da tela
    hMove o cursor um caracter a esquerda
    jMove o cursor para a proxima linha
    kMove o cursor para linha anterior
    lMove o cursor um caracter a direita
    wMove o cursor para o inicio da proxima palavra (Ignora a pontuacao)
    WMove o cursor para o inicio da proxima palavra (Nao ignora a pontuacao)
    bMove o cursor para o inicio da palavra anterior (Ignora a pontuacao)
    BMove o cursor para o inicio da palavra anterior (Nao ignora a pontuacao
    0Move o cursor para o inicio da linha atual
    ^Move o cursor para o primeiro caracter nao branco da linha atual
    $Move o cursor para o final da linha atual
    nGMove o cursor para a linha n
    GMove o cursor para a ultima linha do arquivo
    Comandos basicos para localizar texto:
    /palavraBusca pela palavra ou caracter em todo o texto
    ?palavraMove o cursor para a ocorrencia anterior da palavra
    nRepete o ultimo comando / ou ?
    NRepete o ultimo comando / ou ? , na direcao reversa
    Ctrl+gMostra o nome do arquivo, o numero da linha corrente e o total de linhas
    Comandos basicos para alteracao de texto:
    xDeleta o caracter que esta sob o cursor
    dwDeleta a palavra, da posicao atual do cursor ate o final
    ddDeleta a linha atual
    DDeleta a linha a partir da posicao atual do cursor ate o final
    rxSubstitui o caracter sob o cursor pelo especificado em x(é opcional indicar o caracter)
    RxSubstitui a palavra sob o cursor pela palavra indicada em x
    uDesfaz a ultima modificacao
    UDesfaz todas as modificacoes feitas na linha atual
    JUne a linha corrente a proxima
    s:/palavra1/palavra2Substitui a primeira ocorrencia de "palavra1" por "palavra2"
    Comandos para salvar o texto:
    :wqSalva o arquivo e sai do editor
    :w nome_do_arquivoSalva o arquivo corrente com o nome especificado
    :w! nome_do_arquivoSalva o arquivo corrente no arquivo especificado
    :qSai do editor
    :q!Sai do editor sem salvar as alterações realizadas
        Exemplo para abrir um arquivo, adicionar um texto e salvar:
        1 - digite no prompt: vi <nome_do_arquivo>
        2 - tecle "i", quando o cursor estiver no ponto desejado
        3 - digite o texto
        4 - tecle "ESC"
        5 - digite :wq