You can read this blog in any language using google translate as follows:

Goto http://translate.google.com/
Paste URL in the box and select "Japanese for From Language" and "To Language". Then click "Translate".

English translated pages are here:
http://bit.ly/xPuXoy

你可以閱讀這個博客,在任何使用“Google”的語言翻譯

本ブログのアクセス統計: 60万アクセスを達成しました。ご訪問ありがとうございました。

60万アクセスまでの経過

2009年12月に始めた本blog。2011年7月ごろに10万アクセスを達成し、2011年12月13日には15万アクセスを達成。
その後、私も更新しておらず、アクセスは少し減りましたが、3月1日には18万アクセス。2012/4/18に20万アクセス、2012/8/21に25万アクセス、2013/1/18に30万アクセス、2013/12/17に40万アクセスを達成しました。しばらく見ていなかったら、2015/5/1に50万2584アクセスになっていました。またまた、しばらく更新しないうちに、2017/6/11に60万7197アクセスになっていました。久しぶりに更新します。

2011年10月23日日曜日

MacでBSDツールを利用する・大学の電子ブック


大学の環境を利用するため以下のキャラクターベースのツールを設定したので解説する。すべて無料である。いまのところ、私の備忘のために項目だけだが、そのうち補充する。
  • SSHによるremote login
  • FUSE (Fuse4x)とsshfsを用いたSSHを経由したremote mount (ファイル共有)
    • MacFuseは、サポートが打ち切りになったらしいし、sshfsとの相性が悪く、dialog boxが出てきて、うまく使えなかった。
  • X11のSSHフォワーディング
    • 大学のサーバへのfirefoxをinstallして遠隔ブラウズの確認、Stanford大工学部図書館所蔵の4万冊の電子ブックが家で読める。O'Reillyをはじめ、めぼしいものは、ほとんどありそう。通常は、閲覧者数の制限もかかっていないとのこと。(後述する、後日別記事に分離する予定)
  • rsyncによる差分バックアップ
    • FUSEでマウントした作業データのlocal diskへのコピー。ローカルデータのNASへのバックアップに利用する。time machineのように特定時点には戻れないが、backupしたファイルの中身に随時参照できること、バックアップ項目の制御が楽なのが利点だと思う
    • 日本語ファイル名の漢字コードがおかしいものがあるらしく、途中で止まる
    • bashによるバックアップスクリプトのサンプル
    • そのうち、cronを使いつつ、mountでトリガをかけて、自動化したいと思っている
  • emacsによる編集
    • .emacsのサンプル
    • terminal内で、ATOKの英語・日本語切り替えがうまくいかないので調査中である
  • mailをemacsで読む。文字化けの対策やらメイルヘッダをいじったりしたいので、融通の利くemacsでのメイルプログラムを立ち上げたい。
Macの概要については、以下に書いた。
2011年10月23日日曜日: Macはすごい
SSHによるリモートアクセス) 
ツールはすべてMacに最初から備わっている。
  • キーペアを生成する
    • ssh-keygen -t rsa -C "Comment" など
      Passphraseで改行をいれると秘密鍵のPasspharaseなしになるが、秘密鍵が盗まれると危険なので、秘密鍵とペアで認証に必要になる、パスフレーズを設定した方が良い。また、秘密鍵は、networkやMailでは送らない。複数のクライアントPCからリモートログインしたいときには、PCごとにキーペアを変えておけば、盗難にあったときに、そのPCからのログインだけ無効化できる
    • ssh-keygenの使い方は以下など) http://www.21linux.com/archives/2005/12/sshkeygen.html
      や https://drupal.org/node/1070130
    • キーは、~/.sshに生成される。rsaの場合には、デフォルトでは、id_rsaが秘密鍵、id_rsa.pubが公開鍵である。公開鍵はtextファイルである
    • 公開鍵を、サーバの~/.ssh/authorized_keys に書き込む。いくつでも公開鍵は登録できる
    • キーペアを用いたSSH認証は以下に説明がある。http://www.c.csce.kyushu-u.ac.jp/kb/wiki/index.php?ssh%20%A4%C7%A5%D1%A5%B9%A5%D5%A5%EC%A1%BC%A5%BA%C7%A7%BE%DA
  • sshでログインする
    • ssh -Y -i ~/.ssh/id_rsa USER_NAME@HOST_NAME
    • -Y オプションは、X11トンネリングをするためにつける。ないしは、/etc/ssh_config に、ForwardX11Trusted yes  の行を入れておく
      編集のやり方は、sudo vim /etc/ssh_config など
    • 初回だけ、passcodeを要求されるが、次回からはpasscodeはキーチェインに保存されるのか要求されない。これは以下の利点がある
      • ログインが簡単で高速
      • ログイン時間に影響しないので、秘密鍵には、非常に長い複雑なパスコードをつけて、安全性を高めることができる
      • パスコードを毎度入れないので、盗み見による不正ログインの危険がない。PCを物理的にアクセスされるか・盗難されない限り安全である
      • 万一PCが盗難にあっても、サーバ側の~/.ssh/authorized_keys を編集すれば即刻無効化できる。なにからなにまで、自己完結できるのが、私は好ましいと思う
      • キーペアのビット長を長くしておけば、さらに安全である。これは、ssh-keygenの" -b キー長 " のオプションで指定できると思う
FUSEによる、SSH経由のリモートファイル共有)
  • http://www.macupdate.com/app/mac/39025/fuse4x よりFuse4xを取得。Macのインストーラになっているので、そのままインストールする。
  • https://github.com/downloads/fuse4x/fuse4x/sshfs-2.3.0.zip を取得。以下のコマンドで、sshfsを/usr/local/binに展開。
    • sudo unzip sshfs-2.3.0.zip -d /
  • local_mountpoint のdirectoryをMacに作っておく
  • sshfs USER@HOST_NAME:/home/satoshi   local_mountpoint    で、マウントする
  • mount コマンドで、mountの様子が見られる
  • terminalからは、local_mount  の名前でmountされて見えるが、finderアプリからは、違う名前で見える

sshによるX11のフォワーディング)

terminalからsshでログインする際に、先にsshに書いたようにTrustedである、-Yオプションをつければ良い。-Xオプションでうまくいくこともある。
DISPLAYのshell変数が設定され、x11対応のプログラムを立ち上がると、ssh経由でX11のデータが転送され、Mac側にwindowが立ち上がる。Mac側のxserverも自動的に起動される。
まず試すにはxeyesとかxclockがお手軽だろう。

emacsは、DISPLAY変数をみて、X11 forwardingされているとリモートウィンドウを立ち上げる。結構遅いので、これがいやな場合には、emacs -nw としてnon windowモードで立ち上げればよい。

大学内のLAN, WLANであれば、電子ブックが読めるので、以下のサイトから、サーバにfirefoxをinstallした。これはローカルにダウンロードして、FUSE+sshfsにマウントしたdiskから転送できる。

http://mozilla.cdn.leaseweb.com/firefox/releases/latest/linux-x86_64/en-US/

画像を飛ばしているので、かなり遅い。
実はもっと良いやり方がある。
  1. http, httpsをSSHでforwardingする。これは試していないが、以下のようにできると思う。
    ssh -L10080:host.stanford.edu:80 -L10443:host.stanford.edu:443 -Y -i ~/.ssh/id_rsa satoshi@host.stanford.edu

    最初の引数でhttpのポートである80を10080からforwardし、次の引数でhttpsのポートである、443を10443からフォワードするように、host.stanford.eduに指示しつつ SSHにuser名 satoshiでログインするという設定である。これに対しては、ブラウザに
    http://searchworks.stanford.edu:10080/ のように : の後ろに、local port名を指定してloginすれば良い。
  2. ところがである、ちゃんと大学は、そういうproxyを用意してくれていた。
    windows, Mac, iPhone, iPadでの設定の仕方も丁寧に書いてあった。このproxyを設定すると、libraryの電子ブックにアクセスしようとすると、stanford大学のlogin IDとパスワードを要求され、loginが必要になる。学内のWiFiならそれは必要ないが、そもそも学内netに接続するために、loginの設定がされているからである。
    この設定をして、自宅でもどこでも電子ブックが読める。もはや参考書に金を払い、重たい本を持ち運ぶ必要はない。MacbookAirと、MiWiをinstallして3Gのルータになった脱獄iPhone(以下参照)だけがあればすむのである。これはまさに理想の環境である。
大学の図書館の電子ブック)

Safariというサイトなど、複数と契約している。webで以下のように読める。これが上記のX11フォワードとfirefoxで自宅で読めるようになった。図書の貸し出しといっしょなので、IDを登録してもらえば、local なブラウザにloginして読めるだろう。 上記のProxy設定でこれは解決した。



電子ブックの利点は、
  • 本を持ち歩く必要も無い
  • 図書館に出向く必要も無い
  • 原則アクセス数リミットがないので、返却を待つ必要も無い
  • マウスオーバで辞書が引ける
IDを登録してもらうと自宅からloginしても読めるらしいが、 前節で示したProxy設定で解決した。これなしでアカウントにログインして図書館をアクセスしてもサンプルとなりページの半分が読めない。

電子ブックの蔵書数)

工学部図書館には4万冊の電子ブックがあり、Python, C++など、ほとんどの本はどこからでも読める。webで図書館のhomepageを見ると、Stanford大学全体で、計6,627,606冊のbook,Journalなど検索対象がある模様。(紙の書籍やマイクロィルムを含む)

"C++ program"で検索すると55,493冊がhitする。ただし、C,C#も引っかかっている。 O'Reillyなど有名どころの本はほとんどある。Infinibandだと18冊である。かなり偏りはある。

ほとんどの電子ブックは以下のsafariと契約している。アカウントなしでは、トップページにしかいけないが、個人契約もできるようである。

   http://proquest.safaribooksonline.com/

 WiFiが完備しているので、学内なら、芝生の上でもカフェでも、webで本が読める。重たい本を持ち運ばずに、Macbookだけで、どこでも、好きな本が読め、仕事ができる。環境を変えると、脳が刺激され発想に幅が出るように思う。理想の環境に一歩近づいた。

bashによるshell script) 
Macのxterminal, terminalのshellは、bashである。私は、長いことcshellを使ってきたが、制御性等を考えると本流はbashなどBourne Shell(ボーンシェル)系であろう。shell scriptは、chmod +x ファイル名 で、実行属性を付けておけばよい。別に.batとかいった拡張子はいらない。

 Bourne Shell(ボーンシェル)    http://ja.wikipedia.org/wiki/Bourne_Shell

ちなみに/bin/shも/bin/bashも同じbashである。以下
$ /bin/sh --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc. 
$ /bin/bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.
ATOKを使っているが、terminalでは、設定した入力モード切替に設定したCtrl-Jが通らない。標準のCtrl-Shift-ZやCtrl-Shift-Cは通る。bashがCtrl-Jを食っているのかと思い、~/.inputrcを変更してみたがうまくいかない。
.inputrcについては以下) http://x68000.q-e-d.net/~68user/unix/pickup?~%2F.inputrc

unixのbashなどのshellは、shell scriptの先頭に以下の行をいれておけば、任意のインタプリタを用いた、scriptが書ける。windowsのbatファイルより、はるかに柔軟性が高い。たとえば、Max OS-Xに最初から入っている /usr/bin/perl を使う場合には、以下のように入れておけば良い。-fというperlのオプションは、起動を高速化するものだと考えておけば良い。bashの機能は、windowsとは比べものにならないくらい高機能で柔軟性が高い。unixは、1970年台から世界中の優秀な研究者達が、オープンソースとして改良を加え続けていのだから当然である。
#/usr/bin/perl -f
bashなどのShell scriptを使うと高度な処理が簡単にできる。例えばフォルダにあるファイル名の一部を付け替えるのは、 ターミナルウィンドウから

$ for   i   in *

> do
> mv $i `echo $i|sed s/18Dec/17Dec/`
> done

とやることで、18Decの部分を17Decに全部置き換えてくれる。これとfindコマンドなどを組み合わせれば、任意のフォルダ配下のファイル名の一括置換もできる。小さなtextコマンドを組み合わせることで何でも出来るのが、unixの美学なのである。Macでは文字コードがUTF-8に統一されているので、これらの検索やファイル名には日本語も使える。


rsyncによるバックアップ)

/user/bin/rsync は、Macに標準で入っている。

rsyncとは)   http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html
rsyncの使い方) http://futuremix.org/2011/02/rsync

さきのbashのシェルスクリプトを使うと以下のようなバックアップコマンドが作れる。
  • SRC変数に、バックアップしたいソースのdirectory (MacやWindowsでいうfolder)を入れておく。
  • TARG変数に、バックアップ先のdirectoryを入れておく。これは、NASのback先である。
  • 除外したいファイルやdirectoryのリストをEXCLに指定したファイルに書いておく。
このシェルスクリプトの引数は、$@で、rsyncに渡る。シェルスクリプトの名前をnas_backup.sh とすると、nas_backup.sh -n で、rsyncに引数 -n が渡り、rsyncは、表示のみする。どのファイルをコピーするかのリストだけが得られる。コピーはしない。

--- nas_backup.sh ---
#! /bin/sh -f                                                                                                                        
echo
echo '----------------'
echo backup to NAS on `date`
OPT="-av -delete $@"
# OPT="-avn -delete" # for debugging -- dry run. --> -n option with this scripts force dry run.                                      
EXCL=--exclude-from=$HOME/scripts/rsync_exclude.list
SRC=(~/Desktop/ ~/Music/ ~/work/)
TARG=/Volumes/disk/Backup/MacbookAirHomeRsync/      # NAS mount point on Mac OS-X                                                    
for f in ${SRC[@]}
do
 echo Running : rsync $OPT $EXCL $f $TARG
 rsync $OPT $EXCL $f $TARG
done
 ---
$HOME/scripts/rsync_exclude.list  の形式は以下の通り。
  • # から始まる行、#の後ろはコメント
  • - から始まる行が、除外ファイル。正規表現で指定が可能。directoryの場合には、- で終わる
  • + から始まる行は、除外から再度外したいファイルやdirectory
-- execlude.listのサンプル --
# files excluded from ~/Desktop/
- UnUsed/
- work/
# files excluded from ~/Music/
# files excluded from ~/work/
- iTunes\ Media/
# below is precious
+ iTunes\iTunes\ Media/Mobile\ Applications/
- *.dmg
- *~
-- 
emacsによる編集)

~/.emacsを置くことで、起動時設定が変更できる。これはelispというlisp言語もどきで書かれている。

開発元Gnuのelispリファレンス) http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp.html
簡単な説明)  http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/elisp_primer.html

.emacsのサンプル)
セミコロン ";" 以下はコメントになる。
とりあえず最初の3行があれば、私は使える。yatexモードは今は使っていないが、参考に残した。
1行目がないと、ctrl-hはヘルプになってしまう。2行目で、markをアサインし、3行目でundoをctrl-x ctrl-uにキーアサインしている。
--

(global-set-key "\C-h" 'delete-backward-char)
(global-set-key "\C-@" 'set-mark-command)
(global-set-key "\C-x\C-u" 'undo-only)
;; yatex setting                                                                                                                    
(setq auto-mode-alist (cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))
(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)
(setq tex-command "/Users/satoshi/Library/TeXShop/bin/platex2pdf-euc" dvi2-command "open -a TexShop")
(add-hook 'yatex-mode-hook
          '(lambda ()
             (setq buffer-file-coding-system 'euc-japan-unix)))
--

lrunというコマンドを作った)
#/bin/bash -f
# run with logfile
fname=`date +%Y%m%d`.log
date +"%n----Log: %c ----%n$*%n" >> $fname
cmd="$* 2>&1  | tee -a $fname"
echo log is written to $fname ....
# echo $cmd
eval $cmd
たったこれだけ。
lrun ls -l とかlrunのうしろにコマンドを打つ。すると、20120105.logみたいに日付名のファイルに、標準出力と標準エラー出力を追記する。なければ新規に作る。
どうじに通常通り画面にも出力を表示する。logファイルには、----Log: 日付 ---
の行を挿入するので、----Log: でサーチすれば、区切りに飛べる。
bashの機能と、date, teeという2つのコマンドの組み合わせで、簡単にこういうものが作れる。

teeについてはココ) http://x68000.q-e-d.net/~68user/unix/pickup?tee
bashのリダイレクトについてはココ)  http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8

--
Disk spaceが足らなくなってきた)

2012/1/13追記:

MacbookAirは256GBのSSDだが空きdiskが大分減ってきた。調べるのは、terminal windowから、

du -md 4 / | sort -rn | tee ~/du.log

で一発。man du, man sortなどで調べれば使い方も直ぐに分かる。
ま、perlやpythonのスクリプトにしても良いが。
ゴミ箱、iTunesライブラリと写真が大量に食っていた。ゴミ箱は消去。写真はNASに置いて、古い写真は消すことにする。
ベースがBSD UNIXのMac OS-Xは本当に良い。iOSもunixなので脱獄すれば自由に使える。Androidはベースがlinuxである。これは元々ルートになれるものもある。
いまどきベースのOSが意味不明なのは、MS windowsくらいなものかも。
--
ファイル名を付け替える)

for 文は、do xxx; のように、1行にまとめて書ける。以下では、ファイル名中のPR0をPR10に一気に書き換える処理を1行に書いている。

for i in *.JPG; do j=`echo $i | sed -e 's/PR0/PR10/'`; mv $i $j; done

--
残りは後ほど。。
blog comments powered by Disqus