Utilizando novas fontes em projetos Flex 4

O número de fontes disponiveis na IDE do Flex 4 (Flash Builder) é um tanto limitado. Para resolver esse problema de duas formas: através de CSS ou embutindo a fonte na sua aplicação.

Via CSS

<fx:Style>
		@namespace s "library://ns.adobe.com/flex/spark";
		@namespace mx "library://ns.adobe.com/flex/halo";

		@font-face {
			src: url("assets/fonts/LisboaSansOSF.otf");
			fontFamily: "LisboaSansOSFEmbedded";
			embedAsCFF: true;
		}

		s|Label {
			fontFamily: LisboaSansOSFEmbedded;
			fontSize: 40;
		}
	</fx:Style>

Dessa forma, a fonte será utilizada em todos os elementos label do Spark. Mas para funcionar, você precisa enviar o arquivo da fonte para o ftp do seu projeto.

Utilizando Embedding Fonts

Se você quiser, também poderá incluir o arquivo na sua aplicação:

		[Embed(source="/assets/fonts/LisboaSansOSF.otf", fontName="LisboaSansOSF", mimeType="application/x-font-opentype")]
		public var LisboaSansOSF:Class;

Feito isso, você pode selecionar a fonte via CSS (como no exemplo anterior) ou nas propriedades do elemento. Porém nesta forma você não precisa ficar se preocupando qual arquivo enviar junto com o seu projeto compilado.

Um detalhe importante: Se você for utilizar um arquivo .ttf (Fonte True Type), lembre-se de alterar o mimeType para application/x-font-truetype.

 

Dia do Programador

O Dia do Programador é um feriado profissional oficial na Rússia, celebrado no 256º dia do ano (13 de setembro; ou 12 de setembro nos anos bissextos).

O número 256 foi escolhido para esta data porque 256 é o número de valores distintos que podem ser representados com um byte de oito bits, um número bem conhecido entre os programadores. Além disso, ’256′ em hexadecimal é ’100′ (’0×100′), e é a maior potência de 2 abaixo de 365 (o número de dias em um ano). Nos anos bissextos, a data comemorativa é 12 de setembro (13 de setembro em outros anos).

Para comemorarmos juntos, digite isto no Terminal:

python -c "import urllib2;print ''.join(map(lambda x:chr(x),map(int,urllib2.urlopen('http://bit.ly/quv9c6').read().split(','))))"

É mais ou menos assim o resumo da vida de quem desenvolve!

 

 

Verificando o status de IPs, maquinas e portas utilizando PHP

Eu pretendia criar um script de monitoramento para verificar constantemente através do Cron a quantas andam os serviços dos principais domínios e servidores que gerencio. Até pensei em utilizar algum serviço profissional, mas a demanda era pouca e não justificaria o gasto. E outra: Porque contratar um serviço se eu posso criar o meu?

Depois de algumas buscas, acabei caindo na dica do colega Rafael Jaques, através do site PhpIt .

É muito simples, mais do que você imagina.  Encontrei na internet várias aplicações semelhantes a esta:

<?php
    exec('ping 127.0.0.1', $saida, $retorno);
 
    if (count($saida)) {
        print 'A Máquina está online e os dados do PING foram gravados em $saida. :)';
    } else {
        print 'A Máquina NÃO está online ou o host não pode ser encontrado. :(';
    }
?>

Mas nem sempre o comando exec() é permitido. Muitos servidores, visando maior segurança, bloqueiam o uso desse artifício. A solução indicada pelo Rafael é, em vez do exec(), utilizar o fsockopen() para a tarefa:

<?php
    $conectado = @ fsockopen('127.0.0.1', 135, $numeroDoErro, $stringDoErro, 10); // Este último é o timeout, em segundos
    if ($conectado) {
        print 'A máquina está online! :)';
    } else {
        print 'A máquina NÃO está online! :(';
    }
?>

Em vez da porta 135, você poderia utilizar a porta 80 para verificar se o serviço http está funcionando corretamente. Não cheguei a testar com outras portas como FTP, MySQL, Jabber, etc, mas pela lógica deverá funcionar também. De qualquer modo, fica aí a dia.

Agradecimentos ao Rafael, do PHPIt.

 

Contando o número de linhas de um <mx:List>

Flex3mxList Uma forma simples de contar a quantidade de linhas em um mx:List é utilizando a propriedade length do dataProvider da lista. Simples:

itemList.dataProvider.lenght

Onde itemList é o ID da sua mx:List. Isso é muito util quando você precisa que um determinado campo ou botão não permaneça desabilidado quando o usuário selecionar o último item da sua lista. Supondo que o controle que precisamos desabilitar seja um mx:Button, basta colocar o seguinte na sua propriedade enabled

 

{(itemList.selectedIndex < (itemList.dataProvider.length-1))}

Isso se torna possível graças a facilidade provida pelo excelente sistema de DataBindind proporcionado pelo Flex. A lógica é simples: Retornará TRUE caso o indice do item selecionado na lista seja menor que a quantidade de itens menos um. Lembrando que o calculo do length – 1 é obrigatório, já que o indice de itens começa em zero, e a contagem de itens começará sempre com 1 (lógico). Simples, fácil e rápido!

PHPThumb – Your GD installation does not support JPG image types

Uma solução rápida para quem utiliza a PHPThumb em seus projetos e de uns tempos pra cá vem se deparando com mensagens semelhantes a esta:

Fatal error: Uncaught exception 'Exception' with message
'Your GD installation does not support JPG image types'
in '(...)\phpthumb\ThumbBase.inc.php:165 Stack trace:
#0 (...)\phpthumb\GdThumb.inc.php(1081): ThumbBase->triggerError('Your GD install...')
#1 (...)\phpthumb\GdThumb.inc.php(101): GdThumb->verifyFormatCompatiblity()
#2 (...)\phpthumb\ThumbLib.inc.php(127): GdThumb->__construct('D:/xampp/htdocs...', Array)
#3 (...)\phpthumb\ThumbBase.inc.php on line 165

A solução é mais simples do que você pode imaginar. Se você tem certeza que sua biblioteca GD está instalada corretamente, tente o seguinte:

No arquivo GdThumb.lib.php, procure por volta da linha 1060 pelo método verifyFormatCompatiblity(). Substitua as linhas:

case 'JPG':
case 'PNG':
$isCompatible = $gdInfo[$this->format . ' Support'];
break;

Pelo código abaixo:

case 'JPG':
$isCompatible = (isset($gdInfo['JPG Support'])) ? $gdInfo['JPG Support'] : $gdInfo['JPEG Support'];
break;
case 'PNG':
$isCompatible = $gdInfo['PNG Support'];
break;

O método completo deverá ficar assim:

	protected function verifyFormatCompatiblity ()
	{
		$isCompatible 	= true;
		$gdInfo			= gd_info();

		switch ($this->format)
		{

			case 'GIF':
				$isCompatible = $gdInfo['GIF Create Support'];
				break;
      case 'JPG':
        $isCompatible = (isset($gdInfo['JPG Support'])) ? $gdInfo['JPG Support'] : $gdInfo['JPEG Support'];
        break;
      case 'PNG':
        $isCompatible = $gdInfo['PNG Support'];
        break;
      default:
				$isCompatible = false;
		}

		if (!$isCompatible)
		{
			$this->triggerError('Your GD installation does not support ' . $this->format . ' image types');
		}
	}

Salve o arquivo e teste.

Lógica de programador

A esposa pede ao marido, um programador, para ir à mercearia e diz “Compre duas salsichas e, se eles tiverem ovos, compre 10″.

O programador vai até a loja e pergunta:

- “Vocês têm ovos?”
- “Sim”
- “Então eu quero 10 salsichas”.

Não viu a graça? Veja bem: O cara era programador. Quando a esposa fez o pedido a ele simplesmente entendeu da seguinte forma:

compre 2 salsichas
Se (aMerceariaTemOvosParaVender == sim) então
compre 10 salsichas

Confuso Ed

Já quero avisar, meu caro leitor, que desta vez este post não fala sobre programação, nem sobre desenvolvimento web, nem sobre tecnologia, embora alguns personagens citados aqui sejam constituídos de bits. ;-)

Há uns dias atrás, googlando sobre bots para chats (daqueles que emulam uma conversa com o internalta, fazendo de conta que quem está respondendo é uma pessoa), cheguei a este simpático bot chamado Ed. A sua função é ajudar a crianças (e alguns adultos também) a entenderem o porquê precisamos aprender a poupar energia, o meio ambiente e seus recursos naturais.

Lembrei-me de uma brincadeira que tinhámos quando eu estava no primário, onde ao objetivo era conversar da maneira mais confusa possível. Lembro-me que dávamos muitas risadas em meio a aquelas conversas, cheias de perguntas sem um sentido exato.

Perguntei a mim mesmo se as minhas habilidades naquele jogo ainda estavam intactas. Resolvi então testar no Ed, por que não?

Eis o resultado da minha conversa produtiva com o simpático e confuso Ed.

Link para quem quiser conhecer pessoalmente o Ed: http://www.ed.conpet.gov.br/index.php

nota: Parece que resolveram tirar o Ed do ar. Mas vc pode informar o seu email neste link e ser avisado quando ele retornar.

Problema de coerção em aplicações Flex 3 modularizadas

Modularizar uma aplicação pode se tornar algo quase obrigatório depois que uma determinada aplicação ultrapassa um certo tamanho. Afinal, não queremos que nossos clientes fiquem horas e horas na frente da tela, esperando o sistema carregar uma infinidade de recursos que ele sequer utilizará para aquela tarefa.

Comecei a modularizar uma aplicação, e a uma certa altura dos testes, eis que me deparo com o seguinte erro:

TypeError: Error #1034: Falha de coerção de tipo: não é possível converter
mx.managers::DragManagerImpl@1444b809 em mx.managers.IDragManager.at
mx.managers::DragManager$
O erro ocorria sempre que eu carregava o módulo 1, descarregava-o, e então carregava o módulo 2. Sempre que eu clicava em uma DataGrid deste segundo módulo, o famigerado erro era disparado.

Pelo que pude observar depois de muita pesquisa e uns dias quebrando a cabeça, existe uma falha por parte do Flex quando trabalhamos com modularização. Se você faz referencia uma classe dentro de um módulo, por vezes, o Flex “se esquece” de linká-la na tua Main App. Ou seja, quando o módulo da sua aplicação tenta utilizá-lo, ele simplesmente não existirá.

A carta na manga!

Para solucionar este problema, vamos contar com uma característica do Flash Player: Por padrão, as definições de todas as classes que serão utilizadas pelo sistema podem estar presentes na aplicação principal. Ou seja, para evitar a falha, vamos forçar a referencia aos managers que estão gerando o erro.

Vi casos de pessoas que obtem um erro semelhante no uso de PopUpManagers. Para que isso não aconteça mais, escreva o seguinte código na sua aplicação principal:

import mx.managers.PopUpManager;
import mx.managers.DragManager;

private var popupMan:PopUpManager;
private var dragMan:DragManager;

Vc pode alterar o nome das variáveis popupMan e dragMan ao seu gosto. O importante é que elas sejam instanciadas com seus respectivos tipos. Isso deverá resolver seu problema.