quinta-feira, 3 de novembro de 2011

Usando o Microsoft Excel para criar um XML Schema

Editar um XML é relativamente simples, correto? E criar um XML Schema à partir de um arquivo XML?

Eu nunca conheci um profissional por estes lados que tivesse a sua disposição uma ferramenta como o Altova XMLSpy para editar alguma coisa em XML. Os gerentes geralmente devem achar que o Notepad.exe é suficiente para qualquer coisa!

Criar um Schema manualmente pode ser um processo chato... senão doloroso. Aqui vai uma dica para os analistas de sistemas humildes que só dispõe de uma licença do Microsoft Excel para fazer este trabalho árduo.O Excel consegue (pelo menos à partir da versão 2003) trabalhar com arquivos XML com bastante desenvoltura. Você pode importar um arquivo XML tranquilamente. Observe o arquivo XML abaixo:



Agora basta abrir o arquivo pelo Excel utilizando uma das opções para abertura de arquivo. Você verá a caixa de diálogo abaixo. Escolher qualquer uma das opções deve ser suficiente.


Perceba que uma mensagem será exibida informando que não existia um Schema associado ao XML, portanto o Excel resolveu criar um para você.



O resultado final é essa coisa aqui:



O schema não vai ser mostrado diretamente, então é aqui que vem a dica:
  1. Pressione a combinação ALT+F11 para abrir o editor de Visual Basic.
  2. Na janela "Immediate", digite "Print ActiveWorkbook.XmlMaps(1).Schemas(1).Xml" e pressione enter. Se a janela não estiver sendo mostrada, use o menu View para abilitar a janela.
  3. Pressione enter. O Schema será mostrado logo abaixo na janela Immediate.
O Schema do XML de exemplo ficará da seguinte forma:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element nillable="true" name="contactPlanning"><xsd:complexType><xsd:sequence minOccurs="0"><xsd:element minOccurs="0" nillable="true" type="xsd:string" name="UF" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:integer" name="CRM" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:integer" name="period" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:string" name="sector" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:string" name="product" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:string" name="segment" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:integer" name="contactsCycle" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:integer" name="contactsYear" form="unqualified"></xsd:e
lement><xsd:element minOccurs="0" nillable="true" type="xsd:string" name="action" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:integer" name="externalId" form="unqualified"></xsd:element><xsd:element minOccurs="0" nillable="true" type="xsd:integer" name="priority" form="unqualified"></xsd:element></xsd:sequence></xsd:complexType></xsd:element></xsd:schema>

Não exatamente muito bonito de ler... mas melhor do que escrever isto tudo manualmente. Outra coisa que você vai reparar é que o Schema é bastante permissivo. Provavelmente você terá que trabalhar em alguns atributos para resolver isto, mas em meros segundos você já ganhou uma boa ajuda do Excel!

quinta-feira, 27 de outubro de 2011

Descobrindo por onde vaza memória dos seus programas

Estava eu dando um olhada no web site Siebel Unleashed no começo desta semana quando me deparei com o artigo "Memory Leaks in Siebel". O artigo é interessante pois agrega informação espalhada por vários documentos encontrados somente no My Oracle Support. Mas o que mais me chamou a atenção no artigo não foi o que já está documentado por aí.

O autor do artigo (Timur Vafin)  criou uma série de scripts (sendo um deles em Perl) para analisar código eScript recuperado do banco de dados do repositório do Siebel e procurar por variáveis do tipo Object (ou derivados) que de acordo com as boas práticas (de sanidade) deveriam ser eliminadas com um simples var = null dentro do bloco finally de cada programa/função.

Pois bem, eu resolvi botar o programa para rodar e ver o que acontecia. Me desapontei por achar alguns tropeços básicos no que se trata de Perl (nada de pragmas como warnings e strict a a total falta de conhecimento de DBI) mas depois de algumas linhas de código a mais e correções aqui e ali e o script Perl passou a rodar sem problemas no meu ambiente de desenvolvimento sem maiores sustos e com bons resultados!

O script encontrou um monte de tranqueiras no meu repositório... coisa que já faz muito tempo que ninguém olha mas está lá... como uma mina terrestre esperando alguém pisar encima para explodir!

Caso você não saiba, algum componente do seu servidor Siebel pode estar tendo problemas de vazamento de memória e o processo acaba sendo morto pelo sistema operacional para evitar que o servidor fique sem memória RAM. No caso de eScript, fatalmente será algum AOM que estiver rodando no servidor.

Eu fiquei tão contente com o resultado que entrei em contato com o Timur e hoje acabo de criar um projeto para o programa no Google Code. O resultado pode ser visto aqui.

O parser do programa ainda é bem rudimentar (baseado em expressões regulares) e provavelmente pode apresentar falsos positivos mas certamente já é uma mão na roda para começar a desenterrar essas "minas terrestres".

Gostou da ideia também? Estou aceitando contribuidores para o projeto (ei rodar testes também é contribuir!) e mesmo que você só estiver interessado em dar uma olhada no código basta acessar o repositório SVN do Google Code em:

http://code.google.com/p/siebel-code-analyzer/source/browse/#svn%2Ftrunk

Até mais!

quarta-feira, 19 de outubro de 2011

Fazendo melhor uso do srvrmgr.exe

O aplicativo de linha de comando srvrmgr.exe nunca foi lá de muito sucesso com o Siebel. Mas qualquer SADMIN com algum tempo de experiência acaba descobrindo na marra que a interface gráfica tem suas limitações e o srvrmgr é um excelente complemento para ela.

Uma das utilizações mais óbvias do srvrmgr é quando o AOM utilizado no servidor está fora do ar e você não tem um cliente dedicado configurado. Outro uso é para automatizar tarefas, mas isso é um assunto para outro dia.

A dica que vou escrever aqui hoje é sobre o uso interativo do srvrmgr. Estou assumindo que você está usando Windows. Se você está usando Linux (algum outro UNIX like), por favor me avise para aonde eu mando meu currículo porque eu não aguento mais trabalhar com Siebel em Windows. :-D

Em primeiro lugar, vamos falar de configuração de codificação de caracteres. Suponhamos que seu sistema tenha configurado a aplicação em PTB (Português do Brasil) e você roda um simples list comp no srvrmgr:

srvrmgr> list comp

CC_ALIAS           CC_NAME                               CG_ALIAS      CC_RUNMODE   CP_DISP_RUN_STATE
-----------------  ------------------------------------  ------------  -----------  -----------------
ClientAdmin        Client Administration                 System        Background   Ativado
CommConfigMgr      Communications Configuration Manager  CommMgmt      Batch        Ativado
CommOutboundMgr    Communications Outbound Manager       CommMgmt      Batch        Ativado
CommSessionMgr     Communications Session Manager        CommMgmt      Batch        Ativado
DbXtract           Database Extract                      Remote        Batch        Ativado
EAIObjMgr_enu      EAI Object Manager (ENU)              EAI           Interactive  Ativado
MailMgr            Email Manager                         CommMgmt      Background   Ativado
EIM                Enterprise Integration Mgr            EAI           Batch        Ativado
FSMSrvr            File System Manager                   System        Batch        Ativado
GenNewDb           Generate New Database                 Remote        Batch        Ativado
GenTrig            Generate Triggers                     Workflow      Batch        Ativado
PageMgr            Page Manager                          CommMgmt      Background   Ativado
PDbXtract          Parallel Database Extract             Remote        Batch        Em execuþÒo
RepAgent           Replication Agent                     Remote        Background   Ativado
ServerMgr          Server Manager                        System        Interactive  Em execuþÒo
SRBroker           Server Request Broker                 System        Interactive  Em execuþÒo
SRProc             Server Request Processor              System        Interactive  Em execuþÒo
SynchMgr           Synchronization Manager               Remote        Interactive  Ativado
TxnMerge           Transaction Merger                    Remote        Background   Em execuþÒo
TxnProc            Transaction Processor                 Remote        Background   Em execuþÒo
TxnRoute           Transaction Router                    Remote        Background   Em execuþÒo
UpgKitBldr         Upgrade Kit Builder                   SiebAnywhere  Batch        Ativado
WorkActn           Workflow Action Agent                 Workflow      Background   Ativado
WorkMon            Workflow Monitor Agent                Workflow      Background   Ativado
WfProcBatchMgr     Workflow Process Batch Manager        Workflow      Batch        Ativado
WfProcMgr          Workflow Process Manager              Workflow      Batch        Ativado
ePharmaObjMgr_enu  ePharma Object Manager (ENU)          LifeSciences  Interactive  Ativado
ePharmaObjMgr_esn  ePharma Object Manager (ESN)          LifeSciences  Interactive  Ativado
ePharmaObjMgr_ptb  ePharma Object Manager (PTB)          LifeSciences  Interactive  Ativado

Tudo certo, exceto pelos caracteres esquisitos. Bem, o problema é a codificação de página padrão do prompt de comando do Windows. A codificação ativa padrão é 850 e isso não ajuda muito com caracteres acentuados da língua portuguesa. Para mudar isto, basta usar o comando chcp no CMD.exe com a opção 1252:

I:\>chcp 1252
Active code page: 1252

Isso resolverá seus problemas com codificações de página. Se você tiver saída com alguma outra configuração exótica, pesquise sobre o assunto para conseguir visualizar a saída do programa de forma adequada. Claro que ficar digitando isso toda santa vez vai ser trabalhoso, mas nada que criar um script para lhe ajudar a fazer isto (você está usando um script, não? Por favor não me diga que você digita todos aqueles parâmetros toda hora!).

A outra questão é trabalhar com senha: se você precisa utilizar um login e senha para se autenticar no srvrmgr é sempre uma boa idéia se preocupar como utilizar sua senha. Salvar em um script não é legal e digitar no terminal também não, afinal papagaio de pirata também é uma falha de segurança!

Existem diversas formas de resolver isto, mas o melhor é desabilitar o ECHO ao se digitar no terminal. Isso pode ser feito de diversas formas (vide sua linguagem de programação favorita). Eu, por exemplo, criei o script em Perl abaixo para fazer isto pra mim:

use warnings;
use strict;
use Term::ReadKey qw(ReadMode);
use Win32::Process;

my $server     = '';
my $gateway    = '';
my $enterprise = '';
my $user       = '';
my $srvrmgr    = 'sea752\\client\\BIN\\srvrmgr.exe';

system('chcp 1252');

print 'Type your password to connect to Siebel Server: ';
ReadMode(2);
my $password = <STDIN>;
ReadMode(0);

chomp($password);

print "\n\n";

my $process;

Win32::Process::Create( $process, $srvrmgr,
    "srvrmgr /e $enterprise /g $gateway /u $user /p $password",
    0, NORMAL_PRIORITY_CLASS, '.' )
  or die errorReport();

$process->Wait(10);

sub errorReport {

    print Win32::FormatMessage( Win32::GetLastError() );

}

Assim a vida fica mais fácil!

Vale lembrar que se você utilizar a função spool do srvrmgr, ela provavelmente vai assumir a codificação do seu banco de dados (não tenho certeza disto, mas meu banco é UTF-8 e a saída salva tem a mesma codificação de dados).

quinta-feira, 6 de outubro de 2011

Bem-vindo!

Olá,

Este é meu primeiro texto neste blog. Aliás, meu primeiro texto em qualquer blog porque este é o primeiro que me atrevo a escrever alguma coisa.

Eu sempre achei que blog era algo muito parecido com um diário e bem... melhor conversar com um amigo/amiga sobre a minha vida pessoal do que publicá-la na Internet!

Mas também é uma oportunidade de escrever alguma coisa que eu goste e que possa ser útil para alguém.

Este blog é dedicado a assuntos técnicos da área de informática, que não por acaso é a área que me dedico profissionalmente. Então, se você não gosta do assunto ou tem horror a gente "nerd"... melhor você visitar outro blog! :-)

São muitos os assuntos que eu poderia escrever sobre tecnologia, que é um campo incrivelmente vasto e que se modifica todos os dias. Não é difícil chegar a conclusão que ficar atualizando ele pode ser difícil, sem considerar o tempo necessário para tanto.

O nome deste blog é "Diário de bordo" porque resolvi que vou escrever exatamente sobre isto: situações em que eu lido no dia-a-dia no meu trabalho e os truques técnicos (ou às vezes nem tão técnicos assim) que eu uso para conseguir "matar os leões" que aparecem cotidianamente.

Seja bem-vindo!