Archive for the ‘Software Livre’ Category

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

Classe para buscar dados de GeoLocalização

Wednesday, May 27th, 2009

Buenas pessoal, depois de um tempo meio sem tempo pra postar, mudança nas prioridades e tudo mais, o Doctrine acabou ficando para um pouco depois, mas para cortar o silêncio que aqui se instaurou, vou aproveitar e postar uma classe na qual montei agora, muito simples, usa a API de um webservice gratuito de busca de dados de Geolocalização, bem simples mas pra mim ficou eficiente e rápido, espero que gostem.

<?php
/**
 * Classe para busca de dados de geolocalização
 * utiliza um webservice gratuito do iplocationtools.com
 * utilizando o formato json como padrão, por ser mais leve e ágil para tratar
 * @author André Gustavo Espeiorin <andregustavodocaqui@gmail.com>
 * @version 1.0
 * @package X
 *
 */
class X_Location
{
	/**
	 * Formato Padrão
	 * @var <string>
	 * @access private
	 */
	private $_format = 'json';

	/**
	 * Endereço inicial para a pesquisa
	 * @var <string>
	 * @access private
	 */
	private $_queryUrl = 'http://iplocationtools.com/ip_query.php?ip=';

	/**
	 * Objecto de consulta do CURLs
	 * @var <object>
         * @access private
	 */
	private $_ch;

	/**
	 * Dados tratados
	 * @var <array>
	 * @access private
	 */
	private $_data;

	/**
	 * Construtor da Classe, recebe o parrametro <string> format
	 * Caso o paramêtro não seja passado, usa o padrão do sistema
	 * @return <void>
	 */
	public function __construct()
	{
		$this->_ch = curl_init();
	}

	/**
	 * Método que faz a consulta e tratamento dos dados, recebe o ip
	 * a ser consultado como parâmetro
	 * @param $ip
	 * @return <boolean>
	 */
	public function getData($ip)
	{
		if( isset($ip) && !empty($ip) ){
			curl_setopt($this->_ch, CURLOPT_URL, $this->_queryUrl . $ip . '&output=' . $this->_format);
			curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($this->_ch, CURLOPT_TIMEOUT, 15);

			$request = curl_exec($this->_ch);
			if( isset($request) && !empty($request) ){
				$this->_data = json_decode($request, true);
				return true;
			} else{
				return false;
			}
		} else{
			return false;
		}
	}

	/**
	 * Método utilizado para pegar os dados de _data, caso o keyName seja ignorado, retorna o array inteiro
	 * Aqui eu listo as chaves que podem ser buscadas:
	 * -Ip
	 * -Status
	 * -CountryCode
	 * -CountryName
	 * -RegionCode
	 * -RegionName
	 * -City
	 * -ZipPostalCode
	 * -Latitude
	 * -Longitude
	 * @param $paramName
	 * @return <array> | <string>
	 */
	public function get($keyName='')
	{
		if( isset($keyName) && !empty($keyName) ){
			return $this->_data[$keyName];
		}else{
			return $this->_data;
		}
	}

}

Show, se a classe parece simples, imagine seu uso, abaixo pequeno exemplo:

$gl = new X_Location();
$gl->getData('seuIp');
echo $gl->get('City');
// ou
var_dump($gl->get());

Bom, espero que seja útil a todos, agradeço sua visita!

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

Doctrine ORM, Parte II

Wednesday, April 29th, 2009

Bom, como prometido, o segundo capitulo da Saga “Doctrine ORM” vou abordar questões simples como o download da ferramenta, “instalação”, e configuração da mesma, deixando a primeira aplicação para o terceiro post, devido sua extensão.

Para baixa o Doctrine ORM é muito simples, basta acessar a página de download oficial, e selecionar a versão desejada, eu aconselho a baixar a última versão stable (atualmente 1.1.0). Após o download, descompacte o arquivo, para o uso em produção você vai precisar somente da pasta lib e de seu conteúdo é claro, tomando como exemplo o ubuntu, vamos criar uma aplicação chamada doctrineTest em /var/www (com as devidas permissões de escrita na pasta):

$ cd /var/www
$ mkdir doctrineTest
# vá até a pasta Dotrine-1.x.x
$ cp -R lib /var/www/doctrineTest
# aproveita e cria o index.php
$ touch index.php
# vamos criar uma classe para autoload
$ cd /var/www/lib
$ mkdir Util
$ touch Autoload.class.php

Justo, agora já temos o inicio de nossa aplicação salva no diretório de site do apache, vamos começar a configuração e a entender tudo isso. Abra seu editor preferido (eclipse no meu caso), abra o arquivo lib/util/autoload.class.php, vamos fazer um pequeno truque para nos livrarmos dos includes.

class Util_Autoload
{
    public function autoload($class)
    {
        $path = str_replace('_', '/', $class) . '.php';
        require_once($path);
        return true;
    }
}

Feito isso, vamos ao nosso index.php, primeiro vamos configurar nosso autoload :)

/* Adicionando a pasta libs ao include_path do php */
$include_path  = get_include_path();
$include_path .= PATH_SEPARATOR . dirname(__FILE__) . '/lib';
set_include_path($include_path);
unset($include_path);

/* registrando nossa classe autoload */
require_once(dirname(__FILE__) . '/lib/Util/Autoload.class.php');
spl_autoload_register(array('Util_Autoload', 'autoload'));

Legal, a essa altura qualquer classe que quisermos carregar dentro de libs estará disponível, agora vamos abrir nossa primeira conexão com o banco de dados (no exemplo MySQL):

$dsn = 'mysql://username:password@127.0.0.1/doctrineTest';
$manager = Doctrine_Manager::getInstance();
$conn = $manager->connection($dsn, 'master');

Bom, agora já conseguimos conectar a aplicação com o banco de dados, para finalizarmos este capitulo vamos fazer um pequeno teste de conexão, certifique-se que o usuário no qual você está conectando tenha permissões de CREATE no banco de dados. Vamos criar uma tabela e depois inserir dados nela:

$conn->export->createTable('teste', array('nome' => array('type' => 'string')));
$conn->execute('INSERT INTO teste (nome) VALUES (?)', array('blogdoxorna'));

Legal, tabela criada, uma linha inserida, agora vamos ler pra ver se é verdade que tá gravando (claro, comentando a linha do create pra não dar pau!) ;)

$st = $conn->prepare('SELECT * FROM teste');
$st->execute();
$resultset = $st->fetchAll();
var_dump($resultset);

O que deve aparecer aí no browser é mais ou menos isso:

array
  0 =>
    array
      'nome' => string 'blogdoxorna' (length=11)
      0 => string 'blogdoxorna' (length=11)

Bom, encerro aqui o meu post, e lembrando que se eu sair vivo do #NOB #TwitteirosDeJoinville no Biergarten, eu posto a terceira parte ainda hoje 29/04 a noite ;)

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