Como fazer tudo com GVim – Parte 2
30 de Março de 2009, 0:00 - Um comentárioHey! Dando continuidade à série: ‘Como Fazer Tudo com o GVim’, nesse segundo post, vou mostrar algumas coisas que podem não fazer muito sentido, mas fazem, definitivamente acerca do que o vim é capaz (e ótimo que o seja) de fazer.
Como o vim tem suporte à programação em python e ruby, ou seja, você pode programar em python ou ruby para fazer plugins e afins para o vim, pode-se, evidentemente, utilizar biliotecas nativas das linguages, ou até mesmo API’s próprias.
Não é frescura!
Editor de texto é aquele programa onde você consegue escrever tudo que você quer realmente escrever. Diversas vezes vamos escrever, mas o pensamento consegue ser mais rápido, e, por uma questão de segundos, some. O editor de texto está aí para isto. Ele tem que facilitar o fluxo entre o cérebro e o computador. Nisso, o vim é muito bom. Responder emails, escrever posts de blogs, tudo que envolve texto.
Defendo isso. Imagine aquela palavra que você escreve errado o tempo todo. Sempre se confunde. O vim possibilita correção pelo aspell, abreviações e correções ortográficas. E uma série de outras coisas que um dia eu posto aqui no blog.
Segue uma série de plugins para facilitar nossas vidas:
1. Postando no Twitter
O plugin posta e lê timelines do Twitter. Maiores explicações em: http://www.vim.org/scripts/script.php?script_id=2204
2. Gerenciando Blogs
O Blogit é um plugin que permite que se submeta, remova, edite, liste, enfim, administre seu blog inteiro utilizando XML-RPC. Para conferir: http://www.vim.org/scripts/script.php?script_id=2030 .
3. Gerenciando Gists
Para quem utliza o serviço do github Gist, este plugin facilita bastante o trabalho: permite que vocẽ envie arquivos inteiros ou apenas trechos deles. Permite também editar e listar Gists já existentes. Experimente usá-lo. baixando aqui.
4. Copiando o TexMate
Esse plugin possibilita coisas do tipo: for<TAB> se transforme em:
1 2 3 |
for ($i = 0; $i < size; $i++) { // code here } |
O próprio script permite que você altere a variável $i por outro nome e automagicamente ele dá um refact nas outras 2 ocorrências da variável, ao mesmo tempo já coloca em evidência o size, onde, depois de você ter digitado o valor e pressionado tab novamente, ele dá o foco para o comentário. Muito interessante, muito prático, um grande facilitador. Ah! Para criar arquivos específicos para cada linguagem é muito simples, só vendo os exemplos já o suficiente.
5. Lendo documentação do Python
Quem nunca ficou em dúvida em algum parâmetro de alguma API do python que atire a primeira pedra. Tanta coisa para decorar, saber, pensar, às vezes faz com que esqueçamos a ordem de parâmetros para um método ou função e etc. O plugin pydoc ajuda bastante nesse sentido, apesar de ser acessível e fácil. Basta apenas utilizar :pydoc re.compile, por exemplo.
6. Wiki no Vim
Há pouco tempo eu ouvi falar de Knowledge Base, que até então, eu chamava de wiki. Eu sempre achei um saco configurar banco de dados e por um wiki local pra rodar só pra organizar meus pensamentos, posts, etc. Mas, achei a solução dos meus problemas: PotWiki. Vendo a própria página do vim.org, já dá pra perceber como é fácil de mexer.
Vim no Firefox
Sabe quando temos que escrever alguma coisa nas <textarea>’s e nos perdemos porque o espaço é pequeno, ou não da pra organizar as idéias? Pois é. Para tentar corrigir isso, existe o It’s All Text. Ele permite que seja configurado um editor. Ao salvar o arquivo, ele joga o conteúdo pra textarea. Inclusive, tem alguns outros parâmetros que podem ser configurados.
Finalização
Espero que vocês gostem de pelo menos um destes plugins! Sugestões de outros, críticas e receitas de tortas de chocolate: comente!
Como fazer um mini servidor HTTP em Python
23 de Março de 2009, 0:00 - sem comentários aindaOlá! Estava lendo minhas mail lists matinais, mais especificadamente a mail list do TcheLinux (evento que, aliás, irá ocorrer em Gravataí sábado que vem, dia 28/03), quando me deparo com um post de Leonardo Menezes Vaz falando de um mini servidor http em python. Achei muito interessante e resolvi postar aqui.
Ingredientes
- Lazanha
- Python instalado
- 3 minutos de lazer
Modo de preparo
Pegue os 3 minutos de lazer e utlize para criar um diretório:
$ mkdir ~/htmldocs $ cd ~/htmldocs $ echo "<html><head></head><body>Meus posts no blog</body></html>" > index.html $ python -m SimpleHTTPServer $ firefox http://localhost:8000
Pronto! Agora você pode gerenciar documentações, fazer preview de posts no seu blog, fazer testes de javascript/css sem precisar instalar o apache ou criar um VirtualHost!
Eu achei útil! E você?
Como usar mod_rewrite de verdade
23 de Março de 2009, 0:00 - 5 comentáriosRá! Hoje quero falar sobre mod_rewrite. Um módulo para o apache que permite reescrever URL’s. Ele é muito útil em vários sentidos: aumenta a o page rank em buscadores, torna URL’s limpas e inteligíveis, fazendo com que o usuário consiga lembrá-las muito mais rápida e facilmente.
Porém, como todos os outros artefatos que estão por aí, pode complicar ainda mais a vida de um programador, caso não seja usado adequadamente.
Introdução
Como visto no post anterior, onde está descrito algumas vantagens e desvantages de se usar o mod_rewrite, neste post vamos concluir o assunto. Assumindo que você esteja usando Apache com o mod_rewrite habilitado. Também é necessário o uso de arquivos .htaccess: Arquivos ocultos que contém diretivas interpretadas pelo Apache. Para que seu .htaccess funcione, deve se certificar de que a diretiva AllowOverride All esteja nos arquivos de configuração do apache. Ela deve ficar dentro de <Directory />, mais ou menos assim:
AllowOverride All
Basta adicionar ao seus arquivos de configuração do apache ou requisitar seu servidor que o faça.
Conhecendo as diretivas
Antes de mais nada, vamos entender o que o mod_rewrite faz e é capaz de fazer, conhecendo seus parâmetros de configurações.
RewriteEngine on|off
Habilita(on) ou desabilita(off) o uso do módulo mod_rewrite.
RewriteOptions [inherit] [MaxRedirects=X]
Adiciona uma ou as duas opções.
inherit
Herda os parâmetros dos diretórios pai.
MaxRedirects=X
Ao invés de permitir o ‘loop infinito’ de redirecionamento, limita para X vezes. Caso, X seja alcançado, é disparado erro 500 (Internal Error).
RewriteLog /caminho/para/arquivo.log
Escreve o log dos eventos ocorridos no arquivo especificado.
RewriteLogLevel Level
Level inicia em 0 (desabilitado) e vai até 9 (números superiores podem ser utilizados, mas terão o mesmo efeito: irão logar quase tudo! Use somente para debug, pois vai diminuir a performance do apache. Bom para testes/debug, não para produção.)
RewriteBase /dir
Especifica /dir como a base para a procura do arquivo pelo Apache. (Mais explicações adiante)
RewriteCond
Responsável pela condições (a.k.a. IF’s). Pode-se utilizar inúmeros testes antes de especificar uma regra, sendo que a mesma só será executada ao passar por todos os testes com sucesso. Exemplos:
# Se o host for 123.45.67.89 RewriteCond %{REMOTE_ADDR} ^123.45.67.89$ [OR] # ou for 98.76.54.32 RewriteCond %{REMOTE_ADDR} ^98.76.54.32 # A regra será a seguinte...
Podem ser usadas uma série de variáveis, entre elas:
- %{HTTP_USER_AGENT}
- %{HTTP_REFERER}
- %{REMOTE_ADDR}
- %{SCRIPT_FILENAME}
- %{QUERY_STRING}
- %{HTTP_HOST}
- mais informações aqui
É aqui que realmente acontece a reestruturação da URL. Aqui é onde é dito o que deve ser entrepretado como o quê. Se o Padrão casar, o apache interpreta como se fosse o Caminho.
Por exemplo:
RewriteRule ^/(about|aboutme|sobre|sobremim|eu|minhavida)$ eu.html [L,NC]
Referências interessantes:
Exemplos de uso
Agora, com alguma noção sobre o mod_rewrite, vamos utilizá-los. Com alguns exemplos do que é possível. A idéia é que você descubra um jeito próprio e que funcione PARA VOCÊ. Esta é o tipo da coisa que não adianta fazer porque alguém disse que funciona, deve seguir os seus padrões e cobrir suas necessidades.
Exemplo 1: Organizando seu site no .htaccess
Convenhamos: uma notícia sobre um acidente não irá mudar. Depois de submetida para um site de notícias, dificilmente ela irá ser modificada. Ao menos que tenha passado desapercebido um erro de português ou uma estatística imprecisa, uma notícia não será modificada. Portando, é possível manter um cache da notícia em um arquivo .html, evitando consultas desnecessárias a bancos de dados ou outras fontes. Mas só porque ela está em cache, não significa que ela deva aparecer com o .html no fim ou .htm ou seja lá o que for.
RewriteEngine On RewriteBase / # Se não foi requerido um arquivo vazio (-s) RewriteCond %{REQUEST_FILENAME} !-s [OR] # Se não foi requerido um link simbólico (-l) RewriteCond %{REQUEST_FILENAME} !-l [OR] # ou um arquivo (-f) RewriteCond %{REQUEST_FILENAME} !-f [OR] # ou um diretório (-d) RewriteCond %{REQUEST_FILENAME} !-d # Aplique a seguinte regra: # Se for notícia cacheada, chama o cache RewriteRule ^ler/([A-Za-z0-9_-]+)$ /noticias/cache/$1.html [L] # Se for para buscar por noticias RewriteRule ^buscar/([A-Za-z0-9_-]+) /noticias/busca.php?termo=$1&area=noticias [L] # Feeds RewriteRule ^feeds$ feeds.php?area=noticias # Feeds para a categoria X RewriteRule ^feeds/(.*)$ feeds.php?area=noticias&categoria=$1
e assim por diante. Podemos estabelecer regras, inclusive, para subdomínios.
RewriteCond %{HTTP_HOST} ^en\.example\.com$ RewriteRule ^(.*)$ /news/english/index.php?q=$1 [L] RewriteCond %{HTTP_HOST} ^br\.example\.com$ RewriteRule ^(.*)$ /news/brazilian/index.php?q=$1 [L]
uma outra sugestão:
RewriteCond %{HTTP_HOST} ^en\.example\.com$ RewriteRule ^(.*)$ /news/index.php?lang=en&q=$1 [L] RewriteCond %{HTTP_HOST} ^br\.example\.com$ RewriteRule ^(.*)$ /news/index.php?lang=pt-br&q=$1 [L]
Exemplo 2: Listas de traduções
A questão de usar uma única variável que receberá o valor da url, funciona melhor para este segundo caso:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} !-s [OR] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L,NC]
Imagine que seu cliente queira criar páginas novas, de ‘política de privacidade’, ’sobre a empresa’, seja lá qual for o assunto da página. Ele vai querer acessá-la de forma rápida e acessível. Para tanto, index.php?area=view_page&page=4354 não parece agradar muita gente. Não seria interessante deixar que o próprio cliente crie seu padrão de URL? Talvez /politicas ou /empresa.
Existe uma forma interessante de se fazer isso: usando uma lista de expressões regulares e seus arquivos originais, os quais serão usados caso as expressões regulares casarem. Por exemplo, nos casos acima, apenas com o código abaixo no .htaccess, já poderíamos fazer algo:
A idéia é usar a REQUEST_URI (no php $_SERVER['REQUEST_URI']). Ela retornará, por exemplo, /ler/minha_noticia_bombastica que casará com ^/ler/([a-z0-9_-])$ e por consequência, irá chamar a noticias.php. Agora, como pegar o ‘minha_noticia_bombastica’ ? Fácil! Basta apenas utilizarmos os grupos das expressões regulares de forma apropriada. Usando o exemplo do php, com preg_match podemos resolver isso!
$urlPatterns = Array( '/^ler\/([a-z0-9_-]+)$/i' => 'noticias.php' ); foreach ($urlPatterns as $pattern => $fileName) if (preg_match($pattern, $_SERVER['REQUEST_URI'], $vars)) { $_GET = $vars; include $fileName; break; } }
Pronto! Alguns usuários podem ter notado, mas $vars irá ser uma sequência numérica dos grupos casados:
0 => /ler/minha_noticia_bombastica, 1 => ‘minha_noticia_bombastica’
Para resolver isso, podemos dar nomes aos grupos, o que seria extremamente normal para o programador (que utilizaria a variável $_GET normalmente) e bonito aos olhos do cliente. Para tanto, modificamos a nossa $urlPatterns:
$urlPatterns = Array( '/ler\/(?<news -slug>[a-z0-9_-]+)$/i' => 'noticias.php' );</news>
Assim, poderemos acessar $_GET['news-slug']. Como fica mais difícil do usuário modificar nomes de variáveis vindos da URL, se torna uma solução segura. Podemos ter certeza de que $_GET['news-slug'] não conterá aspas, caracateres hexadecimais ou qualquer outro tipo de código malicioso. Pois se tivesse, não passaria no teste da expressão regular. E também nos certificamos de que aquele arquivo (noticias.php) só esteja sendo acessado, caso nossa index.php o esteja incluindo. Porque o usuário não conseguirá acessar de fora.
Neste caso, nós estipulamos os valores na $urlPatterns, mas ainda se pode pegar esses valores do banco de dados, por exemplo. Uma lista de ‘tradução’ para a url. Funciona muito bem, principalmente com páginas estáticas ou fixas. Ao invés do cidadão digitar index.php?area=pages&page_id=4232, ele estará acessando /sobre-a-empresa. Para usuários provenientes de sites de busca, isto é muito importante. Lhe dá muito mais segurança e você garante o seu clique. Ele vai direto ao ponto.
Por que usar Clean URL’s?
1 de Março de 2009, 0:00 - sem comentários aindaOlá! Este post é na verdade uma introdução para o próximo. Que trará formas de se trabalhar com Clean URL’s. Este, por sua vez, é mais teórico. Portanto, se você estiver em dúvida se usar ou não, qual os ganhos dela e etc, sinta-se a vontade de ler, comentar e criticar o post abaixo.
Patterns de URLS
A primeira coisa a se pensar ao usar Clean URL’s é a modularização, estruturação ou hierarquisação dos conteúdos do site, para que se possa fazer algo interessante. Precisamos de algo único e que seja facilmente localizável. Afinal, um dos motivos do uso de Clean URL é este: que o conteúdo daquela página seja facilmente localizável (isso inclui memória do usuário, assimilação e, por que não, associação com outros assuntos. Além é claro de convenções, tais como: /about, /contact, etc).
Para blog, é muito interessante que o título de um post vire parte da URL. Ao ver o link, o usuário já sabe sobre o que se trata e o que vai encontrar neste post. Logo, se o vizinho da sua tia puser um link de um post seu no blog dele, torna-se muito mais fácil alguém clicá-lo. Nem sempre o link para o post conterá o título, talvez o link seja um mero ‘clique aqui’. Mas, passando o mouse sobre o link, o usuário vai ler o título do post. Para por o título na URL, existe um termo técnico chamado SLUG, que contém apenas letras, números, hífens e underlines. Por exemplo: ‘/artigo/como-usar-mod_rewrite’ é muito mais prático e óbvio do que um ‘?categoria=article&article_id=5433′.
Para buscadores isso é muito importante também. Note a diferença entre as URL’s do exemplo anterior: para usuários que não tem uma intimidade com Web, ver descrito o nome do título lhe dá muito mais segurança de clicar. Pessoas menos íntimas costumam julgar a periculosidade de uma URL pelo que consta nela. Constando “coisas do diabo” como ‘?id=343&vid=3fdd&hash=54dfsg===v3rgf’ devem ser exorcizadas!
Hierarquisando
Hierarquisar o site, fazer a topologia, mapa do site. Vários termos! Mas para mim, são a mesma coisa. No momento em que refletimos aquelas velhas questões clássicas antes de montar um site:
- Qual o público alvo ?
- Qual o objetivo ?
- O que é preciso ?
Já estamos montando mentalmente uma organização. Vamos pensar no blog deste que vos escreve e responder às perguntas.
Preciso de um blog. Onde eu escrevo posts sobre assuntos que me venham à cabeça para compartilhar um pouco da experiência que tenho e obtive lendo outros blogs, de pessoas que liam outros blogs. Ou seja, quero retribuir o que recebi (está aí o objetivo). Meu público alvo? Justamente aqueles que procuram por informações. Que programam, aprendem e crescem porque são apaixonados por tecnologias.
Agora vamos organizar essas informações:
No blog, além de posts (o que é totalmente indispensável), também deverá haver categorias, tags, etc. Pois o público alvo é um público sedento por informação. O público quer o máximo de informação possível e de forma rápida e simples. Não há tempo para se perder. Por isso se utiliza a categorização e as tags: fazem com que conteúdos relacionados cheguem muito mais rápido àqueles que as procuram.
Portanto é necessário que se consiga uma URL fácil para pesquisas no blog. Por exemplo: http://gustavodutra.com/categoria/GVim já lista todos os posts da categoria GVim. O que possibilita o ‘Joãozinho’ favoritar a dada URL e, sempre que entrar, irá se deparar com posts da dita categoria.
À partir do momento que você junta informações sobre o site, você consegue estruturá-lo de forma com que fique claro e simples para o usuário onde ele está. E mais importante! Sempre coloca nomes em URL’s que tenham algum sentido lógico com o contéudo. Fazendo o contrário, faz com que o site perca credibilidade, tanto para buscadores como para usuários finais. A palavra chave é ‘contextualização’. Uma URL uma vez contextualizada junto ao seu conteúdo, fica mais visível na internet!
Quais são os ganhos reais
Muitos dos ganhos podem parecer bobos. Mas não são. Com URL’s bem definidas:
- Aumenta-se a segurança do site
- Facilita a manutenção do site
- Despreocupaçao com diretórios e nomes de arquivos
- Facilita a navegação
- Aumenta o pagerank em buscadores
- Pode aumentar o número de visitas/page views
Se você se perguntou ‘Como?’, aguarde o próximo post! Obrigado pela atenção, até mais!
Gravando Sessões no Vim
15 de Fevereiro de 2009, 0:00 - sem comentários aindaPense na cena: você está programando uma certa funcionalidade de um determinado projeto, vamos chamá-lo de A. Então, você tem 4 arquivos abertos em buffers dentro do Vim. Criou uns mapeamentos do teclado extra, só para o momento. Também tem marcadores que pulam de um trecho do código para outro. Está tudo do jeito que você adora.
Chega, então, o seu chefe e diz: “Cara, preciso que tu veja algo em outro projeto.” ou até mesmo atualiza seu kernel e precisa rebootar o sistema. Chega sua namorada e pede pra ver o orkut. Seja qual seja o motivo, você precisa fechar o Vim. Mas, mais tarde, vai voltar a mexer, nestes 4 mesmos arquivos. Vai refazer todos os mapeamentos, refazer as marcações, etc.
Pois, se já aconteceu isso com você – comigo acontece muito frequênte -, você pode usar o :mksession.
A sintaxe é a seguinte:
:mksession ~/.vim-sessions/projeto-A.vim
Você escolhe o nome do arquivo e o diretório e o vim grava no arquivo as informações exatas do editor no momento em que foi executado o comando. Dentre as coisas das quais ele grava estão:
- Mapeamentos de teclas
- Variáveis globais (iniciadas com maiúsculas e que tenham pelo menos 1 caracter minúsculo)
- Caso use o GVim, grava o posicionamento e o tamanho dele na tela
- Todos os arquivos abertos em buffers e o ponteiro do mouse
- O estado visual do Gvim (folds, marks, incserch)
Depois de gravada, para recarregar a session, basta abrir o arquivo.
gvim -S ~/.vim-sessions/projeto-A.vim ou vim -S ~/.vim-sessions/projeto-A.vim
Eu tenho usado bastante para funcionalidades que requerem muita manutenção. Por exemplo, no desenvolvimento web.
vim -S ~/.vim-sessions/projetoA-javascripts.vim vim -S ~/.vim-sessions/projetoA-accounts.vim
Assim, até o módulo de accounts ficar pronto, testado e aprovado pelo inmetro, todos os arquivos relacionados estão ali. E quando acaba o expediente, sobreescrevo a session, para que no próximo dia eu possa dar continuidade.
E você? Tem alguma idéia melhor? Comente!