Busca Google
Erro ao parar o Timidity++
Mudei minha distro e estou usando o Gentoo. Fazia tempo que não usava o gentoo, desde 2005. Resolvi instalar no meu note e apesar de demorar um pouco, consegui deixá-lo redondinho.
Recentemente, descobri um erro na instalação do Timidity++. Após instalá-lo e tocar um midi com sucesso, ao desligar o computador recebi a seguinte mensagem:
* Stopping TiMidity++ ... * start-stop-daemon: no matching processes found
Resolvi investigar. O arquivo de inicialização: /etc/init.d/timidity possui o seguinte conteúdo:
#!/sbin/runscript
depend() {
after alsasound esound
}
start() {
ebegin "Starting TiMidity++ Virtual Midi Sequencer"
test -n "$TIMIDITY_PCM_NAME" && export TIMIDITY_PCM_NAME
start-stop-daemon --start --background --chdir /usr/share/timidity \
--user timidity --group audio --make-pidfile --pidfile /var/run/timidity.pid \
--exec /usr/bin/timidity -- -iA ${TIMIDITY_OPTS}
eend $?
}
stop() {
ebegin "Stopping TiMidity++"
start-stop-daemon --stop --quiet --pidfile /var/run/timidity.pid
eend $?
}
O que me chamou a atenção foi a linha 11. Primeiro motivo pelo usuário que não tenho (timidity) e segundo motivo pelo arquivo de PID (identificador do processo). Olhei o arquivo /var/run/timidity.pid e verifiquei que o processo com o número especificado não existia. Ou seja, o daemon do timidity não estava sendo executado. Resolvi alterar o usuário de execução (–user timidity) pelo meu: “– user thiago”. Dessa forma o problema foi resolvido. Uma outra possível solução seria criar o usuário timidity. Espero que ajude alguém.
Google+Total de linhas em um arquivo
No Java existe uma classe que mantém o controle do número de linhas em um arquivo: a classe LineNumberReader. Ela possui o método getLineNumber que é incrementado a cada quebra de linha em um arquivo. Com isso em mente há uma forma elegante de se contar a quantidade de linhas em um arquivo:
LineNumberReader lnr = new LineNumberReader(new FileReader(file)); lnr.skip(Long.MAX_VALUE); int retorno = lnr.getLineNumber();
É só utilizar a classe LineNumberReader (linha 1) e navegar até o fim do arquivo com o método skip. Após essas operações o método getLineNumber irá retornar a quantidade de linhas.
Google+Cursos e Patrocínio
Olá Pessoal!
A Trainning está nos patrocinando e oferecendo vários cursos com desconto para os leitores desse blog. A Trainning é uma escola de treinamentos de TI e de Governança de Projetos, que possui sua sede em São Paulo e filiais espalhadas em diversas capitais do Brasil. Se você tem interesse em fazer algum dos vários cursos disponíveis é só informar que você é leitor do meu blog que irá ganhar 5% de desconto.
Alguns cursos oferecidos são:
- Governança de TI, ITIL, COBIT
- Curso Cisco
- Curso SAP
- iPhone ou Android
- Formação Oracle
- Cursos BPM & BPMN
- Cursos PMI, PMP
- VMWare e Virtualização
- Cursos Java
- Curso Excel
Essa promoção vale para qualquer curso da Trainning, basta informar que você lê o meu blog. Eu vou fazer um curso de ITIL e vou avaliar para vocês como é a Trainning. Qualquer dúvida é só avisar!
Descobrindo a versão do seu bytecode.
Em algumas situações temos o seguinte erro:
java.lang.IncompatibleClassChangeError: Implementing class
ou
java.lang.UnsupportedClassVersionError: XXXX: Unsupported major.minor version XX.X
Isso ocorre quando a versão do aplicativo foi compilada (javac) em uma versão superior à máquina virtual (java) que está sendo executada. Para descobrir a versão do seu .class, você pode executar o seguinte código:
String file = "/caminho/do/seu/Arquivo.class";
try (DataInputStream is = new DataInputStream(new FileInputStream(file))) {
is.readInt(); // Magic Number = 0xCAFEBABE
int minorVersion = is.readUnsignedShort();
int majorVersion = is.readUnsignedShort();
System.out.println(majorVersion + "." + minorVersion));
} catch (IOException e) {
e.printStackTrace();
}
Nesse código estamos lendo um arquivo .class. O primeiro integer do arquivo é o número mágico dele, que se for um arquivo .class é 0xCAFEBABE. O próximo dado, que é um short sem sinal, contém a versão secundária da versão do compilador utilizada e o segundo short a versão principal.
As saídas podem ser as seguintes:
- Java 1.0 ou Java 1.1: 45.3
- Java 1.2: 46.0
- Java 1.3: 47.0
- Java 1.4: 48.0
- Java 5: 49.0
- Java 6: 50.0
- Java 7: 51.0
Com isso é só executar o comando java -version, para obter a versão da máquina virtual e verificar se o .class é compatível com a máquina virtual. Caso não seja, será necessário trocar para uma versão mais recente ou recompilar o binário para a versão correta.
Google+Botão Animado em LWUIT – Ginga
Atendendo a pedidos, segue o código do componente para animação de botões para LWUIT – Ginga-J.
package org.gvlabs.sbtvd.ui;
import com.sun.dtv.lwuit.Button;
import com.sun.dtv.lwuit.Graphics;
import com.sun.dtv.lwuit.Image;
/**
* Animated Button
*
* @author Thiago Galbiatti Vespa
* @version 1.0
*/
public class AnimatedButton extends Button {
private int speed = 50;
private Image[] animaImgs;
private int currentImage = 0;
private long lastInvoke;
private boolean forward = true;
private boolean backAndForth = true;
private boolean loop = true;
private boolean disableLoop = false;
/**
* Default constructor
*/
public AnimatedButton() {
}
/**
* Get array of images
* @return array of images
*/
public Image[] getAnimaImgs() {
return animaImgs;
}
/**
* Set array of images to be animated
* @param animaImgs array of images
*/
public void setAnimaImgs(Image[] animaImgs) {
this.animaImgs = animaImgs;
if (animaImgs != null && animaImgs.length > 0) {
this.setIcon(animaImgs[0]);
}
}
/**
* Get animation speed is ms
* @return animation speed
*/
public int getSpeed() {
return speed;
}
/**
* Set animation speed in ms
* @param speed animation speed
*/
public void setSpeed(int speed) {
this.speed = speed;
}
/**
* Back and Forth animation
* @return true if is a back and forth animation
*/
public boolean isBackAndForth() {
return backAndForth;
}
/**
* Set back and forth animation value
* @param backAndForth
*/
public void setBackAndForth(boolean backAndForth) {
this.backAndForth = backAndForth;
}
/**
* Is loop?
* @return true if is a loop animation
*/
public boolean isLoop() {
return loop;
}
/**
* true = loop, false = one animation
* @param loop
*/
public void setLoop(boolean loop) {
this.loop = loop;
}
public boolean animate() {
if (disableLoop)
return false;
long current = System.currentTimeMillis();
if (current - lastInvoke > speed) {
lastInvoke = current;
if (forward) {
currentImage++;
} else {
currentImage--;
}
if (currentImage >= animaImgs.length) {
if (!loop) {
disableLoop = true;
return false;
} else if (!backAndForth) {
forward = true;
currentImage = 0;
} else {
forward = false;
currentImage = animaImgs.length - 1;
}
} else if (currentImage < 0) {
forward = true;
currentImage = 0;
}
return true;
}
return false;
}
/* (non-Javadoc)
* @see com.sun.dtv.lwuit.Button#paint(com.sun.dtv.lwuit.Graphics)
*/
public void paint(Graphics g) {
g.drawImage(animaImgs[currentImage], getX(), getY());
}
}
Para utilizar é só atribuir o conjunto de imagens para o método setAnimaImgs e registrar a animação no formulário, por exemplo: form.registerAnimation(animatedButton);
Google+Lendo o MANIFEST.MF em tempo de execução
Para ler o arquivo MANIFEST.MF em tempo de execução que se localiza dentro de um JAR é só executar o seguinte código passando o caminho para a variável jarFile:
try (InputStream stream = new BufferedInputStream(new FileInputStream(
jarFile));
JarFile jar = new JarFile(stream)) {
Manifest mf = jar.getManifest();
Map<String, Attributes> entries = mf.getEntries();
// Realizar operações
}
No Map entries, você terá os atributos do arquivo MANIFEST.MF e no mf.getMainAttributes() você tem os atributos principais.
Google+Programando em C/C++ com Eclipse
Para programar em C/C++ com o eclipse utilizamos o plugin CDT. A instalação dele é simples. Abra o Eclipse, vá em Help, Install New Software. Escolha no Combo “Work With” o update site de sua versão de eclipse e marque o checkbox Programming Languages, C/C++ Development Tools.
Clique em Next, Next, concorde com os termos e clique em Finish. Reinicie caso solicitado. Ao selecionar, File, New, Other, você deverá ter a opção de criar um projeto C/C++.
Agora é só se aventurar com C/C++.
Google+Preferências no SOA Suite
Em algumas situações, no BPEL com SOA Suite, precisamos recuperar/alterar dados em tempo de execução sem ser necessário refazer e re-implantar a aplicação. Para resolver esse problema, o recurso de preferências vem bem a calhar. No JDeveloper, para o Oracle SOA Suite 11g, abra o composite.xml do seu projeto, selecione o componente BPEL e na janela de propriedades (Property Inspector – Ctrl+Shift+I) adicione uma propriedade nova com o nome bpel.preference.<Nome da propriedade>:
O código do composite.xml deve ter uma parte parecida com essa:
<component name="PrefsBPELProcess" version="2.0">
<implementation.bpel src="PrefsBPELProcess.bpel"/>
<property name="bpel.config.transaction" type="xs:string" many="false">required</property>
<property name="bpel.preference.nome" type="xs:string" many="false"
override="may">Sem Nome</property>
</component>
««« Clique aqui para ler o restante do conteúdo: Preferências no SOA Suite »»»
Google+Palestra Campus Party 6 – 2013
Conforme prometido, segue o link da minha palestra.
Em breves coloco o link do vídeo e disponibilizo a aplicação no github. Muito obrigado pessoal!
Atualização 07/02/2013: Segue o vídeo:
Mensagens de Erro no Emulador Astrobox
Para resolver a seguinte mensagem no emulador Astrobox:
Logger was not initialized. GeneralSettings: Could not load properties from file ./config/share.properties
É só executar o seguinte comando na máquina virtual do emulador:
touch /usr/bin/AstroBox/bin/config/share.properties
Dessa maneira a mensagem de erro irá sumir e os logs de erros serão exibidos no console. Após essa alteração, você deverá ter a seguinte saída:
Creating logger: LEVEL_ERROR
Problema resolvido!
Google+






