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ってことですね。
うんそっか。簡単な話でしたね。

2010年12月29日水曜日

キーとマウスのハンドリング。

自分で書いた以前のコードを見たところ、
キーのup/down
マウスのup/down/move/over
をstageから所得するようなクラスを作成していた。
これが正しいかどうかわからないが、とりあえず、この方法としてみる。
正確には、stageから所得ではなく、
コンストラクタの引数にstageを渡しているだけの話である。

なんでstageからとるかというと、最下層から取りたかっただけである。
ActionScriptのイベントは、下の層から発生するので、かならずstageで拾うことができた気がするのだが、結論から言うととれないこともあった。
それはそれとして、もう忘れてしまったので、実際に出現したときに対応を考える。
→たしか、、なんらかのコントロールをはりつけると、、shiftは拾えるがctrlは拾えないという事態が発生したような記憶がある。


ということで、マウスとキー(文字入力という意味ではなく、主に、ctrl/shiftあたり)の所得は、stageのみで行い、本来イベントの欲しいところのSprite/MovieClipにイベントハンドらっぽい関数を設定して、そこを呼ぶようにする。
stageのみで行い、本来イベントの欲しいところのSprite/MovieClipにイベントハンドらっぽい関数を設定して、そこを呼ぶようにする。
この画像は、http://gelsol.sub.jp/learning/displaylist/001.html
からの引用です。




デモサイト構築。

今度、デモサイトを作る。
よって、1年もやってないので忘れてしまったActionScriptの復習からはいる。
CS3もCS5になってしまった。

まずは、キーとマウスハンドリングの確認。
その前に、thisとstageの確認。

trace (this);
trace (stage);

結果
[object MainTimeline]
[object Stage]
あぁそうだった。thisはMainTimeLineだったよね。
こんなことさえ忘れてる^^;