domingo, 27 de junho de 2010

Aprimorando o Auto-Completar do Terminal (Tecla TAB do Linux)

Como sabemos, no Linux, UNIX, BSD (e qualquer sistema decente), o terminal em modo texto não é bobo: ele é capaz de auto-completar os comandos (geralmente digitando-se o início dos comandos e teclando-se a tecla TAB para que apareçam as sugestões e para que elas sejam utilizadas). Assim, o uso do terminal fica realmente fácil, rápido e prático: você digita apenas o início do nome de todos os comandos, pastas e arquivos, aperta TAB e pronto!! Tá lá o comando todinho magicamente!!
Acontece que (e talvez você não saiba disso!!) o teminal pode muito mais!! Ele pode aprender a auto-completar inclusive os parâmetros de comandos conhecidos, como o apt-get, por exemplo. Normalmente, em muitas distribuições estas opções vêem desligadas por padrão. Aqui aprenderemos a religá-las de maneira fácil e indolor.


  • Habilitando o Auto-Completar Interativo do Terminal

Antes de mais nada: é preciso ser root (Administrador) para executar os passos a seguir. Localize e edite o arquivo /etc/bash.bashrc:

vi /etc/bash.bashrc

Localize as linhas responsáveis pelo auto-complemento dos comandos e retire os sinais de comentários (as tralhas ou "joguinhos-da-velha" - "#"), para que elas possam ser executadas:

Está assim:
# enable bash completion in interactive shells
#if [ -f /etc/bash_completion ]; then
# . /etc/bash_completion
#fi

Fica assim:
# enable bash completion in interactive shells
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi

(Somente a primeira linha permanecerá comentada, porque é realmente um comentário e não um trecho válido de programa)

É preciso que o arquivo /etc/bash_completion exista e não esteja vazio (não se preocupe, dificilmente ele não existirá, a menos que tenha sido retirado pelo administrador).


  • O Que Isso Faz??

Em poucas palavras: Quando você executa o Terminal ("Terminal", no Gnome; "Konsole", no KDE; ou mesmo o terminal em modo texto), o shell (/etc/bash) roda e abre uma seção para você. Este programinha é simples e eficiente, e faz várias coisas no curtíssimo espaço de tempo em que carrega, como: carregar as variáveis de ambiente, aliases, além de diversas personalizações que você pode ter a nível de usuário. Uma destas tarefas é ler e executar o script /etc/bash.bashrc. Nas linhas que modificamos, nós estamos indicando que o script deve executar um segundo script, encontrado em /etc/bash_completion. Este script é um programa enorme, com vários scripts próprios, e carrega todos os principais casos de auto-complemento interativo (inteligente).
Felizmente, está tudo pronto, basta você habitilitá-lo com o procedimento simples acima. Claro, se você é um programador de Shell Script que adora desafios, sinta-se livre para modificar estes scripts e torná-los ainda melhores!! Neste caso, não se esqueça de voltar aqui e nos avisar as maravilhas que fez!!!

Boa sorte, pessoal!!

quarta-feira, 16 de junho de 2010

Algoritmo: Jogo da Velha em Javascript

Pessoal,

Resolvi criar este post para mostrar o joguinho da velha que coloquei aí do lado, na parte de cima. Segue o código abaixo:

var jogador = 0;
var jogoArray = new Array(3);
limpaTabuleiro();

function limpaTabuleiro() {
for (i = 0; i < 3; i++) {
jogoArray[i] = new Array(3);
for (j = 0; j < 3; j++) {
jogoArray[i][j] = "";
}
}
for (i = 1; i < 4; i++) {
for (j = 1; j < 4; j++) {
var botao = document.getElementById((i+"")+(j+""));
if (botao != null) {
botao.value = "";
}
}
}
}

function executa(id) {
var botao = document.getElementById(id);
var jogadorSpan = document.getElementById("jogador");
var linha = id.substring(0,1)-1;
var coluna = id.substring(1)-1;

if (botao.value != "") {
return;
}

if (jogador == 0) {
jogoArray[linha][coluna] = "X";
botao.value = "X";
jogador = 1;
jogadorSpan.innerText = "1";

} else {
jogoArray[linha][coluna] = "0";
botao.value = "0";
jogador = 0;
jogadorSpan.innerText = "0";
}

// Verifica se o cara ganhou
for (i = 0; i < 3; i++) {
if(jogoArray[i][0] == jogoArray[i][1] && jogoArray[i][1] == jogoArray[i][2]
&& jogoArray[i][0] != "") {
window.alert("Jogo encerrado!");
limpaTabuleiro();
}
}
for (i = 0; i < 3; i++) {
if(jogoArray[0][i] == jogoArray[1][i] && jogoArray[1][i] == jogoArray[2][i]
&& jogoArray[0][i] != "") {
window.alert("Jogo encerrado!");
limpaTabuleiro();
}
}
if(jogoArray[0][0] == jogoArray[1][1] && jogoArray[1][1] == jogoArray[2][2]
&& jogoArray[0][0] != "") {
window.alert("Jogo encerrado!");
limpaTabuleiro();
}
if(jogoArray[2][0] == jogoArray[1][1] && jogoArray[1][1] == jogoArray[0][2]
&& jogoArray[2][0] != "") {
window.alert("Jogo encerrado!");
limpaTabuleiro();
}
}

Como este jogo funciona??
Primeiramente, mapeamos o tabuleiro num Array bidimensional. Por conveniência, os botões da matriz do tabuleiro têm o id semelhante ao índice bidimensional do Array (11, 12, 13, 21, 22, 23, 31, 32, 33). A cada jogada, o jogo faz basicamente 3 coisas:

1- Verifica se a casa está vazia, ou seja, se um jogador ainda não jogou nesta casa:
if (botao.value != "") {
return;
}

2- Escolhe o jogador e preenche o campo com o seu marcador correto ("X" ou "O", que são marcadores tradicionais no jogo da velha);

3- Verifica se este último jogador que jogou ganhou o jogo. Caso tenha ganhado, o jogo é encerrado e o tabuleiro é limpado.

Um incremento a mais seria ter um botão para limpar o tabuleiro (a função já está aí) e uma verificação para saber se deu velha.
Bom, divirtam-se!!