Facebook Twitter Gplus RSS
 
 
formats

Suporte a Ruby on Rails descontinuado no NetBeans

Não tenho muito o que falar por nunca ter utilizado o NetBeans para esse propósito, mas é uma notícia triste para as pessoas que mantinham projetos RoR sobre essa IDE.

Em resumo, o fato foi devido a necessidade de priorizar o relase 7 (JDK 7), por ser o maior relase da plataforma,  e pela baixa utilização da IDE para projetos RoR.

Segue a fonte AQUI.

 
Tags: , ,
formats

Jquery: Grid Plugins

Published on January 20th, 2011 by in web

Quem já trabalhou com grids dinamicos na view, sabe da dificuldade que é trabalhar com uma série de eventos capturados via javascript, encaminhar via AJAX e manipular o conteúdo JASON para dar vida a sua solução. Olha que eu não falei da paginação. Realmente, é um saco.

JQuery surgiu para ajudar a quem utiliza JavaScript para em suas páginas. Sem dúvida, é uma excelente lib. Melhor ainda são seus incatalogáveis plugins, estão ai para uma série de soluções. Portanto, encontrei um site que catalogou os 15 melhores plugins para manipulação de tabelas.

Segue a dica e o link AQUI.

 
Tags: ,
formats

A Batalha do Apocalipse

Vou abrir mão dos assuntos de tecnologia e falar um pouco sobre um dos melhores livros que já li atualmente. Há muito tempo eu queria escrever alguma coisa coisa sobre esse livro depois que li mas nunca tive tempo. Portanto chegou a hora.

Pra quem acompanha o podcast do JovemNerd sabe de quem eu estou falando: Eduardo Spohr. Normalmente é o mais calado de todos quando se trata de assuntos engraçaralhos é o mais oportunista para as piadas de relance mas, depois do que eu li sua obra, vi que é um escritor bastante talentoso.


Na sua obra, A Batalha do Apocalipse, ele apresenta um mundo atual em um completo caos, dominado pela desordem dos humanos a ponto de uma catástrofe estar preste a acontecer. Desse ponto o título já diz tudo. Porém, o ponto principal está nos fatos históricos conhecidos pela humanidade que o protagonista da trama, o anjo caído Ablom, vivenciou desde sua queda, tornando-se renegado dos anjos celestes fadados a vagar na terra com um avatar humano. A queda da babilônia, descoberta dos seres da arcádia, peste, nascimento de Cristo, entre outros, são fatos vividos por Albom e sua misteriosa quadjunvante, a bruxa Shamira.

Pelo fato de gostar de religião, porém não ser um religioso, foi bem perceptível captar o conjunto de referências utilizadas para no livro. Os elementos bíblicos e conhecimentos relacionados a folclore e fantasia marcam presença no enredo da história como fator predominante em diversos momentos. Até mesmo elementos dos textos bíblicos que não estão na bíblia, como a personagem Lilith, que foi a primeira mulher de Adão, tem uma participação pequena mas de tremenda importância na história.

Existem alguns elementos no texto que, na minha opinião, deveriam estar presente no meio dessa trama. Se o autor adicionou um ponto bem conhecido pelos cristão, que foi o nascimento de e morte de Cristo, a queda de Lucifer, o Dilúvio e a queda de Babel acredito que ficaria interessante que fosse contado também momentos de Ablom com Maomé, o profeta Muçulmano. Não só isso, mas a descrição de momentos na segunda guerra também não ia ser demais.

Portanto, esse é um excelente texto que foi muito bem escrito e que merece destaque também no contexto internacional, olha que isso não é exagero. Já que em algumas livrarias esse livro está na estante de Literatura Internacional.

 
formats

Trabalhar com dois monitores é produtividade e não vaidade

Acompanho o blog Efetividade do Augusto Campos, especificamente a sessão HomeOffice, na maioria dos artigos é possível encontrar ilustrações de PCs com dois monitores, alguns com Windows e outros com Linux. Na maioria dos artigos que li a respeito sempre encontrava a palavra “produtividade” em todos os textos. O linux tem um conceito de mesas de trabalho ou desktops virtuais, isso ajuda bastante a organizar o ambiente de trabalho de acordo com o perfil ou o tipo de atividade que você esteja fazendo, quando você acostuma com essa facilidade é difícil tirar. Chega a ser frustrante quando estou em uma máquina com Windows e pressiono Ctr+Alt+→← e não muda de tela.

Nas fotos nos escritórios Google é normal encontrar pessoas trabalhando com dois monitores em seus pontos de trabalho. Levado pela empolgação resolvi experimentar. Tomei coragem e comprei um monitor de 22 polegadas LED que me saiu muito barato por ser produto de exposição. Em casa, compartilhei a tela com o meu notebook, que roda Unbuntu 10.04 e funcionou bem. Escolhi a opção de compartilhamento de tela com a resolução máxima e comecei a trabalhar.

A princípio, abri uma tela do Firefox e posicionei na tela do notebook, abri também o eclipse e deixei fullscrean no monitor. A percepção é de imediato. A cada evento que é executado no navegador é possível acompanhar as linhas de debug imediatamente. Isso pra mim foi de grande valia, já que, muitas vezes utilizava constantemente o Alt+Tab para passar as telas para verificar o que estava acontecendo. Pra quem gosta de incluir muitas informações no log e gosta de acompanhar, isso é um excelente investimento, é um luxo necessário. Seria interessante a adoção dessa abordagem nas empresas que desenvolvem software também, o ganho seria excelente, mas isso é outra história. Se tivermos os ambientes de trabalho do Google e Facebook como conceitos de comparação para o nosso dia-dia vamos sempre nos lamentar.

O Ubuntu, especificamente as versões mais novas, suporta esse tipo de configuração perfeitamente. Não precisei em nenhum momento editar arquivos de configuração. Porém, o suporte ao Compiz não funcionou tão bem para a configuração de junção de telas, o motivo ainda não sei. Mas, como na junção dos monitores o sistema possa conhecer os dois monitores como uma tela só, portanto, a resolução seja muito alta para suportar essa configuração. Quando solucionar esse problema deixarei a dica para a solução desse problema aqui.

 
formats

Dica de Leitura: Effective Java Second Edition

Published on January 5th, 2011 by in Book

Para quem quer se aprofundar na linguagem Java, segue uma importante dica de leitura: Effective Java. É uma obra clássica que todo programador Java deveria ter em sua estante, ou melhor, em sua mesa de trabalho. O livro está na segunda edição e contem uma série assuntos voltados para os recursos da versão 5 e 6 da linguagem. Como o autor afirma no texto; “Esse livro foi concebido para torna-lo mais eficiente no uso da linguagem Java e em suas bibliotecas fundamentais”.

Os assuntos abordados vão dês dos fundamentos da criação de objetos até paralelismo. No decorrer do texto é possível encontrar afirmações como “Não faça isso” para as práticas não recomendadas e em seguida a maneira correta de se fazer.

Joshua Bloch é um dos desenvolvedores das principais APIs do Java, entre elas está as collections e math e assert. Hoje em dia ele assumiu o cargo de Chief Java Architect na Google. Mais detalhes aqui.

 
formats

O Builder na prática e no Mundo Real

O padrão de projetos Builder permite a separação da construção de objetos complexos de sua representação possibilitando, com o mesmo processo de construção, criar diferentes representações.

No desenho tradicional do GOF ele aparece como um elemento agregado do Builder, possibilitando a criação na forma separada. Mas o padrão Builder cumpre um papel importante no “jeitão” das libs contidas na JVM. Um exemplo disso é o fato de Utilizar o tradicional System.out.println() ou o System.gc() que são processos de iniciação estáticos.

De acordo com o item 2 do Effective Java 2nd Edicition do Joshua Bloch, “Static factories and constructors share a limitation: they do not scale well to large numbers of optional parameters”. Segundo Bloch, a solução para isso está na construção de métodos státicos associados aos tipos genéricos para construir os objetos de forma elegante como abaixo:

Rectangle rec = new Rectangle.Builder().opacity(5.0).height(1.2).build();

Quando se faz muitos testes unitários, a maioria das vezes torna-se necessário construir objetos, ou mocks, que representam um estado fictício para a execução dos demais testes. E frequentemente utilizamos o método tradicional, com os construtores:

Usuario usuario = new Usuario("Nelson","Alone",new Date(),"alone","alone",new Departamento(),new Filial());

É uma forma tediosa de iniciar objetos quando temos vários atributos que precisamos preencher para utilizá-lo no procedimento de teste. Portanto, o Builder pode agilizar esse processo da seguinte forma

Para exemplificar a utilização do Builder com métodos genéricos e de classes internas, inicialmente vamos preparar a construção de duas classes tradicionais, Rectangle e Chape. Utilizaremos classes internas para a construção dos objetos internamente. Isso faz com qua a instancia da classes possa ser feita através da classes interna e do método builder para finalização do processo:

public class Shape {

	private final double opacity;

	protected static abstract class Init<T extends Init<T>> {
		private double opacity;
		protected abstract T self();

		public T opacity(double opacity) {
			this.opacity = opacity;
			return self();
		}
	}

	public static class Builder extends Init<Builder> {
		protected Builder self() {
			return this;
		}
	}

	protected Shape(Init<?> init) {
		this.opacity = init.opacity;
	}

}
public class Rectangle extends Shape {
	private final double height;

	protected static abstract class Init<T extends Init<T>> extends Shape.Init<T> {

		private double height;

		public T height(double height) {
			this.height = height;
			return self();
		}

		public Rectangle build() {
			return new Rectangle(this);
		}

	}

	public static class Builder extends Init<Builder> {
		protected Builder self() {
			return this;
		}
	}

	protected Rectangle(Init<?> init) {
		super(init);
		this.height = init.height;
	}

}

Exemplo para construção:

Rectangle rec = new Rectangle.Builder().opacity(5.0).height(1.2).build();

Já ajudou bastante. A cada atributo incluso é retornado uma instância do construtor para a inclusão posterior, sendo finalizado pelo método build(). Porém, é necessário o acoplamento da classes interna para a preparação do Builder ara a sua utilização. Essa solução pode solucionar o problema, mas vamos fazer diferente.

Agora, temos um jeito mais elegante de construer objetos sem o auxílio direto da classe interna Builder. Utilizaremos o método estático builder para auxiliar no processo, como abaixo:

public class Shape {

	private final double opacity;

	public static abstract class Builder<T extends Builder<T>> {
		private double opacity;

		protected abstract T self();

		public T opacity(double opacity) {
			this.opacity = opacity;
			return self();
		}

		public Shape build() {
			return new Shape(this);
		}
	}

	public static class Builder2 extends Builder<Builder2> {
		public Builder2 self() {
			return this;
		}
	}

	public static Builder<?> builder() {
		return new Builder2();
	}

	protected Shape(Builder<?> builder) {
		this.opacity = builder.opacity;
	}

}
public class Rectangle extends Shape {
	private final double height;

	protected static abstract class Builder<T extends Builder<T>> extends Shape.Builder<T> {

		private double height;

		public T height(double height) {
			this.height = height;
			return self();
		}

		public Rectangle build() {
			return new Rectangle(this);
		}

	}

	public static class Builder2 extends Builder<Builder2> {
		protected Builder2 self() {
			return this;
		}
	}

	public static Builder<?> builder() {
		return new Builder2();
	}

	protected Rectangle(Builder<?> init) {
		super(init);
		this.height = init.height;
	}

}

Exemplo para construção:

Rectangle rec = Rectangle.builder().opacity(14.45).height(478.41).build();

Ficou mais aceitável e, ao mesmo tempo, menos acoplável. Internamente, temos mais código, mas facilita bastante a construção do objeto caso tenha um número grande de parâmetros.

Faça download dos fontes,  execute os teste e veja como fica em uma solução mais complexa.

[]s

 
Tags: ,
 
© Blog do Alone
credit