goncin@wordpress.com:~$ _

Linux, programação e toda sorte de nerdices

Arquivos Mensais: junho 2010

Ditados populares em PHP (parte 2)

Depois do sucesso de público e de crítica da primeira parte dos ditados populares em PHP, deixo vocês com a parte 2. Divirtam-se! 😀

<?php

  /*********************************************/

  if($vaca->getLocation() == 'brejo')
    die();

  /*********************************************/

  $dono = $coisa->getOwner();
  if($dono == 'César' || $dono == 'Deus')
    $coisa->entregarPara($dono);

  /*********************************************/

  $x = count($canoa->getPaus());
  echo "Esta canoa foi feita com $x paus.";

  /*********************************************/

  if(date('H:i:s') > '19:00:00')
    foreach($gatos as $gato)
      $gato->setColor('#330000');

  /*********************************************/

  function curiosidade() {
    return shell_exec('kill $(pgrep gato)');
  }

  /*********************************************/

  $outro->setFocinho($um->getCara());

  /*********************************************/

  if(empty($mente))
    Diabo::setOficina($mente);

  /*********************************************/

  while (isVida())
    $esperanca = true;
  $esperanca = NULL;

  /*********************************************/

  if(! in_array('padrinho', $parentada))
    die('pagão');

  /*********************************************/

  define('MAE_COUNT', 1);

  /*********************************************/

  $boi->setDestination($vaca->getDestination());

  /*********************************************/

  if(! empty($saco))
    $saco->ficarEmPe();
  else
    throw new Exception("Encha o $saco.");

  /*********************************************/

  if ($desgraca < 3)
    $desgraca = 'bobagem';

  /*********************************************/

  if(count($remedios) == 0)
    $remediado = true;

  /*********************************************/

  if($terra->getOwner() == 'cego' && count($pessoa->getOlhos()) == 1)
    $terra->coroarComoRei($pessoa);

  /*********************************************/

  array_reverse($pessoas);

  /*********************************************/

  $passaroNaMao->setValue(($passaroVoando->getValue() * 2) + 1);

  /*********************************************/

  switch($cavalo->getModoAquisicao()) {
    case COMPRADO:
    case NASCIDO_NA_FAZENDA:
    case ACHADO:
    case ROUBADO:
    //case DADO:
      $cavalo->verificarDentes();
      break;
  }

  /*********************************************/

  echo 'Com quem andas?';
  $amigo = fgets(STDIN);
  echo "Tu és $nome_pessoa";

  /*********************************************/

Anúncios

Ditados populares em PHP

Faz algum tempo, comecei, meio de farra, uma série de twits “traduzindo” ditados populares para PHP. A coisa foi crescendo e fui recebendo feedbacks positivos de gente se divertindo com eles, e de outros que dizem até estar aprendendo PHP com meus ditados 😛 .

Para quem ainda não viu, para quem quer ver de novo, e para servir também como arquivo, resolvi reuni-los neste post. Alguns deles foram até, digamos, “refatorados“.

UPDATE: não deixe de conferir também a parte 2. 😉

<?php

  /*********************************************/

  if (Tempo::getEstado() == Tempo::CHUVOSO)
    $cavalinho->recolher();

  /*********************************************/

  try {
    $this->vencer($eles);
  }
  catch(Exception $e) {
    $this->juntarSeA($eles);
  }

  /*********************************************/

  if (! in_array ($cachorro, $this->meusAnimais))
    $this->cacarCom($gato);

  /*********************************************/

  if ($casa->getOwner() == 'ferreiro')
    $espeto = new Espeto('pau');

  /*********************************************/

  foreach($macacos as $macaco) {
    $galho = new Galho();
    $galho->receber($macaco);
  }

  /*********************************************/

  if ($seguro->idade >= 80) die();

  /*********************************************/

  if ($filho->getParent() == 'peixe')
    $filho->setType('peixinho');

  /*********************************************/

  if (in_array('piranha', $rio->getPeixes()))
    $jacare->setEstiloNadar(NADO_COSTAS);

  /*********************************************/

  if ($olhos->getOwner() != $this) {
    $refresco = $pimenta;
    $refresco->colocarEm($olhos);
  }

  /*********************************************/

  if($homem->isPrevenido())
    $homem->setValor($homem->getValor() * 2);

  /*********************************************/

  if ($pessoa->horaAcordou < strtotime('7:00'))
    DEUS::ajudar($pessoa); // Deus é SINGLETON!

  /*********************************************/

  if ($pessoa->temBoca())
    goto Roma;
  // Milhares de linhas de código depois...
  :Roma
    echo ('Parabéns, você chegou a Roma');

  /*********************************************/

  $numGraos = 0;
  do {
    $numGraos++;
    $galinha->getPapo()->setNumGraos($numGraos);
  } while (! $galinha->getPapo()->isPapoCheio());

  /*********************************************/

  if ($macaco->getIdade() >= 60 && $macaco->getMao()->getOndeEsta() == 'cumbuca')
    throw new Exception('Tire a mão daí!!!');

  /*********************************************/

  $agua->setConsistencia('mole');
  $pedra->setConsistencia('dura');
  while(! $pedra->estaFurada())
    $agua->bater($pedra);

<?php

/*********************************************/

if (Tempo::getEstado() == Tempo::CHUVOSO)
$cavalinho->recolher();

/*********************************************/

try {
$this->vencer($eles);
}
catch(Exception $e) {
$this->juntarSeA($eles);
}

/*********************************************/

if (! in_array ($cachorro, $this->meusAnimais))
$this->cacarCom($gato);

/*********************************************/

if ($casa->getOwner() == ‘ferreiro’)
$espeto = new Espeto(‘pau’);

/*********************************************/

foreach($macacos as $macaco) {
$galho = new Galho();
$galho->receber($macaco);
}

/*********************************************/

if ($seguro->idade >= 80) die();

/*********************************************/

if ($filho->getParent() == ‘peixe’)
$filho->setType(‘peixinho’);

/*********************************************/

if (in_array(‘piranha’, $rio->getPeixes()))
$jacare->setEstiloNadar(NADO_COSTAS);

/*********************************************/

if ($olhos->getOwner() != $this) {
$refresco = $pimenta;
$refresco->colocarEm($olhos);
}

/*********************************************/

if($homem->isPrevenido())
$homem->setValor($homem->getValor() * 2);

/*********************************************/

if ($pessoa->horaAcordou < strtotime(‘7:00’))
DEUS::ajudar($pessoa); // Deus é SINGLETON!

/*********************************************/

if ($pessoa->temBoca())
goto Roma;
// Milhares de linhas de código depois…
:Roma
echo (‘Parabéns, você chegou a Roma’);

/*********************************************/

$numGraos = 0;
do {
$numGraos++;
$galinha->getPapo()->setNumGraos($numGraos);
} while (! $galinha->getPapo()->isPapoCheio());

/*********************************************/

if ($macaco->getIdade() >= 60 && $macaco->getMao()->getOndeEsta() == ‘cumbuca’)
throw new Exception(‘Tire a mão daí!!!’);

/*********************************************/

$agua->setConsistencia(‘mole’);
$pedra->setConsistencia(‘dura’);
while(! $pedra->estaFurada())
$agua->bater($pedra);

Sem acentos após instalar o Adobe AIR 2 no Ubuntu? Volte para a versão 1.5!

UPDATE: o problema com os acentos do Adobe AIR no Linux foi corrigido com o lançamento da versão 2.0.3. Veja como desinstalar a versão anterior do AIR e atualizar para a nova. Este post, de agora em diante, tem apenas valor histórico. 😉

Quem usa Ubuntu (e Linux, em geral) e atualizou para a recém-lançada versão 2 do Adobe AIR teve a desagradável surpresa de ver que não era mais possível digitar caracteres acentuados em aplicativos baseados naquela plataforma (TweetDeck, Seesmic e congêneres). Isso é um bug, daqueles grandes que afeta todo mundo, e, enquanto a Adobe não o conserta, é necessário retornar à versão 1.5 do Air se quisermos ter nossos acentos de volta.

Mãos à massa:

  1. Remova completamente a versão instalada do Adobe AIR. Abra um terminal e digite:
    sudo aptitude purge adobeair
  2. A versão 1.5 do AIR não está mais disponível em quaisquer repositórios, mas ainda pode ser encontrada para download em um local obscuro do site da Adobe. A sequência de comandos abaixo deve ser suficiente para instalá-lo:
    wget -c http://airdownload.adobe.com/air/lin/download/1.5/AdobeAIRInstaller.bin
    chmod +x ./AdobeAIRInstaller.bin
    sudo ./AdobeAIRInstaller.bin
  3. Por fim, o mais importante. É preciso trancar a versão do pacote da versão 1.5 do AIR para evitar que ele seja atualizado automaticamente. Para tanto, abra o Gerenciador de Pacotes Synaptic (em Sistema > Administração). Nele, localize o pacote adobeair1.0, clique sobre ele e vá ao menu Pacote > Trancar versão.

Não se esqueça de reiniciar seus programas em AIR antes de (tentar) sair acentuando por aí!

Voilà! Feliz acëñtûção! 🙂

Ganhando espaço na interface gráfica do Ubuntu

Se você possui um monitor widescreen e/ou um netbook, já teve talvez a sensação de que os elementos da interface gráfica do Ubuntu, em sua configuração original, lhe roubam espaço da tela. Botões com excesso de padding (a distância entre o texto e a borda do controle), fontes largas demais e outras (não tão) pequenas coisas acabam subtraindo preciosos pixeis de quem já não tem tantos assim 😛 .

Não é difícil obter uma interface com controle mais compactos. Vamos aos ajustes.

Ganhando espaço na horizontal

O maior comedor de espaço horizontal, é, sem dúvida, a fonte padrão (Sans). Basta trocá-la por outra mais compacta; Liberation Sans é uma ótima escolha. Se ela não estiver disponível, instale-a utilizando sudo aptitude install ttf-liberation. Veja a diferença:

Menu de desligamento do Ubuntu com a fonte Sans (à esquerda) e a fonte Liberation Sans (à direita)

Menu de desligamento do Ubuntu com a fonte Sans (à esquerda) e a fonte Liberation Sans (à direita)

Note que o menu com a fonte Liberation Sans é mais estreito do que com a fonte Sans. No entanto, o espaçamento entre os itens do menu continua quase o mesmo. Ajustemos o espaçamento vertical.

Ganhando espaço na vertical

Há várias formas de tornar os controles da interface gráfica mais compactos. Talvez a mais simples e direta seja instalando o utilitário Gnome Color Chooser (sudo aptitude install gnome-color-chooser). Após instalado, procure por ele em Sistemas > Preferências. Na parte de baixo da caixa de diálogo, selecione “Compactar” na caixa de combinação “Perfil” e aplique. Compare:

Menu de desligamento e calculadora - configurações originais (à esquerda) e compacto (à direita)

Menu de desligamento e calculadora - configurações originais (à esquerda) e compacto (à direita)

Agora sim, tivemos um ganho perceptível, tanto horizontal quanto verticalmente. O espaço extra foi retirado tanto dos botões quanto das barras e itens de menu. E isso se aplica a todos os aplicativos nativos GTK+. 🙂

Números por extenso agora também em Ruby!

Há alguns meses, publiquei no GitHub uma classe PHP chamada GExtenso, que gera o extenso de números e moedas. O feedback foi bastante positivo: o pessoal começou a usar a minha classe como plugin para o CodeIgniter.

Desde o início, sempre tive a intenção de implementar o GExtenso em outras linguagens. Eu vinha estudando Ruby meio de brincadeira, mas para deixar a coisa mais séria resolvi que a primeira tradução seria para ela.

Tal qual a implementação original, em PHP, a versão em Ruby utilizou:

  • métodos estáticos, implementando o padrão de projeto (design pattern) SINGLETON;
  • chamadas recursivas a métodos, minimizando repetições e mantendo o código enxuto; e
  • tratamento de erros por intermédio de exceções.

ATENÇÃO: Este é o meu primeiro trabalho na linguagem Ruby. A lógica foi originalmente desenvolvida em PHP; portanto, o estilo do código pode não agradar programadores Ruby experientes. Estou aberto a críticas construtivas e sugestões, para melhorar meu conhecimento na linguagem.

Exemplos de uso

Para obter o extenso de um número, utilize GExtenso.numero.

require 'GExtenso.rb'

puts GExtenso.numero(832); # oitocentos e trinta e dois
puts GExtenso.numero(832, GExtenso::GENERO_FEM) # oitocentas e trinta e duas

Para obter o extenso de um valor monetário, utilize GExtenso.moeda.

require 'GExtenso.rb'

# IMPORTANTE: veja nota sobre o parâmetro 'valor' na documentação do método!
puts GExtenso.moeda(15402) # cento e cinquenta e quatro reais e dois centavos
puts GExtenso.moeda(47)   # quarenta e sete centavos
puts GExtenso.moeda(357082, 2, ['peseta', 'pesetas', GExtenso::GENERO_FEM], ['cêntimo', 'cêntimos', GExtenso::GENERO_MASC])
# três mil, quinhentas e setenta pesetas e oitenta e dois cêntimos

Download via github: http://github.com/goncin/GExtenso

Simulando um dock com um painel do GNOME

Eu era feliz com o Docky. Até que veio o Ubuntu 10.04, e, na versão de 64 bits do nosso amado sistema operacional, o Docky tornou-se muito instável, encerrando com erro ao clicar sobre um ícone com o botão secundário do mouse.

O Docky me era útil como um repositório de lançadores, sem ocupar espaço na tela, mas sempre à mão. Sem conseguir me adaptar com nenhum outro dock (cada qual tem lá o seu defeito), acabei por me virar transformando meu painel superior do GNOME num pseudodock, se é que posso chamá-lo assim. Para tanto, fiz o seguinte:

  • Transferi a Área de Notificação, o relógio e a Sessão do miniaplicativo indicador para o painel inferior, de modo que sobrassem no painel superior apenas os lançadores;
  • Ajustei as seguintes propriedades do painel superior (clique com o botão secundário do mouse > Propriedades):
    • Tamanho: 24 pixels;
    • Desmarquei “Expandir”;
    • Marquei “Ocultar automaticamente”;
    • Na aba “Plano de fundo”, optei por “Cor sólida”, e, em “Estilo”, deixei-o totalmente transparente.
Meu 'pseudodock', feito a partir de um painel do GNOME

Meu 'pseudodock', feito a partir de um painel do GNOME

Ocultando-se automaticamente, a barra não me toma espaço da tela. Não sendo expansível, ela ocupa apenas o centro da parte superior da tela, quando o cursor do mouse se aproxima daquela região, sem o risco de acionar a barra quando apenas se quer fechar uma janela clicando sobre o ícone aproprioado em um dos cantos da janela. E fica ainda mais interessante quando usada em conjunto com o Navegador de Aplicativos.

Sim, talvez eu seja muito low profile. Tudo bem. Mas é bacana poder personalizar a área de trabalho desta forma sem ter de instalar nada a mais. E pode ser uma solução para aqueles cujo hardware não suporta o Compiz, requerido pelas docks de verdade. 😉

PlayOnLinux: deixando o Wine mais doce

Quem já se aventurou a instalar aplicações do Windows no Linux já foi por certo apresentado ao Wine, uma camada de tradução do sistema de Redmond para o pinguim. O Wine não é exatamente fácil de se operar, e isso é tanto mais verdadeiro quanto mais complexo for o programa a ser instalado.

Para contornar esse problema de usabilidade, existe o PlayOnLinux (PoL), que se autodefine como um frontend para o Wine. Criado originalmente para possibilitar a execução de jogos Windows sob o Linux, o sistema de scripts de instalação do PoL foi aproveitado para também tornar possível a instalação de outros tipos de aplicativos. Essa é a parte que pouca gente sabe; para a maior parte das pessoas que já ouviu falar dele, o PoL ainda serve só para rodar uns joguinhos. Santa injustiça, Batman!

PlayOnLinux

Tela do PlayOnLinux exibindo algumas das aplicações as quais permite instalar

O PlayOnLinux nos facilita a vida ao gerenciar os prefixos do Wine, instalar as dependências necessárias, escolher a versão do Wine mais apropriada para o aplicativo desejado, entre outros recursos. A instalação do Microsoft Office 2007, por exemplo, é quase uma experiência out of the box – instruções claras, instalação limpa e sem sobressaltos, resultando em aplicativos funcionais ao final do processo.

Para a instalação de aplicativos não listados no PoL, há as opções de instalação manual (“na marra”, como se faz apenas com o Wine, mas ainda assim com algumas facilidades) e, para alguns casos, o uso de scripts não oficiais.

Ele (ainda) não está disponível nos repositórios do Ubuntu, mas em sua página de download é possível baixar um pacote .deb, bem como encontrar instruções de como adicionar o respectivo repositório e instalá-lo a partir dali. Há também informações sobre como instalá-lo em outras distribuições Linux.

UPDATE: Mea culpa, mea maxima culpa. O leitor Carlos Donizete (Coringao) alertou-nos em seu comentário que o PlayOnLinux foi adicionado aos repositórios do Ubuntu desde a versão 9.10 (Karmic Koala). Peço desculpas pela desinformação. Todavia, como acontece com muitos programas nos repositórios, nem sempre a versão do PoL encontrada ali é a mais recente. Se você prefere inovação a estabilidade, talvez prefira baixar o programa a partir de sua página de download.

Enfim, creio que posso definir o PlayOnLinux como uma bela mão na roda. Experimente-o – mas não vá se embriagar. 😉

Ubuntu: um navegador de aplicativos sempre à mão

No post que escrevi sobre as diferentes opções de menu que podem ser utilizadas no Ubuntu, apresentei entre elas o Menu Principal do GNOME. Esse projeto, além do menu, traz um pequeno tesouro chamado Navegador de Aplicativos. Nele, a organização dos aplicativos por categoria é mais bem visualizada do que nos menus, e seu melhor recurso é uma caixa de busca incremental. Isso deixa qualquer aplicativo a apenas algumas teclas de distância.

Menu principal do GNOME e seu Navegador de Aplicativos

Menu principal do GNOME e seu Navegador de Aplicativos

Podemos ampliar consideravelmente as possibilidades do Navegador de Aplicativos ao criar um lançador para ele. Assim, o Navegador de Aplicativos poderá ser usado mesmo se o Menu Principal do GNOME não for sua opção de menu principal. Para tanto:

  • Instale o Menu Principal do GNOME, se ainda não o tiver feito (veja nesse outro post como proceder). Não é necessário adicioná-lo ao painel; somente precisamos dele instalado;
  • clique com o botão secundário do mouse no espaço vazio de algum painel e selecione Adicionar ao Painel. No diálogo que se abre, escolha Lançador de aplicativo personalizado e, em seguida, Adicionar;
  • atribua um nome facilmente identificável ao novo lançador. Na caixa de texto Comando, informe /usr/lib/gnome-main-menu/application-browser.

O lançador personalizado para o Navegador de Aplicativos mostra-se ainda mais interessante quando utilizado em conjunto com alguma dock (Docky, AWN, etc.), já que é possível arrastar itens a partir do navegador e ancorá-los naquela. E ter o próprio lançador do Navegador de Aplicativos na dock é uma bela saída para ter os aplicativos acessíveis quando já não cabem mais ícones. Ou quando simplesmente se prefere uma dock mais “enxuta”. 😉

Qual a linguagem mais importante para sua carreira?

PHP? Java? C#? C, C++? Ruby? VB.net? Um bom desenvolvedor domina pelo menos uma linguagem, e está de olho em outra, no mínimo. Em certo momento, todos nós já nos perguntamos: será que eu não estaria perdendo meu tempo e esforço com a linguagem X? E se eu partisse para a linguagem Y? Isso desagua, inevitavelmente, na pergunta que intitula este artigo.

Talvez eu os desaponte, mas ouso afirmar que a linguagem mais importante, nos planos profissional e pessoal, é – pasmem! – a língua portuguesa. A inculta, bela e esfarrapada última flor do Lácio. Nem a língua inglesa, cuja fluência é exigida em 11 em cada 10 cargos, de quaisquer áreas, é capaz de lhe sombrear a importância.

Quantas vezes já não pedimos para alguém nos fazer um favor, e ouvimos como resposta: “Tudo bem. Eu se viro!” No que compete a mim opinar, creio que de nada adianta saber todos os meandros e melindres de uma linguagem de programação (para web, por exemplo) e exibir um “Seje benvindo” na sua página pessoal. Talvez o sujeito esteja ancioso, pensando quiçá numa sertificação que ratifique sua nerdisse. Sabe terminar suas linhas de código com ponto e vírgula, mas ignora quando usar este sinal de pontuação numa frase.

Em tempos de Internet, blogs, Twitter e afins, o desmazelo pela língua evidencia-se ainda mais. Não me refiro a eventuais erros de digitação, ou, no caso do Twitter, de abreviações. Falo da mais pura e simples ignorância, mesmo. E, antes que me julguem, sim, também cometo erros. Procuro, contudo, me policiar e me corrigir em tempo hábil. E não maltratar ainda mais a pobre língua portuguesa que, como instrumento primário de comunicação, merece mais consideração.

Dominar a língua materna, enfim, pode fazer de nós melhores programadores. Noam Chomsky que o diga. 🙂

%d blogueiros gostam disto: