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

Friday, October 5, 2012

Cron Jobs


Salve galera! Como dizem: Toda solução surge de um problema. Hoje tive que fazer uma cron job para meu servidor e como não fazia ideia fiz minhas pesquisas e encontrei a solução abaixo. Espero que seja útil para mais alguém.

O que é uma Cron Job?

Cron jobs são "scripts" (ou tarefas) agendadas no seu sistema operacional para rodar de tempos em tempos. O termo “Cron Job” ou cron está ligado a sistemas UNIX, no entanto o Windows também tem algo semelhante chamado Tarefas agendadas, veja aqui mais à respeito.

Neste artigo vou abordar como configurá-las no ubuntu 12.04.

Pra que usar uma Cron Job?

Elas podem ser usadas para qualquer fim, desde atualizações no seu sistema operacional, iniciar um processo, rodar um script (php. ruby e assim por diante). Mas as possibilidades são ilimitadas.

Criando uma cron

Basicamente, uma cron job consiste em uma linha com 6 valores separados por espaço, assim:

minuto hora dia mes dia-da-semana linha-de-comando

Vamos a alguns exemplos de configuração de tempo antes de criar a cron em si:

Cron Job que rode todo dia as 08:00am
0 8 * * * linha-de-comando

Cron Job que rode a meia-noite de três em três dias
0 0 */3 * * linha-de-comando

Cron Job que rode as 14h30 de segunda e sexta
30 14 * * 1,5 linha-de-comando

Cron Job que rode todo dia a cada duas horas
0 */2 * * * linha-de-comando

Instalando a Cron

Abra o arquivo crontab com seu usuario sudo:

$ sudo nano /etc/crontab

E insira no final do arquivo algo como na linha abaixo:

* 1 * * * root /var/www/arquivo_cron.txt

E não se esqueça de dar permissão de execução no arquivo:

$ chmod 755 /var/www/arquivo_cron.txt

Neste exemplo o arquivo vai rodar utilizando das permissões do usuário root. E para checar se sua cron esta rodando ou ainda se há erros basta verificar através do arquivo de log do sistema:

$ tail -f /var/log/syslog

Bem, é isso. Rodando, funcionando e fazendo nossa vida mais feliz.

Agradecimento especial ao Gabriel de Figueiredo que me deu um suporte também.
Até a próxima galera.



Referências:
http://blog.thiagobelem.net/o-que-sao-e-como-usar-as-cron-jobs/
http://forum.civicrm.org/index.php?topic=24956.0
http://askubuntu.com/questions/139061/crontab-not-working
http://askubuntu.com/questions/56683/where-is-the-cron-crontab-log
http://www.adminschoice.com/crontab-quick-reference


Wednesday, October 3, 2012

Instalando ZF2

Salve galera! Após algumas semanas desde o lançamento resolvi instalar o Zend Framework 2 em minha máquina (Ubuntu 12.04) e analisar as mudanças que a nova versão trouxe. Abaixo vamos ver desde o download até ver a aplicação rodando. Sem mais nem menos vamos lá!

O pré-aquecimento

Vamos já deixar algumas coisas preparadas antes de começar o nosso trabalho. Eu configurei um  virtual host chamado local.zf2 e apontei o root para /var/www/zf2/public. Sinta-se livre para fazer como desejar. (Não sabe nada desse tal de Virtual Host? Clique aqui)

O download

Você pode fazer download do Skeleton do ZF aqui, basta clicar no botão ZIP. Eu optei por clonar o projeto no diretório /var/www como no comando abaixo . Chamei meu diretório de zf2:

$ cd /var/www
$ git clone https://github.com/zendframework/ZendSkeletonApplication.git zf2


A instalação

Uma vez feito, agora  usaremos o composer (não sabe do que estou falando? Aqui tem algumas dicas). Observe que você tem um arquivo no /var/www/zf2 chamado composer.json. Ele contém todas as informações necessárias para fazer o download das dependências:

$ composer self-update
$ composer install

Você terá em seu diretório zf2 algo como:


Teóricamente basta rodar no seu browser http://local.zf2 que você verá a tela de apresentação do ZF2.


Digite agora http://local.zf2/1234, e neste momento você deveria estar visualizando uma página como abaixo, caso contrário possívelmente você terá que verificar seu módulo rewrite do apache ou ainda configurar seu arquivo .htaccess.


Em breve estarei postando alguns exemplos de uso. Criação de rotas, controllers e etc.

Até mais!


Referências:
http://framework.zend.com/downloads/
http://framework.zend.com/manual/2.0/en/user-guide/skeleton-application.html
https://github.com/zendframework/ZendSkeletonApplication
http://meumysql.blogspot.com.br/2012/09/configurando-apache-e-zend-framework.html

Symfony: O Porquê do prefíxo ACME?

Salve galera! Esse post é curto e apenas para fins de curiosidade. Quem vem iniciando no Symfony pode se perguntar algumas vezes sobre "Acme é alguma brincadeira ou a galera do framework leva isso à serio"?

Bem, até onde pesquisei não passa de uma empresa fictícia, onde os iniciantes na linguagem podem ter alguns exemplos para utilizar nos seus testes.

No quick tour o termo já aparece por lá, e acredito que seria sensato neste momento a equipe do Symfony adicionar uma pequena nota informando aos iniciantes que "Acme nada mais é do que uma coleção de Bundle inicial para se utilizar como exemplos e referência de uma estrutura de projeto".

De qualquer forma essa informação consta no glossário do Symfony: "Acme is a sample company name used in Symfony demos and documentation. It's used as a namespace where you would normally use your own company's name (e.g. Acme\BlogBundle).", onde pode ser visto aqui.

Bem, se encontrarem algo mais que agregue algum valor a esse texto fiquem à vontade para postar aqui.

Abraços!

Referências:

http://symfony.com/doc/2.0/glossary.html

Monday, September 24, 2012

Instalando o Symfony

Olá galera! Hoje, como um bom curioso que sou, fui fazer uma instalação do framework Symfony 2 para fins de testes e um possível uso do mesmo no meu website (www.mdnsolutions.com). Como sempre, há muito o que se aprender com o uso de uma nova ferramenta, então espero quer me apreciem este artigo e aprendam tanto quanto eu.

1 As dependências

Bem, já de cara na página de instalação há várias opções de download do Symfony, eu optei por utilizar o Composer para este fim. Contudo também não tinha o composer instalado (e acredito que nem mesmo vocês), então tive que realizar algumas pequenas tarefas antes de qualquer coisa.

1.1 O Composer

Não irei entrar em detalhes sobre o Composer neste artigo, mas você pode encontrar toda a documentação sobre ele aqui, acho de extrema importância saber como essa ferramenta funciona e estar atento as mudanças que ela esta/irá gerar na forma como os desenvolvedores php lidam com a distribuição de pacotes de suas aplicações.

1.1.1 Instalação

Primeira coisa é fazer o download do executável:

$ curl -s https://getcomposer.org/installer | php


Se alguma mensagem de erro pule em sua tela de uma olhada neste artigo. Caso contrário você deveria esta vendo essa mensagem:

$ curl -s https://getcomposer.org/installer | php

All settings correct for using Composer
Downloading...

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

Agora vamos tornar o acesso ao binário que baixou global:

$ sudo mv composer.phar /usr/local/bin/composer

A partir de agora você digitar composer no seu console e verá uma lista de comandos que pode utilizar.


2 O Symfony

2.1 Instalação

Uma vez com o Composer funcionando vamos à instalação do nosso framework.

$ composer create-project symfony/framework-standard-edition path/ 2.1.2

Lembrando que path/ é o local onde você deseja criar seu projeto ex.: /var/www/meu_sf2. Aqui você vê um log que o comando gera.

2.1 Configuração

Lembre-se que você precisa preferencialmente de um servidor Apache 2 e PHP 5.3.8 ou superiores.

Remova o histórico de git que vem no pacote:

$ rm -rf .git

Podemos agora verificar se o nosso ambiente de trabalho atende as especificações de um projeto symfony rodando o comando abaixo ou o script "web/config.php" no endereço onde instalou sua aplicação. No meu caso criei um virtual host chamado "local.sf2" e rodei a url "http://local.sf2/web/config.php". (você pode verificar como criar um virtual host neste artigo).

$ php ./app/check.php 

Ele vai te dar uma ideia dos ajuste que você deveria fazer desde seu servidor apache até algumas variáveis do php.ini (ex. aqui).

No meu caso tive que instalar o Intl, uma extensão de internacionalização para executar collation e date/time/number/currency formatação nos scripts php:

$ sudo apt-get install php5-intl

, alterar a linha no  nano /etc/php5/apache2/php.ini

short_open_tag = Off

, instalar o APC do PHP. que você encontra aqui como fazer. E habilitar permissões de escrita para seu apache (nesse caso como é o meu local habilitei com 777)

$ chmod 777 -R app/cache/
$ chmod 777 -R app/logs/

2.2 Testando

Bem, seu Symfony neste ponto deveria estar instalado e pronto para rodar. O symfony tem um servidor interno que pode ser iniciado com:

$ php ./app/console server:run

E então digite em seu browser algo como:


Uma página com sua aplicação rodando deve está aparecendo em sua tela. Bem, é isso symfony rodando sucesso ao iniciar o desenvolvimento de sua aplicação.


Happy coding!


Referências:
http://www.symfony.com/
http://getcomposer.org/
http://packagist.org/
http://php.net/manual/en/intro.intl.php

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: