Archive for the ‘Desenvolvimento’ Category

Comparações Case Sensitive em consultas Mysql

Tuesday, October 20th, 2009

Buenas pessoal, tempão sem postar nada, a vida anda corrida demais, esse artigo está para ser escrito faz um tempão, e como ele é curto eu resolvi postar de uma vez ele. Nele vou lhes apresentar uma solução para realizarmos consultas case sensitive no Mysql.

Para começar, caso você utilize um campo de texto no Mysql como VARCHAR, TEXT, etc, na hora de fazer uma consulta ele não considerará se seu texto comparado está exatamente igual ao texto da comparação quando falamos em Maiúsculas/Minúsculas. Então para resolver isso, devemos fazer um casting na comparação utilizando o operador BINARY do Mysql. De longe essa é a alternativa mais simples que eu encontrei, existem outras, que envolvem mudar o COLLATE durante a consulta, mas não me pareceu elegante nem muito promissor.

A função do operador BINARY é muito simples, ele transforma todo o texto passado pra ele em código binário, logo “x” em binário é totalmente diferente de “X”. Abaixo alguns exemplos:

    SELECT "x" = "X";
    retorna 1
    SELECT binary "x" = "X"
    retorna 0

É claro que além dessa comparação simples ele é aceito na comparação LIKE:

    SELECT binary "xorna" LIKE "%X%"
    retorna 0
    SELECT binary "Xorna" LIKE "%X%"
    retorna 1

É simples, funciona, eu diria que isso é um workaround elegante (se é que existe isso).

Compartilhe e socialize:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • E-mail this story to a friend!
  • LinkArena
  • LinkedIn
  • Live
  • Netvibes
  • Socialogs
  • Technorati
  • ThisNext
  • Yahoo! Buzz
  • YahooMyWeb

Mini manual VIM (Vi IMproved)

Sunday, July 5th, 2009

Buena moçada, vou deixar esfriando o artigo sobre testes unitários, e vou refatorar um artigo de um ano atrás. O artigo é sobre o VIM (Vi IMproved), este editor (fantástico diga-se de passagem) que tenho usado pouco nos últimos tempos, agora é a minha nova escolha para desenvolvimento, dado que cansei de usar IDEs pesadas e que pouca ajuda têm me dado. Usei meu antigo artigo como base de estudo dos principais comandos, e agora monto um pequeno manual para eu mesmo usar e quem quiser também.

O VIM é um editor de texto que foi baseado no “vi”, e é disponibilizado para uma grande quantidade de plataformas (Linux, *BSD, Windows, BeOS, AmigaOS, MacOS, etc). No linux e mac os x normalmente ele vem instalado na distribuição, caso não esteja instalado e você deseja instalar, basta baixar a última versão dele em http://www.vim.org.

O VIM utiliza buffers, ou seja, representações do texto em memória, quando um arquivo é aberto, ele é carregado em memória, e todas as alterações feitas nele afetam apenas o buffer (arquivo em memória) e não no arquivo original, até que o mesmo seja salvo. Caso você abra o VIM sem especificar um arquivo, ele cria um buffer vazio em memória sem nome definido.

O VIM é um software simples, mas metódico, exigindo perícia e um pequeno tempo para o usuário gostar dele, quando o usuário gosta, é paixão eterna. Se o mesmo não consegue se adaptar, ele dificilmente abre novamento o editor.

O VIM possui vários modos de funcionamento, abaixo vou listá-los:

  • INSERT: o modo “insert” é utilizado para inserir e modificar o conteúdo do arquivo, neste modo, tudo que é feito é gravado somente em memória;
  • VISUAL: o modo “visual” é utilizado para selecionar textos e fazer operações sobre esta seleção, como copiar, recortar, colar, excluir, navegar entre o início e o fim de uma linha;
  • Linha de comando: neste modo é possível executar diversos comandos do VIM ou até mesmo da shell, com os comandos do VIM podemos fazer muitas coisas, como gravar buffers, abrir arquivos, navegar entre arquivos abertos, procurar por trechos de texto e fazer substituição de textos com expressões regulares, e também executar tarefas em repetição de forma automatizada;
  • Nenhum modo: é como o VIM abre, a partir dele é possível navegar pelo arquivo aberto com os cursores Home/End, PageUp/PageDown ou até mesmo utilizar comandos do VIM.

Comandos do VIM

Vamos começar pelo final, como fechar um arquivo

	# Se você estiver em modo INSERT, tecle ESC para sair deste modo;
	# Digite ":" para entrar em modo Linha de Comando;
	# Digite "q" (quit) e tecle ENTER para executar o comando;
	# nota: se o arquivo estiver protegido contra gravação e você fez alguma modificação,
       após digitar "q", digite "!" ficando "q!" e depois tecle ENTER para executar.

Bom, assim melhor né, agora você já sabe fechar o VIM :P . Agora por segundo porém não menos importante, vamos aprender a inserir os textos no nosso arquivo:

	# Para entrar em modo INSERT, digite "i" ou "a" (também funciona, herança do "vi");
	# Digite a vontade;
	# Tecle ESC para sair do modo INSERT;

Edição de texto (Recortar/Copiar/Colar)

	# Se você estiver em modo INSERT, tecle ESC para sair deste modo;
	# Digite "v" para entrar em modo VISUAL;
	# Faça a seleção do texto utilizando os cursores;
	# Digite "d" (delete) para recortar o texto (movê-lo para a memória);
	# Ou digite "y" (yank) para copiar o texto (copiá-lo para a memória);
	# Escolha o lugar onde quer copiá-lo;
	# Digite "p" para inserir o texto a partir da posição do cursor;
	# Digite "P" para inserir o texto antes da posição do cursor.

A partir daqui estamos no modo Linha de Comando, ou seja, tecle ESC se você estiver em modo INPUT ou VISUAL:

Trabalhando com os arquivos/buffers

	# :e "arquivo" - Abre um arquivo, criando um novo buffer e abrindo ele em uma nova "tela";
	# :buffers - Lista todos os arquivos abertos;
	# :b "arquivo" - Salta para outro arquivo aberto, use TAB para autocompletar os nomes dos arquivos abertos;
	# :bn - Salta para o próximo arquivo aberto;
	# :bp - Salta para o arquivo anterior aberto;
	# :w - Grava o buffer atual com o nome do arquivo aberto;
	# :wq - Grava o buffer atual com seu nome, e fecha o VIM;
	# :wqa - Grava todos os buffers em seus determinados arquivos e fecha o VIM.

Navegando dentro do arquivo aberto (estes comandos se equivalem aos do cursor de seu teclado, a diferença é que eles não funcionam em qualquer modo, somente em Linha de Comando):

	# "h" - Esquerda
	# "l" - Direita
	# "k" - Cima
	# "j" - Baixo

Navegar entre as linhas:

	# "gg" - Move o cursor para a primeira linha do arquivo;
	# :0 - Move o cursor para a primeira linha do arquivo;
	# "G" - Move o cursor para a última linha do arquivo;
	# :$ - Move o cursor para a última linha do arquivo;
	# "*" - Salta para a próxima ocorrência da palavra sob o cursor;
	# '' - Volta para a linha anterior ao ultimo salto;
	# "ma" - Cria um marcador de linha chamado "a";
	# "`a" - Move o cursor para a marca "a";
	# "'a" - Move o cursor para a linha que contém a marca "a";
	# " - Move o cursor para o caracter anterior ao último salto.

Navegação na linha:

	# 0 - Move o cursor para o inicio da linha;
	# $ - Move o cursor para o final da linha.

Apagando texto:

	# "dd" - Apaga a linha atual;
	# "d" "CIMA" - Apaga a linha atual e anterior;
	# "d" "BAIXO" - Apaga a linha atual e seguindo;
	# "d" "ESQUERDA" - Apaga o caracter a esquerda;
	# "d" "DIREITA" - Apaga o caracter a direita;
	# "x" - Apaga o caracter a direita;
	# "d0" - Apaga até o principio da linha;
	# "d$" - Apaga até o final da linha;
	# "dw" - Apaga a palavra seguinte;
	# "db" - Apaga a palavra anterior;
	# "d'a" - Apaga até a linha com o marcador "a";
	# "d`a" - Apaga até o caracter com o marcador "a".

Multiplicadores:

Muitos comandos podem ser precedidos de um multiplicador, ou seja, podem ser executados “n” vezes, esse número de repetições deve ser inserido antes do comando desejado e só é apresentado na tela (canto inferior direito) se ativarmos a opção “showcmd” (:set showcmd). Abaixo vou citar alguns exemplos:

	# 20 "BAIXO" - Move o cursor 20 linhas para baixo;
	# 4 dd - Apaga as 4 linhas seguintes, incluindo a atual;
	# 4 d "DIREITA" - Apaga os 6 próximos caracteres a direita.

Busca de expressões dentro do texto:

	# "/expressão" - Procurar para frente;
	# "?expressão" - Procurar para trás;
	# "ENTER" - Ir para a primeira ocorrência;
	# "n" - Ir para próxima ocorrência;
	# "N" - Ir para o ocorrência anterior.

Expressões Regulares:

	# "." - Representa qualquer caracter simples exceto mudança de linha;
	# " " - Representa o caracte que se segue;
	# "*" - Representa 0 ou mais ocorrências do caracter precedente;
	# "[]" - Representa um dos caracteres incluidos;
	# "^" - Indica que o caracter seguinte deve estar no inicio da linha;
	# "$" - Representa caracteres no final da linha;
	# "[^]" - Representa qualquer coisa exceto o que vem depois do "^";
	# "[-]" - Representa um intervalo de caracteres.

Alguns exemplos de expressões regulares:

	# "c.pe" - Representa cope, cape, caper, ...;
	# "c.pe " - Representa c.pe, c.per, ...;
	# "sto*p" - Representa stp, stop, stoop, ...;
	# "car.*n" - Representa carton, cartoon, carmen, ...;
	# "xyz.*" - Representa xyz até o final da linha;
	# "^The" - Representa qualquer coisa que comece com The;
	# "atime$" - Representa qualquer coisa terminado com atime;
	# "^Only$" - Representa qualquer linha que contenha somente Only;
	# "b[aou]rn" - Representa barn, born e burn;
        # "Ver[D-F]" - Representa VerD, VerE e VerF;
        # "Ver[^1-9]" - Representa Ver seguido de um não digito;
      	# "the[ir][re]" - Representa their, theie, therr e there;
	# "[A-Za-z][A-Za-z]*" - Representa qualquer palavra;

Substituição de Textos:

	# :%s/substituir isto/por isto/g

Quando utilizarmos o caracter “%” antes de “s” estamos dizendo que a substituição deve ser feita em todas as ocorrências da palavra buscada, podemos especificar um intervalo também:

	# :linha1,linha3s/substituir isto/por isto/g

Do modo que fizemos agora, ele vai substituir somente as ocorrências entre a linha 1 e linha 3. Se utilizarmos “/gc” ao invés de “/g”, é necessário a confirmação antes da substituição de cada ocorrência. Enfim, as expressões utilizadas são delimitadas pelo caractere “/”, ou seja, o que vier entre a primeira e a segunda “/” representa a expressão a procurar e ser substituida, o que vier entre a segunda e terceira representa a expressão que vai substituir a primeira. Se a segunda expressão ficar vazia, as ocorrências da primeira serão eliminadas. Exemplos:

	# :1,$s/the/The/g - Substitui the por The desde a primeira linha até a última;
	# :%s/the/The/g - Substitui the por The desde a primeira linha até a última;
	# :%s/the/The/gc - Substitui the por The em todo o documento pedindo confirmação;
	# :.,5s/^.*//g - Apaga todas as linhas entre a atual e a 5ª linha;
	# :'a,.s/^..//g - Apaga os dois primeiros caracteres das linhas entre a marca "a" e a atual;
	# :%s/$/ < -/g - Acrescenta "<-" ao final de cada linha do documento;

O caracter "&" pode ser usado para representar a expressão buscada quando utilizado na segunda expressão, de modo a incluir a mesma na substituição, exemplo:

	# :%s/help/&ing/g - Substitui help por helping
	# :%s/ */&&/g - Duplica o numero de espaços entre as palavras
	# :%s/and/&/g - Para inserir o próprio caracter "&" usamos "&"

Registros

Podem ser utilizados para automatizar tarefas repetitivas, como inserir ou editar tags html, para utilizá-los você deve sair do modo INSERT, pressione “q”, depois o caracter que será o nome do registro no qual você queira guardar a ação, por exemplo “a”. Depois disso vai aparecer “recording” na parte inferior do terminal, de agora em diante, tudo que que for feito será gravado no registro “a”, para acabar de gravar é só sair do modo INSERT e pressionar “q” novamente, a palavra “recording” deve desaparecer. Para executar o registro basta pressionar “@” e após isso o caracter correspondente ao registro, no nosso exemplo “a”.

	# "q" - Inicia e finaliza a gravação de um registro;
	# "@" - Executa um determinado registro.

Além de gravar sequências de comando, quando você copia ou recorta textos no VIM, está jogando este conteúdo para o registro, desta forma você pode especificar qual registro quer usar em cada caso. Para isso basta você indicar qual registro usar. Referindo-se a ele utilizando o caracter “, desta forma, para se referir ao registro “a”, utilize ‘”a’. Exemplos:

	# "ay - Copia o texto selecionado para o registro "a";
	# "ad - Remove o texto selecionado e o coloca no registro "a";
	# "ap - Cola o conteúdo do registro "a" para depois do cursor.

Janelas:

	# :sp - Cria uma nova janela com o mesmo arquivo aberto;
	# :sp arquivo - Abre uma nova janela com o arquivo especificado;
	# :q - Fecha a janela atual, não fecha se for a unica janela com o arquivo aberto e o mesmo não estiver gravado;
	# :q! - Fecha a janela atual de qualquer forma (Forçado);
	# :qa - Fecha todas as janelas e sai, pedindo confirmação;
	# CTRL "ww" - Pula para a janela seguinte.

Bom, por enquanto é isso, em breve estarei postando um artigo sobre a configuração do VIM, coisa que estou explorando agora e não tenho muito a adicionar, qualquer coisa visitem a documentação do VIM online em http://vimdoc.sourceforge.net/.

Compartilhe e socialize:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • E-mail this story to a friend!
  • LinkArena
  • LinkedIn
  • Live
  • Netvibes
  • Socialogs
  • Technorati
  • ThisNext
  • Yahoo! Buzz
  • YahooMyWeb

Manipulação de diretórios simples e fácil de usar com a classe X_Dir

Sunday, June 14th, 2009

Buenas pessoal, como muitos programadores eu cansei de ficar me esquentando cada vez que precisava manipular algum diretório, então após algumas lidas, alguns testes, montei uma classe que trabalha bem, claro que ela trabalha bem em sistema Unix Like, não perdi meu tempo e nem tenho como portar no windows, então abaixo segue a classe:

<?php
/**
 * Classe para manipulação de diretórios
 * Exclusivo para uso em sistemas Unix Like
 * Sem vontade para portar para plataforma MS
 * @author André Gustavo Espeiorin
 * @version 1.0
 * @package X
 */
class X_Dir
{
	/**
	 * Metodo Responsavel pela criação de diretórios
	 * @param $location - onde a pasta deve ser criada
	 * @param $name - nome da mesma, evite o uso de caracteres especiais e espaços em branco
	 * @param $chmod - permissão para o acesso a nova pasta
	 * @param $recursive - criar recursivamente?
	 * @return <string> caminho da pasta criada
	 */
	public static function create($location, $name, $chmod=0777, $recursive=true)
	{
		$path = $location . $name;
		/**
		 * Supressão de erro não aconselhada, porém caso a pasta exista
		 * o PHP lançará um aviso, coisa que nao queremos caso haja
		 * redirecionamento após a criação da mesma
		 */
		if( @mkdir( $path, $chmod, $recursive ) ){
			chmod( $path, $chmod );
			return $path . '/';
		} else{
			if( is_writable($path) && is_readable($path) ){
				return $path;
			}else{
				echo 'erro';
			}
		}
	}

	/**
	 * Método criado para apagar um arquivo unicamente, e não um diretório
	 * Pode apagar arquivos e links simbólicos
	 * @param $fileName - Nome do arquivo
	 * @return <boolean>
	 */
	public static function removeFile($fileName)
	{
		if ( is_file($fileName) || is_link($fileName) ) {
        	return unlink($fileName);
    	}else{
    		return false;
    	}
	}

	/**
	 * Método responável por remover um diretório, é capaz de remover
	 * um diretório completo, incluindo subdiretórios e arquivos por meio
	 * da recursividade.
	 * @param $dirname - nome do diretório como seu caminho completo no Sistema de Arquvios
	 * @return <boolean>
	 */
	public static function remove($dirname)
	{
		// Checa se existe o diretório
    	if ( !file_exists($dirname) ) {
        	return false;
    	}

    	/**
    	 * Caso encontrar um arquivo em meio a recursividade, ele o removerá
    	 * tratando ele como um arquivo e não diretório
    	 */
    	if (is_file($dirname) || is_link($dirname)) {
        	return self::removeFile($dirname);
    	}

    	/**
    	 * Abre o diretório chamado como um objeto dir
    	 * Faz a iteração no mesmo, lendo seu interior
    	 * e chamando recursivamente o mesmo até eliminar
    	 * todo o conteúdo do diretório
    	 * @var <object> diretório
    	 */
    	$dir = dir($dirname);
   		while (false !== $entry = $dir->read()) {
        	// Pula os ponteiros
        	if ($entry == '.' || $entry == '..') {
          	  continue;
        	}
        	// Chama novamente a função
    	    self::remove( $dirname . DIRECTORY_SEPARATOR . $entry );
    	}
    	// Fechamos nosso objeto dir
   		$dir->close();
   		// Finalmente remove nosso diretório
    	return rmdir($dirname);
	}

	/**
	 * Este método é utilizado na necessidade de renomear um diretório
	 * Utiliza recursividade para sub-diretórios e funcionou muito
	 * bem em todos os testes
	 * @param $path - Caminho até a localização do diretório a ser renomeado
	 * @param $oldDir - Nome do diretório a ser renomeado
	 * @param $newDir - Novo Nome para o diretório
	 * @return <boolean>
	 */
	public static function rename($path, $oldDir, $newDir)
	{
		// Checa se o diretório existe
    	if (!file_exists($path . $oldDir)) {
        	return false;
    	}   	

    	// Cria o novo diretório
    	$new = self::create($path, $newDir);

    	/**
    	 * Abre o velho diretório e itera ele, transferindo todos os arquivos para o novo
    	 * Os subdiretórios são transferidos do mesmo modo, por meio de recursividade
    	 * @var <object> dir
    	 */
    	$dir = dir($path . $oldDir);
   		while (false !== $entry = $dir->read()) {
        	// Pula os Ponteiros
        	if ($entry == '.' || $entry == '..') {
          	  continue;
        	}
        	// Se o conteudo for um diretório, recursividade!
        	if( is_dir($new . $entry) ){
        		self::rename($path . $oldDir, $entry, $path . $new . $entry );
        	}
        	// Aqui é feita a transferencia de arquivos
        	rename( $path . $oldDir . '/' . $entry, $new . $entry );
    	}
    	// Fecha o objeto
   		$dir->close();
   		// Remove o diretório antigo
   		self::remove( $path . $oldDir );
   		return true;
	}
}

Aqui vai um pequenino exemplo de como isso pode facilitar sua vida:

# vamos criar um diretório
echo X_Dir::create('/var/www/arigos/', 'aaa');
# agora outro dele
echo X_Dir::create('/var/www/arigos/aaa/', 'qwe1');
# antes do próximo passo, crie vários arquivos dentro das pastas... algo como:
$ touch aaa/teste.wtf
$ touch aaa/teste.sql
$ touch aaa/teste.php
$ touch aaa/qwe1/teste.php
$ touch aaa/qwe1/teste.asd
$ touch aaa/qwe1/teste.123
# agora renomeamos a pasta pai
echo X_Dir::rename('/var/www/arigos/', 'aaa', 'bbb');
# removemos um unico arquivo
echo X_Dir::removeFile('/var/www/arigos/bbb/qwe1/teste.123');
# e apagamos por completo tudo!
echo X_Dir::remove('/var/www/arigos/bbb/');

Muito simples, os “echos” que estão aí são somente para ver o que ta retornando, pois agora sua obrigação é testar se ta criando, renomenando e apagando…

Compartilhe e socialize:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • E-mail this story to a friend!
  • LinkArena
  • LinkedIn
  • Live
  • Netvibes
  • Socialogs
  • Technorati
  • ThisNext
  • Yahoo! Buzz
  • YahooMyWeb
Clicky Web Analytics