JavaScriptのクロージャを説明

続いてクロージャについても説明。こう言えばよかったと今さらながらに思ったのでメモ。

  • JavaScriptの関数はオブジェクトである
  • 関数内で宣言された変数や関数の引数は,呼び出しごとに生成されるオブジェクト(変数オブジェクト)のプロパティとなる
  • 関数内で参照される変数は,関数の内から外に向けて探索され,最初に見つかったものが使用される
  • 関数オブジェクトが存続する限り,変数オブジェクト(とそのプロパティである変数)も存続する
  • 関数[1]内から関数オブジェクト[2]をreturnすることで,不可視の変数オブジェクト(=関数[1]の)を携えたままの関数オブジェクト[2]を得ることができる → 関数[2]=クロージャ

…かえって解りづらいかも。

JavaScriptのthisのこと

会社でJavaScriptのthisキーワードについて説明する機会があった。

  • [this]はキーワード
  • 同じ関数でも,呼び出される状況に応じてthisの指すオブジェクトは変わる
  • コンストラクタ関数内のthisはnewされるオブジェクト(コンストラクタ関数の戻り値)を指している

サンプルコード。結果表示はFirefoxのもの。

<html lang="ja">
<head><title></title></head>
<body>
<script>

var C = function() {
	this.func = function() {
		document.write(this);
		document.write("<br />");
	};
};

var c = new C();
c.func(); //=> [object Object]
/*
  Cをコンストラクタとしてオブジェクトを生成し
  funcをcのメソッドとして呼び出すと,
  メソッド内のthisはcを指している。
*/

var f = c.func;
f(); //=> [object Window]
/*
  オブジェクトcのメソッドをグローバルな関数として
  取り出してから呼び出すと,
  thisはグローバルオブジェクトを指している。
*/

var D = function() {
	this.toString = function() {
		return "I'm object!";
	};
};
var d = new D();
f.call(d); //=> I'm object!
/*
  新たなオブジェクトdを生成し,それをcallメソッドの
  引数として関数を呼び出すと,thisはdを指す。
  toStringはオブジェクトを文字列化したい時に
  呼び出されるメソッド。
*/

</script>
</body>
</html>

Gitのインストール,設定メモ

前後したけど,Gitのインストールメモ

  1. Git - Downloadsから最新バージョンをダウンロード(記事作成時は[Git-1.7.11-preview20120620.exe])
  2. ダウンロードしたexeを実行
  3. インストール先を[C:\git]に変更(既定の[Program Files]だと,Emacsから使えなかった)
  4. [Select Components]では,[Advanced context menu]を選択,あとは適当
  5. [Adjusting your PATH environment]では,[Run Git from the Windows Command Prompt]を選択
  6. [Configuring the line ending conversions]では,[Checkout as-is,commit as-is]を選択
  7. インストール
  8. Git GUIを起動し,[編集]>[オプション]でユーザー名とメールアドレスを設定

svn->gitへのclone

gitを触ってみようと思い,試しにこれまで使っていたsvnリポジトリをcloneしようとして躓いたのでメモ(Windows)。

git-svnのモジュール追加

git-bash

$ git svn clone file:///D/repo

としても

Can't locate Git/SVN/Editor.pm in @INC ...

とのエラーが発生。Editor.pmなどのモジュールが入ってないらしい。ので,このあたりのファイルを「C:\Git\lib\perl5\site_perl\Git\SVN\」以下にコピー。

svnリポジトリの更新(参考:http://k-kamerad.no-ip.com/~nucleus/?itemid=514

再度git svnするも,

Permission denied: Can't open '/tmp/report.tmp'

とのエラー。svnリポジトリが古い場合に起こるらしい。
Subversionを最新のものに更新した後,移行用のリポジトリをD:\repo2 に作成し,

> svnadmin dump D:\repo > repo.dump
...
> svnadmin load D:\repo2 < repo.dump
...

リポジトリの新バージョンを作成。

svnサーバを起動(参考:git svn clone でfile::///なリポジトリからのcloneに失敗したらsvn://を試してみよう - ..たれろぐ..

$ git svn clone file:///D/repo2

を試みるも,

Couldn't open a repository: Unable to open an ra_local session to URL: Unable to open repository 'file:///D/repo2'

どうやら,fileスキームが使えないみたい。
そこで,一時的にsvnサーバを起動する。

> svnserve.exe -X --root E:\repo2

改めて

$ git svn clone svn://localhost/ repo.git
...

できた!\(^▽^)/

Word2003→2007への数式変換

Word2003までの「Microsoft数式3.0」からWord2007以降の「数式ビルダー」形式への変換について。
いろいろ調べたけど,“これ”といった方法が見つからない。ので考えてみたメモ。

方針

TeXaideを利用して,「数式3.0」→「TeX」→「MathML」と変換する。

手順

  1. TeXaideを起動しておく
  2. *.docを開き,*.docxで別名保存
  3. 文書内のすべての「数式3.0」オブジェクトについて
    1. オブジェクトをコピー
    2. TeXaideに貼り付け
    3. TeXaideからコピー(クリップボード上にTeXコードが保存される)
    4. TeXコードを何とかして(ぉぃ)MathMLに変換し,クリップボードに保存
    5. 文書のオブジェクトのある位置にペースト(自動的に「数式ビルダー」形式になる)

TeX→MathMLへの変換は,rubymath_mlを使わせてもらうことを考えてる。

うまくいくかは知らない。
そして今見たら,TeXaideがダウンロードできなくなってる。orz

小ネタ2

i = Man.new
you = Woman.new

i.love you

素敵なことです。
ManとWomanの実装↓

class Man
  def initialize
    @honesty = true
  end

  def love woman
    if @honesty
      puts 'I love you.'
      woman.love self
    end
  end
end

class Woman
  def initialize
    @honesty = true
  end

  def love man
    if @honesty
      puts 'I love you, too.'
      man.love self
    end
  end
end

実行結果

I love you.
I love you, too.
I love you.
I love you, too.
...(以下延々と)

...これも現実です。w

小ネタ

i = Man.new
you = Woman.new

i.love you

素敵なことです。
ManとWomanの実装↓

class Man
  def initialize
    @money = 1000
  end

  def love woman
    @money -= woman.cost
    woman.love self
  end

  def available?
    @money > 0
  end

  def miss woman
    # nothing to do
  end
end

class Woman
  def initialize
    @cost = 200
  end

  def love man
    if man.available?
      puts 'I love you.'
      man.love self
    else
      puts 'bye!'
      man.miss self
    end
  end

  attr_reader :cost
end

...現実なんて。orz