python

Facilitando as coisas no Debugger do Python

A função built-in dir sem parâmetros encontra tudo que existe no contexto.

Se vc estiver no PDB ou IPDB, pode acessar todas as variáveis num único comando ao invés de printar uma a uma….

print str([(_vars, eval(_vars)) for _vars in dir() if not _vars.startswith('_') and _vars not in('ipdb')]).replace('),', ')\n')

_vars

Anúncios
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

desenvolvimento, python

Python Mixins

Um Mixin é um tipo especial de herança múltipla. Há duas situações principais onde são usadas:

1 – Deseja-se prover muitas características opcionais a uma classe.
2 – Deseja-se utilizar uma característica particular em várias classes diferentes.

Exemplo:

class Story(object):
    def __init__(self, name, content):
        self.name = name
        self.content = content

class StoryHTMLMixin(object):
    def render(self):
        return (
            "<html><title>%s</title><body>%s</body></html>" %
            (self.name, self.content))

class StoryHTML(Story, StoryHTMLMixin):
    pass

print StoryHTML(u'TÍTULO', u'CONTEÚDO').render()

A classe Story guarda atributos, enquanto a classe StoryHTMLMixin “decora” atributos com marcações de HTML. Veja que a classe mixin NÃO define os atributos que ela decora: ela espera que eles tenham sido definidos em outra classe (e eles foram, na Story!). A classe mixin sozinha não parece fazer sentido. Se for criado um objeto a partir dela e invocar o método render, será gerado um erro.

Finalmente é definida StoryHTML que utiliza de herança múltipla, e acaba por agregar/compor os atributos de Story com o método render de StoryHTMLMixin.

Neste exemplo, pelo fato da classe mixin usar os atributos name e content, há forte dependência com Story. Então o mixin está criando mais uma camada de complexidade que poderia ser evitada usando herança simples (StoryHTML poderia herdar de Story e compor seus atributos com as marcações).

Mas se houver uma família de classes que segue um padrão na hora de nomear seus atributos (classes A, B, C, D, E, F e G possuem os atributos name e content), então uma mesma classe StoryHTMLMixin poderia ser agregada com qualquer uma dessas classes.

Mixins em geral não implementam um método __init__, porque sua principal razão de existir é contribuir com métodos para outras classes, e os objetos são fundamentalmente criados e inicializados por estas outras classes.

Referências:

http://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful
http://stackoverflow.com/questions/4514803/diamond-problem-when-using-mixins-in-python
http://turing.com.br/wiki/index.php?title=Objetos_Pythonicos

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