2009年11月アーカイブ



JavaScriptでカリー化


私の第一言語であるJavaScriptでカリー化を試してみる。


JavaScriptはお師匠のJavascriptシェルで実行すると楽ちん。



例題はWikipediaのカリー化を参考にしよう。



関数 f がhttp://upload.wikimedia.org/math/9/3/6/936d3616ae1788839acf2cbb7228fad2.pngの形のとき、f をカリー化したものを g とすると、g はhttp://upload.wikimedia.org/math/8/6/7/8678d9a38b70c18ff730a4326baf87b9.pngの形を取る。非カリー化(uncurrying)とは、これの逆の変換である。


カリー化とは直感的には「引数を幾つか固定すると、残った引数の関数が得られる」ということである。たとえば、除算の関数http://upload.wikimedia.org/math/8/b/0/8b012fa4da01406236b0b0a5cb959a03.pngをカリー化したものを cdiv とし、inv = cdiv(1) とすると、inv は新しい関数となり、http://upload.wikimedia.org/math/d/2/0/d201da20452ac22a913f0debbcdd4dc4.png 、つまり引数の逆数を返す関数になる。


http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96

実際に書いてみた。

例題を実直にdiv関数を書くとこんな感じ。



var div = function(x,y){
return x / y;
};
alert(div(2, 1));//2

2つ目の例を落とし込むとこんな感じ。



var inv = function(x){
return function(y){
return x / y;
};
};

var cdiv = inv(10);//inv(10)のfunctionを変数cdivにbindする

alert(cdiv(1));//10
alert(cdiv(2));//5

var cdiv = inv(2);//inv(2)のfunctionを変数cdivにbindする
alert(cdiv(1));//2
alert(cdiv(2));//1

alert(inv(10)(2));//5
alert(inv(10)(5));//2


書いて分かったけど、高階関数の一種なのね。なるほど。


乗法してみた

もう少し書いてみる。次は乗法。



var multiplication_curry = function(x){
return function(y){
return x * y;
};
};

//実行例1
var first = multiplication_curry(1);
var second = multiplication_curry(2);
var third = multiplication_curry(3);
alert(first(second((third(4)))));//24
//first(second((third(4))))
//first(second((3 * 4)))
//first(second((12)))
//first(2 * 12)
//first(24)
//1 * 24
//24

//実行例2: 実行例1とは当然等価。
alert(multiplication_curry(1)(multiplication_curry(2)(multiplication_curry(3)(4))));//24
//multiplication_curry(1)(multiplication_curry(2)(3 * 4))
//multiplication_curry(1)(multiplication_curry(2)(12))
//multiplication_curry(1)(2 * 12))
//multiplication_curry(1)(24))
//1 * 24
//24

展開式も書いてみた。


JavaScriptでこの書き方好きだけど、他人のコードをリバースエンジニアリングするのは勘弁。



Pythonでカリー化


乗法を第2言語のPythonで書いてみる。



multiplication_curry = lambda x: lambda y: x * y

print(multiplication_curry(1)(multiplication_curry(2)(multiplication_curry(3)(4))))#24

lamda式を使う。return文がないので綺麗に書けた。


Gaucheでカリー化


ついでにGaucheでもカリー化。



(define (multiplication_curry x)
(lambda (y) (* x y)))

((multiplication_curry 1)
((multiplication_curry 2)
((multiplication_curry 3)
4)))
;;24

大体理解した。



別件の疑問


JavaScriptの関数定義の際、変数に無名関数を束縛する書き方と関数を定義する書き方どっちが主流なんだろう??


変数に無名関数を束縛する書き方例


var div = function(x,y){
return x / y;
};


関数の定義


function div(x,y){
return x / y;
}


個人的には前者の変数に無名関数を束縛する書き方なのだけれど...どっちが良いのだろうか...??




まとめ



  1. カリー化を実戦で使うところってどこだ?

  2. やっぱりプログラミング言語はファーストクラスオブジェクトじゃないと♪



参考


id:m-hiyamaさんのブログを読んでて興味を持ちました。


檜山正幸のキマイラ飼育記


例題はWikipediaからの引用です。


Wikipedia カリー化


実行とテストにはお師匠のJavascriptシェルを利用しました。


Javascriptシェル


イベントをIE、Firefoxで処理する際のメモ書き。

  • イベントオブジェクトの取得。
  • HTMLエレメントの取得。
  • 座標の取得。
var event = e || window.event; var element = event.srcElement || event.target; var xy1 = [event.clientX, event.clientY]; var xy2 = [event.screenX, event.screenY];



日曜日。


id:yuroyoroさん主催のScala Hack-a-thon。


家にいるよりこっち行った方が楽しそうなので行ってきた。


黙々と作業。静かに黙々と。


id:yuroyoroさんが管理しているScalaドキュメントの質がよい♪


しかもDropboxが公開されてる!


Welcome to Scala hack-a-thon #1’s documentation!



業務で使う予定ないけど、結構感触よかった。



懇親会


懇親会はやんやんさんや、くらなんとかさん、やましろさんが楽しそうに呑んでた。


私がJavaを触る以前のJavaの話が結構楽しかったー。


2次会は参加しなかった>_<,




月曜勤労感謝の日。


業務でTracを触ったりしてる。その関係でShubuya.trac温泉にお邪魔した。


進行


9時に会場に到着。id:kompiroさんが会場を準備してた。


で、円卓だったのだが円卓いいね!黙々と皆さん作業していたのだけど、円卓だとお互いの顔が見れてよい。


参加者は大体こんな感じのことしてました。



  • 記事を書く

  • worktimeプラグインの改修をする

  • Hello Worldの表示を試す

  • 怪しいログの調査、改修をする

  • Excelを描画する


終わったら、温泉に行った。東京都で温泉でるの知らんかた。




String.replaceの第2引数にはJavaScript1.3から関数を渡す事が可能。


例)文字列"[1234][567][890]"に対して、"[数値]"の数値にそれぞれ処理を行う。



"[1234][567][890]".replace(/\[[0-9]*?\]/g, function(){
/**
arguments[0]に対する処理。
*/
return ;
});

このString.replaceメソッドによって、正規表現の1回目に引っ掛けた文字列に対してさらに処理を行う事が可能。


便利過ぎる。


参考




Shibuya.trac温泉なう。


開発環境であるVirtualBox上のFedora10がついに容量Maxに到達。なんということだ。


ということで先週リリースされたFedora12で環境構築。



環境


仮想化アプリケーション:VirtualBox


ホストOS:Mac OS 10.5


ゲストOS:Fedora12



VirtualBoxのGuest Additionsをインストールする。



  1. ホストOSのVirtualBoxウィンドウ=>「デバイス」=>「Guest Additionsのインストール」を選択。

  2. ゲストOSのターミナル上で下記を実行。



/media/VBOXADDITIONS_3.0.12_54655/VBoxLinuxAdditions-x86.run


SELinuxを無効化する。


ひとまず急いでるしSElinux切っちゃえ。



setenforce 0

/etc/sysconfig/selinuxを編集

編集前



SElinux=enforcing

編集後



SElinux=disabled


iptablesの停止


えーい。ファイアーウォールも停止してしまえ!



/etc/init.d/iptables stop

自動起動もひとまず停止。



chkconfig iptables off


Emacsのインストール


Emacsがないと半泣きになるので。



yum -y install emacs


Subversionのインストール


TracといったらSubversionだよね。ということで。そういえばGitの設定方法知らないから今度調べる。



yum -y install mod_dav_svn subversion


Subversionリポジトリの作成


mkdir /var/www/svn/
cd /var/www/svn/

svnadmin create <リポジトリ名>
chown -R apache:apache <リポジトリ名>


setuptoolsのインストール


Tracのインストールに必要。



cd /usr/local/src/
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py


Tracのインストール


インタアクト株式会社さんが配布しているTracの日本語翻訳版を使う。



cd /usr/local/src/
wget http://www.i-act.co.jp/project/products/downloads/Trac-0.11.5.ja1.zip
unzip Trac-0.11.5.ja1.zip
cd Trac-0.11.5.ja1
python setup.py install


Tracプロジェクトの作成


mkdir /var/www/trac

trac-admin /var/www/trac/<プロジェクト名> initenv

Project Name [My Project]>  <プロジェクト名>
Database connection string [sqlite:db/trac.db]> そのままエンター
Repository type [svn]> そのままエンター
Path to repository [/path/to/repos]> <Subversionのリポジトリ>
Templates directory [/usr/share/trac/templates]> そのままエンター

chown -R apache:apache /var/www/trac/<プロジェクト名>


Tracの設定


/var/www/trac/<プロジェクト名>/conf/trac.ini


default_charset = cp932

を下記に変更



default_charset = utf-8


Apacheの設定。


細かい設定は帰ってから(ry


ひとまず開発環境構築のため!



chkconfig httpd on


htpasswd

何かと使うので作成しとく。



htpasswd -cm <htpasswdファイルのパス> <ユーザー名>


Tracの設定

/etc/httpd/cond.d/trac.confを編集。



<location /<tracプロジェクト名>>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv <tracプロジェクトのパス>
PythonOption TracUriRoot /<tracプロジェクトのルートパス名>
</location>
<location /<tracプロジェクト名>/login>
AuthType Basic
AuthName "trac"
AuthUserFile <htpasswdファイルパス>
Require valid-user
</location>


Subversionの設定

/etc/httpd/cond.d/subversion.confを編集。



<Location /<アクセスパス>>
DAV svn
SVNPath <リポジトリパス>
AuthType Basic
AuthName "<リポジトリ名称>"
AuthUserFile <htpasswdファイルパス>
Require valid-user
</Location>


ホストOSからゲストOSへHTTP,SSH接続する。


ホストOSのターミナルで下記を実行。「Fedora12」はゲストOSのVirtualBox名。


ssh


VBoxManage setextradata "Fedora12" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
VBoxManage setextradata "Fedora12" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
VBoxManage setextradata "Fedora12" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 60022

試しに接続



ssh -p 60022 -l <ホストOSユーザ名> localhost


http


VBoxManage setextradata "Fedora12" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/Protocol" TCP
VBoxManage setextradata "Fedora12" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/GuestPort" 80
VBoxManage setextradata "Fedora12" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/HostPort" 60080


ホストOSの領域をゲストOSがマウントする


ホストOS側設定。

VirtualBoxの設定。



  1. VirtualBoxの「ウィンドウ」>「デバイス」>「共有フォルダ」を選択。

  2. 「共有フォルダ」ウィンドウが立ち上がるので、「新規共有フォルダを追加」を選択。

  3. 「共有フォルダの追加」ウィンドウが立ち上がるので、ホストOSの「フォルダのパス」、任意の「フォルダ名」をそれぞれ入力、選択。

  4. チェックボックス「永続化する」にチェックを入れ、「OK」を選択。


ゲストOS側設定。

マウント



mkidr <マウント先のパス>
mount -t vboxsf <マウントするフォルダ名> <マウント先のパス>


ゲストOS再起動時のマウント設定。

/etc/rc.localを編集



mount -t vboxsf <マウントするフォルダ名> <マウント先のパス>

参考


rokujyouhitomaの日記 Trac,Subversionのインストール。


rokujyouhitomaの日記 ホストOSの領域をゲストOSでマウントする。


rokujyouhitomaのぷろぐらま日誌 VirtualBoxのMacホストからゲストFedora9にssh。


rokujyouhitomaのぷろぐらま日誌 VirtualBoxにGuest Additionsをインストールする。


SELinuxを無効化するには




id:Syunpei氏こと白石俊平さんがGree Labs第19回 オープンソーステクノロジー勉強会でHTML5についてお話されるのとのことで、他のスタッフを誘って出陣。


Gree Labs第19回 オープンソーステクノロジー勉強会


勉強会内容はJJUGでお伺いしているため割愛。


以下、会場で会ったid:imai78にいさんの要望通りTracLightningのCSSについて書く。




TracLightningのCSS


先に断っておくが、いつもはLinuxのTrac使ってる。TracLightningのソースコードは初めて>_<


ひとまずリポジトリを見たら/trac-template/templates/site_css.csってのがあった。


http://git.sourceforge.jp/view?p=traclight/traclightning.git;a=blob;f=install/trac-template/templates/site_css.cs;h=9e5f60eb7c96039218f6243f3c538dffd45fc49f;hb=HEAD




で、参考になりそうな情報。


他に調べたら、参考になりそうな情報があった。


http://weekbuild.sakura.ne.jp/trac/wiki/TracInterfaceCustomization#サイトCSS


どうやらsite_css.csで外部CSSをimportする方法みたい。




で、もっとソースを漁ってたら。


あれ...Trac wikiのCSSが見当たんない?...と思ってたらあった。id:imai78にいさんの探してるのこれだろー。



python-lib/trac/trac/htdocs/css/wiki.css

http://git.sourceforge.jp/view?p=traclight/traclightning.git;a=blob;f=python-lib/trac/trac/htdocs/css/wiki.css;h=e74b69f2e54911be03a56e5c9a864e4a4b3ac5a4;hb=HEAD




で、もっと参考になったの。


TracLightningのファイル一覧。


http://git.sourceforge.jp/view?p=traclight/traclightning.git;a=blob;f=trac.iss;h=99b555d10bf0936f2b8be512d6c419ae5a022ac8;hb=HEAD



/Trac-0.11.5.ja1/trac/htdocs/css/wiki.css


Trac0.11.5ではどこだ?て事で見た。




他勉強になった点



  • Tracのwikiとかもプラグインとして書かれてる。

  • SourceForge.JPでGitあるんだ。




まとめ


これでid:imai78にいさんの要望通り?




Firefox Developers Conference 2009の最中にGAE/JにおいてJavaScriptで書きたくなったので、Rhinoの設定をしてた。


改めてだけどEclipseすげー。これないと軟弱者なのでJava開発できない。


Rhinoは公式サイトからダウンロードし、js.jarをWEB-INF/libに配置。


importは下記。



import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

呼出し元コードはこんな感じ。



ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName ("JavaScript");
try {
String str = new String("'Hello World Javascript'");
resp.getWriter().println(new java.io.FileReader("js/main.js");
} catch (ScriptException e) {
//エラーハンドリング(ry
}

engine.evalとかの書き方が気持ち悪いんだけど、何か良い手はないものだろか。。


Rhino


https://developer.mozilla.org/ja/Rhino


参考


GAEでRhinoを動かしてみた



=== ニコニコ動画

マイリスト
http://www.nicovideo.jp/mylist/15739795

ふつうのLisp入門 (1/3)
http://www.nicovideo.jp/watch/sm8747093

ふつうのLisp入門 (2/3)
http://www.nicovideo.jp/watch/sm8747174

ふつうのLisp入門 (3/3)
http://www.nicovideo.jp/watch/sm8747246

テクニカルトーク開幕挨拶
http://www.nicovideo.jp/watch/sm8746731

1980年前後のLisp事情とUtiLisp (1/4)
http://www.nicovideo.jp/watch/sm8747351

1980年前後のLisp事情とUtiLisp (2/4)
http://www.nicovideo.jp/watch/sm8747464

1980年前後のLisp事情とUtiLisp (3/4)
http://www.nicovideo.jp/watch/sm8747553

1980年前後のLisp事情とUtiLisp (4/4)
http://www.nicovideo.jp/watch/sm8747702

あなたがSchemeを使うべき10の理由
http://www.nicovideo.jp/watch/sm8746471

弾幕記述言語BulletSMLのご紹介
http://www.nicovideo.jp/watch/sm8746863

3次元幾何モデルライブラリ komainu on CL
http://www.nicovideo.jp/watch/sm8746280

Schemeではじめる音声認識
http://www.nicovideo.jp/watch/sm8746411

他言語で作ったWEBページをLispでも!
http://www.nicovideo.jp/watch/sm8746785

さあ家に帰ったらSchemeのコード書いてみよう
http://www.nicovideo.jp/watch/sm8746533

Haskell Night について
http://www.nicovideo.jp/watch/sm8746384


=== YouTube

再生リスト
http://www.youtube.com/view_play_list?p=15994E710C79223D

ふつうのLisp入門 (1/8)
http://www.youtube.com/watch?v=z8NWvztj-GQ

ふつうのLisp入門 (2/8)
http://www.youtube.com/watch?v=SJ3tYr3b-0o

ふつうのLisp入門 (3/8)
http://www.youtube.com/watch?v=eivofHldzeU

ふつうのLisp入門 (4/8)
http://www.youtube.com/watch?v=9ohZO3EodFQ

ふつうのLisp入門 (5/8)
http://www.youtube.com/watch?v=FSnE87bMhOY

ふつうのLisp入門 (6/8)
http://www.youtube.com/watch?v=CFN2NlUfkTs

ふつうのLisp入門 (7/8)
http://www.youtube.com/watch?v=hWm6L_PvjA4

ふつうのLisp入門 (8/8)
http://www.youtube.com/watch?v=3r2AENLYWO4

テクニカルトーク開幕挨拶
http://www.youtube.com/watch?v=VP50MmGh93c

1980年前後のLisp事情と UtiLisp (1/11)
http://www.youtube.com/watch?v=ZSy8UYOL9YM

1980年前後のLisp事情と UtiLisp (2/11)
http://www.youtube.com/watch?v=PusLXD2ymns

1980年前後のLisp事情と UtiLisp (3/11)
http://www.youtube.com/watch?v=PusLXD2ymns

1980年前後のLisp事情と UtiLisp (4/11)
http://www.youtube.com/watch?v=P2Uls-hr5C8

1980年前後のLisp事情と UtiLisp (5/11)
http://www.youtube.com/watch?v=92R0buG_Zlc

1980年前後のLisp事情と UtiLisp (6/11)
http://www.youtube.com/watch?v=l244Pm80xcw

1980年前後のLisp事情と UtiLisp (7/11)
http://www.youtube.com/watch?v=whX8WWFsIgU

1980年前後のLisp事情と UtiLisp (8/11)
http://www.youtube.com/watch?v=o_1MSSRhCe0

1980年前後のLisp事情と UtiLisp (9/11)
http://www.youtube.com/watch?v=PHyZNr1mf9o

1980年前後のLisp事情と UtiLisp (10/11)
http://www.youtube.com/watch?v=MRm6hZZUoIM

1980年前後のLisp事情と UtiLisp (11/11)
http://www.youtube.com/watch?v=cpzb0ytdlyw

あなたがSchemeを使うべき 10の理由
http://www.youtube.com/watch?v=T7VFXZdyD6I

弾幕記述言語BulletSML のご紹介
http://www.youtube.com/watch?v=Vph2E4avpow

3次元幾何モデルライブラリ komainu on CL
http://www.youtube.com/watch?v=qJUi_yrS4hY

Schemeではじめる音声認識
http://www.youtube.com/watch?v=accp9nvHuNo

他言語で作ったWEBページをLispでも!
http://www.youtube.com/watch?v=RQM2xO-kKDw

さあ家に帰ったらSchemeの コード書いてみよう
http://www.youtube.com/watch?v=IaNY7ELsj0g

Haskell Night について
http://www.youtube.com/watch?v=Y6YO5o1ZxAg



GAE/Py触ってたら、GAE/Jも触りたくなったので触ってるところ。


実務での/J実戦投入はない。GAE/Pyは投入確定。


Javaをまじめに触るのはJ2SE1.4以来だ。ごめんなさい。ごめんなさい。



ただ、ソースコード読んだりつつくだけでも脳汁が。。たまらん。



以下。備忘録。


Google App Engine SDK for Javaをダウンロードし、/opt/localに展開。


リンクを貼っておく。



ln -s appengine-java-sdk-1.2.6 appengine-java-sdk

当面はデモ観たりちょこちょこいじったり。あくまで余暇を使っての趣味。



参考


ちょっぴり参考にした。




EclipseプラグインのPyDevで、GAE/Pyの開発環境を構築する。


環境



  • Mac OS 10.5.8

  • jre1.5.0_20

  • python2.5.4

  • GoogleAppEngineLaunchar1.2.7

  • Eclipse3.5.1

  • PyDev1.4.6


はじめに


そもそも、Mac OS 10.5にはjre1.5系とpython2.5系がインストールされてるのでOK。


EclipseとPyDevは別の件で構築済み。


GoogleAppEngineLauncharも以前試しに使ってみたのでインストール済み。



Eclipseでのプロジェクト立ち上げ、ライブラリとの関連付け。


プロジェクトの立ち上げ。


Eclipseで、



File => New => Other => Pydev => Pydev Google App Engine Project

からGAEプロジェクトを立ち上げる。


Google App Engine Directoryを聞かれるので、答える。自分の環境だと下記のパス。



/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine

ライブラリとの関連付け。


作成したプロジェクトを試験用のサーバーで動かせるようにするGoogleAppEngineへのパスを通す。


作成したプロジェクトの



Properties => PyDev - PYTHONPATH => External Libraries => Add source folder

から下記4つのパスをそれぞれ追加する。



/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/yaml

試しに試験用サーバーで動かしてみる。


Pydev Google App Engine Projectでプロジェクトを作成したなら、<プロジェクト名>/srcにサンプルソースが作成されているはずなので、


作成したプロジェクトの、



Run As => Run Configuration

において、


Main => Main Moduleに下記を追加



/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/dev_appserver.py

Arguments => Program argumentsに下記を追加。



${project_loc}/src --port=8080

そして、Run。http://localhost:8080/にアクセスすると表示されるはず。


参考


下記を参考にしました。



さて、


Google App Engineのドキュメントを読み込むかな。


ところでなのですが、Pythonに関して中級者向けの書籍ってないのかな..??オライリーのはじめてのPythonの次に読む書籍が見当たらない。


オンラインドキュメントが充実してるから不要なのだろうか?



今度他のエンジニアに聞いてみる。


Tracのプラグインに関して調べたので、備忘録としてまとめとく。

**ほげにっき
id:digoさんのhatena diary
http://d.hatena.ne.jp/digo/searchdiary?word=*[TracScrumHalf]

**気の向くままに・・・ Trac Plugin - IRequestFilter
http://syo.cocolog-nifty.com/freely/2008/09/trac-plugin---i.html



getパラメータの処理調べてたんだけどプラグインでインストールできるまではOK。

あとは、本機能の実装。
**JavaScriptで音を鳴らしてみよう
http://d.hatena.ne.jp/moriyoshi/20081031/1225431088

**JavaScriptで動的にWAVデータを生成して再生
http://sothis.blog.so-net.ne.jp/2008-11-28-1

**Shibuya.trac プラグインの作り方
http://sourceforge.jp/projects/shibuya-trac/wiki/trac%2Fplugindev

**Writing Plugins for Trac
http://trac.edgewall.org/wiki/TracDev/PluginDevelopment#Writingtheplugincode

あわせて読みたい

  • あわせて読みたいブログパーツ

Lingr java-ja

ウェブページ

Powered by Movable Type 4.1