顯示具有 FLEX 標籤的文章。 顯示所有文章
顯示具有 FLEX 標籤的文章。 顯示所有文章

2013年5月23日 星期四

Flex Socket Policy

新版的 Flex 支援 socket 通訊,但需要有自己的 Policy Server,好讓 Flex 有連線需求時進行 Policy 認證(透過 port:843)。

一、建立 socketpolicy.pl 檔,內容如下…
############################################################################
#!/usr/bin/perl -wT
#
# Simple Flash Socket Policy Server
# http://www.lightsphere.com/dev/articles/flash_socket_policy.html
#
# Copyright (C) 2008 Jacqueline Kira Hamilton
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see .


use Socket;
use IO::Handle;

my $should_be_logging = 1;  # change to 0 to turn off logging.

my $logfile = 'log';

if ($should_be_logging) {
    open(LOG, ">$logfile") or warn "Can't open $logfile: $!\n";
    LOG->autoflush(1);
}

my $port = 843;
my $proto = getprotobyname('tcp');

# start the server:

      &log("Starting server on port $port");
    socket(Server, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1 ) or die "setsockopt: $!";
      bind(Server,sockaddr_in($port,INADDR_ANY)) or die "bind: $!";
    listen(Server,SOMAXCONN) or die "listen: $!";

    Server->autoflush( 1 );

my $paddr;
&log("Server started. Waiting for connections.");

$/ = "\0";      # reset terminator to null char

# listening loop.

for ( ; $paddr = accept(Client,Server); close Client) {
    Client->autoflush(1);
    my($port,$iaddr) = sockaddr_in($paddr);
    my $ip_address   = inet_ntoa($iaddr);
    my $name         = gethostbyaddr($iaddr,AF_INET) || $ip_address;
    &log( scalar localtime() . ": Connection from $name" );
 
    my $line = ;
    &log("Input: $line");

    if ($line =~ /.*policy\-file.*/i) {
        print Client &xml_policy;
    }
}

sub xml_policy {
    my $str = qq(\0);
    return $str;
}

sub log {
    my($msg) = @_;
    if ($should_be_logging) {
        print LOG $msg,"\n";
    }
}
############################################################################
 
二、在你的 server 上執行…
sudo ./socketpolicy.pl > /dev/null &


2009年11月29日 星期日

PV3D 練習 - Facebook 好友大頭照

DEMO:(需登入fb)
http://www.asn.com.tw/flex/20091129.htm
20110827更新連結…
http://www.vercenter.nknu.edu.tw/flex/FacebookFriends/LongfellowHelloFlex.html

在 facebook 上登入,讀取好友名單及大頭照,再將大頭照轉成 BitmapMaterial,用這個材質生成 PLANE,再置入 PV3D 場景中。

效果跟效能,並不是絕對的反比關係。




SOURCE:
package study
{
    import game.FacebookAP;

    import com.facebook.data.users.FacebookUser;
   
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.BlurFilter;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;
       
    import org.papervision3d.core.effects.view.ReflectionView;
    import org.papervision3d.core.math.Quaternion;
    import org.papervision3d.cameras.CameraType;
    import org.papervision3d.materials.BitmapMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Plane;

    public class study21 extends ReflectionView
    {
        private var currentQuat:Quaternion = new Quaternion();
        private var targetQuat:Quaternion = new Quaternion();
        private var slerp:Number = 0;
        private var fbRadius:Number;
        private var carousel:DisplayObject3D = new DisplayObject3D();
        private var isMouseDown:Boolean;
        private var fb:FacebookAP;
        private var save_mouseX:Number;
        private var save_rotationY:Number;
        private static var planeWidth:Number = 50;
        private static var planeHeight:Number = 50;
       
        public function study21()
        {
            super(0,0,true,false,CameraType.FREE);
            this.addEventListener(Event.ADDED_TO_STAGE, init0);
        }
       
        private function init0( event:Event ):void
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, init0);
            fb = new FacebookAP();
            fb.addEventListener( Event.COMPLETE, init1 );
            fb.init();
        }

        private function init1( event:Event ):void
        {
            fb.removeEventListener( Event.COMPLETE, init1 );
           
             opaqueBackground=0;
            surfaceHeight = -5;
            viewport.interactive=true;
            viewportReflection.filters = [new BlurFilter(3,3,3)];
            setReflectionColor(.7, .7, .7);

            fbRadius = ( fb.friends.length * (planeWidth+planeWidth/2) )/(2*Math.PI);

             camera.target = carousel;
            camera.position = carousel.position;
            camera.y = planeHeight/2;
             camera.moveBackward( fbRadius+150 );
           
             for( var i:int=0; i
             {
                  var user:FacebookUser = fb.friends.getItemAt(i) as FacebookUser;
                var lc:LoaderContext = new LoaderContext(true);       
                var loader:Loader = new Loader();
                loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onLoadBitmap );
                if( user.pic_square == "" )
                    loader.load(new URLRequest( "images/q_silhouette.gif" ), lc );
                else
                    loader.load(new URLRequest( user.pic_square ), lc);
            }

            scene.addChild(carousel);
            this.addEventListener(Event.ENTER_FRAME, onENTER_FRAME );
            this.stage.addEventListener( MouseEvent.MOUSE_DOWN, onMOUSE_DOWN );
            this.stage.addEventListener( MouseEvent.MOUSE_UP, onMOUSE_UP );
        }

        private function onLoadBitmap( event:Event ):void
        {
            var bodyMaterial:BitmapMaterial = new BitmapMaterial( Bitmap(LoaderInfo(event.target).content).bitmapData );
            bodyMaterial.interactive=true;
            bodyMaterial.doubleSided=true
           
            var plane:DisplayObject3D = new Plane( bodyMaterial,planeWidth,planeHeight,1,1 );
           
            plane.rotationY = ( 360 / fb.friends.length ) * carousel.numChildren;
            plane.moveForward( fbRadius );
            plane.y = planeHeight/2;
           
            carousel.addChild(plane);
        }      

        private function onMOUSE_DOWN(e:Event):void
        {
            isMouseDown = true;
            save_mouseX = this.stage.mouseX;
            save_rotationY = carousel.rotationY;
        }
       
        private function onMOUSE_UP(e:Event):void
        {
            isMouseDown = false;
        }
       
        private function onENTER_FRAME(e:Event):void
        {
            if( isMouseDown )
            {
                carousel.rotationY = save_rotationY + (180/Math.PI)*Math.atan((save_mouseX-this.stage.mouseX)/(fbRadius+150));
            } else {
                carousel.rotationY -= ( this.stage.mouseX - this.stage.stageWidth/2 )/200;

                slerp += (1 - slerp) * .05;
                var quat:Quaternion = Quaternion.slerp( currentQuat, targetQuat, slerp );
                carousel.transform = quat.matrix;
             }
        
            singleRender();
        }
    }
}

VirtualBox 空間減肥

sdelete64 -z c: VBoxManage  modifymedium  disk  "/Users/fellow/VirtualBox VMs/Win10/Win10.vdi"  --compact *.vdi 路徑可以在 VirtualBox 儲...