Blog

  • A desvalorização do setor tecnológico

    Há tempos ensaio o meu ingresso aqui no iMasters para escrever algo sobre a minha especialidade: Flash/ActionScript, e por falta de tempo, sempre acabei adiando. Agora vamos ver se consigo reservar um tempo para a escrita.

    Pois bem, nesses últimos dias, me aconteceu um fato bastante interessante que eu gostaria de compartilhar e pensar com vocês. Uma amiga me encontrou na rua e foi logo me dizendo, “Bini, preciso aprender Flash!”.

    No momento fiquei um pouco confuso, pois esta pessoa é formada em letras, mas logo segui a conversa:

    – Você entende de Algoritmos?

    – Ahn?

    – Você sabe alguma linguagem de programação?

    – Tenho um primo que sabe isso ai sim!

    […]

    Continuando a conversa lhe expliquei que Flash não é uma coisa muito simples e ela me explicou que está tentando fazer o site da empresa aonde trabalha para ajudar, e o dono não está interessado em desenvolver o site com uma agencia, nem tampouco em investir em cursos para os funcionários.

    Após toda essa conversa, em um melhor momento me questionei: “O que eu faço, qualquer um faz?”, não que eu seja excêntrico ao ponto de achar que é impossível uma pessoa formada em letras não conseguir aprender Flash. Logo me fiz outra pergunta: “Qual o valor da minha profissão?”.

    Comentei o caso com alguns amigos de profissão e notei que todos tinham se feito as mesmas perguntas que eu me fiz.

    Ainda intrigado com o caso, fiz uma breve pesquisa com algumas empresas onde eu tenho acesso fácil, e notei que a grande maioria das médias e pequenas empresas não trata a Informática, como um setor, mas sim como uma ferramenta, um auxílio. Apenas as próprias empresas de tecnologia fazem isso.

    É fato que hoje, a informatização esta muito acelerada, mas ainda uma boa parte das pessoas responsáveis pelo tal ‘setor’, são desqualificadas ou mesmo são pessoas de outros setores que acabam fazendo os chamados ‘gatos’ ou ‘gambiarras’ como minha amiga.

    Honestamente não sei se a culpa é das empresas ou dos empregados, mas está mais que na hora: dos profissionais se especializarem realmente; das empresas reconhecerem estes profissionais e o nosso tão importante setor. Acredito que este é o primeiro passo para em breve, sermos reconhecidos também pelas grandes massas como profissionais que somos, e não como “Rapazes que mexem bem no computador”.

    Espero que tenham gostado deste meu primeiro artigo, e espero em breve poder partilhar do pouco conhecimento que tenho com vocês. Grande abraço e fiquem com Deus.

  • Gerência do Açoite

    Quando pensamos no antigo Egito, surgem as imagens das pirâmides, com todos aqueles escravos trabalhando nas pedreiras e seus “supervisores”, com açoites nas mãos, vigiando qualquer trabalhador que estivesse diminuindo o ritmo ou evitando trabalho. Ao menor sinal de esmorecimento, o supervisor fazia ameaças ou usava o açoite para fazer com que o escravo trabalhasse a todo vapor. Essa pressão constante era necessária para fazer com que aquelas pessoas fizessem o trabalho mesmo não recebendo nada para fazê-lo.

  • Acessando serviços web do YAHOO!

    Olá pessoal. Esse é meu primeiro artigo aqui no iMasters e espero que vocês gostem.

    Conhecimentos necessários.

    Para o melhor aproveito deste artigo é bom que você tenha familiaridade com alguma linguagem de programação server-side e básicos conhecimentos em Ajax e W3C DOM.

    Vou explicar como fazer um serviço de busca no YAHOO! usando Ajax e PHP.

    Para entender melhor o que seria um Web Service clique aqui.

    As técnicas mais conhecidas são SOAP (Simple Object Access Protocol) e a WSDL (Web Services Description Language) mas a técnica que o YAHOO! escolheu é a REST.

    A REST é o protocolo publico que o YAHOO! disponibiliza seus serviços. Eles a escolheram pois são fáceis de entender e apreciam sua acessibilidade à maioria das linguagens de programação modernas.

    Por que usar a REST (Representational State Transfer)?

    Com ela podemos solicitar dados através de uma URL (via GET) de um serviço e adicionamos somente parâmetros para a busca. É a forma que usamos hoje para muitos serviços. Um exemplo seria http://www.minhapagina.com.br?categoria=futebol.

    Técnicas como a SOAP é necessário o envio de uma XML via POST, isso pode ser mais propenso a erros, pois podemos esquecer uma aspa e outra ali.

    Sobre o serviço do YAHOO!

    Além de você poder buscar em toda a internet, você também pode fazer a busca somente em um site específico. Desta forma, você aproveita os índices os YAHOO! para criar uma busca interna em seu site, sem se preocupar em cadastrar em um banco de dados.

    Para maiores detalhes sobre parâmetros que podemos passar, acesse: http://developer.yahoo.com/search/web/V1/webSearch.html

    XMLHttpRequest é o método perfeito para o acesso?

    Considerando que o retorno do conteúdo do YAHOO! vem através de uma XML e podemos usar os métodos W3C DOM para manipular os resultado, ele é um ótimo método. Porém esse método só tem acesso a recursos dentro do mesmo domínio que o documento que o conteúdo foi gerado.

    O que podemos fazer é criar uma gateway (nada mais é que uma porta de saída). O gateway aceitará solicitações do objeto XMLHttpRequest e a encaminhará para o YAHOO!. Quando o YAHOO! responder com os resultados da busca o gateway simplesmente roteará para o navegador. A vantagem de usamos um gateway é que posteriormente podemos estender esse serviço com outro buscadores.

    Criando a Gateway

    Para esse artigo usaremos PHP como linguagem server-side, mas você pode escolher a linguagem que esteja mais familiarizado. A gateway só vai ler o conteúdo de uma URL, já com os parâmetros de busca concatenados na string.

    <?php
    	//informa ao navegador que o retorno do documento é uma xml
    	header ("content-type: text/xml");
    	//recebe os parametros para gerar a query
    	$query = (string) urlencode ( $_REQUEST['query'] );
    	$resultados = (int) $_REQUEST['resultados'];
    	$regiao = (string) $_REQUEST['regiao'] != "internet" ? $_REQUEST['regiao'] : NULL;
    	$site = (string) $_REQUEST['site'];
    	
    	//Busca o resultado da busca 
    	$handle = fopen ("http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=seu_app_id&type=all&query=".$query."&results=".$resultados."®ion=".$regiao."&site=". $site,'r');
    	//enquanto houver resutados ele exibe na tela para o ajax
    	while (!feof ($handle)) {
    	   $buffer = fgets( $handle , 4096 );
    	   echo $buffer;
    	}
    	//fecha a URL solicitada
    	fclose ( $handle );
    ?>

    Creio que os comentários já são auto-explicativos.

    Criando o JavaScript

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Minha busca no YAHOO!</title>
    <script type="text/javascript">
    var xmlHttp;
    	//CRIA UMA CONEXÃO XMLHttpRequest
    	function ajaxInit () {
    		try {
    			xmlHttp = new XMLHttpRequest();
    		}
    		catch (ee){
    			try {
    				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    			}
    			catch (e) {
    				try {
    					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    				}
    				catch (E) {
    					alert("Seu browser não está comJavaScript ativado!");
    				}
    			}
    		}
    	}
    	
    	function buscar (){
    		//exibe um status da busca para o usuario final
    		loading();
    		//URL que iremos utilizar com gateway 
    		var url = "http://localhost/imasters/yahoo_gateway.php?" + generateQueryString();
    		//instacia o objeto XMLHttpRequest
    		ajaxInit();
    		//chama a função que controla os estados da requisição
    		xmlHttp.onreadystatechange = mudarEstado;
    		//abre a conexão
    		xmlHttp.open ( "GET" , url , true );
    		xmlHttp.send(null);
    	}
    	
    	function loading () {
    		//somente adiciona um texto carregando para o usuario saber quer algo está sendo feito
    		var resultados = document.getElementById('resultados').innerHTML = "Carregando...";
    	}
    

    A primeira coisa a fazer é criar o objeto XMLHttpRequest. Creio que você já esteja acostumado a manipular esse objeto.

    O próximo passo é criar a função que será chamada ao executar o evento da busca.

    Nesta função, também não temos tantas novidades. Somente atribuímos a função mudarEstado para cada alteração onreadystatechange.

    /**
     * Busca os valores e os concatena em uma string para enviar ao nosso gateway
     */
    function generateQueryString() {
    	//pega os valores da busca do usuario
    	var query = document.getElementById('query').value;
    	var quantidade = document.getElementById('quantidade').value;
    	var site = document.getElementById('local').value;
    	var regiao = document.getElementById('regiao').value;
    	var ts = new Date().getTime();
    	//A hora ao final da query string é somente para evitarmos cache
    	return "query=" + query + "&resultados=" + quantidade + "&site=" + site + "®iao=" + regiao + "&ts=" + ts;
    }
    
    function mudarEstado(){
    	if ( xmlHttp.readyState == 4 ){
    		if ( xmlHttp.status == 200 ) {
    			parseTodosResultados();
    		}
    		else {
    			alert ("Ocorreu um erro ao acessar o YAHOO!");
    		}
    	}
    }

    Na função mudarEstado verificamos se o documento foi recebido com sucesso. Caso não tenha problemas, chamamos a função parseTodosResultados.

    /**
     * Vamos fazer o parse de toda XML aqui
     * Ela navega em cada nó RESULT e passa para a parseResultado para exibirmos para o usuario final
     */
    function parseTodosResultados (){
    	//apaga se houver resultados anteriores!
    	limpar();
    
    	//pega o nó com os resultados "Result"
    	var resultados = xmlHttp.responseXML.getElementsByTagName("Result");
    	//Caso não encontre resultados
    	if ( resultados.length == 0 ){
    		document.getElementById('resultados').innerHTML = "não há resultados para a busca";
    		return;
    	}
    	//para saber o total de resultados
    	headerSets();
    	
    	var resultado = null;
    	//navega entre os resultados
    	for (var i = 0 ; i < resultados.length; i++){
    		resultado = resultados[i];
    		parseResultado( resultado );
    	}
    }
    /**
     * Função para uma futura paginação de resultados.
     */
    function headerSets(){
    	//antes/após lermos as tags result podemos querer gerar uma páginação dos resultados
    	//para isso o YAHOO! disponibiliza como a primeira  tag ResultSet onde eles exibem o total de resultados disponiveis
    	var resultSet = xmlHttp.responseXML.getElementsByTagName ("ResultSet");
    	var totalResultados = resultSet[0].attributes['totalResultsAvailable'].nodeValue;
    	//para a criação de páginação de resultados deixarei como exercicio.
    }
    

    Na função parseTodosResultados() atribuímos a variável “resultados” todos os nós <Result>. Caso não tenha nenhum nó, exibimos para o usuário que não há resultados.

    Do contrário vamos navegar em cada nó <Result> e passaremos os resultados para a função parseResultado().

    /**
     * Esssa função recebe um nó result e irá extrair seus valores
     * Ela utiliza métodos W3C DOM para gerar código XHTML 
     * OBS.: criei uma função chamada getElementoTexto ela extrai o texto do nó informado. 
     */
    function parseResultado ( resultado ){
    	//cria uma div onde o resultado ficara dentro
    	var div = document.createElement("div");
    	//cria um elemento h3 para os titulos
    	var titulo = document.createElement("h3");
    	//extrai do nó "Title" seu texto e adiciona o texto para o titulo
    	titulo.appendChild( document.createTextNode( getElementoTexto( resultado , "Title" ) ) );
    	//adiciona o titulo para a div
    	div.appendChild ( titulo );
    	//cria um texto e extrai o texto do no "Sumary"
    	var descricao = document.createTextNode( getElementoTexto( resultado , "Summary" ) );
    	//adiciona para a div o texto
    	div.appendChild( descricao );
    	//cria um elemento <br /> para quebrar a linha
    	div.appendChild( document.createElement("br") );
    	//criamos um elemento para um link
    	var tagLink = document.createElement( "a" );
    	//adiciona o atrubuto href da tag e extrai o link absoluto até a página da busca
    	tagLink.setAttribute ("href" , getElementoTexto( resultado , "ClickUrl" ));
    	//para abrir em uma nova página
    	tagLink.setAttribute ("target" , "_blank" );
    	//o texto do link que vai ser exibido para o usuario final
    	txtLink = document.createTextNode( getElementoTexto ( resultado , "DisplayUrl") );
    	//adiconamos o texto do link para a tag A
    	tagLink.appendChild ( txtLink );
    	//coloca o link dentro da div
    	div.appendChild( tagLink );	
    	//um linha vertical
    	div.appendChild( document.createElement("hr") );
    	//colocamos toda a div no local dos resultados
    	document.getElementById('resultados').appendChild( div );
    }

    A função parseResultado nada mais faz que criar o XHTML que iremos exibir os resultados. Nela utilizamos o W3C DOM para gerarmos a página de resultados.

    O primeiro passo da função é criar uma <div> que irá abrigar todos os dados da busca (titulo, descrição, link, etc..).

    Depois criamos um <h3> que nos servirá como titulo da cada resultado.

    Então nos adicionamos ao titulo o texto contido na tag <Title> e encontramos outra função muito importante a getElementoTexto.

    /**
     * Essa função extrai o texto dentro de uma tag especifica
     * Ela recebe como parâmetro todo o nó result e ainda o elemento que desejamos extrair
     */
    function getElementoTexto ( parentNode , atributo ) {
    	//no nó result ele ira busca todas as tag com o atributo q desejamos ("title","sumary")
    	var childTag = parentNode.getElementsByTagName( atributo );
    	//caso tenha algum valor
    	if (childTag[0].firstChild != null)
    		//do primeiro nó encontrado (firstChild) ele retorna o conteudo dentro da tag (nodeValue)
    		return childTag[0].firstChild.nodeValue;
    }
    
    function limpar(){
    	//pega os resultados antigos
    	var resultados = document.getElementById('resultados');
    	while (resultados.childNodes.length > 0){
    		//remove o primeiro no dos resultados antigos
    		resultados.removeChild(resultados.childNodes[0]);
    	}
    }
    </script>
    <style type="text/css">
    #resultados {
    border: 1px solid #ccc;
    background-color: #eee;
    font-family: Arial, Helvetica, sans-serif;
    }
    #resultados h3 {
    
    color: #000066;
    }
    </style>
    </body>
    </html>

    Considerações finais

    Como vocês viram, é bem simples utilizar a API do YAHOO! Para realizar consultas na internet ou mesmo no seu site. Confira na parte de developers do YAHOO! outros parâmetros que podemos utilizar para filtrar melhor ainda a busca.

    Outra coisa importante, que vale a pena mencionar, é que na primeira TAG de retorno do YAHOO!, ele nos informa a quantidade de resultados. A função headerSets pega esses valores. Eu só não implementei a parte de criar a paginação de resultados. Deixo isso como um tarefa de casa. Tente fazê-la utilizando métodos W3C DOM.

    Estes são os arquivos do artigo Download

    Bom pessoal, é isso! Até a próxima!

  • Influenciando a decisão do cliente a seu favor

    O cliente deseja contratar um serviço web e chega até sua empresa. Os dois farão bom negócio? Antes desse momento uma série de fatores no meio pode atrapalhar. Tente virar o jogo.

    O processo de decisão na hora da compra de serviços web é cada vez mais complexo e envolve freqüentemente diversas variáveis, que influenciam a formação da opinião do cliente – o comprador – e o fazem decidir entre dois ou mais fornecedores de serviços.

    Diferente da compra de produtos, geralmente feita por impulso e critérios razoáveis de comparação, a compra de serviços é um processo cheio de nuances muitas vezes estressantes para o fornecedor.

    Cada cliente tem uma visão particular de internet e cada empresa uma postura em relação ao assunto. Muitas nem mesmo têm uma visão.

    Assim, o fornecedor não sabe se haverá um “escolhido”, mas sabe que todo o esforço pode resultar numa resposta do tipo “Resolvemos adiar a compra do nosso site” ou “Nossa extranet vai ficar para depois, ainda não temos todos os requisitos e agora precisamos aprovar um orçamento para isto”.

    Alguns posicionamentos do fornecedor, no entanto, podem ajudar a torná-lo a opção mais adequada. Ainda assim, diversas circunstâncias influem na escolha final. A palavra chave deste processo é justamente esta: “circunstâncias”.

    Preço. Entre dezenas de fatores que ajudam a decidir, é certo que um dos mais populares é o preço. Por melhores que sejam as alternativas, por mais diferentes que se apresentem, o preço ainda é um fator decisivo na hora da compra. Em função disso, observamos uma concorrência predatória e nociva no mercado de desenvolvimento de soluções para web.

    Este não é um privilégio dos desenvolvedores; trata-se de uma prática comum em mercados desregulamentados (aqui cabe dizer que isto não é uma observação com fundo subliminar defendendo qualquer regulamentação, apenas uma constatação do cotidiano).

    Diante de seguidas negativas com o argumento preço como fator de escolha, muitos (desenvolvedores ou empresas) acabam por “flexibilizar” sua política de preços (ou mesmo perguntar o preço esperado para em seguida oferecer seu serviço por alguns tostões a menos).

    Profissionalização. Por outro lado, há uma crescente profissionalização de free-lancers e pequenas empresas, que aprimoram seus conhecimentos em outras áreas e se estabelecem em um mercado novo, competitivo e em constante mudança.

    Já é comum falar em métricas de desenvolvimento, qualidade de atendimento, multas para o não cumprimento de prazos, postura profissional e outras atitudes que colaboram para o desenvolvimento de um mercado maduro, com lugar para todos, onde é possível alcançar o sucesso profissional sem desmontar concorrentes nem desvalorizar o próprio suor.

    Vários comportamentos compõem uma decisão de compra. Quanto maior o cliente, mais fatores serão julgados. Entre estas circunstâncias estão aspectos tangíveis (como o preço) e muitos intangíveis (como profissionalismo e nível de formalidade). Dentre estas circunstâncias, há espaço para o fornecedor influenciar positivamente.

    Faça uma proposta coerente com o que o cliente deseja. Não adianta empurrar uma solução que não resolverá os problemas do cliente, sejam eles complexos ou muito simples. O cliente vai perceber se você estiver inflexível ou insistir em oferecer algo que ele não precisa ou não quer.

    Entenda o que deseja o cliente. Muita gente precisa de soluções, mas não sabe exatamente o quê ou como. Entenda os comentários que ficam implícitos na conversa e não tenha medo de perguntar: “Tenho uma solução ótima para este seu caso, posso explicar um pouco sobre ela?” Seja breve e objetivo. Comece mostrando os benefícios que trará e nem pense em falar tecnês, pois cliente não gosta de termos técnicos demais sem necessidade.

    Jamais comece um trabalho sem receber algo, com a promessa de receber tudo na entrega. Exija algo como 30% na assinatura. Isso demonstra profissionalismo e o cliente saberá valorizar seu trabalho. Caso ele desista no meio do caminho, mostre que seu trabalho já foi em parte desenvolvido e merece ser remunerado. Em último caso, use o contrato a seu favor e recorra a meios legais.

    Esteja disponível, retorne recados e responda e-mails o mais rápido que puder. Um atendimento paciente, efetivo e competente constrói uma imagem de segurança e transmite comprometimento com o cliente. Isso é tudo que ele mais quer.

    Explique em detalhes o que ele está comprando. Ensine o cliente a divulgar o site, a tirar vantagem da internet e a economizar dinheiro usando e-mail ao invés do telefone, por exemplo. Depois que ele se acostumar, não vai querer voltar atrás nem negociar preço.

    Flexibilidade tem limite. Seja flexível no preço, mas somente dentro de seus parâmetros. Estabeleça quais são eles: determine antes com sua equipe qual o mínimo que aquilo pode custar e como o cliente poderá pagar.

    Leilão não. Seja competitivo, mas não prostituído. Se perceber que o cliente está fazendo leilão, ligando para você e para outro fornecedor para baixar muito o preço, seja profissional e responda que não é possível manter a mesma qualidade por um preço tão baixo. Afinal, se ele quisesse um automóvel Astra pelo preço de um Corsa a concessionária não iria vender, certo?

    Pagamento em muitas parcelas. Parcelamento é diferente de financiamento. Em um país como o nosso, receber tudo à vista nem sempre é possível. Parcele, mas não a perder de vista.

    Dê referências. Incentive seu cliente prospect a ligar para seus clientes mais antigos e perguntar sobre você ou sua empresa. Quem confia no próprio trabalho sabe que pedir referência é certeza de bons frutos.

    Vale a pena dar uma olhada em alguns sites de RH e estudar sobre o relacionamento com clientes. O Sebrae tem muito a ensinar nesse quesito. Para formar um mercado forte, temos de ser todos fortes.

  • Nome das Cores

    Olá pessoal. Primeiramente gostaria de agradecer a todos que acessaram e participaram de meu último artigo publicado, com comentários e e-mails. Gostaria também de pedir desculpas a todos pela minha ausência. O tempo está ficando curto para todos nós. Aproveito para dedicar esta matéria a minha mulher.

    Nome das cores

    O nome de uma cor é o rótulo lingístico que as pessoas dão às cores. Tal cor é determinada por uma cor física e/ou alguma outra característica física como reflexão ou iridescência. Algumas vezes dar nome às cores é limitado apenas à descrição de uma característica de uma cor física.

    Dar nome às cores depende de cada língua especificamente. Pode haver um vasto e complexo sistema que represente a determinação de uma cor em uma dada língua. Geralmente, dar nome a uma cor envolve um vocabulário e uma sintaxe gramatical.

    Nomeando a paleta

    Como a paleta das cores é continua, nomear uma cor envolve quantização, freqentemente com um vocabulário que especifique a gradual transformação de uma cor na outra. Para exemplo, podemos falar sobre a chamada paleta das cores RGB, onde cada cor ganha um valor numérico para tonalidade, saturação e intensidade, a qual é suficiente para determinar qualquer cor, como definida pela Física e percebida pelos olhos humanos. Cada um desses valores pode mudar gradualmente.

    No entanto a mudança gradual de tonalidades é descrita mais freqentemente de uma forma descontinua. Tomemos como exemplo as cores laranja, amarelo, amarelo-limão; graduações da saturação podem ser expressas como pálido, normal e vivo, e a intensidade pode ser descrita por escuro, médio e claro. Como essa forma de nomear pode gerar nomes extensos, atalhos como pastel, significando pálido claro, ou nomes descritivos comooliva, significando verde-amarelado relativamente escuro, são também usados.

    Nomear cores não se atem somente a alguma característica física das cores, mas mistura varias delas. Prata é uma característica da reflexão que não modifica a tonalidade da cor, enquanto ouro adiciona um tom amarelo característico. Essas espécies de reflexões recebem também nomes como metalico ou alumínio, enquanto outros efeitos da reflexão, difração, e dispersão da luz podem receber nomes como fluorescente ou opalino.

    Características da superfície e da iluminação podem apresentar diferentes visualizações, provocando modificações na nomenclatura. A nomenclatura de nomear a paleta de cores pode ser também hierárquica. A partir de amarelo e vermelho, cores básicas, nomeamos o laranja, que é todo um conjunto de cores entre ambas, e podem portanto serem quantificadas entre amarelo e vermelho.

    Regularidade

    Berlin e Kay, em um estudo de 1969, demonstraram que existe uma regularidade substancial em nomear as cores nos diferentes idiomas. Nesse estudo identificaram os termos básicos: preto, cinza, branco, rosa, vermelho, laranja, amarelo, verde, azul, roxo e marrom. Hoje em dia considera-se que toda linguagem que tem termos para cores, usa de dois a doze termos básicos. Todas as outras cores são consideradas variantes destes termos básicos para cores. Português e o inglês usam os onze nomes acima, russo e italiano distinguem, usando nomes diferentes entre azul e azure, (um tipo de azul claro), tendo, portanto doze termos. Nos distinguimos o azul claro e escuro, mas não utilizamos nomes diferentes. Já para vermelho claro utilizamos rosa, outros idiomas podem não fazê-lo.

    Enquanto a variação no numero de termos básicos para cores entre as linguagens podem se dever a diferenças culturais, existe sem duvida um modelo do padrão como os nomes se incluem no idioma. Como se esperaria, uma linguagem com apenas dois termos nomeia o preto e o branco. A próxima cor é o vermelho, normalmente seguida de verde e azul. Berlin e Kay tiveram de reescrever seu trabalho para acomodar novos dados, mas muitos lingistas concordam que esse padrão existe. A hipótese de Sapir-Whorf , que se refere à sistemática relação entre as categorias gramaticais da linguagem que uma pessoa usa e como essa pessoa entende o mundo e se relaciona com ele, parece também corroborar essa idéia.

    Sistemas padronizados

    Um sistema padronizado de nomear cores pode ser bastante complexo, porque os humanos percebem as cores e as nomeiam de um modo complexo. Um dos modos de reduzir essas discrepâncias pode ser catalogar o conjunto das cores em uma paleta e desenvolvendo um modelo que nomeie a cor pela posição na mesma. Alguns métodos de nomear mais conhecidos são os métodos Munsell, ISCC ou NBS, desvantajosos por não dar a exata graduação. Outros, como HSI ou HSV são mais precisos embora simplificados. Alguns sistemas comerciais como Pantone ou Crayolla, são muito usados em impressão ou tecelagem.

    Moda e Marketing

    Historicamente eram incomuns as variedades de tons que existem hoje em dia, após a invenção das anilinas, então as cores eram formuladas como receitas, e nomes de tons característicos tinham origens em topônimos ou coisas da natureza, como preto Nankin, azul de Siena ou sépia, normalmente identificando a origem de uma matéria prima rara e cara. Atualmente, quando conseguimos praticamente qualquer tom em segundos numa máquina automática, o nome de uma cor, na moda ou no comércio, explora muitas vezes conceitos subjetivos e emocionais, visando sua associação com impulsos variados. Essa associação visa apressar a decisão do comprador com a utilização de vocábulos onde um simples amarelose torna âmbar ao entardecer ou caminho dourado. Muitos fabricantes de tinta ou produtos de consumo mantêm equipes pesquisando e registrando nomes assim.

  • Vídeo: O poder da Borracha

    Olá amigos! Apesar de muitos usuários menosprezarem essa ferramenta, vamos estudar o poder da borracha no Photoshop! Veja o efeito final abaixo:

    Baixar Vídeo Aula

    Compactado:Winrar

    Player: SWF

    Tamanho: 13,7 MB

    Duração: 15 minutos

  • Inovação tecnológica, um axioma no cotidiano atual

    Venho refletindo e debatendo com diversos empresários já há algum tempo sobre a influência da tecnologia na inovação. O quão importante é a utilização da tecnologia para poder inovar, seja com novos produtos, modificações em produtos já existentes, novas estratégias empresariais ou táticas de marketing. Partindo da premissa de que toda a empresa que deseja inovar precisa estar ciente da necessidade de se utilizar um meio tecnológico como propulsor de tal mudança, as pessoas precisam encarar a tecnologia como um aliado aos negócios.

    Atualmente, a tecnologia da informação está enraizada em praticamente todos os segmentos do mercado, modificando definitivamente a maneira com que as pessoas interagem e as empresas fazem negócios. É instigante imaginar, por exemplo, que o principal mercado concorrente das empresas de aviação é a indústria de telecomunicações, com suas ferramentas de vídeo-conferência e VOIP, já que muitos executivos deixam de viajar pela comodidade que este recurso proporciona. Ainda podemos citar a Internet com suas ferramentas de RSS, blogs, Orkut e My Space. E todos esses aplicativos inovadores ilustram como a tecnologia vem sendo crucial no mundo dos negócios.

    Esta revolução cultural que está emergindo em todos os continentes, atesta o quanto o fator tecnológico está presente, e cada vez mais, na vida pessoal e profissional de cada indivíduo. No Brasil, já existem mais telefones celulares do que aparelhos fixos, e essa estatística inexistia há 5 anos. Isso demonstra a rapidez que a inovação tecnológica tem em se sobrepujar aos meios tradicionais.

    Informações sobre a inserção tecnológica no mundo dos negócios ratificam que os gestores devem priorizar a adequação de suas estratégias empresariais ao mundo interligado, interdependente e globalizado em que vivemos. Cada vez mais, novos softwares e hardwares destroem criativamente o formato dos negócios, obrigando todos os competidores da indústria a se adaptarem à nova forma de lidar com as mudanças.

    Dentro deste cenário, inovações tecnológicas devem ser muito bem vindas. Todos os mecanismos que promoverem mudanças significativas de maneira benéfica ao core business da empresa, devem ser encarados como elementos essenciais a serem incorporados à rotina da organização a fim de promover um choque de criatividade no que tange todos os processos no ambiente corporativo. Neste sentido, vejo a evolução da gestão como capital para a promoção de novos patamares de negócio e a inovação é definitivamente a chave para tal mudança.

  • Formulários com XAJAX

    Olá Pessoal. Obrigado pelos comentários e pelos e-mails recebidos nas últimas semanas. Neste artigo iremos estudar como enviar as informações de vários campos em nosso formulário, para nossa função PHP, sem que haja um submit.

    No artigo anteior vimos podemos fazer isso utilizando-se comando em javascript que pegam o conteúdo(value) do campo e passa para função, mas temos que concordar que se nosso formulário tiver uma quantidade grande de campos isso fica inviável, já que a quantidade de parametros na chamada da função xajax_() irá ficar enorme. O XAJAX então tem uma função para contornar isso: xajax.getFormValues(‘formID’).

    Esta função pega todos os campos com seus valores atuais e retorna um array com essas informações. Após isso é só tratar esse array e extrair as informações que são de nosso interesse. Vamos ao exemplo.

    Interface do formulário form.phpInterface do formulário form.php

    form.php

    
    <?php
    require "./library/xajax/xajax_core/xajax.inc.php";
    require "./library/validacoes.php";
    ?>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>FORMULÁRIOS COM XAJAX - PARTE 2</title>
    <?php ajax->printJavascript('./library/xajax/'); ?>
    </head>
    <body>
    <form id="form" name="form" method="post" action="">
      <table width="300" border="0" align="center" cellpadding="1" cellspacing="1">
        <tr>
          <td colspan="2"><p>FORMULÁRIOS COM XAJAX - PARTE 2</p>
            <p>Validado o formulário </p></td>
        </tr>
        <tr>
          <td width="73">nbsp;</td>
          <td width="220"><label id="resultado"></label></td>
        </tr>
        <tr>
          <td align="right">Nome:</td>
          <td><input name="nome" type="text" id="nome" size="25" maxlength="50" /></td>
        </tr>
        <tr>
          <td align="right">Sexo:</td>
          <td><input name="sexo" type="radio" value="Masculino">
            Masculino
            <input name="sexo" type="radio" value="Feminino">
            Feminino </td>
        </tr>
        <tr>
          <td align="right">E-Mail:</td>
          <td><input name="email" type="text" id="email" size="25" maxlength="75" /></td>
        </tr>
        <tr>
          <td align="right">Telefone:</td>
          <td><input name="telefone" type="text" id="telefone" size="25" maxlength="75" /></td>
        </tr>
        <tr>
          <td>nbsp;</td>
          <td><input name="btn" type="button" value="Enviar Dados" onclick="xajax_enviarDados(xajax.getFormValues('form'));"/></td>
        </tr>
      </table>
    </form>
    </body>
    </html>
    

    Nesse formulário com o name = “form”, nós temos 4 campos, com os respectivos name’s:

      -> nome

      -> email

      -> sexo

      -> telefone

    Linha 42

      -> Essa é a linha na qual tem a chamada da função xajax_enviarDados(xajax.getFormValues(‘form’));, onde a função xajax.getFormValues(‘form’) irá pegar todos os campos e valores e retornar esse array de informações para uma variável que está lá na nossa função em PHP, que veremos a seguir.

    validacoes.php

    
    <?php
    ajax = new xajax();
    
    // Registra as funções no javascript
    ajax->registerFunction("enviarDados");
    
    // FUNÇÕES JAVASCRIPT REGISTRADAS PELO XAJAX	
    
    function enviarDados(formData){
    	
    	// Instancia o objeto XAJAX response com
    	// codificação padrão ISO-8859-1
    	objResponse = new xajaxResponse('ISO-8859-1');
    	
    	// Inicializa a variável de resultado
    	res = "";
    	
    	// Cria uma variável para cada campo
    	// com o nome do ID do campo, ex.: nome, email
    	foreach(formData as chave => valor){
    		chave = valor;
    	}
    
    	// Verifica os campos e atribui strings a res
    	if(nome == false)
    		res .= "Preencha o campo nome<br />\n";
    	if(sexo == false)
    		res .= "Selecione um sexo<br />\n";
    	if(email == false)
    		res .= "Preencha o campo e-mail<br />\n";
    	if(telefone == false)
    		res .= "Preencha o campo telefone<br />\n";
    	
    	// Verifica res
    	if(empty(res))
    		res = "<font color=green>Formulário preenchido com sucesso!</font>";
    	else
    		res = "<font color=red>".res."</font>";
    	
    	// Atribui a variável res ao label resultado
    	objResponse->assign('resultado', 'innerHTML', res);
    	
    	// Retorna a resposta de XML gerada pelo 
    	// objeto do xajaxResponse
    	return objResponse;
    }
    
    // Manda o ajax processar os pedidos acima
    ajax->processRequest();
    ?>
    

    Linhas 2 e 5

      -> Instânciamos o objeto do XAJAX e registramos a função enviarDados no XAJAX;

    Linha 11

      -> Declaramos a função enviarDados, e no parametro a variável formData quer irá receber o array com todos os campos e informações do formulário;

    Linha 15

      -> Instancia o objeto XAJAX response com codificação padrão ISO-8859-1;

    Linhas 19 a 21

      -> Com um foreach() nós percorremos o array formData e criamos as variáveis de cada campo do formulário, com nomes iguais ao dos campos. Conseguimos isso utilizando o recurso de “”, mais conhecido como variável da variável.

      -> formData[‘nome’] = “André Luiz”;

      -> Olhem isso! ‘nome’ é uma chave (índice) da variável formData, e ‘André Luiz’ um valor dentro da chave (índice) ‘nome’.

      -> Então isso: chave = valor;, seria o mesmo que: nome = ‘André Luiz’; Todos concordam? Se não concorda, leia tudo de novo! Isso é feito para todos os campos do formulário.

    Linhas 24 a 40

      -> Nestas linhas fazemos somente a verificação se os campos estão vázios e montamos na variável res a mensagem de resposta;

    Linha 43

      -> Atribuimos a variável res ao label resultado;

    Linhas 47 a 52

      -> Finalizamos o código com as respostas processadas.

    Espero que tenha esclarecido algumas dúvidas. Para baixar o código desse artigo clique aqui. Nos próximos artigos iremos tratar mais funções de resposta, como o assign.

    Um abraço!

  • O profissional de TI e a sustentabilidade

    Uma das principais dificuldades das empresas nesta época de grandes mudanças é a adequação de seus instrumentos e processos à estratégia de gestão. E um dos grandes desafios dos profissionais de Tecnologia da Informação é entender a estratégia e a natureza das organizações. Estudos realizados por instituições como o grupo IT Mídia desde 2002 indicam que a maioria dos CIOs prefere ter ao seu lado profissionais que sejam capazes de analisar o desempenho da empresa, avaliar riscos e participar do planejamento estratégico. Além disso, a própria dinâmica dos negócios, com fortes influências extraterritoriais, faz com que a organização necessite de estruturas ágeis, adaptáveis e sempre voltadas para a inovação.

    Nesse cenário, naturalmente são reduzidas as oportunidades de evolução para aqueles que se isolam no ambiente do conhecimento específico, acreditando que basta ser eficiente naquilo que faz pontualmente. Para esses, o futuro reserva a repetição de tarefas operacionais, até que seu conhecimento se torne obsoleto e descartável.

    O que torna um profissional de TI obsoleto não é propriamente uma eventual limitação para seguir os desenvolvimentos tecnológicos, ou o desinteresse pela inovação, mas a incapacidade de relacionar inovação à sustentabilidade. Pela simples e nem sempre clara razão de que qualquer inovação só agrega valor se contribuir para a sustentabilidade da organização, seja reduzindo inteligentemente o custo, seja aumentando a produtividade ou melhorando a segurança.

    Custo, produtividade e segurança são detalhes essenciais na gestão com foco em sustentabilidade. Sem essa base, poucas organizações têm chance de sobreviver no atual cenário de competição acirrada e sem fronteiras. No entanto, o que define a sustentabilidade é um conjunto de qualidades muito mais sofisticadas, que para serem desenvolvidas exigem mudanças radicais no modelo mental que predomina tradicionalmente nas organizações.

    Um desses modelos é o que define a organização como um ente individual, separado do ambiente físico e social. O atual estado do mundo, afetado por mudanças climáticas, riscos imprevisíveis como o terrorismo, a violência e os conflitos sociais, além das alterações no equilíbrio geo-econômico, exigem uma postura inversa: a organização se torna mais sustentável quanto mais souber se integrar de maneira inteligente e pragmática ao ambiente físico, social e virtual que seus processos e seus produtos ou serviços alcançam.

    O americano Steven Rochlin, diretor da consultoria AccountAbility International, observa que as empresas se caracterizam por três estágios em sua capacidade de se integrar ao ambiente global de negócios: pela tomada de consciência do ambiente externo a ela, pela experimentação social e, finalmente, pela integração das relações internas e externas à sua estratégia. Rochlin, cuja organização faz a mensuração de resultados da gestão sustentável, observa que a evolução das organizações nesse processo produz a redução dos riscos e da vulnerabilidade e afeta positivamente o desempenho a médio e longo prazos.

    A busca por boas práticas de governança corporativa, as exigências legais e as imposições do mercado quanto à ética nos negócios e à responsabilidade sócio-ambiental não deixam dúvidas quanto à tendência que vem se impondo. Desde os escândalos financeiros da Enron, da WorldCom e da Parmalat, entre outras, não apenas a legislação se tornou mais rigorosa, como o mercado se tornou mais exigente. Ética deixou de ser um tema de filósofos e se inseriu como um elemento definidor do sucesso nos negócios.

    O profissional de TI tem um papel central a cumprir nesse novo cenário. Sem a Tecnologia da Informação, as organizações não conseguiriam alcançar a qualidade, flexibilidade e confiabilidade necessárias na busca da sustentabilidade. Da mesma forma, a capacidade de inovar se torna um diferencial importante para todas as organizações. Portanto, profissionais de TI com inteligência estratégica são protagonistas essenciais nesse cenário de mudanças pelo qual passam as organizações em todo o mundo. Aqueles que se contentam em buscar mais do mesmo acabam se tornando meros protagonistas nesse jogo.

    A redução no nível médio dos salários do setor e o rebaixamento de cargos – com o posicionamento do profissional de TI abaixo do controlador financeiro, fenômeno recente e muito comum nas indústrias – podem indicar que muitas empresas não estão enxergando grandes benefícios na atividade desses profissionais. A qualificação estratégica para a busca da sustentabilidade é certamente o elemento que pode reverter essa perda e abrir novos caminhos para os profissionais da tecnologia que está transformando o mundo.

  • Qual versão você usa?

    Qual a melhor linguagem de programação do mercado? A resposta será sempre a que o programador usa. Ele sente-se a vontade na linguagem, a interface é muito familiar, os comandos não são misteriosos e os eventuais bugs não são caixas pretas onde cada problema leva horas para ser decifrado. Tudo é muito simples na linguagem que adotamos como a principal, por isso ela é a melhor.

    Quando o ser humano sai da sua zona de conforto, salva poucas exceções, tende a questionar negativamente o novo processo ou muitas vezes encontra uma desculpa obvia (para ele) para não aceitar tão fácil a mudança. Quando em nossa empresa migramos do MSOffice para o OpenOffice, os usuários ficaram indignados: “Não dá para trabalhar com esse pacote, ele é muito ruim, difícil de operar”. O incrível é que 99 deles utilizavam o MSOffice como a maioria dos mortais: Digitar um texto básico, mudar fonte, negrito, justificar, e correção ortográfica. Mas mesmo assim, por sair da sua zona de conforto simplesmente não compreendiam porque o OpenOffice era tão difícil de operar.

    O mesmo acontece com as linguagens de programação: Todas conseguem de uma forma ou de outra realizar os trabalhos que são impostos para nós no dia a dia, o que muda é a sintaxe, uma facilidade aqui e uma dificuldade ali. Isso não quer dizer que umas não sejam melhores que outras, pois dentro da minha visão técnica ainda não encontrei nenhuma linguagem onde aplicações data-centric seja o foco que pelo menos se compare ao Microsoft Visual Fox Pro, pois ela está muito a frente das outras quando o assunto é manipular dados e informações.

    O que realmente não compreendo é como os programadores não acompanham a evolução das suas próprias linguagens de programação. Eu programava em FoxPro 2.5, depois no Visual Fox Pro 3, 5, 6, 7, 8 e agora no 9 SP2 e participo de fóruns que ainda envolvem perguntas sobre a antiga versão 3 ou 6 o que me causa espanto.

    Sim, programas em produção não devem ser trocados só porque uma nova versão foi criada. Devem-se levar em conta outros fatores muito mais importantes para o negócio, mas a pergunta que faço pode encabular muitos programadores: Você tem ao menos a versão 9.0 Sp2 instalada na sua máquina para dar inicio a novos projetos ou pelo menos não perder o foco das tendências tecnológicas?

    XML foram implementados na versão 7, GDI na 9, OOP na 3 e se você ainda esta programando (e não mantendo), sistemas em versões muito defasadas você esta criando um fosso tecnológico cada vez maior entre você e todo o resto do mercado. Desculpas como, o que eu necessito o VFP 7 me atende são tão simplistas que se fosse assim ainda eu estaria programando em TurboPascal ou Clipper, pois elas ainda atendem, é só observar quantos sistemas ainda rodam com elas e que não devem servir de refugio para a verdade, você não quer se mexer sair da sua zona de conforto.

    Mantenha sistemas legados, mas não os produza mais, tire um tempo para estudar as novas ferramentas das novas versões mesmo que não as utilize no momento, invista em pesquisa e desenvolvimento para que esteja sempre aberto se não para mudanças pelo menos para a evolução. A diferença entre os chamados gurus da informática e os demais é simplesmente a curiosidade de querer entender e aprender o novo.

    E lembre-se do mais importante: Não seja para sempre um programador versão 1.0.