Dia de São João (e pra mim, Dia da Música)

Hoje é dia de São João Batista. Não sou católico, quiçá religioso, mas vale aqui um agradecimento ao santo que deu origem às notas musicais, mesmo que indiretamente. Aprendi isso com os padres, e a história é até bonitinha, então eu decidi escrever.

Um frade italiano, Guido d’Arezzo, usou as seis sílabas iniciais de um poema em homenagem ao referido santo para dar nome às primeiras notas. Segue:

Ut queant laxis,
Resonare fibris,
Mira gestorum,
Famuli tuorum,
Solve polluti,
Labii reatum.

Mais tarde foi incluída a nota Si, uma abreviação de “Sante Iohannes”, e substituído o Ut pelo Dó (solfejar ‘Ut’ era incômodo).

O poema, traduzido, diz: “Para que os teus servos possam cantar as maravilhas dos teus atos admiráveis, absolve as faltas dos seus lábios impuros”.

Então, Feliz Dia de São João pra todo mundo, já que, como bem dizia Frank Zappa, “sem música para decorar, tempo é só a monotonia de prazos de entrega e contas a pagar”.

E boa semana 🙂

Anúncios

Configuração Log4J + Spring

Um post individualista – só pra eu não esquecer disso mais uma maldita vez.

Insira isso aqui no web.xml e pronto, o Log4J vai fazer o append das operações gerenciadas pelo Spring também.

<context-param>
<param-name>log4jConfigLocation></param-name>
<param-value>/WEB-INF/log4j.properties></param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

De nada.

JBoss Forge – Projeto Exemplo JSF / CDI / Connection Pool / Scaffolding / I18N

O título já fala praticamente tudo sobre o post. O que faremos aqui é utilizar o JBoss Forge para a geração de:

– Projeto Web padrão JavaEE;
– JSF;
– CDI (Context and Dependency Injection);
– Connection Pool para o MySQL com GlassFish 3.1.2;
– Scaffolding para uma entidade simples.

O que você precisa ter instalado de antemão (com as variáveis de ambiente devidamente configuradas):
– Apache Maven: http://maven.apache.org/download.html (a página tem as instruções todas);
– JBoss Forge: https://docs.jboss.org/author/display/FORGE/Installation
– Glassfish Community: http://glassfish.java.net/public/downloadsindex.html#top
– Plugin do Glassfish configurado no Eclipse
– Driver JDBC do MySQL: http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.22.tar.gz
– Um schema no MySQL com o nome que você definir. Não, não precisa criar tabela nenhuma.

Vamos parar com o trelelê e gerar logo esse negócio, antes que acabe o horário de almoço aqui na empresa e eu me arrependa de ter começado o post, post esse que já ando postergando há milênios.

1º passo: O Pool no GlassFish:
– Coloque o driver JDBC do MySQL na pasta lib do GlassFish; no meu caso aqui: /home/leonardo/Tools/servers/glassfish3/glassfish/lib;
– Não vou perder tempo explicando como faz a configuração em si, porquê ela é ridícula de simples; na dúvida, Pai-Google-de-Logum-Edê lhe responde, mizinfí: http://rafaelomarques.wordpress.com/2011/01/31/configurando-pool-de-conexoes-com-mysql-e-glassfish-v3/
– Batize o JDBC Resource de jdbc/ProjetoExemplo

2º passo: O projeto no Forge:
Abra o forge (no terminal: forge; no prompt do windows: forge; no mac: sou pobre, não faço ideia);
Crie o novo projeto, de nome ProjetoExemplo, com o pacote base br.com.develoraptor e o nome final de ProjetoExemplo; o forge vai pedir confirmação pra criar a pasta. Você sabe o que fazer (eu espero).

new-project --named ProjetoExemplo --type war --topLevelPackage br.com.develoraptor --finalName ProjetoExemplo

Projeto criado, ok. Agora vamos configurar o danado pra se entender com o JSF e o CDI. Há um plugin pro primefaces, mas eu já testei e te garanto: não funciona. É completamente bugado e não vale o uso. Então vamos com o padrão, que é mais jogo.
O forge vai pedir confirmação pra instalação das libs. O asterisco que aparece nas opções é sempre a versão mais atual, e é a padrão. Use a mais atual, por favor. Vai ser melhor pra você, confia no tio.

scaffold setup --scaffoldType faces

Configurando a internacionalização (I18N para os íntimos – e preguiçosos)

i18n setup --bundleName messages

E adicionando um bundle pro locale pt_BR, porquê eu sou patriota

i18n add-locale --locale pt_BR

Vamos configurar a persistência decentemente, agora, apontando pro nosso pool pré-configurado

persistence setup --provider HIBERNATE --container GLASSFISH_3 --jndiDataSource jdbc/ProjetoExemplo

Criamos, então, a entidade Usuario, que vamos usar como exemplo. O forge é tão simpático que já lhe oferece o pacote “model” como destino da entidade nova.

entity --named Usuario --idStrategy AUTO

Criamos o campo ‘nome’ e o campo ‘dataNascimento’ pra essa entidade

field string --named nome
field temporal --type DATE --named dataNascimento

Criamos, então, as telas do CRUD desta entidade. OPCIONAL, claro, já que ninguém com cérebro usa scaffold em produção

scaffold from-entity br.com.develoraptor.model.Usuario

3º passo: A importação para o Eclipse (porquê uma hora você ia ter que trabalhar de verdade)
Ainda no forge, transforme esse negócio aí num projeto do Eclipse:

mvn eclipse:eclipse

Agora, importe esse projeto pro Eclipse.

File > Import > Existing Projects Into Workspace

Aqui a porca torce o rabo. Por algum motivo, esse projeto não vem como projeto Maven pra dentro do Eclipse. Daí é bem difícil de resolver:

Botão direito no projeto > Configure > Convert to Maven Project

Além disso, as dependências do Hibernate no pom.xml não estão configuradas para serem incluídas no build, e sim para estarem já publicadas no Glassfish. Assim, você tem duas opções: baixar manualmente e colocá-las na pasta lib do Glassfish OU alterar isso no pom, excluindo a linha do <scope>provided</scope> para os seguintes artefatos:

<artifactId>hibernate-entitymanager</artifactId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<artifactId>hibernate-entitymanager</artifactId>

4º passo: Execução, o Gran Finale
Execute o rapaz com o Glassfish:

Botão direito no projeto > Run as > Run on Server > Glassfish

5º passo: FUN FUN FUN
O CRUD você sabe usar. Uns screenshots aqui, só pra ninguém dizer que é mentira minha que funciona.

Este slideshow necessita de JavaScript.

O scaffold (essa geração de telas) é completamente opcional. O ‘scaffold setup’ executado após a criação do projeto não é; ela define os facets do projeto. Infelizmente a documentação do forge é pobre feito um mendigo de porta de igreja, então muita coisa é na base da tentativa e (muito) erro.

Dúvidas, tente os comentários e/ou use o google (apesar de que, pro Forge, infelizmente ele não ajuda muito).

Rakarrack – Processador de Efeitos para Guitarra no Ubuntu

Há tempos eu andava querendo fazer umas gravações de áudio, testar uns efeitos novos com a guitarra e tudo mais, mas a preguiça não deixava. A preguiça e a falta de um adaptador P10->P2, agora devidamente emprestado de um amigo até a Eletrônica Yama decidir abrir no horário de almoço (leia-se: nunca; perdeu, Elton!).

Aí, pra encher uma linguiça aqui no blog eu decidi explicar como fazer funcionar esta merda coisa linda de deus que é o Rakarrack. Funciona bem, acredite.

Passo 1: Instalação do Rakarrack
Me nego a dar muita explicação. Abra o Ubuntu Software Center e instale o programa; ele já vai instalar todas as dependências (inclusive o QJackCtl, de quem eu vou falar daqui a pouco).

Passo 1

Ignore o “Remove”; vai aparecer “Install”, eu juro!

Pra tranquilizar os mais desconfiados: você está conectando uma guitarra no seu micro, que vai passar por uma placa de som (onboard ou não), terá a entrada processada por um processador (jura?) de efeitos e só então terá uma saída. O delay é praticamente inevitável. O passo 2 e o 3 que faremos adiante servem pra evitar este delay. Se a sua máquina não for uma grande porcaria, ele vai sumir; caso contrário, vai ficar um pouquinho atrasado (milissegundos, nada que atrapalhe o músico amador).

Passo 2: Configuração do QJackCtl
Aqui começa a magia do negócio. O QJackCtl é o cara que vai controlar as conexões de áudio de hardware e dos softwares que as utilizam; ou seja, ele é o middleware responsável por dizer que a entrada de microfone ou line-in do teu micro vai ser a entrada do Rakarakk, e que tuas caixas de som serão a saída dele. Abra o QJackCtl, clique em Setup, e na aba “Settings” garanta que o parâmetro Realtime esteja ativo.
Passo 2

Assim, oh!

Passo 3: Edição do arquivo limits.conf
Abra o arquivo (como super user) /etc/security/limits.conf e inclua, quase no fim do arquivo (você vai saber onde, confie em mim) as duas linhas abaixo:

@audio    -    rtprio    100
@audio    -    nice      -10

Passo 4: Quem que liga o que no que e aonde?
Lembra que eu falei que o QJackCtl era o cara que diz quem que liga o que no que e aonde? Se você não lembra, clique aqui e volte ao passo 2. Se lembra, ignore minha piada sem graça e plugue sua guitarra no Line-In ou Mic do seu PC. Como? Com isso:

O plug que roubei do Elton. Recicle: não compre um novo, roube um também.

Abra também o Rakarrack. No QJackCtl, clique em Connect… e faça os ajustes necessários pra que a sua configuração fique assim:

Passo 4

Meu micro tem entrada dianteira e traseira (ui!). Se o seu PC for menos sexualmente liberal que o meu, haverá uma só configuração pra cada device.

Passo 5: A diversão!
Com o Rakarrack já aberto, aperte o FX On e abandone o Guitar Hero que papai lhe deu de natal. Um screenshot, pra ninguém dizer que eu não avisei que ele não é lá muito bonito:

É igual a trator: pra passear é uma merda, mas pro trabalho é um espetáculo!

O site oficial do bichinho é feio de dar pena, mas tem bons tutoriais pra ir se acostumando com os efeitos. Pra brincar com os efeitos, escolher um pedal novo, fazer uma gravação sem ter que montar aquela pedaleira que mais parece um piano, não tem coisa melhor.

E tá bom pra hoje. Inté! o/

Bug Eclipse – Erro ao carregar web.xml

Eis que me deparo com essa mensagem ao fazer o checkout do projeto:

An internal error occurred during: “Loading descriptor for <your_project>”.
org.eclipse.emf.ecore.xmi.FeatureNotFoundException: Feature ‘tablig-location’ not found.
(platform:/resource/<your_project>/src/main/webapp/WEB-INF/web.xml, <line>, <column>)

“Tudo bem, é só jogar a mensagem no google e vou ter uma solução!”

Eis que vejo isso: https://bugs.eclipse.org/bugs/show_bug.cgi?id=198630

Bug fechado pela própria equipe do Eclipse como “não reproduzível”. Fora, claro, uma série de posts inúteis discutindo se era ou não um bug, se devia ou não ser lançada correção durante aquela major version, ou se deveria aguardar a próxima e de quem era a culpa.

Enfim, eu achei a solução. O problema não é com o arquivo, sequer com o Eclipse propriamente dito: é com o XML Editor. (Léo, você quis dizer o XML Validator) – Não, é o XML Editor mesmo. O validador utiliza a mesma engine do editor para validar o conteúdo. Como há um erro na Engine, ANTES de abrir o arquivo (ao fazer o import, no caso), ele corrompe o arquivo.

A solução é cretinamente simples:

  • Copie o conteúdo do arquivo e salve num novo arquivo, algo como web.txt;
  • Exclua o web.xml;
  • Renomeie o arquivo para web.txt para web.xml.

Sorria e seja feliz.

Duas lições, portanto:

  1.  A solução mais simples nem sempre é deselegante, às vezes ela te atende que é uma beleza e você não deve perder mais tempo procurando pêlo em ovo;
  2.  Quando há um bug, problema, incidente, qualquer coisa: FOCO. Atenda o cliente. O Eclipse é open-source, é uma obrigação inclusive minha, que uso, tentar solucionar o problema; mas serve de lição: discutir sexo dos anjos no bugtracker não vai trazer solução alguma.