Busca 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.

Vale Desconto

Alguns cursos oferecidos são:

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.

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);

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.

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.

Available Software

Available Software

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++.

New

New

Agora é só se aventurar com C/C++.

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>:

Property Inspector

Property Inspector

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 »»»

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!

Botão animado com Ginga-J

Criei um componente para facilitar a exibições de botões animados com Ginga-J. É uma classe pequena onde você passa um array de imagens e adiciona no seu Form principal e ela anima essas imagens. A implementação é simples pois utiliza o framework de animação do LWUIT. Então é só criar uma classe que herda o botão do LWUIT e sobreescrever o método “animate” e “paint”:

««« Clique aqui para ler o restante do conteúdo: Botão animado com Ginga-J »»»

Hello World TV Digital com Java

Para desenvolver uma aplicaçãozinha para TV Digital Ginga-J é muito simples. Você só precisa conhecer bem alguns conceitos e o ciclo de vida da aplicação. E para começar nada melhor que um Hello World! Primeiramente vamos dar uma passada no ciclo de vida de um Xlet (Xlet é nossa aplicação de TV Digital com Java).

Ciclo de Vida

Ciclo de Vida


««« Clique aqui para ler o restante do conteúdo: Hello World TV Digital com Java »»»

Próxima Página »