2011年1月22日土曜日

PHP@x64@Windows7でfsockopenが必ずエラーとなる。

PHPのWindowsの64ビット版。
公式にはまだないようですが、なんとなくdownloadして使ってみてるんですが、、、、、
とりあえず、、
fsockopen は必ずエラーになることがわかりました。
しょうがないので、こんな感じで、ベタな関数を使ってクラスをかきました。
ローレベルの関数は問題なく実行できたので、とりあえずはこれは使ってみます。。。。
そういえば、、readfile関数も微妙に怪しい。。。。。^^;^^;

  1. class alexsock{  
  2.  private $portn;  
  3.  private $address;  
  4.  private $sock;  
  5.  private $counter;  
  6.  //-------------------------  
  7.  /* 初期値 */  
  8.  //-------------------------  
  9.  function __construct(){  
  10.   $this->address = 'localhost';  
  11.   $this->portn = 20002;  
  12.   $this->counter = 10;  
  13.  }  
  14.  //-------------------------  
  15.  function __destruct(){  
  16.   // とりあえず特にやることなし。  
  17.  }  
  18.  //-------------------------  
  19.  function setAddress($v){  
  20.   $this->address = $v;  
  21.  }  
  22.  //-------------------------  
  23.  function setPort($v){  
  24.   $this->portn = $v;  
  25.  }  
  26.  //-------------------------  
  27.  function create(){  
  28.   $this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  
  29.   if ($this->sock === falsereturn false;  
  30.   return true;  
  31.  }  
  32.  //-------------------------  
  33.  function connect(){  
  34.   $result = socket_connect($this->sock, $this->address, $this->portn);  
  35.   if($result === falsereturn false;  
  36.   return true;  
  37.  }  
  38.  //-------------------------  
  39.  function setNonblock(){  
  40.   socket_set_nonblock($this->sock);  
  41.  }  
  42.  //-------------------------  
  43.  function setBlock(){  
  44.   socket_set_block($this->sock);  
  45.  }  
  46.  //-------------------------  
  47.  function setWaitTime($milisec){  
  48.   $this->counter = $milisec / 100;  
  49.   if($this->counter < 1) $this->counter = 1;  
  50.  }  
  51.  //-------------------------  
  52.  function close(){  
  53.   socket_close ($this->sock);  
  54.  }  
  55.  //-------------------------  
  56.  function write($msg){  
  57.   $writelen = socket_write($this->sock, $msg, mb_strlen($msg));   
  58.   return $writelen;  
  59.  }  
  60.  //-------------------------  
  61.  function read($slen){  
  62.   $readlen = socket_read($this->sock, $slen);  
  63.   return $readlen;  
  64.  }  
  65.  //-------------------------  
  66.  function readEx($slen){  
  67.   for($w=0;$w<$this->counter;$w++){  
  68.    if($readstr == false){  
  69.     $readstr = socket_read($this->sock,$slen);  
  70.     if($readstr != falsereturn $readstr;  
  71.     usleep(100000);   // マイクロ秒単位  
  72.    }  
  73.   }  
  74.   return false;  
  75.  }  
  76.  //-------------------------  
  77.  // ありがちな準備  
  78.  //-------------------------  
  79.  function alexPrepare($add="127.0.0.1",$portn=20002,$milisec=10000){  
  80.   $this->setAddress($add);  
  81.   $this->setPort($portn);  
  82.   $this->setWaitTime($milisec);  
  83.   $b = $this->create();  
  84.   if(!$b) return false;  
  85.   $b = $this->connect();  
  86.   if(!$b) return false;  
  87.   $this->setNonblock();  
  88.   return true;  
  89.  }  
  90.  //-------------------------  
  91. }  

2011年1月6日木曜日

FLEXのMain.mxmlはどのように実行されるのか

まぁいわゆるMXMLというやつ。
これをコンパイルするとどうなるかというと、いったんActionScriptになるようですよね。
ということで、プロジェクト-プロパティでFLEXコンパイラの追加引数に【-keep】を追加。
さらに、ボタンをひとつ配置して、クリックイベントとだけ追加して、コンパイル。
MXMLとしては、こんな感じになる
  1. <fx:Script>  
  2.   <![CDATA[  
  3.    protected function BTNID_clickHandler(event:MouseEvent):void  
  4.    {  
  5.     // TODO Auto-generated method stub  
  6.    }  
  7.   
  8.   ]]>  
  9.  </fx:Script>  
変換されると、こんな感じ
  1. public class Main  
  2.     extends spark.components.Application  
  3. {  
  4. ……略……  
  5. protected function BTNID_clickHandler(event:MouseEvent):void  
  6. {  
  7.  // TODO Auto-generated method stub  
  8. }  
  9. ……略……  
ということで、Main.mxmlというのが、Mainクラスになって、<fx:Script>の中が、そのままMainクラスになるという単純な構造のようだ。
ということで、最下層でいろいろやりたければ、

  1. <fx:Script>  
  2.   <![CDATA[  
  3.    var aaa:Number = 0;  
  4.    public function test():void  
  5.    {  
  6.     var d:Date = new Date();  
  7.     var s:String = d.toTimeString();  
  8.     trace(s);  
  9.     trace(aaa++);  
  10.    }  
  11.   
  12.    protected function BTNID_clickHandler(event:MouseEvent):void  
  13.    {  
  14.     test();// TODO Auto-generated method stub  
  15.    }  
  16.   
  17.   ]]>  
  18.  </fx:Script>  
なんて、適当なことをかいても、無事に、
  1. public class Main  
  2.     extends spark.components.Application  
  3. {  
  4. ……略……  
  5.  var aaa:Number = 0;  
  6.    public function test():void  
  7.    {  
  8.     var d:Date = new Date();  
  9.     var s:String = d.toTimeString();  
  10.     trace(s);  
  11.     trace(aaa++);  
  12.    }  
  13.   
  14.    protected function BTNID_clickHandler(event:MouseEvent):void  
  15.    {  
  16.     test();// TODO Auto-generated method stub  
  17.    }  
という風に変換されます。
ということで、あとは、【creationComplete】や【initialize】あたりに初期設定をいれてあれこれいじくりまわせばそれでOKってことですね。
うんそっか。簡単な話でしたね。