domingo, 21 de outubro de 2012

Instalando pacotes .tar.gz no ubuntu

Muitos usuários recém chegados no mundo Linux deparam-se com esse problema ao desejarem instalar determinado software que não vem por padrão na distribuição usada e ao fazer o download do arquivo, encontram um .tar.gz.

Ao longo desse artigo iremos mostrar como não existe nada de complicado nessa tarefa.

    * Pacotes do tipo .tar.gz ou .tar.bz2 contém os fontes do programa prontos para compilação (transformar os fontes em executáveis).
    * Sua instalação não depende da distribuição usada.
    * O .tar significa que dentro desse arquivo existem outros e sub-pastas e o .gz ou .bz2 é o tipo de compactação que foi usada na criação do pacote. 



$ cd /home/usuário (entra no diretório onde está o pacote)
$ ls (só para você ver o pacote que você baixou)
$ tar -jxvf nome_do_pacote.tar.bz2

DICA: Digite as primeiras letras e tecle tab.

Explicação do último comando: para extrair os arquivos de um pacote .tar.bz2 usa-se o comando listado acima, caso fosse um .tar.gz o comando seria bastante semelhante:

$ tar -zxvf nome_do_pacote.tar.gz

Ou seja, muda apenas em uma letra de "j" para "z" ou vice-versa. Recomendo que você procure saber o que significa cada uma dessas letras, para isso use o comando:

$ man tar

Agora listando os arquivos...
$ ls
Vc vai perceber que foi criado um novo diretorio com o nome do pacote ou então um arquivo .bin correto?


Se for um .bin então é bem rápido, basta fazer:
$ chmod a+x nome_arquivo.bin
$ sudo ./nome_arquivo.bin



Caso seja um diretorio...

$ cd nome_do_diretório_criado
$ ls

Está vendo um arquivo chamado "configure"? Segue explicação abaixo.

Como o nome já sugere, esse arquivo 'prepara' o Linux para instalar o programa, checando dependências, entre outras coisas. Se encontrar problemas na etapa seguinte, leia o INSTALL ou o README, eles informam tudo que você precisa ter e/ou fazer para ter o programa funcionando perfeitamente.

$ ./configure

(o ./ significa que queremos executar esse arquivo)

OBS: Agora serão verificadas variáveis de ambiente e dependências de bibliotecas. Essa etapa demora um pouco, caso o configure encontre algum erro, anote-o, vá no install e veja se fala algo sobre.

$ make
$ make install (instala o programa no Linux)

Lista rápida de comandos:

    * tar -zxvf nome-do-arquivo.tar.gz - desempacota o arquivo de extensão .tar.gz;
    * tar -jxvf nome-do-arquivo.tar.bz2 - desempacota o arquivo de extensão .tar.bz2.

http://easy-ubuntu.blogspot.com/

Utilizando o LIKE no Doctrine

Quer utilizar o LIKE com Doctrine? Essa é simples!

SIMMMMMMMMMMMMMMMMMM



Esse não é nem um artigo mas sim uma dica/lembrança para consulta rápida...




Utilizando QueryBuilder
<?php
// $qb instancia de QueryBuilder

$qb->select(array('u')) // string 'u' is converted to array internally
   ->from('User', 'u')
   ->where($qb->expr()->orX(
       $qb->expr()->eq('u.id', '?1'),
       $qb->expr()->like('u.nickname', '?2')
   ))
   ->orderBy('u.surname', 'ASC'));



E Utilizando DQL

<?php
$query = $em->createQuery("SELECT u FROM CmsUser u LEFT JOIN u.articles a WITH a.topic LIKE :foo");
$query->setParameter('foo', '%foo%');
$users = $query->getResult();



Bem, é isso rsrs... 

terça-feira, 2 de outubro de 2012

Design Pattern Builder no PHP

Olá amigos tudo bem? Vamos "filosofar" um pouco? Vamos falar sobre o Builder um design pattern que "deriva" do Factory mas tem suas particularidades.

ANNTISiSS DE INICIAR O ARTIGO VOU DAR UM AVISO AOS NAVEGANTES:
    Não use um design pattern pq simplesmente ele é "elegante" ou então pq vc quer aprender e para isso vai jogar em código de produção para testar.
   Use os patterns quando vc REALMENTE PRECISAR, vou repetir... REALMENTE PRECISAR! Muitas vezes as pessoas tornam algo simples em algo absurdamente complexo por não saber usar ou usar os os patterns em hora errada, se vc tem dúvidas se usa ou não o pattern procure entender melhor o problema e a solução que ele propõe antes de fazer uma tremenda de uma porcaria no código. Ok? :)


Como o próprio nome já diz ele é um pattern construtor(builder), otimo para quando vc precisa criar objetos completos que atendam uma certa complexidade. No Pattern Builder um temos um diretor e um construtor trabalhando juntos para construir um objeto. O diretor controla a construção e especifica quais partes e variações entram em um objeto. O construtor sabe como montar a especificação do determinado objeto. Em resumo a intenção do padrão Construtor(Builder), é separar a construção de um objeto complexo, de modo que o mesmo processo de construção possa criar várias representações diferentes.

Veja um exemplo claro de diagrama mostrando a implementação:
O diagrama é a mesma coisa que dizer que:
A classe Builder especifica uma interface abstrata para a criação de partes de um objeto Product.
O ConcreteBuilder constrói e reúne peças do produto pela implementação da interface Builder. Ele define e mantém o controle da representação que cria e fornece uma interface para guardar o produto
A classe Director constrói o objeto complexo usando a interface do Construtor
A Product representa o objeto complexo que está sendo construído.

Veja um exemplo classico de implementação:
BUILDER
  1. <?php
  2. class Fabrica {
  3.     public function Construir($oVeiculo) {
  4.         $oVeiculo->Iniciar();
  5.         $oVeiculo->construirPortas();
  6.         $oVeiculo->construirMotor();
  7.         $oVeiculo->construirPneus();
  8.     }
  9. }
  10. abstract class ConstrutorVeiculo {
  11.     protected $Veiculo;
  12.     abstract public function Iniciar();
  13.     abstract public function construirMotor();
  14.     abstract public function construirPortas();
  15.     abstract public function construirPneus();
  16. }
  17. class Carro extends ConstrutorVeiculo {
  18.     public $Veiculo;
  19.     public function Iniciar() {
  20.         $this->Veiculo = new Veiculo('Carro');
  21.     }
  22.     public function construirPortas() {
  23.         $this->Veiculo->aPartes['Portas'] = 4;
  24.     }
  25.     public function construirMotor() {
  26.         $this->Veiculo->aPartes['Motor'] = 1;
  27.     }
  28.     public function construirPneus() {
  29.         $this->Veiculo->aPartes['Pneus'] = 4;
  30.     }
  31. }
  32. class Moto extends ConstrutorVeiculo {
  33.     public $Veiculo;
  34.     public function Iniciar() {
  35.         $this->Veiculo = new Veiculo('Moto');
  36.     }
  37.     public function construirPortas() {
  38.         $this->Veiculo->aPartes['Portas'] = 0;
  39.     }
  40.     public function construirMotor() {
  41.         $this->Veiculo->aPartes['Motor'] = 1;
  42.     }
  43.     public function construirPneus() {
  44.         $this->Veiculo->aPartes['Pneus'] = 2;
  45.     }
  46. }
  47. class Veiculo {
  48.     private $sTipo = NULL;
  49.     public $aPartes = array();
  50.     public function __construct($sTipo) {
  51.         $this->sTipo = $sTipo;
  52.     }
  53.     public function ObterInformacoes() {
  54.         printf("--------------------------\n");
  55.         printf("Veículo: %s \n", $this->sTipo);
  56.         printf("Motor:   %s \n", $this->aPartes['Motor']);
  57.         printf("Portas:  %s \n", $this->aPartes['Portas']);
  58.         printf("Pneus:   %s \n", $this->aPartes['Pneus']);
  59.     }
  60. }
  61. $Fabrica = new Fabrica;
  62. $Carro = new Carro;
  63. $Moto = new Moto;
  64. $Fabrica->Construir($Carro);
  65. $Carro->Veiculo->ObterInformacoes();
  66. $Fabrica->Construir($Moto);
  67. $Moto->Veiculo->ObterInformacoes();
  68. ?>


A explicação acima fala por si só não é? Mesmo assim qualquer dúvida... Fui