とまあ
だいぶ昔のメモが下書きに眠ってたので公開してみました。懐かしいなあ。
Function::arguments
argumentsは引数リストだと思っていたら、実はオブジェクトらしい。
arrayにそのまま渡したい時に困るのだが、変換できる。
Array.prototype.slice.call(arguments)
https://developer.mozilla.org/en/JavaScript/Reference/functions_and_function_scope/arguments
Function::apply and call
JSのapplyってずっとよくわかってなかったので調べてみた。
schemeの(apply )と同じようなもんと考えて納得。
あるオブジェクトの関数を別のオブジェクトに適用する。
"hoge".slice() //=> "hoge" [].slice.apply("hoge") // => ["h", "o", "g", "e"]
似たメソッドでcallがあるが、引数の取り方が異なる。
Array.prototype.slice.apply("hoge", [3,4]) Array.prototype.slice.call("hoge", 3, 4)
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
JDEEを使ってみる
Android書くときに、Eclipseもいいんだけど、やっぱり手馴れたエディタを使いたいよねってことでJDEEを試してみる。
というわけで、自分用コマンドリファレンス。
インストール
http://jdee.sourceforge.net/
JDEEとelibをダウンロードしてmake install
設定
Android SDK にもパスを通しておく
JDKのバージョンとか場所は適宜。書いてあるのはUbuntu環境でのもの。
;; jdee (add-to-load-path "elib") (add-to-load-path "jdee/lisp") (autoload 'jde-mode "jde" "Java Development Environment for Emacs" t) (setq auto-mode-alist (cons '("\.java$" . jde-mode) auto-mode-alist)) ;; cedet (add-to-load-path "cedet/cogre") (add-to-load-path "cedet/common") (add-to-load-path "cedet/contrib") (add-to-load-path "cedet/ede") (add-to-load-path "cedet/eieio") (add-to-load-path "cedet/semantic") (add-to-load-path "cedet/speedbar") (add-to-load-path "cedet/srecode") (setq semantic-load-turn-useful-things-on t) (load "cedet") ;;(semantic-load-enable-code-helpers) ;; jde-mode-config (custom-set-variables '(jde-jdk-registry (quote (("1.6.0.24" . "/usr/lib/jvm/java-6-sun/")))) '(jde-global-classpath (quote ( "~/lib/android-sdk/platforms/android-4/android.jar" "~/lib/android-sdk/platforms/android-7/android.jar" "~/lib/android-sdk/platforms/android-8/android.jar" "~/lib/android-sdk/platforms/android-10/android.jar" "~/lib/android-sdk/platforms/android-11/android.jar" )))) (add-hook 'jde-mode-hook '(lambda () (c-set-offset 'arglist-intro '+) (c-set-offset 'arglist-close 0) (c-set-offset 'topmost-intro-cont 0) ;; new line on annotation (c-set-offset 'func-decl-cont 0) (setq indent-tabs-mode nil) (setq c-basic-offset 4) (setq c-set-style "java") )) ;; custom variables (setq compilation-window-height 8) (setq bsh-vm-args '("-Duser.language=en")) (setq jde-import-auto-sort t) ;;; ant on jdee (setq jde-build-function '(jde-ant-build)) (setq jde-ant-enabled-find t) (setq jde-ant-program "/usr/bin/ant") (setq jde-ant-read-target t) ;;; check style on jdee (setq jde-checkstyle-option-rcurly (list "alone")) (let ((elem (assq 'encoded-kbd-mode minor-mode-alist))) (when elem (setcar (cdr elem) "")))
コマンドリファレンス
- テンプレート生成
Key | Event |
---|---|
M-x jde-gen-class | クラスのテンプレート生成 |
M-x jde-gen-xxx | テンプレート自動生成 |
M-x jde-gen-get-set or M-x jde-wiz-gen-get-set-method | Getter/Setter 生成 |
M-x jde-wiz-implement-interface | インターフェースの実装ひな形生成 |
C-c C-v C-o | オーバーライドメソッドのひな形生成 (jde-wiz-override-method) |
- コンパイル/デバッグ/ビルド
Key | Event |
---|---|
C-c C-v C-c | コンパイル |
C-c C-v C-r | 実行 |
C-c C-v C-b | antビルド |
C-x ' or M-g n | 次のエラー箇所へジャンプ |
M-g p or M-g M-p | 前のエラーへジャンプ |
C-c C-v C-d | デバッガ起動 |
M-x jde-bug-set-breakpoint | カーソル位置にブレークポイントを設定 |
M-x jde-bug-clear-breakpoint | カーソル位置のブレークポイント解除 |
M-x compile => ant -emacs | build.xmlに従ってビルド |
M-x compile => ant -emacs junit | junitの実行 |
コンパイルエラー表示行でC-m | エラー行へジャンプ |
- Import
Key | Event |
---|---|
C-c C-v z | 必要なimportをすべて追加する (jde-import-all) |
C-c C-v C-z | import文単体の挿入 |
M-x jde-import-kill-extra-imports | 不要なimport文を削除 |
- Edit
Key | Event |
---|---|
C-c C-v C-. | コード補完 (jde-complete) |
C-c C-v C-l | println |
C-c C-v C-y | カーソル位置のクラスのソースを表示 |
C-c C-v C-w | カーソル位置のクラス名のマニュアルを表示 |
C-c C-v j | Javadocコメント生成 |
C-c C-v C-s | Speedbar起動 |
C-c C-v C-n | JDKのドキュメントを表示 |
C-c C-v C-w | クラスのJDKドキュメントを表示 |
C-c . | 編集スタイルの切り替え |
- Othres
Key | Event |
---|---|
M-x jde-chckstyle | checkstyle |
C-c C-v C-f | プロジェクト内のgrep検索 (jde-find) |
M-x jde-find-dig | 実行時に設定可能なgrep検索 |
M-x jde-bsh-exit | BeanShellの終了 |
Linux Kernelをビルドする
環境: Ubuntu 11.04 (VMWare fusion)
準備
$ sudo apt-get install build-essential $ sudo apt-get install kernel-package libncurses-dev ncurses-dev libqt3-mt-dev
ソースを用意する
$ sudo apt-get install linux-source-2.6.38 $ cd /usr/src $ sudo tar xvfj linux-source-2.6.38.tar.bz2 $ cd linux-source-2.6.38
バグフィックス
via https://bugs.launchpad.net/ubuntu/+source/linux/+bug/505420
$ ln -s /usr/src/linux-source-2.6.38/ubuntu /ubuntu
config
いったん設定初期化してから設定画面を立ち上げる。
$ sudo make mrproper $ sudo make menuconfig
変更するconfig
Core i7 の 4coreでこんな感じの設定にしてみた。
Processor type and features: Processor family > Core 2/newer Xeon Maximum number of CPUs > 8 Preemption Model > Preemptible Kernel(Low-Latency Desktop) Timer frequency >1000Hz
現在の設定をそのまま使うとき
$ sudo cp /boot/config-2.6.35-24-server .config $ sudo make oldconfig
コンパイル
revisionは数値のみ指定できるみたい。適当に日付を指定。
$ make-kpkg clean $ make-kpkg -j8 --initrd --revision=yyyymmdd kernel_image kernel_headers
20~30分かかりました。
インストール
$ dpkg -i ../linux-image-2.6.38_yyyymmdd_amd64.deb
再起動して完了。
TokyuRuby会議03で酔ってきました
というわけで、先週日曜に開催されたTokyuRuby会議03で盛大に酔いを晒してきました。
http://regional.rubykaigi.org/tokyu03
当日の様子: http://togetter.com/li/143092
勧められるがままにビールを空けていたら、いつのまにやら・・・
本当にすいません。
さて、本人は全く覚えてないのですが、抽選LT用に作っていた資料で話したらしいです。お酒って怖いですね。
一応資料上げておきます。
http://gomlog.com/docs/tqrk03/slides.html
最近はAndroid漬けな日々なので、それとRubyをからめてRubotoの紹介です。
迷惑をかけた方々、すみませんでした。
スタッフの皆様、おつかれさまでした。
メソッドの呼び出し方
PHPでは、static宣言なしでもメソッドのstatic呼び出しができてしまう。
で、どっちが速いの?という話。
メモリの使用量も比べてみたかったけど、速さのみ。
<?php require_once 'Benchmark/Timer.php'; class MyTest { public function myMethod() { return; } public static function staticMethod() { return; } } $max = 100000; $timer = new Benchmark_Timer(); $t = new MyTest(); $timer->start(); for($i = 0; $i < $max; $i++) { MyTest::staticMethod(); } $timer->setMarker('static'); for($i = 0; $i < $max; $i++) { MyTest::myMethod(); } $timer->setMarker('static2'); for($i = 0; $i < $max; $i++) { $t->myMethod(); } $timer->setMarker('instance'); $timer->stop(); $timer->display(); /* ------------------------------------------------------ marker time index ex time perct ------------------------------------------------------ Start 1293934691.81032700 - 0.00% ------------------------------------------------------ static 1293934691.85720200 0.046875 21.74% ------------------------------------------------------ static2 1293934691.99593900 0.138737 64.35% ------------------------------------------------------ instance 1293934692.02592700 0.029988 13.91% ------------------------------------------------------ Stop 1293934692.02593700 0.000010 0.00% ------------------------------------------------------ total - 0.215610 100.00% ------------------------------------------------------ */
$ php --version PHP 5.3.3 (cli) (built: Aug 22 2010 19:41:55)
static宣言なしのメソッドをstaticに呼ぶのは遅いってことかしら。
ちなみにrubyだとこうなった。
static methodは存在しないので、class method。このへんはうろ覚えなので、ちょっと自信ない・・・
require 'benchmark' class MyTest def myMethod 1 + 2 end def self.classMethod 1 + 2 end end module MyModule def moduleMethod 1 + 2 end end module MyModule2 def moduleClassMethod 1 + 2 end end max = 100000; Benchmark.bmbm(10) do |x| t = MyTest.new x.report("instance: ") { max.times do t.myMethod end } x.report("class : ") { max.times do MyTest::classMethod end } MyTest.class_eval { include MyModule } t = MyTest.new x.report("module : ") { max.times do t.moduleMethod end } MyTest.extend MyModule2 x.report("module class : ") { max.times do MyTest::moduleClassMethod end } end
Rehearsal --------------------------------------------------- instance: 0.040000 0.000000 0.040000 ( 0.043314) class : 0.050000 0.000000 0.050000 ( 0.049375) module : 0.040000 0.000000 0.040000 ( 0.042887) module class : 0.050000 0.000000 0.050000 ( 0.045320) ------------------------------------------ total: 0.180000sec user system total real instance: 0.040000 0.000000 0.040000 ( 0.042020) class : 0.040000 0.000000 0.040000 ( 0.046069) module : 0.040000 0.000000 0.040000 ( 0.041350) module class : 0.040000 0.000000 0.040000 ( 0.045474)
$ ruby --version ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10]