多段継承できるクラス生成関数を頑張って作りました
JavaScriptでクラスを作るのは簡単なのですが、継承したり、オーバーライドしたメソッドを簡単に呼び出すとなると途端にレベルが上がります。
- ChromeやFirefoxで使うので、関数呼び出し多めでも大丈夫(IE6でも動くけど)
- this.parent.method()で親クラスのメソッド、this.parent.parent.method()で祖父クラスのメソッドが呼べる
- this.parent.variableで親クラスのインスタンス変数とかはついていないです
という感じで、頑張って作ってみた。
使い方
var A = $_klass({ init: function () { print("A init"); }, // コンストラクタ hoge: function () { print("A hoge"); }, huga: function () { print("A huga"); }, piyo: function () { print("A piyo"); } }); var B = $_klass(A, { // init: function () { print("B init"); }, // コンストラクタは省略した時、親クラスを呼ぶ hoge: function () { print("B hoge"); }, // huga: function () { print("B huga"); }, // piyo: function () { print("B piyo"); } }); var C = $_klass(B, { init: function () { print("C init"); }, hoge: function () { print("C hoge"); }, // huga: function () { print("C huga"); }, piyo: function () { print("C piyo"); this.parent.piyo(); } }); // インスタンスの生成 var a = new A; // A init var b = new B; // A init var c = new C; // C init c.hoge(); // C hoge c.huga(); // A huga c.piyo(); // C piyo A piyo
ソース
function $_klass(parent, methods) { if (typeof parent === "object") { methods = parent; parent = null; } function klass() { this.klass = klass; if (klass.parent) { this.parent = makeParent(this, klass.parent); } this.init && this.init.apply(this, arguments); } klass.parent = parent; var kp = klass.fn = klass.prototype; if (parent) { var pp = parent.prototype; for (var i in pp) { var f = kp[i] = pp[i]; if (typeof(f) === "function" && f.override) { kp[i] = (function (name) { return function f() { return this.parent(name, arguments); }; })(i) } } } if (methods) for (var i in methods) { var t = kp[i], f = kp[i] = methods[i]; if (typeof(f) === "function" && typeof(t) === "function") { f.override = true; } } return klass; function makeParent(self, parent) { var pp = parent.prototype, sp, tp; if (tp = parent.parent) sp = makeParent(self, tp); var fn = function (name, args) { var bk = self.parent; self.parent = sp; var rv = pp[name].apply(self, args || []); self.parent = bk; return rv; }; for (var i in pp) if (typeof(pp[i]) === "function") { fn[i] = (function (name) { return function () { return self.parent(name, arguments); }; })(i); } return fn; } }
まとめ
- for文でぶん回すわ、thisを束縛して関数作り直すわで、相当汚いので、誰か助けてください。
- どうしてこうなった。
Firefoxの設定
結局、Firefoxも設定するオチ。
拡張
- AiO Gestures
- Compact Menu
- ブックマークとか移動とか消す
- Firebug
- Googlebar Lite
- 最近は無効化しているような気もする
- Greasemonkey
- Minibuffer, AutoPagerize, LDRize, Auto Reloader(自作), XPath Finder(自作), Submit on Ctrl-Enter(自作), Amazon with Library(自作), LDR Ad-Entry Blocker, LDR Full Feed, OBN(自作), WIPA(自作)
- Hatena Bookmark
- Live HTTP Headers
- PlacesCleaner
- 入れてみただけ
- Popup ALT Attributes
- QuickProxy
- RefControl
- 設定ファイルあり
- Speed Dial
- Stylish
- TMP
- 設定ファイルあり
- Web Developer
- ツリー型タブ
- Text Link
about:config
browser.backspace_action;0 greasemonkey.fileIsGreaseable;true keyword.URL;http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=
VMWareのWindowsの初期設定
WindowsからUbuntuに移行するメモ(準備編)
Let'snote CF-W7(メインマシン)をWindows XPからUbuntu 10.04に移行準備のためのメモです。
各種ディスクの準備
Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Teamより日本語Remix CDイメージを入手して、CD-Rに焼きます。
また、Windows XPをVMWareで動作させる予定であるので、こちらもディスクで準備しておきます。
データのバックアップ
外部のHDDにまるごとコピーして、後から使うのを探すのが基本方針ですが、データ破損を起こすと非常に困るデータもあるので、それは別途違うメディアでコピーできるようにしておきます。
Firefoxの設定
profile全部コピーすれば良いような気もするけど、あんまり詳しくないので、個別に取ってインポートできるような体制にしておく。そもそも、Chromeに移行するつもりだから、個別に取った方がいい気もする。
- 導入したAddonの一覧と各種設定
- ブックマーク
- UserScript
- Greasemonkeyのバックアップの時すると思うけど、自作のものが多数あり、忘れると困るため。
- 保存されているパスワード
- アクセス先も忘れると困るので一括して、スクリーンキャプチャなどの方法で。
- プロキシ設定
アプリケーションのバックアップ
カスタマイズしすぎだったり、現在配布が中断している等、喪失すると困るアプリケーション。
- 萌ディタ
- FitzNOTE
- 書いたテキストを独自方式ではない形にエクスポートしておく。
- MSNメッセンジャー、Skype、FTP、VPN
- IDとパスワード等、各種設定のメモ
- JaneStyle
- 巡回していたスレの一覧
なんかテキスト関連周りはずいぶん古いソフトを使っているような。
まとめ
バックアップは一括で取るが、例外的に必ず取っておきたいものも個別に行う。今からCD-Rを買ってくる。
WindowsからUbuntuに移行するメモ(初期設定編)
Let'snote CF-W7にUbuntu10.04を導入してから、各種設定を行う。できる限りGUIでやっていく方向で。
無線LANとの接続
自宅は無線なので、無線のキーを入力してやれば、終了。
各種アップデート
- システム>システム管理>アップデート・マネージャで全部アップデートを行う。
- システム>システム管理>言語サポートでインストールを行う。
/home/下の日本語ディレクトリ名を英語に変更
LANG=C xdg-user-dirs-gtk-update
ディレクトリ名を英語にするか聞かれるので、Update Namesを選択。再ログイン後、ディレクトリ名を日本語にするか聞かれるので、次回から表示しないにチェックをいれ、古い名前のままにする。
時刻をNTPサーバと同期するように設定
システム>システム管理>時刻と日付の設定より、設定をインターネット上のサーバと同期させるに変更。NTPサービスをインストールし、時刻サーバーをntp.nict.jp(自分で追加する必要あり)と設定する。
気温と天気の表示
右上の時刻表示をクリックし、場所を展開し、編集をクリックすると、時計の設定が表示される。場所は日本語で入力することで、サジェストが働く。
キーボードの設定
システム>設定>キーボードより、レイアウト>オプションを以下のように変更する。
- Ctrlキーの位置を「Make CapsLock an additional Ctrl」
- CapsLockもCtrlとして挙動する
- Xサーバをkillするためのキーシーケンスを「Control+Alt+Backspace」
日本語環境セットアップ・ヘルパ
システム>システム管理>日本語環境セットアップ・ヘルパで以下のものを導入する。
Synapticパッケージ・マネージャ
システム>システム管理>Synapticパッケージ・マネージャで以下のものを導入する。
各ウェブサイトより導入するアプリケーション
zshの導入
which zsh chsh -s /usr/bin/zsh # whichの情報を参照
VMWare Playerの導入
sudo sh VMWare-Player-*.*.*-*.*.bundle
全てのサイトでGM_xmlHttpRequestを使うスクリプトその2
またか。(cf. 全てのサイトでGM_xmlHttpRequestを使うスクリプト)
// ==UserScript== // @name GM_xmlhttpRequest // @namespace GM_xmlhttpRequest // @include * // ==/UserScript== var elem_send = document.createElement("div"); elem_send.id = "_GM_xmlhttpRequest_send"; elem_send.style.display = "none"; var elem_receive = document.createElement("div"); elem_receive.id = "_GM_xmlhttpRequest_receive"; elem_receive.style.display = "none"; document.body.appendChild(elem_send); document.body.appendChild(elem_receive); document.getElementById("_GM_xmlhttpRequest_send").addEventListener("DOMNodeInserted", function (evt) { var textarea = evt.target; var opt = JSON.parse(textarea.value); textarea.parentNode.removeChild(textarea); //if (opt.__api__ !== "p@$$w0rd") { // return false; //} delete opt.__api__; var id = opt.__id__; ["onload", "onerror", opt.__onreadystatechange__ ? "onreadystatechange" : ""].forEach(function (type) { if (type) opt[type] = function (req) { req.__id__ = id; req.__type__ = type; var textarea = document.createElement("textarea"); textarea.value = JSON.stringify(req); document.getElementById("_GM_xmlhttpRequest_receive").appendChild(textarea); }; }); setTimeout(function () { GM_xmlhttpRequest(opt); }, 0); }, false); location.href = "javascript:(" + function () { var count = 0, cache = {}; window.GM_xmlhttpRequest = function (opt) { opt.__onreadystatechange__ = !!opt.__onreadystatechange__; cache[opt.__id__ = ++count] = opt; var textarea = document.createElement("textarea"); textarea.value = JSON.stringify(opt); document.getElementById("_GM_xmlhttpRequest_send").appendChild(textarea); }; document.getElementById("_GM_xmlhttpRequest_receive").addEventListener("DOMNodeInserted", function (evt) { var textarea = evt.target; var req = JSON.parse(textarea.value); textarea.parentNode.removeChild(textarea); var id = req.__id__, type = req.__type__; delete req.__id__; delete req.__type__; var opt = cache[id]; opt && opt[type] && opt[type](req); if (type === "onload" || type === "onerror") { delete cache[id]; } }, false); } + ")();void 0";
setIntervalでの監視をやめてみた。ちなみに自分はhttp://localhost/で使っております。そういう道具かなと。