Problemas ao ver vídeos no Firefox

Filed Under (Software Livre | ) by Thiago on 19-12-2007

Ainda pouco, navegando, percebi algo que a tempos acompanha o Ubuntu, o firefox nem sempre exibe os vídeos, como do Globo.com, Terra e etc, pois ele vem com o plugin do Totem, que aliás, nunca vi funcionando aqui comigo. Então, se você tem o mesmo problema, uma dica: substitua pelo plugin do Mplayer, é muito melhor. Pra fazer isso, basta digitar no terminal:

sudo apt-get remove totem-mozilla
sudo apt-get install mozilla-mplayer

Pronto, resolvido..

Instalando o XCache no Ubuntu

Filed Under (PHP, Software Livre | ) by Thiago on 05-12-2007

Muitas vezes, precisamos gerar um cache a nível de código para nossas aplicações, pra evitar uma carga tão grande em servidores muito acessados.
Opções não faltam por aí, e ao meu ver, a mais conhecida no mundo PHP é a eAccelerator, mas vasculhando na net - e nos repositórios do Ubuntu - me deparei com o XCache, que atendeu perfeitamente minhas necessidades, sem contar na simplicidade da instalação.

A instalação do XCache para o PHP5 é simples, dando pequenas diferenças entre as versões o Ubuntu Feisty e Gutsy.

Primeiro, vamos instalar o módulo:

$ sudo apt-get install php5-xcache

Feito isso, vamos editar o arquivo /etc/php5/conf.d/xcache.ini para definirmos um usuário e senha para a página de administração, o meu eu deixei da seguinte forma, com a senha “testando” em MD5:

[xcache.admin]

xcache.admin.auth = On
xcache.admin.user = “thiago”
xcache.admin.pass = caa9c8f8620cbb30679026bb6427e11f

O passo seguinte, é criar um alias no Apache, para o admin, eis aqui a diferença que falei entre o as versões Feisty e o Gusty do Ubuntu, no primeiro, a localização para o admin é /usr/share/doc/php5-xcache/misc/admin e no segundo, em /usr/share/xcache/admin. Outra coisa que notei no Feisty, é que dois arquivos do admin, vieram compactados, então, vá na pasta do admin, e dê um “gunzip” no xcache.php.gz e xcache.tpl.php.gz

$ sudo gunzip xcache.php.gz
$ sudo gunzip xcache.tpl.php.gz

O último passo, é criarmos o arquivo de cache utilizado pelo módulo:

$ sudo touch /tmp/xcache
$ sudo chmod a+rwx /tmp/xcache

Pronto, restarte o Apache e tente acessar o seu /xcache-admin/ com o usuário e senha e olhar as páginas cacheadas, limpar o cache, …

Internacionalizando Aplicações baseadas no CakePHP 1.2

Filed Under (PHP, Software Livre | ) by Thiago on 04-10-2007

Em primeiro lugar, este manual é inteiramente baseado “p28n, the top to bottom persistent internationalization tutorial.” de Jason Chow, então, o que vou citar aqui, são os passos que utilizei para “internacionalizar” uma pequena aplicação que escrevi para um cliente.

Primeiramente, adicionamos a seguinte linha em nosso config/bootstrap.php:

define(’DEFAULT_LANGUAGE’, ‘pt-br’);

….

?>

Com isso, definimos a linguagem padrão, para o português.

Agora, ao contrário do que o artigo indica, eu adicionei somente a linha abaixo no config/routes.php:

// rota para troca de idioma

$Route->connect(’/lang/*’, array(’controller’ => ‘p28n’, ‘action’ => ‘change’));

Agora, para podermos trocar de idioma, é criamos um link ou redirecionamento para “/lang/idiomaDesejado”, que o controlador p28n irá tratar, mas anes disso, vamos criar o componente P28n, e salve no diretório controllers/components da sua aplicação, copie o código abaixo:

Session->check('Config.language') ) {
$this->change(($this->Cookie->ad('lang') ? $this->Cookie->read('lang') : DEFAULT_LANGUAGE));
}
}

function change($lang = null) {
if ( !empty($lang) ) {
$this->Session->write('Config.language', $lang);
$this->Cookie->write('lang', $lang);
}
}
}

// fim da calsse

Reparou que eu não botei a tag de fechamento do PHP? Posé, deixa assim mesmo, fechando, o script acusa um erro no envio dos headers e a bagaça não anda mesmo, então, pode deixar… Seguindo o mesmo estilo - não fechando a tag do PHP, criamos o controlador que comentamos agora pouco, copie o código abaixo, e salve com o nome de p28n_controller.php, no diretório controllers da aplicação.

P28n->change($lang);

$this->redirect($this->referer(null, true));
}

function shuntRequest() {
$this->P28n->change($this->params['lang']);

$args = func_get_args();
$this->redirect("/" . implode("/", $args));
}
}
// fim

Agora vamos adicionar a seguinte linha no arquivo “app_controller.php”

var $components = array (’P28n’);

Isso fará com que o componente P28n, que você criou anteriormente, seja utilizado por toda a aplicação.

Agora, com tudo instalado e funcionando, vamos testar, pegue algum arquivo da sua aplicação (em views ou mesmo em controllers), qualquer lugar que gere uma mensagem de retorno para o usuário, vamos usar como exemplo a linha abaixo:

echo “Bem vindo”;

..

E trocamos para:

echo __(”Bem vindo”);

Entendeu? Todas as mensagens você põe agora entre __(), se você for utilizar a mensagem como retorno (e não diretamente como echo), coloque o parametro “true”, ficando assim:

$msg = __(”Bem vindo”, true);

Feito isso para todas as mensagens da aplicação, vamos gerar o arquivo de tradução, na shell, crie os diretórios das linguagens:

$ cd aplicacao

$ mkdir -p locale/pt_br/LC_MESSAGES

$ mkdir -p locale/eng/LC_MESSAGES

Diretórios criados, vamos gerar o arquivo com as strings a serem traduzidas:

$ cd aplicacao

$ ../cake/console/cake extract -project aplicacao

Então, ele irá fazer algumas perguntas, na sequência:

Hello thiago,

Welcome to CakePHP v1.2.0.5427 alpha Console
---------------------------------------------------------------
App : aplicacao
Path: /var/www/apliacao
---------------------------------------------------------------

Extracting...
---------------------------------------------------------------
Path: /var/www/aplicacao
Output Directory: /var/www/aplicacao/locale/
---------------------------------------------------------------
Would you like to merge all translations into one file? (y/n) [y] > y
What should we name this file?  [default] >
Processing /var/www/aplicacao/app_controller.php......

Pronto, foi criado um arquivo chamado “default.pot”, no diretório locale que criamos, copie-o, para os diretório LC_MESSAGES do idioma, trocando a extensão de “.pot” para “.po”

$ cd aplicacao/locale

$ cp default.pot pt_br/LC_MESSAGES/default.po

$ cp default.pot eng/LC_MESSAGES/default.po

A estrutura do arquivo é bem simples, algo como:

....
#: /controllers/contato_controller.php:16;55msgid "Bem vindo"msgstr ""
....

O processo de tradução, é simples, bastando inserir a tradução da mensagem em “msgid” em “msgstr”,

....
#: /controllers/teste_controller.php:16;55 msgid "Bem vindo" msgstr "Welcome"
....

Viu? Fácil não? Traduza suas strings, e acesse alterne entre os links “/lang/pt_br” e “/lang/eng” da sua aplicação.

;)

Migrando do Cake 1.1.17 para 1.2

Filed Under (PHP, Software Livre | ) by Thiago on 25-09-2007

CakePHP - Tela de boas vindas
A migração aqui em casa até que foi tranquila, bastando apenas descompactar na pasta root do Apache e pronto, agora, as aplicações é que deram um pouco de trabalho, mas nada de arrancar os dreads também né..

Então, até agora, em dois projetos pequenos, que eu tinha feito com a ajuda do Bake, as mudanças que tive que fazer a mão, pra funcionar na nova versão do Cake foram:
- $html->input() para $form->text()
- $html->textarea() para $form->textarea()
- $html->tagValue() para $html->value()
- $html->selectTag() para $form->select()
- $html->labelTag() para $form->label()

Tem mais alguns métodos que trocaram de nome ou de helper, que são citadas nas próprias mensagens de erro, que aliás, estão bem explicativas.

Uma ferramenta que me chamou muito a atenção, foi o “cake” um script que se integra ao “bake”, e que é perfeitamente integrável ao desktop, bastando eu ter criado um alias em meu .bashrc, apontando pra ele (que está dentro da pasta cake/console e não mais cake/scripts).

Agora para criar um novo projeto, modelo, controlador ou visão, basta apenas que eu digite:

$ cake bake -app projeto

Ah, dentro do cake agora também tem uma ferramenta para testar seus modelos, onde é possível inclusive, testar novos relacionados, e rodar as consultas. Sim, você pode dar um Usuarios->findAll() de dentro da própria shell, interessantíssimo!!!!

Desktop Flickr Organizer

Filed Under (Software Livre | ) by Thiago on 24-09-2007

Com o álbum de fotos, resolvi facilitar minha vida, procurando uma forma de “automatizar” o upload de várias fotos ao mesmo tempo no Flickr, tentei montar como um sistema de arquivos normal, com o fuse e o flickrfs, mas não dei muita sorte e o achei muito lenta a parada também..

Então, acho que achei o link no mesmo site, o DFO - Desktop Flickr Organizer for Gnome - é um programinha feito em Mono, para, como o próprio nome diz, organizar suas fotos no Flickr. A instalação é muito fácil, basta baixar o tar.gz no site, descompactar e rodar o “run.sh” que tem no diretório.

O programinha é muito leve e legal.. tá aprovado!

Desenvolvendo em PHP com o Eclipse

Filed Under (PHP, Software Livre | ) by Thiago on 21-09-2007

 Essa semana comecei a utilizar o Eclipse para desenvolver, já sabia que existiam plugins, para fazê-lo funcionar com o PHP , um deles, era o PDT (PHP Development Tools).

Então mãos a massa, no site, diz que é possível utilizar o próprio updater do Eclipse para instalar o pacote, então, dei um apt-get aqui e baixei o Eclipse direto dos repositórios do Ubuntu, mas uma coisa: não tem o PDT lá, claro. Só que pelo updater não dá pra instalar também, ele fica reclamando de dependências do próprio Eclipse, saí adicionando sites ali na ferramenta mas não obtive sucesso, então, o jeito foi entrar no site do PDT, e baixar um pacote chamado “pdt-all-in-one”, que é um pacotão, já com o Eclipse junto. Muuuuito mais fácil!

O pacote tem quase 120Mb, então, tem que ter um pouquinho de paciência, vai no site e enquanto espera, vai fazer um café hehehhe..

Pacote pronto, agora é só instalar o Subclipse , que é um plugin para o Eclipse trabalhar com o SubVersion . Vou dizer, que tô gostando muito até agora. Utilizei por muito tempo o Zend Studio , mas é pago, e eu queria uma alternativa livre e pelo jeito, achei!

;)

Criando um Access Point

Filed Under (Software Livre | ) by Thiago on 21-09-2007

Adquiri recentemente, uma placa Wireless 108G PCI Adapter - DWL-G520 da Dlink, pra por no micro que já faz o roteamento da rede cabeada aqui de casa e poder utilizar o wireless do meu notebook. Imaginei que fosse uma tarefa simples, afinal, “é só mais uma placa de rede”.

Eu penei pra conseguir configurar, foram dois dias fuçando manuais e buscas no Google, para enfim, chegar a essa receita de bolo.

A DWL-G520 vem com chipset Atheros, que é suportado nativamente pelo Linux com o madwifi, não necessitando então do ndiswrapper, que é uma espécia de Wine para drivers wireless se entendi bem.

A intenção é mesclar as redes ethernet e wireless, atribuindo IP aos clientes via dhcp, autenticando os usuários da rede wi-fi com a chave WEP.

Com as três placas de rede fisicamente instaladas na máquina que irá fazer o roteamento, aqui um K6-2 366MHz com 386Mb de RAM e Debian 4.0.

Dando um “lspci” obtenho a seguinte saída:

# lspci

00:09.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)

00:0a.0 Ethernet controller: VIA Technologies, Inc. VT6105 [Rhine-III] (rev 8b)

00:0b.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)

Vamos então a instalação dos pacotes via apt-get:

# apt-get install bridge-utils dhcp3-client dhcp3-common dhcp3-server wireless-tools

# apt-get install ifupdown iptables madwifi-tools madwifi-source module-assistant

Com a placa de rede reconhecida, e os drivers instalados, agora vamos configurar as placas de rede, no Debian, as configurações ficam no diretório “/etc/network/interfaces”.

# /etc/network/interfaces

# Interface de Local/Loopback

auto lo

iface lo inet loopback

# Primeira placa de rede, ligada ao switch

auto eth0

allow-hotplug eth0

iface eth0 inet static

address 192.168.1.1

netmask 255.255.255.0

# Segunda placa de rede, ligada ao modem

auto eth1

allow-hotplug eth1

iface eth1 inet dhcp

# Terceira placa de rede, wireless, habilitada via wlanconfig para trabalhar como Access Point (AP)

auto ath0

iface ath0 inet static

address 192.168.1.2

netmask 255.255.255.0

pre-up wlanconfig ath0 destroy

pre-up wlanconfig ath0 create wlandev wifi0 wlanmode ap

pre-up iwconfig ath0 essid “Casa” rate auto

pre-up iwconfig ath0 txpower auto

pre-up iwconfig ath0 channel 5

pre-up iwconfig ath0 key restricted xxxxxxxxxxxxxxxxxxxxxxxxxxxx

wireless-mode master
Para a chave WEP, você deve utilizar uma sequencia em hexadecimal de 26 caracteres.

Reinicie o micro, ou levante as placas de rede manualmente:

# ifconfig eth0 up

# ifconfig eth1 up

# ifconfig ath0 up

Agora, todas as placas de rede possuem um IP interno e já se comunicam, se em algum outro micro - no meu caso, a partir do notebook - eu rodar o iwlist, já será possível encontrar a rede wireless.

# iwlist scan

lo Interface doesn't support scanning.

eth0 Interface doesn’t support scanning.

eth1 Scan completed :

Cell 01 - Address: 00:19:5B:3C:CF:29

ESSID:”BobMarley”

Protocol:IEEE 802.11bg

Mode:Master

Channel:5

Frequency:2.432 GHz (Channel 5)

Encryption key:on

Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s

9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s

48 Mb/s; 54 Mb/s

Quality=99/100 Signal level=-23 dBm Noise level=-23 dBm

Extra: Last beacon: 92ms ago
Agora vamos habilitar o DHCP para a rede. Edite o /etc/default/dhcp3-server para podermos informar ao servidor daemon do DHCP, quais interfaces ele irá

ouvir.

# /etc/default/dhcp3-server

INTERFACES="eth0 ath0"

Configuramos agora, o daemon propriamente dito, uma configuração básica é sugerida abaixo, e deve ser salva no arquivo /etc/dhcp3/dhcpd.conf.

# /etc/dhcp3/dhcpd.conf

ddns-update-style none;

default-lease-time 600;

max-lease-time 7200;

authoritative;

log-facility local7;

subnet 192.168.1.0 netmask 255.255.255.0 {

range 192.168.1.3 192.168.1.30;

option domain-name-servers 192.168.1.1,200.247.141.11,200.247.141.12;

option domain-name “fln.virtua.com.br”;

option routers 192.168.1.1;

default-lease-time 600;

max-lease-time 7200;

}
Reinicie o servidor DHCP e pronto

# /etc/init.d/dhcp3-server restart

Pronto, com isso, os micros conectados ao switch/hub já recebem um IP automaticamente, para os clientes da rede Wireless também receberem um IP e conseguir navegar, precisamos criar uma ponte, entre a placa de rede interna (eth0) e a placa wireless (ath0):

# ifconfig eth0 0.0.0.0 up

# ifconfig ath0 0.0.0.0 up

# brctl addbr br0

# brctl setfd br0 0

# brctl addif br0 eth0

# brctl addif br0 ath0

# ifconfig br0 192.168.1.1

A rede agora está quase pronta, faltando apenas habilitar o NAT no servidor, para que todos os micros possam utilizar a internet, para isso, vamos utilizar o iptables.

Primeiro carregamos o módulo iptable_nat

# modprobe iptable_nat

Limpamos quaisquer regras que existam na tabela do iptables

# iptables -F

# iptables -t nat -F

# iptables -t mangle -F

# iptables -X

Ativamos o ip forward

# echo 1 > /proc/sys/net/ipv4/ip_forward

Habilitando o NAT, lembrando que a eth1 é a placa de rede que está ligada ao modem

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Você também pode pegar os comandos que criam a interface de ponte (bridge) e do iptables, e inserir no seu rc.local, no diretório etc, para poder rodar sempre que o micro for iniciado.

How To corrido, escrito em menos de 20min, mas ao menos tá documentado pra galera não ficar dois dias quebrando cabeça como eu ;)

Utilizando o CakePHP com SQLite

Filed Under (PHP, Software Livre | ) by Thiago on 17-09-2007

Para quem curte esse poderoso e minúsculo banco de dados, eis a forma de integrá-lo facilmente ao CakePHP.

Abra o arquivo database.php que está dentro do diretório config da sua aplicação e deixe o da seguinte forma:

class DATABASE_CONFIG {

var $default = array(

‘driver’ => ’sqlite’,

‘connect’ => ’sqlite_open’,

‘host’ => ”,

‘login’ => ”,

‘password’ => ”,

‘database’ => ‘/var/www/app/app_database.db’,

‘prefix’ => ”

);

}

?>
No campo “database” tem que ser o caminho completo, senão você não vai conseguir utilizar o bake pra fazer os modelos ;)

Agora é só criar o seu banco:

thiago@localhost: ~$ sqlite /var/www/app/app_database.db

Pronto, agora é só criar as tabelas e continuar a brincadeira.

Se pintar alguma dúvida, tem o manual do SQLite.

ads
ads
ads
ads