| Últimas 20 atualizações de OTÁVIO GONÇALVES DE SANTANA |
|
|
Figura 1: Arquitetura de Software: o papel do arquiteto
O que é um arquiteto de software?
De todas as engenharias do mundo, certamente a mais recente é a de software, no entanto, é a que vem sofrendo um maior número de inovações e quebra de conceitos ou paradigmas. Por exemplo, conceito de não replicar a informação, regra muito divulgada na década de 70. Atualmente, em algumas situações é inviável segui-la, como no caso dos bancos NOSQL, NewSQL e cache, dentre outros recursos que precisam de escalabilidade horizontal. Com esse ambiente, o papel de um arquiteto de software, a profissão dos sonhos de alguns profissionais de TI, se torna preponderante já, que a decisão de uma ferramenta errada no início vai impactar todo o ciclo do software em seu final.
Afinal, o que é arquitetura?
Antes de falar-se sobre o arquiteto, é muito interessante se falar do que é arquitetura de software. Apesar de ser um termo muito utilizado, não se chegou ao consenso do que exatamente seria essa ciência. Muitos autores já tentaram definir o seu conceito como, por exemplo:
"o conceito de mais alto nível de um sistema em seu ambiente [...] a organização ou estrutura de componentes significantes interagindo através de interfaces de modo que estes componentes mais importantes são compostos de componentes e interfaces sucessivamente menores". “Parte do sistemas que são difíceis de se modificar”. Martin Fowler
“No geral, a estrutura do sistema macroscópico; isso se refere a arquitetura como uma abstração de alto nível de um sistema de software que consiste em componentes de alto nível e conectores, ao invés de detalhes de implementação.” Garlan & Shaw.
“O que é fundamental para a compreensão de um sistema em seu ambiente". ISO/IEC/IEEE 42010
“Um conjunto de decisões em um projeto de software”. Jansen, A.; Bosch, J.
Embora todas essas versões de arquitetura, ambos compartilham a mesma opinião sobre o arquiteto: eles precisam estar no projeto, precisam ter conhecimento técnico, estar envolvidos no projeto e conhecer profundamente o projeto e negócio.
“Um arquiteto que não está a par da evolução do código e do produto não estar conectado com a realidade”. Larman.
Assim, o arquiteto precisa ajudar no processo de um software. Esse processo de software vem variando muito com o tempo. Uma de suas maiores analogias é com uma fábrica, mas por quê? Fábricas são repetitivas e fazem sempre o mesmo processo. Certamente foi um erro, mas como uma ciência nova, ela teria de ser comparada com uma já exis
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
 Figura 1: Introdução ao conceito de big data Com a evolução das aplicações e a necessidade do ser humano pelas informações, mais e mais aplicações vem surgindo, deixando o homem cada vez mais refém da informação. Para isso basta lembrar-nos da evolução da relação homem-computador em que num passado existiam muitas pessoas para uma máquina (como o mainframe), em seguida uma pessoa por máquina (o caso do computador pessoal) e nos tempos atuais em que cada pessoa possui várias máquinas (notebook, ultrabook, PC, tablet, smartphone, no futuro óculos, geladores, etc.). Com tantos aplicativos surgindo, as informações são geradas exponencialmente, com isso a capacidade de gerenciar tantas informações se torna primordial para as aplicações atuais. Esse mesmo crescimento de dados acontece nos aplicativos empresariais com crescimento anual de 60%. Estima-se que uma empresa com mil funcionários gera anualmente 1000 terabytes, sem falar que essa quantidade tende a aumentar cinquenta vezes até 2020. Com o recém surgimento do bigdata, a primeira dificuldade é encontrar o seu conceito. É possível vê-lo de maneiras totalmente divergentes em cada blog que se lê, ou seja, se você ler 10 materiais sobre bigdata, provavelmente cada um trará conceitos diferentes. Dentre as matérias, ao se tirar um mínimo comum se verá que o bigdata, na sua raiz, fala em tratar um grande volume de dados com grande velocidade. No entanto, se repara que essa definição é bastante abstrata pelo simples fato de que para uma pessoa A, por exemplo, um grande volume seja um gigabyte e para uma pessoa B um grande volume seja um terabyte e o mesmo pode acontecer ao se referenciar a velocidade e o tempo de resposta de uma requisição. Assim, o grande desafio do bigdata é estar administrando um grande volume de dados e minerando informações em um menor tempo de requisição. Com o grande volume de dados, fazer com que a aplicação cresça à medida que é necessário é uma ótima estratégia, assim, uma escalabilidade vertical (em que se aumenta o poder do hardware, como aumento de memória e de processamento de uma única máquina) ou horizontal (em que se aumenta a quantidade de máquinas) deve ser analisada. Apesar de ser mais complexa, a escalabilidade horizontal acaba sendo muito barata, sem falar de ser mais fácil de crescer ou diminuir os recursos por demanda. Para armazenar as informações com a escalabilidade horizonta
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
A divisão do software em camadas, atualmente, é certamente uma das formas mais eficientes de se estar organizando a sua aplicação. Facilitando a manutenção, reaproveitamento de código, etc. Vale salientar que camada no inglês tem duas palavras: Tier, a camada física e Layer, camada lógica. No entanto, criar um grande número de camadas além de desnecessário acaba deteriorando a desempenho do seu software. Assim surgiram as chamadas delay layer, camadas lógicas que apenas servem para passar à informação a diante, gerando atraso na reposta e consumo desnecessário na memória. Esses atrasos em alguns casos acontecem fora da parte lógica da aplicação. Acontecem no processo de desenvolvimento (fora do código), pessoas ou profissionais que acabam gerando um atraso na resposta, delay tier, conhecido carinhosamente como os “tios da senha”.  Figura 1: O tempo de resposta das aplicações hoje é um fator fundamental Exemplificando como eles funcionam, podemos citar funcionário que aperta o botão no elevador, vale ressaltar que não estamos desmerecendo nenhuma profissão. O elevador possui uma interface bastante simples e basta se pressionar o botão com o andar desejado. Você precisa informar o andar desejado ao funcionário e ele por sua vez apertará o botão. Essa chamada gerará um atraso natural até você informar o andar desejado e esse profissional executar sua ação, quando entrarem dez pessoas simultaneamente essa demora será “gritante”. As empresas não o contratam diretamente, alguns preferem chamar de Arquitetos, gestores de aplicação ou DBAs, são profissionais que centralizam alguns até mesmo todos os processos de software de uma empresa. Essa ação gera um pseudo controle para a empresa, porém, acaba gerando atraso tanto nas escolhas de tecnologias quanto na execução de um script, alteração no banco de dados etc. e esses atrasos impactam diretamente a entrega desse projeto. O fato é que as tecnologias, requisitos, metodologias, etc. surgem muito rápidos, assim nascem várias siglas (UX, DDD, TDD, BDD NOSQL, NewSQL, bid data, integração contínua, etc.) e deixar essa responsabilidade na mão de apenas uma pessoa ou uma pequena equipe se torna um erro. Por alguns motivos: Caso os detentores das senhas, se desmotivarem e parem de se atualizar profissionalmente. O parque tecnológico da empresa em pouco tempo virará artefato de museu.
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Recentemente foi lançada a mais nova versão do Easy-Cassandra, que trouxe novidades no gerenciamento de múltiplos nós. O uso de muitos nós é interessante para o Cassandra, já que evita gargalos, garante a tolerância a falhas, elasticidade além do fato. Um grande número de nós faz com que o Cassandra distribua as requisições, salientando que esse tipo de banco possui uma arquitetura distribuída, ou seja, vale a pena utilizar um grande número de nós. Tão logo se tenha múltiplos nós do Cassandra o próximo passo é estar dividindo as tarefas entre os mesmos, não adianta se possuir dez nós, por exemplo, se todas as requisições vão sempre para um. Feito isso, o banco tratará todo resto (replicar informação entre os nós, ler e escrever a partir do nível de consistência, etc.). A estratégia utilizada no Easy para aproveitar o máximo dos múltiplos nós, é fazer com que cada requisição use um cliente diferente, para isso ele terá duas formas: Sequencial: cada nó recebe um número de ordem crescente que vai de 0 até N-1, em que N é o número instâncias do Cassandra. Feita essa numeração, para cada solicitação ao Cassandra (atualizar, criar, deletar) é usado um cliente diferente seguindo em ordem crescente, por exemplo: - Primeira requisição cliente 0
- Segunda requisição cliente 1
Uma vez acabado o número de nós, essa ordem recomeça a partir do cliente de índice 0. Randômico: de forma semelhante ao sequencial, é dado um número para cada cliente que vai de 0 até N-1. Após essa numeração, para cada requisição é criado um número aleatório que representa uma instância do Cassandra. Para usar uma das duas estratégias no ORM, o processo é bastante simples: O primeiro passo é criar instâncias do Cassandra. Depois, adicionar esses nós no Easy-Cassandra. Em seguida, criar uma das duas Estratégias informando o nome do keyspace. Caso não exista, o keyspace será criado. Para demonstrar esse novo recurso será usado um simples exemplo: o seu objetivo será apenas recolher uma resposta de qualquer usuário para a seguinte pergunta: “O que você acha do Cassandra?”. Para fazer esse exemplo utilizaremos o Tomcat como servidor, JSF (Java Server Faces) na visão e o Google Guice como injeção de dependência. A injeção de dependência é um padrão de desenvolvimento muito conhecido no mundo Java, é ideal principalmente para manter baixo acoplamento entre diferentes camadas do sistema. Nesse modo o responsável por injetar esse recurso será o container de injeção, fazendo que algumas vezes o programador não saiba de onde vem tal recurso. O Google apresenta um framework open source para injeção de dependência, o Google Guice que atualmente está na versão 3.0. O principal objetivo do Guice é ser bem leve em comparação ao Spring, além de não precisar de um grande número de XMLs (você consegue
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
 Figura 1: Cassandra e Lucene Atualmente existem diversas características dos bancos NOSQL, em diferentes arquiteturas, formas de armazenamento de informação e estruturas de dados. No entanto apesar dessa grande variedade no número e variedades eles compartilham uma coisa em comum. Eles normalmente buscam pela chave primária. Apesar de conseguir-se manter altamente disponível, inserir e recuperar informações de forma bastante rápida, o fato de que a maioria dos bancos NOSQL somente recuperem pela chave, torna um pouco difícil adaptar a aplicação para o seu uso, já que nem sempre você consegue buscar apenas pela chave no banco. Para não abrir mão da alta disponibilidade e recuperar informações não apenas em chave, uma boa opção certamente é “terceirizar” esse serviço. Por esse motivo será apresentado o Lucene trabalhando em conjunto com um banco nosql, mais precisamente o Cassandra, juntando o bom de dois mundos em sua aplicação. O Apache Lucene é uma API de busca e indexação de documentos, escrito em Java. Ele é composto por basicamente duas etapas: indexação e pesquisa. Dado o texto primeiro passo é a indexação que processa os dados originais e gera uma estrutura que facilita a busca e gera palavras-chaves, em seguida vem à busca que visa estar buscando a partir das palavras-chaves indexadas e retorna pela semelhança do texto com a consulta. A vantagem é que o Lucene abstrai ao ponto que não é necessário que o desenvolvedor saiba algoritmo de indexação. Os índices podem ser criados em ambientes distribuídos, aumentando o desempenho e a escalabilidade da ferramenta. Apresentado um pouco da ferramenta o objetivo agora será apresentar uma prática envolvendo os dois mundos: banco nosql e o Lucene. Para essa parte prática será feita uma aplicação com o objetivo de estar cadastrando currículos. A idéia é bastante simples: - O usuário estará cadastrando o currículo com suas informações.
- A partir dessas informações a analista de recursos humanos estará buscando o profissional.
- O profissional poderá ser buscado pela palavra chave de uma qualificação técnica, localização, Profissão.
Como o objetivo da aplicação será web, estaremos utilizando a plataforma Java EE em sua versão mais recente, a versão 6.0. No Lucene os índices são armazenados a partir da interface Direcoty que no momento que eu escrevo possui basicamente duas implementações: Uma para armazenar na memória RAM e para armazenar no disco rígido. Como o objetivo é garantir uma alta disponibilidade estaremos utilizando a opção de estar trabalhando com os índices na memória RAM, mas para não perdemos tais índices estaremos fazendo um backup no disco rígido. Para fazer tal procedimento, usaremos o recurso schedule do EJB 3.1 para de tempos em temos, jogar o que está na memória para o HD. Listagem 1: Exemplo de gravação em disco @Schedule(minute = "*/1", hour = "*")
public void reindex() {
try {
Directory disco = FSDirectory.open(new File(Constantes.getIndexDirectory()));
luceneManager.backup(directory, disco);
}
ca
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
A injeção de dependência é um padrão de desenvolvimento muito conhecido no mundo Java, é ideal principalmente para manter baixo acoplamento entre diferentes camadas do sistema. Nesse modo o responsável por injetar esse recurso será o container de injeção fazendo que algumas vezes o programador não saiba de onde vem
tal recurso. O Google apresenta um framework open source para injeção de dependência é o Google Guice que atualmente está na versão 3.0.
O principal objetivo do Guice é ser bem leve em comparação ao Spring além de não precisar de um grande número de xmls (você consegue injetar dependência sem usar nenhum! ). Outra informação bastante interessante é que nessa versão ele implementa a JSR 330. O Guice também trabalha na injeção de dependência em OSGI, struts, Swing, JPA e também em Servlets. Um kit completo de injeção de dependência para o desenvolvimento nas plataformas JEE, JSE e também Android com o RoboGuice.
Para estar demonstrando os recursos desse framework ID, injeção de dependência, será realizado um pequeno site web para cadastro de filmes. Para a persistência será utilizado como ORM o Hibernate com o banco Postgresql, servidor tomcat versão 7 e na visão uma implementação do JSF 2.0. Mas vale salientar que o foco do
artigo será o Guice, desse modo, não entrará em detalhes em relação as tecnologias utilizadas, mas essas possuem informações de fácil acesso na internet.
Para adicionar o Guice no projeto com o maven basta adicionar a seguinte dependência:
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
</dependency>
Dessa forma ele já se encontra pronto para o uso, também é necessário adicionar as libs do Hibernate. Uma vez adicionado as dependências será criado os objetos para estarem persistindo no banco de dados.
@Entity
@Table(name="categoria")
public class Categoria {
@Id
@GeneratedValue
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "nome")
private String nome;
//getter and setter
}
@Entity
@Table(name="Filme")
public class Filme {
@Id
@GeneratedValue
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "nome")
private String nome;
@ManyToOne
@JoinColumn(name = "Categoria_id", nullable = false)
private Categoria categoria;
@Column
@Temporal(TemporalType.DATE)
private Date lancamento;
@Column
private Integer idadeIndicada;
//getter and setter
}
Uma vez feito os objeto na qual as informações serão representados, o próximo passo será a criação do DAO e usaremos o AbstractDao. No caso de pequeno projeto é desejável que exista apenas uma instância de cada DAO, e para ajudar nesse problema será usado a anotação @Singleton.
@Singleton
public class CategoriaDAO extends AbstractDao<Categoria> {
public CategoriaDAO(){
super(Categoria.class);
}
}
@Singleton
public class FilmeDAO extends AbstractDao<Filme> {
public FilmeDAO(){
super(Filme.class);
}
}
Outra anotação importante é o @Inject que quando usado no campo é responsável por injetar o objeto e quando inserido no método, ele é executado logo o objeto seja instanciado. Na camada de negócio o Inject é usado para estar inserindo a dependência da camada DAO.
public class FilmeService {
@Inject
private FilmeDAO f
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
O fato é que existem diversas finalidades para os softwares: diversos clientes, regras de negócios etc, mas o que todos os programadores tem em comum é a procura de um bom código. Certamente um
bom código facilitará a manutenção, trará baixa curva de aprendizagem caso um novo membro entre na equipe além de não ter vergonha de mostrar seu código para alguém :).
O grande problema da analise de código é que elas, em muitos caso, devem ser feitas conhecendo também as regras de negócios, já que uma aplicação cheia de camadas não a faz necessariamente mais
elegante e sim um código que além de simples e entendível atenda os requisitos do cliente. Mas então como avaliar se o código tem qualidade ou não ? Essa é uma pergunta que certamente vai variar de projeto para
projeto, mas existe uma ferramenta que pode te dar uma orientação em relação ao seu código, o sonar.
O sonar é um projeto open source que visa justamente isso, avaliar a qualidade de seu código. Para isso ele avalia a arquitetura e design, número de comentários, regras do java, alto nível de complexidade,
código duplicado, cobertura de testes no código, etc. Além de possuir um número bastante extenso de plugins. Ele armazena todas as informações de seu código em um banco de dados de sua preferência, assim você
pode também acompanhar a evolução da qualidade do seu projeto.
Para começar a usar em seu projeto maven siga os seguintes passos:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Lançada a mais nova versão do framework que visa facilitar a persistência de objetos do apache Cassandra. Dentre as suas novidades está nas anotações, nessa versão estará usando as anotações do JPA.
Outra novidade é o uso do recurso de JPQL, com isso se pode realizar querys com objetos e a ferramenta se encarregará de fazer a tradução para o Cassandra, para isso se utiliza a interface JCassandra que é estende
de javax.persistence.Query. A expectativa é que aumentar ainda mais a produtividade para o desenvolvimento.
Listagem 1: exemplo usando o jpql no Easy-Cassandra
JCassandra jCassandra=persistence.createJCassandra("select * from Person");
List<Person> persons=jCassandra.getResultList();
Conforme dito acima as anotações foram adaptadas conforme mostra a tabela abaixo.
| Easy-Cassandra 1.0.8 |
Easy-Cassandra 1.0.9 (Com JPA anotação) |
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Lançada a mais nova versão do framework Easy-Cassandra seu objetivo é estar facilitando a comunicação entre Apache Cassandra e sua aplicação em java. Com ele é possível esta criando, atualizando, recuperando ou
deletando os seus objetos java de uma maneira bastante simples, para isso basta apenas realizar anotações na classe e nos campos.
CARACTERÍSTICAS
- Uma espécie de ORM para o Cassandra
- Precisa apenas de anotações na classe para persistir informações
- Persiste muito objetos java de uma maneira bastante fácil
- Escreve e ler no Cassandra com Level Consistency.
- O primeiro compatível com versões acima do Cassandra 0.8
- Compatível com CQL 2.0
- O primeiro a usar invokedynamic ao invés de Reflection
- Sob a licença Apache versão 2.0
- Suporte aos seguintes objetos
As novidades nessa versão:
- Criação de Famílias de colunas e índices secundários em tempo de execução
- Suporte ao CQL 2.0
- suporte a chamada de chaves com 'in'
Para demonstrar essa nova versão será apresentado um exemplo prático com uma aplicação simples. Essa aplicação terá o objetivo de armazenar informações da média de renda dos brasileiros agrupados por
CEP, a ideia seria saber quanto é gerado em reais e o número de entidades comerciais ( padarias, mercados, mercadinhos, açougues etc.) que geram esse valor em um determinado local, CEP. Assim será
armazenado aproximadamente 640 mil informações a cada levantamento de estudo.
Cada requisição para o estudo terá as seguintes informações:
- Código do Lote
- Quantidade de pessoas calculadas no setor CEP
- Valor computado
- Cidade
- Logradouro
- Bairro
- Cep
- Tipo do logradouro
- Estado
- Sigla
Para armazenar essas informações será utilizado o banco nosql Cassandra que é:
- Altamente confiável: Utilizado por diversas empresas entre elas Cisco, Reddit, Twitter. O maior cluster conhecido do Cassandra possui mais de 300 tb em 400 máquinas .
- Tolerante a falhas: Os dados são replicados automaticamente para múltiplos nós para a tolerância a falhas.
- Descentralizado: Já que não existe ponto de falha nem gargalhos de rede. Já que cad nós é idêntico .
- Configurável: Se pode escolher de uma maneira bastante simples se será uma atualização síncrona ou assíncrona além de possuir Hinted Handoff e Read Repair .
- Escalável: Com ele tanto a escalabilidade horizontal e vertical poderão ser feitas de uma maneira bastante simples. Além de adicionar novas máquinas podem ser adicionadas sem tempo de
interrupção .
- Durável: Foi projeto para não perder informações mesmo quando vários nós falham.
Para fac
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
O Easy-Cassandra é um framework ORM e um alto cliente para o Apache Cassandra em java, com ele é possível persistir objetos java de uma maneira muito fácil. Para isso é necessário adicionar anotações em sua Classe.
Ele funciona como uma
camada de abstração para o Thrift realizando as chamadas para o Cassandra.
O Easy-Cassandra usa a implementação do Thrift e tem como principal objetivo é ter um uso simples. Ele precisa do jdk 7 ou acima para rodar, isso acontece devido há algumas parte de seu código utilizar invokedynamic ao invés
do Reflection, assim terá uma resposta ainda mais rápida. O Easy-Cassandra foi o primeiro framework compatível com versões do Cassandra acima da versão 0.8 e 1.0.0, o primeiro a usar o CQL (Cassandra Query Language) além de usar
o invokedynamic, que é cerca de quinze vezes mais rápido que o Reflection.
CARACTERÍSTICAS
· Uma espécie de ORM para o Cassandra.
· Precisa apenas de anotações na classe para persistir informações.
· Persiste muito objetos java de uma maneira bastante fácil.
· Escreve e ler no Cassandra com Level Consistency.
· O primeiro compatível com versões acima do Cassandra 0.8.
· Compatível com CQL 2.0.
· O primeiro a usar invokedynamic ao invés de Reflection.
· Sob a licença Apache versão 2.0.
OBJETOS SUPORTADOS
O Easy-Cassandra tem suporte para os seguintes Objetos java:
· todos os tipos primitivos (int, long, float, double, short, byte, boolean)
· java.lang.Boolean
· java.util.Date
· java.lang.Double
· java.lang.Float
· java.lang.Integer
· java.lang.Long
· java.lang.String
· java.lang.Boolean
· java.lang.Byte
· java.lang.Short
· java.lang.Character
· java.nio.file.Path
HISTÓRICO DAS VERSÕES
Versão: 1.0.8
· Seleciona chave pelo comando CQL 'in'
· Cria automaticamente Familia de Coluna em tempo real
· Cria automaticamente índice secundário em tempo real
· Suporte com o CQL 2.0
· Não é necessário criar Família de colunas ou índices secundário. O Easy-Cassandra poderá criar automaticamente em tempo de execução
Versão: 1.0.7
· atualizada para cassandra-thrif
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Nas aplicações empresariais além de persistir texto e número elas podem salvar arquivos ou documentos. Persistir esse tipo de informação é muito útil, por exemplo, um processo civil além de possuir informações ter o arquivo escaneado ou um twett com uma imagem. No cassandra se pode armazenar arquivos, no entanto, armazenar documentos muito grandes um banco do tipo documento seja mais indicado nessas ocasiões.
Para demonstrar esse recurso será feita uma pequena aplicação, um álbum de fotografia,a foto será exibida a partir do nome dado a foto. No caso ao selecionar “Paris” será exibida a foto relacionada a esse nome.
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Esse ano um dos grandes “boom” do mundo java foi o openjdk, um projeto open source da JVM, recentemente ele evolui de um modo exponencial, no entanto existem alguns mitos além de algumas pessoas não o conhecerem. Alguns o conhecia como o “irmão pobre” do JDK da SUN (agora da Oracle), mas muita coisa mudou ao longo do início do projeto é uma visão tão primitiva quando achar que o Linux é o Sistema Operacional da tela preta. O projeto ficou muito popular com a remoção da licença temporária de utilizar o jdk da Sun nas distribuições Linux, apesar de várias contradições a verdade é que as Distribuições Linux não perderam acesso a uma jvm fechada, eles possuem um projeto aberto e maduro e muito forte pronto para atender suas necessidades. Esse ano o java teve grandes avanços e a grande maioria ligados a projetos open sources. Esse post foi feito em modo de quiz, perguntas e respostas, sobre algumas duvidas relacionadas ao openjdk, mito sobre o java e o que foi feito e o que esperar do java em 2012.
1- O que é o openjdk ? O openjdk é um projeto que foi iniciado pela Sun Microsystems, atualmente mantido pela por várias empresas e a comunidade, para a criação de um Java Development Kit baseado totalmente em software livre e de código aberto. O projeto foi iniciado em 2006 e tem como base o HotSpot ( a jvm da Sun).
2 - Existe outros JDKs além da Oracle ? Sim existe e o openjdk é um exemplo desse. Existe também o IBM J9, IcedTea, Hotspot (Da antiga Sun), jRockit (da Oracle), Apache Harmony ,Hewlett Packard JVM entre outras.
3 - Com tantas JDKs qual delas é a referência ? A partir da nova versão do java, o java 7, a implementação de referência é o openjdk.
4 - Qual a vantagem de se usar o openjdk ? · A primeira vantagem é que ele é open source ou seja você pode estar estudando o seu código fonte. · Ela agora é a implementação de referência ou seja se você quer fazer um aplicativo e quer que rode em qualquer JVM, usando o openjdk isso pode ser garantido. · A comunidade java é certamente uma das comunidades mais fortes do mundo. A jvm do projeto, por exemplo, está passando por constantes refatorações para melhoria de performance, atualização de bibliotecas e atualização do código sem falar que para adicionar qualquer recurso é necessário que se tenha testes. · A Oracle doou o código fonte do jRockit e no java 8, previsto para o final de 2013, o código seja integrado com o Hotspot. Ou seja no openjdk haverá os melhores de dois mundo em um só lugar. · Várias empresas fazem parte desse projeto, ou seja é uma JVM com o Know-how de várias empresas em todo o mundo. Empresas como IBM, Apple, SAP, Mac, Azul, Intel, RedHat etc. fazem parte do projeto. · Se a Oracle deixar o java ( Algo que eu acho muito difícil por diversos motivosl) e deixar de fazer a JVM. O openjdk não será em nenhum momento abalado já que existem outras empresas apoiando além da comunidade.
5 - O openjdk é somente para uso acadêmico e não pode ser usado em sistemas sérios ou em projetos em produção. Certamente esses é um dos maiores mitos que existem. Há algum tempo atrás o Twitter trocou o background do Ruby para java, por questão de performance e ele está utilizando o openjdk. O Twitter possui milhares de requisições, cerca de 250 milhões de tweets por dia, e é utilizado no mundo inteiro. Inclusive o Twitter está fazendo parte do projeto e está trazendo um pouco de sua experiência com milhões de requisições para o projeto além de ajudar no self-tuning previsto para o java 9. O openjdk em um cenário mundial é a segunda mais utilizada no mundo perdendo apenas para o HotSpot.
6 - Qual a diferença entre a JVM da Oracle e do OpenJdk ? A diferença entre essas duas JVMs está na adição de códigos fechados além de pequenas mudanças na implementação para implementações fechadas para a JVM da Oracle, a dessemelhança é de cerca de 4% de código. O que acontece é que nem todos os códigos foram abertos com êxito já que alguns pertence a terceiros e são apenas licenciados na época pela Sun.
7 - Que códigos diferentes são esses ? Posso citar, por exemplo, a parte que renderiza os componentes em Swing.
8 - Como anda o trabalho com o openjdk ? O projeto anda a todo vapor, existem diversas frentes de trabalho nele:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Os banco de Dados NOSQL (not only SQL) foram criados, principalmente,para resolver problemas com aplicações web que precisam operar com gigantescas cargas de dados além de poder escalar com grande facilidade. Esses tipos de banco de dados vem sendo usados com muita frequência em redes sociais como Twiter, Facebook, além de persistência em aplicações nas nuvens. O Cassandra é um tipo de banco nosql que originalmente foi criado pelo Facebook e que atualmente é mantido pela Apache e outras empresas. Ele é um sistema de banco de dados distribuído baseado no modelo Big Table do Google e no sistema de armazenamento Dynamo da Amazon.com. Esse artigo tem como objetivo de realizar um passo a passo de um pequeno exemplo para persistir informações no Cassandra.
Para demonstrar um pouco do Cassandra será utilizado o Easy-Cassandra que é um framework open souce que visa está facilitando o uso desse banco nosql.
Listagem 1: Classe modelada com anotação para persistir a informação no Cassandra
@ColumnFamilyValue(nome = "person")//
public class Person implements Serializable {
private static final long serialVersionUID = 3L;
@KeyValue(auto=false)
private Long id;
@IndexValue//indica que esse campo é um índice
@ColumnValue(nome = "name")//indica que será uma coluna e o seu nome
private String name;
@ColumnValue(nome = "year")
private Integer year;
@EnumeratedValue(nome="sex")//indica que esse campo será um enum alem do nome do campo
private Sex sex;
@EmbeddedValue//indica que a classe Address esta embutida na classe Person
private Address address;
//getter and setter
}
Listagem 2: Classe que realiza a chamada para o banco de Dados
public class PersonDAO {
private Persistence persistence;
public PersonDAO() {
persistence = EasyCassandraManager.getPersistence("javabahia", "localhost", 9160);
}
public void create(Person bean) {
persistence.insert(bean);
}
public void remove(Person bean) {
persistence.delete(bean);
}
public void remove(Long id){
persistence.deleteByKeyValue(id, Person.class);
}
public void update(Person bean) {
persistence.update(bean);
}
public Person retrieve(Object id) {
return (Person) persistence.findByKey(id, Person.class);
}
@SuppressWarnings("unchecked")
public List listAll() {
return persistence.findAll(Person.class);
}
@SuppressWarnings("unchecked")
public List listByIndex(Object index) {
return persistence.findByIndex(index,
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
O Cleanup day é um esforço muito legal da comunidade mundial do java fez para acabar com os avisos na compilação do openjdk, foi iniciado no dia 1 de de dezembro de 2011 e tende a acabar no final do ano ou seja, ano novo com java novo e limpo. Existem vários avisos durante a compilação no entanto a maioria deles estão escondidos em arquivos de log. Uma boa dica é adicionar na compilação o javac -Xlint ClasseJava.javapara poder ver, em alguns casos e a depender do número de código poderá existir cerca de 10 mil avisos emitidos pelo javac durante aconstrução.
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
No primeiro e segundo artigo foi introduzido com o conceito de banco dedados NOSQL suas semelhanças com o banco relacional além de sua classificação na terceira parte finalmente será falado sobre o Cassandra . O cassandra é um banco de dados nosql de arquitetura distribuída, seu armazenamento é configurável (híbrido) e usa o modelo de família de colunas, o seu projeto foi iniciado pela equipe do facebook e atualmente é mantido pelo apache, foi desenvolvido na plataforma java. Seu principal case de sucesso é o twitter, facebook e o Digg. Possui api para as linguagens Ruby, Perl, Scala,Python, PHP e Java. Como o cassandra usa o modelo família de colunas, ele é composto porkeysotre, supercoluna e coluna.
Os tipos de valores que possam ser inseridos nas colunas são:
- BytesType: tipo simples pelo valor de byte. Nenhuma validação é executada.
- AsciiType: Como BytesType, mas confirma que a entrada pode ser analisado como US-ASCII.
- UTF8Type: Uma string codificada como UTF8
- LongType: Um longo 64bit
- LexicalUUIDType: Um UUID de 128 bits, em comparação léxica (por valor byte)
- TimeUUIDType: a versão 1 UUID de 128 bits, comparados por timestamp
Nível de Consistência do Casssandra
Para garantir tolerância a falhas, os dados no Cassandra precisam ser replicados. O campo timestamp funciona como uma bússola verificando o campo mais atual entre as replicas. De uma maneira geral o comportamento de leitura e escrita no cassandra pode ser definida por apenas três itens:
ONE(1) - Na escrita, garante que o dado foi escrito em um commit loge uma tabela de memória de ao menos uma réplica antes de responderão cliente. Na leitura, o dado será retornado a partir do primeironó onde a chave buscada foi encontrada. Essa prática pode resultarem dados antigos sendo retornados, porém, como cada leitura gera uma verificação de consistência em background, consultas subsequentes retornarão o valor correto do dado;
QUORUM(Q) - Na escrita garante que o dado foi escrito em N/2+1réplicas. Na escrita retorna o valor mais recente lido de N/2+1réplicas. As réplicas restantes são sincronizadas em background;
ALL(N) - Garante que operações de leitura e escrita envolverão todas as réplicas. Assim, qualquer nó que não responda às consultas fará as operações falharem.
A tabela 1 e 2 demonstra os níveis de consistência de escrita e leitura respectivamente.
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Eclipse é um IDE desenvolvido em Java, seguindo o modelo open source de desenvolvimento de software. O projeto Eclipse foi iniciado na IBM que desenvolveu a primeira versão do produto e doou-o como software livre para a comunidade. O gasto inicial da IBM no produto foi demais de 40 milhões de dólares. Hoje, o Eclipse é uma das IDEs Java mais utilizado no mundo. Possui como características marcantes o uso da SWT e não do Swing como biblioteca gráfica, a forte orientação ao desenvolvimento baseado em plug-ins e o amplo suporte ao desenvolvedor com centenas de plug-ins que procuram atender as diferentes necessidades de diferentes programadores. No mês de novembro a Eclipse Fundation promoveu uma comemoração dos10 anos da IDE Eclipse, umas das mais famosas IDEs em todo mundo,principalmente quando o assunto é o desenvolvimento na plataforma java. Este evento aconteceu também aqui no Brasil, organizado pelos JUGs, grupo de usuário java, nesse artigo se estará falando sobre os que aconteceu na Bahia e em Ceará. No Ceará o evento foi organizado pelo CEJUG, grupo de usuários java do Ceará, o evento aconteceu no dia 17 de novembro, quinta-feira, na Faculdade sete de setembro. O evento contou com a presença de entusiastas além dos membros dos grupos de usuários, com direito a um bolo além de camisas. No evento algumas das palestras focaram em demonstrar dicas e truques que facilitam ainda mais o desenvolvimento com a IDE.
Na Bahia o java Bahia, grupo de usuários java da Bahia, realizou o evento no dia 12 de novembro, sábado, na Faculdade Unirb. O evento contou com palestrantes que falaram da história, suas melhorias como passar do tempo além de plugins para desenvolvimento para web e para dispositivos móveis. Nesse mesmo dia houve uma conferência falando sobre computação nas nuvens entre os temas se falou das IDEs nas nuvens com o Eclipse Orion, que é uma IDE nas nuvens desenvolvida pela Eclipse Fundation.
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
No artigo anterior foi mostrado um conceito básico sobre os banco nosql além de fazer comparações entre os bancos“tradicionais” com os bancos nosql. Nesse artigo será abordado sobre os tipos de bancos nosql além de sua classificação serão mostrados também alguns exemplos. Esses bancos por serem bastante novos ainda não existem padrões ou seja por mais que dois bancos possuam exatamente as mesma classificações não é absoluto afirmar que eles possuem os mesmo recursos e que fazem as mesmas coisas sem falar no alto trabalhar que haverá na mudança de um banco nosql para o outro mesmo sendo semelhantes. Existem hoje diversos SGBDs que se encaixam como nosql eles são classificados por: Arquitetura, Armazenamento, modelo dedados:
Arquitetura
Na arquitetura se pode dividir em dois tipos: distribuídos e não distribuídos. Os distribuídos tomam a responsabilidade pela partição dos dados e pela sua replicação. Distribuídos: · AmazonDynamo · Scalaris · Voldemort · CouchDb · Riak · MongoDb · BigTable · Cassandra · HyperTable · HBase Não distribuídos: · Redis · TokyoTyrant · MemcacheDb · AmazonSimpleDb Armazenamento: Se defini por aqueles que armazenam dados em disco e os que armazenam na memória. Esta diferenciação é importante por que no caso da gravação em disco você vai precisar de um cache explicito. Já os dados armazenados em memória não são duráveis. Um ponto interessante a ser avaliado é que no disco os dados tem menos possibilidade de ser perdidos no entanto o custo de I/O é altíssimo já com memória apesar de ser mais rápido o acesso deve-se levar em conta o fato dos dados ficarem em regiões voláteis. Memória: · Scalaris · Redis Disco: · CouchDb · MongoDb
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Os
banco de Dados NOSQL foram criados,
principalmente, para resolver problemas com aplicações web que precisam operar
com gigantescas cargas de dados além de poder escalar com grande facilidade.
Esses tipos de banco de dados vem sendo usados com muita frequência em redes
sociais como Twiter, Facebook, além de persistência em aplicações nas nuvens. O
Cassandra é um tipo de banco nosql que originalmente foi criado pelo Facebook e
que atualmente é mantido pela Apache e outras empresas. Ele é um sistema de
banco de dados distribuído baseado no modelo BigTable do Google e no sistema de
armazenamento Dynamo da Amazon.com.
Antes
de falar sobre Cassandra é necessário falar sobre o tecnologia que o circula o
NOSQL, ele significa Not only SQL
(não somente sql) e não NO SQL (não ao sql), o principal objetivo do
mesmo é promover um novo conceito de banco de dados e sem destruir ou
inviabilizar o já existente (SQL). Apesar
do grande número de aplicações e da diversidade de seus objetivos, todas essas
em sua grande maioria acaba realizando o CRUD ou seja cria, recupera, atualiza
e deleta informações, essas informações tem características diferentes além de
tamanho diferentes, necessidades de poder computacional diferentes. Essa base
ou banco de informações fica abstraída
da aplicação cliente e é gerenciado por
um Sistema de Gerenciamento de Banco de Dados (SGBD). Os mais populares SGBDs
são os tipos relacionais que é uma maneira de estruturar as informações de modo
único a partir de tabelas e na relação de umas com as outras.
ARQUITETURA DOS BANCOS DE DADOS
Para
explicar melhor a arquitetura dos bancos nosql será comparado com os bancos
relacionais, é importante salientar a diferença entre os bancos e o seu uso,
uma má escolha no padrão de persistência pode acarretar em mais horas do que a planejada, além no não
atendimento do seu requisito. As aplicações em quase sua maioria é atendida
pelo banco relacional seria semelhante a um carro utilitário, que serve para
várias pistas, quando se tem a
necessidade de uma maior velocidade e desempenho uma boa opção seria os bancos
nosql que seria comparado a um carro de corrida, no entanto eles atendem a
casos específicos será improdutivo
colocar um carro de formula 1 em uma
pista de rally.
SQL Modelo de persistência: Os atuais bancos de dados tentam explorar ao máximo o modelo A.C.I.D.
cujos os princípios são:
Atomicidade: Trata o trabalho como parte indivisível, ou seja ou tudo
feito ou nada feito
Consistência: o processo deve
deixar o banco integro ou não será executado
Isolamento: tratar cada operação como individual
Durabilidade: os processos em caso de sucesso serão permanente
Armazenamento:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Foi
adicionada esse pacote para facilitar
aplicações que necessitem escalar ou realizar processos em paralelos.
Umas
das melhorias são as variáveis atômicas, uma variável atômica é que não pode
ser dividida, é semelhante ao Sistema operacional que possui um recurso (um
leitor usb, por exemplo) que não pode ser dividido, no entanto pode ser usado
por vários processos ao mesmo tempo. Na listagem 11 é mostrado um exemplo
simples de produtor e consumidor em que uma variável atômica é utilizada entre
os dois processos.
static class AtomicCounter {
private AtomicInteger contador = new AtomicInteger(0);
public void increment() {
System.out.println("Incrementando " + contador.incrementAndGet());
}
public void decrement() {
System.out.println("Decrementando " + contador.decrementAndGet());
}
public int value() {
return c.get();
}
}
static class Produtor implements Runnable {
private AtomicCounter atomicCounter;
public Produtor(AtomicCounter contador) {
this.atomicCounter = contador;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
atomicCounter.increment();
}
}
}
static class Consumidor implements Runnable {
private AtomicCounter atomicCounter;
public Consumidor(AtomicCounter contador) {
this.atomicCounter = contador;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(4000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
atomicCounter.decrement();
}
}
}
public static void main(String[] args) {
AtomicCounter atomicCounter = new AtomicCounter();
Thread consumidor = new Thread(new Consumidor(atomicCounter));
Thread produtor = new Thread(new Produtor(atomicCounter));
consumidor.start();
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Assim
como o projeto coin, não existe nenhuma grande novidade nessa especificação, no
entanto agora é possível um trabalho mais simplificado com os I/Os no java. Com
a classe java.nio.file.Files é possível fazer diversas operações de maneira
simples, para esses processos ele usa a interface java.nio.file.Path que
representa arquivos e diretórios do sistema operacional.
Path path=Paths.get("arquivo.txt");
Listagem 6: criando um path em que a String
“arquivo.txt” pode ser substituído por qualquer caminho dentro do S.O seja ele
diretório, arquivo ou até mesmo links simbólicos ou rígidos.
public static void movendoArquivo(Path arquivoOrigem, Path arquivoDestino) throws Exception {
Files.move(arquivoOrigem, arquivoDestino, StandardCopyOption.REPLACE_EXISTING);
}
public static void copiandoArquivo(Path arquivoOrigem, Path arquivoDestino) throws Exception {
Files.copy(arquivoOrigem, arquivoDestino, StandardCopyOption.REPLACE_EXISTING);
}
public static void deletandoArquivo(Path arquivo) throws Exception {
Files.delete(arquivo);
}
public static Path criarArquivo(String arquivo) throws Exception {
return Files.createFile(Paths.get(arquivo));
}
public static Path criarDiretorio(String diretorio) throws Exception {
return Files.createDirectories(Paths.get(diretorio));
}
public static void criarLinkSimbolico(Path linkSimbolico, Path arquivo) throws Exception {
Files.createSymbolicLink(linkSimbolico, arquivo);
}
public static void criarLinkRigido(Path link, Path arquivo) throws Exception {
Files.createLink(link, arquivo);
}
Listagem 7: operações de I/Os simplificadas
utilizando o java.nio.Files
É
possível recuperar informações do
java.nio.Path de uma forma bastante simples, além de ser possível obter
tais informações na implementação de 6 novas interfaces. Na listagem 8 é
mostrado o acessos dessas informações
além da implementação de duas interfaces que exibe informações de um
determinado caminho ( Path).
public static void propriedadesPath(Path path) throws Exception {
System.out.println("Tamanho do arquivo em bytes " + Files.size(path));
System.out.println("é diretório " + Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS));
System.out.println("é regular " + Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS));
System.out.println("é escondigo pelo SO " + Files.isHidden(path));
System.out.println("Modificacao " + Files.getLastModifiedTime(path, LinkOption.NOFOLLOW_LINKS));
System.out.println("Dono " + Files.getOwner(path, LinkOption.NOFOLLOW_LINKS));
System.out.println("\n \n \n Basicos Atributos do arquivo \n \n \n ");
BasicFileAttributes attr = Files.readAttributes(path, BasicFile
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
| |
|