「コンストラクタ」を含む日記 RSS

はてなキーワード: コンストラクタとは

2012-06-15

http://anond.hatelabo.jp/20120614121920

ポインタ、参照(リファレンス)、束縛(バインディング)、それぞれ似てるけど同様に語ると混乱の元ではないかと。

 

ポインタメモリアドレスに型情報をくっつけたもの。加減算できる点が特徴で、それはメモリアドレス概念由来だろう。

変数というメモリ上の記憶域を指すフィジカルに近い概念で、配列運用(*p++で回すとか)、引数の参照渡し(コピー抑止、複数戻り値の実現)、メモリのもの管理malloc)あたりで、基本手作業による最適化のための仕組みという側面が近いと思う。

 

perlだと、変数はやっぱり記憶域ではあるけれど概念として一段抽象化されていて、メモリという連続した領域じゃなく独立した領域の集合となっているから、リファレンスの加減算はなし。

また、配列も単なるメモリの並びからより抽象化してリストもできたから、配列運用や複数戻り値リストがあるのでリファレンスに頼ることはなくなる。

ただ、オブジェクト概念があって、オブジェクトオブジェクトとして入れる変数は用意せずリファレンスとすることで、文法上の変数の型を増やさない、コピー時のコンストラクタの問題を回避するなどのほか、オブジェクト概念を援用して無名関数無名変数ファイルハンドルなども変数引数として扱えるようにした。

 

で、pythonはもう一段推し進めて、今までの数値や文字、配列オブジェクトとみなし、変数はすべてオブジェクトを指し示すもので、記憶域は変数としてあるのではなくオブジェクトとしてあり、変数リファレンスという特別なものがあるのではなくなり、変数記憶域をもっていて値が代入されるものではなく、既にあるオブジェクト変数名という名前(ラベル)を付けて束縛する行為とされる。

見方を変えると変数はすべてにおいてリファレンスで、代入とは値そのものの代入でなく値へのリファレンスの代入で、引数も参照渡しであるが、引数に代入したところでリファレンスが変わるだけで元の値が変わるわけではなく、しかし他の演算などでは自動的にデリファレンスされており、単純な数値や文字列など、自身を変更する機構を持たない(できない)ものにとっては実質的に今までとの違いはないに等しい。隠ぺいといえば隠ぺいか

java, javascript, rubyもおおむねこの考え方でよかったと思う。

ただ、phpは若干両者が混じったところがあって微妙なところがある。

 

参考

2012-06-14

http://anond.hatelabo.jp/20120614151953

それ、単純にクラスの使い方が悪いってだけに見えるんだが。

少なくともそんなカツカツにタイミング調整が必要になるソフトで、そんな頻繁にオブジェクト生成すること自体間違ってるし、頻繁に生成されるオブジェクトコンストラクタにクソ重い処理を入れているのも問題だし。

回生成したオブジェクトを使い回せないかとか、クソ重いけど一回実行すれば当面実行しなくていいような初期設定処理はファクトリクラスとかに追い出せないかとか、叩きようはいくらでもあるぞ。

http://anond.hatelabo.jp/20120614151953

メモリはいくらでも取っていいが、CPUは有限資産からな。

PC プログラマだけどメモリは潤沢なのに CPU 資源だけ制限があるってすごく不思議に聞こえる。

今頃は PC だったら CPU 資源はほぼ無限 (少なくとも C++ コンストラクタ呼び出しを気にしない程度には) だぞ。

組み込みの話だとしても組み込みなら両方ともきついんじゃね?

http://anond.hatelabo.jp/20120614144026

いや C++コンストラクタが、使わない時にでも動くのが嫌なので

メモリは バルクで取って コンストラクタ必要な時だけ 手動で呼び出すぞ。

メモリはいくらでも取っていいが、CPUは有限資産からな。

 

それこそ、必要な時だけnewすればって考え方もあるが、メモリフラグメントする。

俺らの時代だと、そのへんは脊髄に染み付いているから、考える考えないじゃなくて、普通にやる。

 

なんで?いや、サクサクアニメーションとかを追求すると このへんを突き詰めないと30fpsとか60fpsとか出ないだろ。

欲しいのはメモリ管理じゃなくてUX なんだが、結果 メモリ管理踏み込む

2012-01-04

プログラミング初心者たわごと

JavaScript って生き物っぽいって思ったのがきっかけだった。

なんか菌?に遺伝子いれてたんぱく質生産させるやつ? Function は菌の細胞膜prototype遺伝子で、だから prototype全然関係ない違う生物遺伝子を生きてる菌に入れちゃったり。そうすると全然ちがうたんぱく質生産されたり。prototype にべべーっとコピーして追加するのなんてまさしくそれっぽい。

インスタンスからじゃないと複製できないのも生き物っぽい。

インスタンスって言い方になにか違和感があるなあ。

だってプロトタイプベースって、生き物しかいない世界じゃない?基本的に。インスタンスってのは生き物じゃない設計図があってそれにしたがって出来た生き物がインスタンスってイメージあんだけど。プロトタイプベース世界にはそんな設計図も生き物じゃないものもないよね?なのにわざわざインスタンスっていうのに何か違和感ご都合主義的なもの感じる。クラスは型で、インスタンスを実体だとかなんとかって氾濫してるせいかな。多分この辺の用語が JavaScript をわかりにくくさせてる気がする。

僕の感覚では、オブジェクトってのは生き物で、クラスベースってのは神が設計図に基づいて生き物を生産してる世界で、インスタンスベースってのは生き物が生き物を複製してる世界イメージだ。多分、原始の生物インスタンスベースみたいな世界で、海の中にうようよしてたんだろうな、とか。

オブジェクトじゃないものは、生き物じゃない死んでるたんぱく質RNA の破片みたいな。それだけじゃなにもできないみたいな。それだけじゃ命がないから、生き物の殻に詰めるってのが JavaScriptコンストラクタイメージ

Perl の bless したらこれはもう命入ったよ生き物だからねっあとは勝手にしてねってのも、Python名前空間さえあればなんとかなるよねってのも、JavaScriptハッシュさえあれば世界作れるよねってのも、みんなどこか似ている。ちゃんと OOP を理解できてるかは別としてもこの三つはわりとすぐやりたいことができた。昔 Java の本を買ってきて挫折したのにくらべたら、なぜかずっとわかりやすかった。(bless という命名はすごく洒落てる)

全然関係ないけど、Django日本語リファレンスは何か萌えるラクダ本日本語訳はむかつくのに。

プログラミングを始めたばっかりの時は、なんだか難しい用語の意味を理解しないと OOP がわからないと思ってた。それは僕らの住んでる世界とは全然関係のないプログラミング技術ってやつだと思ってた。

でも多分違う。

世界が動く仕組みさえあれば、あとは作り手に世界の成り立ちを抽象化する表現力さえあれば、世界勝手表現されていくし、動き出してく。たまたま僕らの世界オブジェクトもので溢れていて、プログラミング言語進化すれば世界に似るのも当然だろう。いや逆か。プログラミング言語世界に似てきたから、オブジェクトなんていう世界に似た概念が出てきたってことか。なんだか難しい用語ってのは、その表現の一部分の技術名前をつけてるだけなんだな、と。例えば何とか歌唱法や何々画法とか何とかレトリックとかパースの取り方みたいなのと同じ。それは表現を理解する手助けにはなるけど、その意味を知る事がイコール表現力をあげることにはならないんだよね。これに気づくのに遠回りしすぎたなあ。

(知識を得るだけで、100% 還元される人もいるかもしれないけど、そんなのは一部の天才だけだと思う。殆どの凡人はそうはいかない。とはいえ、元の錬度が低ければ、コツをいくつか教わるだけでいきなりうまくいくこともある。ただ、それをまるまんま実力だと思うのは、どんな分野でも危険だ。恋愛テクニックやらを必死に読んでる連中が男女間の深い人間関係を上手くやれてるとはちょっと想像できない!)

プログラミング表現力を上げるにはどうすればいいんだろう。きっと他と同じだろうな。いい表現を沢山味わって、世界をよく観察して、どう成り立ってるかどう動いてるか、私達はそれをどう認知しているのか、考えることかもしれない。漫画家を志す人が美術解剖学を学んだり、優れた画家が絵筆で世界を生々しく描写するように、優れたプログラマ世界のなりたちをプログラムに写し取ったり、世界の仕組みを作る事が出来るのだと思う。

やっとプログラミング面白くなってきた初心者より。

2011-03-30

NetBeans の City Lights  で、クラス名が黒くなる問題

→少なくとも4年前には解決していない

http://goo.gl/hvY3k

http://netbeans.org/bugzilla/show_bug.cgi?id=114689

 

→Norway today」を改造して、City Lightsに似たオリジナルを作る。

クラスの色は「Norway today」と同じになるが、バックが黒に文字が黒よりは見やすい。

 デフォルトフォント:Monospaced 16

 

  凡例  前景  背景 その他

 

デフォルト 緑 黒

URL 継承 継承 →エフェクト:下線付き エフェクトカラー:青

インターフェース継承

エラー 白 赤

・エンティティー参照 シアン 継承

キーワード オレンジ 継承

クラス (→マゼンタ) 継承

コメント継承

コンストラクタ 継承 継承 →フォント:継承+ボールド-イタリック

・セパレータ 継承

フィールド 9,134,24 継承 →フォント:継承+ボールド-イタリック

マークアップ属性 0,124,0 継承

マークアップ属性継承(黄色?) 継承

マークアップ要素(タグ)オレンジ 継承

メソッド 継承 継承 →フォント:継承+ボールド-イタリック

メソッドパラメータ 160,96,1 継承

・使用されていない要素 グレー 継承

・公開要素 全継承

・列挙 全継承

局所変数継承

抽象クラスまたはメソッド継承

・数値 黄 継承

・文字 黄 継承

文字列継承

・(演算子) ピンク 継承

・空白 全継承

・識別子 全継承

・公開限定要素 全継承

・静的要素 継承 継承 →フォント:継承+ボールド-イタリック

・非公開要素 全継承

・非推奨の要素 継承 継承 →エフェクト:打ち消し線 エフェクトカラー:濃いグレー

2010-08-28

http://anond.hatelabo.jp/20100828182728

>可読性および処理速度、オーバーヘッド的な意味オブジェクト指向は駄目って言ってるんだろ

普通はこの1文で納得できるもんだが

ひょっとしてプリプロセッサ言語では「翻訳」が行われる事とか、オブジェクト指向的な処理をするのは最初コンストラクタが走るのでオーバーヘッドがかかる事とか、いちいち全部情報処理専門学校に入りたてのガキに教えるように教えないと全く判らないかい?

2009-07-08

本当にnewっていらない子

なんかPerlのblessっぽい。

JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)

というよりperlのnewっぽい。なぜか。

classクラス定義してnewでインスタンスを生成する言語を「一般的オブジェクト指向言語」とすると、

つまり、javascriptでnewを(直接)使わず、class(のようなもの)を作ればperlっぽくなる。

そもそもnewって何するの?

オブジェクトを作る。オブジェクトを作るには3つの動作が必要である。

  1. 領域を作る
  2. クラスと結びつける
  3. 初期化する

通常は言語仕様でこれらを行う"new"という命令が用意されている。しかし、必ずしも必要な物ではない。perlでは言語仕様としてはnewが用意されていない。new関数が存在するのはコーディング規約に従っているからに過ぎない。代わりにblessが用意されている。なぜこのようになっているのか。理由はいたって簡単だ。perlオブジェクトの実態はリファレンスだ。初期化を行うコンストラクタはどの道定義せねばならない。だから必要なのはリファレンスパッケージを結びつけるおまじないblessだけだ。コンストラクタで好きなリファレンスを用意し、好きなように初期化してblessすればよい。コンストラクタ名前コーディング規約でnewと決めた。一方javascriptはnewを用意した。{}でオブジェクトは作れるし、どの道コンストラクタは作る必要があるのに。

そもそもblessって何するの?

オブジェクトクラスを結びつける。しかし、javascriptクラスを持たないので必要はない。代わりに必要なのは、継承元との結びつき、プロトタイプチェーンの構築だ。

そもそも継承って何するの?

既存のクラスの性質や振る舞いを流用する。default状態を与える。一般的オブジェクト指向言語ではクラス定義時に継承元となるクラスを指定する。javascriptではクラスの代わりにオブジェクトを指定する。

そもそもクラスって何するの?

クラスとはオブジェクトの性質・振る舞いの定義だ。しかし、ダック・タイピングではオブジェクトの性質や振る舞いはオブジェクトの持つメンバにより決まるため、そのような環境ではオブジェクトに初期値と継承関係を与えるのが主な仕事となる。

そもそもコンストラクタって何するの?

コンストラクタオブジェクト初期化を行う。javascriptではクラスがないため継承コンストラクタによりオブジェクト初期化される。

つまりコンストラクタ継承すれば良いんじゃね?

var object = function(o) {
  var F = function() {};
  F.prototype = o.prototype;
  return new F;
};

JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)

個人的には

var object = function(o) {
  var F = function() {};
  F.prototype = o;
  return new F;
};

で良いんじゃね?って思う。

更に、コレでは初期化しないから

var object = function(o, n) {
  var F = function() {};
  F.prototype = o;
  f = new F;
  if (n) for (var i in n) f[i] = n[i];
  return f;
};

みたいな。

さらにせっかくだからメソッドにして

var object = function(o, n) {
  var F = function() {};
  F.prototype = o;
  f = new F;
  if (not f.inherit) f.inherit = function(n) {object(this, n)};
  if (n) for (var i in n) f[i] = n[i];
  return f;
};

とか。

しかし、なんでこんなに今の継承機構は使いづらいのか。

2009-03-10

オブジェクト指向は、手続き型言語をやっていると自然に導かれる発想

手続き型言語をやっていると、データを組み合わせて取り扱う必要が出てくる。

例えば、顧客データを扱う必要があるとき、顧客の「名前、住所、所属、電話番号、取引内容...」などをまとめて取扱いたい。

そこで、構造体という発想が出てくる。

コンストラクタ、デストラクタ、メソッド、アクセス制御

手続き型言語では

構造体を扱っていると、新しく顧客データを作るとき、毎回毎回、作った後に同じ動作をしないといけないことに気づく。

具体的には、名前、住所、電話番号の登録。

そしたら、それをいっぺんにやってしまうために関数を作ることになるだろう。

init_customer(struct Customer*, char* name, char* addr, char* tel)

また、逆に顧客データが不要になったとき、メモリ解放などをさせるために、

delete_customer(struct Customer*)

も作ることになるだろう。

さらに、取引を行うたびに、取引データを追加しないといけない。そのために、このような関数を作るだろう。

add_deal_customer(struct Customer*, char* deal_name, char* deal_ammount)

そして、複数人でプログラムを作っていると

「おいおい!せっかく取引データ追加用のadd_deal_customer作ったのに、なんで自分勝手に追加してるんだよ!てか、その方法だとメモリ解放どうすんの?ちゃんと作ったの使ってくれたら、delete_customer()でできるようになってるのに」

って状況が生じうる。それを防止するために、コメント

「/* 取引データの追加は必ずadd_deal_customerを使うこと! */」

と書くことになるだろう。

てか、わざわざコメント書いたのにこいつ読んでねーし。あーあ、めんどくさいめんどくさい。

オブジェクト指向

そこで、だ。言語を少し別のものにかえて、構造体に関数を持たせられるようにしよう。

そして、構造体ができたときに、自動でinitって関数を、削除されるときに、自動でdelって関数を呼ぶとしよう。

その関数が、コンストラクタとデストラクタ

そして、add_deal_customerも構造体の中に入れてしまおう。名前は長くて面倒なので、

Customer.add_deal(char* deal_name, char* deal_ammount)

のようにしてしまおう。

さらに、add_dealを使わずに直接、取引データを追加しやがるならず者対策も付け加えてしまおう。

privateにした変数は、構造体が持ってる関数からしか、いじくれないようにしてやろう。

今まではコメント読まない馬鹿の世話に苦労していたのだが、これからはコンパイラがそういうやつにエラーを出してくれる。

継承

次は継承お話。話は変わって、今度はGUIパーツで説明する。

ボタンってあるよね。あれを作りたい。

普通に文字が書いてあって押したら何かが起こるボタンアイコンが描いてあって押したら何かが起こるボタン

この2つを作りたい。

手続き型言語では

まず、文字のボタンを作ろう。

関数を持てる構造体を作り、「表示する文字(変数)、クリックしたときの動作を定義する関数へのポインタ(変数)、描画命令が出た時に描画する関数(関数)、クリック命令を受け取り、構造体にセットされた関数へのポインタを呼び出す関数(関数)」

がいるかな。

次に、アイコンボタン。「表示するアイコン(変数)、クリックしたときの動作を定義する関数へのポインタ(変数)、描画命令が出た時に描画する関数(関数)、クリック命令を受け取り、構造体にセットされた関数へのポインタを呼び出す関数(関数)」

あ、さっき作ったのとほぼ同じじゃーん!文字ボタン構造体をコピペしちゃえ!

あとは文字の変数を、アイコンに変えて、描画命令を、文字描画からアイコン描画に変えればできるじゃん!

ところが、文字ボタンクリック命令を受け取る関数バグが見つかった!よし、デバッグできた!

けど、アイコンボタンコピペしてたんだった!またコピペしなおしじゃん。あーめんどくさ。

もしそれ以外に、チェックボックスボタンとか、もっと別のボタンとか、いろいろコピペで作ってたらもっとめんどくさ。

オブジェクト指向

そこで、こんなことができたらいいんじゃないか?

文字ボタンにも、アイコンボタンにも共通する、関数をもった構造体を作っておく。

ボタン構造体「クリックしたときの動作を定義する関数へのポインタ(変数)、クリック命令を受け取り、構造体にセットされた関数へのポインタを呼び出す関数(関数)」

そして、文字ボタンは、ボタン構造体に「表示する文字(変数)、描画命令が出た時に描画する関数(関数)」を、

アイコンボタンは、ボタン構造体に「表示するアイコン(変数)、描画命令が出た時に描画する関数(関数)」を追加すればいいんだ。

これを、継承と呼ぶ。

さらに、文字ボタンアイコンボタンも、同じ「ボタン構造体」を持っているから、どっちも同じ「ボタン」として扱うことができる。

後で画面内のボタンを全部解放する必要があるときとか、実はこれ、すごく便利。

別の構造体で扱っていたら、文字ボタン用の配列アイコンボタン用の配列を用意し、それぞれに作ったボタンをいれ、解放するときはそれぞれの配列の中身を解放しないといけない。めんどくさ。

けど、どっちもボタン継承しているから、ボタン配列を用意して、文字ボタンアイコンボタンも全部同じ配列に入れて、1つの配列の中身を解放したらいい。楽ちん。

まとめ

はい、そうすると、関数を持った構造体はもはや、もとの構造体とは違う感じになりました。

これをクラスと呼びましょう。クラスから作られたデータは、オブジェクトと呼びましょう。

なんか、オブジェクトがほかのオブジェクトから独立してカプセル化されてるみたいですね。

そして、オブジェクトが持ってる関数。メソッドとでも呼びましょうか。これ、まるでオブジェクト自分のやりたいことを知っているかのようです。

手続きを構造体や関数に細かく分離していくにつれて、構造体と関数の組み合わせってのが出てきて、まとまりが見えてくるのです。

そいつらをまとめてしまって、一つの部品として扱って、外からはあんまり部品の中身を見えないようにしましょう。

部品の中身を直接いじらせるんじゃなくて、部品をいじらせるための関数を用意して、それを経由してやってもらいましょう。

それが、カプセル化とかいうやつです。

こんな感じで、手続き型言語をやっていると、自然オブジェクト指向って方向にたどり着くと思うのです。

プログラミングに殺される

プログラマーの方か、プログラミングから逃げ切ることに成功した方はイラッシャイマセンカ?

暇がありましたら、お助け下さい。

生まれつき、生活保護が下りない程度の知能障害を持っている者です。 (診断書はないですが)

なぜかプログラミングを始めてしまいました。ここで変に夢を持ってしまったのが過ちでした。

それからというもの、失敗する度に落ち込み激しい鬱状態になり、できないことがあるたびに自傷衝動が起きてしまいます。

数百時間勉強しましたが、クラスオブジェクト、public/private、コンストラクタグローバル継承

その他数え切れないほどの専門用語が何一つわかりません。なんであんなものを理解できる人がいるのか不思議でなりません。

そして、それでもプログラミングがやめられません (決して楽しいという意味ではありません!)

向いていない、鬱になるだけとわかっていて一々試し、ますます死にたくなってしまう始末です。

なぜかはてなではプログラミングの難易度は低く扱われる傾向があります。プログラマーが多いからでしょうか。

自分が知らないだけで何かプログラムを簡単に学べる圧倒的抜け道のような方法でもあるのでしょうか?

そんな甘いものがないとしたら、せめてプログラミングから逃げだす方法はありませんか?

遺書に似たような事が書いてあった人間が万が一報道されたらTVデビューしてしまいます。

このままでは本当にプログラミングに殺されます。どうかお助け下さい。

http://d.hatena.ne.jp/scinfaxi/20070523/1179935877 の症状にかなり近いです

自殺を予告するつもりは一切ないので通報しないで下さい

2009-02-19

モダンPerl入門』を第1章だけ読んだ

巷のPerl Mongerな人たちの間で話題の『モダンPerl入門』を読み始めた。

第1章はオブジェクト指向トレンドの話で、とても興味深く読んだのだが、同時に「なんでこれPerlで実装せなあかんの?」と疑問に思った。ていうかオブジェクト指向やりたいならJavaC#でいいじゃん。

Perl5には本格的なOOPの仕組みが実装されていない。

継承という基本的な概念もないし、コンストラクタなんかも用意されていない。ゆえに、MooseとかのCPANモジュールを使って実装しなければいけないのだけれど、その分敷居が高くなって初心者には判りづらい。初心者でも現場に投入できるような、強力なオブジェクト指向機構が用意されているJavaC#といった言語StrutsASP.NETといったフレームワークなんかとは全然違う。

私はメインPHPASP.NET(C#)という人間で、Perlバッチプログラムとかクローラの実装とか雑用処理なんかに使っている。PHPは小規模プロジェクトアジャイルな開発がしたい時、ASP.NETは大規模プロジェクトに呼ばれた時用の懐刀という感じで使い分けている。PerlWebサービスを作ることももちろん出来るけれども、どちらかというとスピードが優先される開発に用いるものだと思うし、OOPを用いた大規模なプロジェクトPerlを使おうとする理由がよく判らない。無駄に難しいし、そもそも本書を読めるレベルPerlを理解している人の頭数がかなり少ないだろうから、実装しても保守コストがやたらかかる。Livedoormixiはてなのような大規模サイトPerlで動いているようだが。。。

モダンPerl入門』は内容も書き方も素晴らしい良書だけれど、その辺りが引っかかった。「PerlOOPを使う理由(APS.NETStruts+Java採用しない理由)」は何なのだろうか? 私のプログラマーとしてのスキルが低いだけだと思うが、よく判らないので誰か教えてくだしあ。教えてダンコーガイ

2008-07-04

javascript継承

javascriptスーパークラスのメソッドを簡単に呼び出したかった。それだけだった。

思いのほか長くなった。車輪を再発明した気がする。

var Class = inherit(SuperClass, {hoge: ...});

のように使い、スーパークラス継承したクラスを作る。

作ったクラスprototypeに、第二引数オブジェクトコピーされたスーパークラスインスタンスを持つ。

第一引数がnullだと、スーパークラスObjectを用いる。つまり、

var Class = inherit(null, {hoge: ...});

var Class = inherit(Object, {hoge: ...});

と同等となる。

また、第一引数が"prototype"をメンバに持たない普通オブジェクト、つまり、

var Class = inherit({hoge: ...});

だと

var Class = inherit(Object, {hoge: ...});

と同等となる。

var obj = new Class({hoge: ...});

インスタンスを作ると、引数オブジェクトコピーを持つオブジェクトとなる。

また、メソッド"initialize"が自動的に実行される。

ただし、コンストラクタ引数を渡さなかった場合は、initializeは実行されない。

オーバーイドしたメソッド内では

this.superapply(arguments);

としてスーパークラスのメソッドを呼べる。第一引数は呼び出すメソッドの引数配列とする。

このとき、呼び出し側のメソッドはコンストラクタやinheritでオーバーイドしたメソッドでなくてはならない。これは呼び出し側のメソッド名を記録する必要があるためである。

そうでない場合は第二引数にメソッド名を渡す必要がある。

var obj = new Class({});
obj.foo = function(){
        this.superapply(arguments);         // X
        this.superapply(arguments, "foo");  // O
};

<html><head>
<script type="text/javascript">
function inherit(superclass, override) {
	if (!superclass)
		superclass = Object;
	if (! "prototype" in superclass) {
		override = superclass;
		superclass = Object;
	}
	var that;
	var func;
	function superapply(arg, name) {
		var prev = {that: that, func: func};
		try {
			var my = this.superapply;
			if (!arg)
				arg = [];
			if (!name)
				name = arguments.callee.caller.caller.methodName;
			if (that &amp;&amp; func &amp;&amp; (!name || name == func.methodName)) {
				that = that.superapply.obj;
				name = func.methodName;
			} else if (name) {
				that = my.obj;
				func = arguments.callee.caller.caller;
				func.methodName = name;
			} else {
				throw new Error("methodName is null");
			}
			var result;
			if (func === that[name]) {
				result = this.superapply(arg, name);
			} else {
				func = that[name];
				func.methodName = name;
				result = func.apply(this, arg);
			}
		} finally {
			that = prev.that;
			func = prev.func;
		}
		return result;
	};
	var prototype = new superclass();
	prototype.superapply = function(){superapply.apply(this, arguments)};
	prototype.superapply.obj = superclass.prototype;
	if (override)
		for (var i in override) {
			prototype[i] = override[i];
			if (typeof override[i] == "function")
				prototype[i].methodName = i;
		}
	var subclass = function(obj) {
		this.superapply = function(){superapply.apply(this, arguments)};
		this.superapply.obj = prototype;
		if (obj) {
			for (var i in obj) {
				this[i] = obj[i];
				if (typeof obj[i] == "function")
					this[i].methodName = i;
			}
			this.initialize();
		}
	};
	subclass.prototype = prototype;
	subclass.prototype.constructor = subclass;
	return subclass;
}
var C1 = inherit(Object, {
fn: "C1",
initialize:
	function(){
		alert("C1.initialize");
		this.second(this.fn);
	},
second:
	function(a){
		alert("C1.second: "+a);
	}
});
var C2 = inherit(C1, {
fn: "C2",
initialize:
	function(){
		alert("C2.initialize");
		this.superapply();
//	},
//second:
//	function(a){
//		alert("C2.second: "+a);
//		this.superapply([a]);
	}
});
var C3 = new C2({
fn: "C3",
//initialize:
//	function(){
//		alert("C3.initialize");
//		this.superapply();
//	},
second:
	function(a){
		alert("C3.second: "+a);
		this.superapply([a]);
	}
});
</script>
</head><body>
</body><html>

methodNameなんとかならんもんか。

2008-04-09

JSON根本的な脆弱性

この間どっかの記事で見つけて(これ自体は数年前から海外では言われていたことだが)ターゲットを探そうと頑張ってたんだけどいろいろと理由があってここで公開することにする。

javascriptは以下のようにコンストラクタを再定義できる。

function Array() {
    var obj = this;
    var ind = 0;
    var getNext = function(x) {
        obj[ind++] setter = getNext;
        if (x) {
            console.log(x.toString());//細工。
        }
    };
    this[ind++] setter = getNext;
}

実はこれが問題で例えば、配列を含むオブジェクトJSONで渡す際に必ずArrayコンストラクタが呼び出される。

上記のように少し細工をしておけばcallbackとかついてなくても内容を処理できるのでクロスドメイン対策がされている場合でもJSONからデータを読み取ることが出来る。

余談だが、Gmailなどではこれを回避するためにwhile 1を先頭につけることで無限ループさせている。

ちなみに公開する理由
  • Firefox3はこれを仕掛けることが出来ない
  • はまちちゃんのようにいいターゲットを見つけることが出来なかった
    • いや、ひとつ見つけたんだけどあまりにも(ry
  • これとかを見る限り知っている人が少なそうだったから

2008-03-14

public class Main {
    public static void main( String[] args ) {
        // ( 5 - 3 ) + 1
        Exp exp = new Add(new Sub(new Num(5), new Num(3)), new Num(1));
        System.out.println(exp.eval());
    }
}


/**
 * 抽象クラス
 */
abstract class Exp {
    public abstract int eval();
}


/**
 * 足し算
 */
class Sub extends Exp {

    /** 左辺 */
    private Exp hidari;
    /** 右辺 */
    private Exp migi;

    /**
     * コンストラクタ
     */
    public Sub(Exp hidari, Exp migi){
        this.hidari = hidari;
        this.migi = migi;
    }

    /**
     * 評価
     */
    @Override
    public int eval() {
        return hidari.eval() - migi.eval();
    }

}


/**
 * 引き算
 */
class Add extends Exp {

    /** 左辺 */
    private Exp hidari;
    /** 右辺 */
    private Exp migi;

    /**
     * コンストラクタ
     */
    public Add(Exp hidari, Exp migi){
        this.hidari = hidari;
        this.migi = migi;
    }

    /**
     * 評価
     */
    @Override
    public int eval() {
        return hidari.eval() + migi.eval();
    }
}


/**
 *
 */
class Num extends Exp {

    /**
     *
     */
    private int self;

    /**
     * コンストラクタ
     */
    public Num(int self) {
        this.self = self;
    }

    /**
     * 評価
     */
    @Override
    public int eval() {
        return self;
    }

}

2007-06-04

[]??Delphihacks??Delphi??Win32API??

Delphi - Wikipedia??Windows開発の決定版 - Delphi(Skype??なでしこ)

タグ「delphi」を含む注目エントリー - はてなブックマーク

Delphiアプリケーションのメモリリーク検出法

Delphiアプリケーションのメモリリーク検出法 (山本隆の開発日誌)

作ろう!コンポーネント Delphi C++Builder

http://www.componentsource.co.jp/features/delphi/

TMS Software | Productivity software building blocks

Components > Effects and Multimedia > Video. Torry's Delphi Pages

Components > Effects and Multimedia > Audio. Torry's Delphi Pages

Components > Effects and Multimedia > Voice. Torry's Delphi Pages

Components > Effects and Multimedia > Direct X. Torry's Delphi Pages

try finally end

CとDelphiの対比表

eXeScope(Windows95/98/Me / ユーティリティ)

Delphi - テクノラティブログ検索

2ch検索: [Delphi]

Delphi-ML〓〓〓〓〓〓〓〓〓〓〓??About Delphi

Delphi Q & A掲示板

Delphi Q & A 〓f〓〓〓〓 〓〓〓〓〓〓O〓〓(HTML〓o〓[〓W〓〓〓〓)

fdelphi.com

Delphi入門

旧 Delphi 入門??Seventh Delphi

Delphiメモ

超ローテクDelphi講座

俺のためのDelphi学習

Delphi はじめの一歩

VB〓〓VC〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓H

Delphi の格言

キーボードからの入力取得

マウスボタンのクリック、マウスの位置情報の取得

ジョイスティックからの入力取得

バッカーへの階段: 入門:キーロガー

テキストファイルを読み書きする

テキストファイルのロードとセーブ

DelphiによるWin32API

Delphi WAVEサウンド音を鳴らす/Tips & Tricks

MIDI、WAVEファイルを再生する

サウンドを読み込んで鳴らす

MIDIを演奏する MCI/midiStream

5分ではじめるDelphi - 第1回 簡単なメディアプレーヤの作成(前編)

MP3プレイヤーを作る>dllによる再生

Controling sound volume from code

Torry's Delphi Pages

lsMicrophone: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;

MIXERLINE_COMPONENTTYPE_DST_SPEAKERS

MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT

SwissDelphiCenter.ch : ...set the volume for the microphone/ mute it (enhanced)?

Components > Sound Effects > Mixer. Torry's Delphi Pages

uses MMSystems;

//

PlaySound('C:\WINNT\Media\start.wav', 0, SND_FILENAME or SND_ASYNC);


ビットマップを表示しよう

画像ファイルを指定した位置へ表示

俺Delゲーム応用

画面をキャプチャして表示する

めもニャンだむ

Delphi6でプログラミング ビットマップの半透明コピー AlphaDraw

画像処理プログラミング講座

Graphic Effect

カラー画像をモノクロ画像に変換

procedure TForm1.Button1Click(Sender: TObject);

var

bmp1,bmp2 :TBitmap;

begin

bmp1 :=Tbitmap.Create;

bmp2 :=Tbitmap.Create;

try

bmp1.LoadFromFile('C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color\FINANCE.BMP');

bmp2.LoadFromFile('C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color\FACTORY.BMP');

Form1.Canvas.Draw(10,10,bmp1);

Form1.Image1.Canvas.Draw(10,10,bmp2);

finally

bmp1.Free;

bmp2.Free;

end;

end;


無料版Delphi6でSTGをつくるためのプログラミング講座 Ver.2005 Jan.

Delphiでわずか59KBのオセロを作る方法

めもニャンだむ:BIOS 情報

コンストラクタとデストラクタ

SwissDelphiCenter.ch : ...get the MAC Address?

乱数

DelphiでMD5

もっと楽にGUIとの連携がしたい:Python + Delphi = P4D(Python for Delphi) - ふにゃるん

Delphi WindowsのOSのバージョンを取得する/Tips & Tricks

SourceForge.net: Gecko SDK for Delphi

DelphiでWinSock

SQLite-もげもげ〜

BDS(Delphi/BCB)用SQLiteライブラリ (山本隆の開発日誌)

Application.ProcessMessages

FrontPage - DelphiVIP

SwissDelphiCenter.ch : programming tips

Torry's Delphi Pages

Delphi Tips

Delphi Code Tips

Magic of Delphi4〓z〓[〓〓 〓y〓[〓W

Delphi Win32API/API関数一覧

Delphi〓〓〓Z

クジラ式 Delphi 資料

Delphi〓〓y〓[〓W

サイト移転のお知らせ(Mr.XRAY)

openDelphi.org

KOL and MCKPage

Gen's Delphi Labo.

サイト移転のお知らせ(Mr.XRAY)

ナッキーの「Turbo Delphiはじめて奮戦記」- 第1回 Turbo Delphi のインストール

フリーのTurbo Delphiで始めるWindowsプログラミング:ITpro

フリーのTurbo Delphiで始めるWindowsプログラミング:ITpro

http://torrent.borland.com/turbo_hotfix_rollup.zip

http://torrent.borland.com/prereqs_jp.zip

http://torrent.borland.com/turbodelphi_jp.exe

(1) \dotNETRedist\dotnetfx.exe

(2) \dotNETRedist\langpack.exe

(3) \dotNETRedist\NDP1.1sp1-KB867460-X86.exe

\dotNETSDK\setup.exe

\IE60SP1\ie6setup.exe

\dotNETJSharp\vjredist.exe

\dotNETJSharp\vjredist-Permalink | 記事への反応(1) | 15:15

2007-05-11

http://anond.hatelabo.jp/20070510174446

public class FizzBuzz {
	private final int start;
	private final int last;
	private final int fizz;
	private final int buzz;

	public FizzBuzz(int start, int last, int fizz, int buzz) {
		this.start = start;
		this.last = last;
		this.fizz = fizz;
		this.buzz = buzz;
	}

	public static void main(String[] args) {
		new FizzBuzz(1, 100, 3, 5).execute();
	}

	private void execute() {
		for (int i = start; i <= last; i++) {
			if(isMultiple(i, fizz)){
				System.out.println("Fizz");	
			}
			if(isMultiple(i, buzz)){
				System.out.println("Buzz");			
			}
			if( !isMultiple(i, fizz) && !isMultiple(i, buzz)){
				System.out.println(i);			
			}
		}
	}

	private boolean isMultiple(int i, int base) {
		if(i/base * base == i){
			return true;
		}
		return false;
	}
}

勝手に修正してみた。

Javaクラスってコンストラクタとデストラクタって必須じゃなかったっけ?

あ、CならisMultipleは#defineするから一行で済むんだが…。

2007-02-08

anond:20070208102527

増田でこんな風にだべるのも一興ですな。

言語としてのPerlRuby比で誉めるのは無理。

んー、誉めてる様に読めるのかなぁ。好きって意味では書いたけど、それは利点というより欠点っぽい気がするんだよな。特に設計の立場で考えると。

設計という観点を持たないコーディングが可能って考え方は斬新すぎて理解できないけど。

設計という観点での評価とコーディングという観点での評価、どちらを重視するか、って事です。

「とりあえず書いてみる」→「不具合アドホックで直す」→「だんだんソースがぐちゃぐちゃになる」

人にも拠るだろうが、趣味で書くとそんな感じになったりする。で、perlの場合は変態的なことも出来ちゃったりするので余計にたちが悪いと思うわけ。書く時には出来ちゃう事が利点なんだけどね。

大体、オブジェクトがなってないよね。newしたら別のオブジェクト作っちゃうとか。別のオブジェクトに変更しちゃうとか。しまいにはコンストラクタじゃないところでコンストラクトしちゃうとか。

あー書いてたらわけわかんない文になったけど書き散らしとこう。

ログイン ユーザー登録
ようこそ ゲスト さん