NoSQL Data Modeling Techniques

Leitura muito recomendada para quem pretende trabalhar (ou até mesmo já trabalha) com bancos de dados NoSQL:

NoSQL databases are often compared by various non-functional criteria, such as scalability, performance, and consistency. This aspect of NoSQL is well-studied both in practice and theory because specific non-functional properties are often the main justification for NoSQL usage and fundamental results on distributed systems like CAP theorem are well applicable to the NoSQL systems.  At the same time, NoSQL data modeling is not so well studied and lacks of systematic theory like in relational databases. In this article I provide a short comparison of NoSQL system families from the data modeling point of view and digest several common modeling techniques.

Leia por completo em http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/


Humane JS – Framework de notificações

Framework prático para notificações de sistema para usuários, para uso principalmente em sistemas administrativos:

“This project was heavily inspired by humanmsg project for jQuery. I really liked the project but I wanted to remove the jQuery dependency, add support for CSS transitions, and have more control over the timing…”

Veja mais em:
http://wavded.github.com/humane-js/
https://github.com/wavded/humane-js


Node.JS no Amazon EC2 rodando Ubuntu

Instalar o Node.JS no Amazon EC2 rodando Ubuntu é uma tarefa bem simples, que precisa apenas de alguns pequenos detalhes.

A instalação a seguir foi feita utilizando uma instância Micro EC2 com uma imagem pública do Ubuntu 11.10 (ebs/ubuntu-images-milestone/ubuntu-oneiric-alpha2-amd64-server-20110706), ainda em fase alpha, que atende bem ao propósito dessa instalação.

Download do Node.JS na máquina

Para baixar o fonte do Node.JS (0.4.11 no nosso caso), basta rodar:

wget http://nodejs.org/dist/node-v0.4.11.tar.gz

Após efetuar o download, descompacte todo o pacote:

tar xvf node-v0.4.11.tar.gz

Instalando dependências

Caso você tenha optado pela versão do Ubuntu citada anteriormente, ela estará totalmente “pelada”, sem nenhum recurso que permita compilação. Para isso, temos que instalar os pacotes necessários que permitem compilação e algumas libs adicionais que são dependentes do Node.JS:

GCC

sudo apt-get install gcc
sudo apt-get install cpp
sudo apt-get install g++

OpenSSL

sudo apt-get install openssl
sudo apt-get install libssl-dev

Compilando o Node.JS

No diretório onde você descompactou o Node.JS, rode:

./configure
make
sudo make install

Feito isso, o node deverá estar instalado no diretório /usr/local/bin/node


Essential JavaScript Design Patterns For Beginners, Volume 1.

Leitura essencial sobre JavaScript Design Patterns. Aconselhável ainda mais nos dias de hoje, onde tecnologias como Node.JS e HTML5 ganham cada vez mais força no mercado.

“At the beginning of this book I will be focusing on a discussion about the importance and history of design patterns in any programming language. If you’re already sold on or are familiar with this history, feel free to skip to the chapter ‘What is a Pattern?‘ to continue reading.

One of the most important aspects of writing maintainable code is being able to notice the recurring themes in that code and optimize them. This is an area where knowledge of design patterns can prove invaluable.

Design patterns can be traced back to the early work of a civil engineer named Christopher Alexander. He would often write publications about his experience in solving design issues and how they related to buildings and towns. One day, it occurred to Alexander that when used time and time again, certain design constructs lead to a desired optimal effect.”

Veja o artigo completo em: http://addyosmani.com/resources/essentialjsdesignpatterns/book/


Instalando PHP 5.3, PHP-FPM, XCache e Nginx no Mac OS X (Snow Leopard)

Para quem está acostumado ao desenvolvimento com PHP e compreende mais a fundo sobre o funcionamento interno da tecnologia em si sabe que o PHP é uma linguagem que possui muitas coisas boas, mas que, para operação em ambientes de alta performance, ele deixa um pouco a desejar pela forma como executa cada script ou página acessada.

A instalação mais comum que estamos acostumados a ver em qualquer ambiente é o famoso LAMP (ou XAMP, ou outras variações), que basicamente consiste em Linux + Apache + MySQL + PHP. É uma combinação que serve bem para quase todas as necessidades. Mas, e quando precisamos que o nosso sistema tenha uma performance extrema? Com certeza essa arquitetura esbarra em problemas de consumo excessivo de CPU, memória e IO.

Existem diversas soluções no mercado para aumentar performance do PHP, algumas comerciais e outras open source. Nesse post, vou abordar uma solução que estou testando e provavelmente irei adotar em alguns serviços que tenho: PHP 5.3 + PHP-FPM + XCache + Nginx.

O que significa cada um dos itens? Vamos lá:

Nginx – O Nginx é o web server que irá substituir o Apache na nossa instalação. De acordo com o “Web Server Survey“, da Netcraft, o Nginx já é o terceiro maior servidor web do mercado e o segundo maior em instalações *nix, ficando atrás apenas do Apache. Vamos utilizar o Nginx repassando as chamadas PHP utilizando a sua interface FastCGI em comunicação com o PHP-FPM.

PHP-FPM - É um gerenciador de processos CGI do PHP. Ao contrário de instalações CGI típicas, onde os processos PHP são executados através de threads do servidor web e “morrem” ao término de sua execução, as threads FastCGI gerenciadas pelo PHP-FPM são recicladas e reutilizadas. Assim, temos um menor overhead no servidor para spaw de processos. Há diversas outras vantagens no uso de PHP-FPM, mas vamos deixá-las para um próximo post. ;)

XCache – O XCache é um compilador e otimizador de código PHP. O seu uso não quer dizer que temos que compilar o nosso código toda vez que alterarmos o nosso código. A sua função é compilar e otimizar o código quando determinado arquivo PHP for acessado e colocar em memória esse “programa” para uso futuro. É justamente nesse ponto que o PHP sempre teve uma certa deficiência de performance: toda vez que um arquivo PHP é executado, ele passa por um processo de compilação interna antes de ser executado. A função do XCache (e outros bytecode compilers) é armazenar o resultado dessa compilação em memória para eliminar esse passo.

Agora que sabemos um pouco mais sobre cada um dois componentes, vamos colocar as mãos em tudo isso!

Instalação no Mac OS X – Snow Leopard (10.6.8) – plataforma 64 bits

AVISO IMPORTANTE: não me responsabilizo por qualquer dano que o processo de instalação possa causar no seu sistema. Esse é apenas um guia que retrata a minha experiência com a instalação dos pacotes no meu MacOS.

A instalação no Mac OS X é relativamente simples, porém tem alguns truques. Antes de começar, certifique-se de que você possui o XCode instalado com os componentes de Unix Devel. Caso não possua, faça o download em http://developer.apple.com/xcode/ e baixe o pacote (aviso: aprox. 3GB de download o aguarda!).

Para a instalação dessa configuração, você também deve possuir um mínimo de conhecimento de compilação de arquivos fontes e também de shell do MacOS.

Para quem já tem o Apache + PHP rodando na instalação padrão da Apple, pare o servidor Apache antes de começar:

sudo apachectl stop

Antes de iniciar a instalação dos pacotes do PHP, PHP-FPM, NGInx e XCache, temos que instalar algumas bibliotecas no sistema (pelo menos, na minha instalação foram necessárias).

OpenSSL

Caso não queira utilizar o PHP com suporte a OpenSSL, pule esse passo.

Vá em http://www.openssl.org/source/ e baixe a versão indicada como “LATEST” (1.0.0d) no meu caso. Descompacte o pacote e faça a compilação:

./Configure darwin64-x86_64-cc
make
sudo make install

LibJPEG e LibPNG

A instalação das bibliotecas LibJPEG e LibPNG são necessárias apenas para quem quiser compilar o PHP com suporte a GD. Se não é o seu caso, pule esse passo.

LibJPEG:

Para a instalação da LibJPEG, faça download do arquivo http://www.ijg.org/files/jpegsrc.v8c.tar.gz, descompacte e compile da seguinte forma:

./configure --enable-shared --enable-static
make
sudo make install
sudo ranlib /usr/local/lib/libjpeg.a

LibPNG: 

A instalação da LibPNG é muito parecida com a LibJPEG. Basta fazer download do fonte em http://prdownloads.sourceforge.net/libpng/libpng-1.5.4.tar.gz?download, descompactar e compilar da seguinte forma:

./configure
make
sudo make install

LibICONV

A instalação da LibICONV é um tanto controversa. O PHP faz uso dessa biblioteca e, apesar de eu já ter essa biblioteca instalada no meu MacOS (ela vem já com o sistema e também com o XCode), no momento em que tentei compilar o PHP tive um erro relacionado com a arquitetura do sistema operacional. Só vi esse tipo de erro até hoje nos MacOS X com arquitetura 64 bits, e mesmo assim de forma aleatória. Então, aconselho a instalar essa biblioteca, mesmo que você já a tenha.

Para a instalação, faça download da biblioteca em http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz, descompacte e compile com as seguintes diretivas:

CFLAGS='-arch x86_64' CCFLAGS='-arch x86_64' CXXFLAGS='-arch x86_64' ./configure
make
sudo make install

Observe que antes do ./configure você deve dizer explicitamente qual é a arquitetura que será utilizada na compilação. Aqui foi um ponto que gerou problemas, pois se você não informa explicitamente que deseja a arquitetura x86_64, o PHP não consegue compilar no MacOS. Não tive esse tipo de problema com CentOS, nem em arquitetura i686, nem em arquitetura x86_64. Vai entender… :)

Compilando o PHP

A compilação do PHP, caso o seu sistema não tenha nenhum problema de dependência, será tranquila (só um pouco demorada). Instalei aqui a versão 5.3.6, a última “stable” disponível. Para o download, vá em http://php.net/downloads.php e baixe a última versão em source code.

Descompacte o pacote baixado e compile. A minha configuração de compilação foi a seguinte:

./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info \
--sysconfdir=/private/etc --enable-cli --with-config-file-path=/etc \
--with-libxml-dir --with-openssl --with-kerberos --with-zlib --enable-bcmath \
--with-bz2 --enable-calendar --with-curl --enable-exif --enable-ftp --with-gd \
--with-jpeg-dir=/usr/local --with-png-dir=/usr/local/include/libpng15 \
--enable-gd-native-ttf --with-ldap --with-ldap-sasl --enable-mbstring \
--enable-mbregex --with-mysql=mysqlnd --with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd --with-mysql-sock=/var/mysql/mysql.sock --with-iodbc \
--enable-shmop --with-snmp --enable-soap --enable-sockets --enable-sysvmsg \
--enable-sysvsem --enable-sysvshm --enable-wddx --with-xmlrpc \
--with-iconv-dir=/usr/local --with-xsl --enable-zend-multibyte --enable-zip \
--with-pcre-regex --enable-cgi --enable-fpm
make
sudo make install

Você pode adicionar ou remover componentes na instalação, conforme achar necessário. O importante nessa compilação é rodar com –enable-cgi e –enable-fpm.

Após a instalação, configure o arquivo /etc/php.ini a seu gosto. :)

Se tudo correu bem com a compilação do PHP, agora é hora de instalar as novas ferramentas.

XCache

Faça o download do XCache no endereço http://xcache.lighttpd.net/wiki/Release-1.3.2, descompacte e compile da seguinte forma:

phpize
./configure --enable-xcache
make
sudo make install

Após a compilação, copie todo o conteúdo do arquivo “xcache.ini”, que está no diretório onde você descompilou o XCache, e coloque todo o conteúdo no arquivo /etc/php.ini.

Ainda editando o arquivo /etc/php.ini, ajuste as seguintes diretivas:

extension=/usr/lib/php/extensions/no-debug-non-zts-20090626/xcache.so

Observe que o path do arquivo xcache.so deve estar correto. Na minha instalação ficou no diretório acima. Caso na sua instalação ele não esteja nesse diretório, procure pelo arquivo “xcache.so” em todo o seu sistema e aponte a diretiva “extension” para o local correto.

Ajuste o bloco “xcache.admin” conforme as linhas que seguem:

[xcache.admin]
xcache.admin.enable_auth = 0
xcache.admin.user = "nobody"
xcache.admin.pass = ""

E para finalizar, ainda no php.ini, procure pela diretiva xcache.mmap_path e altere para o seguinte:

xcache.mmap_path =    "/tmp/xcache"

Nginx

Prosseguindo, vamos agora instalar o Nginx. Para isso, baixe a versão mais recente do Nginx em http://nginx.org/, descompacte e compile com a seguinte configuração:

./configure --prefix=/usr/local/nginx --user=www-data --group=www-data \
    --without-mail_pop3_module --without-mail_imap_module \
    --without-mail_smtp_module --with-http_stub_status_module \
    --with-http_ssl_module --http-log-path=/var/log/nginx/access.log \
    --conf-path=/etc/nginx/nginx.conf  --pid-path=/var/run/nginx.pid
make
sudo make install

Finalizando a instalação do Nginx, agora é hora de configurar tudo e botar pra rodar :)

Configurando os programas

Para finalizar o processo inteiro, precisamos agora configurar o PHP-FPM e o Nginx para “falar” com o PHP-FPM.

PHP-FPM

Edite o arquivo /etc/php-fpm.conf e altere as seguintes abaixo para os seguintes valores:

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 50

Nginx

Edite o arquivo /etc/nginx/nginx.conf (se não existir, crie um novo arquivo) e coloque tudo isso dentro (pode trocar o que tiver, se for uma instalação nova como a nossa):

user  nobody;
worker_processes  2;

error_log  /var/log/nginx/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  60;
    tcp_nodelay        on;

    gzip  on;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_min_length  1100;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_disable "MSIE [1-6].(?!.*SV1)";
    gzip_vary on;

    server {
        root /Library/WebServer/Documents/;
        listen       8080;
        server_name  localhost;

        charset utf-8;
        location / {
            index  index.php index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME /Library/WebServer/Documents/$fastcgi_script_name;
                fastcgi_param SERVER_NAME $http_host;
                fastcgi_ignore_client_abort on;
        }
    }
}

Observe que em dois pontos do arquivo há uma referência para /Library/WebServer/Documents/. Essas duas referências precisam ser alteradas para um diretório na sua máquina onde ficarão todos os seus arquivos .php e demais arquivos que serão servidos pelo Nginx.

Na diretiva “listen” acima você poderá configurar a porta que o Nginx irá escutar para servir os arquivos.

Um detalhe importante: logo na segunda linha de configuração, há uma diretiva “worker_processes”. Esse número tem que ser o número de “cores” que o seu processador possui, para se atingir a melhor performance possível (2, no meu caso – Core 2 Duo).

Rodando os pacotes

Para rodar tudo, você deve primeiro iniciar o PHP-FPM da seguinte maneira:

sudo php-fpm

Caso não tenha nenhuma mensagem no seu terminal, as threads do PHP-FPM deverão estar ativas. Para verificar, dê o comando “ps aux | grep php-fpm”. Você deverá ver 10 threads com o usuário “nobody” e mais uma com o usuário “root”. Isso significa que o PHP-FPM está no ar, com as 10 primeiras threads alocadas e aguardando requisições.

Em seguida, iniciamos o Nginx:

sudo /usr/local/nginx/sbin/nginx

Se nenhuma mensagem apareceu para você, então o Nginx deverá estar funcionando. Para verificar, dê o comando “ps aux | grep nginx”. Você deverá ver 2 (o número de worker_processes) threads com o usuário “nobody” e mais uma com o usuário “root”.

Testando o PHP

Para certificar que o PHP está funcionando, crie um arquivo “info.php” no diretório em que você configurou no Nginx e coloque nele:

<?php
echo phpinfo();
?>

Acesse a url http://localhost:8080/info.php e você deverá ver as configurações do PHP que você acabou de instalar!

Algumas considerações

Essa instalação não leva em conta aspectos de segurança. Como se pode reparar, nenhum cuidado extra foi tomado em relação à criação de usuários específicos para rodar as aplicações e nessa instalação roda-se tudo como root (sudo). Não se devem utilizar essas configurações em nenhuma hipótese em ambientes de produção.

O foco desse roteiro é basicamente de habilitar as tecnologias PHP-FPM, Nginx e XCache para aprendizado!

Se algum passo não funcionou, ou se tem alguma falha ou melhoria, poste aqui. Ajudas são sempre bem-vindas!

 

Abs!

Lomanto


Começando…

Como todo blog tem um começo, vamos a ele :)

Esse blog servirá para falar um pouco sobre minha experiência com desenvolvimento WEB em geral. Nele vou abordar um pouco sobre algumas das minhas experiências no dia-a-dia e também postarei sobre artigos que encontrar na web sobre o assunto.

Para quem não me conhece, meu nome é Paulo Lomanto, mais conhecido como “Lomanto”, e trabalho com desenvolvimento web há mais de 10 anos. Nesse período, aprendi muito sobre PHP e outras linguagens voltadas para web, além de ser especialista no desenvolvimento de interface de sites e sistemas web.

Recentemente tenho trabalhado também com Node.JS e sistemas noSQL, como MongoDB e Redis.

Bem, por enquanto é isso. Em breve, meu primeiro post mais especializado. ;)

Abs a todos!