Recuperando arquivos apagados

Uma hora ou outra, todos perderão alguns arquivos, corrompidos pelo sistema de arquivos, ou simplesmente deletado sem intenção. Na linha de comando é necessário ter cuidados maiores com espaços em branco. Meu problema não foi muito grave, na verdade até fiquei bem tranquilo, porém como sempre, ainda queria saber quais arquivos foram apagados para que pudesse recuperá-los. Contarei a história do que foi possível fazer neste caso.

A primeira coisa, para evitar mais perdas, aumentando as chances de recuperação, é desmontar a unidade, ou colocá-la em somente leitura, o que poderia ser feito com um umount ou mont -o remount,ro. No meu caso como era no próprio /, desliguei o computador e usei um sistema num pendrive. Isso é importante, como serão alterados alguns dados do sistema de arquivos, evita mais percas ou o corrompimento total do sistema de arquivos.

Uma ferramenta fácil e simples para recuperar os arquivos é o extundelete (pacote extundelete no Debian). Para usá-la basta executar extundelete, caminho do sistema de arquivos e uma opção de recuperação, como --restore-file caminho_do_araquivo, --restore-directory caminho_do_diretorio, ou até mesmo um --restore-all para recupera todos os arquivos. Lembrando que todos esses caminhos são relativos a raiz do sistema de arquivos, se o arquivo for o “/home/user/arquivo.txt”, sendo “/home” o ponto de montagem da partição “/dev/sdb1” seria extundelete /dev/sdb1 user/arquivo.txt.

Na maioria dos casos essa ferramenta atende, porém se quiser ir mais a fundo para buscar algum pedaço de informação que não pode ser recuperado ainda existe o debugfs. No caso executei um debugfs /dev/sdb1, executei o cd até chegar no diretório desejado e usei os comandos lsdel e ls -d para listar os arquivos. Com o ls -d consegui o número do inode aonde está o arquivo, na posse desta informação é possível utilizar várias outras técnicas, ou simplesmente a lista de arquivos que estava ali e foram apagados, mesmo que não tenha sido possível recuperá-lo anteriormente com o extundelete.

Dividir arquivos em partes

Recentemente tive que copiar um arquivo de quase 6 GB entre dois computadores que utilizo. Esses computadores não estavam perto um do outro, muito menos na mesma rede. Solução simples: utilizar um pendrive.

Meu celular tem espaço na memória interna suficiente para copiar o arquivo, porém para minha surpresa não consegui copiar o arquivo inteiro. Quando vi a mensagem de erro lembrei que o sistema de arquivos do celular é FAT, com o limite do tamanho em quase 4GB. Ou seja, o tamanho do arquivo é maior que o suportado pelo sistema de arquivos.

Como trocar o sistema de arquivos não era a opção, procurei como dividir o arquivo em partes. A solução é extremamente simples, basta utilizar o comando split. Este comando permite dividir o arquivo baseado em alguns critérios como bytes e número de linhas. Meu caso como é um arquivo binário e o que me interessava era o tamanho, fiz a divisão por bytes.

O comando utilizado foi:
split -b 1G arquivo-original prefixo-das-partes

Explicando, -b diz para o split dividir por bytes e que cada parte terá 1GB. arquivo-original é o arquivo que desejo dividir. prefixo-das-partes é o nome dado a cada parte, seguido de sua numeração, caso seja arquivo. serão criados vários arquivos como arquivo.aa, arquivo.ab e assim por diante. Se quiser números em vez de letras basta adicionar o parâmetro -d no comando.

Não foi o meu caso, porém se tiver um arquivo de texto grande, como um log, e quiser dividi-lo, basta utilizar o parâmetro -l 1000 que gerará arquivos de 1000 linhas cada, sem o risco de dividir alguma linha em dois arquivos.

Com cinco arquivos de 1GB e outro de aproximadamente 700MB, finalmente foi copiado para o celular.

Porém ainda precisava juntar as partes no destino, que bastou um:
cat prefixo-das-partes* > arquivo-original

Explicando, o cat recebeu o nome de todas as partes por causa do “*”, que também foram passadas como argumento na ordem correta, mesma coisa que executar um cat arquivo.aa arquivo.ab ... > arquivo. E assim recuperando o arquivo original.

O cat também funciona com arquivos de texto dividido pelo número de linhas. Se quiser dividir vários arquivos basta gerar um “.tar.gz” ou “.tar.bz2” antes.

Licença de software

Hoje irei falar de uma coisa muito importante referente a software, a licença. Não quero entrar no mérito de qual é a melhor ou se existe uma que é correta. A ideia é apresentar a importância que a mesma tem quando você publica um software.

Quando você publica algum código, por exemplo no GitHub, esse código está sujeito as leis de direitos autorais, da mesma forma como se você publicasse alguma música ou vídeo. Ou seja, caso alguém utilize o seu código, você poderia processar essa pessoa ou empresa, não sei quem ganharia, porém como você não deixou explicito o quem tem tiver acesso ao código pode fazer com o mesmo, isso está no seu direito.

Por este motivo é de extrema importância definir uma licença, permitindo à quem tiver acesso ao seu código, os direitos que você desejar. Um código sem licença pode ser lido, uma vez que foi publicado, porém para poder utilizá-lo em outros programas, ou até mesmo fazer alterações teria que entrar em contato com o autor para conseguir este direito. No caso do GitHub o código fica sujeito aos termos de uso do site, porém se ele estiver em outro lugar, um fork poderia não ser permitido.

Outra diferença menos sutil e que muitas pessoas confundem é software livre com open source. Open source são programas que tem seu código fonte abertos, ou seja, você pode ver o código do programa, praticamente tudo que está hospedado publicamente no GitHub é open source (a menos que tenha um arquivo binário sem seu código fonte). Para ser software livre é necessário que a licença permita as quatro liberdades. Não é apenas a GPL que é compatível com essas quatro liberdades, um exemplo é a licença MIT, porém ainda permite fechar o código em alguma versão futura. Caso queira uma lista de licenças compatíveis, no site do projeto GNU existe uma lista em português e indica quais as incompatibilidades da licença quando existem.

Como todo software livre tem como requisito acesso ao código fonte, além de serrem livres, também são open source, porém nem todo open source é livre. Um código open source poderia estar disponível, porém não permitir sua alteração, ou redistribuição, tornando-o assim não livre. Mesmo com acesso ao código a licença poderia impedir até a recompilação do mesmo, tornando impossível saber se o binário distribuído é realmente do código publicado e que não teve nenhuma alteração, como uma vulnerabilidade implantada.

Publicar um código sem licença pode gerar resultados totalmente opostos ao objetivo do quando foi publicado, por isso preste atenção neste detalhe. Caso não tem certeza de qual licença utilizar, de uma olhada nesse site, que mostra algumas alternativas e compara licenças, então você pode focar nos pontos que deseja e procurar uma que se adéque melhor ao seu caso.

Strife, jogo moba para GNU/Linux e como corrigir problemas de bibliotecas em programas compilados

Recentemente comecei a testar um moba chamado Strife, que ainda está em beta, porém além das partidas típicas de moba, existem tutoriais e aventuras para um jogador bem interessantes. Os principais pontos que chamaram minha atenção é o jogo ser mais leve que o Dota 2, além de ocupar menor espaço (2 GB contra os 12 GB do Dota 2) e ser mais amigável com jogadores casuais, que eu apesar de conhecer esse estilo de jogo, nunca decorei habilidade de personagens ou itens, então posso ativar e seguir as sugestões de habilidades e itens com apenas um clique na tela, porém ainda tem o potencial de hardcore para os mais avançados.

Para quem estiver iniciando no jogo, recomendo fortemente fazer o tutorial, principalmente o da partida, até para conhecer as diferenças de outros mobas. Uma vez por dia rode a roda para ganhar alguns itens que servem como dinheiro no jogo para compra de pets e fabricação de itens. Antes de jogar online, crie uma partida de treino com bots, será mais fácil e você não corre o risco de um participante desconectar da partida e desbalancear o jogo, principalmente quando estiver conhecendo o personagem.

Para quem se interessou, basta fazer o cadastro aqui (usem esse link para me ajudar), e o download do jogo. Porém o mesmo não funcionou corretamente no Debian Jessie e por este motivo estou deixando algumas dicas aqui.

Primeiro achei estranho não ter um shell script no diretório principal para iniciar o jogo, mas pode ser iniciado executando diretamente o bin/strife. A questão principal é que as bibliotecas do Debian Jessie conflitaram com as do jogo e não foi possível iniciar o mesmo, mostrando no terminal a seguinte mensagem:

Inconsistency detected by ld.so: dl-open.c: 689: _dl_open: Assertion `_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' failed!

Primeira coisa que verifico nos jogos é se não existe alguma biblioteca faltando com o comando ldd, outro ponto importante é verificar se o jogo é 32 ou 64 bits com o comando file, se o jogo for 32 bits a biblioteca também tem que ser 32 bits. No Debian o próprio site do repositório ajuda e muito nessa etapa, basta procurar por http://packages.debian.org/file:arquivo, exemplo http://packages.debian.org/file:libstdc++.so.6 e instalá-la com apt-get install libstdc++6 para a mesma arquitetura do seu sistema ou apt-get install libstdc++6:i386 para forçar a versão 32 bits, por exemplo.

Eu já tinha todas as bibliotecas instaladas, como no diretório bin existiam algumas bibliotecas também (arquivos .so), resolvi forçar o sistema a utilizá-las, setando a variável de ambiente LD_LIBRARY_PATH, no meu caso o comando ficou export LD_LIBRARY_PATH=/opt/Strife/bin, tive algumas mensagens diferentes, porém ainda não abria o jogo.

Pesquisando mais na internet descobri que existia essa incompatibilidade das bibliotecas do jogo com as do Debian, e num site francês (http://tuxicoman.jesuislibre.net/2015/01/strife-un-equivalent-de-league-of-legends-pour-linux.html) achei a solução apagando algumas bibliotecas do jogo para forçar a utilização das bibliotecas do sistema. Os únicos arquivos .so que devem ficar no diretório bin são:

  • cgame.so
  • game.so
  • libcef.so
  • libfmodex64.so
  • libgame_shared.so
  • libgcrypt.so.11
  • libjpeg.so.8
  • libk2.so
  • libpng15.so.15
  • physx.so
  • vid_gl.so

Após a atualização (bin/update), o jogo rodou muito bem e sem nenhum problema. Obviamente como ainda é um beta existem problemas do jogo em si, como sincronização com a dublagem em português, mas nada que interfira no gameplay e todos terão esses problemas, independente da plataforma.

Essa dica não é válida apenas para jogos. Vários programas quando não estão empacotados podem precisar de alguma biblioteca não instalada, como o programa do Bitcoin que usa o Qt e como meu ambiente é o Xfce (GTK), faltava algumas bibliotecas, ou jogos do Steam que são 32 bits e precisa de mais alguma biblioteca.

Reduzir o tamanho de sites

Além de poder deixar seu site pré-gerado (texto aqui), existem outras formas de melhorar o tempo de resposta na hora de acessar algum site. Podemos configurar o servidor HTTP para compactar tudo o trafego em gzip, porém podemos reduzir o site ainda mais antes de compactá-lo. Quando acessamos um site, normalmente temos um arquivo HTML, alguns CSS e JavaScript e várias imagens, cada um desses tipos de arquivos pode ser otimizado.

As imagens irão compor a maio parte do tráfego normalmente, como dizem que uma imagem vale mais que mil palavras, também pode refletir no tamanho da mesma. Existem algoritmos que tentam gerar a mesma imagem de várias formas para buscar uma onde o arquivo final seja o menor possível, podendo ter uma perca normalmente imperceptível ao olho humano ou com a qualidade exatamente igual ao original. Esses algoritmos serão diferentes para cada tipo de imagem, para PNG temos o OptiPNG, que pode ser instalado com apt-get install optipng no Debian. Um exemplo que posso contar aqui, tinha cerca de 400 imagens PNG, totalizando 699 MB no diretório, depois de utilizar o OptiPNG, o diretório ficou com 286 MB, aproximadamente 41% do tamanho inicial e mantendo a mesma qualidade.

Para JPEG além de buscar uma forma de reduzir as imagens, existe o modo progressivo, que quando a conexão é mais lenta, permite exibir uma imagem inicialmente em baixa qualidade e ir melhorando conforme o arquivo é recebido. Para isto utilizei o jpegtran, que pode ser instalado com apt-get install libjpeg-progs no Debian.

Algumas vezes pego pacotes de imagens na internet compactadas em algum formato, após descompactá-las e otimizá-las, tenho um tamanho menor no diretório sem compactar que no arquivo compactado, e recompactando fica menor ainda. Recomendo utilizar esses programas mesmo no computador local para economizar espaço. Para facilitar ainda mais fiz um script para GNU/Linux que identifica o tipo de imagem e executa o programa correto com os parâmetros necessários, quem quiser pode dar uma olhada no meu GitHub. Também configurei como uma ação personalizada no Thunar, então basta um click com o botão direito, selecionar a ação e já tenho o arquivo ou arquivos selecionados otimizado.

Para otimizar o CSS e JavaScript, primeiro é bom reduzir o número de arquivos visando reduzir o número de requisições HTTP. Outro ponto importante é que para executar o JavaScript no navegador é necessário parar todos os demais processos do navegador, ou seja, dois códigos JavaScript não são executados em paralelo, nem um código JavaScript e renderizar o HTML, por este motivo existe a prática de colocar as tags script antes de fechar o body, para termos a página renderizada primeiro.

Agora para reduzir o tamanho do CSS e JavaScript existe uma técnica chamada minify, que consistem em reduzir espaços em branco, quebra de linhas e utilizar nome de variáveis menores em JavaScript. Uma ferramenta que conheço para esta tarefa é o YUI Compressor, escrito em Java, então funciona em qualquer plataforma. Porém se forem editar os arquivos posteriormente recomendo manter uma cópia do original.

O HTML segue os mesmos princípios do CSS e JavaScript de reduzir espaços em branco, que são colocados principalmente quando a página é gerada dinamicamente ou indentada, que faz sentido para quem está vendo o código, porém não faz diferença para o navegador. Quando é aplicado em cima de páginas dinâmicas, esse processo, diferente dos descritos anteriormente, precisa ser refeito para cada página, aumentando o processamento necessário para gerar a página e por isso muitas vezes é deixado de lado. Para páginas estáticas, como pode ser aplicado apenas uma vez, volta a ser interessante. Para fazer essa otimização, ela segue as mesmas regras de arquivos XML, ou seja, também pode ser aplicada em feeds RSS.

Também para reduzir o processamento, podemos deixar os arquivos já compactados no servidor, não necessitando recompactá-los a cada requisição. Um exemplo desta configuração para NGIX pode ser vista no texto do Magnum quando ele estava configurando o servidor para o seu site feito no Pelican (http://mindbending.org/pt/servindo-sites-estaticos-com-o-nginx#configurando-um-site).

Blog em páginas estáticas

Quem já desenvolveu alguma coisa para web percebeu que algumas coisas são feitas dinamicamente por praticidade, porém que não mudam muito, como barras laterais do WordPress, que são geradas dinamicamente para permitir a customização de forma simples, porém apenas quando se ter uma nova postagem que existe uma real mudança.

Ter partes dinâmicas na página é muito bom, porém aumenta a carga do servidor que deve sempre regerar cada uma dessas partes a cada requisição, a menos que seja utilizado algum sistema de cache. Como em blogs, páginas de empresas ou produtos tem uma baixa taxa de atualização por exemplo, é possível gerar essas páginas previamente e deixá-las como arquivos estáticos no servidor, economizando assim o custo de geração das páginas. Se tiver uma mudança basta gerá-las novamente e atualizar no servidor.

Para facilitar a geração das páginas, existem ferramentas para essa tarefa, como o Pelican escrito em Python e o Jekyll em Ruby. Além de permitir escrever as páginas em HTML, podemos ter outras opções como Markdown e reStructuredText. Para dar alguns exemplos, além dos sites dos próprios projetos, temos o PythonClub, Hack ‘n’ Cast e Castálio Podcast usam o Pelican e o Grok Podcast usa o Jekyll, além de todos aceitarem contribuições via GitHub.

Uma observação é que todos esses sites possuem campo de comentários, ou seja, algo carregado dinamicamente, porém se olhar para o código isso é feito via JavaScript dentro do navegador, não no servidor. A mágica está em colocar os comentários em outro servidor (podendo ser até o mesmo) e utilizar o JavaScript para carregar, exibir e até enviar os comentários via requisições Ajax. Um serviço gratuito para os comentários em blogs é o Disqus, que hospedará apenas os comentários para você.

Infelizmente ainda não converti meu blog do WordPress para o Pelican, porém assim que encontrar uma solução para acompanhar os acessos o farei, mas o fato de não querer depender do Google, não ter um servidor próprio e sem cartão de crédito internacional, dificultam as coisas. Porém teria várias vantagens. O servidor HTTP poder ser qualquer um, já que não dependeria do suporte a alguma linguagem ou banco de dados. Como são apenas páginas estáticas, o site não corre o risco de SQL Injection e outras falhas decorrentes das páginas dinâmicas. Como é uma página estática, é muito mais rápido para o servidor responder a solicitação, podendo assim atender mais acessos com o mesmo servidor. Arquivos estáticos são mais fáceis de fazer cache, podendo reduzir até o número de requisições do servidor.

Isso obviamente não é a solução para tudo, montar um sistema inteiro desta forma não é tão prático, porém montar um site estático e fazer todas as ações com JavaScript via uma API pode ser uma opção interessante, tendo as vantagens já descritas e já ter uma API pronta para integrações. Sempre tendo que avaliar se os benefícios superam as dificuldades.

Duck Duck Go: Pesquisa e XMPP

Duck Duck Go

Quem utiliza a internet, uma hora ou outra sempre acaba pesquisando algum site, normalmente no Google, Yahoo! ou até mesmo no Bing. Porém muitos já se surpreenderam ao pesquisar algo e ver várias propagandas em outros sites, tendo o assunto pesquisado ou principalmente o produto(Flagras de Atendimento do site Vida de Suporte). Isso acontece devido ao rastreamento que determinados sites fazem, uma vez que se você pesquisar algo existe maior possibilidade de você querer comprar algo relacionado e vendo uma propaganda sobre influenciar a venda. Porém vendas não são a única utilização possível desses dados, casos armazenados essas buscas e acessos, pode-se descobrir muito mais sobre a pessoa do que ela tenha publicado, além dessas informações serem mais confiáveis sobre determinados hábitos.

Para que não ocorra é necessário evitar esses rastreamentos, existem plugins para os navegadores que prometem fazer isso, porém existem serviços de buscas que simplesmente não te rastreiam, ou seja, você precisa apenas trocar um serviço por outro.

Entre as alternativas temos o Startpage, que faz as pesquisas no Google por você, como se estivesse fazendo via proxy. Para o Google alguém fez essa pesquisa, porém ele não tem como associá-la a uma pessoa.

Outra e talvez o mais famosos de todos, é o Duck Duck Go. A parte que gosto dele são os elementos da interface, quando faço alguma pesquisa referente a desenvolvimento, apare logo a baixo do campo de pesquisa, respostas do Stack Overflow, ou outros sites como Wikipédia já integrados na página, opção para fazer a pesquisa limitando a algum site de documentação. O que achei mais interessante é a desambiguação, onde são apresentados várias opções, se pesquisar por Python, apareceram como alternativas a linguagem de programação, Monty Python e outros.

Além de pesquisa em sites, existem a opção de imagens, vídeos e áudio de acordo com o conteúdo pesquisado. Porém outro serviço disponível é um servidor XMPP (ou Jabber, que é o nome antigo). Segue o procedimento para configurar no Pidgin (https://duck.co/blog/using-pidgin-with-xmpp-jabber), outros clientes também são compatíveis, basta pegar as informações do servidor deste artigo. Apesar do domínio dukgo.com, como o XMPP permite comunicação entre servidores é possível adicionar contatos do Gtalk e outros servidores, nunca testei do Facebook, porém creio que seja possível também.

Podemos utilizar softwares específicos e plugins para aumentar a privacidade, porém muitas vezes temos uma alternativa tão boa quanto e que pode ser adotada sem muitos esforços. Esses serviços de busca surgiram na Deep Web, assim podendo mostrar resultados que não apareceriam nos buscadores mais utilizados, vale a pena conferir e migrar com certeza.

Como receber notícias de sites

Liferea - RSS

Você provavelmente tem sua rotina na internet, lista de sites que sempre acessa em busca de notícias para ficar sabendo das últimas atualizações. Se não tiver paciência para ficar acessando o site toda hora, provavelmente possui alguma forma de receber atualizações. Muitos produtores de conteúdo avisam de suas publicações no Facebook e Twitter, porém mesmo assim você pode perder muita coisa.

Primeiramente o Facebook não envia notificações para todas as pessoas que deveria, conforme as pessoas vão curtindo e compartilhando ele vai enviando para as demais, então você pode não ser notificado. No Twitter as informações são extremamente voláteis e é fácil perder um tweet, principalmente quando você recebe vários num curto período de tempo. Na inbox do YouTube as pessoas também não estão sendo notificadas de novos vídeos em alguns casos.

Além desses problemas mencionados, você ainda depende de uma empresa para receber as notificações. Embora o serviço possa funcionar corretamente, você permite que ela conheça seus interesses, que podem ser negociados com terceiros, e também censurar algum conteúdo que você poderia receber.

Porém existe uma solução para esses casos, ela é anterior ao Facebook e Twitter, do tempo que o Netscape ainda estava vivo, na verdade foi lá que surgiu. O RSS, e posteriormente o Atom (apenas uma estrutura diferente de arquivo, porém com mesmo princípio), funcionam como uma página de site, porém sua estrutura é feita para ser lida por programas, então esses programas podem facilmente identificar quando ocorreu alguma atualização e avisá-lo.

Para utilizar os feeds RSS/Atom é simples. Primeiro você precisa escolher um leitor, existem diversas opções, desde o próprio navegador, programas desktop, sites online, até aplicativos para celular. Talvez o mais utilizado foi o Google Reader, que funcionava muito parecido com o Gmail para ver as notícias, porém esse serviço foi descontinuado. Recomendo a opção desktop, ou online onde você mesmo hospede, para evitar problemas com privacidade ou censura. No GNU/Linux recomendo o Liferea (Linux Feed Reader).

rss-icon

Depois de selecionado o leitor, é preciso do endereço dos canais que você deseja visualizar as notícias. Nos blogs normalmente está identificado como “Feed”, “RSS” ou com o ícone a cima, esse ícone também pode ser encontrado próximo a barra de endereços em alguns navegadores, ou até o botão “Inscrever” como na nova versão do Firefox. Alguns sites fica restrito a barra de endereço ou botão do navegador e outros infelizmente não possuem. Esse blog possui e pode ser utilizado, ou se tiver alguma dúvida https://eduardoklosowski.wordpress.com/feed/ é o endereço do canal RSS do meu Blog.

Após descobrir o endereço do canal RSS (ou Atom), basta abrir o programa e adicionar o link, o processo muda conforme o programa, mas basta achar a opção e colar o endereço. De tempos em tempos o aplicativo ira conectar neste endereço, verificar se existe alguma atualização, e notificá-lo caso positivo. Agora será mais difícil você perder alguma atualização. Eu uso o RSS para os canais do YouTube que acompanho e nunca tive problema de perder algum vídeo publicado, as vezes até sou notificado de vídeos que foram rapidamente removidos (apesar de não conseguir assisti-los), ou que só estão disponíveis para quem possui o link depois que passou algum tempo público. Vale lembrar que versões online costumam remover notícias antigas não lidas, normalmente por volta de 30 dias, mas você provavelmente irá ver antes desse tempo caso seja de seu interesse.