2011年1月22日土曜日

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

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

class alexsock{
 private $portn;
 private $address;
 private $sock;
 private $counter;
 //-------------------------
 /* 初期値 */
 //-------------------------
 function __construct(){
  $this->address = 'localhost';
  $this->portn = 20002;
  $this->counter = 10;
 }
 //-------------------------
 function __destruct(){
  // とりあえず特にやることなし。
 }
 //-------------------------
 function setAddress($v){
  $this->address = $v;
 }
 //-------------------------
 function setPort($v){
  $this->portn = $v;
 }
 //-------------------------
 function create(){
  $this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  if ($this->sock === false) return false;
  return true;
 }
 //-------------------------
 function connect(){
  $result = socket_connect($this->sock, $this->address, $this->portn);
  if($result === false) return false;
  return true;
 }
 //-------------------------
 function setNonblock(){
  socket_set_nonblock($this->sock);
 }
 //-------------------------
 function setBlock(){
  socket_set_block($this->sock);
 }
 //-------------------------
 function setWaitTime($milisec){
  $this->counter = $milisec / 100;
  if($this->counter < 1) $this->counter = 1;
 }
 //-------------------------
 function close(){
  socket_close ($this->sock);
 }
 //-------------------------
 function write($msg){
  $writelen = socket_write($this->sock, $msg, mb_strlen($msg)); 
  return $writelen;
 }
 //-------------------------
 function read($slen){
  $readlen = socket_read($this->sock, $slen);
  return $readlen;
 }
 //-------------------------
 function readEx($slen){
  for($w=0;$w<$this->counter;$w++){
   if($readstr == false){
    $readstr = socket_read($this->sock,$slen);
    if($readstr != false) return $readstr;
    usleep(100000);   // マイクロ秒単位
   }
  }
  return false;
 }
 //-------------------------
 // ありがちな準備
 //-------------------------
 function alexPrepare($add="127.0.0.1",$portn=20002,$milisec=10000){
  $this->setAddress($add);
  $this->setPort($portn);
  $this->setWaitTime($milisec);
  $b = $this->create();
  if(!$b) return false;
  $b = $this->connect();
  if(!$b) return false;
  $this->setNonblock();
  return true;
 }
 //-------------------------
}

2011年1月6日木曜日

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

まぁいわゆるMXMLというやつ。
これをコンパイルするとどうなるかというと、いったんActionScriptになるようですよね。
ということで、プロジェクト-プロパティでFLEXコンパイラの追加引数に【-keep】を追加。
さらに、ボタンをひとつ配置して、クリックイベントとだけ追加して、コンパイル。
MXMLとしては、こんな感じになる
<fx:Script>
  <![CDATA[
   protected function BTNID_clickHandler(event:MouseEvent):void
   {
    // TODO Auto-generated method stub
   }

  ]]>
 </fx:Script>
変換されると、こんな感じ
public class Main
    extends spark.components.Application
{
……略……
protected function BTNID_clickHandler(event:MouseEvent):void
{
 // TODO Auto-generated method stub
}
……略……
ということで、Main.mxmlというのが、Mainクラスになって、<fx:Script>の中が、そのままMainクラスになるという単純な構造のようだ。
ということで、最下層でいろいろやりたければ、

<fx:Script>
  <![CDATA[
   var aaa:Number = 0;
   public function test():void
   {
    var d:Date = new Date();
    var s:String = d.toTimeString();
    trace(s);
    trace(aaa++);
   }

   protected function BTNID_clickHandler(event:MouseEvent):void
   {
    test();// TODO Auto-generated method stub
   }

  ]]>
 </fx:Script>
なんて、適当なことをかいても、無事に、
public class Main
    extends spark.components.Application
{
……略……
 var aaa:Number = 0;
   public function test():void
   {
    var d:Date = new Date();
    var s:String = d.toTimeString();
    trace(s);
    trace(aaa++);
   }

   protected function BTNID_clickHandler(event:MouseEvent):void
   {
    test();// TODO Auto-generated method stub
   }
という風に変換されます。
ということで、あとは、【creationComplete】や【initialize】あたりに初期設定をいれてあれこれいじくりまわせばそれでOKってことですね。
うんそっか。簡単な話でしたね。