aplicacoes, linux

Recuperando Arquivos com o Ubuntu

ATENÇÃO: Se você estiver usando o HD que continha os arquivos deletados, desligue imediatamente essa máquina pra não diminuir sua probabilidade de recuperar os dados! Você precisa de OUTRO HD pra tentar recuperar o perdido!!!

Por que você deve desligar o HD com dados perdidos?

O HD funciona como uma caixa com os espaços mapeados. Quando você salva um arquivo, na prática seria como se você colocasse alguns bytes nos espaços disponíveis da caixa, e o sistema de arquivos mapeasse o nome do arquivo (como my_file), a localização (como /home/user/Documents) e em que espaços físicos da caixa estão esses bytes.

Quando você deleta um arquivo (da lixeira ou por linha de comando), o sistema de arquivos se “esquece” desse arquivo. Assim, da próxima vez que você salvar alguma coisa no HD, o sistema de arquivos pode disponibilizar exatamente a posição do arquivo que você perdeu e o novo arquivo salvo vai ser gravado “por cima”. Por isso é melhor desligar logo esse HD antes que o arquivo seja perdido de vez!

Outro HD

Você precisa de um HD com no mínimo o mesmo espaço que o HD com dados perdidos. O motivo é que a forma de recuperação vai rastrear no sistema de arquivos CADA posição física do HD. Toda vez que ele encontrar algo que se pareça com o cabeçalho de algum arquivo (doc, html, java, txt, avi, zip, jar, etc…..) ele tentará seguir em frente até encontrar uma informação que represente o final do arquivo.

Se encontrar, ele achou 1 arquivo! Se achar outro cabeçalho, pode ser que o arquivo foi mesmo perdido pois esse segundo cabeçalho fará parte de um arquivo que sobrescreveu trechos do arquivo do primeiro cabeçalho, logo esse primeiro arquivo será irrecuperável (a menos que existam formas de localizar arquivos sobrescritos a partir dos rastros eletromagnéticos, com a ajuda dos Ghostbusters talvez).

Processo de recuperação

Baixar photorec, que vem junto com testdisk:

sudo apt-get install testdisk

Conecte o HD com dados perdidos, mas não o monte, se ele for montado pelo sistema operacional, desmonte.

Rodar photorec:

sudo photorec

Siga os passos selecionando:
1. O HD a ser recuperado
2. A partição a ser analisada
3. O tipo de sistema de arquivos
4. Se você quer buscar em tudo, ou apenas nas áreas livres (não faz sentido buscar em tudo)
5. O local onde serão copiados os arquivos encontrados (não salve no mesmo HD a ser recuperado pelos motivos descritos acima!!!).

O meu processo foi realizado num HD externo USB 3.0 de 1 tera com Ubuntu 13.10 buscando arquivos perdidos num HD sata de 500 giga. O processo de busca durou 20 horas. Foram recuperados mais de 250.000 arquivos, que foram gravados em mais de 500 pastas, cada uma com 500 arquivos. Todos os arquivos perderam seus nomes e as estruturas de pastas. Infelizmente a imensa maioria é cache de browser, então há milhares de javascripts, htmls, javas, gifs, pngs que tornam a minha análise realmente chata.

Após horas “garimpando”, encontrei o que procurava, então o processo realmente funciona! E seria ainda mais rápido se eu tivesse feito backup (captou?).

Referência:
http://www.tuxgarage.com/2011/01/recover-deleted-data-using-photorec-in.html

aplicacoes, linux, python

Sublime no Ubuntu

Adicionando o repositório e baixando o Sublime

sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer

Configurando o editor

Clique em Preferences / Settings – User. Acrescente no arquivo:

"draw_white_space": "all",
"ensure_newline_at_eof_on_save": true,
"highlight_line": true,
"ignored_packages":
[
"Vintage"
],
"match_brackets_angle": true,
"rulers": [79],
"tab_size": 4,
"translate_tabs_to_spaces": true,
"auto_complete_triggers": [ {"selector": "text.html", "characters": "<_"}],
"highlight_modified_tabs": true,
"trim_automatic_white_space": true,
"font_size": 13,
"copy_with_empty_selection": false

ATENÇÃO: Adicione vírgulas entre CADA configuração, ou seja: se já houverem outras configurações mantenha a lista bem-formada.

Definindo projetos

Se necessário, clique em Project / Close Project, para garantir uma nova configuração de projetos.
A seguir clique em Project / Add Folder to Project, e escolha a pasta raíz do projeto.
Finalmente clique em Project / Save Project As…, escolha um nome para se referenciar ao projeto e salve.

Melhor salvar essas meta definições de projetos junto com as demais configurações do Sublime:
$HOME/.config/sublime-text-3/Packages/User/projetos

Agora, será possível fazer switch entre projetos.

Snippets

Snippets são palavras especiais que podem ser substituídas por trechos de comandos mais complexos, permitindo maior agilidade na hora de escrever códigos. De acordo com o tipo corrente de sintaxe, snippets específicos estarão disponíveis.

Procure por snippets na paleta de comandos ou crie os seus clicando em Tools / New Snippet… Nomeie o arquivo com o nome desejado para a definição do snippet. Opcionalmente defina o tabTrigger (que vai disparar o snippet) e o scope (que vai associar o snippet a uma sintaxe específica).

Edite espaçamentos corretamente nos snippets para tornar seu uso ainda mais eficiente. Pode-se adicionar pontos de cursor ${1}, ${2}, ${3:Dummy}. ${1} representa onde o cursor começa. Os demais pontos de cursor (${2}, ${3}, ${4}, etc…) podem ser alcançados usando-se TAB. Perceba ainda que pode-se adicionar um valor dummy para o ponto de cursor que começa selecionado quando acessado para poder ser substituído facilmente.

Meu projeto de Snippets no GitHub: https://github.com/JoseThomazini/sublime-snippets-collection

Pacotes

Pacotes são plugins que acrescentam funcionalidades ao Sublime. A pasta onde ficam instalados pode ser encontrada clicando-se em Preferences / Browse Packages… Adicione manualmente nesta pasta os pacotes desejados que ainda não estejam disponíveis através do Package Control.

Instalando Package Control
Acesse http://wbond.net/sublime_packages/package_control/installation e copie a linha de comando de instalação do gerenciador.

No Sublime clique em View / Show Console, cole a linha de comando de instalação e aperte ENTER. Reinicie.
Agora, através da paleta de comandos, procure por “install“, selecione o instalador do Package Control e escolha o plugin desejado.

Instalando outros Pacotes
Baixar através do Package Control:

Anaconda: https://github.com/DamnWidget/anaconda

Djaneiro: https://github.com/squ1b3r/Djaneiro

Emmet: https://github.com/sergeche/emmet-sublime

Em Preferences / Package Settings / Anaconda / Settings – User, acrescente no arquivo:

"pep8_ignore": ["E501"]

Teclas de Atalho Úteis

ctrl+kb: mostra/esconde a side-bar
ctrl+shift+cima: move linha atual ou bloco selecionado para cima
ctrl+shift+baixo: move linha atual ou bloco selecionado para baixo
ctrl+g: pula para a linha escolhida do documento atual
ctrl+q: fechar sublime
ctrl+i: busca incremental do texto no documento atual
ctrl+shift+f: procura texto em todos os arquivos da árvore de diretórios do projeto
ctrl+d: seleciona a palavra onde o cursor está posicionado, ou a próxima palavra idêntica à palavra já selecionada (múltiplos cursores)
alt+F3: seleciona todas as palavras idênticas à palavra onde está o cursor (múltiplos cursores)
ctrl+/: comenta a linha, usando a notação específica da sintaxe atual
ctrl+p: abre pelo nome arquivos dentro da árvore de diretórios do projeto
shift+alt+1: muda layout para apenas um grupo de documentos separados por abas
shift+alt+2: muda layout para dois grupos de documentos separados por abas
ctrl+alt+p: abre seletor para se fazer switch entre projetos
ctrl+shift+p: abre paleta de comandos
ctrl+page-up: vai para a próxima aba
ctrl+page-down: vai para a aba anterior
shift+drag com botão direito do mouse: seleciona colunas (múltiplos cursores)
esc: sai do estado de múltiplos cursores
shift+ctrl+l: define um cursor para cada linha selecionada (múltiplos cursores)
ctrl+r: abre seletor de símbolos
ctrl+1: mover cursor para grupo 1
ctrl+2: mover cursor para grupo 2
(: cerca área selecionada com parênteses
: cerca área selecionada com aspas
[: cerca área selecionada com colchetes
{: cerca área selecionada com chaves
: cerca área selecionada com apóstrofes
ctrl+clique: adiciona novo cursor no ponto selecionado (múltiplos cursores)
alt+r: torna o texto da busca interativa numa expressão regular
alt+ENTER: seleciona todas as ocorrências de uma busca por expressão regular (múltiplos cursores)
ctrl+b executa o build selecionado
ctrl+shift+t: reabrir última aba fechada

Na paleta de comandos, digite trechos de palavras para escolher comandos.
A paleta busca por padrões (e não literais), ou seja: “sypy” vai encontrar “Set Syntax: Python”.

Referências:
https://tutsplus.com/course/improve-workflow-in-sublime-text-2/
http://docs.sublimetext.info/en/latest/reference/keyboard_shortcuts_win.html
http://www.sublimetext.com/docs/2/indentation.html

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”