Busca nos campos personalizados do WordPress

Os campos personalizados é um recurso usado no WordPress para que o autor de um post possa armazenar dados a sua escolha. Você pode usar esse recurso de várias formas: mostrar imagens personalizadas, falar o que você está ouvindo durante a escrita do post, adicionar informação pessoal e muito mais. Em um blog sobre livros, você pode usar tal recurso para criar os campos “Autor”, “Editora”, “Ano” e por aí vai.

Estou trabalhando em um projeto que utiliza os campos personalizados na área de Imprensa, onde cada post aponta em que tipo de imprensa determinada informação foi postada: Rádio, TV, Internet, Jornal. Como dito acima, criar o campo personalizado é simples. Difícil é filtrar os posts de acordo com o valor do campo.

A solução

Descobri um plugin chamado Search Custom Fields. Numa explicação rápida, ele adiciona os Campos Personalizados na query de busca de posts.

Antes:

<a href="/?s=minhabusca">minha busca</a>

Depois:

<a href="?meucampopersonalizado=Veículo&s=meuvalordocampopersonalizado">minha busca pelo campo personalizado</a>

Na documentação do plugin, o autor mostra como turbinar o campo de busca do WordPress. Ao invés disso, escrevi uma pequena função para listar os valores de um atributo personalizado:

function list_custom_fields($metakey, $output) {
	// based on http://sixrevisions.com/wordpress/custom-fields-search/
	global $wpdb;
	$items = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_value ASC", $metakey) );
	if ($items) {
		if ($output == "dropdown") { // display values in a select
			echo "<form action="/" method="get"><input type="hidden" name="key" value="$metakey" /><select name="s" onchange="this.form.submit();"><option></option>";
			foreach ($items as $item) {
			  echo "<option value="" . $item . "">" . $item . "</option>";
			}
			echo "</select></form>";
		} else if ($output == "list") { // display values in a list
			echo "<ul>";
			foreach ($items as $item) {
			  echo "<li><a href="/?s=$item&key=$metakey">$item</a></li>";
			}
			echo "</ul>";
		}
	}
}

Coloque a função acima no arquivo functions.php do seu tema e chame-a, de duas formas, em seu sidebar, por exemplo:

< ?php if(function_exists('list_custom_fields')) list_custom_fields("Veículo", "dropdown"); ?>

…para mostrar os valores do campo personalizado “Veículo” em select do HTML ou…

< ?php if(function_exists('list_custom_fields')) list_custom_fields("Veículo", "list"); ?>

…para mostrar os valores do campo personalizado “Veículo” em uma lista.

 

Alternativas ao PHPMyAdmin

O PHPMyAdmin é quase uma unanimidade em gerenciadores de banco de dados MySQL. Mas existe vida além dele. Vamos lá:

SQL Buddy

O SQL Buddy é uma alternativa bacana, com bonita interface e traduzido para vários idiomas, incluindo português.

sqlbuddy

Adminer

Já o Adminer é um app em php feito em 1(!) único arquivo. Possui diversas traduções (nenhuma ainda em português) mas é altamente indicado o mantermos em nossos servidores para uma rápida manutenção.

adminer

 

Todo lists para o Textmate

Fica a dica para quem usa o Textmate: Tasks é um bundle para o Textmate que permite a criação de Todo lists bonitinhas.

Tasks

A instalação é fácil:

mkdir -p ~/Library/Application Support/TextMate/Bundles
cd ~/Library/Application Support/TextMate/Bundles
git clone git://github.com/henrik/tasks.tmbundle.git Tasks.tmbundle
osascript -e 'tell app "TextMate" to reload bundles'

Depois disso, todos os arquivos .todo, .todolist e .tasks serão formatados de acordo com o bundle.

 

Data URI


Spoiler: o conteúdo abaixo não funciona no Internet Explorer.

Em 2005 o Irapuan Martinez falou do Acid 2 e de um recurso interessantíssimo, que acabei de testar: Dat URI (que existe desde 98).

Dat URI, em poucas palavras, é a possibilidade de inserir conteúdo dentro de um arquivo HTML sem a necessidade de linkar o arquivo. Assim, a imagem ao lado poderia ser inserida com:

Read more

 

Protegendo projetos com o .htaccess

O Apache pode te ajudar a proteger um projeto com seu sistema de autenticação. E isso é mais fácil do que você pensa. Para tal, crie um arquivo .htaccess com o seguinte conteúdo:

AuthUserFile /home/leonardo/public_html/project/.htpasswd
AuthGroupFile /dev/null
AuthName "Restricted Access"
AuthType Basic
<limit GET>
require valid-user
</limit>

Após isso, crie um .htpasswd com os dados de usuário e senha (atenção ao caminho do arquivo). A senha é criptografada e o conteúdo do arquivo é algo como o seguinte:

leo:4tHAiRmQ4OpjM

Para criptografar a senha use um dos vários serviços por aí existentes. Para proteger um projeto em Rails, a solução também funciona bem, desde que seu .htaccess esteja na pasta public de sua aplicação

 

Usando ApacheBench para testes: Apache/mod_rails e Nginx/mongrel

O ApacheBench é um software do Apache usado para fazer testes de perfomance de servidores web, independente do servidor usado. Isso é muito útil para comparar o desempenho de diversas configurações, mas nem sempre pode apresentar a realidade do ambiente.

O ApacheBench é distribuído nos ambientes Linux pelo pacote apache2-utils – versões para Mac OS e Windows podem ser encontradas no site do software. Em distribuições como o Ubuntu, para instalá-lo basta um apt-get install apache2-utils (como super-usuário). A partir daí, o comando ab fica disponível em seu terminal e é só correr para o abraço!

Um teste pode ser feito com o comando:

ab -n 100 -c 5 http://www.leonardofaria.net/

O Flag ‘-n’ indica o número de requisições, enquanto a opção ‘-c’ indica a ocorrência de conexões simultâneas. A saída do comando acima é semelhante a:

This is ApacheBench, Version 2.0.40-dev < $Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.leonardofaria.net (be patient).....done


Server Software:        Apache/2.2.8
Server Hostname:        www.leonardofaria.net
Server Port:            80

Document Path:          /
Document Length:        0 bytes

Concurrency Level:      5
Time taken for tests:   16.460184 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Non-2xx responses:      100
Total transferred:      41600 bytes
HTML transferred:       0 bytes
Requests per second:    6.08 [#/sec] (mean)
Time per request:       823.009 [ms] (mean)
Time per request:       164.602 [ms] (mean, across all concurrent requests)
Transfer rate:          2.43 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      255  291  21.2    287     361
Processing:   442  506 131.1    485    1732
Waiting:      438  492  42.9    484     655
Total:        698  797 137.9    774    2040

Percentage of the requests served within a certain time (ms)
  50%    774
  66%    804
  75%    812
  80%    818
  90%    878
  95%    925
  98%    982
  99%   2040
 100%   2040 (longest request)

Dezenas de possibilidades podem ser traçadas com esses testes.
Nos meus benchmarks, realizei basicamente 2 testes: a renderização do index.html default do framework e a renderização de um Time.Now do Ruby. Em ambos os testes, o desempenho do nginx + mongrel_cluster foi superior ao Apache + mod_rails. Esse teste também foi feito por aí, e com resultados semelhantes ao meu.

Desse modo, em uma balança estão Apache/mod_rails e Nginx/mongrel_cluster. De um lado, pesam a facilidade de deployment e o crescente uso em shared hosts. De outro lado pesam a rapidez do servidor e a ‘dificuldade’ do deployment. E aí? De que lado você vai ficar?

 

Gmail + WordPress = post por email

Eu já tinha visto o recurso de post por email mas nunca havia testado. É muito simples. Vamos lá:

  1. No adminstrador do WordPress, escolha Options -> Writing.
  2. Em ‘Posts por e-mail’, defina:
    • Mail Server: ssl://pop.gmail.com – Port: 995
    • Login Name: usuario@gmail.com
    • Password: : suasenha, naturalmente ;)
  3. Agora, basta enviar o post para o destinatário definido no adminstrador.

Dica extra

É possível passar a categoria do post no assunto da mensagem. Basta colocar o seu respectivo id entre colchetes. Exemplo: supondo que a categoria wordpress tenha ID = 5, o assunto da sua mensagem seria: [5] título do meu post exemplo.

 

Sobre Controle de Versão

Na disciplina de Engenharia de Software que faço no curso de Sistemas de Informação da Faculdade Pitágoras, fiz um trabalho introdutório sobre Sistemas de Controle de Versão. O trabalho está abaixo e também disponível em PDF.

Read more

 

UML e MySQL no Mac

Quem não usa Mac às vezes pode pensar que soluções em desenvolvimento são escassas. Mas não são. Hoje vou apresentar duas ferramentas de modelagem de dados para Mac OS e o CocoaMySQL, para manipulação do MySQL.

O CanonSketch é um software desenvolvido na Universidade de Madeira, em Portugal. É uma ferramenta interessante para modelagem UML 2.0, muito utilizado em times de desenvolvimento.

Outro software de modelagem que utilizo aqui é o OmniGraffle Pro. Além de diagramas de UML, o software pode criar vários outros tipos de diagrama. A desvantagem frente ao CanonSketch é que OmniGraffle é pago.

Para manipular bancos de dados em MySQL, a pedida é o CocoaMySQL. Ele possui a mesma interface ‘bonitinha’ dos softwares escritos em Cocoa e é bastante eficaz em tarefaz corriqueiras com a linguagem.

P.S.: o iUseThis é mais um site social em Rails, que lista os aplicativos que o pessoal usa. Eu tenho um perfil lá com todos apetrechos.

P.S.2.: estou a muito tempo sem postar, mas vou voltar às antigas. (Esse post está sendo escrito da sala da facu)

 

Enfim, Silverlight

Se você tivesse uma tecnologia web que pretende ser um Flash-killer nada mais inteligente do que fazer seu próprio site com ela, certo? É isso que a Microsoft está fazendo com seu novo website de downloads, disponível em http://www.microsoft.com/beta/downloads/.

Fiz um grande esforço para baixar os 4,7 MB do plugin, digitar a senha de administrador (e se fosse não fosse meu computador?) e reiniciar o browser. Após toda via crucis, fui verificar a URI e fazer meu mini-review.

A instalação do plugin foi rápida e simples e segue a mesma interface bonita das aplicações do Mac OS. O site de downloads simplesmente não deve ter sido testado. Clico no link “Browse Downloads”. A partir daí, ele fica ativo, não aparece nenhuma lista de downloads e, estranhamente, nenhum link da página funciona mais. Os botões do slideshow do topo também possuem comportamento estranho, devido ao preloader das imagens. Transições nada suaves. Ao recarregar a página pela terceira vez, funciona.

Segundo o Firebug, são 37 scripts, 100 KB. Até dll foi requisitado. Faço um View > Source e vejo Javascript obstrusivo, código bagunçado e até hack para background PNG transparente no Internet Explorer 6.

É assim que o Silverlight chega na Microsoft. Bem vindo.

 

Alterando o PHP.ini da Dreamhost

Algumas configurações do PHP da Dreamhost, como o uso do fopen(), são desabilitadas por questões de segurança. Isso pode atrapalhar o funcionamento de suas aplicações. Entretanto, é possível habilitar essa e outras funções via shell.

O wiki da Dreamhost traz muitas dicas sobre a configuração do PHP.ini. Uma que eu reproduzo abaixo é a habilitação do fopen().

Após fazer uma conexão ssh com o servidor, crie o seguinte shellscript:

PHP 4

#!/bin/sh
CGIFILE="$HOME/[your website directory]/cgi-bin/php.cgi"
INIFILE="$HOME/[your website directory]/cgi-bin/php.ini"
cp /dh/cgi-system/php.cgi "$CGIFILE"
cp /etc/php/cgi/php.ini "$INIFILE"

perl -p -i -e '
s/.*allow_url_fopen.*/allow_url_fopen = On/;
' "$INIFILE"

PHP 5

#!/bin/sh
CGIFILE="$HOME/[your website directory]/cgi-bin/php.cgi"
INIFILE="$HOME/[your website directory]/cgi-bin/php.ini"
cp /dh/cgi-system/php5.cgi "$CGIFILE"
cp /etc/php5/cgi/php.ini "$INIFILE"

perl -p -i -e '
s/.*allow_url_fopen.*/allow_url_fopen = On/;
' "$INIFILE"

Defina qual o domínio a ser alterado (linha 2 do script), salve esse script, dê permissão de execução (chmod +x php-update.sh) e o execute (./php-update.sh).

Você também pode colocá-lo em execução semanalmente, para evitar erros futuros. Para isso, abra o crontab (crontab -e) e agende: @weekly /home/myusername/php-update.sh

[update]: via comentário do Vinícius, vale lembrar que deve-se criar um arquivo .htaccess, para mudar o modo de como o PHP é executado por padrão:

Options +ExecCGI
Action php-cgi /cgi-bin/php.cgi
AddHandler php-cgi .php