Série Git:Do Git para GitHub

Olá Pessoal,

Dando continuidade à Série Git. Hoje vamos ver como mandar os códigos que estão no nosso repositório local para o GitHub. No próximo post da série veremos como fazer isso direto do Eclipse.

Lets go…

Passo 1

Antes de tudo você precisa criar uma conta no GitHub, inicialmente pode ser free que tem o limite de até 30GB. Porém, lembre-se  que para projeto confidenciais não é recomendável usar uma conta free, pois o acesso é public. Dai você pode ver os planos existentes no github para contas private.

Passo 2

Depois de ter criado e logado na sua conta precisamos de uma chave SSH para poder comitar, sendo assim. Abra o Git Bash iniciar >> programas >> Git >> Git Bash.  E digite:

ssh-keygen -t rsa -C “seu_email@email.com”

Informe o e-mail de cadastro no GitHub. Dê enter para a próxima pergunta.

Passo 3

A próxima pergunta é para criar uma senha para o passphrase. Digite a senha. Não esqueça dela.Veja que um arquivo id_rsa.pub foi criado, veja onde ele criado e abra através do bloco de notas.

Passo 4

Vá na pagina do GitHub e clique em “Account Setting” e depois em “SSH Public Keys”. Clique em “Add another public key”. O titulo é opcional. Porém, na parte do key cole todo o conteudo do arquivo id_rsa.pub.

Clique em add key.

Passo 5

Vamos testar para ver se tá tudo certo. Digite:

ssh -T git@github.com

Ele vai perguntar se tem certeza que quer conectar e talz. Digite yes e Enter. Na próxima pergunta informe a senha passphrase cadastrada ainda pouco. Se deu tudo certo você vai receber uma mensagem assim:

Hi camilolopes! You’ve successfully authenticated, but GitHub does not provide shell access.

Passo 6

Agora crie um repositório no GitHub, de preferência sem espaço e caracteres especiais. Do contrario ele será removido pelo GitHub. Depois disso você vai cair na pagina do seu repositório.

Passo 7

Abra o Git Bash no seu repositório local. E digite:

git remote add origin git@github.com:seu_login/nome_do_repositorio.git

Observe que em “nome do repositorio” você vai ter que digitar o mesmo nome que informou lá no GitHub.

Passo 8

Para atualizar os arquivos no GitHub é simples basta digitar:

git push origin master

Informe a senha quando for solicitado. Em seguida atualize a pagina do seu repositório no GitHub e veja os arquivos lá:

Vou ficando por aqui e espero que tenha gostado. Como falei no inicio do post. O próximo vamos ver as coisas dentro do Eclipse e comitando para o GitHub.

Abracos, see ya!!

Série Git:Instalando e configurando Git no Ubuntu

olá Pessoal,

Estarei dando inicio a mais uma série no blog, e dessa vez veremos sera uma de Git, que batizei como “Git para Iniciantes”. Se você deseja começar a usa a ferramenta, mas não sabe por onde começar, os posts da série pode ser um bom caminho, mas é claro que não é “meia dúzia” que irei conseguir falar tudo sobre Git. Vou buscar  algo prático e com um pouco de teoria para quem está no 0x0. E para começar nada melhor que  ver como instalar o Git no Ubuntu que é fácil demais.  É muito simples e rápido.

Lets go…

O que é Git?

Bem,  se você sabe ou nem tem idéia, dar uma olhada http://pt.wikipedia.org/wiki/Git. Não gosto de repetir informação, então nada melhor que o Wikipedia pra dar um overview.

Instalando

Para instalação do Git no Ubuntu é preciso apenas uma linha de comando:

sudo apt-get install git-core git-doc git-gui gitk

Responda “y” ou “yes” para pergunta de confirmação da instalação dos pacotes.

Em seguida digite: git –version

Configurando

Agora vamos configurar nosso usuário:

 

O email:

 

Se vc tem uma conta no GitHub use o mesmo e-mail.

E assim feito, Git instalado. Agora vamos ver como usa-lo. O comando a seguir inicializa o Git:

 Git init

Pronto!! Agora você já pode usar o Git na sua máquina, basta versionar os seus arquivos que deseja commit e mandar bala. Se você é novo com Git, terá que ver os command line mais usados e ir aprendendo

Se você não quer usar via command line, há um GUI que parece ser interessante http://live.gnome.org/giggle  que ainda não experimentei. Fica à dica.

Vou ficando por aqui espero que tenham gostado do post

Abracos, see ya!!!

Série DesignPattern: Visitor

Olá Pessoal,

Chegamos ao último post da Série DesignPattern. E hoje vamos conhecer o padrão de comportamento Visitor. Em resumo, o Visitor permite atualizarmos uma coleção de objetos de acordo com o tipo de cada objeto contido na coleção. Na prática você tem uma lista com vários objetos com tipos diferentes e cada um sofrerá um tipo de atualização. Neste post vamos ver isso, praticando com o conceito de contas bancárias.

Lets go…

Visitor

Permite atualizações específicas em uma coleção de objetos de acordo com o tipo particular de cada objeto.

Exemplo: posso ter uma lista de contas: poupança, corrente, digital etc. O banco pode querer atualizar a taxa para o valor X com base no tipo. Se for poupança, a taxa de rendimento será 0.5%, se for corrente será 0.0%. No diagrama a seguir temos uma ideia do Visitor. Fiz com base no nosso exemplo.

Praticando

A seguir teremos o projeto e a implementação. Como sempre, há comentários chamando atenção para o que considerei importante.  Crie um projeto conforme a imagem seguir:

Criando o Visitor AtualizadorConta (interface)

Primeiramente vamos criar o nosso Visitor, pois ele define os objetos responsáveis pelas atualizações:

package br.com.camilolopes.visitor;

import br.com.camilolopes.classes.ContaCorrente;

import br.com.camilolopes.classes.ContaPoupanca;

/*O tal do Visitor que define os objetos responsaveis

* pelas atualizações: Conta Corrente & Conta Poupança

*/

public interface AtualizadorConta {

void atualiza(ContaCorrente contaCorrente);

void atualiza(ContaPoupanca contaPoupanca);

}

Claro que ainda não temos as classes ContaCorrente e ContaPoupanca. Portanto, vamos criá-las em alguns minutos.  Mas antes precisamos criar a nossa classe abstract Conta e a interface Atualizável, que representa um Element, ou seja, sabemos os objetos que podem ser atualizados pelo Visitor.

Atualizavel.java (interface)

package br.com.camilolopes.interfaces;

import br.com.camilolopes.visitor.AtualizadorConta;

/*Element: interface que define os objetos que podem

* ser atualizados por um Visitor

*

*/

public interface Atualizavel {

void atualiza(AtualizadorConta atualizadorConta);

}

Conta.java

A classe Conta implementa a Interface Atualizável. Isso, lá na frente, vai evitar o uso de if/else encadeados para verificar o tipo. Você vai ver que não temos if/else no nosso código, tudo é baseado no tipo do objeto. Muito show!!!

package br.com.camilolopes.classes;

import br.com.camilolopes.interfaces.Atualizavel;

publicabstractclass Conta implements Atualizavel {

privatedouble saldo;

public Conta(double saldo) {

this.saldo = saldo;

}

publicdouble getSaldo() {

return saldo;

}

publicvoid setSaldo(double saldo) {

this.saldo = saldo;

}

}

ContaCorrente.java

package br.com.camilolopes.classes;

import br.com.camilolopes.visitor.AtualizadorConta;

public class ContaCorrente extends Conta{

private double saldo;

public ContaCorrente(double saldo) {

super(saldo);

this.saldo = saldo;

}

public void setSaldo(double saldo) {

this.saldo = saldo;

}

public double getSaldo() {

return saldo;

}

@Override

public void atualiza(AtualizadorConta atualizadorConta) {

atualizadorConta.atualiza(this);

}

}

ContaPoupanca.java

package br.com.camilolopes.classes;

import br.com.camilolopes.visitor.AtualizadorConta;

public class ContaPoupanca extends Conta{

private double saldo;

public ContaPoupanca(double saldo) {

super(saldo);

this.saldo = saldo;

}

public void setSaldo(double saldo) {

this.saldo = saldo;

}

public double getSaldo() {

return saldo;

}

@Override

public void atualiza(AtualizadorConta atualizadorConta) {

atualizadorConta.atualiza(this);

}

}

Agora precisamos criar a classe que tem as contas, ou seja, um Banco tem N tipos de contas. Então criamos a nossa classe Banco responsável por ter as contas.

Banco.java

package br.com.camilolopes.classes;

import java.util.ArrayList;

import java.util.List;

import br.com.camilolopes.visitor.AtualizadorConta;

public class Banco {

private List<Conta> contas = new ArrayList<Conta>();

public List<Conta> getContas() {

return contas;

}

public void setContas(List<Conta> contas) {

this.contas = contas;

}

public void atualizando(AtualizadorConta atualizadorConta){

for (Conta conta :this.contas) {

/*aqui que tem a mágica

* chama a conta com base no tipo

* evitamos if/else encadeados

*/

conta.atualiza(atualizadorConta);

}

}

}

note: Observe que nossa lista é focada na classe abstract. Se amanhã surgir um novo tipo de conta, precisamos apenas informar ao Visitor o novo tipo de conta e o que ele precisa atualizar.

Pronto! Tudo já certinho. Vamos testar para ver se de fato as atualizações na coleção acontecem com base no tipo do objeto. Para isso criei uma classe com o método main:

VisitorMain.java

package br.com.camilolopes.main;

import java.util.ArrayList;

import java.util.List;

import br.com.camilolopes.classes.AtualizaConta;

import br.com.camilolopes.classes.Banco;

import br.com.camilolopes.classes.Conta;

import br.com.camilolopes.classes.ContaCorrente;

import br.com.camilolopes.classes.ContaPoupanca;

public class VisitorMain {

public static void main(String[] args) {

//lembre-se um banco tem N contas

List<Banco> lista = new ArrayList<Banco>();

//criando as contas

ContaCorrente contaCorrente = new ContaCorrente(100.00);

ContaPoupanca contaPoupanca = new ContaPoupanca(1000.00);

//criando o Banco

Banco bancoX = new Banco();

//adicionando as contas ao Banco

bancoX.getContas().add(contaPoupanca);

bancoX.getContas().add(contaCorrente);

lista.add(bancoX);

AtualizaConta atualizaConta = new AtualizaConta();

//atualizando as contas por Banco

for(Banco banco : lista){

banco.atualizando(atualizaConta);

}

//verificando atualização

for(Banco b :lista){

for(Conta c : b.getContas()){

System.out.println(c.getClass().getSimpleName() + ” ” + c.getSaldo());

}

}

}

}

Resultado

A seguir temos o resultado. Veja que os valores foram atualizados com base no cálculo:


GitHub

Os projetos Java da série estão no meu GitHub: https://github.com/camilolopes/workspacedesignpattern.git

Feito pessoal. Vou ficando por aqui… espero que vocês tenham gostado do post e da série DesignPattern.

Abracos, see ya!!

Série DesignPattern:State

Olá Pessoal,

No post de hoje vamos conhecer o design pattern chamado State. Em poucas palavras, ele é baseado no comportamento do objeto. Se o comportamento foi alterado para Y, então a forma de trabalho desse objeto é Y. Vamos ver colocando à mão na massa, acho que será mais produtivo.

Lets go…

Download dos projetos

https://github.com/camilolopes

State

É um padrão comportamental do design pattern. Este é focado em saber se o estado de um objeto foi alterado. Ou seja, o State permite alterar o comportamento de um objeto com base no estado atual.

Se o taxímetro é bandeira 1, o cálculo é feito de maneira X, com valores Y, mas se o estado atual saiu de bandeira 1 e foi para bandeira 2, o cálculo é feito de maneira  X com valor Z.

No diagrama que criei acima mostra como as classes se entendem.

Na Prática

Agora vamos conhecer praticando, e como sempre, código no modo didático para ajudar quem está vendo o assunto pela primeira vez. A seguir, nosso projeto:

Bandeira.java

Criaremos inicialmente a interface state, que é a Bandeira.

Bandeira.java

package br.com.camilolopes.interfaces.state;

public interface Bandeira {
    double calculoBandeira(double distancia);
}

As classes Bandeira 1, Bandeira2.java são classes  que implementam o State, ou seja, Bandeira 1 tem uma formula X de cálculo, a bandeira 2 também terá a forma dele calcular e assim sucessivamente.

package br.com.camilolopes.classes;
import br.com.camilolopes.interfaces.state.Bandeira;
public class Bandeira1 implements Bandeira {
    @Override
    public double calculoBandeira(double distancia) {        
        double total = distancia * 1.5 ;
        return total;
    }
}

Bandeira2.java

package br.com.camilolopes.classes;
import br.com.camilolopes.interfaces.state.Bandeira;
public class Bandeira2 implements Bandeira {
    @Override
    public double calculoBandeira(double distancia) {
        //não gosto muito desses number magic aqui, mas vou deixar por enquanto
        double total = distancia * 3.0 + 1.0;
        return total;
    }
}

Taximetro.java

package br.com.camilolopes.classes;
import br.com.camilolopes.interfaces.state.Bandeira;
/*
 * classe que mantem referencia para um State com base no estado atual
 */
public class Taximetro {
    /*um taximetro has-a bandeira
     * ou seja, para um taximetro ter vida
     * ele precisa estar associado com uma bandeira
     */
    private Bandeira bandeira;

    public Taximetro(Bandeira bandeira) {
        super();
        this.bandeira = bandeira;
    }

    public Bandeira getBandeira() {
        return bandeira;
    }

    public void setBandeira(Bandeira bandeira) {
        this.bandeira = bandeira;
    }
    //aqui o taximetro vai calcular c/ base no tipo de Bandeira
    public double calculaCorrida(double distancia){
        double totalCorrida = bandeira.calculoBandeira(distancia);
    return totalCorrida;
    }
}

Criamos o relacionamento entre o Taxímetro e a Bandeira, já que para o taxímetro existir precisa de uma bandeira.

TaximetroMain.java

import br.com.camilolopes.classes.Bandeira1;
import br.com.camilolopes.classes.Bandeira2;
import br.com.camilolopes.classes.Taximetro;

public class TaxiMain {

    public static void main(String[] args) {
        Bandeira1 bandeira1 = new Bandeira1();
        Taximetro taximetro = new Taximetro(bandeira1);
        taximetro.setBandeira(bandeira1);
        System.out.println(“Valor da corrida com bandeira 1: “+ taximetro.calculaCorrida(2.0));
        taximetro.setBandeira(new Bandeira2());
        System.out.println(“O valor da corrida com bandeira 2: ”    + taximetro.calculaCorrida(2.0));
    }
}

Feito isso, criamos uma classe main que vai nos ajudar a ver o resultado com base no tipo passado.

Resultado

A seguir temos o resultado com a Bandeira 1 e 2. Observe que a distância passada foi a mesma, porém o resultado diferente, já que cada Bandeira tem um cálculo específico e o nosso Taxímetro sabe o que mostrar com base no estado da Bandeira (1,2,3…)

E esse é o design pattern state. Vou ficando por aqui e até o próximo post.

See ya!!

Série DesignPattern: Observer

Olá Pessoal,

No post de hoje vamos conhecer o padrão comportamental Observer, que tem como objetivo notificar e atualizar classes dependentes de forma automática com base no status. Veremos isso na prática, simulando uma notificação em uma fila por meio de um painel eletrônico.

Lets go…

Observer

Tem como função notificar e atualizar automaticamente classes que dependem do status de outra para fazer uma ação.

Ex.: Quando o estoque do Produto X ficar abaixo de 20, automaticamente notifica o fornecedor.

Essa é uma prática comum em grandes redes de supermercado para manter os produtos de alta demanda sempre disponível para o cliente. Exemplo: “Leite Ninho”. Há uma integração entre o sistema do supermercado e fornecedor, um Observer. Para o fornecedor não ter que ficar todo dia verificando o estoque do supermercado, é melhor que ele seja notificado quando a quantidade de produto estiver próximo de acabar.

Outro exemplo é quando vamos ao supermercado ou ao banco e há um painel eletrônico que nos informa o caixa livre que devemos ir, mas para isso acontecer é preciso que o caixa notifique o painel que ele já está disponível.

No diagrama acima há um esboço do relacionamento entre as classes.

Vamos ver isso na prática. A seguir, o nosso projeto Observer:

 

Primeiramente vamos criar a nossa interface Observer:

 

package br.com.camilolopes.observer;

import br.com.camilolopes.classes.Caixa;

public interface Observer {

void notificaPainel(Caixa caixa);

}

 

Ela tem um método que recebe o caixa disponível.

 

Agora vamos criar a classe Caixa que notifica o Painel quando o status é alterado:

 

Caixa.java

package br.com.camilolopes.classes;

import java.util.HashSet;

import java.util.Set;

import br.com.camilolopes.observer.Observer;

public class Caixa {

private boolean status = false;

//apenas os caixas  que estão funcionando serão os interessados

private Set<Observer> interessados = new HashSet<Observer>();

private String nomeCaixa;

//todo caixa tem um nome + um nro.

public Caixa(String nomeCaixa) {

this.nomeCaixa = nomeCaixa;

}

public boolean isStatus() {

return status;

}

/*

* quando o status é alterado

* notifica o painel

*/

public void setStatus(boolean status) {

this.status = status;

/*

* A mágica está aqui. Notificados o painel que o caixa

* foi alterado. No nosso caso temos apenas um Painel, mas

* poderíamos ter N painéis. Observe quantos painéis temos

* em uma agência bancaria: Um para pessoa física, caixa rápido

* pessoa jurídica etc. Cada um associado a um tipo de caixa (01,02…)

*/

for(Observer interessado : interessados){

interessado.notificaPainel(this);

}

}

public void registraInteressado(Observer interessado){

this.interessados.add(interessado);

}

public String getNomeCaixa() {

return nomeCaixa;

}

public void setNomeCaixa(String nomeCaixa) {

this.nomeCaixa = nomeCaixa;

}

}

 

Precisamos agora criar o interessado em saber quando o status do caixa é alterado, que no nosso caso é o Painel.

 

package br.com.camilolopes.observer;

import br.com.camilolopes.classes.Caixa;

/*

* o interessado em saber a mudança

* do status */

public class Painel01 implements Observer {

 

@Override

public void notificaPainel(Caixa caixa) {

System.out.println(“O ” + caixa.getNomeCaixa() + ” está disponivel.Status alterado para ” + caixa.isStatus());

}

}

Para finalizar, temos uma classe com método main para validar:

 

ObserverMain.java

package br.com.camilolopes.main;

import br.com.camilolopes.classes.Caixa;

import br.com.camilolopes.observer.Painel01;

public class ObserverMain {

public static void main(String[] args) {

Painel01 painel01 = new Painel01();

//poderiamos ter outros paineis para N caixas

//teve o status alterado

Caixa caixa1 = new Caixa(“Caixa 1”);

caixa1.registraInteressado(painel01);

caixa1.setStatus(true);

Caixa caixa2 = new Caixa(“Caixa 2”);

caixa2.registraInteressado(painel01);

//nao teve o status alterado

}

}

 

Rode a aplicação e veja o resultado.

Resultado

Aqui está o nosso resultado. Observe que exibe apenas alteração para o caixa 1, pois este objeto sofreu alteração.

Vou ficando por aqui, espero que tenham gostado do post.

Abraços, see ya.