Utilizando arquivos .CUE no Linux

Dica rápida que acabei de achar no Oráculo, e pra não anotar em algum canto e esquecer, melhor ficar por aqui. Baixei na última madruga, um torrent, cujo conteúdo, eram alguns arquivos .cue e .bin, certo que era uma imagem de cd, saí procurando no google uma forma de converter ou abrir os mesmos.

O método é simples, primeiro, vamos utilizar um aplicativo chamado “chunk”, que é quem vai converter os arquivos para um ISO, que será possível montar como uma mídia normal.

sudo apt-get install bchunk
bchunk -v cd-rom.bin cd-rom.cue cdrom
mount -o loop,ro -t iso9660 cdrom.iso /media/cdrom

Falei que era fácil…


Alterando permissões recursivamente

Dia de folga é sempre muito legal, e nerd que é nerd, pega o dia de folga: PARA ORGANIZAR O HD!!! hahahahah

Tá, teve roda de capoeira e um puta cochilo durante a tarde, mas tá valendo, deu pra descansar a cabeça um pouco.

Então, como tava dizendo, organizando o hd, resolvi setar as permissões de arquivos direitinho aqui, então, não satisfeito com os resultados do “chmod -R”, saí procurando no Oráculo e me deparei com o seguinte:

[thiago@selassie:~]$ find . -type d -exec chmod 775 {} \;

Isso daí, vai setar os com permissão de escrita, leitura e execução para o dono e grupo de todos os diretórios abaixo do diretório atual, se você quiser setar permissões somente dos arquivos, troca o “d” do “-type” por “f”, de file - ooooooooh!!

Dica supimpa!


Instalando o XCache no Ubuntu

Introdução

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.

Instalando

A instalação do XCache para o PHPv5 é 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

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);
    }
}

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.

function setLang ($lang)
{
    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));
}

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;55
msgid "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.

;)


Criando um Access Point

Introdução

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)

Instalando

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 ;)