aplicacoes, linux

Git no Ubuntu

Preparando o ambiente:

sudo apt-get install git-core
sudo apt-get install gitk
sudo apt-get install ssh
sudo apt-get install meld

Verificar versão corrente do Git:

git --version

Criando um par de chaves SSH:

ssh-keygen -t rsa

[dê Enters para todas as perguntas]

Será gerado um par de chaves na pasta /home/$USER/.ssh
A pública será copiada para um servidor remoto (em ~/.ssh/authorized_keys).
A privada deve ser mantida em sigilo.

Ferramenta externa para Diff e Merge:

Criar em /usr/local/bin os arquivos….

extDiff, contendo:

#!/bin/sh
[ $# -eq 7 ] && meld "$2" "$5"

e extMerge, contendo:

#!/bin/sh
meld $*

Dê permissão de execução para ambos os arquivos.

Toda vez que um git diff for executado, a ferramenta gráfica meld será chamada ao invés do terminal exibir diversos trechos dos N arquivos alterados localmente (com diversas linhas sendo impressas 2 vezes com cores diferentes). Meld vai dividir a tela com as 2 versões do arquivo: original e alterada, apresentando marcadores que ajudarão a enxergar todas as mudanças nos arquivos. Após fechar o meld para a analise do arquivo corrente, ele será automaticamente re-aberto para a analise do próximo arquivo.

Após a execução de um git pull, é possível que seja informado que houve um conflito entre a versão do servidor e a da sua máquina, e que a sua precisa ser manualmente revista antes de se fazer o git push. Chamando git mergetool, o meld será executado dividindo a tela em 3 versões do arquivo: a do servidor, a sua e a que será mergeada. A partir das 2 versões, basta “montar” a versão mergeada. Ao terminar, salve o trabalho e saia do meld. Pronto: já é possível fazer um git push. Talvez seja necessário deletar manualmente alguns arquivos intermediários gerados (backups do estado pré-merge).

Configurações iniciais de usuário:

git config --global user.name "MEU_LOGIN"
git config --global user.email MEU_EMAIL
git config --global diff.external extDiff
git config --global merge.tool extMerge
git config --global mergetool.extMerge.cmd 'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
git config --global mergetool.trustExitCode false
git config --global color.ui true

Verificar as configurações:

git config --list

O Git trabalha com 4 áreas de trabalho:
1. Repositório: É o arquivo .git localizado na raíz do projeto, criado pelo comando git init.
2. Working Directory: São todos os arquivos do diretório, exceto .git, representando uma “foto” do projeto.
3. Index (ou Stage): É um buffer onde serão indexadas as modificações a serem enviadas para o Repositório ou para o Stash
4. Stash: É um sistema de armazenamentos temporários gerenciado pelo Git.

Dúvidas:

git help

Iniciar um novo repositório local, a partir do diretório corrente:
Também é possível criar um repositório sem Working Directory (num servidor remoto que nunca fará commits, apenas os receberá).

git init
git init --bare

Copiar um repositório local ou remoto, trazendo apenas o branch master remoto:

git clone PATH/.git

Verificar qual é o repositório do qual eu clonei o meu (quem é meu origin):

git remote -v
git remote show origin

Fazer com que um repositório clonado também seja origin do meu repositório gerando uma via de mão dupla:

git remote add origin PATH/.git

Remover a associação de um repositório com seu origin:

git remote rm origin

Mostrar o branch no qual você está, quais arquivos estão no índice e quais não estão.

git status

Adicionar 1, N ou todos os arquivos descritos em git status como “untracked” para dentro do índice.

git add ARQUIVO_1
git add ARQUIVO_1 ARQUIVO_2 ARQUIVO_3
git add .

Adicionar arquivos de forma interativa:

git add -i

Retirar do controle de versão 1 ou N arquivos.
Os arquivos continuarão no sistema de arquivos e voltarão a ser listados pelo git status como “untrackeds”.

git rm --cached ARQUIVO_1
git rm --cached ARQUIVO_1 ARQUIVO_2

Cancelar a adição de 1, N ou todos os arquivos do índice.

git reset HEAD ARQUIVO_1
git reset HEAD ARQUIVO_1 ARQUIVO_2
git reset HEAD

Apagar todos os arquivos untracked da Working Area:

git clean -f

Desfazer alterações de 1 ou N arquivos, restaurando seus estados de acordo com o repositório.

git checkout -- ARQUIVO_1
git checkout -- ARQUIVO_1 ARQUIVO_2

Salvar no repositório as alterações incorporadas no índice.
Além de copiar as mudanças no projeto para dentro do repositório, todos os arquivos adicionados ao índice serão retirados pois eles já terão sido versionados.

git commit -m "MENSAGEM EXPLICANDO QUE MUDANÇAS FORAM REALIZADAS"

Adicionar modificações no índice e salvar no repositório em um único comando.
Atenção: esta opção não adiciona ao índice arquivos não versionados: apenas os modificados.
Evite usar esta opção.

git commit -a -m "MENSAGEM EXPLICANDO QUE MUDANÇAS FORAM REALIZADAS"

Adicionar conteúdo ao último commit realizado.
A nova mensagem informada irá substituir a mensagem anterior.
Não use este recurso após ter feito um push.
Isso é um tipo de operação destrutiva, pois “substitui” o commit anterior

git commit -m "MENSAGEM EXPLICANDO QUE MUDANÇAS FORAM REALIZADAS" --amend

Exibe modificações nos arquivos não adicionados na stage area ou os já adicionados.

git diff
git diff --staged

Verifica histórico, estatísticas e outras informações dos commits realizados.

git log --stat

O arquivo .gitignore diz para o git que tipos de arquivos não devem ser considerados tanto para criação quanto para modificação.
Ainda assim, é possível adicioná-los ao índice através do comando add com opção -f:

git add ARQUIVO_1 -f

Cancelar 1, 2 ou mais commits.
Esta operação faz com que os arquivos voltem ao índice (ainda modificados), mas desfaz o commit.

git reset HEAD~1 --soft
git reset HEAD~2 --soft

Eliminar 1, 2 ou mais commits.
Isso é um tipo de operação destrutiva, pois “apaga” commits anteriores, e desfaz todas as mudanças nos arquivos.

git reset HEAD~1 --hard
git reset HEAD~2 --hard

Rever os commits destruídos pelo amend e pelos reset HEAD~N –hard.
Veja que os hashs destes commits serão apresentados, para que possam ser recuperados.

git reflog

Recuperar commits destruídos:

git merge HASH

Esconder mudanças automaticamente ou com alguma “identificação”.
Faça alterações no working area, copie essas alterações para o índice e depois esconda-as pra poder se focar em outro serviço.

git stash
git stash save "ALGUMA IDENTIFICAÇÃO"

Listar mudanças escondidas.

git stash list

Recuperar mudanças escondidas de volta para o índice.
Sem parâmetros, o comando irá recuperar a última mudança adicionada na pilha e copiá-la para o índice.
É possível informar qual mudança deseja-se recuperar através da identificação obtida pelo comando git stash list.

git stash apply
git stash apply stash@{0}
git stash apply stash@{1}
git stash apply stash@{2}

Deletar uma das mudanças escondidas.
Sem parâmetros, o comando irá deletar a última mudança adicionada na pilha.
É possível informar qual mudança deseja-se deletar através da identificação obtida pelo comando git stash list.

git stash drop
git stash drop stash@{0}
git stash drop stash@{1}
git stash drop stash@{2}

Remover todas as mudanças escondidas.

git stash clear

Remover a última mudança escondida, e copiá-la para o índice.

git stash pop

Lista branches e mostra qual é o corrente.
Também é possível adicionar na listagem os branches de origin.

git branch
git branch -a

Criar um novo branch e passar a usá-lo.
Também é possível criar um branch a partir de outro branch remoto, ou do hash descrito no log.

git checkout -b NOME_DO_BRANCH
git checkout -b NOME_DO_BRANCH origin/NOME_DO_BRANCH_REMOTO
git checkout -b NOME_DO_BRANCH SHA1

Passar a trabalhar em outro branch.

git checkout NOME_DO_BRANCH

Deletar um branch remoto

git push origin --delete NOME_DO_BRANCH

Exibir o histórico de commits.

gitk --all &

Merge do branch corrente com outro, desde que o outro seja uma evolução do corrente.

git merge OUTRO_BRANCH

Merge do branch corrente com outro, sendo que os branches evoluíram de formas diferentes, mas têm um início em comum.

git rebase OUTRO_BRANCH

Remover um branch.
Se o branch deletado não tiver sido mergeado completamente no master e ainda assim desejarmos removê-lo, use -D.

git branch -d OUTRO_BRANCH_MERGEADO
git branch -D OUTRO_BRANCH_NAO_MERGEADO

Agrupar diversos commits de um branch num único na hora de copiá-los para outro branch.
As mudanças dos N commits de OUTRO_BRANCH vão para o índice do branch corrente, para então ser realizado um único commit.

git merge OUTRO_BRANCH --squash

Empurrar os commits do meu repositório para o repositório origin.
Também é possível empurrar commits para um branch específico de origin.

git push
git push origin NOME_DO_BRANCH

Puxar os commits do repositório origin para o meu repositório.
Também é possível puxar commits de um branch específico de origin.

git pull
git pull origin NOME_DO_BRANCH

Criar uma tag a partir do ponto atual do branch.
Depois é possível enviar esta tag para origin e mais tarde criar um branch a partir desta tag.

git tag VERSAO
git push --tags
git checkout -b MEU_BRANCH VERSAO

Voltar o branch para um checkout anterior

git checkout NOME_DO_BRANCH
git reset --hard 001100110011
git push --force origin NOME_DO_BRANCH

Referência:

http://vimeo.com/43683141
http://www.vogella.com/articles/Git/article.html
http://git-scm.com/book/pt-br/Customizando-o-Git-Configura%C3%A7%C3%A3o-do-Git
http://try.github.io/levels/1/challenges/15

http://stackoverflow.com/questions/17667023/git-how-to-reset-origin-master-to-a-commit

desenvolvimento, linux, python

Ambientes virtuais para Python no Ubuntu

Preparando o ambiente:

sudo apt-get install python-pip
sudo apt-get install python-virtualenv
sudo apt-get install virtualenvwrapper

Adicione o controle de cache para baixar os pacotes do pip apenas uma vez:

echo 'export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache' >> $HOME/.bashrc 

Para criar uma máquina virtual para o projeto MEU_PROJETO sem acesso aos pacotes do sistema:

mkvirtualenv -p /usr/bin/python2 MEU_PROJETO

Para criar uma máquina virtual para o projeto MEU_PROJETO com acesso aos pacotes do sistema:

mkvirtualenv -p /usr/bin/python2 MEU_PROJETO --system-site-packages

Para começar a trabalhar nesta vm, basta entrar com o comando:

workon MEU_PROJETO

Agora, todas as modificações ou instalações de pacotes ocorrem apenas para esta vm, sem interferir nas demais, ou no ambiente do host.

ATENÇÃO:
O switch para esta vm ocorreu apenas neste terminal aberto.
Se você trabalhar em múltiplos terminais (num deles você entrou no shell do python, noutro você carregou um servidor web) terá que ter executado o comando workon em cada terminal.

Instalando o Django 1.4, por exemplo:

Verifique que não temos o django ainda na nossa nova vm:

pip freeze

Agora instalamos o pacote. É preferível especificar a versão que queremos, caso contrário ele irá baixar a versão mais recente. Se quiséssemos sempre as últimas versões, não precisaríamos virtualizar ambientes.

pip install django==1.4

Verifique novamente o pip freeze. Agora ele contempla o django 1.4

Para sair de uma vm e voltar para o host:

deactivate

Agora os pacotes exibidos pelo pip freeze serão referente ao host, e não à nossa vm.

Um pacote que não controlamos pelo pip em uma vm é o próprio python.
Se você desejar usar o python 3, por exemplo, ele deve ser definido na criação da vm (no comando mkvirtualenv).

Para saber que opções de python você tem verifique com:

ls /usr/bin/python*

Para criar ambientes virtuais com alguns pacotes sendo instalados na geração:

gedit $HOME/.virtualenvs/postmkvirtualenv

Adicione no arquivo N comandos de instalação: “pip install PACOTE”

desenvolvimento, java

Double Buffer em Java

Sobrescrever o método update do componente que irá renderizar a imagem. Do contrário ele sempre irá chamar o método clearRect herdado de Container, que irá produzir o efeito de “flick” ao limpar a tela.

@Override
public void update(Graphics g) {
    paint(g); // não limpa a tela: apenas rechama o método paint
}

Desenhar no objeto graphics de uma imagem offscreen tudo que será renderizado. Só então copiar esta imagem pronta para a saída padrão do componente:

@Override
public void paint(Graphics g) {
    Image offscreen = createImage(width, height); 
    Graphics backBuffer = offscreen.getGraphics(); 
        
    backBuffer.clearRect(0, 0, width, height); 

    // desenhos feitos por este método
    backBuffer.drawString...
    backBuffer.drawRect...
    backBuffer.drawOval...
    backBuffer.drawLine...
    backBuffer.drawImage...

    // desenhos feitos por objetos complementares
    meuObjeto.paint(backBuffer);

    // copia todo o desenho para a tela
    g.drawImage(offscreen, 0, 0, this);
}

Quando quiser atualizar a tela, basta chamar repaint normalmente.

agil, motivacao

14 Princípios do Sistema Toyota de Produção

Princípio 1. Apoie suas decisões de gerenciamento em uma filosofia de longo prazo.

Tenha um senso filosófico de propósito que supere qualquer tomada de decisão a curto prazo. Trabalhe, cresça e alinhe-se num propósito que seja maior que fazer dinheiro. Entenda seu lugar na história e trabalhe para chegar ao próximo nível. Sua filosofia será a fundação para todos os demais princípios.

Gere valor ao cliente, à sociedade e à economia: essa é sua partida. Avalie cada passo em termos da sua habilidade de conquistar isso.

Seja responsável. Lute para decidir seu próprio caminho. Confie em suas próprias habilidades. Aceite responsabilidade por sua conduta e melhore as habilidades que lhe permitam produzir valor agregado.

Princípio 2. Crie um fluxo contínuo de processo que traga os problemas à tona.

Redefina os processos de trabalho para alcançar um alto valor agregado. Lute para zerar a quantidade de tempo que qualquer projeto fique ocioso ou dependendo de alguém que o resolva.

Crie um fluxo que mova rapidamente materiais e informações unindo pessoas e processos de forma que os problemas apareçam imediatamente.

Deixe o fluxo evidente por toda cultura da organização. É a chave para o verdadeiro processo de melhoria contínua e para desenvolver as pessoas.

Princípio 3. Use sistemas de coleta para evitar produção excedente.

Ofereça aos seus clientes o que eles precisam, na hora certa e na quantidade necessária. Reposição de estoques iniciado pelo consumo é o princípio básico da pontualidade.

Minimize seu trabalho e inventário estocando pequenas quantidades de cada produto e frequentemente repondo baseado no que o consumidor realmente retira.

Seja atento aos turnos diários referentes a demanda do consumidor ao invés de confiar em sistemas de agendamentos automáticos para rastrear inventário perdido.

Princípio 4. Nivele a carga de trabalho (heijunka). (Trabalhe como a tartaruga, não como a lebre.)

Eliminar desperdício é apenas um terço da equação para obter sucesso em lean. Eliminar sobrecarga de pessoas e equipamentos e eliminar erros na agenda de produção são tão importantes quanto: ainda assim isso geralmente não é entendido nas empresas que tentam implementar os princípios de lean.

Trabalhe para nivelar a carga de trabalho de todos os processos de manufatura e serviços como alternativa para a abordagem parar/continuar de trabalho em projetos em lotes que é comum na maioria das empresas.

Princípio 5. Crie uma cultura de parar pra corrigir problemas para obter qualidade logo na primeira vez.

A qualidade significa valor para o cliente.

Use todos os mais modernos métodos de qualidade disponíveis.

Construa em seus equipamentos a capacidade de parar ao detectar problemas. Desenvolva um sistema visual que alerte o time ou os líderes de projeto que uma máquina ou processo precisam de assistência. Jidoka (máquinas com inteligência humana) é a fundação para “produzir” qualidade.

Crie em sua organização um sistema de suporte para resolver rapidamente os problemas e oferecer soluções.

Crie em sua cultura a filosofia de parar ou diminuir até obter a qualidade apropriada desde o início para melhorar a produtividade a longo prazo.

Princípio 6. Tarefas e processos padronizados são a fundação para melhoria contínua e capacitação de funcionários.

Use métodos estáveis e reproduzíveis em todo lugar para manter a previsibilidade, sincronia e saídas normais de seus processos. Essa é a fundação para fluxo e coleta.

Capture a sabedoria acumulada de um processo para padronizar as melhores práticas atuais. Permita que expressões criativas e individuais melhorem o padrão; então incorpore-as num novo padrão de modo que quando a pessoa se ausentar você possa passar o conhecimento para a próxima.

Princípio 7. Use controle visual para que nenhum problema se esconda.

Use indicadores visuais simples para ajudar as pessoas a determinar imediatamente se elas estão em condições normais ou se elas se desviaram.

Evite usar uma tela de computador quando ela tirar o foco do trabalhador de seu trabalho.

Projete sistemas visuais simples no local onde o trabalho é feito para ajudar o fluxo e a coleta.

Diminua seus relatórios para um pedaço de papel quando for possível, mesmo para suas mais importantes decisões financeiras.

Princípio 8. Use apenas tecnologia confiável e profundamente testada que sirva seu pessoal e seu processo.

Use tecnologia que ajude as pessoas, não que as substitua. Frequentemente é melhor trabalhar num processo manualmente antes de adicionar tecnologia que ajude no processo.

Novas tecnologias são frequentemente instáveis e difíceis de padronizar e portanto arriscam o fluxo. Um processo certificado que funcione geralmente leva vantagem sobre tecnologias novas e sem testes.

Conduza um ritual de testes reais antes de adotar novas tecnologias nos processos de negócio, nos sistemas de manufatura e nos produtos.

Rejeite ou modifique tecnologias que conflitam com sua cultura ou que possam atrapalhar a estabilidade, confiabilidade e previsibilidade.

Ainda assim, encoraje seu pessoal a considerar novas tecnologias quando procurarem novas abordagens de trabalho. Rapidamente implemente uma tecnologia avaliada profundamente se ela se provou em julgamentos e ela possa melhorar o fluxo nos seus processos.

Princípio 9. Fortaleça líderes que entendam o trabalho meticulosamente, vivem a filosofia e a ensinam a outros.

Fortaleça os líderes de dentro, ao invés de comprá-los de fora da organização.

Não veja o trabalho do líder simplesmente como cumprir tarefas e ter boas habilidades com pessoas. Líderes devem ser modelos da filosofia e forma de agir da empresa.

Um bom líder deve entender o trabalho diário detalhadamente para que ele possa ser o melhor professor da filosofia da empresa.

Princípio 10. Desenvolva pessoas excepcionais e times que sigam a filosofia da empresa.

Crie uma cultura forte e estável na qual os valores e crenças da empresa sejam largamente compartilhados e vividos por muitos anos.

Treine indivíduos excepcionais e times que trabalhem dentro da filosofia da empresa para alcançar resultados excepcionais. Trabalhe bastante para reforçar a cultura continuamente.

Use equipes multi disciplinares para melhorar a qualidade e produtividade e aumentar o fluxo ao resolverem problemas técnicos complexos. Superação ocorre quando as pessoas usam as ferramentas da empresa para melhorar a empresa.

Faça um esforço constante para ensinar indivíduos como trabalharem juntos como equipe em direção a objetivos em comum. Trabalho em equipe é algo que precisa ser aprendido.

Princípio 11. Respeite sua rede de parceiros e fornecedores ao desafiá-los e ajudá-los a melhorar.

Tenha respeito por seus parceiros e fornecedores e trate-os como uma estensão do seu negócio.

Desafie seus parceiros externos de negócio a crescer e evoluir. Isso mostra que você os valoriza. Estabeleça alvos de desafio e ajude seus parceiros a alcançá-los.

Princípio 12. Vá e veja você mesmo para entender profundamente a situação (genchi genbutsu).

Resolva problemas e melhore processos indo até a fonte e observando e verificando pessoalmente os dados ao invés de teorizar baseado no que outras pessoas ou a tela do computador lhe diz.

Pense e fale baseado em dados verificados pessoalmente.

Mesmo os gerentes e executivos de alto nível devem ir e ver as coisas por si, para que tenham mais do que um entendimento superficial da situação.

Princípio 13. Tome decisões lentamente por consenso, cuidadosamente considerando todas as opções; implemente as decisões rapidamente (nemawashi).

Não escolha uma única direção para seguir sem antes considerar cuidadosamente as alternativas. Quando tiver escolhido, siga rápida e continuamente o caminho.

Nemawashi é o processo de discussão de problemas e soluções potenciais com todos os envolvidos, para pegar suas ideias e chegar a um acordo ao caminho a seguir. Este processo consensual, apesar de consumir tempo, ajuda a ampliar a busca por soluções e uma vez que a decisão for tomada, o palco estará pronto para uma rápida implementação.

Princípio 14. Seja uma organização de aprendizado por reflexões rígidas (hansei) e melhoria contínua (kaizen).

Uma vez que você tenha estabelecido um processo estável, use ferramentas de melhoria contínua para determinar a causa raiz das ineficiências e aplicar medidas corretivas eficientes.

Modele processos que não precisem de muito inventário. Isso irá expor para todos as perdas de tempo e recursos. Uma vez que as perdas são expostas, faça com que os funcionários usem um processo de melhoria contínua (kaizen) para eliminá-los.

Proteja a base de conhecimento da organização desenvolvendo pessoal estável, promoções lentas e sistemas de sucessão muito cuidadosos.

Use hansei (reflexão) em marcos importantes e ao término do projeto para que possa identificar claramente todas as deficiências do mesmo. Desenvolva medidas que evitem que os mesmos erros se repitam.

Aprenda com as padronizações das melhores práticas, invés de reinventar a roda em cada novo projeto e cada novo gerente.

Referência:
http://icos.groups.si.umich.edu/Liker04.pdf

motivacao

Daniel Pink: Ciência da Motivação

Motivadores intrínsecos:

Autonomia: Desejo de conduzir nossas próprias vidas.

Domínio: Impulso de ser cada vez melhor em algo que importa.

Propósito: Ânsia de fazer as coisas a serviço de algo maior que nós mesmos.

Lições de Carreira:

Não existe um plano: Não se pode mapear tudo. Não há um caminho definido, mas há um caminho. Tome decisões espertas.
“Não se pode conectar os pontos olhando pra frente, apenas olhando pra trás.”

Foque em forças, não em fraquezas: Capitalize naquilo que você é bom. Identifique suas forças e torne-as insanamente grandiosas.
Naquilo que você ama e que ao mesmo tempo você é forte, reside sua excepcionalidade. Não fique na média.

Não trata-se de você: Agregue valor, ajude o cliente, use suas forças e talentos a serviço dos outros. Melhore a vida dos outros.
Naquilo que você ama e que ao mesmo tempo você é forte e que ao mesmo tempo o mundo precisa, reside sua missão.

Persistência supera talento: Talentosos podem desistir. Melhore continuamente. Mesmo pequenas melhorias contam. Passo a passo. Prossiga!
Quanto mais motivação intrínseca tiver, mais fácil é persistir. Quanto mais persistir, maior a probabilidade de sucesso.

Cometa erros excelentes: PENSE GRANDE! Melhor chegar próximo de uma meta difícil do que conquistar uma meta fácil.
Se não estiver preparado para errar, não poderá trazer nada de original. Arrisque-se!

Deixe uma impressão: O arrependimento por algo que fizemos passa com o tempo. O arrependimento por algo que não fizemos é inconsolável.
Vivemos por pouco tempo: por que não fazer a diferença, por que não contribuir?

http://www.youtube.com/watch?v=rrkrvAUbU9Y
http://www.slideshare.net/garr/career-advice-08