Javascriptで型判定

こんな感じでいかが。

var type_of = function(o){
  if ((t=typeof o)!="object") { return t; }
  if (t===null) { return "null"; }
  return Object.prototype.toString.apply(o).match(/\[object (.*?)\]/)[1];
};

クロスブラウザで同じ結果が得られるかは試せてません。コメント期待…。

Javascriptはtypeof([1,2,3])がobjectなところが香ばしいですね。

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

ruby-debugのちょっとだけ高度な使い方

便利なコマンド

ps

オブジェクトが配列なら、ソートした上でカラム上に並べて見やすくしてくれます。

Using the ps command in ruby-debug

Railsのメソッド一覧をpsしてみた

irb

その場でirbに突入します。後述のautoevalをONにしてればあまり意味はないかも。

Debugger.settingsでオプション設定

require 'ruby-debug'したあとでDebugger.settings[:key]=valueすると各種オプションを設定できます。網羅的なリストはこちら。特に便利なのは以下。

:autoeval

trueにすると、デバッガコマンドが見つからないときは自動的にevalを試してくれます。*** Unknown command: "User.first.name". Try "help".がしばしば出てしまう僕にとっては必須。

ちなみにRailsでは、テストヘルパ(railties/lib/test_help.rb)でautoevalが設定されてます。

:autolist

trueにすると、デバッガに入ったときやステップ実行時などに自動的にlistを実行して周辺コードを表示してくれます。

これもRailsのテストヘルパで設定されてます。

:forcestep

trueにすると、ステップ実行時に必ず別の行へ飛びます。
Rubyは一行で色々書けるので、普通にステップすると同じ行内でステップすることもありますが、このオプションを使えば一行=1ステップになります。

参考:
Debugging with ruby-debug

Categories: Whatnot |Tagged , , | Leave a comment

undefined method `rewrite’ for “…”:String

Railsのコントローラで謎のエラー

NoMethodError (undefined method `rewrite' for "http://colinux/sample/":String):

app/controllers/start_controller.rb:33:in `index'

これはどうやらActionController::Baseな場所で@urlという変数をアサインした上でredirect_toなどすると発生するらしい。わかるかそんなこと!

undefined method `rewrite for #.

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

Javascriptで変数が配列かどうかチェックするには

var isArray = function(that){
  return (Object.prototype.toString.apply(that) === "[object Array]");
};

RequireJSのソースコードより。

追記
[1,2,3].toString()すると”[object Object]“が返って来ます。この挙動の違いについてはまだよく分かってません。

追記
あれ?これでもいけるのでは?

var isArray = function(that){
  return (that instanceof Array);
}

これならもう関数にする意味もないな。

追記
こんなんでもいいよね。

var isArray = function(that){
  return (that.constructor === Array);
}
Categories: HowTo's, Tips and Tricks |Tagged , , | Leave a comment

[未解決] JSのrequireで依存関係のロード完了を保証したい

RequireJSでこんなコードを書いてる。

page.html

<script>
require(["libA"], function(){
  libA.foo();
});
</script>

libA.js

// libB, libC, libD,...など不特定多数多数のライブラリに依存する
require(["libB", "libC", "libD"], function(){
  libA = {
    foo: function(){
      libB.something();
    }
  };
});

libB.js, libC.js, libD.js, libE.js…

libB = {
  // blah blah blah...
};

だがこのコードはほとんどうまく動くことがない(たまに上手くいく)。なぜなら、libAのrequireコールバックが呼ばれたときにまだlibB以降は使えない可能性が高いからだ。

普通ならHTML内のrequireで全部のライブラリを列挙すれば安全にロードできるのだが、ここではlibB以降のライブラリは場合によって必要なものと数が変わるからHTML内では列挙できない。

そこで、libB以降のライブラリの読み込みを保証してからHTML側の処理に入りたい。
どういうやり方が賢いだろうか。

こんな風に書けたらいいな

page.html

<script>
require(["libA"], function(){
  function(){
    libA.foo();
  }
});

libA.js

libA = {};
require(["libB", "libC", "libD"], function(){
  libA = {
    // blah blah blah...
  };
  loaded("libA");
});

要はファイルが読み込まれただけじゃなく、初期化が完了して使える状態にあることをローダーに対して伝えたいわけだな。ちょっと実装してみる。

Categories: Whatnot |Tagged , , | Leave a comment