Blog

  • Simulando Sobrecarga em Métodos em PHP – Parte 2

    Nesta segunda parte da série vou apresentar como é possível criar um método que possa identificar os parâmetros recebidos de acordo com os tipos de variáveis.

    Exemplo

    Deseja-se criar um método para obter determinado usuário em um sistema. Entretanto, essa busca pode ser feita de duas maneiras: através do nome do usuário ou pelo seu ID. Ao invés de criarmos um método chamado getUserById() e outro getUserByName(), podemos simular o recurso de sobrecarga para criarmos apenas um método, que será chamado somente de getUser(). Na prática, teríamos o seguinte:

    No primeiro caso, a obtenção de um usuário seria feita dessa forma:

    
    $user       = $object->getUserByName("Pedro Padron");
    $other_user = $object->getUserById(1);
    

    Já no segundo caso, simulando sobrecarga teríamos:

    
    $user       = $object->getUser("Pedro Padron");
    $other_user = $object->getUser(1);
    

    Como isso pode ser feito?

    Para implementar essa solução específica, recomendo que sejam criados três métodos:

    acesso nome descrição

    public getUser() método que servirá de ‘fachada’ para obter um usuário

    private _getUserById() busca o usuário pelo id

    private _getUserByName() busca o usuário pelo nome

    Mas por que devo criar 3 métodos se esse recurso me permite utilizar apenas um?

    O mais interessante desse recurso é poder criar uma simples fachada para quem precisar obter usuários do sistema, realizando essa operação através de “um único ponto de entrada”. Por razões organizacionais, o método getUser() é o único que será visível externamente, pois ele será responsável por analisar o valor passado como parâmetro e direcionar a requisição para o método correto. Dessa forma evitamos colocar no mesmo método o tratamento de parâmetros e a lógica envolvida nas operações de busca (facilita o entendimento e a manutenção).

    Finalmente o Código!

    Para que o nosso método “fachada” possa identificar o parâmetro recebido e redirecionar a requisição, vamos utilizar as funções de identificação de tipos de variáveis disponíveis no PHP. Abaixo segue uma lista de algumas delas:

    is_array()

    is_string()

    is_int()

    is_bool()

    is_float()

    entre outras…

    Uma lista completa dessas funções pode ser encontrada na seção “Variáveis” do Manual do PHP: http://www.php.net/manual/pt_BR/ref.variables.php

    Como nós só queremos identificar se o parâmetro é uma string ou um inteiro, utilizaremos apenas duas dessas funções: is_string() e is_int().

    Observação: Note que sempre que ocorrer algum erro ou se o usuário não for encontrado os métodos retornarão um array vazio. Isso foi feito apenas para simplificar o exemplo. É altamente recomendável que você faça a distinção entre erros nos parâmetros e erros nas consultas.

    
    class Teste {
    	
    	// armazenará um array contendo as informações dos usuários.
    	// em uma situação real, esses dados poderão vir de qualquer outra fonte.
    	private $_users;
    	
    	function __construct() {
    	
    		// inicializa o array, onde a chave é o ID e o valor é o NOME DO USUÁRIO
    		$this->_users = array(0 => "Max Stirner",
    		                      1 => "Emma Goldman",
    		                      2 => "Aldous Huxley",
    		                      3 => "George Orwell",
    		                      4 => "Noam Chomsky");
    
    	}
    	
    	function getUser($param) {
    		
    		if (is_string($param)) {
    			// se for string, busca por nome
    			$user = $this->_getUserByName($param);
    		} else if (is_int($param)) {
    			// se for int, busca por id
    			$user = $this->_getUserById($param);
    		} else {
    			// se nenhuma condição for satisfeita, retorna um array vazio
    			$user = array();
    		}
    	
    		return $user;
    		
    	}
    	
    	private function _getUserById($id) {
    		
    		if (isset($this->_users[$id])) {
    			// se existir o índice (id), monta o array do usuário
    			$user = array("id" => $id, "username" => $this->_users[$id]);
    		} else {
    			// se não existir, retornará um array vazio
    			$user = array();
    		}
    		
    		return $user;
    		
    	}
    	
    	private function _getUserByName($name) {
    		
    		// busca pelo nome no array de usuários
    		$id = array_search($name, $this->_users);
    		
    		if ($id != null) {
    			// se encontrou, monta o array do usuário
    			$user = array("id" => $id, "username" => $this->_users[$id]);
    		} else {
    			// se não encontrou, retornará null
    			$user = array();
    		}
    		
    		return $user;
    	
    	}
    
    }
    
    Testando o Código

    Para testar o funcionamento dos métodos, você pode utilizar este código:

    
    // instancia um objeto da classe Teste
    $obj = new Teste();
    
    // busca o usuário com ID = 1
    print_r($obj->getUser(1));
    
    // busca o usuário Aldous Huxley
    print_r($obj->getUser("Aldous Huxley"));
    
    // busca o usuário com ID = 3
    print_r($obj->getUser(3));
    
    // note que aqui tentamos passar como parâmetro o ID do usuário, mas por estar entre
    // aspas o PHP o interpreta como string. tome muito cuidado com isso, principalmente
    // se os valores que devem ser usados como inteiros vêm de outras fontes (ex.: banco de dados).
    print_r($obj->getUser("4"));
    
    // para evitar esse tipo de problema, utilize a função intval()
    print_r($obj->getUser(intval("4")));
    

    Executando este código, o resultado obtido será:

    
    [cor4]Array ([/cor4]
    [cor4]    [id] => 1[/cor4]
    [cor4]    [username] => Emma Goldman[/cor4]
    [cor4])[/cor4]
    [cor4]Array[/cor4]
    [cor4]([/cor4]
    [cor4]    [id] => 2[/cor4]
    [cor4]    [username] => Aldous Huxley[/cor4]
    [cor4])[/cor4]
    [cor4]Array[/cor4]
    [cor4]([/cor4]
    [cor4]    [id] => 3[/cor4]
    [cor4]    [username] => George Orwell[/cor4]
    [cor4])[/cor4]
    [cor4]Array[/cor4]
    [cor4]([/cor4]
    [cor4])[/cor4]
    [cor4]Array[/cor4]
    [cor4]([/cor4]
    [cor4]    [id] => 4[/cor4]
    [cor4]    [username] => Noam Chomsky[/cor4]
    [cor4])[/cor4]

    Note que o quarto array está vazio, pois o parâmetro passado foi uma string contendo o ID, o que foi interpretado como o nome do usuário.

    Finalizando…

    Lembre-se de manter a organização ao utilizar esse pequeno ‘truque’ em suas aplicações. Por não ser um recurso suportado pelo PHP, implementar sobrecarga de métodos pode resultar em códigos extremamente bagunçados, que vão piorando conforme o sistema cresce.

    No próxima e última parte desta série de artigos, continuarei abordando sobrecarga através dos tipos de parâmetros, mas desta vez utilizando objetos ao invés de tipos simples de variáveis. Se você está sem paciência para aguardar o próximo, sugiro que dê uma olhada na função is_object() e no operador instanceof.

    Downloads

    Código PHP (exemplo): http://downloads.padron.blog.br/artigos/sobrecarga/sobrecarga2.zip

    Artigo em PDF: http://downloads.padron.blog.br/artigos/sobrecarga/sobrecarga2.pdf

  • Marketing para Serviços e Aplicações Web

    Por diversas vezes, nós simplesmente seguimos idéias de especialistas sem adaptá-las a nossa realidade. Vou discorrer aqui a questão do site de uma página só (One Page Site) e da nova técnica que estou desenvolvendo.

    O pessoal da 37signals defende a idéia de que um site pode ter uma página só. Realmente, o site deles tem apenas uma página!

    Eu também devo ter um site de uma página só?

    Foi o que me perguntei em meados de 2006 e cheguei a conclusão de que a resposta seria SIM. Muito mais fácil de manter e atualizar, direto, simples, etc. O site da BielSystems, minha empresa, é baseado nessa filosofia e funciona muito bem.

    Fiz isso também no site do EmailFax, sistema de fax pela internet da BielSystems.

    Mês passado chegou a hora de investir no marketing do EmailFax e para isso recorri aos relatórios do Google Analytics, que já estavam sendo alimentados pelo site desde o lançamento. Foi quando comecei a perceber que algo estava errado.

    Quando fui analisar os relatórios percebi que o site de uma página só não me acrescentava nenhuma informação! Todas as pessoas entravam e saiam naquela página. Não havia percentual de desistência por conteúdo, não era possível fazer uma análise navegacional, muito menos o mais importante: acompanhar as conversões.

    (Vou começar a falar mais sobre marketing na web nos próximos artigos, falarei mais sobre acompanhamento de conversão, por enquanto você pode ficar com este link.)

    Basicamente os relatórios não apresentavam informações, apenas dados como percentual de visitantes com navegador X, resolução de telas e outras mais que não acrescentam muita coisa nas decisões de marketing para a venda do produto.

    Neste momento percebi que site de uma página só não é bom apresentação de produtos.

    Então pensei: Mas por quê a 37signals, empresa pioneira, faz site de uma página só?

    A resposta está na pergunta. A 37signals é uma empresa pioneira na internet mundial. Ela possui milhares de clientes, aparições nas principais revistas de negócios e tecnologia e seu blog possui mais de 50.00 leitores. Eles não precisam trabalhar o marketing no site, mas sim dentro dos produtos. A abordagem é diferente.

    A conclusão por enquanto é de que devemos evitar sites de uma página só para divulgação do produto, por mais simples que seja.

    Chegar a essa conclusão demandou uma experiência prática e isso é legal. No Brasil as coisas funcionam diferente, os consumidores têm atitudes diferentes e não podemos aceitar tudo que dá certo lá fora. Precisamos criar nossas técnicas a partir das experiências obtidas. Com esta experiência tive uma idéia e estou desenvolvendo uma técnica que chamei de O site que conversa. Este será um tema para os próximos capítulos.

    Abraços a todos.

  • Totalmente IntelliSense

    Quando o intellisense foi criado, todos os programadores de todas as linguagens ficaram eufóricos, pois agora a redução de digitação do código fonte era uma realidade. Nada como começar a escrever e as instruções já vão sendo visualizadas, digitar um ponto e todas as propriedades dos objetos prontamente listadas, realmente facilitou o nosso trabalho.

    Porém, parece que o intellisense parou no tempo, que isso é o estado-de-arte incapaz de ser melhorado, mas no Visual Fox Pro o intellisense, embora muitos não saibam, tem apenas como a ponta do iceberg este processo, pois ele é muito mais que isso ele pode ser programado criando suas próprias funcionalidades chegando muitas vezes perto de um wizard.

    Vamos ao exemplo típico: Se você digitar no VFP o comando _vfp, terá algo como na figura abaixo:

    Até agora nada de mais, qualquer linguagem faz este processo, mas se você resolver digitar FOREND verá que o VFP cria a estrutura FOR…ENDFOR para você. Observe que isso não é mais simplesmente um intellisense, pois ele criou o bloco inicial e final do loop diminuindo a quantidade de código que você necessita digitar.

    Como o comando que você sempre escreve na verdade é FOR T = 1 To <alguma coisa>, melhor fosse que o VFP colocasse isso tudo para você não é mesmo? Pois você pode programar o intellisense e criar seus próprios processos. Escolha no menu principal a opção TOOLS e depois Intellisense mananger e no form que aparecer, escolha a aba custom e ficará como a figura abaixo:

    Esta é a página que você pode realizar qualquer customização que desejar nos comandos do intellisense do VFP com várias opções, mas vamos nos ater a uma específica: Criar bloco de comandos.

    Embaixo do replace escreva FOR e depois de uma click no botão ADD e selecione o comando FOR propriamente dito e click no botão SCRIPT e logo aparecerá um campo memo para ser editado. Neste memo coloque as seguintes informações:

    LPARAMETER oFoxCode
    oFoxcode.valuetype="V"
    return "FOR T=1 to ~"+chr(13)+"ENDFOR"

    Salve e teste em um PRG e note que agora você customizou o comando FOR para realizar o que deseja e o cursor ficará posicionado exatamente no local onde foi inserido o símbolo (~).

    Se desejar incrementar mais, pense em um pequeno wizard para o mesmo FOR:

    LPARAMETER oFoxCode
    oFoxcode.valuetype="V"
    m.lcFor="FOR T=1 to "
    if Messagebox("For de uma tabela?",36,"Pergunta")=6
    	m.lcArquivo=getfile("Tabela:dbf")
    	m.lcDBF=juststem(m.lcArquivo)
    	m.lcFor=[if !used("]+m.lcDBF+[")]+chr(13)+chr(9)+[use "]+m.lcArquivo+[" in 0]+chr(13)+"ENDIF"+chr(13)+m.lcFor
    	m.lcFor=m.lcFor+[reccount("]+m.lcDBF+[")]+chr(13)
    endif
    m.lcFor=m.lcFor+chr(9)+"~"+chr(13)+"ENDFOR"
    return m.lcFor

    Agora veja o comportamento do comando FOR no PRG respondendo SIM ou NÃO e imagine todos os procedimentos que você pode realizar e poupar muitas e muitas horas de trabalho de codificação. Isso é Visual Fox Pro.

  • Criando urls pra web 2.0

    Artigo recomendado para Visual Studio 2005 SP1

    A Web 2.0 está modificando completamente a forma com a qual estávamos acostumados a divulgar nossas páginas. Antigamente fazíamos um cadastro com palavras chaves nos principais portais de busca de contéudo, e agora os mesmos passaram a indexar completamente todo conteúdo favorecendo as páginas com muitas referências.

    Os novos motores de busca varrem todos os links relacionados e, mesmo que você não cadastre seu site, ele pode ser indexado porque alguém inseriu seu link no site dele. Essa dinâmica está envolvendo novas tecnologias e comportamentos como o uso do AJAX. A proposta desse artigo é modificar as urls tradicionais de sua aplicação que passam parâmetros para novas urls que já incluem no caminho da mesma. Isso fará com que seu site seja visualizado mais vezes pelos motores de busca por que eles vão entender que o site possui várias paginas ‘Url virtuais’ conforme Tabela 01.

    Url Original: http://localhost/meusite/produtos.aspx?Codigo=75
    Url Modificada: http://localhost/meusite/produtos/75

    Tabela 0: Modificando urls tradicionais.

    Na prática, o que estaremos fazendo é enganar os motores de busca usando o httpmodules do asp.net para tratar uma url que não existe em nosso site (http://localhost/meusite/produtos/75) e responder com outra url internamente com a informação solicitada. Com isso, uma página com 100 parâmetros se comporta como se fossem 100 páginas. Esse truque pode ser usado para diversas outras finalidades, inclusive para urls temporárias exclusivas para um usuário logado.

    Para iniciar nosso artigo, crie um projeto > C# > ASP.NET Web Application (WebRewrite) e adicione um novo arquivo: Projeto > Add > New Item > Class com o nome de ProfessionalComputing.goUrl.cs.

    O objetivo desse arquivo é codificar a classe goUrl que implementa a interface IHttpModule para interceptar todas as requisições que chegarem a aplicação e repassar para uma classe personalizada com objetivo de fazer o reWrite internamente caso necessário. Para essa classe daremos o nome de VerificaUrl. Nesse momento inicie a codificação da classe goUrl conforme listagem 1.

    ProfessionalComputing.goUrl.cs

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    namespace ProfessionalComputing
    
    {
    
    public class goUrl:IHttpModule
    
    {
    
    public virtual void Init(HttpApplication app)
    
    {
    app.BeginRequest += new EventHandler(this.Rewrite_BeginRequest);
    }
    
    public void Rewrite_BeginRequest(object s, EventArgs e)
    
    {
    try
    
    {
    ProfessionalComputing.Util.VerificaUrl.CheckUrl(((HttpApplication)s));
    }
    
    catch (Exception exception1)
    
    {//
    
    throw new Exception("Falha tratando url");
    
    }
    
    }
    
    #region IHttpModule Members
    
    public virtual void Dispose()
    
    {
    
    }
    
    #endregion
    
    }
    
    }

    Listagem 01 – Implementando classe goUrl baseada no IHttpModule

    Agora que você acabou de construir a classe goUrl, o funcionamento dela será muito simples. Ela vai interceptar as requisições de urls em nossa aplicação e, para cada requisição que chegar, vai executar nossa segunda classe chamada VerificaUrl que contém o método CheckUrl, responsável pela reescrita da url. Nesse momento adicione um novo arquivo tipo classe e coloque o nome ProfessionalComputing.Util.VerificaUrl.cs codificando conforme a listagem 02.

    ProfessionalComputing.Util.VerificaUrl.csx

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    namespace ProfessionalComputing.Util
    {
    public class VerificaUrl
    {
    public static void CheckUrl(HttpApplication app)
    
    {
    string origem = app.Request.Path.ToString().ToLower();
    string urlsite = app.Request.ApplicationPath;
    if (origem.IndexOf("produto") > -1)
    {
    string[] parametros = origem.Split('/');
    string codigo = parametros[2]; // você pode obtem na string origem
    app.Context.RewritePath(urlsite + "_Produto.aspx?Codigo=" + codigo);
    
    }
    }
    }
    }

    Listagem 02 – Implementando a classe VerificaUrl.

    Conforme você pode observar na listagem 02, nesse exemplo o processo é muito simples de ser implementado. Bastar obter a url de origem, verificar se você vai tratar a mesma e, caso positivo, fazer o ReWritePath() para o novo caminho.

    Após implementar as classes, o próximo passo é modificar o web.config para que possamos adicionar referência a mesma conforme listagem 03, insira o código dentro do bloco <system.web>.

    System.Web

    <httpModules>
    <add type="ProfessionalComputing.goUrl,WebRewrite" name="goUrl" />
    </httpModules>

    Listagem 03 – Alterando web.config para suportar novo httpmodules.

    Na listagem 03 estamos adicionando referência a classe goUrl e ao assembly que ela se encontra (bin\WebRewrite.dll). É o nome da aplicação web que chamamos de WebRewrite.

    Com essa implementação, basta executar sua aplicação e digitar a url desejada, conforme esse exercício: se digitar a url: http://localhost:1759/produto/10 vai carregar internamente a url: http://localhost:1759/_Produto.aspx?Codigo=10 conforme figura 01. Para o usuário final ou site de busca o acesso é transparente.

    |

    Figura 01 – UrlRewrite em ação

    Código Fonte: Download

    Esse artigo foi baseado no banco de dados ”NorthWind” para listagem de produtos.

    Obrigado e até a próxima!

  • Efeito Pop Art

    Olá pessoal. Atendendo a pedidos, hoje estudaremos uma das maneiras de desenvolver este efeito bastante utilizado em ambiente online e impresso, sendo mundialmente conhecido como Pop Art.

    Um breve resumo:

    O Pop Art surgiu em meados da década de 50, e ficou conhecido com o pintor e designer Andy Warhol em 1963, que defendia uma arte popular incorporado nas histórias em quadrinhos, publicidade, das imagens televisivas e do cinema. O Pop Art se caracteriza pelo desenho simplificado e pelas cores saturadas.

    Vamos à técnica.

    Passo 1: abra, no Photoshop, uma foto de sua preferência.

    1ºpasso

    Passo 2: duplique a Layer. No menu principal, vá em Layer > Duplicate Layer (Camada > Duplicar Camada) ou utilize o comando (Ctrl J).

    2ºpasso

    Passo 3: vamos criar uma Layer vazia, e arrastá-la para baixo da nossa Layer duplicada. Para criar uma nova Layer, no menu pricipal, vá em Layer > New > Layer (Camada > Novo > Camada) ou utilize o comando (Ctrl Shift N).

    Para arrastar a Layer, vá no painel de Layers, clique e arraste a nova Layer para baixo da Layer duplicada no 2 passo.

    Obs.: se o seu painel de Layers não estiver ativo, vá no menu principal e selecione Window > Layers ou utilize o comando (F7)

    3ºpasso

    Passo 4: clique sobre a nossa layer duplicada (Layer 1). Em seguida, vamos remover a saturação da imagem. No menu principal, vá em Image > Adjustments > Desaturate (Imagem > Ajustar > Remover Saturação) ou utilize o comando (Ctrl Shift U).

    4ºpasso

    Passo 5: com a ferramenta de sua preferência, remova o fundo da imagem. Se preferir, preencha a nossa layer vazia com alguma cor de sua preferência para facilitar a remoção dos detalhes.

    5ºpasso

    5ºpasso

    Passo 6: pressione a letra “D” do seu teclado para reiniciarmos as cores de Foreground e Background. Em seguida, clique sobre a Layer que acabamos de remover o fundo. Feito isso, no menu principal, selecione a opção Filter > Sketch > Halftone Pattern (Filtro > Croqui > Matriz de Meio Tom). Na opção Size, inclua o valor igual a 1(um). Em Contrast, inclua o valor igual a 5. Em Pattern Type, escolha a opção Dot (Ponto).

    6ºpasso

    Passo 7: no menu principal, escolha a opção Image > Adjustments > Threshold (Imagem > Ajustar > Limiar). Quanto ao valor, não vou estipulá-lo, porque o valor variará de acordo com a luz, brilho, contraste, saturação e outros atributos das imagens utilizadas. No meu caso, apliquei o valor igual a 185.

    7ºpasso

    Passo 8: no menu principal, escolha a opção Image > Adjustments > Gradient Map (Imagem > Ajustar > Mapa de Degradê). Escolha como a da figura abaixo:

    8ºpasso

    Nossa imagem deverá ficar assim:

    8ºpasso

    Passo 9: no menu principal, escolha a opção Image > Adjustments > Hue / Saturation (Imagem > Ajustar > Matiz / Saturação) e altere o valor de Hue para 22. Em seguida, na nossa layer vazia (Layer 2), aplique a cor 006CD0. A nossa imagem deverá ficar assim:

    9ºpasso

    Passo 10: agora vamos preparar a área do nosso arquivo para finalizarmos a imagem. No menu principal, escolha a opção Image > Canvas Size (Imagem > Tamanho da Tela de Pintura), ou utilize o comando (Alt Ctrl C). Na caixa de seleção, troque a opção “cm” por “pixels” e observe que, logo acima, na opção Current Size, temos os valores respectivos à altura e à largura. Na opção New Size, marque o check box com a opção “Relative” e repita os valores da altura e da largura respectivamente nas caixas de texto da opção New Size.

    Em Anchor, marque o primeiro quadrado de cima para baixo, da esquerda para a direita:

    10ºpasso

    Passo 11: com a tecla Shift pressionada, no painel de Layers, clique sobre as duas layers superiores e, em seguida, clique na opção Link Layers. Feito isso, ainda com as duas layers selecionadas, clique e arraste-as para o botão Create a New Layer para duplicarmos as nossas layers.

    11ºpasso

    Duplique três vezes e distribua as cópias lado-a-lado em nossa imagem:

    11ºpasso

    Passo 12: vamos alterar as cores das demais cópias para finalizarmos a nossa imagem. Na primeira cópia, clique sobre a layer da foto com o nosso efeito (Layer 1 copy), escolha a opção Image > Adjustments > Hue / Saturation (Imagem > Ajustar > Matiz / Saturação), ou utilize o comando (Ctrl U), e altere o valor de Hue (Matiz) e Saturation (Saturação) conforme o seu gosto.

    Você também pode marcar o Check Box da opção Colorize para obter outros resultados.

    Altere também a cor da Layer 2 copy, que será a nossa cor de fundo, para uma cor também a seu critério.

    Repita este passo nas outras cópias das Layers.

    Nossa imagem final:

    12ºpasso

    Um grande abraço a todos, fiquem com Deus e até a próxima.

  • “Marca Brasil de TI” e o crescimento do País com a exportação

    O mercado mundial de tecnologia está bastante aquecido e muitas oportunidades têm surgido para que o Brasil se destaque com a exportação de serviços e software, gerando empregos e trazendo divisas ao País.

    Em 2006, o mercado de serviços de TI faturou cerca de US$1,2 trilhão em todo o mundo. Desse valor, pouco mais da metade, aproximadamente US$650 bilhões, foram terceirizados para fornecedores locais, contra US$36 bilhões anuais que foram distribuídos para fornecedores de fora dos países de origem.

    A oferta de offshore outsourcing, ou seja, a terceirização dos serviços de TI para fornecedores de nações onde existam competência e mão-de-obra mais barata, foi desenvolvida pela Índia, que hoje detém mais de 80% do mercado global.

    No entanto, apesar da Índia continuar sendo vista como o destino preferido para a terceirização offshore, o mundo busca alternativas para entregar suas tarefas de tecnologia, evitando colocar “todos os ovos dentro de uma mesma cesta” e, consequentemente, minimizando riscos.

    A expectativa é que o Brasil aproveite o potencial de crescimento de 40 a 50% ao ano do global sourcing e se estabeleça entre os cinco maiores deste mercado até 2010, gerando US$ 5 bilhões/ano em exportações de software e serviços de TI. Diante disso, há diversos aspectos que apontam para o País como a principal alternativa à absorção da demanda internacional.

    Possuímos um dos maiores mercados internos do mundo, somos líderes globais em uso de TI em bancos de varejo e um dos mais sofisticados e eficientes na criação de soluções de automação bancária, principalmente em compensação de cheques e documentos. Nosso Sistema de Pagamentos Brasileiro (SPB), por exemplo, é apontado como um dos mais eficientes sistemas financeiros do mundo, através da rede que interliga as instituições financeiras ao Banco Central. Somos a nação mais avançada em uso do Internet banking, com 14% da população utilizando-o assiduamente.

    Além disso, o Brasil é o terceiro no mundo em volume de emissão de cartões de crédito, sendo que terminará este ano com 390 milhões de unidades em circulação no mercado (crédito, débito e outros) – um crescimento de 15% em relação a 2005, de acordo com a ABECS (Associação Brasileira de Empresas de Cartões de Crédito e Serviços).

    Entre as razões de tal excelência brasileira em tecnologia financeira, está o histórico da economia instável do País: na época da inflação e da alta variação do câmbio, os bancos precisaram investir em tecnologia e inteligência para o comando das operações financeiras, sujeitas a mudanças rápidas. E isso concedeu profundo conhecimento da indústria bancária ao nosso profissional de TI.

    Além da primazia no segmento financeiro, o Brasil ainda conta com um sistema eleitoral totalmente informatizado, que é tido como referência em todo o mundo. Diferentemente de outras nações, há alguns anos já realizamos nossas eleições por meio de urnas eletrônicas, o que possibilita a divulgação dos resultados em menos de 24 horas.

    Também trabalhamos num fuso horário similar ao dos clientes internacionais localizados no lado ocidental, possuímos uma cultura semelhante e ainda contamos com profissionais criativos e flexíveis.

    Porém, ainda temos algumas barreiras a serem superadas. Para que o Brasil seja reconhecido como um dos maiores exportadores de serviços de TI do mundo, é preciso que sociedade civil, governo e iniciativa privada se unam em prol do desenvolvimento tecnológico da nação.

    Inicialmente, existe a necessidade latente da formação de mão de obra especializada em tecnologia e, em especial, com domínio da língua inglesa. Há iniciativas neste sentido envolvendo Governo e empresas mas, é preciso mais para capacitar profissionais brasileiros para o atendimento a clientes globais.

    A discussão sobre encargos tributários, fiscais e trabalhistas também é importante – pois podemos perder competitividade frente aos nossos concorrentes.

    Existe ainda a necessidade da criação da “Marca Brasil de TI” no mercado externo, visando projetar globalmente a imagem do País ao buscar o reconhecimento da nossa capacidade. Para isso, é preciso que também haja a consolidação deste conceito em âmbito local, com a ampliação do debate sobre TI nas várias esferas da sociedade.

    A exemplo do que foi feito na Índia, o debate sobre tecnologia deve ser disseminado e estar presente no cotidiano das famílias e jovens trabalhadores brasileiros, de forma a sedimentar a TI na cultura brasileira.

    Tal medida promoverá um ciclo benéfico ao País – com o incentivo aos estudos, a formação de mão-de-obra qualificada à criação de empregos e ao fortalecimento das empresas nacionais, seremos capazes de atrair mais investidores externos, gerando oportunidades e divisas para o País. Nesse caso, todos ganham, afinal, temos muito mais do que samba e futebol.

  • Construindo um leitor de RSS feeds

    Neste artigo (adaptado a partir de algumas especificações da Adobe) vamos construir uma aplicação que vai ler o RSS feed de um determinado blog, mostrando os temas, alguma descrição dos mesmos e link para o conteúdo completo de cada um deles.

    Esta aplicação será feita inteiramente em linguagem MXML (linguagem do Flex) e suporte no Flex Builder 2. Para quem está iniciando nesta linguagem, pode dar uma lida na coluna do Igor Costa, onde explica de forma detalhada o que é o MXML e como funciona.

    Vamos então criar a nossa aplicação. Deverá tercriado um projeto Flex. Em seguida vá ao menu New > MXML Application, dê o nome LeitorRss e selecione o botão Finish. Será criado o arquivo LeitorRss.mxml.

    Em seguida defina as dimensões do layout do projeto para 500×500 no painel Layout no mx:Application (à direita).

    No modo Source, deverá ter o seguinte código:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="500" height="500">
    	
    </mx:Application>
    

    Acrescente a tag mx.Panel da seguinte forma:

    
    <mx:Panel  x="10" y="10" width="475" height="400" layout="absolute"></mx:Panel>
    
    

    Esta tag irá colocar um painel posicionado a 10 pixels do eixo x e do eixo y em relação ao layout e com 475 por 400 pixels de dimensão. Esse painel poderá ser criado pela forma gráfica, no modo Design, bastando para isso arrastar o componente Panel da categoria Layout e colocar as características acima descritas nas propriedades do Panel (lado direito).

    Em seguida, no modo Design, arrastamos para cima do painel criado, um Data Grid, uma tabela dinâmica (Components > Controls). No modo de visualização Source poderemos ver as seguintes tags:

    <mx:columns>
    	<mx:DataGridColumn headerText="Column 1" dataField="col1"/>
    	<mx:DataGridColumn headerText="Column 2" dataField="col2"/>
    	<mx:DataGridColumn headerText="Column 3" dataField="col3"/>
    </mx:columns>
    

    Apagamos a última coluna “Column 3”, uma vez que não será necessária. Voltamos ao modo Design, selecionamos a tabela (Data Grid) e, no painel de propriedades, colocamos o nome dgPosts no Id, a largura de 400 pixels (width) e posicionamos a grelha a x=20 e y=20.

    Arraste uma área de texto (TextArea), com a dimensão de 400 pixels de largura (width), 60 pixels de altura e na posição x=20 e y=180.

    Arraste agora um LinkButton para a parte de baixo da caixa de texto com o texto “Ler Post Inteiro”.

    Grave e execute a aplicação no botão Run. A aparência da nossa aplicação deverá ficar parecida com a da imagem:

    O próximo passo será fazer com que a aplicação vá buscar os últimos posts de um blog para os carregar na tabela dinâmica (Data grid). Para fazer essa operação, iremos utilizar um componente chamado HTTPService. Logo após a tag <mx:Application … escrevemos a tag HTTPService do seguinte modo:

    <mx:HTTPService id="feedRequest" url="http://www.paulosilva.net/blog/?feed=rss2" useProxy="false" />
    
    

    Este componente enviará um pedido de resposta ao servidor por meio de um HTTP GET ou POST e depois lerá os dados recebidos. Neste caso estou incluindo a URL do RSS feed do meu blog, um RSS 2.0. A propriedade useProxy=”false” indica que não será utilizado um servidor proxy para que o Flash Player possa aceder aos dados. Em seguida iremos fazer com que a aplicação envie resposta um URL específico. Para isso vamos colocar na tag mx:Aplication a propriedade creationComplete=”feedRequest.send()”.

    Com isto, mal a aplicação inicie, o HTTPService envia uma chamada ao servidor, este envia a resposta HTTP GET ou POST para o URL específico e é retornado uma resposta HTTP. Ou seja, neste caso é enviado um RSS feed em formato XML.

    Agora vamos colocar o título do blog na janela principal (e única) da nossa aplicação.

    Na tag <mx:Panel> acrescente a propriedade title=”{feedRequest.lastResult.rss.channel.title}”

    Esta propriedade vai colocar o título do blog no topo da janela. A linha {feedRequest.lastResult.rss.channel.title} vai buscar ao nó “title” do documento XML o título do blog o qual irá aparecer na janela.

    Agora grave e teste (Run). Deverá aparecer o título do blog na janela.

    Em seguida vamos popular a tabela (Data grid) com os dados do blog, títulos e datas.

    Para isso vamos colocar o componente dataProvider nas tags <mx:DataGrid>, componente este que vai buscar os dados pretendidos, títulos e datas dos posts.

    Logo, na primeira coluna, altere o título da coluna (headerText) para “Título dos Posts” e o dataField para “title”:

    <mx:DataGridColumn headerText="Título dos Posts" dataField="title"/>
    
    

    Na segunda coluna, troque o título para “Data” e o dataField para “pubDate”:

    <mx:DataGridColumn headerText="Data" dataField="pubDate"/>
    
    

    Grave e teste (Run). Deverão aparecer os últimos títulos do blog e respectivas datas na tabela.

    Para que, ao selecionar um dos títulos na tabela, possa aparecer uma descrição do post na área de texto, vamos acrescentar a propriedade htmlText na tag<mx:TextArea>. Acrescentamos então htmlText=”{dgPosts.selectedItem.description}”:

    <mx:TextArea htmlText="{dgPosts.selectedItem.description}" x="20" y="180" height="60" width="400"/>
    
    

    Grave e veja se, ao selecionar uma linha da tabela, aparece o texto na área de texto.

    Agora, para que as colunas da tabela recebam os dados, vamos acrescentar na tag <mx:DataGrid> o id=”dgPosts” e o componente dataProvider=”{feedRequest.lastResult.rss.channel.item}” que irá receber os dados do XML:

    <mx:DataGrid id="dgPosts" dataProvider="{feedRequest.lastResult.rss.channel.item}" x="20" y="20" width="400">
    
    

    Neste momento apenas nos falta fazer com que o text link possa abrir uma página com o post escolhido completo. Para isso vamos acrescentar a propriedade click na tag <mx:LinkButton>. Esta propriedade irá buscar o URL do post e abrir uma nova janela com o mesmo. Para isso, colocamos: click=”navigateToURL(newURLRequest(dgPosts.selectedItem.link)); pelo que a tag deverá ficar:

    <mx:LinkButton click="navigateToURL(newURLRequest(dgPosts.selectedItem.link));" x="20" y="264" label="Ler Post Inteiro"/>
    
    

    Neste momento o código da nossa aplicação deverá estar assim:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="feedRequest.send()" width="500" height="500">
    <mx:HTTPService id="feedRequest" url="http://www.paulosilva.net/blog/?feed=rss2" useProxy="false" />
    	<mx:Panel title="{feedRequest.lastResult.rss.channel.title}" x="10" y="10" width="475" height="400" layout="absolute">
    		<mx:DataGrid id="dgPosts" dataProvider="{feedRequest.lastResult.rss.channel.item}" x="20" y="20" width="400">
    			<mx:columns>
    				<mx:DataGridColumn headerText="Título dos Posts" dataField="title"/>
    				<mx:DataGridColumn headerText="Data" dataField="pubDate"/>
    			</mx:columns>
    		</mx:DataGrid>
    		<mx:TextArea htmlText="{dgPosts.selectedItem.description}" x="20" y="180" height="60" width="400"/>
    		<mx:LinkButton click="navigateToURL(new URLRequest(dgPosts.selectedItem.link));" x="20" y="264" label="Ler Post Inteiro"/>
    	</mx:Panel>
    </mx:Application>
    
    

    Grave e teste a aplicação. A mesma deverá ter o aspecto da imagem seguinte.

    Este artigo mostra como o MXML é uma linguagem de fácil compreensão. Espero que tenham gostado!

  • TI pega carona no crescimento do entretenimento

    Entretenimento é a palavra de ordem no mundo do futuro. Nove em cada dez especialistas admitem que ele permeará a maior parte das atividades humanas. Da educação ao marketing, passando pela prestação de serviços e pelos ambientes de trabalho, o entretenimento estará presente no modo de fazer as coisas em boa parte das profissões e no dia-a-dia do planeta durante as próximas décadas.

    A indústria do entretenimento cresce a cada dia visando atender a uma demanda cada vez maior de pessoas que, esgotadas pelo cotidiano, reservam um tempo para si. Dentro deste universo, existem diversos segmentos em plena expansão, tais como games, cinema, TV Digital, dispositivos móveis, Internet e realidade virtual, entre outros.

    O instituto de pesquisas On World, especializado em tecnologia sem fio, fez um levantamento com CEOs de TI e do setor eletroeletrônico e descobriu que 35% deles têm interesse em combinar VoIP com aparelhos móveis de entretenimento, como o iPod. A união de vídeos, músicas, notícias, mensagens instantâneas e comunicação de voz sobre IP pode gerar uma massa de 100 milhões de consumidores usuários de VoIP em 2011, segundo o estudo.

    Daqui a cinco anos, a indústria de PCs também alcançará a de Telecom em lançamentos de dispositivos VoIP. Os aparelhos com acesso Wi-Fi representarão 36% do total, prevê a On World. A comunicação se dará principalmente por meio do Skype, que até 2011 representará 25% dos usuários de VoIP no mundo, com receita de US$ 1,2 bilhão.

    O mercado global de games para celular vai alcançar cerca de US$ 1 bilhão em 2004, segundo pesquisa realizada pela Screen Digest. Até 2010, deve chegar a US$ 6,4 bilhões. Atualmente, Japão e Coréia respondem por 80% da receita gerada pelos games. O estudo aponta que, na Europa, o crescimento está sendo prejudicado pelas tarifas cobradas pelas operadoras. Já o mercado norte-americano deve crescer mais rapidamente que nas outras regiões.

    O Brasil pegou carona neste crescimento e diversas empresas de tecnologia estão investindo milhões em novos produtos e serviços. O mercado de games para celular cresce de forma estável, 18% ao ano, já há pelo menos dois anos. A Jupiter Research determinou o valor do mercado de games para celular no mundo em 2006 em US$ 3 bilhões, e em 2011 a estimativa oficial é de US$ 18 bilhões. Ou seja, é um mercado que deve crescer seis vezes em cinco anos.

    No setor do cinema, as novas tecnologias diminuíram a fronteira entre animação e cinema – não existiriam filmes como “King Kong”, “Harry Potter”, “Superman Returns”, “Piratas do Caribe”, “Jurassic Park” etc. sem tais tecnologias. A animação está na TV, na Web, em iPods, nos celulares e nos videogames.

    Para suprir este mercado, será necessária uma gama significativa de profissionais. As faculdades de tecnologia, analisando este cenário, precisarão reformular suas grades curriculares, inserindo disciplinas voltadas para a formação de profissionais que atuem nessas áreas. Entre as disciplinas, destacam-se Fundamentos de Games, Tecnologias de Desenvolvimento Web, Interface Homem-Máquina, Design de Games, Telecomunicações, Redes de Computadores e Inteligência Artificial. Com isso, o profissional, além de atuar nas mais diversas áreas de TI, poderá desempenhar funções no setor de entretenimento.

  • Cobertura: Conferência Web 2.0

    Aconteceu nos dias 28 de fevereiro e 1 de março, a 1 Conferência Web 2.0, organizada pela Converge Comunicações, em São Paulo. Reuniu grandes nomes da web brasileira para discutir o polêmico tema web 2.0 e o iMasters esteve presente ao evento para acompanhar as novidades.

    Abel Reis, da Agencia Click, abriu a conferência apresentando o tema “Web 2.0: Evolução ou Revolução?” onde abordou desde assuntos como longtail até previsões sobre uma possível web 3.0, baseada em semânticas ricas e agentes inteligentes. Questionou as desvantagens apontando a segurança de informações sigilosas armazenadas em serviços on-line como o principal problema desta nova onda de aplicativos web. Terminou concluindo que o fenômeno se trata de evolução do ponto de vista técnico, e uma revolução do ponto de vista ideológico.

    Dave Gonzales, gerente de Marketing para América Latina da Intel, mostrou como o poder de processamento atingindo com a nova geração de chips ajudou na popularização de streaming de vídeo e falou também da estratégia da Intel em investir em novas arquiteturas ao invés de investir em clocks mais altos.

    Em palestra com o título “Negócios 2.0”, Marcello Póvoa, sócio e diretor executivo da MMP Solutions, mostrou o evolutivo da web até os dias atuais apresentando o sucesso do IPO da Google como marco da retomada de investimentos após o estouro da bolha, apontando dentre outros agentes catalizadores a grande massa de usuários ativos, banda larga e convergência de mídias.

    A principais características da web 2.0, segundo ele, são as redes sociais, a flexibilidade no conteúdo, web como plataforma e o beta eterno (software não tem fim). Para Póvoa, buscas semânticas, distribuição multi-canal(pc, televisão, PDA, celular e etc..) e a usabilidade são as tendências do mercado web.

    Carlos Nepomuceno foi quem mais surpreendeu o público, apresentando o ICOX (Gerenciador de Inteligência Coletiva) e anunciando o fim do gestor de conteúdo. “Não haverá mais conteudistas. O grosso do conteúdo será postado pelos usuários” afirma Nepomuceno. Quem trabalha com conteúdo caminha para tornar-se um apicultor, isto é, aquele que cuida para que a comunidade de abelhas produza bom mel, se referindo ao mel como o conteúdo produzido pelos usuários.

    O acontecimento mais esperado do evento, o Painel dos Portais, contou com a presença de personagens importantes da internet brasileira como Caio Tulio Costa (Presidente do iG, iBest e BRTurbo), Paulo Castro (Diretor Geral do Terra), Adriana Grineberg (responsável pela publicidade do Google, e veio no lugar de Alexandre Hohagen que não pode comparecer) e Agenor Castro (Diretor de Marketing para South Latin América do Yahoo!). Durante o debate chegou-se a conclusão que ainda há muita resistência por parte dos anunciantes em aceitarem iniciativas inovadoras, resistência das agências em apostar em formatos cujo retorno não é garantido e até em sites que não oferecem oportunidade para inovação.

    Adriana falou sobre como o Google avalia se um serviço deve ser investido ou não, tomando como principal critério a popularidade do serviço. Agenor Castro anunciou que o Yahoo! está trazendo para o Brasil serviços como o Flickr e del.icio.us, sites que fazem muito sucesso e são icones da web 2.0.

    Adriana Grineberg fala sobre os serviços do GoogleAdriana Grineberg fala sobre os serviços do Google

    Na contagem final, o evento foi realmente muito empolgante e também divertido, com perguntas do público que esquentaram os debates. Agora estou aguardando no ano que vem a Conferência Web 3.0.

  • ASP.NET 2.0 – Criando urls pra web 2.0

    Artigo recomendado para Visual Studio 2005 SP1

    A Web 2.0 está modificando completamente a forma com a qual estávamos acostumados a divulgar nossas páginas. Antigamente fazíamos um cadastro com palavras chaves nos principais portais de busca de contéudo, agora os mesmos passaram a indexar completamente todo conteúdo favorecendo as páginas com muitas referências. Os novos motores de busca varrem todos os links relacionados e mesmo que você não cadastre seu site, ele pode ser indexado porque alguém inseriu seu link no site dele.

    Essa dinâmica está envolvendo novas tecnologias e comportamentos como o uso do AJAX. A proposta desse artigo é modificar as urls tradicionais de sua aplicação que passam parâmetros para novas urls que já incluem no caminho da mesma. Isso fará com que seu site seja visualizado mais vezes pelos motores de busca por que ele vão entender que o site possui várias paginas ‘Url virtuais’ conforme Tabela 01.

    Url Original: http://localhost/meusite/produtos.aspx?Codigo=75

    Url Modificada: http://localhost/meusite/produtos/75

    Tabela 01: Modificando urls tradicionais.

    Na prática o que estaremos fazendo é enganar os motores de busca usando o httpmodules do asp.net para tratar uma url que não existe em nosso site (http://localhost/meusite/produtos/75) e responder com outra url internamente com a informação solicitada. Com isso uma pagina com 100 parâmetros se comporta como se fosse 100 paginas. Esse truque pode ser usado para diversas outras finalidades inclusive para urls temporárias exclusivas para um usuário logado.

    Para iniciar nosso artigo, crie um projeto > C# > ASP.NET Web Application (WebRewrite) e adicione um novo arquivo: Projeto > Add > New Item > Class com o nome de ProfessionalComputing.goUrl.cs .

    O objetivo desse arquivo é codificar a classe goUrl que implementa a interface IHttpModule para interceptar t