はてなキーワード: レキシとは
http://anond.hatelabo.jp/20110316202255 - ドラゴンボールで学ぶオブジェクト指向
また、ポイポイカプセルのように技を塊にして色んな人が使えるように出来ます。
var shotKamehameha = new function(){ //かめはめ波を打ちます。 } noumin.kougeki = sendKamehameha; buruma.kougeki = sendKamehameha; noumin.kougeki(); //カメハメ波がでます。
って書いてるけど、クロージャってのはそういうものじゃないよなぁ、と。 まあファーストクラスの関数オブジェクトっていうところはあってるけど、それだけでクロージャと言えるのかというとちょっと違う。
"a closure is a first-class function with free variables that are bound in the lexical environment." (Closure - Wikipedia) とあるように、関数内の変数がレキシカルスコープに結び付けられているようなものがクロージャなのである。 JavaScript で例を書くなら、次のようになる。
// クロージャを返す関数 var getClosure = function getClosure() { // クロージャからアクセスされる変数 var counter = 0; // クロージャ var closure = function closure() { return counter++; }; return closure; }; // クロージャを取得 var closure = getClosure(); // クロージャを実行 closure(); //=> 0 closure(); //=> 1 closure(); //=> 2
id:aionarapです.自分のブログがなく,ブコメじゃ情報を書き足りないのでこの場をお借りしました.
“徒弟制度”や修士論文の廃止求める 大学院博士課程で中教審答申 - MSN産経ニュース http://sankei.jp.msn.com/life/news/110131/edc11013122040003-n1.htm
はてなブックマーク - “徒弟制度”や修士論文の廃止求める 大学院博士課程で中教審答申 - MSN産経ニュース http://b.hatena.ne.jp/entry/sankei.jp.msn.com/life/news/110131/edc11013122040003-n1.htm
この中教審の答申に関して,ブコメでは否定的な意見が多数,というか肯定意見は皆無ですね.しかし,私個人はある程度この試みに賛成です.あ,先に書いときますが,完全肯定じゃないですけどね.修論は書いたほうがいいし,徒弟制の完全廃止もどうかとは思っています.
じゃぁ何が賛成なのよ,という話ですが,Qualifying Examの導入,及び広い範囲の教育に関してです.これは必須,と私は考えています.この辺りのお話に関するご意見を皆さんに聞いてみたいと思い,当エントリを書くことにしました.
今回の中教審の答申は,博士の現状の問題を反映した意欲的な取り組みに感じる.丸呑みにするには良くない部分もあるが,期待しても良いのではないのか.
さて,そもそもの出発点ですが,博士は「スペシャリスト」でありさえすれば良いのでしょうか?私は否と考えます.博士こそ「ジェネラリスト」にもならねばならない.…と書くと誤解を招きますね.要は専門馬鹿になっちゃいかん,ということです.
勿論,博士課程の人間は自分の専門分野に関して,国際的な第一線に立てるような知識と経験が必須です.一生懸命に自分の研究に取り組む必要があります.ですが,それだけではダメで,最低限隣接領域(まぁ定義が微妙ですが)に関して,可能であればもっと大きな枠組で知識を深めなきゃいけません.科学技術はどんどん煮詰まってきて,先に進むためには学際分野の融合による新しい概念の創出が必要です.それをイノベーションと呼ぶこともあるでしょう.それを生み出すためには,少なくとも2つの分野に関してよくものを知っていないといけません,そうですよね?
テクニシャンとして分野を極めるのもひとつの道かもしれませんが,博士に求められているのはそういうことではないと私は考えています.
加えて,博士が「スペシャリスト」のみを意識していると,博士課程の人材の活用先は研究者,それもかなり狭い分野に限定されます.
ここで,大学院設置基準が定めている博士課程の役割を見てみましょう.昭和49年の時点では,
「専攻分野について,研究者として自立して研究活動を行うに必要な高度の研究能力及びその基礎となる豊かな学識を養うことを目的とする。」
「専攻分野について,研究者として自立して研究活動を行い,又はその他の高度に専門的な業務に従事するに必要な高度の研究能力及びその基礎となる豊かな学識を養うことを目的とする。」
と,敢えて変更を行っています.差分は,
「又はその他の高度に専門的な業務に従事するに必要な高度の研究能力」
「社会の多様化,複雑化等に対応し,博士課程において,大学等の研究者のみならず,社会の多様な方面で活躍し得る高度の能力と豊かな学識を有する人材を養成する必要から明確化」
(以上,http://www.mext.go.jp/b_menu/shingi/chukyo/chukyo0/toushin/05090501/021/003-3.pdfの2ページ目より引用.)
平成元年の時点で,大学院設置基準は博士課程学生に「社会の多様な方面で活躍しうる」人材たることを求めているのです.
「おいおい,博士が研究者にならなくてどうするのよ…」という意見もあるでしょう,それは理解します.ですが,包含関係を取り違えてはいけません.研究者として生きて行けるのは,博士号を取得したうちの一部の人間です.研究者になるのは博士号取得者でしょう.ですが博士号取得者は全員研究者にはなれません.国家として,限られた国庫の中から博士を全て取り込めるほどポストを恒久的につくるのなら別ですけどね….
それに,(ありえませんが)もしそうなったとしても,全員研究者になるのもどうかと思います.一人ひとりが研究テーマを持って,プロジェクトリーダー的な役割を果たしつつ,世界の最先端を突っ走ってきた人間が,その経験と知見を他の分野に持っていくことは非常に意義があるでしょう.ある意味,一人でプロジェクトチームに求められる役割を全て果たす必要があるのですから,その能力は推して知るべしです.是非,社会のあちこちで活躍するべきです.
非常にポピュラーなのは,専門を活かした職業でしょう.企業での研究開発を初めとした「明示的に博士を求めている」職業は多いです.…まぁ敢えて書く必要はないですね.
初等,中等教育の教師もいいでしょう.勿論高専も.起業もいいですね.
そして,本当はその他の「博士が求められていない」と考えられている職業にも行ったほうがいいと思うんです.だって,ずっと知的体力を鍛えてきたわけですから,同年代の博士号非保持者と比較してその辺りは大きくリードしているはずです.
彼ら/彼女らが持っている問題発見能力は,必ずや企業にとって大きな助けになります.
前節の内容に関して,同意して頂けましたでしょうか?して頂けた方も,そうでない方もいらっしゃるでしょう.
でも,同意/非同意にかかわらず,ほとんどの人は「夢物語乙!www」という感想を抱くのではないでしょうか.いえ,私もそう思います.
例えば,id:scicom 氏の快著,「博士漂流時代「余った博士」はどうなるか?」(http://goo.gl/Pd0ls amazonへのリンク)には現状の博士号取得者,特にポストドクター(PD)の状況が整理されています.
簡潔に言えば,現状は散々たる物です.企業は博士号に魅力を感じていません.これは伝聞ですが,採用担当者は「博士は当たり外れが大きい」と感じているようです.ハズレを引くリスクを恐れて採用を控えるそうです.
そもそも,皆さん,博士号をとっている人間が「最低限」「共通して」何を出来るか,分かりますか?
言い換えると,博士号が担保しているものは何か,知っていますか,ということです.
特に,博士課程では,①学生に特筆すべき顕著な研究業績を求める大学院もあるなど,博士の学位が如何なる能力を保証するものであるかについての共通認識が確立されていないこと,②博士課程(後期)の教育が,個々の担当教員がそれぞれの研究室等で行う研究活動を通じたものにとどまり,学位プログラムの整備という観点から不十分であること,③大学と産業界等との間において,大学院が養成する人材像と産業界等の評価や期待に関する認識の共有が十分でなく,修了者が産業界等の社会の様々な分野で活躍する多様なキャリアパスが十分に開かれているとは言えないこと,といった問題点が見られる
(http://goo.gl/Jq0LU, pdfファイル,5ページ目)
文科省は,博士号が担保するものに関する共通理解は無い,と述べています.また,教育の質もバラけていることを指摘しており,このことも共通理解の妨げになるかと思います.
個人的には,博士号は「専門知識」と「プロジェクト(研究)遂行能力」は担保していると思います.…が,サンプル数が少ないので断言はできません.
この「一般的な博士像の不存在」が,世間一般への博士の浸透を妨げていることは想像に難くありません.
当の本人たる博士号取得者は活躍の場が減る,すなわちたつきの道の選択肢が減ります.
納税者の皆さんは,せっかくお金をつぎ込んで育てた人材が有効に活かされず,「税金の無駄だ!」と感じるかもしれません.
後進の学生は,この惨状を見て博士に進まなくなります(というかそうなってます).
こうして,本丸たるアカデミックの世界ごとジリジリと衰弱し,…あとは言わずもがな.
勿論,「これさえやれば万事解決!」みたいな簡単な処方箋はないでしょう.でも,チャレンジは出来ます.
私は,そのチャレンジの一環が今回の中教審の答申だったのではないか,と考えています.(というか資料はそれを物語っています)
専門の知識だけではなく,基礎知識や計画力,語学力,倫理観などもちゃんと持っていることをQualifying Examで保証しましょう.
どこに放り出しても生きて行けるほど強くするために,総合的な教育もちゃんとしましょう.
そういった取り組みが,今回の答申の意図ではないのでしょうか.
この新課程を出た博士がその有用性をアピール出来れば,在野の博士号取得者にもスポットが当たり始めるでしょう.
さて,ここで,「大学院に進んでまで人に教育を受けるとかwww自分で学べよそれぐらいwww」という気持ちになる人もいるかもしれません.
正直,私も「それぐらいじぶんでするわい」と思ってたりします.
でも,主眼はやっぱり「質の保証」なんだと思います.ちゃんと大学院は「最低限」「共通して」一定の能力を持った博士を輩出しますよ,という保証.
さぁ,経営者の皆さん,安心して共同事業を博士が経営するベンチャーと行って下さい.
さぁ,保護者の皆さん,安心して博士の教員を迎え入れてください.
そういう事を,皆が自信を持って主張できるように,ということでしょう.
ええ,上記の効果を狙ったとしても,逆効果になる部分もあるでしょう.
徒弟制を完全廃止すると,一本軸の通った研究ができなくなって,結果として「スペシャリスト」にもなれなくなります.
(念の為に再度主張しますが,博士は「スペシャリスト」の能力を最低限備えてなければなりません,と考えています)
博士課程に進学希望の学生が修士論文書かないと修士/博士の間のフレキシビリティを損なうことになります.
なので,細かい部分は考える必要があるでしょう.
でも,今回みたいに,現在抱えている問題に対してちゃんとコミットメントしたということで,私は文科省をちょっと見直しました.
というかなんか雰囲気で「お役人は肝心なことに取り組まない」みたいな思い込みがあったのですが,やっぱりそんなこともないよなぁ,と思いました.
なんせ,前述の「博士漂流時代」を読んで気になったことを調べ始めたら,殆ど中教審の資料にまとめられていたのですから.
さて,長くなりましたが,これにて本エントリはお終いです.お付き合い下さり誠にありがとうございます.
.NETでオブジェクトの永続化によく使われる、この二つのクラスの違いについて書きます。サンプルコードなどは書きませんので必要ならリンクを参照してください。ずいぶん古いネタだけど、許してね。
全体的に速度が重要な場合か永続化するオブジェクトが単純な場合はXmlSerializerを、それ以外の場合はSoapFormatterを使うのが良いと思う。なるべく短いコード量で行きたいならSoapFormatterの方がベター。
あと、細かいことだけどTypeConverterは便利なので使うべし。シリアライズ不可能な小さなクラスとか特に有効。
普通にクロージャという場合、レキシカルスコープを持つことを期待されると思うけど、DLLやらsoからエクスポートされる関数は普通のCのスコープだからクロージャとは言わないと思うよ。(そもそもDLLもsoも標準C/C++じゃないから、もしこれらがクロージャ的な動きをするとしてもこれを以て「Cのクロージャ」と呼ぶのはおかしいというのは置いといても。)
ダイナミックスコープなemacs Lispのlambdaとか、ダイナミックスコープもどき(っていうのか?なんて表現したらいいか分からん)なPHPのcreate_functionは動的に作りはしてもクロージャとは言わないんじゃないかな。
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3
おれはもうMooseしかつかわねぇ。後にも先にもMooseMooseMooseMooseMoose!!!!!!!!!!!1111111
ってな人の為にいつでもどこでもMooseする。automooseを実装しますた。
package automoose; use strict; use warnings; sub import { strict->import; warnings->import; } package automoose::before; use Moose; no Moose; package automoose::after; use Moose; my @before = keys %automoose::before::; my @after = keys %automoose::after::; my @exports = do { my %u; @u{@before} = (); grep { !exists $u{$_} } @after }; package UNIVERSAL; use Moose; for my $func (@exports) { __PACKAGE__->meta->remove_method($func); __PACKAGE__->meta->add_method($func,sub { my $class = shift; my $auto = $class.'::__auto__'; no warnings 'redefine'; local *Moose::_get_caller = sub { return $class }; Moose->import( { into => $auto } ); my $code = $auto->can($func); $class->meta->add_method($func,sub { shift; goto $code; }); goto $code; }); } 1;
使い方はいたって簡単。useするだけ。
use automoose; my $obj = Foo->new;
いきなりnewが呼べちゃう。
他にも
use automoose; Foo->has( hoge => is => 'rw' ,default => 9999 ); Foo->has( muge => is => 'rw' ,default => 7777 ); print Foo->new->hoge; print Foo->new->muge; Bar->extends('Foo'); print Bar->new->hoge;
ょーかんたん。げーべんり。
しっかしこれ、automooseだけど実装するの結構めんどかったのよ。Moose-0.44をベースに作ったんだけどさ。
Moose内部で使用している$CALLERって変数がレキシカルなもんだから、どうやってそれを外から制御すればいいのかすんごい苦労したわけさね。
で結局importの引数にinto渡してさらにMoose::_get_caller関数を上書き無理矢理ハックしたってわけさ。
でもね。でもね。でもね。ちょっと聞いてよ。
ふと最新のMoose-0.50見てみたらさ、Moose::__CURRY_EXPORTS_FOR_CLASS__なんて関数が定義されてるわけよ。
外から明示的に$CLASSを変更できるインターフェイスなわけよ。おいおいおいおい、勘弁してくれよ。こっちゃ折角苦労してハックしたのにあっさり公式対応するなってばよ。メゲルヨ?ぼく。
まぢめげるよ。めげる。ってかもうめげたよ。もうMooseなんてつかわんね!つかわんね!
Mooseなんて大嫌いだー!
俺はMooooooooooseをやめるぞぉおおおおおおおおお、JOJOぉぉぉおおおおお!!!!11
javascriptで存在するほとんどのオブジェクトの実体はハッシュだよ。
var arr = [0,1,2,3];
とかをみると配列(人によってはリスト)に見えると思う。でも実際は違うんだ。
これは
var has = {0:0,1:1,2:2,3:3};
と基本的には等価なんだ。ただちょっと束縛されているメソッド(インターフェイス)が違うだけ。
ためしに
arr[4] = 4; arr['x'] = 'string'; arr[-1] = -1;
としてみよう。
Firebugで確認してみると[0, 1, 2, undefined, 4]というような値がかえってくるよ。
でもarr[-1]やarr['x']の値は保存されてないのかな?そんなことはないちゃんとアクセスできるんだ。
それどころかarr.xで'string'がかえってくるんだ。
別の例を見てみよう。
var fx = function(){}; fx[0] = 'somestring';
こうするとfx[0]に'somestring'が束縛される。
つまりfunctionも一つのハッシュだったんだ。
これでほとんどのものがハッシュだということが解ってくれたかな?
ハッシュじゃないのは文字列とか数字とかそいういシンプルなものだけなんだ。
ハッシュへはhash[name]でアクセスすることが出来る。
それ以外にもnameが演算子や空白を含まなくて頭が数字でない場合はhash.nameでアクセスできるんだ。
これでhash[name]が関数だったらhash.name(args)とできるよ。まるでメソッドみたいだね。
関数には名前を付けなくても使用可能だよ。
function(x){return x+x}(2); -> 4
関数宣言の書き方って次見たいの覚えてる人が多いんじゃないかな?
function funcname(args){ do something};
でもこれはsystax sugerだってことを知ってほしい。
上でも使ってるんだけど。
var funcname = function(args){ do something};
と等価になる。もちろんどちらの書き方でもかまわないよ。
ただ、(無名)関数を宣言してそれをfuncnameに束縛しているっていうことを理解しておくと便利だよ。
javascriptはレキシカルスコープを採用してるんだ。
レキシカルスコープなんていうと難しく感じるかもしれないけど、結構単純なんだ。
var x = 'global';
var fx1 = function(){return x};
var fx2 = function(){var x = 'local';return x}
これの実行結果は以下になるよ。
fx1() -> 'global' fx2() -> 'local' fx1() -> 'global'
fx2の変数xはほかの場所に影響しないんだ。これは関数の中と外ではスコープが違うからなんだ。
でも以下のような場合に注意してほしいな。
var x = 'global'; var fx1 = function(){return x}; var fx2 = function(){x = 'local';return x}
fx1() -> 'global' fx2() -> 'local' fx1() -> 'local'
fx2は自分のスコープに変数xがないからその外側スコープに探しに出かけたんだ。
つまり宣言文varはそのスコープに新しい名前を登場させる機能なんだよ。
別の場合を見てみようね。
var x = 'global'; var fx1 = function(){ var x = 'local'; return function(){return x} }; var fx2 = fx1();
x -> 'global' fx2() -> 'local'
この例だとfx2()の値がlocalになってるね。
なぜなら外側スコープっていうのは関数を評価した場所じゃなくて、関数を定義した場所の外側なんだ。
一つ上の例では実際に関数を返り値にしているね。
var fx1 = function(){ var x = 0; return function(){ x = x+1; return x; } }; var fx2 = fx1(); var fx3 = fx1();
fx2() -> 1 fx2() -> 2 fx2() -> 3 fx3() -> 1 fx3() -> 2
fx2とfx3の値が違うのはそれぞれ別の関数が作られるからだよ。
こんな風に関数が状態を持つことも出来るんだ。クロージャーとよんだりするよ。
関数がハッシュを使って複数の関数を返すとこんなことも出来るよ。
var fx = function(){ var x = 0; return { 'up':function(){ x = x+1; return x; }, 'down':function(){ x = x-1; return x; } } }; var obj = fx();
obj.up(); -> 1 obj.up(); -> 2 obj.down(); -> 1 obj.down(); -> 0
thisという機能があるよう。ちょっとだけつかってみるね。
var x = 0; var add = function(n){this.x = this.x + n; return this.x}; var mul = function(n){this.x = this.x * n; return this.x}; var obj = {'x':0,'do':add};
add(1); -> 1 add(1); -> 2 mul(2); -> 4 obj.do(); -> 1 obj.do(); -> 2 obj.do = mul; obj.do(); -> 4
thisは評価された場所によって値がかわるよ。
objの中にいるときはobj.xを扱うし、グローバルにいるときはグローバルのxを扱うんだ。
http://anond.hatelabo.jp/20070620200618を改訂してみたよ。
このぶんしょうがjavascriptを覚える上の一助になるとうれしいんだ。
あとここでつかってるハッシュは伝統的な意味。連想配列のことね。
突っ込みも大歓迎だよ。
javascriptで存在するほとんどのオブジェクトの実体はハッシュだよ。
var arr = [0,1,2,3];
とかをみると配列(人によってはリスト)に見えると思う。でも実際は違うんだ。
これは
var has = {0:0,1:1,2:2,3:3};
と基本的には等価なんだ。ただちょっと束縛されているメソッド(インターフェイス)が違うだけ。
ためしに
arr[4] = 4; arr['x'] = 'string'; arr[-1] = -1;
としてみよう。
Firebugで確認してみると[0, 1, 2, undefined, 4]というような値がかえってくるよ。
でもarr[-1]やarr['x']の値は保存されてないのかな?そんなことはないちゃんとアクセスできるんだ。
それどころかarr.xで'string'がかえってくるんだ。
別の例を見てみよう。
var fx = function(){}; fx[0] = 'somestring';
こうするとfx[0]に'somestring'が束縛される。
つまりfunctionも一つのハッシュだったんだ。
これでほとんどのものがハッシュだということが解ってくれたかな?
ハッシュじゃないのは文字列とか数字とかそいういシンプルなものだけなんだ。
ハッシュへはhash[name]でアクセスすることが出来る。
それ以外にもnameが演算子や空白を含まなくて頭が数字でない場合はhash.nameでアクセスできるんだ。
これでhash[name]が関数だったらhash.name(args)とできるよ。まるでメソッドみたいだね。
javascriptはレキシカルスコープを採用してるんだ。
var x = 'global';
var fx1 = function(){return x};
var fx2 = function(){var x = 'local';return x}
これの実行結果は以下になるよ。
fx1() -> 'global'
fx2() -> 'local'
fx1() -> 'global'
fx2の変数xはほかの場所に影響しないんだ。これは関数の中と外ではスコープが違うからなんだ。
でも以下のような場合に注意してほしい。
var x = 'global';
var fx1 = function(){return x};
var fx2 = function(){x = 'local';return x}
fx1() -> 'global'
fx2() -> 'local'
fx1() -> 'local'
fx2は自分のスコープに変数xがないからその外側スコープに探しに出かけたんだ。結果fx
つまり宣言文varはそのスコープに新しい名前を登場させる機能なんだよ。
関数宣言の書き方って次見たいの覚えてる人が多いんじゃないかな?
function funcname(args){ do something};
でもこれはsystax sugerだってことを知ってほしい。
上でも使ってるんだけど。
var funcname = function(args){ do something};
と等価になる。もちろんどちらの書き方でもかまわないよ。
関数は返り値として関数はハッシュを指定できるよ。次のハッシュを返す関数を見てみよう。
var fx = function(){ var x = 0; return { 'x':x, 'add1':function(y){this.x = this.x+y;return this.x}, 'add2':function(y){x = x+y;return x} } } var obj = fx();
実行結果を見てみよう
obj.x -> 0 obj.add1(0) -> 0 obj.add1(0) -> 0 obj.x -> 0 obj.add1(1) -> 1 obj.add1(0) -> 0 obj.x -> 1 obj.x -> 1 obj.add1(0) -> 1 obj.add1(2) -> 2 obj.x -> 1
となる。
add1はthis.xにたいして演算をしている。つまり返された値が変化しているんだ。
add2は関数fxに閉じ込められた値に対して演算している。つまりこれらは別の値なんだ。
とここまでかいたら疲れた。
読んでくれた人ありがとう
ちゃんとまとめてなかったし、自分のブログに描いても見てくれる人はいないから増田に書いてみたよ。
ほかの言語や技術についても同じような解説が欲しかったら何らかの方法で言及してくれるとうれしいな。
ここまではてブが300突破してるみたいだけどいま、自分のブログへリンクを張ったら増田に書く意味がなくなるんじゃないかと思うんだ。
やらないけど。
こんなのもかいてみたよ、増田で。 http://anond.hatelabo.jp/20070621153600
「ブロック付きメソッド呼び出し」がわからん、ということでいいのかな。この概念は是非とも解ってほしいので、今日始めて Ruby を触った俺が頑張って解説しよう、と思ったけれど、いいドキュメントを見つけたのでリンクしておくよ。
これで解らんかったらOn Lispを途中まで読みんさい(お金がないならWeb 版をどうぞ)。「ブロック付きメソッド呼び出し」は元々関数型言語の界隈で「レキシカルクロージャ」と呼ばれるもので、要するに中身は一緒なのでクロージャが解れば「ブロック付きなんたら」も解る(Ruby を触ったことのない自分が「ブロック付きなんたら」を理解しているのはこれの為)。 On Lisp は Common Lisp という言語の本なんだけど、 Ruby は言語仕様の多くの点で Common Lisp を参考にしているので、勉強するのはそれほど難しくないと思う(つまり見た目はヘンテコだけど中身は Ruby ってこと)。