Dev. Software/ Dicas/ Dicas e truques/ Labs/ Notícias/ Open-source/ Pessoal

Scratch ensinando crianças à programar

scratch

scratch_shot

O MIT sempre acerta no quesito de metodologias de ensino para o futuro e eu apoio a idéia de ensinar crianças a programar de uma maneira divertida e intuitiva, é o caso do projeto Scratch(“Rascunho”), que ajuda crianças a entender melhor e raciocinar melhor a questão do pensamento lógico e abstrato de seus desenhos.

Imagine você ensinar crianças na faixa etária de 5 até 10 anos à programar dessa maneira, ensina-los como criar um pensamento exponencial usando seus próprios desenhos, isso fomenta o conhecimento por áreas exatas e prepara o futuro da humanidade para a exploração espacial, dúvida?

Para encurtar a curva de aprendizagem no Scratch eu gravei um vídeo bem rápido mostrando como funciona e como pode ser criado animações, jogos simples e até sistemas. Gostou? Compartilhe nas redes sociais, divulgue na sua escola e ensine as crianças.

[media url=”http://www.youtube.com/watch?v=nAod_01YZHw” width=”600″ height=”400″ jwplayer=”controlbar=bottom”]

Ensinar o futuro da nação à programar não é tão difícil assim, já que a intenção justamente não é transforma-los em desenvolvedores de software, mas fazer com que eles transformem a maneira de pensar de um modo linear como é feito hoje para um modo lógico e escalonável e isso meus caros só através de programação.

Programar pode ser útil para o raciocínio de seus filhos, alunos. Ajudem eles a aprender de uma forma totalmente diferente da sua.

Acesse: http://scratch.mit.edu

Android/ Apache Cordova/ Dev. Software/ Dicas/ Notícias/ Open-source/ Phonegap

A fragmentação do Android e a dor de cabeça de desenvolver nativo

frag_droid_brands

frag_droid_brands

É fato e não tem como argumentar com dados, desenvolver para Android é um saco do ponto de vista nativo, na RIACycle cobramos muito mais caro para Android do que para iOS, por que justamente o cliente muitas vezes não entende o tamanho do problema que é para criar para dispositivos com Android.

[pullquote align=”left”]Relatório completo da Open Signal aqui.[/pullquote] E com base em quê para fazermos isso? Vejamos, sem dados eu não tenho como argumentar com você que lê agora, mas assuma que eu consegui os dados disponíveis aqui. Claro que isso não remete a realidade global, mais os dados podem ser comparados ao que temos no Brasil, você conhece alguém com smartphone que tenha o Android instalado? Percebeu qual a marca dele e o tamanho? Qual versão ele usa?

Esse relatório da Open Signal é basicamente o que eu tenho lutado nos últimos tempos e eu sempre venho com as seguintes perguntas em sequência:

[quote style=”1″] Para qual dispositivo Android você quer fazer?
Você quer fazer nativo ou usando tecnologias alternativas?[/quote]

Até ai, o cliente já está com o pé atrás e pergunta, Ah! Mais tem preço diferenciado? Sim, veja só, embora o Google tenta ao máximo lançar bibliotecas de compatibilidade entre diferentes versões da API, a questão é o mesmo aplicativo nativo que via rodar no Android 2.3 vai rodar no Android 4.2. A grande diferença é que você vai roda-lo mais lento no 2.3 e mais rápido no 4.2. Por que consequentemente quem está com o Android 4+ tem um aparelho no mínimo melhor.

Quem cria jogos como é nosso caso, o problema ainda é mais sério, já que você além de ter a dificuldade de trabalhar com diferentes tamanhos de telas, densidades, você tem que se preocupar com o consumo de energia da bateria.

frag_droid_

Um dos pontos chaves para trabalhar com a plataforma é a questão da API. Como mencionei rapidamente logo acima, é difícil você fazer isso de forma menos trabalhosa no Android, por mais que você queria, você vai acabar abrindo mão de um comportamento específico de navegação ou recurso e adotando um compatível com o nível de aplicativo que seu cliente quer.

O Google até se esforça nesse quesito e até com louvor nesse aspecto, mas é raro não ver algum desenvolvedor falando mal desse kit, justamente por que é limitante e vez ou outra você vai acabar implementando uma nova usando algum fragmento seu próprio ou criando um novo tipo de layout ou animação para superar as espectativas de seu cliente.

Claramente o que temos visto nos últimos 8 meses é que finalmente o cliente entendeu que o mercado de Android no Brasil é dominado pela Samsung, e fica mais fácil criar um aplicativo que rode apenas para ele, porém você não vai querer fazer um App apenas para uma marca, você quer fazer para o público em geral e isso cria uma falsa espectativa de que vai ficar bonito em tudo que é dispositivo.

Já viu o tanto de fabricante que existe?
frag_droid_brands

Imagine ter que criar vários deploys para diferentes marcas ou fabricantes? Haja recurso para isso.

Está tudo perdido? Claro que não, tudo depende de quanto você ou seu cliente está disposto à gastar na hora de criar as Apps, sempre a alternativa mais barata quando se não tem tanto prazo e dinheiro é usar cross-compilação, que no caso o Phonegap tem ajudado bastante.

A grande vantagem do phonegap é que você rapidamente pode criar Apps para peças publicitárias ou games em html5 ou até mesmo com Adobe AIR e usar uma API unificada e isso meu amigo, atrai e muito os olhos de quem desenvolve.

Leiam

Dev. Software/ Dicas/ Google/ HTML 5/ HTML5 / CSS3

Web Tracing framework do Google ajuda você se livrar do código porco

wft3

O Google acabou de lançar o Web Tracing framework, uma espécie de Adobe Scout, só que para coisas feitas em Javascript, que usem qualquer manipulação de conteúdo seja Canvas, WebGL, de tudo ele consegue capturar aquilo que está rodando a 60fps no navegador.

Eu testei a ferramenta e aqui vai a dica: USEM, ajuda de verdade.

Como fazer?

Primeiro Passo: Faça o Download da extensão para o Google Chrome.

Segundo passo: Clique no botão WTF (What the fuck), traduzindo (Que merda é essa) e vai aparecer o depurador para você fazer o enabled.

wtf

Terceiro passo: Comece a capturar, para isso isso a extensão cria um controle inferior direito para você começar a fazer a captura de dados, veja abaixo:

wtf2

Eu acho que é uma grande vantagem para quem criar coisas em Javascript, não é novidade para quem já conhece linguagens compiladas, basicamente é um depurador avançado para você conhecer mais de perto o que tanto afeta a performance de sua App, Jogo, enfim, tudo que você quer se livrar de porcaria que pode impedir da melhor performance.

Ferramenta MUST HAVE para quem cria jogos em Javascript.

Dev. Software/ PHP

Implementando REST com PHP

rest_sample

Não faz muito tempo que eu escrevi sobre REST aqui no blog, e no post eu prometi que iria continuar com o assunto implementando serviços REST em diversas linguagens PHP, Java, C++, Python e até mesmo em Javascript.

Se você não sabe o que é REST, antes de continuar lendo o post, aconselho você ler o post que escrevi sobre o assunto, assim você não fica boiando no assunto.

Configurando o ambiente

Quem não tem um ambiente local para testar com PHP, sugiro um software que eu utilizo localmente o XAMPP. É open-source e grátis.
Existem outros no mercado que também faz o mesmo, só que eu gosto do XAMPP por que é prático.

Implementando o REST

Para implementar o REST você pode utilziar diversas bibliotecas espalhadas por ai, tem várias publicações e projetos que te levam à um atalho mais rápido para criar tal mecanismo. As que eu achei mais fantásticas foram essas:

O que eu acho mais fantástico nessas implementações são a abstração, eles basicamente deixam você livre para fazer o que quiser, a curva de aprendizagem também é bem mole.

O que um difere do outro?

Alguns recursos extras, por exemplo o Guzzle oferece uma arquitetura de plug-ins, onde você pode implementar suporte já fora da caixa em Cache, Oauth, etc. Já o Slim não tem tudo isso, porém oferece uma API mais simples de se dar.

Nesse exemplo eu vou usar o Slim Framework, baixe ele direto do site, depois de baixar descompacte-o no diretório raiz do XAMPP (htdocs), para ser mais direto.

rest-php

Na imagem acima, você ver que eu deixei só o diretório Slim, o arquivo .htdocs e o index.php

[note color=”#005fff”]IMPORTANTE: O Arquivo de .htaccess existente no projeto tem as regras necessárias para criação de rotas das URLs necessárias, você precisa tê-lo para usar o Slim.[/note]

Ok, abra o arquivo index e você tem o seguinte conteúdo.

<?php
/**
 * Step 1: Require the Slim Framework
 *
 * If you are not using Composer, you need to require the
 * Slim Framework and register its PSR-0 autoloader.
 *
 * If you are using Composer, you can skip this step.
 */
require 'Slim/Slim.php';
 
\Slim\Slim::registerAutoloader();
 
/**
 * Step 2: Instantiate a Slim application
 *
 * This example instantiates a Slim application using
 * its default settings. However, you will usually configure
 * your Slim application now by passing an associative array
 * of setting names and values into the application constructor.
 */
$app = new \Slim\Slim();
 
/**
 * Step 3: Define the Slim application routes
 *
 * Here we define several Slim application routes that respond
 * to appropriate HTTP request methods. In this example, the second
 * argument for `Slim::get`, `Slim::post`, `Slim::put`, and `Slim::delete`
 * is an anonymous function.
 */
 
// GET route
$app->get('/', function () {
    $template = <<<EOT
<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8"/>
            <title>Slim Framework for PHP 5</title>
            <style>
                html,body,div,span,object,iframe,
                h1,h2,h3,h4,h5,h6,p,blockquote,pre,
                abbr,address,cite,code,
                del,dfn,em,img,ins,kbd,q,samp,
                small,strong,sub,sup,var,
                b,i,
                dl,dt,dd,ol,ul,li,
                fieldset,form,label,legend,
                table,caption,tbody,tfoot,thead,tr,th,td,
                article,aside,canvas,details,figcaption,figure,
                footer,header,hgroup,menu,nav,section,summary,
                time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;}
                body{line-height:1;}
                article,aside,details,figcaption,figure,
                footer,header,hgroup,menu,nav,section{display:block;}
                nav ul{list-style:none;}
                blockquote,q{quotes:none;}
                blockquote:before,blockquote:after,
                q:before,q:after{content:'';content:none;}
                a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent;}
                ins{background-color:#ff9;color:#000;text-decoration:none;}
                mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold;}
                del{text-decoration:line-through;}
                abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help;}
                table{border-collapse:collapse;border-spacing:0;}
                hr{display:block;height:1px;border:0;border-top:1px solid #cccccc;margin:1em 0;padding:0;}
                input,select{vertical-align:middle;}
                html{ background: #EDEDED; height: 100%; }
                body{background:#FFF;margin:0 auto;min-height:100%;padding:0 30px;width:440px;color:#666;font:14px/23px Arial,Verdana,sans-serif;}
                h1,h2,h3,p,ul,ol,form,section{margin:0 0 20px 0;}
                h1{color:#333;font-size:20px;}
                h2,h3{color:#333;font-size:14px;}
                h3{margin:0;font-size:12px;font-weight:bold;}
                ul,ol{list-style-position:inside;color:#999;}
                ul{list-style-type:square;}
                code,kbd{background:#EEE;border:1px solid #DDD;border:1px solid #DDD;border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;padding:0 4px;color:#666;font-size:12px;}
                pre{background:#EEE;border:1px solid #DDD;border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;padding:5px 10px;color:#666;font-size:12px;}
                pre code{background:transparent;border:none;padding:0;}
                a{color:#70a23e;}
                header{padding: 30px 0;text-align:center;}
            </style>
        </head>
        <body>
            <header>
                <a href="http://www.slimframework.com"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAAA6CAYAAABs1g18AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABRhJREFUeNrsXY+VsjAMR98twAo6Ao4gI+gIOIKOgCPICDoCjCAjXFdgha+5C3dcv/QfFB5i8h5PD21Bfk3yS9L2VpGnlGW5kS9wJMTHNRxpmjYRy6SycgRvL18OeMQOTYQ8HvIoJKiiz43hgHkq1zvK/h6e/TyJQXeV/VyWBOSHA4C5RvtMAiCc4ZB9FPjgRI8+YuKcrySO515a1hoAY3nc4G2AH52BZsn+MjaAEwIJICKAIR889HljMCcyrR0QE4v/q/BVBQva7Q1tAczG18+x+PvIswHEAslLbfGrMZKiXEOMAMy6LwlisQCJLPFMfKdBtli5dIihRyH7A627Iaiq5sJ1ThP9xoIgSdWSNVIHYmrTQgOgRyRNqm/M5PnrFFopr3F6B41cd8whRUSufUBU5EL4U93AYRnIWimCIiSI1wAaAZpJ9bPnxx8eyI3Gt4QybwWa6T/BvbQECUMQFkhd3jSkPFgrxwcynuBaNT/u6eJIlbGOBWSNIUDFEIwPZFAtBfYrfeIOSRSXuUYCsprCXwUIZWYnmEhJFMIocMDWjn206c2EsGLCJd42aWSyBNMnHxLEq7niMrY2qyDbQUbqrrTbwUPtxN1ZZCitQV4ZSd6DyoxhmRD6OFjuRUS/KdLGRHYowJZaqYgjt9Lchmi3QYA/cXBsHK6VfWNR5jgA1DLhwfFe4HqfODBpINEECCLO47LT/+HSvSd/OCOgQ8qE0DbHQUBqpC4BkKMPYPkFY4iAJXhGAYr1qmaqQDbECCg5A2NMchzR567aA4xcRKclI405Bmt46vYD7/Gcjqfk6GP/kh1wovIDSHDfiAs/8bOCQ4cf4qMt7eH5Cucr3S0aWGFfjdLHD8EhCFvXQlSqRrY5UV2O9cfZtk77jUFMXeqzCEZqSK4ICkSin2tE12/3rbVcE41OBjBjBPSdJ1N5lfYQpIuhr8axnyIy5KvXmkYnw8VbcwtTNj7fDNCmT2kPQXA+bxpEXkB21HlnSQq0gD67jnfh5KavVJa/XQYEFSaagWwbgjNA+ywstLpEWTKgc5gwVpsyO1bTII+tA6B7BPS+0PiznuM9gPKsPVXbFdADMtwbJxSmkXWfRh6AZhyyzBjIHoDmnCGaMZAKjd5hyNJYCBGDOVcg28AXQ5atAVDO3c4dSALQnYblfa3M4kc/cyA7gMIUBQCTyl4kugIpy8yA7ACqK8Uwk30lIFGOEV3rPDAELwQkr/9YjkaCPDQhCcsrAYlF1v8W8jAEYeQDY7qn6tNGWudfq+YUEr6uq6FZzBpJMUfWFDatLHMCciw2mRC+k81qCCA1DzK4aUVfrJpxnloZWCPVnOgYy8L3GvKjE96HpweQoy7iwVQclVutLOEKJxA8gaRCjSzgNI2zhh3bQhzBCQQPIHGaHaUd96GJbZz3Smmjy16u6j3FuKyNxcBarxqWWfYFE0tVVO1Rl3t1Mb05V00MQCJ71YHpNaMcsjWAfkQvPPkaNC7LqTG7JAhGXTKYf+VDeXAX9IvURoAwtTFHvyYIxtnd5tPkywrPafcwbeSuGVwFau3b76NO7SHQrvqhfFE8kM0Wvpv8gVYiYBlxL+fW/34bgP6bIC7JR7YPDubcHCPzIp4+cum7U6NlhZgK7lua3KGLeFwE2m+HblDYWSHG2SAfINuwBBfxbJEIuWZbBH4fAExD7cvaGVyXyH0dhiAYc92z3ZDfUVv+jgb8HrHy7WVO/8BFcy9vuTz+nwADAGnOR39Yg/QkAAAAAElFTkSuQmCC" alt="Slim"/></a>
            </header>
            <h1>Welcome to Slim!</h1>
            <p>
                Congratulations! Your Slim application is running. If this is
                your first time using Slim, start with this <a href="http://www.slimframework.com/learn" target="_blank">"Hello World" Tutorial</a>.
            </p>
            <section>
                <h2>Get Started</h2>
                <ol>
                    <li>The application code is in <code>index.php</code></li>
                    <li>Read the <a href="http://docs.slimframework.com/" target="_blank">online documentation</a></li>
                    <li>Follow <a href="http://www.twitter.com/slimphp" target="_blank">@slimphp</a> on Twitter</li>
                </ol>
            </section>
            <section>
                <h2>Slim Framework Community</h2>
 
                <h3>Support Forum and Knowledge Base</h3>
                <p>
                    Visit the <a href="http://help.slimframework.com" target="_blank">Slim support forum and knowledge base</a>
                    to read announcements, chat with fellow Slim users, ask questions, help others, or show off your cool
                    Slim Framework apps.
                </p>
 
                <h3>Twitter</h3>
                <p>
                    Follow <a href="http://www.twitter.com/slimphp" target="_blank">@slimphp</a> on Twitter to receive the very latest news
                    and updates about the framework.
                </p>
            </section>
            <section style="padding-bottom: 20px">
                <h2>Slim Framework Extras</h2>
                <p>
                    Custom View classes for Smarty, Twig, Mustache, and other template
                    frameworks are available online in a separate repository.
                </p>
                <p><a href="https://github.com/codeguy/Slim-Extras" target="_blank">Browse the Extras Repository</a></p>
            </section>
        </body>
    </html>
EOT;
    echo $template;
});
 
// POST route
$app->post('/post', function () {
    echo 'This is a POST route';
});
 
// PUT route
$app->put('/put', function () {
    echo 'This is a PUT route';
});
 
// DELETE route
$app->delete('/delete', function () {
    echo 'This is a DELETE route';
});
 
/**
 * Step 4: Run the Slim application
 *
 * This method should be called last. This executes the Slim application
 * and returns the HTTP response to the HTTP client.
 */
$app->run();

Mude-o para isso aqui.

<?php
require 'Slim/Slim.php'; // chamando a biblioteca
 
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim(); // registrando e inicializando o objeto no servidor
 
 
// GET route
$app->get('/', function () {
    $template = <<<EOT
        <h1>Implementando REST com slim framework</h1>
EOT;
    echo $template;
});
 
// POST route
$app->post('/post', function () {
    echo 'This is a POST route';
});
 
// PUT route
$app->put('/put', function () {
    echo 'This is a PUT route';
});
 
// DELETE route
$app->delete('/delete', function () {
    echo 'This is a DELETE route';
});
 
$app->run();

O que eu fiz foi remover os comentários excessivos que tinha no arquivo e coloquei uma mensagem customizada para mostrar que roda tranquilamente.

Toda vez que você for implementar um novo método no Slim Framework, basta você definir que tipo de comportamento ele possui e a ação que ele irá fazer.

Por exemplo quero criar um novo método chamado calcular.

$app->post('/calcular/:metodo',function($metodo) use ($app){
 
        $request = $app->request();
        $body = $request->post();
 
    switch($metodo){
            case 'somar':
                        echo $body['A'] + $body['B'];
            break;
            case 'dividir':
                        echo $body['A'] / $body['B'];
            break;
            case 'multiplicar':
                        echo $body['A'] * $body['B'];
            break;
            case 'diminuir':
                        echo $body['A'] - $body['B'];
            break;
    }
});

Eu posso usar as URIs com os métodos (/put, /post, /get, /delete).

E para testar meu serviço de REST como faço? Bom, você pode usar o cURL ou usar uma GUI para facilitar o processo, já que eu estou utilizando o navegador, eu vou adicionar uma extensão para o Google Chrome fazer isso. POSTMAN para nos salvar.

rest-gui

Na Webstore do google procure pelo POST MAN e você acha ele fácil, basta clicar em instalar e começar a testar.

rest-gui-demo

Coloco a URL, passo os parametros e voilá! Meu serviço de REST está implementado.

E como fica a requisição do servidor na aba de acesso? Vamos ver!

rest-php-call

Perfeito, eu posso criar vários serviços Web sem precisar escrever uma interface própria para testar, não existe mais desculpas esfarrapadas de esperar o Designer terminar a conversão de PSD para HTML/CSS para você começar a testar os serviços.

Esse é um belo exemplo simples de como implementar um serviço de REST. Agora vamos para um exemplo prático, digo mais completo.

Nesse exemplo usei o SQlite 3 para persistir os dados, você pode usar o que você quiser para persistência em PHP, o Slim não implica o uso de nenhum, já que dentro de suas chaves você pode escrever o que quiser.

[note color=”#007bff”]SQLite 3 só é suportado no PHP 5.4 em diante. Versões anteriores você pode usar o SQLite 2. Para saber qual versão que você tem use o php_info();[/note]

É bem simples o serviço de REST com uma API bem simplificada. O código abaixo contém as seguintes rotas que usaremos para o serviço.

  • GET /preload-inicial – Uso ele só 1 vez para carregar com dados falsos para ter algo para mostrar
  • GET /backup – Faz backup do banco
  • GET /clientes – Lista todos os clientes
  • GET /compras – Lista todas as compras do site
  • GET /compras/:id – Lista todas as compras de um cliente especifico pelo ID
  • PUT /cliente – Adicionar novos clientes
  • PUT /compra – Adicionar novas compras
  • POST /cliente/:id – Atualiza o cliente pelo ID
  • POST /compra/:id – Atualiza uma compra pelo ID
<?php
require 'Slim/Slim.php';
 
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
 
$response =array();
$db = new SQLite3('coisas.db');
 
 
// Uso essa função só para gerar dados fakes para ser usado no sistema
$app->get('/preload-inicial', function () use ($db,$response)
{       $value = rand(5,99);
        $db->exec('CREATE TABLE IF NOT EXISTS clientes(id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT);');
        $db->exec('CREATE TABLE IF NOT EXISTS compras(id INTEGER PRIMARY KEY, cliente_id INTEGER, valor INTEGER, compra_realizada DATETIME);');
        $db->query("INSERT OR IGNORE INTO clientes (nome) VALUES ('Igor Costa');");
        $db->query("INSERT OR IGNORE INTO clientes (nome) VALUES ('Elly Costa');");
        $db->query("INSERT OR IGNORE INTO clientes (nome) VALUES ('Leonardo Sobral');");
        $db->query("INSERT OR IGNORE INTO clientes (nome) VALUES ('Francisco Brianezi');");
        for($i=1;$i<=4;$i++){
            $db->query("INSERT INTO compras (valor,cliente_id,compra_realizada) VALUES ($value,$i,datetime());");
        }
 
});
// adicionar cliente
$app->put('/cliente', function () use($db,$response,$app) {
    $request = $app->request();
    $cliente = $request->put('nome');
    $response =$db->exec("INSERT INTO clientes (nome) VALUES ('$cliente');");
    echo $response;
});
// adicionar nova compra
$app->put('/compra', function () use($db,$response,$app) {
    $request = $app->request();
    $valor = $request->put('valor');
    $cliente = $request->put('cliente_id');
    $response = $db->query("INSERT INTO compras (valor,cliente_id,compra_realizada) VALUES ($valor,$cliente,datetime());");
    echo $response;
});
 
 
// Ediar cliente
 
$app->post('/cliente/:id',function($id) use($db,$response,$app){
    $request = $app->request();
    $nome = $request->post('nome');
    $response = $db->exec("UPDATE clientes SET nome='$nome' WHERE id=$id;");
    echo json_encode($response);
});
 
$app->post('/compra/:id',function($id) use($db,$response,$app){
    $request = $app->request();
    $valor = $request->post('valor');
    $cliente = $request->post('cliente_id');
    $response = $db->exec("UPDATE compras SET valor='$valor', cliente_id='$cliente' WHERE id=$id;");
    echo json_encode($response);
});
 
// lista os clientes
$app->get('/clientes',function()use ($db,$response,$app){
 
   $app->contentType('application/json');
   $tarefas = $db->query("SELECT * FROM clientes");
        while ($row = $tarefas->fetchArray(SQLITE3_ASSOC)) {
            array_push($response,$row);
        }
      echo json_encode($response);
 
});
// lista todas as compras
$app->get('/compras',function() use($db,$response,$app){
   $app->contentType('application/json');
   $tarefas = $db->query("SELECT clientes.id,clientes.nome,COUNT(*) as total_compras
                          FROM compras INNER JOIN clientes ON compras.cliente_id = clientes.id 
                          GROUP BY clientes.nome ORDER BY clientes.nome ASC");
        while ($row = $tarefas->fetchArray(SQLITE3_ASSOC)) {
            array_push($response,$row);
        }
      echo json_encode($response);
 
});
// lista todas as compras por id do cliente
$app->get('/compras/:id',function($id) use ($db,$response){
 
    $tarefas = $db->query("SELECT * FROM compras INNER JOIN clientes 
        ON compras.cliente_id = clientes.id  WHERE clientes.id = $id");
        while ($row = $tarefas->fetchArray(SQLITE3_ASSOC)) {
            array_push($response,$row);
        }
      echo json_encode($response); 
});
$app->get('/backup',function() use($app){
    $date = date("Y-m-d");
    exec('mkdir backups');
    $file = 'backups/backup-'.$date . '.sql';
    exec("sqlite3 coisas.db .dump > ".$file);
    echo readfile($file);
});
 
// Deleta cliente
$app->delete('/deleta/cliente/:id', function ($id) use ($db,$response,$app) {
 
    // para remover compras existentes do cliente
    $db->exec("DELETE FROM compras WHERE cliente_id=$id;");
    $response =$db->query("DELETE FROM clientes WHERE id=$id;");
    echo $response; 
});
// Deleta compra
$app->delete('/deleta/compra/:id', function ($id) {
    $response =$db->query("DELETE FROM compras WHERE id=$id;");
    echo $response; 
});
 
$app->run();

Para consumir esse serviço você pode usar a seguinte interface.

rest-gui-php-demo

Agora você já sabe como implementar um serviço em RESTful com PHP usando o Slim Framework. Na próxima competição que você participar use algo assim, é hiper rápido e você não gasta mais que 1 hora para implementar.

O uso do SQLite eu aconselho para coisas bem simples, listas simples e pouco à médio volume de dados. Não queria criar um ERP com SQLite que você está perdendo seu tempo.

Para maiores detalhes sobre o Slim Framework, visite a documentação do projeto. É simples e bem intuitiva.

O código fonte está disponível também no Github.

Dev. Software/ Dicas/ Dicas e truques/ Oportunidades de emprego/ Pessoal

Qual o verdadeiro valor de um desenvolvedor de Software?

real_brasileiro

Eu já escrevi por aqui vários assuntos relacionados a desenvolvedor, alguns foram bem comentados outros nem tanto. Dessa vez eu me deparei com uma situação da vida real onde você pode se perguntar qual o verdadeiro valor de um desenvolvedor de software?

É uma ciência não exata, já que como em toda profissão, o profissional de TI é um tanto quanto luxo e outros tanto quanto prantos. Meio sem sentido não é? Porém se você pensar em jingles de campanhas eleitorais, você vai ver que quase todas as músicas não fazem sentido, são paródias mal escritas e de cunho fulo.

Bem assim é o desenvolvedor de luxo, a estrela da bola, o Fênomeno dos gramados ” oops! bits”, é assim que ele se ver, vende-se mal para caramba e cobra um preço de ouro sendo ouro de tolo.

Existe valor no que foi escrito a 1 ano atrás? Existe valor no que será escrito nas propostas de trabalho e abertura de vagas daqui à 60 dias?

Tudo na vida humana é baseado em datas co-relacionadas a um evento em princípio, o principio do “Eu me acho”, é um fator avacalhador na hora de contratar um valioso desenvolvedor, seja ele do interior, da capital, da favela ou do condomínio de luxo.

Talvez, até um dia que o fator decisivo do “Eu me acho”, tenha data de validade.

Aposto que você leu até aqui e não entendeu patavina alguma. É isso que eu quero causar, perca seu tempo! Ele é a peça mais valiosa de seu dia-a-dia.

Perca seu tempo investindo em seu conhecimento, seja um perdedor nesse período. Não tente ser um desenvolvedor colecionador de certificações, MBA disso e daquilo, tente ser o maior investidor de sua carreira, começando ser auto-avaliado pelo pior crítico do mundo, seu lado macabro e sarcástico.

Todo santo dia, eu acordo, dou aquela velha esticada na cama para colocar os ossos no lugar, levanto, tomo uma ducha bem gelada para terminar de mandar o sono ir embora, depois vou tomar aquele bom e velho café quente, Ligo o tablet e vou dar uma lida nas notícias Espaciais, por que de economia, política, guerra, eu removi de meu app flipboard, já que tudo é a mesma coisa, nunca sai do ciclo.

Pois bem, depois disso, eu começo meu exercício mental e matinal, começo a ler sobre linguagens de programação, técnicas e vez ou outra eu arrisco em outros livros fora do contexto em que vivo, como por exemplo, Novels.

Depois disso, reunião daqui, reunião de lá, algumas micro conferências via skype e quando fui ver passou o dia. A noite começo a prática do que eu aprendi de manhã, por que só de teoria a coisa complica sua vida.

Lá perto das 23:00 acabo o dia, fecho a budega e vou me divertir com a patroa. É basicamente essa a rotina minha hoje, totalmente diferente de 12 anos atrás. Onde eu acordava cedo, pegava o buzão lotado, trabalhava feito jumento e depois tinha que voltar para casa. Não sei se essa dureza me ensinou a valorizar meu tempo mais que nunca.

Passados hoje 12 anos, considero-me mais um empreendedor do que um desenvolvedor, porém nunca deixei o espírito de lado em codificar produtos e idéias, sou sempre surpreendido por amigos, alunos com alguns ciclos que eu já passei, por exemplo, meia noite pedindo ajuda de código.
Você teve o dia inteiro para fazer, provavelmente você está ali por que cometeu um erro estúpido durante o dia ou o prazo recebido; Gastou seu tempo com bobagens.

E olha que eu já falei sobre gastar melhor seu tempo nesse post aqui.
Mudando um pouco da nossa conversa de pau para pião, eu sempre vejo algumas tirinhas de Médico vs. profissionais de TI, na moral da história nenhuma área é relativamente relacionada a outra em questão de conhecimento. O que toda profissão tem em comum são referências, qualidades e defeitos. Não me cola essa de querer ganhar mais só por que sabe fazer uma coisa que não vai ser útil dentro de seu atual ambiente de trabalho.

Tem uma tirinha bem interessante do Vida de programador, que eu me refiro a esse tipo de profissional, veja ai abaixo.

O que adianta você manjar de tudo isso, se você não se dá o valor? Existe um grande habismo em quebrar o galho e criar serviços. Se você for parte de uma ONG e quer ser voluntário, você dedica apenas um tempo determinado para aquele problema específico e para pessoas que não tem condições de te pagar. É o velho ditado, é dando que se recebe.

Mais saiba separar a vida pessoal, familiar da profissional, se não você vai acabar viciando seus parentes e deixando o que é importante em sua vida em segundo plano.

E esse ciclo se estende para sua atual empresa, seja você empresário ou profissional.

Se você é empresário o objeto de maior valor dentro de sua empresa é seu funcionário, faça ele gastar o tempo em coisas inteligentes que sirva para melhorar a qualidade atual do que você oferece aos seus clientes, até quem sabe gerar novos negócios não explorados dentro de sua atual gestão.

Se você é desenvolvedor e quer aumento, procure melhorar o salário apresentando novas idéias relacionadas a novos negócios não explorados na sua empresa, se seu patrão ver a idéia, adota-la e não lhe der aumento, mude de empresa imediatamente, o tempo gasto naquela idéia pode ser aplicado a outra empresa, deixe isso bem claro na hora de apresentar sua idéia e em seguida pedir aumento.

Todos querem vencer, conquistar dominar, é da nossa natureza em especial se formos homens, querer sempre o melhor, progredir, sermos os provedores para nossas famílias, é comum de nossa raça ter esse pensamento de superioridade.

Começe a pensar diferente, uma nação tem um exército para combater o mal e seus interesses, não é por que a nação tem o exército que ela vai toda hora fazer guerra. Ela sempre busca a paz e não a volatidade.

Na teoria de equilíbrio de John Nash, se você empresário ver todo o potencial de uma idéia assim como seu empregado, todos tende a ganhar, não adianta ser esperto nesse nosso mercado, ele é pequeno e logo logo sua estratégia frajuta de querer pagar menos ou de ganhar mais, ficará logo conhecida.

Assim, se aplica a teoria de equilíbrio para os colegas de profissão, o que adianta você cobrar menos que seu atual colega se você só degradará mais ainda seus futuros projetos e sacrificará mais ainda seu tempo? Tem lógica isso?

Por isso que usei a foto da nota de R$1 real, quando era de papel ela tinha mais valor na nossa carteira, depois que virou moeda, ela perdeu todo valor e o posto para nota de R$2 reais, sendo assim o espetinho de gato subiu por causa dessa mudança.

Pense bem sobre suas atitudes e valores, tem uma frase  que define bem isso de Fernando Pessoa.

O valor das coisas não está no tempo que elas duram, mas na intensidade com que acontecem. Por isso existem momentos inesquecíveis, coisas inexplicáveis e pessoas incomparáveis.
Fernando Pessoa

Eu termino o post perguntando, Qual é seu verdadeiro valor como desenvolvedor de software?

Dev. Software/ Dicas

7 maneiras de se tornar produtivo no desenvolvimento de software

produtividade

Ante-ontem dei uma rápida palestra para uma equipe de desenvolvedores de software via Connect e a palestra era mais motivacional do que propriamente dita “técnica”.

Papo vai e papo vem, como uma boa conversa com aquele amigo que você não ver a anos, querendo ou não você aprende mais com quem esta lhe escutando do que em livros ou em pesquisa. E acabei juntando essa soma de idéias em uma compilação de 7 maneiras de se tornar mais produtivo, mais divertido trabalhar com software. Ao contrário de muitos artigos ou “delatores de regras”, essa lista de 7 coisas vai fazer você tirar muito mais proveito de sua vida profissional como profissional de TI do que em qualquer outra área que você venha a conhecer.

 

1 – Desligue-se de mensagens instantâneas 

É quase impossível nos dias de hoje, mais o mito de que Facebook, MSN, Gtalk, IRC, ser super importante para o processo evolutivo de um produto é quase um Tabú. E mexer nesse assunto é o mesmo que mexer em um vespeiro! Vai sair gente com tudo que é tipo de articulação para defender o uso.

Eu diria ao contrário, relacione-se mais com seu colega de equipe, apesar de tudo ele está quase próximo de você e uma conversa pessoal ou até mesmo a pausa para o café é importante para sua socialização ou personificação de um perfil profissional.

Há quem diga que passar alguns dias fora desses mensageiros instantaneos você acaba virando novidade quando encontra seus amigos de rede social;Tendo muito mais assuntos para conversar e também marcar o shopp do final de semana.

Não seja amigo de seu colega de trabalho apenas no expediente, nunca se sabe o que você ou ele será no futuro. Amizade e Networking começa nesses pequenos atos.

2 – Desafie seus limites

Não acomode-se por que você é fera em um assunto e domina apenas tecnologia X, seja poliglota, eu acredito que nas próximas 2 décadas, saber escrever um programa ou  “falar um idioma de bytes”, será quase importante quanto saber o inglês nos dias de hoje. A programação está se tornando uma linguagem universal e quem não souber programar em um único idioma de bytes, está sujeito a fadar na lista negra de analfabetos bytianos.

É importante que você seja o Expert prático naquela linguagem X e não um Expert Didático, saber definir bem esses dois pontos é super importante, tirando proveito dessa articulação e repassando o que você sabe para seus colegas da mesma área. Ser um expert prático vai lhe garantir referências, destaque, porém com o passar do tempo você ficará conhecido apenas por aquele rótulo “Zé da Borracharia”, “João Pintor”. Desapegue-se apenas de uma tecnologia.

Assim como o mundo tem diversas escolhas sexuais, espirituais, políticas, etc. O mundo de desenvolvimento também tem diversas opções, então seja culto, aprenda outras também que vão de seu perfil, quando digo aprenda outras, não quero dizer que saia e vá estudar tudo que é linguagem que existe por ai. Quero que você tenha sintonia no que você está querendo aprender, todos querem aprender a tocar violão porém outros se identificam melhor com a guitarra. Assim é a vida, adapte-se com aquilo que é dado e não julgue pelo que não é.

3 – Corrija seus erros

Sempre surge aquele boato “Fiquei sabendo que fulano…”. Quando ouvir isso saia correndo e/ou interrompa quem estiver começando a dizer isso.

Conversas fiadas atrapalham sua vida profissional, alheie-se apenas no que diz respeito a coisas positivas que tenham uma construção melhor em sua carreira, a vida é cheia de tropeços e quem erra tem o direito de consertar o que errou, não adianta, agente achar que nunca acontecerá conosco, vai acontecer sempre, é um inifity loop.

Minha esposa sempre me diz “A vida é um pé de manga, hoje eu mango de tu, amanhã você manga de mim”. Então pare de se importar com erros dos outros e não aprenda a errar como eles, aprenda com os seus.

Seus erros são muito mais importantes de serem corrigidos do que os erros dos outros. Você aprenderá mais com os seus, tendo mais chances de não repeti-los.

Viva positivamente, se você acreditar que enxerga dessa maneira a vida, ela vai lhe surpreender todos os dias.

 

4 – Seja organizado

Saiu sem pentear os cabelos, nem tirou a poeira do sapato? Ainda está com a calça jeans da semana passada sem lavar? Come on!

Organização não é apenas um código limpo, bem polido, poucas rotinas, organização começa no se arrumar para ir trabalhar, agente anda relaxado de vez em quando até pode, o que não pode é o sempre. Pega mal e você nunca será encarado como um bom profissional e sim um quebra galho.

Sei que alguns discordam, mais não tente ser um metro sexual ou coisa do tipo, apenas mais limpinho, a limpeza do corpo é a limpeza da alma, uma organização pessoal é fundamental para você se sentir bem e produzir com muito mais animo a sua arte de escrever código.

Organize suas idéias seja em papel ou digitalmente, mais nunca deixe de organiza-las, não importa o método que você escolha, mais nunca deixe suas idéias confundir o seu dia, no final você vai acabar acreditando que não fez nada, e não fez mesmo!

Use um bom gerenciador de versões, mesmo para documentos como word, excel e powerpoint, agente faz  “merda” toda hora e é bom dá um CTRL+Z de vez em quando, imagine que é importante controlar aquilo que você faz, uma idéia vem e vai toda hora do dia, você pode se arrepender ou não, pode avançar ou voltar. Controlar o que você está fazendo só mesmo em nossa área.

 

5 – Gaste menos

Economize tempo em coisas que não são interessantes para sua vida e profissão. Saber gastar e administrar o tempo em horário de trabalho é a maneira mais equilibrada de ser produtiva.

Ter uma regra ou ciência exata para isso, vai depender de cada caso, uma fórmula para essa equação só mesmo na prática, gastando seu tempo em coisas que são pertinentes ao projeto e ao seu dia-a-dia.

Deixe para ler notícias de caminhão virado na Marginal para depois, seu time de futebol fez gols no final de semana? Aproveite as pausas e não faça disso um mantra para puxar assunto todo santo dia. Tem coisa mais chata do que gente sem assunto que só fala de trabalho e de seu time?

Gaste mais tempo conduzindo as soluções de problemas existentes na sua vida, na sua carreira, quer ver uma maneira radical? Jogue a TV fora!  “Brincadeira”. Mais pense bem ao gastar seu tempo com coisas que realmente são irrelevantes.

Já deve ter escutado “Pense fora da caixa”, mais como se eu vivo fora dela? Então você já vive fora da caixa, basta agora alinhas seu tempo com suas atividades.

Voltar para casa e saber que seu dia foi hiper produtivo, vai lhe dá uma sensação ótima.

 

6 –  Vá para festas

Não aquela festa de ritmo batido e que faz todos enjoarem; Quando eu digo vá para festas, eu digo Eventos.

Eventos são a melhor forma de você matar  10 coelhos com uma paulada só. Em um só evento você ver “Seus desafetos, suas ambições, faz networking, conhece gente nova, distribui seu cartão de visita, come, pega panfletos sem sentido algum, assiste palestras sem cunho prático, faz perguntas que nunca irá usar e por último vai pagar caro para fazer tudo isso.

Agora se você vai em eventos para se divertir, ver como os outros estão trabalhando, como se apresentam, comer, beber, jogar conversa fora com aquele pessoal que você não ver em pessoa faz tempo, participar das palestras e fazer anotações sobre pontos importantes para depois pesquisar no google. Ótimo, você realmente foi para festas.

Aproveite esses eventos faça networking e todo o resto, porém nunca esqueça de se divertir, divertindo-se de forma saudável, você vai encontrar um balanço sentimental sobre sua área e começar a enxergar pela tangente da coisa, se arriscando na perfeição de sua arte.

Divirta-se.

 

7 –  Comente construtivamente

Sempre que você ver um material, artigo, tweet, outro comentário ou código seja construtivo. A humanidade sempre aprendeu que destruir para depois construir é o atalho mais sensato da existência da vida humana. Seja um pouco fora desse planeta, como eu comentei no item 3, seja construtivo nos argumentos, ajude quem ao seu ver está errando, comentando e deixando sua opinião.

O tal de “Fi de beck aka:. feedback”, é importante para quem se propõe a fazer algo diferente do que você está acostumado a ver todo santo dia. Construir um pensamento em conjunto é muito mais divertido do que dividi-los e separar por grupo. Eu sei que ninguém é igual a ninguém, mais não custa nada você colocar seu  IMHO para o colega de área de maneira construtiva, até um mísero comentário em um código é de grande ajuda.

Construa comentários, seja paciente com as diferenças no mundo.

 

Essas são dicas fundamentais para você ser um bom desenvolvedor que vive atarefado e desmotivado.

Até a próxima.

Dev. Software/ Eventos/ Negócios/ Notícias

Acontecendo hoje o #soudevcon on-line e grátis

Estou super empolgado com o evento #soudevcon, a conferência on-line para desenvolvedores de software no Brasil.
A RIACycle está apoiando o evento, essa primeira edição conta com 8 palestras incríveis.

O evento foi uma idéia dos fundadores do site www.soudev.com.br o Janderson e o Erkoo e a coisa foi amadurecendo e hoje conta com um evento on-line e gratis. Quem sabe o que pode acontecer daqui para frente. Boa sorte Janderson e Erkoo, estou presente no evento e estou adorando.

Entre, é gratis e está acontecendo agora.

Cursos/ Design Patterns/ Dev. Software/ Flex/ Flex 4/ Flex Componentes/ Notícias

Novos cursos avançados para Flex 4 pela RIACycle

Uau, faz 5 meses desde que começamos a treinar o pessoal pela internet e de lá para cá já foram 712 alunos ao total. Obrigado a todos pelo apoio para com a RIACycle e os cursos com nossos instrutores, tem sido um verdadeiro desafio e uma tremenda animação nesse período.

De lá para cá nossos ex-alunos sempre pediam tópicos avançados, então ontem e hoje lançamos 2 novos cursos avançados pela RIACycle, que são:

Design Patterns para projetos Flex 4
banner_design_patterns

Esse curso é para quem gosta de se organizar, deixar tudo nos devidos lugares, deixar seu projeto digno de ser bem interpretado pelo flash player e assim ter uma maior fluidez entre telas, comunicação com serviços remotos e deixar sua aplicação leve e robusta, de fácil manutenção.

Flex 4 Profissional
banner_flex4_pro

Esse curso é voltado para quem já conhece Flex e quer aprofundar no Flex 4 com novo ciclo de componentes, técnicas avançadas de integração contínua, gerar swfs através de ANT Build, e fazer testes unitários, digamos que seja um nível avançado do que você já conhece de Flex e quer ficar mais expert no assunto.

Ambos os cursos tem o objetivo de treinar você a acompanhar o ritmo de projetos de médio e grande porte da solução Flex para o mercado de Rich Internet Applications.

E uma das novidades desses dois cursos é que agora em sua empresa você pode matricular 1 vez até 3 funcionários e pagando menos.

Obrigado a todos pela confiança depositada e iremos retribuir nos cursos, com conteúdo de primeira e exemplos reais.

Como é festa de lançamento estamos sorteando pelo twitter 2 vagas para cada curso, você tem sorte? Então Tweet usando os hashtags #flex4pro e #flexdp.

Actionscript Frameworks/ Dev. Software/ Flex/ FlexUnit/ Open-source

FlexUnit, necessário e prático para toda aplicação

Poucos desenvolvedores que conheço no Brasil que trabalham com Flex ou com desenvolvimento de sistemas usam testes unitários, o que é pouco para o número de desenvolvedores já existentes ou que vinheram de linguagens bastante notórias em nossa área.
O que eu vejo é o mal hábito de salvar e testar na base do click, é válida o teste mais horas vindo e indo vai causar algum problema que toma muito seu tempo. No qual tira todo o propósito de se criar uma aplicação em Flex que é justamente ser produtivo.

Ao contrário do que você pensa, testes unitários não cria regras de testes à serem executadas, apenas criar especificações que você define para aprovar o que seu código tem a lhe dizer sobre tais métodos disponíveis.

FlexUnit é um projeto open-source, escrito em actionscript 3.0 e que pode te ajudar nesta tarefa chata porém necessária, Você pode criar até seus métodos próprios para testar, mais o FlexUnit é bem completo neste quesito reduzindo assim seu tempo nesse caso de criar do zero.

Como então usar o FlexUnit?

Primeiro faça o download do pacote aqui no site abaixo.
http://opensource.adobe.com/wiki/display/flexunit/Downloads

Depois de baixar, descompacte os arquevos em um diretório seu de preferência. Feito isso, arraste o arquevo FlexUnit.swc para dentro da pasta de seu projeto criado ou existente dentro do Flex Builder, veja como ficou o meu na imagem abaixo:

Pronto seu projeto vai estar apto a criar testes unitários ja que a biblioteca necessária já está adicionada, porém trabalhar com testes unitários requer um pouco mais que só adicionar a biblioteca ao seu projeto. Outro passo que você deve testar é o uso da interface que faz o controle. Para isso adicione em sua aplicação Flex o seguinte código fonte.

1
2
3
4
< ?xml version="1.0" encoding="utf-8"?>
<mx :Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:flexui="flexunit.flexui.*">
<flexui :TestRunnerBase id="testeUnitario" width="100%" height="100%"/>
</mx>

Veja que o código acima gera para você a interface de controle do FlexUnit

Que nada mais é que a repesentação gráfica do controle para testes unitários, onde você ver os resultados que foram colhidos em seu teste unitário.
Depois disso, você precisa conhecer um pouco como funciona o FlexUnit, e como é todo esse processo de testes, para facilitar o seu entendimento veja as definições de cada fase do FlexUnit.

assertions – É o resultado esperado pelo seu teste. Por exemplo se você falar que em São Paulo tem sempre poluição o seu código tem que dizer que São Paulo é poluída. Se em seu teste ele não dê a resposta esperada setada pelo assertion, é sinal que você tem que mudar em sua classe e ver onde o erro está associado.

test fixture – Para cada deste poderá haver a necessidade de dependência de criar objetos, propriedades ou até processos para realizar o teste. test fixture funciona justamente nesse aspecto devido fornecer no FlexUnit dois métodos necesários para isso o setUp() e o tearDown(), que exclui a possibilidade de testar duas ou mais instâncias do teste sem a necessidade de se criar redundancia do código, ja que qualquer propriedade pode ser usada ao topo da classe.

test case – Uma pequena parte do teste unitário, test case ou caso de teste, checa apenas uma especificação de dados a serem inseridos no teste. No caso do test case para adiciona-la ao TestSuite, você tem que estender a classe TestCase para ser adicionado ao JUnit. Por regra de padrões de uso do JUnit é interessante que toda classe que for estendida do TestCase que sempre venha com um sufixo exemplo : CalculadoraTest extends TestCase; E dentro de classe cada método usado para testar suas regras de especificações aconselha-se também que use o prefixo test antes do método em si, exemplo: testSoma();

test suite Não tem aquile ditado que comentam: “Quanto mais melhor?!”, é o caso do test suite, quanto mais testes forem acumulados mais fácil será de administrá-los se você agrupa-los.
Onde o próprio test suite pode agrupar outros test suites, testes individuais e até mesmo qual teste pode ser rodado na mesma sessão.

test runner – Lembra do componente adicionado para mostrar seus testes sendo executados? É o tal sujeito test runner, ele apenas mostra o que foi executado como teste, no FlexUnit o teste começa com o método startTest();

Para que o FlexUnit consiga enxergar tudo isso, você precisa instanciá-lo e fazer com que ele passe a receber todos os testes que está sendo executado em sua aplicação.

Começando assim, adicione mais esse código abaixo dentro de sua aplicação principal do Flex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
< ?xml version="1.0" encoding="utf-8"?>
<mx :Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:flexui="flexunit.flexui.*">
 
</mx><mx :Script>
	< ![CDATA[
 
		    import flexunit.framework.TestSuite;
 
            private function criarTesteUnitario():TestSuite
            {
                var testeUni:TestSuite = new TestSuite();
                return testeUni;
            }
 
	]]>
</mx>
 
 
<flexui :TestRunnerBase id="testeUnitario" width="100%" height="100%"/>

Eu criei uma função que vai instanciar o TestSuite onde este objeto criado pode ser adicionado os testes necessários pelo TestCase como mostra no código à seguir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
< ?xml version="1.0" encoding="utf-8"?>
<mx :Application applicationComplete="iniciarTestes()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:flexui="flexunit.flexui.*">
</mx><mx :Script>
	< ![CDATA[
 
            import flexunit.framework.TestSuite;
 
            private function criarTesteUnitario():TestSuite
            {
                var testeUni:TestSuite = new TestSuite();
                return testeUni;
            }
            private function iniciarTestes():void{
            	testeUnitario.test = criarTesteUnitario();
            	testeUnitario.startTest();
            }
 
	]]>
</mx>
 
 
<flexui :TestRunnerBase id="testeUnitario" width="100%" height="100%"/>

Veja que agora eu associei o meu componente com a instância testeUnitario com a função que vai guardar todos os testes que eu fizer pelo TestSuite, o disparo que fiz foi pelo evento applicationComplete para ter certeza que os testes só iniciará quando toda a minha aplicação e suas respectivas classes tiverem despejadas na memória. Lembrando que existem casos que testes unitários são necessários serem feitos no processo de inicialização da aplicação, o que isso é assunto para outros posts.
O resultado do código abaixo é que o FlexUnit já está começando a executar os testes, porém como não há nenhum teste unitário feito, eu preciso adicionar algum tipo de testeCase para ele.

Adicionando testes:

Antes de adicionar classes de testes ao FlexUnit, para facilitar a organização e não acabar estragando tudo e misturando tudo em um só diretório, você cria ai como fiz aqui no meu, uma pasta “test”.

Lembra ainda to TestCase que é a classe necessária para adicionar as especificações para o nosso teste? Vamos usar ela, mais antes de começar com ela, vou criar uma classe simples com soma,divisão, multiplicação,subtração ao meu projeto para que ele teste,afinal até então não criei nada para ele testar. Detalhe que essa classe não fica na pasta test, não confunda! Ela fica no src mesmo, na pasta test só as futuras classes de testes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.igorcosta
{
	public class Matematica
	{
		public function Matematica()
		{
			super();
		}
 
		private var resultado:Number = 0;
		public function Somar(numA:Number,numB:Number):Number{
			return resultado = numA+numB;
		}
		public function Dividir(numA:Number,numB:Number):Number{
			return  resultado = numA/numB;
		}
		public  function Subtrair(numA:Number,numB:Number):Number{
			return  resultado = numA-numB;
		}
		public function Multiplicar(numA:Number,numB:Number):Number{
			return  resultado = numA*numB;
		}
		public function getResultado():Number{
			return resultado;
		}
	}
}

Com a classe matemática pronta, começe a criar a outra classe teste nesse caso chamo ela de MatematicaTest, lembra do sufixo?!

1
2
3
4
5
6
7
8
9
10
11
12
13
package test
{
	import flexunit.framework.TestCase;
 
	public class MatematicaTest extends TestCase
	{
		public function MatematicaTest(methodName:String=null)
		{
			super(methodName);
		}
 
	}
}

A classe faz parte do pacote test e estende a classe TestCase necessária para adicionar os testes.
A partir dai ja estamos com 75% pronto para rodar o primeiro teste, basta agora eu montar as especificações ao a minha classe e depois adicionar ao TestSuite e executar no TestRunner.

Como fazer?
Veja a classe final do meu teste, como quero aqui é apenas um exemplo me limitei a mostrar 2 métodos o somar e subtrair, veja como ficou a minha classe.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package test
{
	import com.igorcosta.Matematica;
 
	import flexunit.framework.TestCase;
 
	public class MatematicaTest extends TestCase
	{
		public function MatematicaTest(methodName:String=null)
		{
			super(methodName);
		}
 
		public function testSomar():void {
			var somando:Matematica = new Matematica();
			somando.Somar(40,40);
			assertTrue("Depois da soma de 40 a mais 40 o valor precisa ser 80",somando.getResultado() == 80);
		}
		public function testSubtrair():void{
			var subtrai:Matematica = new Matematica();
			subtrai.Subtrair(10,2);
			assertTrue("Depois da subtracao de 10 menos 2 o valor precisa ser 8",subtrai.getResultado() == 8);
		}
	}
}

Para finalizar, volto ao meu aplicativo principal e adiciono lá nas minhas funções o MatematicaTest ao TestSuite para rodar pelo testRunner.

Resultado final do meu aplicativo principal.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
< ?xml version="1.0" encoding="utf-8"?>
<mx :Application applicationComplete="iniciarTestes()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:flexui="flexunit.flexui.*">
 
</mx><mx :Script>
	< ![CDATA[
		import test.MatematicaTest;
 
		    import flexunit.framework.TestSuite;
 
            private function criarTesteUnitario():TestSuite
            {
                var testeUni:TestSuite = new TestSuite();
                testeUni.addTestSuite(MatematicaTest);
                return testeUni;
            }
            private function iniciarTestes():void{
            	testeUnitario.test = criarTesteUnitario();
            	testeUnitario.startTest();
            }
	]]>
</mx>
 
 
<flexui :TestRunnerBase id="testeUnitario" width="100%" height="100%"/>

E ao clicar em Run no Flex Builder veja o resultado final dos meus testes na imagem abaixo.

Para onde ir depois de ler esse exemplo, tentei reunir aqui uma coleção de links para te ajudar no seus estudos futuros.

JUnit – Foi usado seu modelo no FlexUnit

Visão geral de como usar o FlexUnit – em inglês

Rodando FlexUnit via InsideRIA – em inglês

Definição de UnitTest na Wikipedia – em inglês

FlexUnit com Ant – em inglês ( Esse em particular é o que uso, muito prático).