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

aplicacoes, linux

SSH Server no Linux

Baixar aplicativos-cliente e servidor:

sudo apt-get install openssh-client
sudo apt-get install openssh-server

Retirar permissão de logar como root:

sudo gedit /etc/ssh/sshd_config

Substituir PermitRootLogin yes por PermitRootLogin no

Reiniciar ssh:

sudo service sshd restart

Acessar servidor a partir de um cliente:

ssh USER@IP_SSH_SERVER

Referência:
https://help.ubuntu.com/10.04/serverguide/openssh-server.html
http://www.andrewault.net/2010/05/17/securing-an-ubuntu-server/

aplicacoes, redes

Opções de Configurações de Redes no VMWare

As 3 opções de configuração de redes do VMWare são:

– Bridged
A máquina virtual ganha um IP do roteador e é vista pelas demais máquinas da rede como se fosse um host físico.

– NAT
A máquina virtual ganha um IP do serviço VMWare, sendo vista apenas por outras máquinas virtuais, além do host. Precisa de redirecionamento de portas para ser acessada pela rede em que se encontra o seu host. Este faz um papel de gateway para acesso a rede.

– Host-Only
A máquina virtual ganha um IP do serviço VMWare, sendo acessada apenas por outras máquinas virtuais, além do host. Não é acessada e nem pode acessar a rede em que se encontra seu host, a menos que exista um redirecionamento usando outra máquina virtual que esteja configurada para acessar a rede.

Baixar VMWare:
http://www.vmware.com/products/player/overview.html

Referências:
http://vmfaq.com/entry/34/
http://en.wikipedia.org/wiki/Network_address_translation
http://en.wikipedia.org/wiki/Network_bridge

aplicacoes, linux

Instalação do Leafpad no Ubuntu a partir do código-fonte

Acesse a versão correspondente ao seu sistema operacional:
https://launchpad.net/ubuntu/+source/leafpad

Baixe a versão tar.gz. (Observe bem o MD5 Checksum descrito na página).

Acesse o arquivo baixado com o checador de hash:

md5sum ARQUIVO.tar.gz

Veja se o valor gerado é o mesmo descrito na página de download.
Um valor diferente geralmente quer dizer “arquivo corrompido” (propositalmente ou não).

Descompacte o tar.gz e, via linha de comando, acesse a pasta descompactada.

Execute o shellscript “configure”:

./configure

O resultado do script pode tanto terminar normalmente quanto apontar alguma falha. Esta falha pode estar relacionada a ausência de um determinado pacote, que deve ser instalado ANTES do pacote atual. Este por sua vez pode depender da instalação de outros pacotes ainda, recursivamente. Essa é a vantagem de gerenciadores de pacotes como o apt, que fazem toda a instalação de dependências automagicamente.

Uma das funções do script configure, portanto, é checar dependências do pacote, garantindo que elas estejam disponíveis no sistema para que o processo possa continuar.

Quando o script terminar sem erros, serão gerados N arquivos no diretório e sub-diretórios dos fontes. Entre estes arquivos está o MakeFile, que tem descrito diretivas de compilação dos fontes segundo o ambiente onde estão esses fontes: nome do programa compilador, descrição de sufixos, nome do executável, etc…

Portanto outra das funções do script configure é criar o MakeFile para auxiliar o processo de compilação.

O MakeFile é composto por uma série de targets especializados em manipular (limpar, compilar, instalar, extrair, copiar, etc…) o código fonte e os binários a serem gerados.

Com o ambiente validado e o MakeFile criado, execute o make:

make

O make é um utilitário que se baseia nas instruções do MakeFile da pasta corrente. Como não foi passado nenhum parâmetro, entende-se que será chamado o target default. No caso do LeafPad, o target vai compilar o código fonte. Na dúvida sobre o passo correto a seguir em outros pacotes, procure por um documento como INSTALL, ou algo similar, que esteja presente na pasta dos fontes.

O último passo é a instalação do binário gerado pelo make:

sudo make install

O target install do MakeFile requer privilégios de super usuário para poder mover os binários para pastas do sistema, criar links simbólicos, criar diretórios, modificar arquivos de configuração, etc…

Se tudo ocorrer bem, o LeafPad estará no menu Application / Accessories.

Infelizmente o apt não vai reconhecer o LeadPad, pois não foi ele quem instalou. Isso significa que as atualizações de sistema não vão contemplar este pacote e o Ubuntu Software Center ainda oferece a opção de instalar o LeafPad, mas não de removê-lo. Para isso execute:

sudo make uninstall

Referências:
http://blog.lucashungaro.com/2008/03/18/configure-make-make-install/
http://www.susebr.org/forum/index.php?topic=875.0
http://www.hardware.com.br/dicas/instalando-programas-partir-codigo-fonte.html
http://www.codecoffee.com/tipsforlinux/articles/27.html