Instalador do Debian a partir do Windows

Posted by Felipe Ribeiro on January 30, 2007

O Debian que sempre foi visto como uma distribuição “difícil” do linux, tomou uma iniciativa fantástica para facilitar a vida de quem quer instalá-lo e sair do Windows.
É um instalador .exe que roda no Windows e facilita a vida de quem tá querendo fazer essa migração.
Essa iniciativa já foi tomada pelo Ubuntu anteriormente e a do Debian entrou no ar hoje para combater o lançamento oficial do Windows Vista.
A diferença com relação ao instalador do Ubuntu para Windows, é que o do Ubuntu cria um arquivo na partição do Windows e nesse do Debian o .exe é só pra “preparar” a instalação, então ele reinicia a máquina e você faz a instalação normalmente, muito melhor! :-)
Dêem uma olhada, vale a pena:
http://goodbye-microsoft.com

Rodando Dreamweaver no Linux 1

Posted by Felipe Ribeiro on January 26, 2007

UPDATE - 19/05/2007: Descobri que o Dreamweaver pode ser instalado de maneira muito mais simples que a apresentada abaixo, basta rodar o instalador normalmente com WINE! E só funciona até a versão 8, pois os aplicativos da linha CS da Adobe não funcionam no Wine.

Olá,

Depois de um vários dias sem tempo para postar, pois estava muito ocupado mexendo com Webservices (SOAP e REST), e em breve farei um post sobre isso, hoje vou mostrar uma solução que vai “salvar a vida” de muita gente que trabalha com o web e assim como eu escreve código no Eclipse ou Zend Studio e precisa(va) ir para o Windows pra poder trabalhar bem com HTML no Macromedia Dreamweaver.

Consegui rodar o Dreamweaver usando o Wine no meu Gentoo Linux, aí vão os passos:
(Para Debian, ou Debian-based (i.e. Ubuntu), substitua o comando emerge pelo apt-get)

1 - Sincronizar o seu portage com o mirror
felipe@mustang ~ $ sudo emerge –sync

2 - Instalar o wine com emerge
felipe@mustang ~ $ sudo emerge wine

3 - Criar o diretório de configuração do wine
felipe@mustang ~ $ winecfg

4 - Instalar o recode
felipe@mustang ~ $ sudo emerge recode

5 - Agora é preciso copiar os arquivos da sua partição do Windows, pra sua pasta do Wine
felipe@mustang ~$ cp -r /win/Program\ Files/Macromedia /home/felipe/.wine/drive_c/Program\ Files/

felipe@mustang ~$ cp -r /win/Documents\ and\ settings/All\ users/Application\ Data/Macromedia /home/felipe/.wine/drive_c/window/profile/all\ users/Application\ Data/

felipe@mustang ~$ cp -r /win/WINDOWS/system32/Macromed /home/felipe/.wine/drive_c/window/system32/
Nessa ultima é Macromed mesmo… sem o “ia” finais

felipe@mustang ~$ cp -r /win/Program\ Files/Common\ Files/Macromedia /home/felipe/.wine/drive_c/Program\ Files/Common\ Files/

No meu caso o Windows é em inglês e está montado em /win, para Windows em português, substitua pelas pastas equivalentes. Substitua também o /home/felipe pelo seu diretório pessoal.

6 - Dê boot pelo Windows e execute o “regedit” e exporte o HKEY_LOCAL_MACHINE/Software/Macromedia/ para um arquivo macromedia.reg

7 - Volte para seu Linux e converta o arquivo .reg pra ascii com:
felipe@mustang ~$ recode ucs-2..ascii macromedia.reg

8 - Depois adicione ele ao seu registro do wine
felipe@mustang ~$ sudo wine regedit macromedia.reg

9 - Daí, é so rodar com wine e correr pro abraço!
felipe@mustang ~$ wine ~/.wine/drive_c/Program\ Files/Macromedia/Dreamweaver/Dreamweaver.exe
*Serve também com o Flash, mas só testei com Dreamweaver.

E-Pronto, segue um shot dele rodando:

PS1.: A performance me surpreendeu e a estabilidade também! Ainda não tive nenhum problema.

PS2.: Esse guia foi traduzido e adapatado de outro que serve para o Ubuntu Dapper Drake, segue o link:
http://blog.publicidadpixelada.com/how-to-dreamweaver-and-flash-8-running-on-ubuntu-dapper/

PS3.: Sou adepto do software livre, mas as alternativas Open Source que eu conheço ainda não têm o mesmo poder do Dreamweaver.

Rodando Linux a partir de um pendrive! 1

Posted by Felipe Ribeiro on January 17, 2007

Olá,

Hoje numa tarde de ócio, resolvi rodar um linux dentro do meu linux a partir de um pendrive, isso mesmo, um pendrive! Baixei o Damn Small Linux (www.damnsmalllinux.org), (um zip de 50MB), descompactei num pendrive de 512MB, e rodei-o usando QEMU. No meu Gentoo Linux (www.gentoo.org):
$uname -a
Linux mustang 2.6.18-gentoo-r3 #1 SMP Tue Nov 21 01:22:56 BRT 2006 x86_64 AMD Turion(tm) 64 Mobile Technology ML-30 AuthenticAMD GNU/Linux

E eis o resultado:


(clique na imagem para vê-la maior, o que tá por trás, é meu Gentoo normal, e nessa janela do QEMU, o Damn Small Linux)

Muito bacana!

Desmistificando o Singleton no PHP 1

Posted by Felipe Ribeiro on January 16, 2007

Ontem eu sugeri dois livros sobre Design Patterns, e hoje eu vou entrar em alguns detalhes do padrão Singleton e como ele se comporta no PHP.

Por definição, o padrão Singleton serve para garantir que exista apenas uma instância de determinada classe e mantendo um ponto global de acesso à essa instância. Por exemplo, eu desejo que na minha aplicação exista uma entidade responsável por gerar logs, e ela precisa ser única pois acessos concorrentes a um arquivo podem ser desastrosos, ou eu tenho limitações de recurso e preciso de uma entidade única que gerencie uma conexão socket ou com um banco de dados. E para isso foi formalizado o padrão Singleton.

Para garantir que só existe uma instância daquela classe eu preciso me preocupar em tratar a criação desse objeto, ou seja, limitar essa criação fazendo com que o sistema antes de criar, cheque se já existe uma instância, caso positivo retorna essa instância, caso contrário cria uma nova. Para isso, eu preciso fazer com que meu construtor seja *privado*, sendo assim acessado só por métodos da mesma classe, e prover um método de classe (estático) que possa checar a existência prévia da instância. Em PHP a implementação seria assim:

<?class XPTO {private static $instance;private $estado; //Usaremos esse campo mais na frente

public static function getInstance() { if(empty(self::$instance)) {     self::$instance = new XPTO(); } return self::$instance;}

private function __construct() { $this->setEstado("Inicial"); }

public function getEstado() { return $this->estado;}

public function setEstado($novoEstado) { $this->estado = $novoEstado;}}?>

Sendo assim, eu não posso, de fora da classe, instanciar um novo objeto do tipo XPTO, mas tenho que chamar o metodo getInstance para pegar a instancia única dessa classe.

Até aqui tudo parece muito bonito, mas aí esbarramos numa limitação do PHP nesse sentido: Em PHP não existe o conceito de Aplicação, ou seja, cada vez que alguem acessa sua página, o que acontece é apenas a execução de um script numa thread do seu webserver, e mesmo que várias pessoas acessam simultaneamente o *mesmo* script, essas execuções são independentes, não há relação nenhuma entre elas. E como não existe o conceito de aplicação, os objetos e variáveis só permanecem na memória no curto tempo da execução do script, quando o PHP processa o script e devolve ao webserver para ser enviado para o visitante, aqueles valores utilizados são limpados da memória.

Seguindo esse raciocínio chegamos a conclusão de que em PHP o padrão Singleton é útil para organizar as idéias do programador e deixar o código melhor organizado evitando variáveis globais, porém não provê todas as funcionalidades que se espera dele, e para demonstrar essa conclusão executarei o seguinte teste:

1 - Crio o arquivo teste.php.

2 - Nesse arquivo importo a classe XPTO criada anteriormente:

<? require("Xpto.class.php"); ?>

3 - Pego a instância única da classe XPTO e checo qual o estado atual dele:

<?$xpto = XPTO::getInstance();print("Estado atual do objeto XPTO: " . $xpto->getEstado());?>

4 - Pego novamente a instância, altero esse estado e checo novamente:

<?$xpto = XPTO::getInstance();$xpto->setEstado("Alterado");print("<br/>Estado atual do objeto XPTO (depois de alterado): "  . $xpto->getEstado());?>

Quando esse script for executado, pela primeira vez, a saída será:

Estado atual do objeto XPTO: InicialEstado atual do objeto XPTO (depois de alterado): Alterado

Se houvesse o conceito de aplicação, esse objeto persistiria na memória e na próxima execução a saída *seria*:

Estado atual do objeto XPTO: AlteradoEstado atual do objeto XPTO (depois de alterado): Alterado

Mas quando o PHP terminou de processar a primeira execução, ele removeu tal objeto da memória e na segunda execução ele foi recriado do zero, voltando ao estado inicial e tendo a saída idêntica à primeira execução.

Estado atual do objeto XPTO: InicialEstado atual do objeto XPTO (depois de alterado): Alterado

Existem outras maneiras de se testar isso, mas essa foi a maneira que achei mais simples.

E esses foram meus dois centavos para mostrar que o Singleton em PHP nem sempre funciona como pensamos. :-)

Sonhos de um Geek consumista - parte II

Posted by Felipe Ribeiro on January 16, 2007

Steve Jobs apresentando o iPhone!

Pra estar no topo da pirâmide, precisa-se de DESIGN PATTERNS! 1

Posted by Felipe Ribeiro on January 16, 2007

Olá, hoje vou mostrar dois livros que se você quer ser um bom programador precisa ter e segui-los como um muçulmano segue o Alcorão! :-D
E esses dois livros tratam de um assunto muito legal, os Design Patterns.
Design Patterns separam homens de ratos programadores de verdade e micreiros . E se o cara quer ter um código decente, bem estruturado, reaproveitável - ou seja, coisa de profissional - precisa estar ligado neles.
Seguem minhas dicas:

Design Patterns: Elements of Reusable Object-Oriented Software

O famoso “Gang of Four” (pois foi escrito por 4 caras, dã). Esse livro foi escrito nos anos 90 (94 se não me engano) tendo como principal autor o Erich Gamma, teve como objetivo formalizar soluções para problemas recorrentes no desenvolvimento de software de forma que o código ficasse mais limpo, melhor estruturado e reaproveitável, essas soluções ficaram conhecidas como Design Patterns (Padrões de Projeto) e esse livro se tornou uma bíblia no meio dos desenvolvedores. Os exemplos são dados em C++ e Smalltalk, mas os conceitos servem para qualquer linguagem OO. É leitura obrigatória pra quem quer escrever bons códigos. (Existe uma versão traduzida, mas algo me diz que essas traduções são pobres, por isso prefiro o original)
(ISBN: 0201633612)

P.S.: Tem um livro novo sobre Design Patterns da série Head First (em português, Use a Cabeça!) que parece ser bacana também. Os livros dessa série são bem interessantes e tratam dos assuntos técnicos de maneira bem descontraída, o livro até parece até um gibizão :D (ISBN: 0596007124) (Existe versão em português)

E minha segunda dica (na realidade, a terceira) é:

PHP 5 Objects, Patterns, and Practice

Esse é um que trata de como se programar BEM em PHP, que é por muitos tida como uma linguagem de difícil manutenção (coisa que depende do programador, e PHP ficou com essa fama por ser fácil e muita gente sem boas noções de programação faz seus sisteminhas nela com códigos sebosos, bugados e fedorentos mal escritos :-D).
Ele mostra como funciona a Orientação a Objeto no PHP5 (que foi um grande avanço em relação ao 4) , mostra também aplicações de Design Patterns em PHP e boas práticas de programação. Ótimo livro!
(ISBN: 1590593804) (Não existe versão em português)

Ah, e comprar essas coisas na Amazon muitas vezes vale a pena, as vezes sai mais barato e até chega antes do que comprar em lojas nacionais (Porque elas vão importar e têm que juntar uma quantidade X pra fazer pedido e blá blá blá).

XAJAX

Posted by Felipe Ribeiro on January 15, 2007


O Ajax é uma tecnologia muito interessante, melhora a experiência de navegação e a interatividade do seu site, mas trabalhar com Javascript é um saco.
Então para facilitar nossa vida, eis que surge o framework XAJAX, uma classe em PHP que permite que você codifique tudo em PHP e ela cuida da parte chata de Javascript. Pra não ficar no blá blá blá, vou mostrar um exemplo passo a passo:
0 - Baixe o XAJAX aqui

1 - Importe a biblioteca do Xajax

<? require("xajax.inc.php"); ?>

2 - Crie a função que deve ser executada pela requisição assincrona:

<?function olaMundo() {$objResponse = new xajaxResponse(); //Cria o objeto de resposta$frase="Olá Mundo!";$objResponse->addAssign("principal","innerHTML", $frase);//Especifica o quê e onde deve ser renderizada a resposta.

return $objResponse->getXML(); //retorna o XML de resposta.}?>

3 - Crie um objeto Xajax e registre a função nele para que ele a trate

<?$xajax = new xajax();$xajax->registerFunction("ola");$xajax->processRequests();?>

4 - Entre as tags <head> e </head> coloque

<? $xajax->printJavascript(); ?>

5 - Crie o elemento onde que deve chamar a função e onde seu resultado deve ser renderizado:

<input type="button" onClick="xajax_ola()"/><div id="principal"></div>

E-pronto! :-)

Rails no PHP

Posted by Felipe Ribeiro on January 14, 2007

Pra quem trabalha com PHP, já ouviu falar muito em Ruby on Rails, mas não tem tempo, ou não quer aprender uma nova linguagem, eis a solução: PHP on TRAX.

Eu dei uma olhada bem rápida nele, mas me pareceu muito bom! Pelo pouco que vi (só aquele lance de scaffolding), ele se comportou exatamente igual ao Rails, então creio que seja uma ótima alternativa.

Alguns screencasts:

Part 1 - Setting up Trax on your server.
Part 2 - Setting up a blog application (Part 1).
Part 2 - Setting up a blog application (Part 2).
Part 2 - Setting up a blog application (Part 3).

E no estilo do Trax, também tem o CakePHP.

Então fica a dica pra quem quer aprender algo novo nas férias! :D E se quiser o “original”, que também é uma ótima ferramenta e que tá crescendo muito: www.rubyonrails.org

Cisco processa Apple por marca “iPhone”

Posted by Felipe Ribeiro on January 14, 2007

Fonte: Info Online

A Cisco abriu um processo, em uma corte da Califórnia, alegando ser a dona da marca iPhone.

De acordo com a Cisco, a companhia detém o nome “iPhone” desde 2000, quando comprou a Infogear Technology, empresa que havia registrado a marca para a venda de telefones VoIP.

Um porta-voz da Cisco afirmou ainda que a empresa esperou até o último momento para entrar com o processo. Antes, a Cisco teria tentado diversos acordos com a Apple para licenciar a marca.

A Apple argumenta que usará a marca iPhone para a venda de um smartphone, produto diferente do iPhone da Cisco, que é um aparelho fixo VoIP.

Além da marca “iPhone”, a Apple discute na Justiça da Inglaterra o próprio uso da marca “Apple” e sua logomarca que usa o desenho de uma maçã. A empresa fonográfica Apple, que produziu diversos discos dos Beatles, diz ser dona da marca muito antes da Apple Computer existir.

Inicialmente, havia um acordo para que a Apple inglesa explorasse a marca no mercado fonográfico e a Apple americana a explorasse no mercado de tecnologia. Desde a criação do iTunes, um serviço de música, a Apple inglesa passou a questionar o acordo.

Sonhos de um Geek consumista 1

Posted by Felipe Ribeiro on January 11, 2007


Minha próxima aquisição, se Deus quiser! (Se nao for esse de cima, que seja esse de baixo ;D)