NoSQL Data Modeling Techniques
Postado em: 15/03/2012 | Categoria: Database, Geral, NoSQL | Deixe um comentário »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
Postado em: 28/11/2011 | Categoria: Geral | Deixe um comentário »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
Postado em: 04/09/2011 | Categoria: Javascript, Node JS | Deixe um comentário »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.
Postado em: 03/09/2011 | Categoria: HTML5, Javascript, Node JS | Deixe um comentário »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)
Postado em: 07/08/2011 | Categoria: Mac OS, Nginx, PHP, PHP-FPM, XCache | 1 comentário »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…
Postado em: 07/08/2011 | Categoria: Geral | Deixe um comentário »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!