Desabilitar modo espera no Mac

Depois de quase 1 (um) ano de ter adquirido um Macbook White que fui conseguir deixar meus downloads a todo vapor com a tampa baixada, tudo isso graças a uma App chamada InsomniaX.

Essa App desabilita o modo espera quando baixamos a tampa no macbook, pois na configuração do Snow Leopard isso não é possível, então fica a dica.

Faça o download aqui.

\o/

Flex + Konaha – Part III

Agora na terceira e ultima parte, irei fazer um CRUD utilizando o framework kohana para o acesso ao banco de dados.
Nessa última parte do post foi trazer mais código do que texto, ok?
Então vamos lá.

Flex:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			   creationComplete="_init(event)" width="100%" height="100%">

	<s:layout>
		<s:VerticalLayout/>
	</s:layout>

	<fx:Script>
		<![CDATA[
			import br.com.globasw.remote.RemoteClass;

			import mx.collections.ArrayCollection;
			import mx.controls.Alert;
			import mx.events.FlexEvent;
			import mx.rpc.events.ResultEvent;

			[Bindable] private var users:ArrayCollection;

			private static const USER_CONTROLLER:String = "User_Controller";

			protected function _init(event:FlexEvent):void
			{
				listUsers();
			}

			protected function listUsers(event:MouseEvent = null):void
			{
				var remote:RemoteClass = new RemoteClass();
				remote.call( USER_CONTROLLER,'listUsers', listUsersResult, null );
			}

			private function listUsersResult( event:ResultEvent ):void
			{
				users = new ArrayCollection( event.result as Array );
			}

			private function saveUserResult( event:ResultEvent ):void
			{
				Alert.show( "Salvo com sucesso!!" );
				listUsers();
			}

			private function deleteUserResult( event:ResultEvent ):void
			{
				Alert.show( "Excluido com sucesso!!" );
				listUsers();
			}

			protected function saveUsers(event:MouseEvent):void
			{
				var remote:RemoteClass = new RemoteClass();
				remote.call( USER_CONTROLLER,'saveUsers', saveUserResult, {idusers:new int(txtId.text), nome:txtNome.text, email:txtEmail.text} );
			}

			protected function deleteUser(event:MouseEvent):void
			{
				var remote:RemoteClass = new RemoteClass();
				remote.call( USER_CONTROLLER,'deleteUser', deleteUserResult, new int(txtId.text) );
			}

		]]>
	</fx:Script>

	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>

	<s:Panel>
		<mx:Form>
			<mx:FormItem label="Id:">
				<s:TextInput id="txtId" text="{dgUsers.selectedItem.idusers}"/>
			</mx:FormItem>
			<mx:FormItem label="Nome:">
				<s:TextInput id="txtNome" text="{dgUsers.selectedItem.nome}"/>
			</mx:FormItem>
			<mx:FormItem label="Email:">
				<s:TextInput id="txtEmail" text="{dgUsers.selectedItem.email}"/>
			</mx:FormItem>
			<mx:FormItem direction="horizontal">
				<s:Button label="Excluir" click="deleteUser(event)"/>
				<s:Button label="Listar" click="listUsers(event)"/>
				<s:Button label="Salvar" click="saveUsers(event)"/>
			</mx:FormItem>
		</mx:Form>
	</s:Panel>

	<mx:DataGrid id="dgUsers" dataProvider="{users}">
		<mx:columns>
			<mx:DataGridColumn headerText="ID" 		dataField="idusers"/>
			<mx:DataGridColumn headerText="Nome" 	dataField="nome"/>
			<mx:DataGridColumn headerText="Email" 	dataField="email"/>
		</mx:columns>
	</mx:DataGrid>
</s:Application>

Controller:

<?php defined('SYSPATH') OR die('No direct access allowed.');
class User_Controller extends Controller
{
	public function listUsers( $id = null )
	{
		$user = new User_Model();
		return $user->listUsers( $id );
	}

	public function saveUsers( $_user )
	{
		$user = new User_Model();
		return $user->saveUsers( $_user );
	}

	public function deleteUser( $id )
	{
		$user = new User_Model();
		return $user->delete( $id );
	}
}

No model você terá mapear o nome da tabela e a chave primária da tabela, protected [$table_name = 'users'] e [protected $primary_key = 'idusers'].

Model:

<?php defined('SYSPATH') OR die('No direct access allowed.');
class User_Model extends ORM
{
	protected $table_name 	= 'users';
	protected $primary_key	= 'idusers';

	public function listUsers( $id = null )
	{
		try
		{
			if ( $id != null )
			{
				$user = $this->find( $id );
				$_user 			= new stdClass();
				$_user->idusers = $user->idusers;
				$_user->nome 	= $user->nome;
				$_user->email	= $user->email;

				return $_user;
			} else {
				$users = $this->find_all();

				foreach ($users as $count => $user)
				{
					$_user 			= new stdClass();
					$_user->idusers = $user->idusers;
					$_user->nome 	= $user->nome;
					$_user->email	= $user->email;

					$listUsers[] = $_user;
				}
				return $listUsers;
			}
		} catch (Exception $e) {
			return $e->getTraceAsString();
		}
	}

	public function saveUsers( $_user )
	{
		try {
			$lastInsertId = null;

			if ( $_user->idusers == null )
			{
				$lastUser = $this->find_all();

				if ( $lastUser->count() == 0 )
				{
					$lastInsertId = 1;
				} else {
					foreach ( $lastUser as $_lastUser ){}
					$lastInsertId = $_lastUser->idusers + 1;
				}

				$this->idusers 	= $lastInsertId;
				$this->nome		= $_user->nome;
				$this->email 	= $_user->email;

				return $this->save();
			} else {
				$user 			= $this->find( $_user->idusers );
				$user->nome 	= $_user->nome;
				$user->email 	= $_user->email;

				return $user->save();
			}
		} catch (Exception $e) {
			return $e->getTraceAsString();
		}
	}

	public function deleteUser( $id )
	{
		return $this->delete( $id );
	}
}

Se gostaram deixem comentário como feedback.
o codigo fonte está aqui.

Parte I
Parte II

Flex + Konaha – Part II

Agora vamos para a segunda parte, criar um projeto Flex.
Anteriormente criamos um projeto PHP, agora iremos adicionar um projeto Flex a esse projeto,
então vamos ao passos para isso.

Clique com o botão direito do mouse no projeto, no meu caso “kohana_flex”, navegue até o menu
“Add/Change Project Type” e escolhar “Add Flex Project Type”, com isso será criada uma estrutura
de arquivos do projeto Flex dentro do projeto PHP.

Provavelmente aparecerá o erro “Cannot create HTML wrapper. Right-click here to recreate folder html-template”,
como o próprio erro nos informa, clique com o botão direito do mouse e recrie o HTML WRAPPER.

Como tenho preferência em centralizar o meu acesso ao PHP no Flex, customizei a classe de RemoteObject para esse fim.

package br.com.globasw.remore
{
	import mx.controls.Alert;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;

	public class RemoteClass extends RemoteObject
	{
		private var _endPoint:String = "http://localhost:8888/globalsw/kohana_flex/amf";

		public function call( className:String, methodName:String, result:Function, parameters:Object = null ):void
		{
			this.destination 			= 'zend';
			this.endpoint 				= _endPoint;
			this.source					= className;
			this.showBusyCursor			= true;
			this.makeObjectsBindable 	= true;

			this.addEventListener( ResultEvent.RESULT, result );
			this.addEventListener( FaultEvent.FAULT, fault );
			this.getOperation( methodName ).send( parameters );
		}

		private function fault( event:FaultEvent ):void
		{
			var message:String = '' +
				'code:\n' + event.fault.faultCode +
				'\nmessage:\n' + event.fault.message +
				'\ndetail:\n' + event.fault.faultDetail;

			Alert.show( message, "Erro" );
		}
	}
}

Para testar essa integração vamos utilizar nossa classe HelloWorld do post anterior.

Controller:

<?php //defined('SYSPATH') OR die('No direct access allowed.');
class HelloWorld_Controller extends Controller
{
	function index()
	{
		echo 'index';
	}

	public function message( $name=null )
	{
		if ($name == null)
			return 'Hello World ';
		else
			return 'Hello, '. $name;
	}
}

Flex:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

	<s:layout>
		<s:VerticalLayout/>
	</s:layout>

	<fx:Script>
		<![CDATA[
			import br.com.globasw.remore.RemoteClass;

			import mx.rpc.events.ResultEvent;
			import mx.utils.ObjectUtil;
			protected function teste(event:MouseEvent):void
			{
				var remote:RemoteClass = new RemoteClass();
				remote.call( 'HelloWorld_Controller','message', helloWorld, 'Fernando');
			}

			private function helloWorld( event:ResultEvent ):void
			{
				trace(ObjectUtil.toString( event.result ) );
			}
		]]>
	</fx:Script>

	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>

	<s:Button label="teste" click="teste(event)"/>
</s:Application>

Como pode ser visto no bloco de código anterior, estou usando minha classe customizada de RemoteObject.

Por hoje é só pessoal, no próximo post farei conexão com o banco de dados para mostrar do que o kohana é capaz.

Parte III

Flex + Konaha – Part I

Neste post irei utilizar o Eclipse PDT e o plugin do Flash Builder 4, MySQL e o kohana 2.3.4, pelo motivo da última versão
desse framework não estar muito estável para trabalhar com a integração FLEX.

Vamos partir do inicio, siga até o Kohana Files e faça o download
do framework, descompacte dentro de seu servidor web, nomeu caso dentro da pasta “htdocs” do MAMP e crie um projeto PHP no eclipse apontando para a pasta descompactada, quando você acessar
o kohana pelo navegador e aparecer esta página abaixo é porque você tem todos os requisitos para rodar o framework.

Depois de aprovado em todos os requisitos, renomeie ou apague o arquivo “install.php” e o framework já estará
instalado.

Aqui configuramos o acesso via navegador dos metodos retirando o “index.php” da URL.

# LINGANDO O URL rewriting
RewriteEngine On

# PROTEJA APPLICATIVOS E ARQUIVOS DO SISTEMA A SEREM VISUALIZADOS
RewriteRule ^(application|modules|system) - [F,L]

# PERMITIR QUE OS ARQUIVOS OU DIRETÓRIOS QUE EXISTEM PARA SER EXIBIDO DIRETAMENTE
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# REESCREVER TODOS OS OUTROS URLS PARA index.php E REMOVENDO O index.php DA URL
RewriteRule .* index.php/$0 [PT,L]

Para quem não conhece o funcionamento do Kohana, segue uma simples explicação, por exemplo temos
a URL “http://www.dominio.com/helloworld/message/Noronha” analogamente ficaria assim
“http://dominio/controller/metodo/parametro”

 <?php defined('SYSPATH') OR die('No direct access allowed.');
class HelloWorld_Controller extends Controller
{
	function index()
	{
		echo 'index';
	}

	function message( $name=null )
	{
		if ($name == null)
			echo 'Hello World ';
		else
			echo 'Hello, '. $name;
	}
}

Agora vamos partir para a configuração do ZEND dentro do framework Kohana.
Mesmo a documentação do Kohana falar para não alterar os arquivos do ‘core’,
mas foi a maneira mais fácil que encontrei para plugar o zend ao kohana.

Procure por, Kohana::setup() e insira logo abaixo o código:

// ALTERAÇÃO FERNANDO NORONHA
if ($path = Kohana::find_file('vendor', 'Zend/Loader'))
{
    ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.dirname(dirname($path)));
    require_once 'Zend/Loader/Autoloader.php';
    Zend_Loader_Autoloader::getInstance();
}
// FIM ALTERAÇÃO FERNANDO NORONHA

Depois de plugar o Zend ao kohana, vamos fazer a configuração do Zend Amf para que consigamos fazer
a integração do Flex com o PHP.

<?php defined('SYSPATH') OR die('No direct access allowed.');
class Amf_Controller extends Controller
{
	function index()
	{
		$server = new Zend_Amf_Server();

		/*
		 * CARREGA TODAS AS CLASSES QUE SERÃO ACESSADAS PELO FLEX
		 * */
		foreach ( new DirectoryIterator( 'application/controllers' ) as $fileInfo)
		{
			if($fileInfo->isDot() || is_dir( $fileInfo->getFilename() ) )
				continue;
			$controllers = str_replace('.php', '', $fileInfo->getFilename() );
			$controllers = ucfirst($controllers).'_Controller';
			$server->setClass(new $controllers());

		}

		/*
		 * CARREGA TODOS OS VO's, CLASSES QUE SE ESPELHAM NO PHP E NO FLEX
		 * */
		foreach ( new DirectoryIterator( 'application/valueObjects' ) as $fileInfo)
		{
			if($fileInfo->isDot() || is_dir( $fileInfo->getFilename() ) )
				continue;
			$valueObjects = str_replace('.php', '', $fileInfo->getFilename() );
			$valueObjects = ucfirst( $valueObjects );
			$server->setClassMap($valueObjects, $valueObjects);
		}

		echo $server->handle();
	}
}

Essa é só a primeira parte, já já tem mais.

Parte II

MiniMVC – Brincadeira de carnaval

Como no carnaval não fui para o meio da bagunça. Então peguei o tempo ocioso para estudar e acabou saindo um template de projeto PHP no padrão MVC (Model – View – Controller).

O mesmo está publicado no GitHub: https://github.com/fenoronha/miniMVC

Se tiverem dicas e sugestões, por favor deixar comentários. \o/

Cartão de visita!!

A arte do meu cartão de visita ficou pronta, agora é só mandar imprimir.

Caso queiram saber que fez, entre em contato.

Papervision3D – Simples exemplo

Como hoje não estou muito afim de escrever, segue somente o cubo e código. Valeu!!

Ahhh, estava esquecendo tem que adicionar a biblioteca ao seu projeto, não esqueça disso [Papervison3D.swc].

package {
	import flash.display.Sprite;
	import flash.events.Event;

	import mx.core.BitmapAsset;

	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;

	[SWF(frameRate="30", backgroundColor="0x000000")]

	public class Main extends Sprite {
		private var viewPort3D : Viewport3D;
		private var renderer : BasicRenderEngine;
		private var camera3D : Camera3D;
		private var scene3D : Scene3D;
		private var wfMaterial : WireframeMaterial;
		private var materialList : MaterialsList;
		private var cube : Cube;

		private var material : BitmapMaterial;

		private static var FRONT : String = "front";
		private static var BACK : String = "back";
		private static var TOP : String = "top";
		private static var BOTTOM : String = "bottom";
		private static var LEFT : String = "left";
		private static var RIGHT : String = "right";

		[Embed(source="assets/noronha.jpg")]
		private var img:Class;

		public function Main() {
			if(stage) {
				init();
			} else {
				addEventListener(Event.ADDED_TO_STAGE, init);
			}
		}

		private function init(event : Event = null) : void {
			if(event)
				removeEventListener(Event.ADDED_TO_STAGE, init);

			// CARREGA A IMAGEM DA FACE DO CUBO
			var bmpImg:BitmapAsset = new img() as BitmapAsset;
			material = new BitmapMaterial(bmpImg.bitmapData);

			viewPort3D = new Viewport3D(555, 400);
			addChild(viewPort3D);

			scene3D = new Scene3D();
			camera3D = new Camera3D();
			renderer = new BasicRenderEngine();

			wfMaterial = new WireframeMaterial(0xFFFFF);
			wfMaterial.doubleSided = true;

			materialList = new MaterialsList({
				front:wfMaterial,
				back:wfMaterial,
				top:wfMaterial,
				bottom:wfMaterial,
				left:wfMaterial,
				right:	wfMaterial
			});

			// ADICIONA A IMAGEM AS FACES DO CUBO
			materialList.addMaterial(material, FRONT);
			materialList.addMaterial(material, BACK);
			materialList.addMaterial(material, TOP);
			materialList.addMaterial(material, BOTTOM);
			materialList.addMaterial(material, LEFT);
			materialList.addMaterial(material, RIGHT);

			// CUBO
			cube = new Cube(materialList);
			cube.x = 0;
			cube.y = 0;
			cube.z = 0;

			// END CUBO

			// ADICIONA O CUBO A CENA
			scene3D.addChild(cube);

			addEventListener(Event.ENTER_FRAME, render);
		}

		private function render(event : Event) : void {

			renderer.renderScene(scene3D, camera3D, viewPort3D);

			// GIRA O CUBO BASEDO NO X E Y DO MOUSE
			camera3D.orbit(Math.abs(mouseY), Math.abs(mouseX));
		}
	}
}

PAPÉIS NO SCRUM

Este texto foi retirado do guia de scrum: http://www.scrum.org

O Time Scrum é composto pelo ScrumMaster, pelo Product Owner e pelo Time.

Os membros do Time Scrum são chamados “porcos”. Qualquer outra pessoa é chamada de “galinha”. “Galinhas” não podem dizer aos “porcos” como eles devem fazer seu trabalho. Galinhas e porcos vêm da seguinte história:

Uma galinha e um porco estão juntos quando a galinha diz: “Vamos abrir um restaurante!”

O porco reflete e então diz: “Como seria o nome desse restaurante?”

A galinha diz: “Presunto com Ovos!”

O porco diz: “Não, obrigado, eu estaria comprometido, mas você estaria apenas envolvida!”

Corpo humano em HTML e PHP

Hoje estava no tweetdeck e vi um twit feito por meu amigo @ivanrosolen com a seguinte imagem.

Achei legal e  decidi colocar no blog… =D

corpo-humano-em-html

Configurando “Localization” em projetos Flex

Criando Frameworks resources
Teremos que executar o comando copylocale, para isso usando o shell (linux) ou command (windows), seguiremos até o caminho “{InstalaçãoDoFlex}/sdks/{versaoDoSdk}/bin/”, estando dentro dessa pasta conseguimos executar o comando “copylocale en_US pt_BR”, será criada a pasta pt_BR no caminho “{InstalaçãoDoFlex}/sdks/{versaoDoSdk}/frameworks/locale/”.

Configurando o projeto
Clique com o botão direito do mouse no projeto, siga até “properties >> Flex Compiler”, passe esse argumeto para o compilador “-locale en_US pt_BR -source-path+=../locale/{locale}”

Crie o seguinte caminho na raiz do seu projeto “nomeDoProjeto/locale/en_US” e “nomeDoProjeto/locale/pt_BR”, dentro dos respectivos caminhos irememos criar o arquivo “localization.properties”

Exemplos de localization.properties

#locale/en_US/localization.properties
connected=Sender Connected
succeded=Send Succeded
failed=Send failed
enter=Enter contact
send=Send contact
send_btn=Send
#locale/pt_BR/localization.properties
connected=Conectado
succeded=Envio correto
failed=Falha no envio
enter=Insira o contato
send=Enviar contato
send_btn=Enviar

Exemplo aplicado

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="955" minHeight="600">
	<mx:Script>
		<![CDATA[

			import mx.resources.ResourceBundle;

			[Bindable] private var locales:Array = [ 'pt_BR', 'en_US' ];
			private static const LOCALIZATION:String = 'localization';

			private function changeLanguage():void
			{
				this.resourceManager.localeChain = [cbxLanguage.selectedItem];
			}
		]]>
	</mx:Script>
	<mx:Metadata>
		[ResourceBundle('localization')]
	</mx:Metadata>

	<mx:ComboBox id="cbxLanguage" dataProvider="{locales}"  x="10" y="10" change="changeLanguage()"/>

	<mx:Label id="lblLocale1" text="{resourceManager.getString( LOCALIZATION , 'connected' )}" />
	<mx:Label id="lblLocale2" text="{resourceManager.getString( LOCALIZATION , 'succeded' )}" />
	<mx:Label id="lblLocale3" text="{resourceManager.getString( LOCALIZATION , 'failed' )}" />
	<mx:Label id="lblLocale4" text="{resourceManager.getString( LOCALIZATION , 'enter' )}" />
	<mx:Label id="lblLocale5" text="{resourceManager.getString( LOCALIZATION , 'send' )}" />
	<mx:Label id="lblLocale6" text="{resourceManager.getString( LOCALIZATION , 'send_btn' )}" />
</mx:Application>
Para cima