Rの基礎とプログラミング技法

最近R関連の本を多めに読んでいるが、実はOS自作入門にもちょっと脱線しかけている。その煽りをくらってiKnowがやれていない。

ProductName Rの基礎とプログラミング技法
U.リゲス
シュプリンガー・ジャパン(株) / ?円 ( 2006-10-22 )


中古本で安かったので購入。早速斜め読み。R言語に関して解説。特に4章あたりは言語としてのRを知るのに丁度よい。

  • クロージャ使える
  • 遅延評価
  • 名前空間が導入されている
  • (実は)オブジェクト指向言語

クロージャはこんな感じ

> a <- function (y) {return(function (x){return(x + y)})}
> b <- a(3)
> b(4)
[1] 7

多値は受け取れないのかな?

> mv <- function (x,y){return(list(x,y))}
> mv(1,2)
[[1]]
[1] 1

[[2]]
[1] 2

> list(r1,r2) <- mv(1,2)
 以下にエラー list(r1, r2) <- mv(1, 2) :  オブジェクト "r1" は存在しません

ESSモードの設定(ちょっとだけ)

Emacs/cperl-mode の設定 ( ちょっとだけ )が使いやすい。

というわけで、ESSでも似たようなことをやりたかったので自分の.emacsに追加。

(add-hook 'ess-mode-hook '(lambda ()
          (local-set-key "\C-j" (lambda () (interactive)(insert "<-")))
          ))

これでCtrl-jで<-が挿入されるので便利。

よこぜきでお買い物

ちょいと富士宮に出かける用があったので、ついでによこぜきで年末年始の日本酒を物色。

  • 國香の特別純米の中取り
  • 義侠の純米
  • 十四代の純米吟醸(山田錦)

十四代はカードにスタンプが丁度溜まったので予期せぬ購入。一升瓶三本買ったので、冷蔵庫が圧迫されるとU隊長には不評。

マイ冷蔵庫が必要だなあとつぶやいたが、これは高いと却下されそうな予感。一升4,5本入る丁度いい冷蔵庫が欲しい。

きろく 新酒

職場のある御殿場がとても寒くて、今夜は熱燗かお湯割りでも飲みたいなと。 酒のいわせさんで山ねこかきろくでも買うか立ち寄ったら、新酒が入ってると薦められたので試してみた。

きろく

お湯割が旨いと言われたので、早速お湯割で。うーんうまい。でもちょっとすっきりしてるからストレートもいいんじゃないかなとストレートで呑んでもこれまた旨い。

っていうか、家に帰ってきたら全然寒くないので、お湯割り意欲が薄れた。ストレートで。日本酒だとぬる燗とか燗冷ましとかあるんだけど、焼酎でぬる焼酎とかあんだろうか?

普通にストレートで呑んで、チェイサーお湯にするってのはどうだろうか。TODOで。

DUB CONFERENCE

クリスマスRMX

dub conference

10年以上経ってんのに色褪せない。

ProductName HIROSHI FUJIWARA IN DUB CONFERENCE
藤原ヒロシ
ビクターエンタテインメント / ¥ 2,345 (1995-06-21)
通常24時間以内に発送

竹村延和のアルバムもそろそろ。

継続をつかみかけ

なんとなく掴みかけてきた。

call/cc 入門

continuation は「continuation が呼ばれると、continuation が作られた call/cc の外に、引数を call/cc の返り値としてジャンプする」というのが正しい振る舞いです。

gosh> (+ 5 (call/cc (lambda (cont) (* 10 10))))
105
gosh> (+ 5 (call/cc (lambda (cont) (cont 10))))
15
gosh> (+ 5 (call/cc (lambda (cont) (cont (+ 1 2 3)))))
11

次にやる処理を包み込んでひっくり返すというイメージよりは、単純にセーブポイントと考えたほうがよいのかな。call/ccの返り値としてジャンプ

gosh> (define cont #f)
cont
gosh> (+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))
15
gosh> (cont 30)
35
gosh> (cont (+ 1 2 3))
11

さてcall/ccを通って何かが出て行くというイメージだと、二枚がけとかできそうな感じなのでやってみる。

gosh> (+ 10 (call/cc (lambda (d) (begin (set! cont2 d) 
(+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))))))
25

セーブポイントはcont2とcontの二箇所。cont2をよべば(+ 10 cont2の返り値),contを呼べば(+ 10 (+ 5 contの返り値)が評価されるはず。

gosh> (cont 3)
18
gosh> (cont2 3)
13

おーきた。call/ccからジャンプしてきた。なんつーかperlのデバッガで作業してるみたいな感覚だ。

MeadowでESSを使う

使ったことないってのが謎なんだけど、Rはvanillaでスクリプトとして流すかRSOAPとかでしか使ってなかったので、あんま対話環境にこだわらなかったので。

Meadow で R-modeを参考にしてインストールしたけど、Rの起動画面が文字化け。

;;ESS
(load "C:/ess-5.3.6/lisp/ess-site")
(require 'ess-site)
(setq auto-mode-alist
     (cons (cons "\\.r$" 'R-mode) auto-mode-alist))

(setq inferior-R-program-name "C:/Program Files/R/R-2.6.1/bin/Rterm.exe") 
(setq ess-ask-for-ess-directory nil)
(setq ess-pre-run-hook
   '((lambda () (setq S-directory default-directory)
                (setq default-process-coding-system 
                 '(shift_jis-unix . shift_jis-unix))
    )))

と設定したら文字化け解消。

まだ、ESSの快適さは実感してないけど、これからかな。

MAWP14章はProbability

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送

こういうのはRに任す。確率分布とか充実してる。

15章も統計なのでRで。

16章は微分とかsmoothingとかSICPな感じなので流し読みして終了。

ってことで、MAWPも終了。ソート、マトリックス、グラフ、文字列マッチング、暗号あたりが面白かった。

ElGamal暗号

ProductName Mastering Algorithms With Perl
Jon Orwant
Oreilly & Associates Inc / 2553円 ( 1999-07 )


位数が大きな群の離散対数問題が困難であることを安全性の根拠にした暗号化方式

巡回群を利用しているらしい。そういや、ガウス平面上の回転って数学ガールの3章で読んだなと。

ProductName 数学ガール
結城 浩
ソフトバンククリエイティブ / 1890円 ( 2007-06-27 )


modも回転か何かで考えることが出来るのかね。

MAWP 13章はCryptography

アンゴウよりアンコウ+日本酒のほうが好きなんだけど。

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送

というより、数式を避けてただけだった。ちゃんと読んでみると暗号も面白いかも。 法とか合同をほうとかいいながら読んでた。MAWPの説明だけだと分かりにくかったのでRSA暗号を参考にした。

MAWPにあったSSLeayっていうモジュールがなかったのでCrypt::RSAで遊んだ。

use Crypt::RSA;
use Data::Dumper;

my $rsa = new Crypt::RSA;

my ($public, $private) =
  $rsa->keygen (
        Identity  => 'Kzfm Ohkw <xxxx@gmail.com>', 
        Size      => 1024,
        Password  => 'drumnbass',
        Verbosity => 1,
           ) or die $rsa->errstr();

print Dumper($public);

公開鍵

$VAR1 = bless( {
                 'e' => 65537,
                 'n' => '12390802849571403672579795755491999585878694
                         2679376999148135793744998012786068647404317033
                         4506694188629007869741465370712440443624446804
                         8813574622838502197241514075336790104367156693
                         3189856420057871502127203513391621825674392638
                         5941923712730877023358276499112454722795081438
                         05979844138326376749179360228658183',
                 'Version' => '1.91',
                 'Identity' => 'Kzfm Ohkw <xxxx@gmail.com>'
               }, 'Crypt::RSA::Key::Public' );

おー65537乗してnでmodるのか。