Processamento matemático eficiente usando o Scilab através de PHP

Juntando Web e ciência por um mundo mais inteligente

Uma grande quantidade de dados científicos está disponível gratuitamente na Internet. Combine isso com ferramentas de software livre para processar os dados de maneira eficiente e qualquer um pode experimentar, explorar e compartilhar seus resultados com o resto da comunidade. Veja uma abordagem para a ciência guiada pela comunidade através da conexão de PHP e do Scilab.

Daniel J Lewis, Web Developer & Computer Scientist

Daniel LewisDaniel Lewis é cientista da computação profissional, desenvolvedor Web e engenheiro de conhecimentos na Sift Media no Reino Unido. Ele também trabalhou com empresas como a OpenLink Software, em tarefas de evangelismo tecnológico, e a The Open University, em aplicativos da Web Semântica Social. Suas linguagens de programação preferidas incluem Java, Ruby e PHP; ele tem experiência acadêmica em MATLAB, Scilab e Octave. É possível entrar em contato com ele através do e-mail daniel@vanirsystems.com



06/Abr/2010

Linguagens de script como Ruby, Pythom e PHP capacitam o desenvolvimento de Web do lado do servidor nos dias de hoje. Estas linguagens são muito boas, pois possibilitam construir Web sites de forma rápida e fácil. No entanto, seu ponto fraco é a sua falta de aptidão com algoritmos complicados, como aqueles encontrados na matemática e nas ciências.

Acrônimos usados com frequência

  • GUI: Graphical user interface
  • HTML: Hypertext Markup Language
  • HTTP: Hypertext Transfer Protocol
  • UI: User interface
  • XHTML: Extensible HTML

Cada vez mais dados científicos aparecem na Web — frequentemente licenciados como gratuitos ou livres. Franqueza, aceitação e disponibilidade resultam em P&D colaborativo. Pessoas de todo o mundo podem localizar padrões nos seus dados, e também nos dados deles mesmos, aumentando o entendimento da humanidade sobre os segredos da ciência.

A ciência da computação frequentemente requer processamentos pesados e sistemas potentes. Esses sistemas são frequentemente difíceis de serem encontrados — particularmente na Web, onde estão todos os dados científicos. Neste artigo, vamos investigar uma maneira particular de mesclar a potência de uma parte específica de um software científico — Scilab — com a facilidade de desenvolvimento e a boa relação com a Web de uma linguagem do lado do servidor: PHP.

O Scilab é um pacote computacional numérico desenvolvido em 1990 por pesquisadores da INRIA e da École Nationale des Ponts et Chaussées (ENPC). Ele está implementado como uma linguagem de programação de alto nível numericamente orientada, distribuída sob a linguagem CeCILL compatível com GPL. O Scilab fornece simples operações de matriz, como multiplicação, além de uma biblioteca de operações de alto nível, como aritmética e correlação multidimensionais. Ele pode ser usado para processamentos de sinais, análises estatísticas, aprimoramentos de imagens, simulações de dinâmicas flexíveis e otimizações numéricas.

Quem pode aproveitar este artigo?

Este artigo foi escrito com cientistas, matemáticos e cientistas da computação em mente. Ele não está preso a nenhum sistema: Embora eu tenha escolhido PHP, Apache, Scilab, Linux® e XHTML, as mesmas teorias e metodologias podem ser aplicadas para, por exemplo, Ruby, Lighttpd, MATLAB, Mac OS X e HTML5. O fator chave é ser aberto e receptivo, estar pronto para explorar e experimentar.

Configuração

Eu escrevi e testei este artigo usando Scilab V5.1.1, PHP V5.2.10, XHTML V1.0 Strict e Apache V2.2.12 no Ubuntu kernel 9.10. Os exemplos fornecidos devem funcionar com novas versões da cada elemento e, em certos casos, são compatíveis com versões anteriores.

Configurando o Scilab

O Scilab funciona em Linux/UNIX®, Mac OS X ou Windows®, e está disponível para download no Scilab Web site (veja Recursos). Eu escrevi este artigo principalmente para usuários de Linux/UNIX, mas é possível encontrar construções semelhantes para Mac OS X. Para detalhes sobre como usar o Scilab na linha de comando do Windows, consulte o Scilab Web site.

Os pré-requisitos do Scilab, que normalmente não constam no seu sistema Linux/UNIX, incluem tecnologia Java™, Tcl e Tk, que o mecanismo do Scilab costuma usar para sua UI, ou o GNU Compiler Collection (GCC), que o Scilab usa como parte do seu kit de ferramentas de processamento de imagens e vídeo. Por outro lado, o Scilab está disponível através de certos gerenciadores de pacotes Linux e UNIX, como o Synaptic Package Manager usando repositórios Ubuntu.

Configurando PHP e Apache

Programas PHP são scripts que devem ser executados através de um interpretador para funcionar. É possível fazer o download do interpretador no PHP Web site (veja Recursos) e através de certos gerentes de pacotes Linux e UNIX.

É necessário software de servidor da Web para fazer com que o PHP funcione como uma linguagem do lado do cliente. Um desses servidores da Web é o servidor HTTP Apache, disponível no Apache Web site (Veja Recursos) ou através de certos gerentes de pacotes Linux e UNIX.

Certos sistemas podem encapsular Apache e PHP junto com outros aplicativos como MySQL. Um exemplo é XAMPP, mas você deverá notar que existem restrições para executar algumas das tarefas delineadas neste artigo.


Conectando

Scilab é um tipo de linguagem de algoritmos matemáticos, mas que também parecerá familiar para o típico programador de computador. É uma linguagem dinâmica, específica para aplicativos matemáticos e científicos, e que contém potentes funções com operações de matrizes. Para os matemáticos e cientistas entre nós, Scilab é similar à linguagem de programação R, e o sistema tem semelhanças com o software livre GNU Octave e o proprietário MATLAB.

Conectando-se ao Scilab na linha de comando

O Scilab traz uma GUI muito útil, na qual é possível inserir scripts Scilab facilmente. No entanto, também é possível usar o Scilab a partir da linha de comando, que é o que você deve fazer para que o seu sistema baseado na Web funcione mais adiante. Você acaba com esta complicada operação de linha de comando:

scilab -nwni -nb -e "m=[1 2 3; 3 4 5];disp(m);exit"

Isto pode parecer complicado à primeira vista, pois usa uma combinação estranha de letras. Primeiro temos a palavra scilab, que, obviamente, inicia o Scilab. A seguir, temos os seguintes sinalizadores (parâmetros para quando o Scilab for carregado):

  • nwni— Não é necessário sistema de janelas.
  • nb— Não exibir mensagens de boas vindas.
  • e— O próximo item na linha é uma expressão que o mecanismo do Scilab deve executar.

Um exemplo de designação variável é a = 5;, onde a é um exemplo de nome variável, = é a designação e 5 é o valor designado. A linha é concluída com um ponto e vírgula (;); caso contrário, ela é impressa na tela após a execução.

Os exemplos neste artigo designam uma variável para uma matriz. Uma matriz é construída usando colchetes ([]), com cada elemento separado com um espaço e cada linha separada com um ponto e vírgula. Assim, neste exemplo, temos m=[1 2 3; 3 4 5].

Para o seu futuro sistema baseado na Web, você precisa ser específico sobre o que deseja exibir na tela. É possível fazer isso usando a função disp do Scilab, que inclui uma variável, disp(m). A seguir, é necessário fechar o Scilab para liberar recursos computacionais, o que é feito com o comando exit. Para detalhes sobre scripts no Scilab, consulte o Scilab Web site.

Conectando-se ao Scilab via PHP

Há algumas maneiras de fazer a ponte entre os sistemas, aparentemente distintos, PHP e Scilab. Uma maneira seria enviar diretamente cadeias de comandos Scilab através de sua interface Java. Outra, seria instanciar o Scilab através da linha de comando e passar expressões Scilab para esta. Eu escolhi o segundo método, pois a interface Java ainda está nos seus estágios iniciais e precisa ser melhorada para funcionar completamente em PHP. Além disso, o segundo método toma total controle da instanciação do Scilab e não está limitado a interfaces pré-fabricadas.

O primeiro exemplo usando PHP envia o comando Scilab construído na seção anterior, que simplesmente imprime uma matriz na tela no formato de texto simples. A Listagem 1 mostra o código para esta operação.

Listagem 1. Resultados de saída para Scilab via PHP
    <?php
        exec('scilab -nwni -nb -e "m=[1 2 3; 3 4 5];disp(m);exit;"', $output);
        print_r($output);
    ?>

Usa-se a função exec para enviar um comando ao sistema operacional. Esse comando chama o Scilab, como você viu na seção anterior:

  • exec—Esta conveniente função PHP envia uma cadeia de caractere para ser processada pela linha de comando do sistema operacional. Certo cuidado é necessário ao usar esta função em Web sites: Se você permitir o acesso à função, pode também estar permitindo o acesso ao disco rígido do seu servidor. Seu primeiro parâmetro é o comando a ser enviado; o segundo parâmetro é o completo resultado multilinha exibido.
  • print_r— Este comando simplesmente imprime qualquer variável, incluindo sua estrutura. Neste caso, a variável $output é um array de uma dimensão, na qual cada elemento é uma linha de saída.

O próximo exemplo mescla códigos em várias linguagens — a saber, a linguagem de documentos de dados Web XHTML, a linguagem do lado do servidor PHP e sua chamada para o Scilab através da linha de comando Linux/UNIX. Veja a Listagem 2.

Listagem 2. Enviando expressões complexas ao Scilab e renderizando a saída via PHP e XHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Example 2: Sending equations to Scilab using a PHP web interface</title>
</head>
<body>
<p>Example 2: Sending equations to Scilab using a PHP web interface<p>
<?php

    if(isset($_GET['code']) && $_GET['code'] != "") {
        $defaultcode = str_replace('\"', '"', $_GET['code']);
        $code = preg_replace("/[\n\r]/","", $_GET['code']);
        exec('scilab -nwni -nb -e "' . $code . ';exit;"', $output);
        echo '<div id="result">Result = ';
        foreach($output as $line) {
            print_r($line);
            echo "<br />";
        }
        echo "</div>";
    } else {
        $defaultcode = "";
    }
?>
    <div id="codeeditor">
    <form action="webscilab.php" method="get">
        <textarea id="code" name="code" title="Code" rows="10" cols="30"
			style="Courier, monospace"><?php echo $defaultcode; ?>
		</textarea> <br />
        <input type="submit" id="submit" name="submit" 
			title="Submit" value="Submit" />
    </form>
    </div>
</body>
</html>

Primeiro, vamos analisar o XHTML, focando nas áreas importantes. Para mais detalhes sobre as áreas não abordadas neste artigo, o Web site W3Schools é um bom ponto de partida (veja Recursos).

O código na Listagem 2 é um simples formulário XHTML. Ele usa o método HTTP GET para atualizar a página atual com parâmetros extras. Há dois elementos neste formulário: uma área de texto, que permite que usuários insiram simples códigos Scilab para execução, e um botão Submit, que executa a ação do formulário.

O PHP fornece o controle real neste código. Quando a página é carregada, o código PHP determina se a página é uma página "recarregada" a partir do formulário. Caso seja, o código simplesmente toma o código Scilab do formulário e envia-o ao Scilab usando o comando exec. Os valores do formulário são armazenados no array $_GET do PHP, que é um array dos parâmetros HTTP get.

No entanto, há algumas diferenças importantes. Primeiramente, devido ao modo como os navegadores da Web e o HTTP agem, é necessária uma maneira de permitir que as pessoas editem e executem novamente os seus códigos. Assim, você tem que armazenar o código inserido em uma variável, substituindo certos caracteres HTTP por seus valores originais (neste caso, aspas). Isso é feito com a função PHP str_replace, assim, você pode imprimir os caracteres para o valor padrão do elemento do formulário textarea.

Você também deve agir no código. Como ele está sendo enviado ao Scilab a partir da linha de comando, você deve limpar as linhas novas excluindo-as (ou, mais precisamente, substituindo-as por cadeias em branco). Neste caso, usa-se algo um pouco mais potente: A função PHP preg_replace, que toma uma expressão regular como seu termo de pesquisa. Conforme o código Scilab é posto na função exec, o comando exit é concatenado para o fim do código, assim, você não tem que depender do usuário para inserir a palavra exit todas as vezes.

A seguir, temos um ciclo PHP foreach, que circula através de cada linha exibida e as renderiza em XHTML, prontas para serem exibidas pelo navegador. O ciclo simplesmente se repete através do array e imprime cada linha como faria na linha de comando, mas impingindo um elemento de linha de quebra XHTML após cada impressão.


Enviando equações e recebendo respostas graficamente

Até agora, temos um aplicativo logicamente potente, mas que não é totalmente diferente de usar a interface Scilab. Ele também não é uma maneira fácil e simples de trabalhar com o software. Logo, a próxima tarefa é fornecer certo tipo de interface gráfica em XHTML e PHP, o que pode ser feito adicionando formulários úteis para gerar potentes expressões Scilab.

O exemplo que melhor ilustra o uso de tais formulários é uma simples calculadora do seno. Somente o corpo do XHTML está incluso na Listagem 3, visando simplicidade e claridade.

Listagem 3. Uma calculadora baseada em trigonometria demonstra a geração dinâmica de scripts Scilab.
<body>
<p>Sine Calculator<p>
<?php
    $answer = "";
    if(isset($_GET['opposite']) && isset($_GET['hypotenuse'])) {
        $code = "result = " . $_GET['opposite'] . 
		  "/" . $_GET['hypotenuse'] . "; disp(result); exit";
        exec('scilab -nwni -nb -e "' . $code . '"', $output);
        $answer = $output[1];
    }
?>
    <div id="calculator">
    <form action="example3.php" method="get">
        <label for="opposite">Opposite</label><br />
		<input type="textbox" id="opposite" name="opposite" title="opposite" 
		  value="<?php echo $_GET['opposite']; ?>" /><br />
        <label for="hypotenuse">Hypotenuse</label><br />
		<input type="textbox" id="hypotenuse" name="hypotenuse" 
		  title="hypotenuse" value="<?php echo $_GET['hypotenuse']; ?>" />
		<br />
        <input type="submit" id="submit" name="submit" title="Submit" value="Submit" />
		<br /><br />
        <label for="result">Result</label><br />
		<input type="textbox" id="result" name="result" 
		  value="<?php echo trim($answer); ?>" /><br />
    </form>
    </div>
</body>

Este código usa mais ou menos a mesma metodologia do editor de códigos na Listagem 2. Desta vez, cria-se uma simples caixa de texto que corresponde ao oposto e a hipotenusa de um triângulo retângulo. Este formulário é então recebido, e um cálculo é concatenado a partir do array $_GET. Essa ideia é muito simples, mas pode fornecer a base para um potente aplicativo matemático ou científico.


Gráficos do Scilab em PHP

O Scilab tem a capacidade de exibir um gráfico baseado em dados. Essa função torna o Scilab incrivelmente poderoso e pode ser usada em seu aplicativo da Web. Não somente pode exibir um gráfico na tela, como também pode exportar o gráfico para um arquivo, incluindo os formatos de arquivo adequados à renderização em navegadores da Web (a saber, GIFs e JPEGs). No código Scilab exibido na Listagem 4, um gráfico de exemplo é impresso em um arquivo JPEG.

Listagem 4. Exemplo de script de saída de um gráfico Scilab.
scf(0);
plot2d();
xs2jpg(0,'example4.jpg');

Há muitas outras maneiras de gerar gráficos, mas esta função xs2jpg de gráfico para arquivo é muito útil. Para executar este código via PHP, você precisa da biblioteca de gráficos. Assim, em vez de usar o sinalizador nwni na linha de comando, usa-se nw, que ainda limita o Scilab a cálculos da linha de comando, mas carrega as bibliotecas de gráficos.

Esta funcionalidade tem a possibilidade de ser fatorada em PHP. O código na Listagem 5 mostra um exemplo desse tipo com base no código da Listagem 2. (Observe que algumas manipulações das permissões são necessárias para fazer com que este código funcione corretamente, e existem alternativas que podem funcionar um pouco melhor.)

Listagem 5. Uma técnica rápida e fácil para exportar e exibir um gráfico em XHTML do Scilab
<body>
<p>Example 4: Sending equations to Scilab and receiving JPEGs<p>
<?php

    if(isset($_GET['code']) && $_GET['code'] != "") {
        $filename = time() . ".jpg";
        $defaultcode = str_replace('\"', '"', $_GET['code']);
        $code = preg_replace("/[\n\r]/","", $_GET['code']);
        $exec = 'scilab -nw -nb -e "' . $code . 
			'xs2jpg(0,\"/var/www/webscilab/' . $filename . '\");exit;"';
        exec($exec);
        ?>
        <div id="result">
          <img src="<?php echo $filename; ?>" alt="result" />
        </div>
        <?php
    } else {
        $defaultcode = "scf(0);
plot2d();";
    }
?>
    <div id="codeeditor">
    <form action="example4.php" method="get">
        <textarea id="code" name="code" title="Code" 
		  rows="10" cols="30" style="Courier, monospace">
			<?php echo $defaultcode; ?>
		</textarea> <br />
        <input type="submit" id="submit" name="submit" title="Submit" value="Submit" />
    </form>
    </div>
</body>

Observe o uso da concatenação com a função xs2jpg para criar um arquivo JPEG. Observe também o uso de uma função de registro de data e hora para gerar um nome de arquivo único (de certo modo), que pode ser vinculado, como feito mais tarde na tag XHTML img. Isso está longe de ser uma solução completa, uma vez que é um pouco experimental e conta com configurações de permissão nem um pouco desejadas, mas ainda é possível ver que tal tarefa é realizável.


Conclusão

Este artigo mostrou como se conectar facilmente com o Scilab através do uso de PHP a partir da linha de comando. É possível enviar scripts Scilab de usuários para o Scilab, construir interfaces fáceis de usar, que geram scripts Scilab, ocultando desse modo a complexidade do Scilab dos usuários, ao mesmo tempo em que se mantém a funcionalidade. Finalmente, é possível testar a biblioteca gráfica do Scilab e vincular a um gráfico salvo via XHTML.

Eu espero que você continue a experimentar com este software único e trabalhe na base formada neste artigo. Em particular, conheça as funções de algoritmos genéticos e arrefecimento simulado do Scilab, ou a biblioteca Image and Video Processing, que permite manipular imagens e vídeos transferidos via upload. Com o processamento matemático eficiente na Web, e através do uso de ferramentas e tecnologias de software livre, você tem a capacidade de construir, de forma colaborativa, um mundo mais inteligente.


Download

DescriçãoNomeTamanho
Sample codeos-php-scilab-webscilab.zip5KB

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=480771
ArticleTitle=Processamento matemático eficiente usando o Scilab através de PHP
publish-date=04062010