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

カーネルバージョンを変える

Makefileの4行目を書き換える

EXTRAVERSION=.3 

コンパイル

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]