hiratake55 の作業メモ

R, Javascript, Python, Linux and Hadoop

BootCamp を使って MacBook に 64bit版 Windows 7 をインストールする

MacBook (late2009) の BootCamp 上に Windows 7 Home Premium (64bit) をインストールする方法。

1. Boot Camp アシスタントを起動して、Windows 用のパーティションを作成する

  • アプリケーション→ユーティリティ→Boot Camp アシスタント で起動できる。


  • 「インストールと設定ガイド」をプリントアウトする。以後、このマニュアル通りに作業を進める。
  • Windows 用の領域を作成する
    • Mac に約120GB、Windows に約120GB 割り当てておいた。
  • 終わったら、Windows 7 のインストール用 DVD を挿入して再起動。

2. Windows 7 をインストール

  • インストール場所を「BOOTCAMP」パーティションに指定する以外、普通どおりにインストール。

3. Windows に BootCamp ドライバをインストール

  • MacBook に付属の Mac OS X インストールディスクを使って、ドライバ類をインストールする。
  • ディスプレイドライバなどの他、専用のユーティリティツールがインストールされる。
  • 全てのドライバが一括でインストールできるので、非常に楽。

4. BootCamp 3.1 をインストール

おわり

作業は以上でおわり。今のところ、不具合などなく動いています。

おまけ

  • Windows 7 は、パーツとセットで DSP 版を買ったほうが普通にお得です。
  • バルクメモリ 2GB (DDR3-1066)×2本 + DSPWindows 7 Home Premium 64bit のセットで¥23,560 でした。
  • メモリを買ってるので、ライセンス的には問題ないはずです。


もちろん、メモリは 4GB (2GB×2) に交換して使っています。

AS3 で現在のディレクトリの URL を返す

例えば、以下のように、HTML の中に、Flash (SWF) をはりつけていたとする。

HTML ページ
http://aaa.bbb.com/ccc/ddd.html
SWF ファイル
http://aaa.bbb.com/ccc/eee/fff.swf

この時、swf ファイルのディレクトリを取得する場合は、以下のように、loaderInfo クラスの情報を取得して正規表現でパースすればよい。

var url:String = loaderInfo.url;
var re:RegExp = /^(.*\/).*$/;  
var currentDir:String = url.replace(re,"$1");
trace(currentDir); #=> http://aaa.bbb.com/ccc/eee/

簡単。

R で 変数の名前と値をまとめて表示する Print 関数を作った

変数の名前と値をペアで表示するだけのデバッグ用関数。変数だけでなく、ベクトルや配列、文字列、関数、データフレームにも対応しています。
引数の数は可変長なので、いくつでも大丈夫です。

Print <- function(...){
 key <- as.list(substitute(list(...)))[-1L]
 val <- list(...)
 mapply(
  function(k, v){
   cat(k, "= ")
   if(!is.matrix(v) && (is.logical(v) || is.numeric(v) || is.complex(v) || is.character(v))){ cat(v, "\n") }
   else{ cat("\n"); print(v); cat("\n") }
  },  
  key, val)
 cat("\n")
}

使い方 その 1

基本的な使い方は、このようになります。

> a<-1; b<-2; c<-3; d<-4; # 4 つの変数
> Print(a, b, c, d)

a = 1
b = 2
c = 3
d = 4

使い方 その 2

引数の型がごちゃ混ぜでも大丈夫です。

> bool <- TRUE # 論理値
> num <- 1 # 整数
> cpl <- 1+1i; # 複素数
> str <- "Hello." # 文字列
> vec <- 1:10 # ベクトル
> mat <- matrix(c(1, 2, 3), 3, 2) # 2×3 の行列
> Print(bool, num, cpl, str, vec, mat, plot, iris)

bool = TRUE
num = 1
cpl = 1+1i
str = Hello.
vec = 1 2 3 4 5 6 7 8 9 10
mat =
     [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]    3    3

plot =
function (x, y, ...)
{
    if (is.function(x) && is.null(attr(x, "class"))) {
… 省略 …

iris =
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
… 省略 …

毎回 Print 関数を入力するのが面倒な人は .RProfile に書いておくと良いでしょう。


(追記 2010/02/01 22:00)
Twitter 経由で @syou6162 先生からアドバイスいただいたので、大幅に修正した。id:syou6162++

R-php をインストール & 使ってみた

Web ブラウザからサーバ上の R を実行できる PHP スクリプトR-php をインストールしてみました。
ちなみに、R-php 自体は 2005 年から存在し、特に新しい技術、という訳でもないです。


以上の図のような構成で動作しており、計算はサーバ側で行います。

今回使用したサーバは、CentOS 5.4。以下、インストールの方法。作業は全て root で実行します。

1. Apache, PHP, MySQL, ImageMagick のダウンロード

既にインストール済みの場合は省略。以下のように、すべて yum でインストール可能。

# yum install httpd httpd-devel php php-devel php-mbstring php-mysql mysql mysql-server ImageMagick ImageMagick-devel

2. R をインストール

既にインストール済みの場合は省略。RHEL5 用を流用します。

# yum install libgfortran xdg-utils perl-File-Copy-Recursive
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/R-2.10.0-2.el5.i386.rpm
# rpm -ihv R-2.10.0-2.el5.i386.rpm

うまくいかない場合は、下記の RPM をインストール。

# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/R-core-2.10.0-2.el5.i386.rpm
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/R-devel-2.10.0-2.el5.i386.rpm
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/libRmath-2.10.0-2.el5.i386.rpm
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/libRmath-devel-2.10.0-2.el5.i386.rpm
# rpm -ihv R-core-2.10.0-2.el5.i386.rpm
# rpm -ihv R-devel-2.10.0-2.el5.i386.rpm
# rpm -ihv libRmath-2.10.0-2.el5.i386.rpm
# rpm -ihv libRmath-devel-2.10.0-2.el5.i386.rpm

詳細はここ (CentOS 5.2 に R をインストールする - CMOSにっき) を参照。

3. R-php をダウンロード & インストール

R-php の公式サイト (http://dssm.unipa.it/R-php/) から最新版 (1.0) をダウンロードします。

# wget --content-disposition 'http://dssm.unipa.it/R-php/?cmd=downPack&pack=R-php-1.tar.gz'
# tar xvzf R-php-1.tar.gz
# rm R-php-1.tar.gz
# mv R-php-1/ /var/www/R-php/

4. アクセス制限の設定

計算資源を誰でも使用できる状態は、さすがにマズいので、Digest 認証を設定します。

# vi /etc/httpd/conf.d/r-php.conf
Alias /R-php "/var/www/R-php/"

<Directory "/var/www/R-php">
    AuthType Digest
    AuthName "R-php" 
    AuthDigestDomain /R-php/ 
    AuthUserFile /etc/httpd/conf/.htdigest_rphp
    Require valid-user
</Directory>

# htdigest -c /etc/httpd/conf/.htdigest_rphp 'R-php' R-php
# service httpd restart

5.データベースの設定

R-php が、MySQLに R というデータベースを作成します。
MySQL 側で新しいデータベースを作成する、等といった作業は不要です。

次のファイルを編集します。

# vi /var/www/R-php/include/conf.php
<?
$dbuser = "(MySQL のユーザ)";
$dbpass = "(MySQL のパスワード)";
?>

6. 画像出力の設定

R-php では、R が出力する画像を ImageMagick を使って、PS 形式から PNG 形式に変換しています。
しかし、現在のバージョンの R では PDF 形式がデフォルトなので、変更します。

/var/www/R-php/R/pages/result/index.php
# chmod +w /var/www/R-php/R/pages/result/index.php
# vi /var/www/R-php/R/pages/result/index.php
<?
...
/* 44 行目付近 */
//delfile("./pages/tmp/$temp/*.ps"); //コメントアウトする
delfile("./pages/tmp/$temp/*.pdf"); //追加

/* 57 行目付近 */
//exec("$convert_command ./pages/tmp/$temp/Rplots.ps ./pages/tmp/$temp/R.png"); //コメントアウトする
exec("$convert_command ./pages/tmp/$temp/Rplots.pdf ./pages/tmp/$temp/R.png"); //追加

/* 63 行目付近 */
//exec("$convert_command -antialias -rotate 90 $fn ./pages/tmp/$temp/$nn.png"); //コメントアウトする
exec("$convert_command -antialias $fn ./pages/tmp/$temp/$nn.png"); //追加

...
?>
/var/www/R-php/R-gui/pages/result/index.php
# chmod +w /var/www/R-php/R-gui/pages/result/index.php
# vi /var/www/R-php/R-gui/pages/result/index.php
<?
...
/* 77 行目付近 */
//delfile("./pages/tmp/$temp/*.ps"); //コメントアウトする
delfile("./pages/tmp/$temp/*.pdf"); //追加

/* 106 行目付近 */
//exec("$convert_command ./pages/tmp/$temp/Rplots.ps ./pages/tmp/$temp/R.png"); //コメントアウトする
exec("$convert_command ./pages/tmp/$temp/Rplots.pdf ./pages/tmp/$temp/R.png"); //追加

/* 112 行目付近 */
//exec("$convert_command -antialias -rotate 90 $fn ./pages/tmp/$temp/$nn.png"); //コメントアウトする
exec("$convert_command -antialias $fn ./pages/tmp/$temp/$nn.png"); //追加

...
?>

7. 動作確認

http://(サーバのアドレス)/R-php/ へアクセス。

使ってみた


フォームにプログラムを入力、または、ファイルをアップロード。


こんな具合に出力結果が表示されます。

iPhone からも使えます

もちろん、iPhone など、フルブラウザが搭載されたモバイルガジェットからも実行できます。


ggplot2 パッケージを使用した例

FAQ

パッケージの使用は出来る?
root で R を起動してインストールしたパッケージは、library() 関数で問題なく動作します。
パッケージのインストールは出来る?
install.packages(), file.remove(), scan() など、"危険なコマンド" は実行できないようになっています。
対話型の操作は出来る?
対話型の操作 (たとえば、BRugs の codamenu() など) には向いていないでしょうね。
ヘルプは参照出来る?
未確認。

感想

  • ところどころイタリア語が表示されて驚く。
  • AjaxActionScript を駆使すれば、もっと利便性が向上すると思う。特に、ESS 的な機能を実装したい。
  • 例えば、
    • 選択範囲を実行
    • カラースキーマ (WYSIWYG エディタ)
    • データフレームを見ながらコーディング
    • ヘルプの表示
    • Gmail 風の自動保存機能
    • 認証機能の標準装備
    • 実行結果の自動メール送信機能 など。
  • そもそも、2006 年からメンテナンスされていないっぽいので、作るなら、1 から作り直した方が良さそう。
  • 時間に余裕があれば、SourceForge などのオープンソースプロジェクトで改良版作りたいですね。

ダウンロードはこちらから

R-php
http://dssm.unipa.it/R-php/


眠りながら書いたので、間違っている点などあるかもしれません。見つけた方は指摘ください。

root 宛てのメールを Gmail へ転送する

サーバのログやアラートなどを root 宛てにメールで送るように設定していますが、root から通常使用するメールアドレス (例えば Gmail など) へ転送する方法をいつも忘れるので、メモ。

# vi /etc/aliases

# 末尾に追加する
root:           ******@gmail.com

設定したら、newaliases コマンドで変更を適用する。

# newaliases