「インスタンス」を含む日記 RSS

はてなキーワード: インスタンスとは

2009-05-21

Javaの本を買うつもりがJavascritpの本を買ってしまったでござるの巻

冗談はおいておいて、

いい加減覚えておかないと行けないなと思ってJavascript勉強しだしたんだけど、

インスタンスに対してメソッドを追加できるということをしってなんかこうスライムみたいなとらえどころのない言語なのかなという印象。

めざせamachang

2009-05-14

http://anond.hatelabo.jp/20090514155750

OK。長々とつきあってくれてありがとう。君の主張は理解できたと思う。

「全てのカラスは白い」というエントリに対して

元増田が「見たことないわ。白い事にしたいんじゃないの。叩きたいが為に」と返した。

そこへ横増田

「ホシガラスを知ってるか。あれは白いんだぞ」

と返したわけだ。

さて、誰がそこでホシガラスの話をしたいのだろう?

それなら元増田の反論がそもそもおかしい。反証としては「白くないカラスが(少なくとも一羽)存在する」で必要十分だった。ここで全否定するからおかしなことになる。それに元増田が本当にホシガラスを知ってなお「白いカラスなんて見たことない」と言っているのかどうかは本人以外(あの文章からは)わからない。したがってホシガラスの例を指摘する意味はある。

余談ながら個人的になぜ今更栗本薫なんぞを引っ張ってくるんだ?

栗本でなくてもいい。任意の一例だから。腐女子集合の1インスタンスでありさえすればいい。繰り返すがtheでなくaなんだ。彼女腐女子を代表する好例と思っているわけでもない。ただ簡易に提示可能だったから引いたまでにすぎない。ついでに言うと私は彼女のまとまった著書をほとんど読んだことがない(中島梓名義の,拒食症についての論考1冊)。君はよくよくテキストを特定文脈に位置づけて読みたがる人なんだなという印象をもった。これを読解力というなら確かに私は読解力に欠ける。

記事削除するんだったら元記事改竄しても同じだと思う。

潔く鉛筆マーク押して直せばいいのに何故そんな面倒な方を選んだんだい?

記事を再編集している間に元記事に対してレスされることをおそれたから。消すのは一瞬だからその方が再編集するより元記事の露出時間は短くなると考えた。結果としては無駄な面倒だったね。

2009-03-24

名付け方

ギークではないし、どちらかといえば下手なのですが。

http://anond.hatelabo.jp/20090324005857

  1. インスタンス名をどうするか
  2. 生成したインスタンスを格納する配列名前をどうするか
    • その集合を現す名前があるはず。

例えば、サムネイルを作る makeThumbnails という関数なら、

result = array.new()
while(src = gets())
    result.add(Thumbnail.new(src))
end
return result

かもしれないし、例えばサムネイルを一覧表示時のアイコンに使うなら、index_iconsとか、gif化してアニメーションするならframesとかつけるかも。

ちなみに、perlなら $frame = shift @frame だ。

whileの内側だけで使う一時変数なら名前は短く一文字とか、他にも処理があるならtmbとか、thumbとかにするかも。

2009-03-16

増田に複数のインスタンスを立てれればいいのに、とふと思う。

2009-02-22

もしも、あの言語で駅の券売機を作ったら

http://anond.hatelabo.jp/20090220065041

Brainf*ck

8つしかないボタンの順番を正しく押さないと目的地への切符が買えない。

COBOL

普通の英文による注文で切符が買えるハズなのだが、実際には専門家に頼んで注文を書いてもらわないと上手く買えない。

LOGO

亀を出発駅から到着駅まで移動させることで切符を買う。

Haskell

出発駅と到着駅の型が違う場合、適切な経由駅を設定しないと切符が買えない。

C++

任意の切符を発行するためのビルダーテンプレートインスタンスを生成できる。

JavaScript

切符は他の切符コピーで作られるため、切符をどう印刷するかについてのプログラムはまったく入っていない。

Prolog

到着駅と出発駅を入力すると、到達可能であることが示される。切符は出てこない。

Malbolge

この券売機切符が買えるのかどうか、まだ証明されていない。

Java

どの駅でも同じ操作で切符が買えるハズなのだけど、実際のところは微妙に違ってぬるぽで落ちる。

FORTRAN

カンマとピリオドを間違えて券売機が爆発。

2008-12-24

http://anond.hatelabo.jp/20081224225954

うーん…

派生クラス1(元からあったやつ)と派生クラス2(新しく実装したやつ)は、同時にインスタンス化しないんですよねえ。

というか、派生クラス2は実装しただけでそいつのインスタンスをnewする部分はまだ書いてない(派生クラス1だけで動く状態)んですよ。

それでも派生クラス1(あるいは基底クラス)の挙動が変わってしまう。

謎だ…。

2008-09-04

http://anond.hatelabo.jp/20080903235704

ところでサー

javascriptってラッパー作りやすくていいよね。

名前を変えずにラップ出来るから好き。

クラスインスタンスもメソッドも関数オーバーライドしてラップして、好き勝手出来るから好き。

(function(){
  var origin = hoge.prototype.foo;
  hoge.prototype.foo = function(){
    ...
  };
  hoge.prototype.foo.origin = origin;
})();

perlオーバーライドできるけど、元のメソッド呼べなくなる。すべてのインスタンスに影響する(たしか)。チョイめんどい

use hoge;
package hoge;
sub foo {
  ...
}
package main;
...

他の言語では、どんな技がありますか?

[追記]

\&hoge::foo で元のコードリファレンス取れたっけ?

すっかり忘れてる。

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-03-22

[]Python 2.6だと、オブジェクト辞書のキーに使えない場合がある

Python2.5のときは、新スタイルクラスインスタンス辞書のキーとして必ず使用できたけど、Python 2.6ではそういうわけじゃなくなってるぽい。という話。

class TestClass(object):
    def __init__(self, i_name):
        self._name = i_name

    def __eq__(self, i_other):
        if not isinstance(i_other, TestClass):
            return False
        return self._name == i_other._name

print 'object.__hash__ = ' + str(object.__hash__)
print 'TestClass.__hash__ = ' +str(TestClass.__hash__)

上記のようなコードを実行したら、Python 2.5とPython 2.6で結果が違いました。

Python 2.5の場合の結果。

object.__hash__ = <slot wrapper '__hash__' of 'object' objects>
TestClass.__hash__ = <slot wrapper '__hash__' of 'object' objects>

Python 2.6の場合の結果。

object.__hash__ = <slot wrapper '__hash__' of 'object' objects>
TestClass.__hash__ = None

Python 2.6だと、objectクラス継承すると、__hash__がNoneになっちゃってる。このままだと辞書のキーとして使えないね。object継承したクラスで__hash__を実装すれば、大丈夫みたい。

ハッシュ値の計算方法 (2)」というページも参考になりそう。

2007-10-20

http://anond.hatelabo.jp/20071019153453

よもや、レスがついてるとは思わなかった。

興味を持ってもらえてサンクスです。

entry = diary.entry('20070712231804')

エントリー指定してたからなんなんだろうと思って。

editもできるってことなのかな?

書き込んだあとの編集機能はいまんとこなし。

上記は指定したidエントリを引っ張ってくる。

# get entry from id
entry = diary.entry('20070712231804')

# puts entry title
puts entry.title

# puts entry content
puts entry.content

で、そもそもRubyに詳しくない自分からするとちゃんとした使い方がそれでもわからない。

バカでごめんねなんだけど、どうやって使えばいいの?

たとえば、エントリタイトル一覧(1ページ目だけだけど)を出力するなら

diary = Masuda::Diary.new

diary.entries do |entry|
  puts entry.title
end

こんな感じかな。

新しいエントリを登録するなら

diary = Masuda::Diary.new

diary.login('my_id', 'my_pass')
diary.post('koko wa title ne', <<EOS)
koko ni kizi no honbun wo kaku
EOS

とか。

ずらーっと増田らしきものを読み込む。

そりゃそうだわなと思いながら文字化けの山。

文字化けなのは、たぶん増田エントリ(UTF-8)をそのまんま取得しているせいだと思う。

なんでスクリプトを実行するときにフィルタを通すとか

~$ ruby hoge.rb | nkf -Ws

出力するときにSJISに変換するとか。

require 'rubygems'
require 'masuda'
require 'kconv'

diary = Masuda::Diary.new
diary.entries.each do |entry|
  puts entry.title.tosjis
  puts entry.content.tosjis
end

あと

session[:diary] = diary.raw

diary = Masuda::Diary.restore(session[:diary])

の...って何でしょうか??

Masuda::Diary#rawインスタンスシリアライズするメソッド。

ログイン済みのインスタンスシリアライズしてセッションにつっこんどいて、次のリクエストでも使いまわすとか。

わかりづらい文章で申し訳ない。

2007-10-14

速学Ruby railsを使うための最小限の知識

前置き

本講座ではほかの言語は触ったことがあるが、Ruby未経験者を対象にRailsを触るための最小限のrubyの知識を身につけるためのものである。

と、堅苦しく書いたけど仕事で急いでrailsを触れうようになるための最低限の情報だけをまとめてみたよ。

これを読んだだけではRubyプログラムを書けるようにはならないと思うけど、Railsを使った開発だといきなり何もできないってことはなくなるはずだよ。

肩の力を抜いて読んでほしいな。

基本のお話

変数宣言

Rubyでは特別に変数の宣言は必要ないんだ。

いきなり今まで宣言していない名前を使ってもおこらえないよ。

answer_to_life_the_universe_and_everything = 42 
# answer_to_life_the_universe_and_everything ????~A~S??~S????~H~]??~A????~Y??| ??~A~Y??~K??~B

なんて書いても問題ないんだ。

静的言語をやってきた人には型の宣言がないことに違和感を感じる人もいるかもしれないけど、Rubyでは型はあんまり気にしないんだ。

int x = HogeHoge.new

みたいな書き方では

変数xを用意してそこにHogeHoge.newを代入する。といった説明を受けたと思う。

でもRubyではちょっと違う考え方をするんだ。

x = Foo.new

だとFoo.new変数を用意して、それを名前に"束縛"するって説明することが多いよ。

ベルが貼られた箱を用意してそこに何かを入れるか、何かが入った箱を用意してそれにラベルを張るかの違いだね。後者のほうがちょっとだけ柔軟なんだ。

そして、柔らかいほうがRuby流って気がするよ。

でもそんなRubyでもちょっとだけ名前に関するルールがある。

大文字からはじまる名前はクラス

小文字からはじまる名前が局所変数

@からはじまるのがインスタンス変数

@@からはじまるのがクラス変数

ってルールだよ。

Railsだったらとりあえず@からから始まる名前にしておけばたいていは問題ないんじゃないのかな。

分岐分岐

JavaC言語ではif文なんかをよく使うよね。Rubyでもほとんど一緒だよ。

 if something_condition
  do_some_thing
elsif other_condition
  do_another_thing
else
  do_something_if_you_wont
end

もちろんelsifやelseが必要なければ省略することができるよ。

ほかにもRubyには便利な分岐の書き方があるよ。

so_some_thing if some_condition

みたいに後置でも書けるんだ。

どっちでも好きなほうを使えばいいと思うよ

関数宣言

関数宣言のとてもシンプルなんだ。

def func_name ( some_val_names )
  do_some_thing
end

といった感じでdef..endでくくるだけで簡単に関数を宣言できるよ

そして関数戻り値は最後に評価した値が自動的に戻り値になるんだ。

def baz 
  10
end

これは常に10を返す関数の例だよ。

Hash,Array

プログラムをしていて非常によく使うデータの型といえば配列(Array)や連想配列(Hash)だよね。

Rubyではそれらを簡潔に使うために専用の文法を用意している。

それが[]と{}だ。

arr = [1,2,3,"A","B","CDE"]         #??~M很~W宣訾@
has = {1 => "A",2 => "B", 3 => "C"} #??~O??~C????~CťΣ訾@
puts arr[3]
puts has[2]
A
B

とすれば簡単に配列ハッシュが宣言できるよ。

アクセス方法もほかの言語と大きく変わらないのが分かるよね。

2007-09-24

[]7日目,8日目

7日目

大型の本屋にいって、Rubyの本を買ってきた。

正直どれもあまり役にたたなそうだなと立ち読みしながら思った。

Perlと同じぐらいの書籍がおいてあるのに書籍レベルが総じて低い。期待値と未成熟さが同居している。

本を買っただけで、他にはなにもしなかった。

8日目

Railsソーシャルブックマークを作ってみようか(第2回)

http://d.hatena.ne.jp/PoohKid/20070220/p1

これをちろりとやってみた。

ログインしたらIn the Caboose.なるポエムが表示されて変なプラグインいれちゃったのかとかなり反省。

よくわからない。

どうもしくじったようだ……。

とおもったら、できてたみたい。

views/account/index.rhtmlに記述されてた内容がそのまま表示されていたようです。

Aptana IDEプロジェクトを切り替えようとすると、

エラーが発生しました。詳細についてはエラーログを参照してください。」

出るんだけど、エラーログがどこに吐かれてるのかもわからん。

(IDE再起動したらでなくなった)

なんとなく構成はわかったから、そろそろコーディングしてみるか。

昨日買った本を読みながらやっていたのだが、この本がなかなかいい。

少なくとも最初に買った

とは大違い。実用書は現物をある程度見てから買わないとダメだと痛感した。

もし、この本を本屋立ち読みしてからだったら買わなかっただろう。

CDの中にrubyマニュアルとかはいっていて相当便利。

やっぱSEはやるなー。秀和ははずすとほんとに本の趣旨がわからなくなる。

今日プラグインとか

file_column::ファイル関係

engines:なんだろう

Login engine:なんだろう


http://plugindb.jong.gr.jp/

こういうデータベースサイトもあるみたい。

今日の疑問

サンプルとかをみていると変数前に$、@がつく。なんだろう?スコープかな。

@→インスタンス変数オブジェクト単位

$→グローバル

サンプル突っ込んでいわれるがまま設定して500だと不慣れだとどうしていいかわからないよ。

エラーログのよみかたがよくわからない…。

せめて行とかでないものか、どこで設定するのだろうか。

探したがみつからなかった。

失敗

Rake Tasksの画面で

db:migrate:enginesと呼び出すところを候補がでないので、

db:migrateでメソッドをenginesにしてしまいなんで失敗するのかわからなかった。


にしてもまいった。こんな時間までがんばってみたが、本当にコーディングにも入れないまま終わりそうだ。

■[Ruby]6日目

http://anond.hatelabo.jp/20070921180432

2007-09-09

[]Ruby Python の比較

文字列 'Hello world' の o の合計数は2、全文字数は11

Ruby vs. Python

Python:

string = 'Hello world'

print string.count('o'), len(string)    # prints 2, 11        why not string.len()?

Ruby:

string = 'Hello world'

puts string.count('o'), string.length    # prints 2, 11


2007-09-19 - 偏った言語信者の垂れ流し

2007-09-28 - プログラミング日記

jijixi's diary - Ruby に比べて Python の面倒なところ

激しく同意 - 日記を書く[・ _ゝ・]はやみずさん

Django勉強会始まったよ|| Woops'dez | Bloggin'

バベル案内

Pythonはグローバルスコープローカル(関数)スコープ以外のスコープを何も持っていない。

だからPythonには「本物の」OOシステムがあるのだとしても、クラスは自分のインスタンス変数にさえアクセスできない。

あらゆるインスタンスメソッドに対し"self"パラメタを渡す必要があり、そうやってインスタンスデータにself経由でアクセスするのだ。

だからPythonの中のものはすべて、self、selfself、selfselfself、selfSELFselfSELF__SELF__であり、

たとえあなたがホワイトスペースの問題を気にかけないとしても、これはあなたの頭をおかしくするだろう。

2007-08-25

素人探訪今日の素敵 java1.0

配列に格納したものと一致しないものだけをピックアップしたかったのだが、

配列の中にその値があるかどうかの比較のしかたがわからずfor文でまわしました。

なんとなく感覚でequals()と==をつかいわけているが、もしかしたら違うかもしれない。

classインスタンスというかイニシャライズに相当する書き方がわからず、

初期化が必要なクラスをつくることができず、ひとつのクラス内でダバダバ関数を書いている。

} catch(ArithmeticException e) {

System.err.println("エラー" + e.getMessage());

関数ごとにこんな風にいちいち書いてみたが、もっといいやり方があるきがする。

// デバック用出力関数

private void fDebug(String msg) {

if (!DEBUG_FLG){ return;}

System.out.println(msg);

}

挙句、こんな関数を作った。俺はバカかとおもった。

ログ出力用のヤツまでつくってしまった。いったいこれはどういうことだろう。

昔し、配列のsortを教えてもらった記憶があるのだが実はいまだにできない。

しかたが無いのでaddで任意の位置に足しているが、それをやるにもループ配列.size()で分岐しながらなのでカッコワルイ。

勢いでつくった関数にオプショナルで引数を追加したくなったのだが、やりかたがわからなかったので諦めた。

引数初期化ってどうやるんだろう。

Eclipseで一気に複数行をコメントアウトするような方法がわからない。

→わかった! ctrl+/だ! おー、便利。

気持ち悪いループとbreak文だらけになってしまいわかり難いのでラベルをつけた。

「label:」みたいにすればいいらしい。だが根本的に間違っている気がする。

Integerとintみたいなものを区別せずに使っている。実際何が違うのかわからないけど動くからいいやとかおもってしまっている。

@Overrideってなんだろう。

参照が深くなりすぎてしまって、ループの中でわざわざ変数を宣言しなおしている。

DDDDD masuda = AAAA.BBBB().CCCC(ohdeyansu);

ookamiotokoto = masuda.funga() + masuda.hajimeruzamasu();

どうなんだろうか。

何か計算結果がおかしいなとおもったら int * (int/int) で、分母が計算途中で丸められてた。

int * (float)(int/int) こんな回避の仕方をしてしまったのだがいいのだろうか。



たいしたことをしていないのだがやたらとコードが長くなる。

どうにかならんものか・・・。

2007-07-24

GoogleEarthで遊ぼう

Ruby,Windows COM APIの知識がそれなりにあることを前提としています。あしからず

あと、用語の使い方は結構いい加減です。訂正ヨロ。

まずは、GoogleEarthをインストールしよう。http://earth.google.co.jp/ から無料ダウンロードできます。

次に、COM APIの登録。コマンドプロンプトで、GoogleEarthをインストールしたフォルダ(通常は、c:\Program Files\Google\Google Earth)に移動して次のコマンドを実行します(>は入力する必要はありません)。

>googleearth.exe /RegService

これを実行することによりCOM APIを介して外部から操作することが可能になります。

次にRubyの実行環境を整えます。が、説明が面倒なので省きます。ActiveScriptRubyでぐぐれ!

さて、ここから実際にGoogleEarthを動かしてみます。こういうときはirbが便利ですね。ActiveScriptRubyが正しくセットアップされていれば、デスクトップRuby Consoleというショートカットができているはずです。これを起動すると、Rubyパスが通った状態でコマンドプロンプトが起動するはずです。そこでirb(Enter)と入力してみましょう。

irb(main):001:0>

というふうに表示されればOKです。

どんどんいきましょう。irbで、

>require 'win32ole'

入力してください(>は入力しません。プロンプトがでているという意味お約束です)。これで、COM APIRuby上で取り扱うことが出来るようになります。

次に、

>ge = WIN32OLE.new('GoogleEarth.ApplicationGE')

入力しましょう。変数geがGoogleEarthのCOM APIインタフェースインスタンスになります。geのメソッドを呼び出すことによりGoogleEarthを操作します。GoogleEarthを起動していない場合、ここで起動されます。

では、いよいよGoogleEarthを動かします。GoogleEarthでは、視点情報をCameraと呼称しています。カメラを移動させるために、カメラ情報へのインタフェースを生成します。

>cam = WIN32OLE.new('GoogleEarth.CameraInfoGE')

この、camプロパティを設定することによりカメラ情報を設定することが出来ます。

>cam.FocusPointLatitude = 35.0
=>35.0
>cam.FocusPointLongitude = 135.0
=>135.0

実際に入力するのは、1行目と3行目です。Latitude:緯度、Longitude:経度です。緯度は赤道を中心として+90(北方向)から-90(南方向)の値をとります。経度は+180(東方向)から-180(西方向)の値をとります。日本の場合、どちらも+になります。

実際に視点を移動させるには、先ほどのgeのメソッドを呼び出します。

>ge.SetCamera(cam,1)

GoogleEarthでの表示が切り替われば成功です。場所は日本どこかです。岡山のあたりでしょうか。

(つづく?)

2007-04-11

私が躓きかけたjavascriptと他言語の違い

http://anond.hatelabo.jp/20070411180408の人へ

Javascript言語仕様を読めば、語句があって構文があって構造化やらオブジェクトやら関数やらなんやらの作り方がわかる。

私もそれについては何の問題もなかった。少々、特徴はあるけれど、さほど困惑するほどのものではなかった。

ただ、それから先で、はたと困惑するんだよね。やりたいことをどう作っていけば良いのかわからない。それ、よくわかる。

Javascript(正確にはちょっと違うのだけれど)の特異な点は、こちらがJavascriptの枠組みで何か設計する前に、すでに互いに関連しあったインスタンスがある、または他の枠組み(HTMLやらXMLやら)でインスタンスを生成したあとJavascriptで操作する、って所なんだ。

他の言語は、I/OやI/Fを設計して、それをその言語で作って操作して、という手順になるんだよね。プログラミングはそのI/OやI/Fを作ることから始まることが多い。

しかし、Javascriptはその部分ほとんどインスタンスとしてブラウザが作った後に動く。すでに形になっているインスタンス群がある状態で動く。そして、プロトタイプ言語だから、インスタンスを作る際に他のインスタンスを使用する事が多い。

つまり、すでに出来ているインスタンス群の状態を知る、つまりDOMを知って、実際にどんなインスタンスが出来ているのか、どんなインスタンスを作ればよいのか、を知る必要がありました。

以上、prototype.jsも満足に使えないへぼい奴からの言葉です。

2007-02-17

rimo.tv.screensaver

>http://www.geocities.co.jp/SiliconValley/8916/Macintosh/rimo.tv.screensaver.html>

rimo.tv.screensaverは、YouTube に掲載されている人気の動画から約1日おきに新しい番組プログラムを生成・配信する はてなサービスである http://rimo.tvを表示するMacOSXスクリーンセーバです。

<<

勝手class-dumpとstringsとotoolで調べたよ。概ね間違っていないと思う。

  • 単一のクラスrimo_tv_screensaverViewで構成され、それをPrincipalClassとするバンドル
  • rimo_tv_screensaverViewはScreenSaverView(/System/Library/Frameworks/ScreenSaver.framework/Headers/ScreenSaverView.h)のサブクラス
  • rimo_tv_screensaverViewは一つのWebView(/System/Library/Frameworks/WebKit.framework/Headers/WebView.h)オブジェクトインスタンス変数に(そしておそらくsubviewとしても)持つ。
  • ページの読み込みはWebFrameクラスの-loadHTMLString:baseURL:で実行。URLは固定(http://rimo.tv/)
  • rimo_tv_screensaverViewは上のWebViewオブジェクトのframeLoadDelegateになっていて、ロード時に-webView:didFinishLoadForFrame:が呼ばれるようになっている(おそらくscale設定をおこなうため)
  • -awakefromNibって何やってるんだろう。

URLとかチャンネルオプション設定で変えられると便利そうだけど、今の超シンプルの方がカッコイイかも。

2006-10-03

[]WikiWikipedia

古い記事ですまないが。

「swk'slog」をきっかけに、mixiで多くの日記を拝見したり、はてなアンケートを採らせていただいたりして調べてみると、ウィキペディアの略称として、「ウィキ」が使われることが非常に多くなっているようなのだ。

最初はへぇぇぇと思ったけど、ウルトラマンを初代ウルトラマンと呼んだりするようなことかと思い直す。

例えばブログエントリ最近仮面ライダーって書かれてたらそれはまず仮面ライダーカブトのことだろうし、それが去年のエントリなら仮面ライダー響鬼のことになる。これは仮面ライダーという名詞があらゆる仮面ライダークラスで、特定のライダーを指さないおかげでコンフリクトが起きない仕組みになっているから問題ないのだけれども、一方で、ウルトラマンメビウスウルトラマンと呼んだりなんかすると、ウルトラマンというのはインスタンスとしても存在するためにコンフリクトが生じる場合があるんで、こういった場合は逆にウルトラマンのことを初代ウルトラマンと呼んだり、初代とだけ呼んだりするなどエイリアスを作成することによってファンはコンフリクトを回避し、今ではそれが一般化されている。

なので、帰ってきたウルトラマンが出た以降みたく、WikiWikipediaというさよなら三角が一般化されれば、(日本語圏内では)WikiそのものをWikiツールと呼んで区別したり、そのWikiツールの説明書きに「Wikipediaのように……」なんて書かれたりするようになっていくと思われるので、(日本語圏内だけの話だし)そこまで心配することでもないよね。

おそらくめたるまんの中の人にとってWiki = Wikipediaではなくて、今最も熱いWikiは別にあるんだろうなぁというところに落ち着いた。

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