MeuMySQL Blog is now at http://blog.mdnsolutions.com/.

Monday, September 24, 2012

Instalando o Composer: Erro timezone


Bem, instalando o Composer em meu computador me deparei com a seguinte mensagem:


Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

The date.timezone setting should be provided.
Add the following to the end of your `php.ini`:
    ; UTC here is an example, use your own timezone, see http://www.php.net/manual/en/timezones.php
    date.timezone = UTC

Downloading...

Composer successfully installed to: /home/user/composer.phar
Use it: php composer.phar


Para resolver acesse o php.ini do cli como abaixo:

shell> nano /etc/php5/cli/php.ini 

E procure a linha date.timezone adicionando algum favor:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = 'America/Sao_Paulo'

Pronto, problema resolvido. =)

Wednesday, September 19, 2012

Instalando o Zend Framework

Bem, nesse artigo vou dar dicas de como fazer a instalação e configuração para rodar o zend framework versão 1.12.0 no ubuntu 12.04.


Configurando o Apache

Primeiramente temos que habilitar o modo rewrite do apache. Para isso faremos um link simbólico do respectivo módulo:

shell> ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/

Vamos criar então o virtual host do nosso sistema acessando:

shell> cd /etc/apache2/sites-available/

dentro desse diretório crie o arquivo local.zf com o seguinte conteúdo:

<VirtualHost *:80>

        ServerName local.zf
        DocumentRoot "/var/www/zf/public"
        SetEnv APPLICATION_ENV "development"

        <Directory "/var/www/zf/public">
                Options Indexes MultiViews FollowSymLinks
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

Da mesma forma que fizemos anteriormente vamos agora fazer um link simbólico desse arquivo.

shell> ln -s /etc/apache2/sites-available/local.zf /etc/apache2/sites-enabled/

Agora vamos adicionar o novo virtual host ao hosts do sistema acessando:

shell> nano /etc/hosts

Neste arquivo adicione a seguinte linha

127.0.0.1       local.zf


Baixando e configurando o ZF

Faça o download do projeto aqui. Recomendo que baixe a versão "Zend Framework 1.12.0 Minimal", nela contém arquivos basicos de configuração e a Library. Eu optei pela versão zip do arquivo no download. 

Você pode extrair o arquivo e logo após remover o zip:

shell> unzip ZendFramework-1.12.0-minimal.zip 
shell> rm -R ZendFramework-1.12.0-minimal.zip 

Entraremos no diretório htdocs do apache em:

shell> cd /var/www

Para criarmos nosso projeto digitaremos o caminho do diretório do zend framework que você acabou de baixar, dentro dele temos diretório bin e neste um arquivo chamado zf.sh. (obs.: você pode ainda adicionar esse arquivo ao seu path do sistema.

cd /var/www$ ./path/ZendFramework-1.12.0-minimal/bin/zf.sh create project zf

Copie a biblioteca do Zend para seu projeto ou adicione ela no seu include_path.

shell> cp -R /path/ZendFramework-1.12.0-minimal/library/Zend/ /var/www/zf/library/

Então reinicie o servidor via

shell> /etc/init.d/apache2 restart
ou 
shell> service apache2 restart

Digite no seu browser o caminho http://local.zf/, e neste momento você deveria estar visualizndo o seu projeto.  \o/

ps: Se por algum motivo não rodar você pode verificar o motivo em /var/log/apache2/error.log

Saturday, September 15, 2012

PHP: Usando o goto


Olá galera!

Em meus estudos sobre o php 5.3 e 5.4 encontrei um interessante recurso adicionado à essas versões (especificamente >=5.3.0), o GOTO

O goto pode ser usado para navergar em diferentes blocos do programa. O ponto alvo é especifidaco por uma 'label' seguida de dois pontos, e para se chegar nele usamos o goto seguindo do nome definido na 'label'.

O alvo do goto deve estar dentro do mesmo arquivo e contexto, isso quer dizer que não pode saltar para fora de uma função ou método, tão pouco dentro de um/uma. Você também não pode saltar dentro de nenhum tipo de estrutura de controle loop ou switch. Você pode saltar fora deles, é comum usar o goto no lugar de vários níveis de break;


Uso simples no código:

<?php
echo "Go to: ";

goto middle;<p>

echo 'The Begin';
exit;

middle:
echo 'The middle';
exit;

end:
echo 'The end';
exit;
?>

No caso assim você teria a saída "Go to: The middle".

Uso em um loop:

<?php
for($i=0, $j=50; $i<100; $i++) {
  while ($j--) {
    if ($j==17) goto end; 
  }  
}
echo "i = " . $i;
end:
echo 'j hit 17';
?>

Neste caso não irá funcionar:

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  loop:
      echo 'test';
}
echo "$i = $i";
?>

Dica: goto é usado somente em casos nos quais nenhuma outra instrução ou construção esteja disponível.

Bem, é isso galera, qualquer dúvida só deixar um recado. Até mais.



Wednesday, September 12, 2012

[OFF-TOPIC] Zend_Form: setRequired(true) or addValidator("NotEmpty")

Pessoal, me veio uma dúvida sobre o uso de dois atributos nos formulários do Zend:  Há alguma diferença entre o uso de ->setRequired(true) e ->addValidator('NotEmpty') nos formulários? Bem, gostaria de compartilhar a informação que encontrei com vocês.

Resposta

Sim, há diferença entre os dois. Se um elemento é requerido (setRequired(true)) ele será validado mesmo se todo campo/valor não existir nos dados enviados pelo formulário (pense em valores dinâmicos alterados pelo DOM). Os valores do formulário são apenas verificados pelos validators que você registrou após serem determinados que ele existem. O validador NotEmpty 'funcionaria' apenas se o campo estiver presente, mas vazio.

Contudo, não é necessário adicionar o validador NotEmpty no formulário. Por padrão o Zend automaticamente insere NotEmpty para os elementos que possuem a propriedade setRequired(true). Isso quer dizer que fazendo ->setRequired(true) é o mesmo que fazer ->setRequired(true)->addValidator('NotEmpty'). Você pode ainda desabilitar esse comportamento com o comando
->setAutoInsertNotEmptyValidator(false).


Referências:

http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Form/Element.php

Tuesday, September 11, 2012

[OFF-TOPIC] Zend Framework - Uso de Barras (Slashes) na Url

Olá galera,

Como desenvolvedor todo dia matamos um leão. Hoje quero compartilhar uma situação que tivem com Zend Framework e os tipos de dados que tinha que trafegar na minha aplicação.


O problema

Quando tentei enviar uma variável pela url na minha aplicação em Zend Framework ela continha barras no em um parâmetro chamado grade "/BI/CV/PT". O que gerava uma url do tipo http://URL_PATH/MODULO/CONTROLLER/ACTION/id/289069/grade/BI/CV/PT. Quando eu tentava acessar essa URL recebia de retorno um bom NOT FOUND. 

Mesmo utilizando a função nativa do PHP stripslashes()  (resultando em http://URL_PATH/MODULO/CONTROLLER/ACTION/id/289069/grade/BI%2FCV%2FPT) continuava tendo o mesmo problema.


A solução

Ao pesquisar e com ajuda do @yourwebmarker descobri que se tratava de uma configuração do Apache para permitir o uso de barras codificadas. Você encontra sobre isso em http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes. O que fiz foi adicionar no meu arquivo de configuração do virtual host a linha AllowEncodedSlashes On e tudo funcionou perfeitamente. Exemplo:


<VirtualHost *:80>
    ServerName test.local
    DocumentRoot "/home/local/public"
    SetEnv APPLICATION_ENV "development"
    AllowEncodedSlashes On
    <Directory "/home/local/public">
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>



Abraços!

Saturday, September 8, 2012

[OFF-TOPIC] APC/PHPIZE

Olá meus caros. Estava eu instalando o Symfony Framework em minha máquina de desenvolvimento e para tal tive que instalar o APC do PHP, que por tabela não me pediu para checar o 'phpize'. Bem, ao tentar rodar este último comando recebi a reposta:

medina@dev-env:~$ phpize
Cannot find config.m4. 
Make sure that you run '/usr/bin/phpize' in the top level source directory of the module

Bem, depois de algumas pesquisas descobrir que apenas precisava inserir o verbose:

medina@dev-env:~$ phpize -v
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525

Ridiculamente simples não?


O tal do APC

Ao tentar instalar o APC tive vários erros pulando na tela constantemente (encontrei vários artigos toscos) tais como "Error 324 (net::ERR_EMPTY_RESPONSE): The server closed the connection without sending any data." quando configurava o APC e entrava acessar a tela "web/app_dev.php". Isso ainda gerava no meu log do apache a linha "symfony[notice] child pid 3341 exit signal Segmentation fault (11)". Tudo por causa do maldito pecl.

Enfim, tudo isso desapareceu com um simples comando:

medina@dev-env: sudo apt-get install php-apc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  php-apc
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 85.8 kB of archives.
After this operation, 246 kB of additional disk space will be used.
Get:1 http://ppa.launchpad.net/ondrej/php5/ubuntu/ precise/main php-apc i386 3.1.11-1~precise+1 [85.8 kB]
Fetched 85.8 kB in 2s (40.0 kB/s)  
Selecting previously unselected package php-apc.
(Reading database ... 269688 files and directories currently installed.)
Unpacking php-apc (from .../php-apc_3.1.11-1~precise+1_i386.deb) ...
Setting up php-apc (3.1.11-1~precise+1) ...

Caso você já tenha instalado o APC via PECL remova-o com o comando abaixo:

medina@dev-env: sudo pecl uninstall APC

Pronto, agora seu APC agora esta instalado.


Instalando no MAC OS Lion

Esse cara foi um pouco mais complicado, mas vamos la:

Instale o PEAR primeiramente:

sudo php /usr/lib/php/install-pear-nozlib.phar
pear config-set php_ini /private/etc/php.ini
pecl config-set php_ini /private/etc/php.ini
sudo pear upgrade-all

E em seguida o XCode (Via Apple Store)  eo autoconfig:

curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-latest.tar.gz
tar xzf autoconf-latest.tar.gz
cd autoconf-*
./configure --prefix=/usr/local
make
sudo make install

E finalmente o APC:

curl -O http://freefr.dl.sourceforge.net/project/pcre/pcre/8.02/pcre-8.02.tar.gz
tar xvf pcre-8.02.tar.gz
sudo cp pcre-8.02/pcre*.h /usr/include
sudo cp pcre-8.02/pcre.h.generic /usr/include/pcre.h
rm -r pcre-8.02*

export MACOSX_DEPLOYMENT_TARGET=10.7
export CFLAGS="-arch x86_64"
export CXXFLAGS="-arch x86_64"

sudo pecl install apc

Referências:

Wednesday, August 29, 2012

[OFF-TOPIC][En] Zend_Form_Select with dynamic options


Hey Guys,

I'd like just to show off a really hand attribute to be used with select elements in Zend_Form.
It gives you the change of load options into your select fields without have that anoying message: "X  was not found in the haystack" (or in portuguese "X não faz parte dos valores esperados").

All you need to do is set the 'registerInArrayValidator' as false. Doing so Zend_Form is not validating the original set of values in your select element.



<?php
 ....
               $this->addElement('select', 'xptoId', array(
                    'label' => 'Xpto',
                    'multiOptions' => array(),
                    'registerInArrayValidator' => false,
                    'required' => true,
                ))

...
?>

Hope it is going to be hand for you mates!

Tuesday, July 17, 2012

[OFF-TOPIC] Creating a List of Timezones with PHP

Hey guys,

Below you can find how to create a list of timezones with PHP using the native object DateTimeZone. Enjoy!


<?php

class TimeZone
{

    static $regions = array(
        'Africa' => \DateTimeZone::AFRICA,
        'America' => \DateTimeZone::AMERICA,
        'Antarctica' => \DateTimeZone::ANTARCTICA,
        'Asia' => \DateTimeZone::ASIA,
        'Atlantic' => \DateTimeZone::ATLANTIC,
        'Europe' => \DateTimeZone::EUROPE,
        'Indian' => \DateTimeZone::INDIAN,
        'Pacific' => \DateTimeZone::PACIFIC,
    );

    /**
     * 
     * @return array List of locations
     */
    static public function getLocations()
    {
        foreach (self::$regions as $name => $mask) {
            $tzlist = \DateTimeZone::listIdentifiers($mask);
            foreach ($tzlist as $tz) {
                $locations[$name][$tz] = substr($tz, strrpos($tz, '/') + 1);
            }
        }
        
        return $locations;
    }

}

?/>

To use it just write in your code:

<?php
$locations = TimeZone::getLocations();
?>

Wednesday, June 6, 2012

[OFF-Topic] Customizando ZF BreadCrumb

Olá galera. Hoje trago um tópico que achei bacana para um problema que me confrontei hoje. E como  soluções surgem de necessidades aqui está um que me ajudou e que acredito que pode ajudar outra pessoa.


Breadcrumbs

O Zend Framework trabalha de forma elegante com navigation e breadcrumbs. Já vinha utilizando ambos há um bom tempo em meus sistemas, porém hoje precisei customizar um para um sistema especifico que possuo. Sem mais rodeios segue abaixo as intervenções que fiz no meu Layout e no meu breadcrumb.


No seu Layout.phtml adicione a linha:

<?php echo $this->navigation()->breadcrumbs()->setPartial('breadcrumb.phtml')->render(); ?>

E crie seu breadcrumb no diretório seuModulo/views/scripts/breadcrumb.phtml e escreva ele como desejar. Ex o meu:

<?php

if (null === $this->container) {
    $this->container = $this->breadcrumbs()->getContainer();
}

// find deepest active
if (!$active = $this->breadcrumbs()->findActive($this->container)) {
    return '';
}

$active = $active['page'];

// put the deepest active page last in breadcrumbs
if ($this->breadcrumbs()->getLinkLast()) {
    $html = $active;
} else {
    $html = $active->getLabel();
    if ($this->breadcrumbs()->getUseTranslator() && $t = $this->breadcrumbs()->getTranslator()) {
        $html = $t->translate($html);
    }
    $html = $this->escape($html);
}

// walk back to root
while (($parent = $active->getParent()) != null) {
    if ($parent instanceof Zend_Navigation_Page) {
        // prepend crumb to html
        $html = $parent->getLabel() . $this->breadcrumbs()->getSeparator() . $html;
    }

    if ($parent === $this->container) {
        // at the root of the given container
        break;
    }

    $active = $parent;
}
echo strlen($html) ? $this->breadcrumbs()->getIndent() . $html : '';

?>


Bem, é isso galera. Espero que tenham gostado da dica.

Tuesday, April 3, 2012

[OFF-TOPIC] O maravilhoso mundo GIT

Olá galera! Quanto tempo desde o último post. Mas isso não significa que eu estava de férias, muito pelo contrário. Venho trabalhando em grandes projetos pessoais e aperfeiçoando várias habilidades tecnicas e que agora quero compartilhar com vocês algumas delas.

Bem, hoje falarei sobre o GIT. Há muitos anos tenho trabalhado com o SUBVERSION e suas ferramentas administrativas tais como o Tortoise, mas desde que resolvi tratar de forma mais seria meu repositório, tal como, controle de branches, tags, manter o versionamento de meus softwares em dia, vi que o modelo CVS não me atenderia muito bem, tendo inclusive algumas decepções (Subversion com merge é terrivel).

Como um bom desenvolverdor, sempre que nos deparamos com um problema qual a primeira atitude a se tomar? Resolvê-lo. Em minhas pesquisas verifiquei que o Git (um sistema de controle de versão distribuído) já vinha sendo utilizado por várias pessoas e empresas e resolvi analisa-la um pouco mais de perto. Entre os vários artigos que li um que recomendo é o do Imasters que da uma ideia comparativa entre GIT e Subversion (leia aqui ou nas referências ao fim do texto).

Uma vez entendido o que é e como funciona sistemas distribuidos vamos ver com funciona na pratica. Você, antes de mais nada pode criar um projeto publico no github (eles possuem uma excelente documentação) ou mesmo em sua máquina local.

Nossa instalação será do git version 1.7 no Ubuntu 11.10. O acesso ao git será via WebDAV ou gitweb.

Instalação do Servidor Git

Estou considerando que você já tenha uma versão do apache instalada em sua máquina. Bem, temos que habilitar o módulo dav em nosso servidor. Para isso vamos criar um link simbólico para esses módulos:

ln -s /etc/apache2/mods-available/dav.load /etc/apache2/mods-enable/dav.load
ln -s /etc/apache2/mods-available/dav_fs.load /etc/apache2/mods-enable/dav_fs.load

Configuração do WebDAV

Criar e editar o arquivo de configuracao git:

touch /etc/apache2/conf.d/git
nano /etc/apache2/conf.d/git

Uma vez criado adicione as seguintes linhas:

<Directory "/var/www/git">
        DAV on
        Options +Indexes +FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
        AuthType Basic
        AuthName "Private Git Access"
        AuthUserFile /etc/apache2/passwd.git
        Require valid-user
</Directory>

Agora temos que criar um arquivo de senhas para a autenticação do tipo Basic:

htpasswd -c /etc/apache2/passwd.git usuario

Feito isso, criaremos o diretório dos repositórios para testar a autenticação:

mkdir /var/www/git

Reiniciar o Apache e testar o endereço http://localhost/git:

service apache2 restart

Instalação e Configuração do GIT

Instale o git em sua máquina:

apt-get install git

Agora vamos criar um repositório de teste:

mkdir -p /var/www/git/meurepo
cd /var/www/git/meurepo
git --bare init
Initialized empty Git repository in /var/www/git/meurepo/

Teremos que habilitar o hook de post-update para garantir que o nosso recem criado repositório fique sempre atualizado:

cd /var/www/git/meurepo
cp hooks/post-update.sample hooks/post-update
chmod +x hooks/post-update

O conteúdo do hooks/post-update deve ser:

cat hooks/post-update
exec git update-server-info
Executaremos manualmente o hook na primeira vez:
./hooks/post-update

No Ubuntu o usuário Apache é www-data. Vamos dar permissão à ele em nosso diretório:

chown -R www-data:www-data  /var/www/git/meurepo

Reinicie o servidor apache:

service apache2 restart


Instalação e Configuração do gitweb

O Gitweb é a interface web padrão fornecido pelo git e é base para outros scripts tais como cgit, gitosis entre outros. Para instalarmos o gitweb no Server, podemos executar :

apt-get install gitweb

Criar e editar o arquivo gitweb.conf para o Apache:

touch /etc/apache2/conf.d/gitweb
nano /etc/apache2/conf.d/gitweb

Adicione o codigo no arquivo:

Alias /gitweb /var/www/git


<Directory /var/www/git>
  Options +ExecCGI
  AddHandler cgi-script .cgi
  DirectoryIndex gitweb.cgi
</Directory>

Criar arquivo de configuração do gitweb:

cat /etc/gitweb.conf
$projectroot = '/var/www/git/';
@git_base_url_list = ('http://localhost/git')

Reiniciar o Apache e testar o endereço http://localhost/gitweb:

/etc/init.d/httpd restart

Instalação do Cliente Git

No cliente, pode se a mesma máquina ou outra remota, temos que instalar novamente o git .

apt-get  install git

Configuracao mínima do nosso git:

git config --global user.name "My Name"
git config --global user.email "my@email.com"

Configuraremos um usuário e senha para acessar ao servidor git:

nano ~/.netrc

Adicione no arquivo:

machine localhost
login usuario
password senha


Nota para usuários windows


Neste caso é necessário abri seu iniciar > executar e rodar o cmd, dentro dele digite o seguinte comando:


setx HOME %USERPROFILE%


onde %USERPROFILE% é o diretório do seu usuário 'C:/Users/nomedousuario'. Uma vez feito isso, crie um arquivo neste diretório chamado _netrc (uma vez que o Windows não aceita .netrc) e a adicione o mesmo conteúdo usado acima.


Podemos testar o acesso ao servidor via curl:

curl --netrc --location -v http://localhost/git

Clonar o repositório remoto:

git clone http://localhost/git/meurepo
Cloning into meurepo...
warning: You appear to have cloned an empty repository.

Vamos agora adicionar alguma coisa ao nosso  repositório:

cd meurepo
echo hellow world! > teste.txt
git add teste.txt
git commit -m 'Adicionando meu primeiro arquivo'

Enviando os arquivos para o servidor que criamos:

git push origin master
Fetching remote heads...
  refs/
  refs/tags/
  refs/heads/
updating 'refs/heads/master'
  from 0000000000000000000000000000000000000000
  to   87366d467e2dfcc6057bf7d5e112b79ede984861
    sending 3 objects
    done


Bem, é isso galera, espero que esse post seja útil à todos. Assim que eu tiver mais novidades sobre essa maravilhosa ferramenta volto a publicar aqui. Grande abraço!

Referências:

  • http://pt.wikipedia.org/wiki/Git
  • http://pt.wikipedia.org/wiki/Controle_de_versão
  • http://progit.org/
  • http://imasters.com.br/artigo/23356/desenvolvimento/por-que-voce-deveria-mudar-do-subversion-para-git-parte-01