Se não gosta do F-Spot volte para o gThumb

Uma das coisas mais simples no Ubuntu 7.10 era transferir fotos da minha câmera digital para o computador. Era só plugar a câmera na porta USB e o gThumb abria, perguntando o que eu queria fazer com as fotos. Por default o programa importava as fotos no diretório onde eu havia importado meu último álbum (então eu nunca precisava configurar o diretório novamente), mas jogava as novas fotos em um diretório interno a esse, dando um nome bastante significativo ao novo diretório (formado pela data e hora atuais). Ou seja, não poderia haver programa mais simples e intuitivo pra isso. Em seguida eu passava o scanner do Picasa Desktop nas fotos e as subia para meus álbuns pessoais nos servidores do Google, redimensionadas pelo próprio Picasa durante o upload.

Mas eis que na atualização para o Ubuntu 8.04, entre meus diversos problemas com drivers proprietários para placa de vídeo também descobri que o programa padrão para importação de fotos deixou de ser o gThumb, passando a ser o terrível F-Spot. Caso você seja mais um descontente com o F-Spot, este artigo do Alec Koumjian explica como é simples tornar o gThumb o importador padrão de fotos na versão 8.04 do Ubuntu.


Livro sobre Zend Framework em português

Em: 10/05/2008 Tags: PHP Comentários (1) Referencie do seu blog (Trackback)

Estava eu hoje dando uma volta pela Livraria Saraiva quando encontrei o livro do Flávio Gomes da Silva Lisboa sobre o Zend Framework (ZF). Como vou ter que trabalhar em um projeto já existente escrito sobre o (ZF) é possível que eu trate dele aqui no blog nas próximas semanas.


Matando o Firefox

Ok, o título do post foi meio forçado. Quis dizer “matando o processo do Firefox”.

O Firefox é ótimo, todos gostamos dele etc. Mas ele trava, e ultimamente tem travado bastante, talvez 1 vez por dia no meu Ubuntu 7.10. Nessas horas você tem que abrir um console e matar o processo, é a única forma rápida e indolor de abrir novamente o navegador. E como se mata o processo?

Há o jeito difícil: você lista os processos da máquina, filtra apenas os do Firefox, identifica o número do processo firefox-bin e então o mata passando o número do processo como parâmetro. Exemplo:

caio@superjesus:~$ ps axu | grep firefox
caio      6630  1.2  1.0  35704  9308 pts/0    Sl+  00:29   0:01 vi matando.o.firefox.mkd
caio      6635  0.0  0.0   1752   524 ?        S    00:31   0:00 /bin/sh /usr/bin/firefox
caio      6647  0.0  0.0   1752   528 ?        S    00:31   0:00 /bin/sh /usr/lib/firefox/run-mozilla.sh /usr/lib/firefox/firefox-bin
caio      6651 15.3  4.7 164008 43276 ?        Sl   00:31   0:01 /usr/lib/firefox/firefox-bin
caio      6686  0.0  0.0   2976   768 pts/1    S+   00:31   0:00 grep firefox

caio@superjesus:~$ kill -9 6651

O processo está morto, podemos abrir o navegador de novo. Foram 2 passos, e você talvez tenha levado uns 10 segundos ou mais para fazer isso. Que tal levar só 5 segundos? Utilize killall:

killall firefox-bin

E boa matança de Firefox pra você!

Update 26/05/2008: Ubuntu 7.10, não 7.04.


Google Reader vai me fazer abandonar o Delicious

As últimas novidades do Google Reader saíram esta semana: adição de comentários aos nossos conteúdos compartilhados (excelente!) e possibilidade de adicionar ítens externos dentro do Reader. Para adicionar ítens externos é só utilizar o link “Note in Reader”, disponível dentro da seção “Your stuff” da nova interface. Esse link “Note in Reader” pode ser arrastado para a sua barra de favoritos do Firefox para funcionar como um “adicionar aos meus favoritos”, jogando o conteúdo dentro do seu Google Reader…. mas peraí, não era pra isso que eu utilizava o Delicious? Ah, mas o Delicious tem tags para as coisas que eu adiciono! Opa, o conteúdo externo adicionado ao Reader é tratado como qualquer outro conteúdo baseado em feeds, podendo ser compartilhado (com comentários), ganhar estrelas e… receber tags! É, o Reader está ficando imbatível…


Conversões entre arrays e objetos no PHP

Em: 01/05/2008 Tags: PHP Comentários (0) Referencie do seu blog (Trackback)

Arrays associativos e objetos herdeiros da classe StdClass são bastante parecidos no PHP: você define uma variável e começa a pendurar valores nela. Vamos ver como isso funciona na prática.

$person1 = array();
$person1['name'] = 'Caio';
$person1['age'] = 22; 
$person1['city'] = 'Florianópolis';

$person2 = new StdClass;
$person2->name = 'Caio';
$person2->age = 22; 
$person2->city = 'Florianópolis';

O código acima mostra como arrays associativos e objetos StdClass são similares em sua sintaxe e semântica. Uma coisa que pode não parecer muito óbvia inicialmente é que converter um tipo de dados no outro é trivial em PHP.

A conversão de objeto para array associativo é a mais trivial:

$person2_as_array = get_object_vars($person2);

A saída do programa mostra os conteúdos do array resultante:

Array
(
    [name] => Caio
    [age] => 22
    [city] => Florianópolis
)

Ou seja: get_object_vars() retorna um array onde cada propriedade do objeto original é convertido em um índice desse array, e os respectivos valores das propriedades do objeto original tornam-se os valores associados aos índices do novo array.

Para converter um array associativo para objeto o PHP não nos dá nenhuma função padrão, mas podemos escrever uma:

function array_to_object($array) {
    $object = new StdClass;
    foreach ($array as $key => $value) {
        $object->$key = $value;
    }   
    return $object;
}

E como a utilizaríamos:

$person1_as_object = array_to_object($person1);
var_export($person1_as_object);

O resultado da execução do código acima seria:

stdClass::__set_state(array(
   'name' => 'Caio',
   'age' => 22,
   'city' => 'Florianópolis',
))

Ou seja, nosso array tornou-se, de fato, um objeto PHP.

Mas, para falar a verdade, array_to_object seria reinventar a roda. Como disse acima, a linguagem não nos dá uma função que faça isso, mas nos dá uma estranha funcionalidade de conversão de tipo. Veja como convertemos o array $person1 para um objeto com 1 linha de código:

$person1_as_object = (object) $person1;

E o resultado final é o mesmo gerado pela nossa função array_to_object. Leia mais sobre esse truque neste link.

Sumarizando: de array associativo para objeto utilize (object) $array, e de objeto para array associativo utilize get_object_vars($object).