Tutorial de Instalação do jBPM 6.2 + PostgreSQL + JBoss 7.1 Final + Eclipse

Fala galera! O objetivo deste tutorial é guiá-los na instalação do jBPM 6.2.0.Final utilizando como base de dados o PostgreSQL. Não abordarei a instalação do PostgreSQL e do Ant pois não é o foco do tutorial.

AMBIENTE

Para este tutorial, estou utilizando o sistema operacional Ubuntu 14.04 mas nada impede que você utilize Windows ou qualquer outra distro Linux ok?

INGREDIENTES

  • Instalador do jBPM-6.2.0.Final
  • PostgreSQL
  • Ant
  • Uma boa conexão
  • Paciência

INSTALAÇÃO

Baixe o instalador: http://sourceforge.net/projects/jbpm/files/jBPM%206/jbpm-6.2.0.Final/jbpm-6.2.0.Final-installer-full.zip/download

Descompacte o arquivo no diretório “/opt” (ou em outro diretório de sua preferência)

Abra o arquivo build.properties que está na raiz do diretório “/opt/jbpm-installer”. O trabalho aqui é comentar/descomentar linhas, exceto a configuração do PostgreSQL que vamos adicionar.

As 3 primeiras linhas do arquivo indicam o diretório home da instalação, a snapshot e a release. Não é necessário fazer nenhuma alteração aqui.

install.home=./
snapshot.version=6.2.0-SNAPSHOT
release.version=6.2.0.Final

O próximo bloco diz respeito a versão do jBPM que iremos utilizar, como vamos trabalhar com a release, descomente as linhas abaixo e comente as demais:

jBPM.version=${release.version}
jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/droolsjbpm-bpms-distribution/${jBPM.version}/droolsjbpm-bpms-distribution-${jBPM.version}-bin.zip

A próxima configuração é a respeito do WAR do jBPM Console que iremos instalar, em nosso caso, para JBoss AS 7:

jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-jboss-as7.war

Eclipse + plugin jBPM e Drools:

droolsjbpm.eclipse.version=${release.version}
droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip

e

eclipse.home=./eclipse
eclipse.clean.workspace=true

JBoss AS 7.1.1.Final:

jboss.server.version=as-7.1.1.Final
jboss.home=./jboss-${jboss.server.version}
jboss.download.url=http://download.jboss.org/jbossas/7.1/jboss-${jboss.server.version}/jboss-${jboss.server.version}.zip
jboss.server.conf.dir=${jboss.home}/standalone/configuration
jboss.server.deploy.dir=${jboss.home}/standalone/deployments
jboss.server.data.dir=${jboss.home}/standalone/data
jboss.clean.repository=true
jboss.war.type=${jboss.server.version}

O próximo é Dashboard. Dashboard é uma ferramenta utilizada para medir indicadores dos processos.

dashboard.version=${release.version}
dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-jboss-as7.war

E finalmente, o banco de dados. Por padrão, o jBPM usa o H2 como backend. Nós iremos utilizar o PostgreSQL 9.3 e a partir dessa configuração, fica fácil utilizar qualquer outro banco de dados.

Quem já tiver alguma experiência com módulos do JBoss, não terá nenhuma dificuldade aqui.
As duas linhas abaixo são respectivamente: O caminho de origem para o driver (jar) e a pasta do módulo no JBoss.

db.driver.jar=${install.home}/db/driver/${db.driver.jar.name}
db.driver.module.dir=${jboss.home}/modules/${db.driver.module.prefix}/main/

Faça o download do driver postgresql-9.3-1103.jdbc4.jar e salve-o na pasta “/opt/jbpm-installer/db/driver”.
No build.properties, comente as linhas referente ao H2 e acrescente as linhas abaixo:

#postgresql
db.name=postgresql
db.driver.module.prefix=org/postgresql
db.driver.jar.name=postgresql-9.3-1103.jdbc4.jar
db.driver.download.url=https://repository.jboss.org/nexus/content/repositories/thirdparty-uploads/postgresql/postgresql/9.1-902.jdbc4/postgresql-9.1-902.jdbc4.jar

Pronto. Depois de realizar essas alterações, seu arquivo build.properties deve se parecer com esse:

# NOTES for doing a release
# - replace all *.url variables with the variables marked as <RELEASE>
# - make sure all *.version variables = ${release.version}
# - set ${release.version} to the current release version.

install.home=./
snapshot.version=6.2.0-SNAPSHOT
release.version=6.2.0.Final

# the version of jBPM you want to use
# and the associated URL you want to get the dependencies from
# for example:
#<RELEASE>
#   jBPM.version=${release.version}
#   jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/jbpm-distribution/${jBPM.version}/jbpm-distribution-${jBPM.version}-bin.zip
# or:
#<SNAPSHOT>
#   jBPM.version=${snapshot.version}
#   jBPM.url=https://hudson.jboss.org/hudson/job/jBPM/lastSuccessfulBuild/artifact/jbpm-distribution/target/jbpm-${jBPM.version}-bin.zip
jBPM.version=${release.version}
jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/droolsjbpm-bpms-distribution/${jBPM.version}/droolsjbpm-bpms-distribution-${jBPM.version}-bin.zip

# the version of jBPM Console you want to use
# and the associated URL you want to get it from
# for example:
#<RELEASE>
# for AS7:
jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-jboss-as7.war
# for EAP 6.4:
#   jBPM.console.url=http://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-eap6_4.war
# for WildFly8:
#   jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-wildfly8.war
# or:
#<SNAPSHOT>
#   jBPM.console.url=https://hudson.jboss.org/hudson/job/kie-wb-distributions/lastSuccessfulBuild/artifact/kie-wb/kie-wb-distribution-wars/target/kie-wb-${jBPM.version}-wildfly8.war

# the version of jBPM and Drools Eclipse plugin you want to use
# and the associated URL you want to get the dependencies from
# for example:
#<RELEASE>
#   droolsjbpm.eclipse.version=${release.version}
#   droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip
# or:
#<SNAPSHOT>
#   droolsjbpm.eclipse.version=${snapshot.version}
#   droolsjbpm.eclipse.url=https://hudson.jboss.org/hudson/job/droolsjbpm-tools/lastSuccessfulBuild/artifact/drools-eclipse/org.drools.updatesite/target/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip
droolsjbpm.eclipse.version=${release.version}
droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip

# the home of your eclipse installation
# will be used to deploy the Eclipse plugin to
eclipse.home=./eclipse
eclipse.clean.workspace=true

# the home of your JBoss AS installation
# for example, for AS7:
jboss.server.version=as-7.1.1.Final
jboss.home=./jboss-${jboss.server.version}
jboss.download.url=http://download.jboss.org/jbossas/7.1/jboss-${jboss.server.version}/jboss-${jboss.server.version}.zip
jboss.server.conf.dir=${jboss.home}/standalone/configuration
jboss.server.deploy.dir=${jboss.home}/standalone/deployments
jboss.server.data.dir=${jboss.home}/standalone/data
jboss.clean.repository=true
#   IMPORTANT: make sure to also set the H2.version property (below) to 1.3.161
# or for EAP 6.4
#   jboss.server.version=eap-6.4.0
#   jboss.home=./jboss-eap-6.4
#   jboss.download.url=### you need to manually download the eap 6.4.0 zip and put it in the lib folder ###
#   jboss.server.conf.dir=${jboss.home}/standalone/configuration
#   jboss.server.deploy.dir=${jboss.home}/standalone/deployments
#   jboss.server.data.dir=${jboss.home}/standalone/data
#   jboss.clean.repository=true
# or for Wildfly8
#   jboss.server.wildfly.version=8.1.0.Final
#   jboss.server.version=wildfly-${jboss.server.wildfly.version}
#   jboss.home=./${jboss.server.version}
#   jboss.download.url=http://download.jboss.org/wildfly/${jboss.server.wildfly.version}/${jboss.server.version}.zip
#   jboss.server.conf.dir=${jboss.home}/standalone/configuration
#   jboss.server.deploy.dir=${jboss.home}/standalone/deployments
#   jboss.server.data.dir=${jboss.home}/standalone/data
#   jboss.clean.repository=true
jboss.war.type=${jboss.server.version}

# jboss.port.offset=0
# org.uberfire.nio.git.daemon.port=9418
# org.uberfire.nio.git.ssh.port=8001

# the version of Dashboard Builder you want to use
# and the associated URL you want to get it from
# for example:
#<RELEASE>
# for AS7:
dashboard.version=${release.version}
dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-jboss-as7.war
# for EAP 6.4:
#   dashboard.version=${release.version}
#   dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-eap6_4.war
# for Wildfly8:
#   dashboard.version=${release.version}
#   dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-wildfly8.war
# or:
#<SNAPSHOT>
#   dashboard.version=${snapshot.version}
#   dashboard.url=https://hudson.jboss.org/hudson/job/jbpm-dashboard/lastSuccessfulBuild/artifact/jbpm-dashboard-distributions/target/jbpm-dashbuilder-${dashboard.version}-wildfly8.war

# data base related properties
db.driver.jar=${install.home}/db/driver/${db.driver.jar.name}
db.driver.module.dir=${jboss.home}/modules/${db.driver.module.prefix}/main/
# default is H2
# H2.version=1.3.168
# db.name=h2
# db.driver.jar.name=h2-${H2.version}.jar
# db.driver.download.url=http://repo1.maven.org/maven2/com/h2database/h2/${H2.version}/h2-${H2.version}.jar
#other options are:
#mysql
#  db.name=mysql
#  db.driver.module.prefix=com/mysql
#  db.driver.jar.name=mysql-connector-java-5.1.18.jar
#  db.driver.download.url=https://repository.jboss.org/nexus/service/local/repositories/central/content/mysql/mysql-connector-java/5.1.18/mysql-connector-java-5.1.18.jar
#postgresql
db.name=postgresql
db.driver.module.prefix=org/postgresql
db.driver.jar.name=postgresql-9.3-1103.jdbc4.jar

Agora, vamos executar o instalador e esperar (bastante):

ant install.demo

Enquanto você espera a instalação finalizar, vamos configurar o BD:

  • Crie um novo banco de dados chamado jbpm
  • Vá até a pasta “/opt/jbpm-installer/db/ddl-scripts/postgres/”
  • Execute o script postgresql-jbpm-schema.sql e na sequência quartz_tables_postgres.sql

Quando a instalação finalizar, abra o arquivo “/opt/jbpm-installer/jboss-as-7.1.1.Final/bin/standalone.conf”, na linha 50, e altere as configurações como na linha abaixo:

-Xmx1024m -XX:MaxPermSize=512m

e na linha 52:

JAVA_OPTS="$JAVA_OPTS -Djboss.server.default.config=standalone-full.xml"

Abra o arquivo “/opt/jbpm-installer/jboss-as-7.1.1.Final/standalone/configuration/standalone-full.xml”, localize a seção datasource e adicione:

<datasource jta="true" jndi-name="java:jboss/datasources/jbpmDS" pool-name="jbpmDS" enabled="true" use-java-context="true" use-ccm="true">
    <connection-url>jdbc:postgresql://localhost:5432/jbpm</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <driver>postgresql</driver>
    <pool>
        <min-pool-size>2</min-pool-size>
        <max-pool-size>100</max-pool-size>
    </pool>
    <security>
        <user-name>postgres</user-name>
        <password>postgres</password>
    </security>
    <validation>
        <validate-on-match>false</validate-on-match>
        <background-validation>false</background-validation>
        <background-validation-millis>1</background-validation-millis>
    </validation>
    <statement>
        <prepared-statement-cache-size>64</prepared-statement-cache-size>
        <share-prepared-statements>true</share-prepared-statements>
    </statement>
</datasource>

E na seção drivers, acrescente:

<driver name="postgresql" module="org.postgresql">
    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>

Se tudo estiver correto, você já pode iniciar o JBoss:

$ cd /opt/jbpm-installer/jboss-as-7.1.1.Final/bin/
$ ./standalone.sh -b 0.0.0.0

Se apareceu “Deployed” no terminal, você já pode acessar o jbpm-console: http://localhost:8080/jbpm-console

Espero que tudo tenha dado certo!

Um abraço e até o próximo post!

Guia: Substituir Windows 8.0 Pré-Instalado

Essa semana, meu antigo notebook veio a falecer e eu precisei comprar um meio que emergencialmente para terminar alguns freelas que estavam com prazos bem apertados.

Eu sou usuário linux mas ainda mantenho uma partição com Windows para alguns trabalhos específicos (exigência de cliente e/ou tecnologia, etc. ) . Como não fui com a cara do Windows 8, resolvi formatar a máquina e instalar meu Ubuntu + Win 7 e assim deu-se inicio ao meu final de semana terror.

O problema é o UEFI, sucessor de togakure da boa e velha BIOS. Por causa dele, eu não conseguia simplesmente mudar a prioridade de BOOT para CD/DVD já que o Windows 8 não reinicia de verdade, ele hiberna, então quando você pressiona Del, F1, F10 ou seja lá qual for a tecla que te levaria para o setup no boot, não acontece nada … você continua indo parar no vírus Windows 8.

Ok, vamos então para a receita de bolo para remover ele e instalar seu sistema operacional preferido.

DESATIVAR O FAST BOOT NO WINDOWS 8

Abra o painel de controle e vá até as opções de energia.
No menu do lado esquerdo, escolha a opção “Alterar o funcionamento dos botões de energia” e em seguida, clique em “Alterar configurações não disponíveis no momento”.
Na parte inferior da tela, desmarque a opção “Ligar inicialização rápida”.

ACESSAR A BIOS

Ainda no Windows 8, vá até as opções de desligamento e segure a tecla shift e clique em reiniciar. Isso vai fazer com que você entre nas configurações do UEFI.

Se tudo deu certo até o momento, você estará agora olhando para a tela do UEFI, que é mais ou menos assim:

Clique na opção “Troubleshoot”, depois em “Advanced Options” e por fim “UEFI Firmware Settings”. Pronto, o computador irá reiniciar e provavelmente você não terá que pressionar nenhuma tecla para entrar na BIOS, já vai entrar direto.

Já na boa e velha BIOS, procure as opções de Boot (cada fabricante tem um layout diferente, por isso não tenho como dizer onde exatamente está) e habilite o Boot Legacy e altere as prioridade de boot entre UEFI e legacy, deve ter uma opção: Boot Legacy First.

Na mesma tela, selecione a ordem de prioridade de boot para CD/DVD ou se você vai realizar uma instalação via USB, selecione o dispositivo correspondente. Tudo isso fica antes do seu HD que contém o Windows 8. Em alguns casos, também é necessário desativar o Secure Boot – Não foi o meu caso mas se for necessário, provavelmente se encontra na aba Security.

Reinicie com o CD/DVD de instalação do novo Sistema e tudo vai funcionar como esperado. Se você vai ficar com apenas 1 sistema operacional, seus problemas acabaram e você já pode ser feliz \o/.

* A partir de agora, sempre que precisar entrar na BIOS, basta pressionar a tecla de função normalmente como antigamente durante o boot.

DUAL BOOT – INSTALAR LINUX

Para instalar seu linux (em meu caso o Ubuntu), basta dar o boot pelo Live CD ou USB (lembre-se, você deve alterar a prioridade do boot na BIOS para que ele inicie pelo dispositivo e não pelo HD) e seguir as instruções de instalação.

Eis que você chega na parte de selecionar a partição de instalação e o instalador não reconhece a partição onde você instalou o outro sistema operacional e mostra o disco inteiro vazio. Pois é, mais uma novidade 🙂 – O GPT. O GPT é o novo formato de tabela de partição, sucessor da MBR. E o que acontece é que as vezes, você instala um sistema com MBR e ficam “resíduos” do GTP no disco, dai a ferramenta de partição entende que trata-se de um disco em GPT e lá não tem nada. 

Saia da instalação e entre no modo “Try Ubuntu”, acesse o terminal e execute a ferramenta gdisk. Sintaxe: gdisk /dev/sda

ATENÇÃO – Muito cuidado a partir daqui.

O gdisk irá identificar que o disco possui MBR e GPT e pergunta como você deseja trabalhar, escolha MBR Only.
Tecle “x” para entrar no modo expert
Tecle “z” para apagar os dados da GPT e confirme com “y”
Tecle “n” para a pergunta “Blanking the MBR”. Cuidado para não responder “y” aqui.

Pronto, saia do gdisk e abra o gparted ou qualquer outra ferramenta de particionamento que desejar. 
A partir desse momento, você já vai conseguir ver a(s) partição(ões) que contém o outro sistema instalado. Crie as partições linux que desejar e reinicie computador.

Pronto, siga o processo de instalação normalmente.

Referências:

http://askubuntu.com/questions/221835/installing-ubuntu-on-a-pre-installed-windows-8-64-bit-system-uefi-supported

http://www.tecmundo.com.br/como-fazer/29536-windows-8-o-que-e-o-modo-de-inicializacao-rapida-e-como-desabilita-lo.htm

http://askubuntu.com/questions/249642/gpt-partition-table-warning-message-during-install-of-ubuntu

Impressora HP: Impressão extremamente lenta

Sintomas: Impressora não realiza a impressão (Linux) ou imprime de forma extremamente lenta, imprimindo 1 faixa de cada vez (uns 15 ou 20 segundos de intervalo entre uma impressão e outra – Linux e Windows 7).

Diagnóstico: Provavelmente um dos cartuchos está com problema. Remova 1 cartucho de cada vez, mande um documento para a fila de impressão e verifique se a impressão voltou ao normal. Se sim, o cartucho com defeito é o que foi retirado.

Plus: No Linux, baixe a ferramenta gerenciamento de impressão da HP e o driver hplip no site: http://hplipopensource.com/hplip-web/index.html

Arch Linux Review

Hi Folks!!!

Nesse post vou passar as minhas impressões sobre a distro Arch Linux: uma distro enxuta, leve e simples de manter mas que é voltada para usuários avançados ou pelo menos fuçadores.

Eu fui durante muito tempo usuário do Slackware, mas acabei migrando para o Ubuntu pela comodidade e facilidade de uso. O projeto comandado por Patrick Volkerding anda a passos de tartaruga … demora muito para lançar releases … sem falar na falta de um gerenciador de pacotes no estilo apt-get e o fato de retirar o gnome e deixar apenas o KDE. Tirando esses pormenores, é melhor distro que já usei.

O Ubuntu é uma ótima distro mas não é leve e customizavel como o Slack. Foi ai que meu amigo e ídolo Joenio Marques me falou sobre o Arch. Eu já tinha ouvido falar mas não conhecia nada do projeto.

Baixei e instalei … virei fan!

A distro é muito boa, muito parecida com o Slack, estrutura do sistema … filosofia …robustez. Possui um ótimo gerenciador de pacotes (pacman), consegui instalar tudo que precisei sem problemas .. incluindo o gnome e GDM.

A instalação foi rápida, em torno de 10 min usando a opção Core (offiline) 330MB.

Configurar também não foi diferente, tudo fica armazenado em um arquivo central, o /etc/RC.conf … módulos, daemons, configuração de interfaces de rede, teclado, etc … tudo é centralizado tornando as coisas bem mais práticas. Caso tenha dúvidas, eles possuem um Wiki do projeto com bastante material.

Outro ponto bom é a atualização do sistema … como se trata de uma distro rolling release, o sistema está em constante atualização … para atualizar, basta executar: pacman -Syu ou pacman -Su

Aqui vai um post que compara o Slackware e o Arch pra quem ficou em dúvida como eu hehehe: http://www.osnews.com/story/8761/Arch_Linux_Vs_Slackware_The_Best_of_All_Worlds/page1/

É isso ai … Quem gosta de deixar o linux com a sua cara e/ou gosta de Slackware, vai adorar o Arch.

Abraço e até o próximo post

JasperServer – Backup/Export Repositório

O JasperServer é uma excelente opção gratuita para desenvolver relatórios de forma profissional, rápida (na maioria das vezes) e segura. Não sei porque parece que não ganhou muitos adaptos ou os usuários não costumam falar sobre a ferramenta :). É muito difícil achar algum material sobre Jasper/iReports. Então vou dando minhas trumbicadas diárias e postando aqui as soluções que encontro e/ou invento.

Hoje precisei publicar um repositório do JasperServer em um servidor de desenvolvimento. Já vi por ai que muita gente dizendo que faz o backup/export usando o dump do banco do jasper server. Não me pareceu uma opção muito segura e resolvi procurar uma outra forma de fazer e dai lembrei do js-export e js-import que usei para migrar do jasperserver 3.1 para o 3.5 (Upgrade do JasperServer 3.1 para o 3.5). Esses dois scripts, como o nome já diz, exportam e importam dados do repositório do JS. Para exportar todos os dados do repositório, use o comando:

Linux:

js-export.sh --everything --output-zip js-backup.zip

Windows:

js-export.bat --everything --output-zip js-backup.zip

Onde –everything diz que tudo será exportado, –output-zip indica que o formato de saída será um arquivo compactado e js-backup.zip é o arquivo de saída.

obs.: Os scripts citados estão no diretório <JASPERSERVER_HOME>/scripts

Para exportar apenas um ou N repositórios, basta usar a opção –uris.

Linux:

js-export.sh --uris /reports/samples,/reports/cms --output-zip js-backup.zip

Windows:

js-export.bat --uris /reports/samples,/reports/cms --output-zip js-backup.zip

Para importar os dados, execute o js-import:

Linux:

js-import.sh --input-zip js-backup.zip

Windows:

js-import.bat --input-zip js-backup.zip

Se o repositório já existir, use a opção –update.

Não se desespere se aparecer um erro do tipo:
blábláblá bundles.jsexceptions_messages, locale pt_BR blábláblá
jsexception.folder.details.not.found

ou ainda:
blábláblá jsexception.uri.not.found

Fique calmo, provavelmente foi um erro de digitação no js-export. Cuidado com as “/” e com as letras maiúsculas e minúsculas. Ao informar o caminho para o repositório, coloque extamente o caminho apresentado no JasperServer.

Abraços e até o próximo post.

Listando conteúdo de um arquivo sem repetição usando cat + sed + sort

Hoje precisei fazer um parse em um arquivo de configuração de um script de backup de bases de dados MySQL. O arquivo tem os dados de acesso de vários bancos, organizados por linha e estruturado da seguinte forma:

servidor porta banco usuario senha

O objetivo de fazer o parse nesse arquivo era de recuperar as duas primeiras colunas (servidor e porta) para formar o path de onde os arquivos sql estão armazenados, já que o dump é feito de acordo com o servidor, instância (porta) e período (mês-ano). Um caminho válido seria:
/media/servidor.com.br/3306/09-2009.

Meu problema é que existem várias entradas para a mesma instância do MySQL (Servidor/Porta) e precisava de um lista sem duplicidade, como num SELECT DISTINCT.
Para resolver o problema basta usar a linha de comando:

cat arquivo | sed -e 's/\(.*\) \(.*\) \(.*\) \(.*\) \(.*\)/\1\/\2/' | sort -u

Mas o que diabos isso ai faz? De uma forma bem resumida, o comando acima realiza a leitura do arquivo e passa a saída via pipe para o sed. O sed por sua vez, divide os dados em cinco colunas (cada \(.*\) representa uma coluna) e retorna como saída apenas as duas primeiras (servidor e porta no sed é o trecho /\1\/\2/) e passa o resultado para o comando sort. O sort é que faz a “mágica” do DISTINCT, sort -u exibe apenas as linhas únicas :p

Problema resolvido, mais uma batalha vencida 😀

Abrasss

Perl + DBI + MySQL

Essa semana precisei criar alguns scripts de migração e estatística de dados em bases MySQL. Esse tipo de problema é bem a area do Perl e Python. Ambos tem uma boa performance em tratamento de dados principalmente arquivos.

Vou tentar explicar como instalar os recursos necessários para fazer uma aplicação em Perl que possa manipular bases de dados em MySQL.

DBI

O DBI é uma interface de acesso e manipulação de dados. Funciona como uma camada entre o script perl e o driver especifico de um SGBD. Com o DBI não é necessário saber a API  de cada SGBD ( Oracle, MySQL, PostgreSQL, etc ). Quando um métido da interface é invocado, a ação é transferida para o driver especifico de forma transparente para o usuário final.

Vamo fazer o troço funcionar.

INGREDIENTES

  • Internet
  • Perl ou ActivePerl ( Caso seja usuário Windows )
  • Teclado

INSTALANDO

Vá até o shell ou prompt de comando e digite:

ppm install DBI

ppm install DBD-mysql

Pronto, agora é só incluir o modulo DBI e já está pronto para usar.

use strict;
use warnings;
use DBI;

my $conexao = DBI->connect('DBI:mysql:database=meu_banco;host=servidor;port=3306','usuario','senha');

É isso ai … a documentação está aqui: http://search.cpan.org/~timb/DBI/DBI.pm
divirtam-se!

Acentuação no Firefox, Firebird, etc / – Teclado Layout Americano

O firefox no meu notebook insistia em não exibir corretamento o “ç” … exibia um “c” com um acento agudo … nem sei simular essa aberração kkkkkkk. Ok, pesquisando por ai encontrei a solução:

Basta editar o arquivo /etc/profile.d/gtk+.sh adicionando a linha: export GTK_IM_MODULE=xim

Como você pode perceber, o problema era no GTK. Variável de ambiente criada, problema resolvido. Basta reiniciar e enjoy.

obs.: Set o arquivo como executável  se ele não estiver: chmod +x /etc/profile.d/gtk+.sh

Abraços

hda intel realtek alc861-vd + Slackware 12.1 ll – O Regresso

Se você leu esse post: Audio HDA INTEL Realtek ALC861-VD + Linux (Slackware 12), seguiu a receita a risca e bolo saiu solado … não se desespere. Ainda há esperança :D.

Os sintomas são os mesmos … tudo parece estar funcionando bem, exceto pelo som que insiste em não sair.

Adicione seu usuário ao grupo “audio” e pronto … problema resolvido 😀

Tutorial básico de shell script

Hoje eu precisei criar um pequeno script shell para realizar algumas configurações de um software que desenvolvi e ai me lembrei que a um tempo atrás, quando eu ainda estava na faculdade ( putz, faz trocentos anos isso ), fiz um tutorial básicão para mexer com shell script e acabei não disponibilizando isso .. não lembro bem porque. Bom desenterrei ele e vou postar ele aqui.

1 – Introdução
2 – Estrutura Básica
3 – Váriáveis
4 – Aspas simples, Aspas duplas e Crase
5 – O Comando Echo
6 – Expressões
7 – O Comando if
8 – Laço condicional While
9 – For
10- Case
11- Finalizando
12- Fonte de Pesquisa e Recomendação de leitura

1 – Introdução

Shell Script são programas interpretados por programas conhecidos como Shell.
A Shell é o elo de ligação entre o usuário e o Sistema. A shell é responsável por
interpretar os comandos passados pelo usuário.
Os Shell Scripts são largamente utilizados para automatizar tarefas administrativas
e simplificar ações dirárias como por exemplo efetuar um backup, mapear unidades de
rede samba, limpar diretório temporários etc.
Nesse artigo, iremos trabalhar com a shell bash, mas fique a vontade para trabalhar
com a shell que mas lhe agrade.

2 – Estrutura Básica

Todo shell script deve começar com uma instrução tipo #!/bin/bash. Essa instrução indica
quem é o programa responsável por interpretar os camandos contidos no script.
Caso o script fosse escrito em KSH, por exemplo, a linha ficaria #!/bin/ksh. Isso também
acontece em outras linguagens de programação interpretada tais como perl
(#!/bin/perl). Em seguida vem a sequencia de comandos que se deseja executar.
O caracter # é o caracter de comentário de linha (exceto na primeira instrução mencionada acima).
Tudo que estiver após o caracter # é ignorado pelo interpretador até que o caracter de fim de linha
seja encontrado.
Ex.:

#!/bin/bash
# Exemplo classico do alo mundo
echo “Alo Mundo”

Para que seu script possa ser executado, você tem que torna-lo executável com o comando chmod:
user@linuxbox:/$ chmod a+x meu_script

3 – Variáveis

3.1 – Declarando váriaveis

As variáveis em shell Script são declaradas implicitamente. para se declarar a variável, basta
atribuir-lhe um valor.
Ex.:

#!/bin/bash
var1=’Minha primeira variavel’

Para se referir a uma variavel dentro do script, é necessário usar o caracter $ antes do nome
da mesma. Assim você está se referindo ao conteudo da variavel.
Para se atribuir valores a variável o caracter $ não é utilizado
Ex.:

#!/bin/bash
var1=”Minha primeira variavel” #Atribuindo valor
echo $var1                     #Se referindo ao conteúdo da variável

3.2 – Recebendo entradas externas

O comando Read faz com que variaveis possam receber entradas do usuário.
Quando o script encontra um comando Read, ele para sua execução e aguarda
que o usuário informe os dados e tecle enter, para concluir a operação.
Ex.:

#!/bin/bash
Read nome
Echo “Meu nome é $nome”

3.3 – Variáveis passadas por parâmentro de linha de comando

As variáveis passadas por linha de comando, podem ser acessadas pelo número referente a posição em que
ela se encontrava quando foi passada. A variável $0 se refere ao nome do programa, $1 ao primeiro
parâmentro e assim por diante.
Ex.:

user@linuxbox:/$ meu_script.sh parametro1 parametro2
Sendo que:
$0 = meu_script.sh
$1 = parametro1
$2 = parametro2

A quantidade de parâmetros passados para o script (equivalente ao argc do C) fica armazenado
na variável $#.
Ex.:

#!/bin/bash
echo “Foram passados “$#” parâmetros”

4 – Aspas simples, Aspas duplas e Crase

Há muita diferença entre eles. A função da Aspas Simples é a de assumir a string sem que nada
seja processado. Já com as Aspas Duplas, as variáveis são processados dentro da string.
A Crase processam COMANDOS e adcionam à string, a resposta do mesmo.
Ex:
var = ‘Olá, eu sou $USER’
O Conteúdo de var é: Olá, eu sou $USER – A variavel $USER não foi processado. Tudo que
se encontra dentro das aspas simples é entendido literalmente.

var = “Olá, eu sou $USER”
Agora var contém: Olá, eu sou root – A variavel $USER agora vai devidamente processada e
seu valor passado para string.

var = “Eu agora estou em: `pwd`”
A Crase passa a saida de pwd para a string.
O conteúdo de var ficou: Eu agora estou em: /etc/rc.d

5 – O Comando Echo

A finalidade do comando Echo é exibir informações, que vão desde simples strings até uma mescla de
strings e variaveis e passar o cursor para a proxima linha. É bem similar ao puts() do C.

Ex.:

#!/bin/bash
var1=”Fernando”
echo “Aews $var1”

O Resultado será: Aewz Fernando

6 – Expressões

O comando Expr, informa o script que a proxima instrução se trata de uma expressão.
O formato de uma expressão é algo do tipo: expr $var “+” 1 ou `expr $var + 1`
Ex.:

#!/bin/bash
Echo “Digite um numero”
read num1
echo “Digite outro numero”
read num2
echo “`expr $num1 + $num2`”

7 – O comando if

O comando if, como você já deve saber, executa determinados comandos caso a expressão
em questão seja verdadeira. Acontece que uma expressão verdadeira para ele não é como
da forma que agente está acostumado. Uma condição no if é sempre um comando e todo comando
tem uma saida. Normalmente, quando a saida é 0, significa que o comando foi concluido
com sucesso. Valores superiores a 0, normalmente significam que algo de errado aconteceu,
logo, 0 significa verdadeiro para o if e 1 falso.
Um if normalmente é seguido do comando test.
Ex.:

if rm /etc/teste.txt; then
echo “Arquivo excluido”
fi

No bloco if acima, o comando rm é executado e o valor de retorno é passado para o if.
Caso rm termine sem problemas, 0 é retornado e a condição se torna verdadeira.

if test “a” = “a”; then
echo “Igual”
else
echo “Diferentes”
fi

Na instrução acima, o comando test retorna 0, pois “a” = “a”. Para entender melhor
o funcionamento do comando test vá a linha de comando e execute-o, para saber o que ele
retornou basta recorrer a variavel de ambiente $? que armazena a saida do ultimo comando.
Ex.:

user@linuxbox:/$ test “a” = “a”
user@linuxbox:/$ echo $?
0
user@linuxbox:/$ test “a” = “b”
user@linuxbox:/$ echo $?
1

Segue abaixo alguns dos parametros do comando test:

-b arquivo – Verdadeiro se arquivo é um arquivo de bloco, como /dev/hda.
-c arquivo – Verdadeiro se arquivo é um arquivo de caracter, como /dev/tty1.
-d arquivo – Verdadeiro se arquivo é um diretório.
-e arquivo – Verdadeiro se arquivo existe.
-f arquivo – Verdadeiro se arquivo existe e é um arquivo comum.
-s arquivo – Verdadeiro se arquivo existe e não é vazio.
-h arquivo – Verdadeiro se arquivo é um link simbólico.
-p arquivo – Verdadeiro se arquivo é um “named pipe” (fifo, lifo, etc).
-S arquivo – Verdadeiro se arquivo é um “socket”.
-k arquivo – Verdadeiro se arquivo tem seu “sticky bit” ligado.
-r arquivo – Verdadeiro se arquivo pode ser lido pelo usuário atual.
-w arquivo – Verdadeiro se arquivo pode ser escrito pelo usuário atual.
-x arquivo – Verdadeiro se arquivo pode ser executado pelo usuário atual.
-O arquivo – Verdadeiro se arquivo pertence ao usuário atual.
-G arquivo – Verdadeiro se arquivo pertence ao grupo do usuário atual.
-N arquivo – Verdadeiro se arquivo foi modificado desde a ultima vez que foi lido.
-eq (equal): Igual;
-ne (not-equal): Não Igual (diferente);
-lt (less than): Menor que (<);
-le (less than or equal): Menor ou igual ( <= );
-gt (greater than): Maior que (>);
-ge (greater than or equal): Maior ou igual (>=);

Test pode ser substituido por [], tornando o código mais legivél.
Ex.:

if [“a” = “a”];then
echo “Igual”
else
echo “diferente”
fi

8 – Laço condicional While

O Comando while, como o nome diz, executa um bloco de instruções enquanto uma
condição for verdadeira. O tratamento de expressões é feita da mesma forma que
acontece com o comando if.
Ex.:

cont = 0
while [$cont -ne 10]; do
echo $cont;
cont = expr $cont “+” 1;
done;

9 – For

for {variavel} in {lista} [lista]*;
do
comandos..
done;

O comando For executa um bloco de instruções até que a lista de elemntos termine.
a variavel é associada a cada elemento da lista e então o bloco de comandos é executado
a cada vez que a variavel é associada.
Ex.:

for arquivo in rc.local rc.M rc.httpd;
do
echo $arquivo
done;

A saida será:
rc.local
rc.M
rc.httpd

10 – Case

Um das intruções mais utilizadas em Shell Script. O Case funciona de maneira bem
similar ao if. Na verdade uma sequencia de ifs aninhados.
Ele é muito usado para checar parametros de linha de comando para realizar operações
com daemons (startar, restartar, parar daemons).
Ex.: – retirado do site Olinux

case “$1” in

‘start’ )
echo “Iniciando o serviço…”
<comandos para iniciar o serviço>
;;
‘restart’ )
echo “Reinicializando o serviço…”
<comandos para reinicializar o serviço>
;;
‘stop’ )
echo “Parando o serviço…”
<comandos para parar o serviço>
;;
*)
echo “Opção invalida!”
echo “As opções válidas são:
start,   stop   e   restart”
;;
esac

11- Finalizando

Espero ter ajudado a passar um pouco sobre o poder dos shell scripts.
Qualquer dúvida, sugestão, correção etc… manda uma email.
flw, Abraços, T+

12- Fonte de Pesquisa e Recomendação de leitura

http://www.olinux.com.br
http://tlm.conectiva.com.br/shell_script/
http://thobias.org/doc/cgi_shell.html
http://thobias.org/doc/shell_bd.html
http://www.vivaolinux.com.br