vimにちょっと慣れてきた頃に覚えた操作

h,j,k,l,i,a,y,o,uあたりを考えずに使えるようになってきました。というわけで最近覚えてベンリィなキー操作。

cw
カーソルの下の単語末尾までを置き換える(削除してインサートモードへ)。wは移動なのでcf{(次の中括弧までを置き換え)とかc3j(三行削除して置き換え)とかも可能。
==
インデントを調整。ヴィジュアルモードで複数行選択してから=でもOK。ファイル全体ならggvG=
J
今の行と次の行を連結。
Categories: HowTo's, Tips and Tricks | Tagged | Leave a comment

FlexアプリケーションのMXML内要素を外部から参照する

Flex 4で、メインのMXML内の要素を他のクラスから参照する方法です。


「Flexアプリケーション」を作り始めると、まるでMXMLの中にコードを書くのがデフォかのようになりますが、<fx:Script>の中にコードが増えていくのはあまり気持ちよくないですね。そこで別のクラスにエントリポイントを作ることになります。これはApplicationCompleteイベントにハンドラをつけるだけです。

MyFlexApp.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    applicationComplete="MyEntryPointClass.main()">
    <!--UI要素とかの定義...-->
</s:WindowedApplication>

さて、MyEntryPointClassからこのMXMLを参照する方法です。

このMyFlexApp.mxmlは

  • 実行時にはMyFlexAppクラスのインスタンスとして存在する。
  • クラス名はアプリごとに違う。MXMLのファイル名をクラス名として持つらしい。
  • Applicationのサブクラス。
  • mx.core.FlexGlobals.topLevelApplicationを使えばどこからでも参照できる
  • ただしtopLevelApplicationはObject型なので、MyFlexApp型へキャストしないと使えない。

というわけで、でき上がったコードはこんな感じ。

MyFlexApp.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    applicationComplete="MyEntryPointClass.main();">
    <s:Button label="Button" id="theButton" />
</s:WindowedApplication>

MyEntryPointClass.as

package{
  import flash.events.MouseEvent;
  import mx.core.FlexGlobals;
  import spark.components.Application;
  public class MyEntryPointClass{
    public static function main():void{
      var app:MyFlexApp = mx.core.FlexGlobals.topLevelApplication as MyFlexApp;
      app.theButton.addEventListener(MouseEvent.CLICK, theHandler);
    }
    private static function theHandler(e:MouseEvent):void{
      // yada yada yada...
    }
  }
}

やったね!

参考:mx.core.FlexGlobals – Adobe® Flex® 4 リファレンスガイド (Flex 4)

Categories: HowTo's, Tips and Tricks | Tagged , , | Leave a comment

PuTTYがCtrl+Sでフリーズするのを防ぐ

たまにvimを使ってると、保存したいのか知らんが間違ってCtrl+Sを押してしまうことがあります。するとターミナルがフリーズしますね。Puttyに限らずターミナルエミュレータ全般の話のようですが。

Ctrl+Qを押せば復活するんですが、今でもたまに押してしまって面倒なので、AutoHotKeyでガードするようにしました。

#IfWinActive, ahk_class PuTTY
{
	^s:: Send, {}
}
Categories: HowTo's, Tips and Tricks | Tagged , | Leave a comment

Javascriptで手っ取り早く関数をモックする

JsMockitoとかJSMockとか色々あるようですが、変にDSLのようなものを覚えるのも面倒だったのでスパッとモックできるようにしてみました。

機能は任意の関数を、別の関数で一時的に置き換えるだけです。Ajaxを使うような関数のユニットテストなどがやりやすくなります。

// Mock.makeで関数を置き換え。
// 最初の引数は関数名で、次は関数オブジェクト。
Mock.make("some_func", new_func);

// some_funcを呼ぶとnew_funcが実行される
some_func();

// Mock.revertで元に戻る
Mock.revert("some_func");

// Mock.revert_allで全てのモックが元に戻る
Mock.revert_all();

使い方の例(1)

// prompt()をモックしてみる
Mock.make("prompt", function(title, text){
  return "あばびぶべー!";
});

var name = prompt("What's your name?")
console.log(name); //=> "あばびぶべー!"

Mock.revert("prompt"); // これでもとに戻った

使い方の例(2)

test("#save saves the text", function(){
    var ajax_called = false;

    // $.ajaxをモックする。
    Mock.make("$.ajax", function(opts){
        ajax_called = true;
        // $.ajaxが呼ばれたときにオプションが適切かどうかをassertする
        equals(opts.url,        "/jsapi/pages/set_title");
        equals(opts.type,       "post");
        equals(opts.data.id,    page_id);
        equals(opts.data.title, new_title);
        // successコールバックを呼ぶ。
        opts.success({success:true}, null, null);
    });

    // MyLibrary.saveは$.ajaxを呼ぶはず。
    MyLibrary.save(25, "This is the new text.");
    ok(ajax_called, "Ajax was called.");
});

本体

var Mock = {
  store: {},

  make: function(funcname, newfunc){
    if (this.store[funcname]==undefined){
      this.store[funcname] = (function(){
        return eval(funcname);
      }).apply(arguments.caller);
    }
    (function(){
      eval(funcname+"=newfunc;");
    }).apply(arguments.caller);
  },

  revert: function(funcname){
    if(this.store[funcname]!=undefined){
      var self = this;
      (function(){
        eval(funcname+"=self.store[funcname];");
      }).apply(arguments.caller);
      this.store[funcname] = undefined;
    }
  },

  revert_all: function(){
    for(var funcname in this.store){
      this.revert(funcname);
    }
  },
};
Categories: Things I Made | Tagged , , | Leave a comment

DisplayObjectの基準点を変更する

できません。

つまりscaleXやrotationは必ず(0,0)を基準点として行われる。
別の基準点でスケールや回転をしたい場合はtransform.matrixに新しいMatrixをセットする必要がある。

var mat:Matrix = new Matrix();
mat.translate(-50, -50);
mat.rotate(45*Math.PI/180);
mat.translate(50, 50);
mat.concat(_sp.transform.matrix);
myobj.transform.matrix = mat;

参考:DisplayObject – ActionScript 3.0 Language and Components Reference

Categories: HowTo's, Tips and Tricks | Tagged , , | Leave a comment