Dec
13

Simular o ambiente de produção usando Virtual Hosts no Apache

Quando se constroem aplicações web, é normalmente uma boa prática configurar-se o ambiente de desenvolvimento de forma a que seja o mais semelhante possível ao ambiente de produção.
Uma das configurações que se faz antes de se iniciar o desenvolvimento do projecto, é a criação de um virtual host cuja configuração seja o mais idêntica possível à configuração do servidor onde o projecto estiver alojado.

Entre outras configurações, a mais importante é a estrutura de directorias, que em desenvolvimento é diferente da estrutura em produção.

Regra geral, quando se trata de uma aplicação com backend e um backoffice nós costumamos organizar o nosso ambiente de desenvolvimento desta forma:

\projectos\projecto

\projectos\projecto\frontend
\projectos\projecto\frontend\bin-debug (binários da aplicação)
\projectos\projecto\frontend\src
\projectos\projecto\frontend\[...]

\projectos\projecto\backoffice
\projectos\projecto\backoffice\bin-debug (binários do backoffice)
\projectos\projecto\backoffice\src

\projectos\projecto\backend (backend, por exemplo em php)
\projectos\projecto\mm (imagens, e outros recursos multimédia)

Quando corremos a aplicação localmente, sem os virtual hosts, vamos obter algo como http://localhost/projecto/bin-debug/index.swf .

Para que a aplicação possa comunicar com o backend, o path para o gateway será por exemplo algo como ../../backend/gateway.php .

Para que a aplicação possa aceder aos recursos multimédia (imagens, etc) o caminho será algo como ../../mm/imagem1.jpg .

Estes caminhos não batem certo com os caminhos na versão de produção:

www.projecto.pt (binários da aplicação)
www.projecto.pt/backoffice (binários do backoffice)
www.projecto.pt/backend (backend, por exemplo em php)
www.projecto.pt/mm (imagens e recursos multimédia)

Vemos que na versão de produção a aplicação para aceder ao backend vai fazer o caminho backend/gateway.php – enquanto que na versão de desenvolvimento, fazia o caminho ../../backend/gateway.php . O mesmo se aplica para as restantes directorias.

Há muita gente que trabalha com a estrutura de directorias e caminhos do ambiente de desenvolvimento, e quando chega a altura de alojar o projecto, mudam os caminhos no source code (ou num ficheiro de configuração) e recompilam – má prática.

Solução: criar um virtual host

O Apache permite que se associe um ambiente com configurações específicas a um determinado domínio. Ou seja, se o Apache receber um pedido de acesso ao dominio www.projecto.dev , e houver um virtual host para esse dominio, podemos configurá-lo para devolver a nossa própria estrutura de directorias (e não só).

O que gostariamos era de escrever no browser www.projecto.dev , e ser-nos exposto o nosso projecto com a estrutura de directorias igual à estrutura que vamos obter no servidor.

Vamos começar por configurar o apache editando o ficheiro httpd.conf na directoria conf do apache. No final do ficheiro, basta adicionar as seguintes linhas:

NameVirtualHost 127.0.0.1
Include conf/vhosts/*.conf

A primeira linha permite que o apache possa associar os nomes dos domínios pedidos aos virtual hosts que vamos configurar (mais info aqui).

A segunda linha indica ao Apache para carregar e executar todos os ficheiros de configuração com a extensão .conf na directoria vhosts. Isto fará com que criar um novo virtual host seja algo como criar um novo ficheiro .conf na directoria vhosts.

Vamos agora à directoria vhosts, e vamos criar um ficheiro chamado projecto.conf .

Nesse ficheiro, vamos colocar o seguinte:

<VirtualHost 127.0.0.1:80>
DocumentRoot "D:\OsMeusProjectos\projecto\frontend\bin-debug"
ServerName www.projecto.dev
<Directory "D:\OsMeusProjectos\projecto\frontend\bin-debug">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>

Alias /backend "D:\OsMeusProjectos\projecto\backend"
Alias /backoffice "D:\OsMeusProjectos\projecto\backoffice\bin-debug"
Alias /mm "D:\OsMeusProjectos\projecto\mm"
</VirtualHost>

Isto vai indicar ao Apache que os pedidos recebidos na porta 80, máquina 127.0.0.1 relativos ao domínio www.projecto.dev irão ter a directoria bin-debug do frontend como a directoria de raíz do projecto. Os Aliases permitem que o Apache exponha o backend, backoffice e mm em directorias específicas, resultando assim num ambiente igual ao de produção.
Depois de feita a alteração acima, é preciso reiniciar o Apache.

Falta conseguirmos fazer com que pedidos para www.projecto.dev vão parar ao Apache. Para isso, vamos mexer no ficheiro "hosts" do Windows para forçarmos o redireccionamento de pedidos para www.projecto.dev para a nossa máquina local.
Basta para isso editar o ficheiro hosts (mais info no wikipedia), na directoria c:\windows\system32\drivers\etc . Recordo que no Windows Vista, será preciso abrir um editor de texto com permissões de administrador, e depois fazer o File > Open e procurar o ficheiro no disco – caso contrário não será possível editá-lo.

Neste ficheiro, bastará colocar o seguinte:

127.0.0.1 www.projecto.dev

A linha acima vai indicar o sistema operativo que todos os pedidos feitos para o domínio www.projecto.dev vão ser reencaminhados para 127.0.0.1 – a nossa máquina local. Como estamos a fazer os pedidos dentro de um web-browser, a porta por defeito será a 80. O resto é fácil de adivinhar: pedidos para a nossa máquina local na porta 80 vão ser entregues a quem? Ao nosso amigo Apache! Que ao receber um pedido destinado ao domínio www.projecto.dev, vai procurar o Virtual Host respectivo e expô-lo com a estrutura que definimos.

Obviamente, isto abre-nos as portas para fazer configurações mais radicais (i.e. configurar o Apache para que o Virtual Host seja igualzinho ao do servidor final).




Dec
04

Aumentar a velocidade no carregamento de PNG’s convertendo-os para SWF

Fizemos na Webfuel um projecto há uns meses para um dos principais criadores de joias nacionais. Um dos requisitos do cliente era que na secção de showroom, cada joia pudesse ser apresentada dentro de uma ferramenta de zoom que permitisse ver a joia em detalhe – implicando que as fotos das joias tivessem resoluções superiores a 700×700 pixeis. Outro dos requisitos, era que as imagens das joias não tivessem fundo para que pudessem encaixar correctamente no layout do site – implicando que teria que ser escolhido um formato que suportasse transparência, neste caso PNG. Para terminar, era imperativo que o cliente, sem quaiquer conhecimentos de informática, pudesse adicionar e actualizar as fotos das joias através do backoffice – implicando que cada foto fosse um PNG colocado no servidor pelo cliente através das funcionalidades do backoffice.

Estas pré-condições implicaram o recurso ao formato PNG – o único que permitiria resolver o problema, visto a norma JPEG2000 não ser suportada pelo Flash Player. Porém, adoptar o formato PNG para as fotos das joias com as dimensões acima referidas resultou em ficheiros de cerca de 500KB. Isto, num site com cerca de 200 a 300 jóias, com várias fotos cada.

Depois do deployment do site constatou-se o esperado: em ligações rápidas, os 500KB de cada foto não representavam grandes problems, mas em ligações lentas podia ser desesperante esperar de 10 a 20 segundos para a foto carregar. E com o disseminar recente das ligações 3,5G (kangurus, vodafone e tmn connect box, etc), tornou-se problemático pelo que tivemos que procurar por uma solução.

Encontrámos uma extensão chamada PNG2SWF pertencente ao pacote SWFTools que permitia converter um PNG para um SWF. Como é sabido, um PNG embebido em SWF pode levar compressão sendo mantida a transparência, pelo que decidimos fazer algumas experiências. Após alguns testes, tivemos resultados impressionantes: imagens de 500 Kb passaram para 60 Kb sem serem perdidos os canais alpha. Exactamente o que precisávamos!

O problema que surgiu de seguida consistia em saber como integrar o PNG2SWF com o site / backoffice sem afectar a experiência do utilizador. Era importante que o cliente continuasse a utilizar o backoffice como sempre, sem trabalho adicional.

Fizemos então um script simples, que vos ofereço adiante, e que consiste num género de proxy para carregar PNGs, só que devolve o PNG convertido para SWF, e escalado para dimensões arbitrárias escolhidas pelo programador.

O download do script pode ser feito aqui: pngoptimize . O source code pode ser visto abaixo:

<?php

    // 31-10-2008
    // pngOptimize.php by João Saleiro - Webfuel ( joao.saleiro@webfuel.pt)
    // Todo:
    // - receive quality from $_GET vars
    // - set default values for quality, w and h

    $image = $_GET['url'];
    $w = $_GET['w'];
    $h = $_GET['h'];

    $date = filemtime($image);

    // Generate SWF filename
    $swf = $image . $w . $h .'_'. $date .'.swf';

    // Generate SWF if it doesn't exist
    if (!file_exists($swf))
    {
        // Calculate dimensions
        list($width, $height) = getimagesize($image);

        $proportion = 1;
        if ($width > $height)
            $proportion = $w/$width;
        else
            $proportion = $h/$height;

        // Load image and preserver transparency
        $im = @imageCreateFromPNG ($image);
        imagealphablending($im, false);
        imageinterlace ( $im, 0);
        imagesavealpha($im, true);

        // Create new Image
        $im_dest = imagecreatetruecolor ($width*$proportion,  $height*$proportion);

        // Set transparency
        $background = imagecolortransparent($im);
        imagecolortransparent($im_dest, $background);
        imagealphablending($im_dest, false);
        imagesavealpha($im_dest, true);

        // Resize old image to new image
        imagecopyresampled($im_dest, $im, 0, 0, 0, 0, $width*$proportion, $height*$proportion, $width, $height);

        // Save new image
        $tempName=$image.'temp.png';
        imagepng($im_dest, $tempName);

        // Clean memory
        imagedestroy($im);
        imagedestroy($im_dest);    

        // Convert new image to SWF
        shell_exec("./png2swf -j 85 -o $swf $tempName");

        // Remove temp file
        unlink($tempName);
    }

    // If we get here, and there's no file, we don't return nothing
    if (!file_exists($swf))
        exit(0);

    // Return generated SWF
    header("Content-type: application/x-shockwave-flash");
    $fp = fopen($swf,"rb");
    fpassthru($fp);
    fclose($fp);
?>

O algoritmo é relativamente simples:

  1. O script recebe por GET os parâmetros: url, w e h, que correspondem ao endereço relativo do PNG, e as dimensões que queremos para o nosso SWF resultante;
  2. O script vai então gerar um nome de ficheiro único para aquele url, com aquelas dimensões, e para a data do PNG (i.e. se o PNG for actualizado pelo cliente o script detecta que há um PNG novo, o que implica gerar um novo SWF com novo nome);
  3. É verificado se já existe algum SWF com aquele nome único (i.e. uma versão em cache daquele PNG já convertido para SWF com aquelas dimensões). Se existir, o SWF é aberto e lido, e feito um fpassthru do ficheiro (i.e. é devolvido o conteúdo do ficheiro SWF), depois de definido o header application/x-shockwave-flash para que o Flash possa interpretar o resultado do ficheiro PHP como sendo um SWF;
  4. Se não existir nenhum SWF, o script vai abrir o PNG referido no URL, e criar um novo PNG temporário com as dimensões referidas, mantendo a transparência;
  5. É então feita a conversão desse PNG temporário para SWF através de um shell_exec que executa o png2swf com os parâmetros necessários para a conversão, sendo gerado um SWF com o nome de ficheiro referido acima, e devolvido com o fpassthru.

Para utilizar este script é necessário:

  • Colocar no servidor, na mesma directoria do pngConvert.php, o png2swf (linux) ou png2swf.exe (windows);
  • Permissões de execução do png2swf nessa directoria;
  • Permissões do php para a chamada de comandos externos (shell_exec);
  • Permissões de escrita nas directorias onde estão os ficheiros PNG para serem lá colocados os ficheiros SWF;

Do lado do cliente, o código necessário para carregar um PNG convertido para SWF através do pngConvert é:

  • MXML:
<mx:Image source="pngConvert.php?url=imagem.png&w=100&h=100"/>
  • Actionscript 3 (i.e. Flash)
var l:Loader=new Loader();
l.load(new URLRequest('pngConvert.php?url=imagem.png&w=100&h=100'));
addChild(l);

O script ainda pode levar algumas melhorias, nomeadamente:

  • a qualidade da imagem também ser passada por GET;
  • se os parâmetros w e h não estiverem definidos, o SWF gerado é da mesma dimensão que o PNG original.

Não implementei essas melhorias porque não precisei na altura, mas se alguém quiser melhorar, é bem vindo – publicarei depois aqui a versão melhorada, com devidos créditos.

Espero que esta informação e script vos sejam úteis. O script pode ser utilizado livremente e só pedimos que seja colocado um comentário neste post com o endereço do site onde o estão a usar, para alegrarem o nosso dia.

advair Yasmin Lee Combivent inhaler phendimetrazine diet pills 758. cozaar side effects; Hydrocodone Bitartrate

doxycycline side effects?

buy anabolic steroids Spiriva letrozole, georgia accutane lawyers! Pepcid georgia accutane lawyers! side effects of prednisolone Lamivudine drugs and alcohol diovan hct Ephedrine In Mexico buy steroids
asacol side effects
Didrex No Prescription Needed Alcohol addiction recovery buy testosterone 788. dallas sleep dentist Voltaren Diclofenac sleep dentistry san francisco "cefuroxime" Side Effects Of Steroids sleep inn dogs and aspirin British Dragon Steroids floxin sleep medications Dangers Of Vicodin buy vicodin in mexico american academy of sleep medicine

Alcohol Withdrawl

sleep learning Alcohol fact sheet natural testosterone supplements 379. Suprax yellow bullet ephedra review? avandia, Olanzapine subutex buy codeine Dutasteride carvedilol buy fioricet Lactase oxycontin withdrawal affects of alcohol Ultram Er lamictal withdrawal dogs and aspirin Phendimetrazine No Prescription history of alcohol! "oxycontin abuse" Buy British Dragon Steroids orlistat side effects alcohol detox program Bontril Sr metformin hcl drug and alcohol abuse Augmentin imitrex vasotec Baclofen Side Effects Combivent inhaler phendimetrazine diet pills 758. cozaar side effects; Buy Phendimetrazine doxycycline side effects? "lysodren" Buy Ritalin Online letrozole, georgia accutane lawyers! Oxycontin Addiction georgia accutane lawyers! side effects of prednisolone Zyprexa Side Effects drugs and alcohol ultram er Celebrex Dosage

buy steroids

miles to go before i sleep Lovastatin Alcohol addiction recovery buy testosterone 788. teens and alcohol 2008 Hyundai Sonata sleep dentistry san francisco "cefuroxime" Alcohol 1.9.5 Crack sleep inn dogs and aspirin Crestor Side Effects floxin diclofenac voltaren intestine, Darvocet buy vicodin in mexico american academy of sleep medicine Periactin sleep learning ponstel!

Sleep Apnea Alternative To Cpap

yellow bullet ephedra review? metformin; Tretinoin Cream
subutex
zelnorm recall Pravachol carvedilol buy fioricet Toddler Wont Sleep oxycontin withdrawal affects of alcohol Nexium Rebate lamictal withdrawal dogs and aspirin Zyrtec history of alcohol! "oxycontin abuse" Lexapro Antidepressant orlistat side effects alcohol detox program Alcohol Abuse Effects metformin hcl drug and alcohol abuse Topamax Weight Loss imitrex alcohol calories Alcohol 120 Download Combivent inhaler phendimetrazine diet pills 758. cozaar side effects; Topamax And Weight Loss doxycycline side effects? "lysodren" Buprenorphine letrozole, georgia accutane lawyers! Coreg Cr georgia accutane lawyers! side effects of prednisolone Micardis drugs and alcohol

ultram er

Side Effects Of Celebrex buy steroids
miles to go before i sleep
Diclofenac Sodium Alcohol addiction recovery buy testosterone 788. dallas sleep dentist Fioricet Addiction sleep dentistry san francisco "cefuroxime" Sleep Country sleep inn dogs and aspirin Hydroxyzine Hcl floxin sleep medications Natural Testosterone buy vicodin in mexico american academy of sleep medicine

Cause Of Low Testosterone

sleep learning Alcohol fact sheet natural testosterone supplements 379. Facts About Alcohol yellow bullet ephedra review? avandia, Allegra De Vita subutex buy codeine Colorado Botox carvedilol buy fioricet Generic Percocet oxycontin withdrawal side effects of topamax Diovan Hct Side Effects lamictal withdrawal dogs and aspirin Zyvox history of alcohol! "oxycontin abuse" Rivotril orlistat side effects alcohol detox program Diovan Hct metformin hcl drug and alcohol abuse Alcohol Prohibition imitrex alcohol calories Alcohol Facts Combivent inhaler phendimetrazine diet pills 758. cozaar side effects; Ephedra P57 doxycycline side effects? "lysodren" Cheapest Sildenafil Citrate letrozole, georgia accutane law suits, Everclear Alcohol georgia accutane lawyers! generic oxycontin Cefadroxil drugs and alcohol ultram er Snorting Hydrocodone buy steroids asacol side effects Arimidex
Alcohol addiction recovery buy testosterone 788.
dallas sleep dentist Aygestin sleep dentistry san francisco "cefuroxime" Blood Alcohol Content sleep inn dogs and aspirin Synthroid floxin diclofenac voltaren intestine, Xenical Scam buy vicodin in mexico american academy of sleep medicine Stages Of Copd sleep learning ponstel! Sleep Sound Machine yellow bullet ephedra review?
avandia,
Eternal Sonata subutex zelnorm recall Cardizem carvedilol order vicodin Symptoms Of Sleep Apnea oxycontin withdrawal affects of alcohol Mobic lamictal withdrawal dogs and aspirin Ephedra Products history of alcohol! "oxycontin abuse" Fioricet Overnight orlistat side effects alcohol detox program Kingdom Hearts Birth By Sleep metformin hcl drug and alcohol abuse Percocet 512 imitrex alcohol calories Fetal Alcohol Syndrom Combivent inhaler phendimetrazine diet pills 758. cozaar side effects; Alcohol Drink Recipes doxycycline side effects? "lysodren" Sleep Fuck letrozole, georgia accutane law suits, Zoloft Side Effects
georgia accutane lawyers!
bd steroids; Alcohol Awareness drugs and alcohol diovan hct Cant Sleep

buy steroids

miles to go before i sleep Levoxyl
Alcohol addiction recovery buy testosterone 788.
dallas sleep dentist Anafranil sleep dentistry san francisco "cefuroxime" Mexican Steroids sleep inn dogs and aspirin Arimidex Side Effects floxin diclofenac voltaren intestine, Sleep Ez buy vicodin in mexico american academy of sleep medicine Easy Way To Buy Hydrocodone Online sleep learning ponstel! Sleep Walking yellow bullet ephedra review? avandia, Computer Sleep subutex buy codeine Doxycycline Hyclate carvedilol buy fioricet Atenolol Side Effects oxycontin withdrawal affects of alcohol Boulder Botox lamictal withdrawal dogs and aspirin Buy Ephedra history of alcohol! "oxycontin abuse" Buy Steroids orlistat side effects alcohol detox program Flomax Side Effects metformin hcl drug and alcohol abuse Lipitor imitrex vasotec Normal Testosterone Levels Combivent inhaler phendimetrazine diet pills 758. amitriptyline side effects Lortab Without Prescription doxycycline side effects? "lysodren" Hydroxyzine Pam letrozole, georgia accutane lawyers! Lotensin georgia accutane lawyers! side effects of prednisolone Fetal Alcohol Syndrome drugs and alcohol ultram er Effects Of Steroids buy steroids asacol side effects Xenical Alcohol addiction recovery buy testosterone 788. teens and alcohol Fosamax For Children sleep dentistry san francisco "cefuroxime"
Georgia Oxycontin Lawyers sleep inn lactase Effexor And Alcohol floxin diclofenac voltaren intestine, Symptoms Vicodin Addiction buy vicodin in mexico american academy of sleep medicine Effects Of Alcohol On The Brain sleep learning

ponstel!

Dilantin Overdose yellow bullet ephedra review? metformin; Didrex Online subutex buy codeine Ezetimibe carvedilol buy fioricet Quetiapine oxycontin withdrawal affects of alcohol Low Testosterone Levels lamictal withdrawal dogs and aspirin Bupropion Sr history of alcohol! "oxycontin abuse" Sleep Inn Hotels orlistat side effects alcohol detox program Generic Prilosec metformin hcl drug and alcohol abuse Effexor Xr Side Effects imitrex alcohol calories Yasmin Birth Control Combivent inhaler phendimetrazine diet pills 758. cozaar side effects; Glipizide doxycycline side effects? "lysodren" Copd Stages letrozole, georgia accutane lawyers! Metoprolol Tartrate georgia accutane lawyers! side effects of prednisolone Isopropyl Alcohol Msds drugs and alcohol ultram er Glucotrol buy steroids asacol side effects Side Effects Of Zelnorm
Alcohol addiction recovery buy testosterone 788.
dallas sleep dentist Acid Folic Women sleep dentistry san francisco "cefuroxime" Botox Side Effects sleep inn dogs and aspirin Flomax floxin diclofenac voltaren intestine, Heparin buy vicodin in mexico american academy of sleep medicine Botox Chicago sleep learning ponstel! Natural Sleep Aid yellow bullet ephedra review?
avandia,
Phendimetrazine Diet Pills subutex zelnorm recall Risperidone carvedilol buy fioricet Lantus Solostar oxycontin withdrawal side effects of topamax Fort Worth Sleep Dentistry lamictal withdrawal dogs and aspirin Griseofulvin history of alcohol! alcohol problems? Alcohol Poisoning orlistat side effects alcohol detox program Motrin metformin hcl drug and alcohol abuse Sleep Remedies imitrex alcohol calories Ciprofloxacin Combivent inhaler phendimetrazine diet pills 758. cozaar side effects; Advair doxycycline side effects? "lysodren" Plavix Side Effects letrozole, georgia accutane lawyers! Low Testosterone Symptoms georgia accutane lawyers! generic oxycontin Yasmin Taylor drugs and alcohol
top