Arquivo da categoria: Artigos Técnicos

Identificação do país com Mod GeoIp

Fomos abordados por um utilizador que pretendia detectar no site, o país de proveniência dos utilizadores. Embora seja possivel utilizar várias bases de dados (gratuitas e comerciais), importá-las para uma tabela de MySQL ou Postgres, efectuar um query, não é um sistema prático.

Dessa forma para facilitar, instalámos o mod_geoip da Maxmind, que permite a consulta rápida através de variáveis de ambiente do código e do nome do país. Por exemplo em PHP ao aceder com um ip português basta aceder às seguintes variáveis:

$_SERVER[“GEOIP_CONTINENT_CODE”]  // EU
$_SERVER[“GEOIP_COUNTRY_CODE”]      // PT
$_SERVER[“GEOIP_COUNTRY_NAME”]      // Portugal

e em 99% dos casos iremos obter a informação comentada (EU, PT, Portugal). Esta funcionalidade tem de ser activada conta a conta, portanto se também pretender utilizar basta contactar-nos.

Deep

O comndo deep é uma daquelas ferramentas tipo canivete suiço, pequeno, multifunções e extremamente prático. Não é um verdadeiro binário, porque é um Perl script, mas na sua utilização típica a performance não é um factor importante. Basicamente serve para efectuar operações sobre uma árvore de ficheiros em cascata (age sobre os ficheiros da directoria actual, ficheiros em subdirectorias e assim sucessivamente.

Suporta várias operações, pesquisa, substituição, chmod, comando, etc… as funcionalidades que mais usamos são a pesquisa e a substituição.

Um exemplo para ilustrar o poder do deep. Vamos supor que temos um site que tem algumas centenas de ficheiros html e é necessário substituir o email de contacto e não fazemos ideia de todos os ficheiros onde poderá estar. Simples, basta irmos à raiz do site e dar o comando:

deep find 'emailparasubstituir@dominio.com' '*.html' --case=0

e voilá, temos os ficheiros e linhas em que está o email de contacto para substituir. Vamos agora supor que temos isto em dezenas de ficheiros, temos a possibilidade de abrir um por um, fazer a alteração e gravar (nada divertido) ou então:

deep replace 'emailparasubstituir@dominio.com' 'novoemail@dominio.com' '*.html' --case=0

e já está, podemos passar o resto do dia a fazer coisas realmente produtivas. Outra utilização típica é quando recebemos um projecto com as quebras de linhas em Windows CR LF e queremos abrir o ficheiro em Unix LF:

deep replace "\r" "" "*.html *.css *.js" --literal=0

e está a conversão feita, simples não?

Este é um daqueles comandos que adoramos em UNIX/Linux simples mas extremamente poderoso.

Open source Vs software proprietário na web

Disclaimer: esta é uma partilha de uma opinião (bastante) tendenciosa a favor das opções open source e orientada para a web quer a nivel de ferramentas de desenvolvimento quer a nivel servidor. Diariamente utilizamos intensivamente, FreeBSD, Apache, MySQL, PHP e Eclipse (editor), entre outros fantásticos softwares open source. Como é óbvio também já deparamos com vários projectos Microsoft (99% de quota no software proprietário)

Hoje em dia, para a web cada vez faz menos sentido correr sistemas proprietários. Vários sites “grandes” em Portugal, ex: Chip7, Negocios deixaram de correr ASP da Microsoft para utilizarem PHP, outros são open-source desde o início SAPO (Perl, PHP, etc), Wikipedia, etc.

O que levou estas empresas a adoptarem o open-source e algumas mesmo a utilizarem software open-source no centro de todos os esforços online?

Custo: um servidor com sistema proprietário, normalmente baseado Microsoft, é necessário pagar várias licensas, desde logo do sistema operativo em si, servidor web, servidor de base de dados, upgrades, etc. Ao longo dos anos e conforme o número de servidores falamos na ordem dos milhares de euros. Num sistema open-source tudo isto é grátis e livre.

Flexibilidade: no mundo open source a escolha é tremenda, desde o sistema operativo, à linguagem, ao servidor de base de dados, ao editor, tudo mas mesmo tudo pode ser escolhido a partir de uma série de opções, customizado, ou mesmo alterado em função das nossas necessidades / preferências. Isto é algo que oferece uma capacidade fantástica de utilizar as melhores ferramentas, as mais produtivas para determinado projecto.

Base de utilizadores: a chamada comunidade open source já desde há uns anos que ultrapassou a massa crítica necessária e hoje em dia é uma comunidade com uma dimensão brutal quer em número quer em actividade. Isto, aliado ao facto de a cultura ser a de partilha e de intercambio de conhecimento e de linhas de código, fazem do desenvolvimente em open source uma actividade muito agradável visto ser possivel encontrar exemplos, documentação e código a implementar determinada funcionalidade rápidamente. Em Microsoft por vezes é um pesadelo implementar determinada funcionalidade, devido ao espirito fechado só se encontram dll pagos em que não é possivel analizar/alterar o funcionamento interno às nossas necessidades.

Performance: na sua configuração mais típica com o servidor Apache a correr PHP sobre uma base de dados em MySQL “out of the box” temos um conjunto muito sólido e que normalmente serve a maioria dos utilizadores em termos de performance, estabilidade e escalabilidade. E na realidade o mesmo se passa no mundo Windows. No entanto mais uma vez temos vantagens, especialmente quando queremos tirar todo o partido do hardware. O software disponível é principalmente escrito em C que é reconhecida como uma linguagem extremamente rápida. Levanta-se a questão de PHP ser uma linguagem interpretada que é naturalmente mais lenta do que compilada, mas é perfeitamente contornável, desde logo com software de compilação e cache que trata de manter os ficheiros compilados em memória para a próxima execução. Podemos optar por outras ferramentas, que possam ser compiladas em detrimento de PHP, podemos fazer cache em memória com o memcache, reverse proxy, etc…  podemos escrever um módulo em C para Apache e temos uma velocidade prodigiosa. Mais uma vez temos um vastissimo leque de opções em que podemos balancear velocidade e dificuldade de desenvolvimento.

Existe também uma natural vantagem em correr em sistemas baseados em Unix desde logo pelo facto de não forçarem a correr constantemente um ambiente gráfico que queimam bastantes recursos como Windows. Para expremer todo o potencial do servidor podemos (devemos) compilar todo o software (incluindo o próprio sistema operativo) optimizado para o processador que temos, algo que não é possivel em Windows, exactamente por não termos acesso aos ficheiros fontes mas apenas aos binários.

Típicamente e numa experiência puramente pessoal e empírica derivada de vários projectos um site “pesado” corre melhor e mais rápido em Open Source que em plataforma Windows. Se a plataforma for devidamente optimizada muito melhor mesmo, infelizmente pontualmente já vi assisti também (pontualmente felizmente) a sistemas open source de tal forma mal geridos que os sites/web apps sofriam uma quebra no desempenho.

Logicamente coloca-se a questão, se o software Open Source na vertente web está tecnologicamente maduro porque é que ainda existem tantos sites a funcionarem sobre Windows?

A resposta não é simples. Desde logo por uma questão “legacy” e porventura aquela que faz mais sentido. Se tivermos um site/web app implementado, a funcionar como desejado e somos proactivos na tecnologia x faz sentido aguardar o máximo a mudança. Existem outras multiplas razões, umas mais evidentes outras mais obscuras. Como se sabe qualquer mudança implica sair de uma zona de conforto e verifica-se por vezes que os responsáveis pelos sites são muito resistentes à mudança.

Curiosamente a maior parte das justificações na manutenção ou adopção de sistemas Microsoft baseiam-se exactamente nos pontos fortes do Open Source. Desde logo a tremenda base de utilizadores, scripts e software disponível tem como consequência lógica a (co-)existência de soluções e “developers” muito bons, com outros medianos e outros infelizmente maus. É necessário algum esforço para testar soluções e “developers” para obter bons resultados. A própria flexibilidade, na medida em que implementa a velha máxima de Unix “Existem várias maneiras de esfolar um gato” (tradução livre), também gera receios e indecisões principalmente quando existem vícios antigos e uma certa pré-formatação para a conformidade.

O próprio custo, é incrivel mas existe o preconceito que se algo for caro é porque é naturalmente bom e se for grátis é porque não presta… então os decisores optam pelo sistema pago, porque se algo correr mal se sentem mais protegidos: “Fizemos tudo o que podiamos, até gastamos x no sistema que agora não funciona”. Quando por vezes o que faz falta é um pouco mais de empenho… Existe também o receio do suporte, o que até é legitimo se pensarmos que tipicamente o suporte Open Source é feito informalmente sem interesse económico (leia-se vinculação) em fóruns, emails, etc. Mas esta também é uma falsa questão, visto que cada vez mais existem empresas e técnicos especializados a dar suporte profissional para sistemas Open Source.

Desta forma e sem entrar em discussões éticas, pormenores de licensas, fazemos uma opção consciente, uma opção clara pelos sistemas Open Source pelas razões práticas que acabamos de expor. Assumimos abertamente um compromisso em apresentar as melhores soluções Open Source quer a nivel de alojamento quer de desenvolvimento web que conhecemos. Iremos também na medida do possivel apoiar os projectos que utilizamos diariamente, retribuir para a melhoria constante do(s) software(s) sobre o quais funcionamos. Por outro lado as solução Microsoft serão progressivamente retiradas do site, aliás temos vindo a reduzir a oferta de serviços (neste momento tão pouco aceitamos novas contas) sobre Microsoft.

Temos a convicção que este é o melhor caminho.

FFmpeg

Nos dias que correm o website típico cada vez mais recorre a fortes elementos multimédia, entre esses elementos destaca-se a utilização de video. A forma de eleição de integrar video num website é a utilização do AdobeFlash e do formato nativo para video em Flash os FLVs.

Tipicamente trabalhamos o flv com o próprio programa da Adobe, mas por vezes é necessário trabalhar a nivel do servidor e aí temos uma ferramenta comando de linha que brilha, o FFmpeg.

Para obter informações acerca de um ficheiro, dimensões, fps, codec, som, etc:


ffmpeg -i movie.flv

Input #0, flv, from 'movie.flv':
Duration: 00:01:24.85, start: 0.000000, bitrate: 64 kb/s
Stream #0.0: Video: flv, yuv420p, 320x240, 29.92 tb(r)
Stream #0.1: Audio: mp3, 22050 Hz, mono, 64 kb/s

Aqui está toda a informação relativa ao flv. A duração em tempo é de 1m24.85s, é um flv com 320px por 240px e 29.92fps. O som é um encoding em mp3 a 64Kbits.

Agora um exemplo de algo um pouco mais complicado. Vamos gerar um thumbnail em jpeg do flv, para usar por exemplo numa página que linka para o flv.


ffmpeg -itsoffset -4 -i movie.flv -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 movie.jpg

E depois de algum output temos na directoria um jpeg chamado movie.jpg com 320px por 240px, correspondente à primeira frame do segundo 4 do filme.

E isto nem sequer é arranhar as potencialidades do FFmpeg. Também devemos ter presente que além de flv trabalha com praticamente todos os tipos de formato video, avi, mpeg, wmv, etc… portanto será possivel replicar estes exemplos em ficheiros de outros formatos.

Manipulação de imagens na linha de comandos

Fazer o resize de várias imagens em simultâneo na linha de comandos? Nada mais fácil, o ImageMagick está instalado no servidor exactamente para nos ajudar nestas tarefas. O ImageMagick é um poderoso software de manipulação de imagens via linha de comandos.

Para converter todas os jpegs de uma directoria para 1024 pixels de largura (a altura é calculada proporcionalmente) com 80% de qualidade basta:

for i in `ls *.jpg`; do convert -resize 1024 -quality 80 $i small_$i; done

Se quisermos substituir as imagens originais pelas redimensionadas:

for i in `ls *.jpg`; do convert -resize 1024 -quality 80 $i $i; done

Alterar link em swf

Nesta semana foi necessário alterar rapidamente um link de um swf de um cliente, o processo normal é obviamente abrir o ficheiro fla com o Adobe Flash, alterar e exportar um novo swf. A questão é que o fla não estava disponível.

Este é o cenário ideal para utilizar o flasm que é um pequeno utilitário que permite descompilar/compilar o bytecode do actionscript. Trocado por miúdos, basicamente o processo é:


flasm -d file.swf > file.flm
edit fleshlight.flm
flasm -a fleshlight.flm

O flasm está disponível no servidor.