Como remover tags com menos de 3 posts no WordPress usando WP_CLI

O WP-Cli trouxe uma nova aura em volta do WordPress, a ferramenta é muito flexível e prática, e torna a tarefa de gerir sites e blogs muito mais simples e ágil.
Com o tempo os sites e blogs vão ficando cheios de tags que só foram utilizados uma única vez, e isso atrapalha o rankeamento do site em ferramentas de busta. Segue abaixo um script que construimos para remover tags com menos de 3 posts associados:

wp term delete post_tag `wp term list --fields=count,term_id \ 
post_tag --format=csv | sort -n | ack "^[0123]," | \ 
awk -F ',' '{ print $2}'`

 

Espero que seja útil.

Let it snow, Let it snow, Let it snow …

Entrando no clima de natal, faça seu console nevar com esse código:


#!/bin/bash

LINES=$(tput lines)
COLUMNS=$(tput cols)

declare -A snowflakes
declare -A lastflakes

clear

function move_flake() {
i=”$1″

if [ “${snowflakes[$i]}” = “” ] || [ “${snowflakes[$i]}” = “$LINES” ]; then
snowflakes[$i]=0
else
if [ “${lastflakes[$i]}” != “” ]; then
printf “\033[%s;%sH \033[0;0H ” ${lastflakes[$i]} $i
fi
fi

printf “\033[%s;%sH*\033[0;0H” ${snowflakes[$i]} $i

lastflakes[$i]=${snowflakes[$i]}
snowflakes[$i]=$((${snowflakes[$i]}+1))
}

while :
do
i=$(($RANDOM % $COLUMNS))

move_flake $i

for x in “${!lastflakes[@]}”
do
move_flake “$x”
done

sleep 0.1
done

fonte: sontek

time machine no linux com rsync

Como todos sabem, eu adoro o Leopard, e gosto muito do seu sistema de backup, é ridiculamente simples. Até mesmo sua implementação é simples, ele cria um diretório para cada hora, e a partir de um rsync de tudo vai fazendo cópias incrementais dos arquivos modificados (novos), e hardlinks de todos os outros. Então dentro de cada diretório ele tem uma cópia do sistema inteiro, mas gastando quase nada de disco, afinal são hardlinks.

time-machine-rsync

Procurando pelo sistema perfeito de backup (não existe, eu sei), acabei escrevendo um script ridiculo que funciona de forma parecida com o Time Machine da apple, mas sem todos aqueles efeitos especiais e nem a integração com os softwares do sistema. Pra usar basta instalar o rsync na máquina que vai receber os backups e na máquina que será backupeada, o código é esse :


cd /mnt/backup && \
rsync -ptvr --delete  user@maquina:/home/user/ last ; \
cd last && \
find | cpio -dplm ../new && \
cd - && \
mv last `date +%Y%m%d` && \
mv new last

O script deve rodar na máquina que vai receber o backup , o primeiro “cd” é no diretório onde o backup será realizado, depois o rsync transfere o diretório para “last”. O script entra em “last” e cria hardlinks para todos os arquivos, e cria seus diretórios pais no diretório “new”. Então o script volta para o diretório anterior renomeia o diretório “last” para um com a data de hoje para o nome, e finalmente move o diretório “new” para “last.

Parece confuso, mas é bem simples, ele baixa o backup para last faz o diff para new, move o last para
a data de hoje, e move o new para last. Isso faz com que o rsync baixe apenas os novos arquivos do backup e armazena uma cópia completa do sistema em cada diretório datado. Assim para recuperar um arquivo do dia X , basta entrar no diretório X. Como expliquei, as cópias não ocupam espaço pois são hardlinks, genial né ? Rsyn e cpio são ferramentas antigas, pq ninguém pensou nisso antes ?

Quando mostrei esse script para alguns conhecidos, me perguntaram se eu faria uma interface bonitinha como o do Time Machine, minha resposta é não. Pois cada linux é um linux, cada distro é uma distro, cada gerenciador de arquivos é um gerenciador de arquivos. No mundo livre, não temos padrões, e escrever código pra integrar todo mundo é impossível… No mac os x o padrão existe, todas as ferramentas apple estão integradas com o Time Machine, pois a Apple define os padrões, e que não segue não desenvolve pra OSX.

Aproveite o script

Wifi na linha de comando, sem medo

Dúvida frequente de novatos é como configurar o wifi no linux via linha de comando. Não vou explicar instalar os drivers , as minhas experiências já foram relatadas nesse blog. O objetivo é como escanear, se conectar em um rede sem fio:

  • iwlist scan : Esse comando retorna todas as redes visiveis ao alcance do seu computador
  • iwconfig DEVICE essid REDE : Device é o nome da sua placa de rede pro sistema, pode ser wlan0, ath0 o uaté mesmo eth0 dependendo do driver da sua placa. REDE é o nome da rede que você vai se conectar, por exemplo Sala2 / linksys etc…
  • iwconfig DEVICE key senhadowifi : Caso a rede seja protegida por senha passe a senha por esse comando, mas só após escolher a senha com o comando anterior.
  • dhclient DEVICE : Após escolher a rede você deve atribuir um IP a sua máquina, esse comando pega o IP automáticamente.
  • ifconfig DEVICE xxx.xxx.xxx.xxx : Caso o seu roteador wifi não esteja configurado , talvez você tenha que configurar seu ip manualmente, pergunte ao administrador do router para saber qual faixa de ip você terá que usar

Esses comandinhos são os mais básicos, o suficiente pra estabelecer uma conexão. Caso o comando iwconfig não retorne nada ou retorne “No wireless interfaces found” existe uma chance boa da sua placa não estar devidamente configurada.

Recuperando dados deletados de uma partição reiserfs


Assunto delicado, perder um dado importante ou todos os dados de uma partição ou uma partição inteira é como um incêndio na casa de um geek…. Eu mesmo já surtei inúmeras vezes nessa lista por ter perdido partições inteiras ao instalar uma distro nova (Conectiva 7 e depois nunca mais usei conectiva), ao dar um comando errado na hora errada na partição certa ou por falha de disco…. alias meu HD aqui já tem 3 anos……
Bom Após passar 2 semanas puxando um game de playstation ( Valkyrie Profile= RPG ambientado nas culturas nórdicas, asgard, odim, vicking e tals…) para curtir nas férias, hoje finalmente o jogo veio ! Tava puxando por bittorrent e no ápice do meu egoísmo, fui deletar o torrent para não fazer mais upload |:-> mas cai na pegadinha do tab-completion do shell que completou com o arquivo rar em vez do torrent X-(
Digamos que nenhuma política de backup poderia ter me salvado dessa tragédia…
Então vou descrever aqui como recuperar dados deletados de uma partição reiserfs incluindo os passos que dei para recuperar meus dados 🙂

Lascou-se ! Tudo deu errado ! Deletou tudo ! TIRE SEU MICRO DA TOMADA IMEDIATAMENTE, isso ai puxe o fio ! Não dê shutdown !
Parece loucura, afinal , tirar o micro da tomada não é nenhum procedimento técnico não é mesmo ? Mas isso impede que o sistema operacional grave arquivos no disco… Ao deletar um arquivo na verdade o sistema operacional apenas realoca seu espaço ocupado para novos arquivos, se por um acaso o SO gravar um novo arquivo ele pode sobre-escrever seu precioso arquivo com algum arquivo temporário ou um importante log do sistema :-/

Muita calma nessa hora o computador está desligado, seu arquivo está seguro ! Para religar todo cuidado é pouco, um erro e todos seus arquivos deletados podem ir para o limbo ! Será nescessário religar seu sistema em modo reparo com as partições em RO (read-only), como fazer ?
Se vc usa lilo/yaboot, dê um tab no prompt descubra o nome do Label do seu sistema e acrescente “ro init=/bin/bash”, por exemplo :

Linux ro init=/bin/bash

Se vc usa grub, no menu de opções aperte “e” no item que corresponde a sua distro, “e” na linha do kernel e adicione “ro init=/bin/bash no final…. então aperte ESC e b para bootar.

Isso vai fazer com que o sistema monte a partição root em modo ro e vai iniciar o processo bash como processo número 1 no lugar do init…. Pode acontecer do diretório dev não ser populado ou seja não será possível montar outras partições se nescessário… se isso acontecer, vc deve remontar a partição / para leitura e escrita (mount -o rw,remount /) e rodar o comando udevstart (ou devfsd para quem usa sistemas antigos como debian sarge desatualizado e etc…) e rezar para dar certo.

Se tudo der errado, a única forma é iniciar o sistema no runlevel 1 , mas isso pode ser uma péssima idéia em algumas distros… várias delas escrevem no disco antes de entrar em modo de manutenção, entre elas : Fedora, Ubuntu, gentoo… deve haver uma porção delas por ai… Tenho quase certeza que slackware e debian não o fazem.

Na distro em questão (gentoo) isso ocorreu, o sistema escreveu no disco e não foi pouco : as consequencias serão descritas no final…..

Bom com o sistema montado em ro e com o bash em mãos é hora de agir ! O sistema de arquivos reiserfs peca por não ter uma ferramenta para recuperar arquivos deletados…. ou pior se ela existe não é livre (várias ferramentas de sistema do reiserfs não são livres….), mas tem uma gambiarra que funciona bem….É o comando
reiserfsck !

Use :

reiserfsck –rebuild-tree -S /dev/PARTICAO

Esse comando vai buscar por todos os arquivos e diretórios e vestígios dos mesmos na partição e vai criar um diretório chamado “lost+found” no topo da partição…
dentro desse diretório vc vai encontrar uma porção de arquivos cujo o nome são apenas números… no meu caso tive que procurar por um arquivo grande, e achei, depois para confirmar usei o programa “file” para identificar o conteúdo ,tá lá ! Arquivo RAR na cabeça, então foi só renomear….
Tive a sorte de ser um arquivo grande , fácil de identificar… mas e se fosse um arquivo pequeno ? Bem mais complicado, não tem jeito é garimpar até achar…. No caso de diretórios inteiros ou partições a sistuação é mais grave, todos eles vão ter números como nomes e muitas vezes arquivos aparecem fora de seus diretórios …. uma zona.

Bom, e como meu sistema inicializou em init 1 e escreveu no disco não deu outra, ele corrompeu partes do meu arquivo e só pude recuperar 30% do meu arquivo original, bom melhor que nada :-/

Funções no bash



Funções no bash são uma verdadeira mão na roda, vc pode automatizar uma porção de comandos longos e repetitivos. O Aurélio (verde) e o Tobias (http://thobias.org/) criaram uma biblioteca de funções úteis como consultar cotação de moedas, pronuncia de palavras em inglês etc…Seu nome é .
Criar uma função no bash é muito simples, abra seu editor favorito e digite :


function digaoi()
{
echo 'filma eu galvão !!!';
}

Para carregar sua função no shell atual digite :


source arquivo.func

Onde arquivo.func é o nome do arquivo onde vc digitou os comandos 🙂
Pode conferir, agora no seu shell existe o comando digaoi, experimente executa-lo. Como vc percebeu ele imprime na tela a frase “filma eu galvão!!!”

Agora vamos tentar um comandinho mais útil, eu particularmente adoro animes, e muitas vezes estes vem encodados com codecs pesados demais para máquinas humildes então frequentemente eu converto um vídeo ou outro para um formato mais leve. Resumidamente (a original é 3 vezes maior ) a linha de comando que eu uso é :


mencoder -o arquivosaida.avi -oac mp3lame -ovc lavc -lavcopts bitrate=2000 arquivodeentrada.mkv

E teve um dia que eu me embananei e sobescrevi o arquivo original, tive que baixar o desenho de novo ….. Pra evitar problemas criei a seguinte função :


function ..pramaquinavelha () {
mencoder -o $1.avi -oac mp3lame -ovc lavc -lavcopts bitrate=2000 $1
}

O nome da função é “..pramaquinavelha”, ela chama o mencoder com os parametros que eu quero, por exemplo:


..pramaquinavelha ghost-in-the-shell-01.mkv

E como saída ele gera o arquivo “ghost-in-the-shell-01.mkv.avi”.
Como vc observou, eu passei um parâmetro para a função, para isso basta usar a variável $1, seu valor é a primeira string passada logo após o comando principal, no meu caso, o nome do arquivo que eu queria converter, ghost-in-the-shell-01.mkv.
“Mas porquê $1 ?Não poderia ser outro número ?” você pergunta. Sim ! Os números vão de 0 até infinito (nem tanto), vc pode passar multiplos parâmetros para uma função, como por exemplo o bitrate do vídeo além do nome do arquivo.A variável $0 é o próprio comando, e os parâmetros são numerados de $1 até $N, exemplo:


comando parametro1 parametro2 ... parametroN
$0 $1 $2 $N

Um outro tipo de função que eu uso bastante é um script que lista as dependêncas de um binário e quais pacotes suprem essas depências, segue a listagem :


..showdeps (){
[ "$1" ] || { echo 'uso: ..showdeps arquivo_binário'; return; }
rpm -qf `ldd $1 | awk '{print$3}'` | sort | uniq
}

Nesse exemplo alé da variável de argumento ($1), também fiz uso do comando de testes “[” e “]” e de um operador lógico “ou” (“||”). As chaves testam se algum parâmetro foi passado e caso positivo prossegue com a função, se não imprime uma mensagem ensinando ao usuário como usar a dita função. O resto da função é pauta para outro post, o que vale dessa vez é a idéia, funções são poderosas, implemente as suas, e divida com os amigos 🙂

Para ter suas funções favoritas sempre carregadas no shell, adciona a linha “source arquivo.func” à configuração do seu shell, por exemplo ~/.bashrc.

Depois falo mais de shell e seus truques.