Expressão Regular com variável no Javascript

Nesta sábado estava com um problema para fazer uma magia negra com NodeJS, precisava manipular um texto que seria publicado com código parecido com BBCode para identificar a posição de elementos (parecidos com widgets) que deveriam ser substituídos de acordo com seu tipo.

Para isso, precisava identificar o padrão [#tipo_id], como poderiam ser vários tipos de componentes (e como sempre o sistema pode crescer e novos tipos serem adicionados) a melhor forma de trabalhar com isso seria uma expressão regular com uma variável.

Antes eu tinha o seguinte:

var er = new RegExp(/\[#img_.*?\]/g);
var results = minhastring.match(er);

O que eu precisava era que o #img fosse uma variável para que esta rotina de busca e replace pudesse ser transformada em uma função parametrizada, o resultado final:

var er = new RegExp('\\['+ busca +'.*?\\]', 'g');

A sugestão do @knorrium em uma consultoria rápida pelo Twitter e sem saber exatamente o que eu precisava foi o uso do eval(), testei e funcionou, mas esta modo diferente de uso do new RegExp com dois parâmetros string que o @manuWell sugeriu ficou mais elegante. 

E você, como faria uma Regexp com variável no javascript?

Comparativo entre o Amazon EC2 e o Cloud Locaweb

Depois de alguns problemas com a Locaweb comecei a pesquisar alternativas de hosting e trocar idéias com outros desenvolvedores usando o Twitter (@gserrano). O que eu procurava:


  • Gerenciar o servidor
  • Estabilidade e disponibilidade (preferência por Cloud)
  • Preferencia por SO Ubuntu
  • Gerenciar o servidor com liberdade de instalação / atualização de pacotes
  • Facilidade para aumentar espaço / ram / banda com facilidade (Cloud)

Vou escrever aqui um comporativo opinativo sobre minha experiência com os servidores da Locaweb e da Amazon.

1. Servidor e disponibilidade

Por muito tempo fui cliente da Locaweb: hospedagem normal, mudei para uma revenda e posteriormente contratei um cloud gerenciado pelo cliente (Windows) e um Cloud Linux gerenciado pelo cliente.

Apesar de alguns problemas eu gostava da Locaweb, mas a indisponibilidade e aparente descaso com os problemas que se tornaram frequentes me fizeram passar a ser um cliente totalmente insatisfeito, hoje não recomendo a Locaweb.

O último período de indisponibilidade que presenciei enquanto era cliente com a Locaweb coincidiu com o final de semana de lançamento do Eu Compraria! Camisetas –  foi a gota da água. Promoções planejadas, tweets, links no Facebook, divulgação anterior, tudo com a data marcada e anunciada… junto com a indisponibilidade da Locaweb.

Como eu fiquei no lançamento da nova loja…

Foi um final de semana para eu esquercer.

A Locaweb deu mil desculpas: oscilação de energia, gerador que não funcionou porque a energia apenas oscilou e não foi cortada. Só faltou um Tsunami para tornar a situação tão trágica quanto ao Japão.

Estou a pouco mais de 3 meses com o EC2 da Amazon, ainda é cedo para avaliar. Mas o uptime até agora foi garantido, o servidor é o que eu esperava, os cuidados com segurança de acesso são melhores (chave ao invés de apenas senha). 

A velocidade de resposta dos dois servidores é bem parecida, ao meu ver neste comparativo não seria nenhum fato decisivo na escolha.

No quesito disponibilidade neste curto período que estou na Amazon ela se mostrou muito melhor que a Locaweb, quanto a performance só tive uma vez problema com a Locaweb que não era referente a aplicação ou acessos, como passei muito mais tempo considero normal. 

Cloud Locaweb: nada a reclamar da performance, o uptime se tornou um problema e a desculpa nos últimos meses que fui cliente sempre era de alguma empresa que fornecia os links, ou problemas de DNS (não cumpriam o SLA e diziam que a culpa não era deles).

EC2: nenhuma reclamação até agora, uptime total até o momento e nenhuma reclamação de performance.

2. Cloud

A Locaweb vende sua hospedagem como Cloud mas você não tem a liberdade que um Cloud deveria oferecer.

Ao meu ver o Cloud da Locaweb não oferece vantagem sobre nenhum VPS. Não posso aproveitar o que o Cloud oferece de melhor: alta disponibilidade (vide meus relatos nos parágrafos acima) e facilidade para aumentar ou reduzir hardware quando necessário.

Se preciso de mais provessamento ou espaço com a Locaweb eu preciso contratar outro cloud e se os contratos continuam os mesmos, você não pode contratar por uma semana ou um mês apenas. 

Com o Amazon EC2 eu vi o que é realmente gerenciar um servidor ou uma rede "na nuvem". Lançar uma instância (novo servidor) é mais fácil que tomar doce de criança, existem várias opções de Sistema Operacional e máquinas pré-configuradas (e posso salvar uma pré configuração se vou usar com frequência).

O servidor é cobrado por hora – portanto se preciso de processamento ou armazenamento para uma tarefa ou período específico (um hot-site, um advergame, etc) eu não preciso fazer um contrato que me prenda, lanço quantos servidores forem necessários para a operação em questão (e posso aumentar e diminuir as configurações conforme for necessário) e depois desligo tudo, cortando a geração de qualquer custo adicional.

Cloud Locaweb: não oferece as vantagens que um Cloud deveria oferecer, é igual um VPS mas carrega o nome marketeiro "Cloud".

EC2: fantástico.

3. Preços

O plano do Amazon EC2 ganha com folga no quesito economia. Peguei um plano do EC2 no qual paguei uma taxa para 1 ano de desconto na hora do servidor, além desta taxa minha conta é de aproximadamente 30 dólares mensais.

Cloud Locaweb: na Locaweb era de aproximadamente R$1.500,00 / ano.

EC2:  O custo anual no EC2 ficou em torno de $600 (incluindo o contrato anual para desconto/hora e todo o custo mensal),  uma redução de aproximadamente 40% nos custos.

 

4. Suporte

Aqui é um ponto que pode influenciar algumas pessoas, com a Locaweb eu tinha uma relação razoável – abria um chamado, se ele não era resolvido com agilidade eu xingava muito no Twitter e logo a Locaweb entrava em contato para resolver. Feio, mas era o meu servidor que estava fora, né?

Ainda não utilizei o suporte do Amazon, mas ele será em inglês (assim como todos os painés), então se você não tem facilidade com inglês vai estudar meu filho pode ter dificuldades para entender o painel ou se comunicar com o suporte do EC2.

Locaweb: suporte atencioso e normalmente esclarecedor, apesar de as vezes não conseguir resolver o problema (falando da rede, das empresas que fornecem links, culpando os provedores de acesso a internet no brasil, etc) sempre tentava atuar no problema.

EC2: não testado.

 

É isso, se quiserem relatar suas experiências nos comentários elas serão bem vindas!

O último período de indisponibilidade que presenciei enquanto era cliente com a Locaweb coincidiu com o final de semana de lançamento do Eu Compraria! Camisetas – e foi a gota da água. Promoções planejadas, tweets, links no Facebook, divulgação anterior, tudo com a data marcada e a Locaweb me fez passar um infernal final de semana correndo atrás de colocar a loja no ar – e deram mil desculpas, oscilação de energia, gerador que não funcionou porque a energia apenas oscilou e não foi cortada, só faltou um Tsunami na lista de desculpas.
 
Comecei a procurar alternativas e 

Dicas: jQuery performance

Duas coisas que todo o bom desenvolvedor deve se preocupar: segurança e performance.

Comecei a me preocupar e estudar mais a fundo performance em PHP quando passei a ter problemas com o crescimento do And After, para isso desenvolvi um sistema de cache inteligente utilizando o cache do Code Igniter, que aumentou muito a performance de entrega das páginas – e mesmo assim tem muito que pode melhorar.

Performance no front-end

Com a reduação dos custos computacionais (cloud, balance e servidores mais acessíveis) os problemas de processamento do backend muitas vezes são resolvidos com o "liga mais máquina", mas os problemas de performance no front-end são sentidos pelo usuário – e não temos controle sobre o computador do usuário.

A redução do custo do acesso a internet banda larga (internet 1Mb a R$35,00) permite que carreguemos mais código e imagens com mais qualidade sem prejudicar muito a entrega, mas ainda temos dois pontos principais de otimização de sites front-end que independem de banda ou do servidor:

  1. Renderização do código
  2. Performance do javascript

A forma e ordenação de como o HTML é escrito definem como ele será renderizado – e cada browser fará isso de uma forma, por isso é muito importante seguir as boas práticas e recomendações da W3C para estar preparado para o futuro, e não preso aos navegadores do passado.

Assim como o html, cada navegador tem a sua forma (ou engine) para lidar com javascript, o que diferencia muito a performance de algumas funções em um navegador ou outro – achar a forma que atende melhor seus usuários (sem ficar preso a navegadores velhacos) é o que eu vejo como melhor opção.

Se você quer entender um pouco mais sobre javascript recomendo a leitura dos slides sobre performance em javascript que postei anteriormente, os slides deste post tratam exclusivamente da biblioteca jQuery.

jQuery performance

Os slides abaixo apresentam diversos testes de performance com a biblioteca jQuery, em diversos navegadores. 

 

Uma boa forma de mensurar e testar seu código é criando uma rotina de testes de performance, que pode ser usando alguma biblioteca (ainda não usei para teste de performance) e o "modo macho", criando um cronômetro em javascript e marcando o tempo de execução de loops com cada função que você quer testar.

Instalando e configurando o memcache no Apache

Finalmente consegui resolver o problema de cache do And After, criei um sistema de cache que cacheia partes das páginas dos posts. Como o tutorial de como instalar o NodeJS foi bastante útil para meus colegas aqui no iG, resolvi compartilhar o processo de instalação e configuração do memcached no servidor (Apache rodando no Ubuntu). 

Atenção: o PHP tem duas bibliotecas para trabalhar com memcache: memcache e memcached (veja a diferença entre as duas aqui), este tutorial se refere ao memcached apenas.

 

Instalação dos pacotes necessários

No terminal digite os comandos abaixo para instalar o Memcached e o módulo do PHP para se comunicar com o sistema de cache.

apt-get install php5-dev memcached php-pear php5-memcache

É necessário o php5-dev para execução do comando abaixo, que utiliza PECL (repositório de extensões para o PHP), eu não consegui instalar sem o pacote do php5-dev por isso adicionei ele na lista.

Será necessário fazer o build em um dos pacotes, portanto você precisará ter o pacote abaixo (provavelmente você já tenha ele instalado):

sudo apt-get install build-essential

Agora que você já tem todos os pacotes necessários, vamos para a instalação!

 

Instação do libmemcached

O memcached no PHP tem uma dependência da libmemcached, então precisaremos fazer o build dessa lib que não está no repositório do Ubuntu. No site oficial do memcached baixe a versão que você deseja instalar.

Copie a url e por terminal faça o download (troque a url pela versão que deseja baixar, recomendo a última):

wget http://download.tangent.org/libmemcached-0.37.tar.gz

Descompacte o arquivo que você acabou de baixar (troque o nome do arquivo pela versão que você baixou):

tar -xzf libmemcached-0.37.tar.gz

Acesse a pasta do arquivo descompactado, configure e execute o make e o make install para concluir a instalação da libmemcached. Provavelmente será necessário executar o comando make install com permissão root.

cd libmemcached-0.37
./configure
make
sudo make install

Após executar os comandos acima (eles podem levar um tempinho cada um) a dependência (libnmemcached) deve estar instalada no seu computador, agora é instalar o memcached com o pecl:

pecl install memcached

O pecl não manipula o php.ini para executar a extensão, então você precisa adicionar a linha abaixo ao seu php.ini para que a extensão nova extensão seja carregada.

extension=memcache.so

No Ubuntu o php.ini normalmente fica em /etc/php/apache2/php.ini, se você não sabe onde fica o php.ini no seu Ubuntu pode utilizar o comando abaixo para localizar o arquivo:

find / -name php.ini

 

Agora é só reinicar o seu Apache:

sudo service apache2 restart

 

Pronto, o memcached está instalado e pronto para usar no seu servidor, você está pronto para melhorar a performance das suas aplicações em PHP utilizando o memcache. 😀

Dúvidas, críticas e sugestões nos comentários.

 

Referências

Install php memcached on Ubuntu

How to forge – php memcached

Como instalar o nodeJs no Ubuntu

Estou a algum tempo estudando e desenvolvendo algumas coisas com Node.js aqui no iG, resolvi compartilhar com vocês a configuração e instalação dos pacotes do Node no Ubuntu.

Instalando o NodeJS com git

Agora o NodeJS tem um pacote para instalação via apt-get, então não é necessário realizar o processo por Git (mas ainda funciona).

Para instalar o último pacote que está no git, você precisará de alguns pacotes. Se eles não estiverem instalados instale:

sudo apt-get install g++ curl libssl-dev apache2-utils
sudo apt-get install git-core

Agora vamos fazer o clone do Node para instalação:

git clone git://github.com/ry/node.git
cd node
./configure
make
sudo make install

Instalando o NodeJS com o gerenciador de pacote Ubuntu

Agora o NodeJS tem um pacote no Ubuntu, então não é necessário fazer o processo anterior (baixar o pacote do Git e instalar), o processo ficou mais simples:

sudo apt-get install nodejs node

Atenção: se você precisa de alguma versão específica do Node, precisa instalar através do processo de pegar do repositório.

Com isso o node vai ser instalado no seu Ubuntu, você pode verificar a instalação digitando:

node --version

 

Instalando o NPM

O NPM é um gerenciador de pacotes para o Node, sua instalação é bastante simples:

curl http://npmjs.org/install.sh | sh

E para instalar um pacote com o npm você só precisa digitar no terminal "npm nome_do_pacote install", no exemplo abaixo irei instalar o express:

npm install express

Para fazer seu nodejs funcionar com o MongoDB estou usando o Mongoose, a instação também é com o npm:

 

npm install mongoose

Pronto, agora você tem o NodeJS rodando, dúvidas e sugestões nos comentários! 🙂