2014年5月19日月曜日

Mac OS X+ Virtual Box + CapstanでOSvを動かす


OSvもくもく会#1 〜OSvで遊んでみよう〜 - connpass に行って,OSv を動かしてきたので,それのまとめ.




この記事では,OSv のイメージのダウンロード,実行を勝手にやってくれるCapstan というアプリケーションを使って,OSv を動かす方法を書く.

以下では,OSv のデフォルトイメージをVirtualboxで動作させ,ホストマシンからSSH で接続する.



動作環境





  • マシン: Mac Book Air 2011


  • OS: Mac OS X 10.9.2


  • Virtual Box: version 4.2.18









前提




Virtual Box は既にインストールされているものとします.






Go のインストール




Capstan はGo で書かれている.

このため,Capstan を実行するために,まずGo をインストールする.




以下のURL から,Mac 用のパッケージである go1.2.2.darwin-amd64-osx10.8.pkg ダウンロードして,インストールする.

https://code.google.com/p/go/wiki/Downloads?tm=2




Go はパッケージをインストールしただけでは動作せず,以下のように環境変数を設定しないといけない.




$ export GOROOT=/usr/local/go 
$ export PATH=$PATH:$GOROOT/bin


GOROOT はGo がインストールされた先を設定する.

上記のパッケージからインストールした場合だと /usr/local/go になる.

また,2行目では,Go の実行ファイルにパスを通している.






Capstan のインストール




Capstan のインストールには,go のパッケージマネージャ的なものを使う.

使う前に,パッケージマネージャがインストールする先を GOPATH という環境変数で設定する必要がある.

今回は, $HOME/go にインストールするようにした.




その後, go get で,Capstan のGit リポジトリを指定し,インストールする.




$ mkdir $HOME/go
$ export GOPATH=$HOME/go
$ go get github.com/cloudius-systems/capstan








Capstan によるOSv の実行




Capstan の実行ファイルは $HOME/go/bin 以下にある.

下記のようにCapstan を実行すれば,OSv のデフォルトイメージをダウンロードして,起動する.




cd $HOME/go/bin
./capstan run cloudius/osv


初回は,イメージをダウンロードするため,時間がかかる.

2度目移行は,既にダウンロードされたイメージを実行するので,あまり時間はかからない.




上記コマンドによってOSv が動作すれば,ターミナルに [/] % と表示される.

これは,OSv のデフォルトイメージに入っているシェルである.

ls とか ifconfig が使える.

使えるコマンド一覧は help コマンドで表示できる.




上記の起動コマンドでは指定していないが, -p オプションを付けることで,VMMを指定することができる.

Virtual Box であれば, -p vbox といった感じ.

Virtual Box しか入ってない環境ならば,上記のように,何も指定しなくても勝手にVirtual Box 用のイメージをダウンロードして実行する.




ちなみに,Virtual Box のGUI管理ツールを起動してみると, cloudius/osv というインスタンスが実行中になっていることが確認できる.






ホストマシンからSSHを繋ぐ




OSv のデフォルトイメージでは,sshd が動作しているため,ホストマシンからSSHで入ることができる.

Virtual Box 上のOSv にSSHでログインするには,起動時のコマンドでにポートフォワーディングの指定をする必要がある.

OSv は一度止めて(shell で exit コマンドを叩くと止まる) 以下のコマンドで再度OSv を起動する.




./capstan run -f 2222:22 cloudius/osv


その後,別のターミナルで以下のようにすれば,OSv にSSHで入れる.

ユーザ名は admin, パスワードも admin である.




$ ssh admin@localhost -p 2222


僕の環境では,SSHログインの際にパスワードを聞かれるまでに5分か10分くらいかかった.

(原因はよくわかっていない.)

なかなかパスワードを聞かれなくても気長に待つように.






余談





  • ssh で入ってifconfig と叩くと,出力がssh 側ではなく,シリアル側に出てしまう.

    ls はちゃんとssh 側に出力される.





  • 自分のマシンでOSv をビルドしたい場合は,Mac OS X では無理なのでLinux を使いましょうとのこと.









--
My Emacs Files At GitHub

2014年4月10日木曜日

git diff で色をつける


git diff で色をつける設定は以下のコマンドで



$ git config --global color.ui true




diff を表示するために使う pager プログラムが lv になっていると文字化けしてうまくdiffが表示されないらしい.
(僕の環境では,何も設定してなかったが,どうもlvが使われているようだった.)
そこで,pager を設定する.
ここでは "lv -c" とオプション付きでlv を実行するようにしているが,"less" にしても大丈夫.



$ git config --global core.pager "less"





Table of Contents







--
My Emacs Files At GitHub

2014年3月30日日曜日

Raspberry Pi で Radikorec を使ってみる.


家で目的もなく動いてるRaspberry Pi さんにラジオを録音してもらいたくなった.
そこで, Raspberry Pi に radikorec をインストールしてみた.
Raspberry Pi に限らず,たいていのUnix 系OSならほぼ同じ手順でインストールできそうだった.




環境




<マシン>
Raspberry Pi

<OS>
Raspbian 7.1

<カーネル>
Linux raspberrypi 3.6.11+ #538 PREEMPT Fri Aug 30 20:42:08 BST 2013 armv6l GNU/Linux







radikorec のソースコードをダウンロード




radikorec のリポジトリは akiradeveloper/radikorec · GitHub にある.
ここから,クローンする.




git clone https://github.com/akiradeveloper/radikorec.git








setuptools distribute をインストール

(2015/08/22 更新: setuptools を使うように内容を変更)

radikorec のインストールのために、python のパッケージ管理ツールであるsetuptools を使うため、これをインストールする.

(この記事ではもともとdistribute を使うように書いていたが、distribute は2013年にsetuptools に取り込まれているらしいので、setuptools を使うほうがよいらしい
また、元々この記事で紹介していた distribute インストール用のスクリプトへのリンクが切れてしまっている.
このため、setuptools を使うように内容を変更した.)


distributete というpython のライブラリ? をインストール.
因みに,何のためのライブラリかはよくわかってない.

昔は distributete でなはく setuptools というライブラリが主流だったらしい.
現在は, setuptools の開発は止まっており,それを引き継いで開発されているのが distribute ということらしい.
というわけで,今回は distribute をインストールする.
(このことに関連して,あとでradikorecのインストールスクリプトを修正する必要がある.)

参考URL: Pythonパッケージ管理ツールまとめ | サイト運営の私的メモ




$ curl -O http://python-distribute.org/distribute_setup.py
$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
$ sudo python distribute_setup.py








その他必要なものをインストール




以下のコマンド(Debian 系)



sudo apt-get update
sudo apt-get install libssl-dev 
sudo apt-get install ffmpeg







インストールスクリプトの編集

(2015/08/22 更新: setuptools を使うように内容を変更)



compilesetup.py ファイルを編集.
compile の方は rtmpdump のソースコードをgitリポジトリからクローンしてくるのだが,このリポジトリの指定先が参照できないので,変更.
setup.pysetuptools ではなく distributete をインストールしたための変更.


編集内容は以下の通り.



$ git --no-pager diff
diff --git a/compile b/compile
index ef82607..8cf921e 100755
--- a/compile
+++ b/compile
@@ -6,7 +6,8 @@ pwd
 make
 cd -

-git clone https://github.com/svnpenn/rtmpdump.git
+git clone git://git.ffmpeg.org/rtmpdump
+# git clone https://github.com/svnpenn/rtmpdump.git
 cd rtmpdump
 pwd
 make SYS=posix      
diff --git a/setup.py b/setup.py
index ecba8a4..5b2df88 100644
--- a/setup.py
+++ b/setup.py
@@ -1,5 +1,5 @@
-#from distutils.core import setup
-from setuptools import setup
+from distutils.core import setup
+#from setuptools import setup

 setup(
     name = 'radikorec',








インストールスクリプトの実行




以下のコマンドを実行する.



sudo make install
./compile 
sudo ./setup 








試験的に動かしてみる.




以下のコマンドでradikorecを試してみることができる.



./runtest


これを実行すると. /tmp/ 以下にログや録音した音声ファイルができるはず.
ffmpeg のインストールを忘れてると,録音したのにエンコードできなくて音声ファイルが出力されない.
僕は,毎度この段階で ffmpeg がないことに気づくので,実際に ./runtest で音声ファイルを出力したことはなかったりする.








放送局コードについて




radikorec を使うときに,録音したい放送局を放送局コードで指定する.
これを知るためには,http://radiko.jp/v2/api/program/today?area_id=JP14 へアクセスして返ってきたxml を見ればいいっぽい.
<station io=hoge>hoge の部分が放送局コード
その放送局が何かはすぐしたの <name> に書いている.

参考URL: FreeBSD で radiko を録音する。






おまけ: mp3に変換して,コマンドラインから再生する.




raspberry pi イヤホン端子もあるので,再生して聞くこともできる.
m4a 形式を直接コマンドラインから再生する方法がよくわからなかったのでmp3に変換してから再生してみた.
以下のようにやればできた.

m4a → mp3 は以下のようにやればできる.



ffmpeg -i NHR-2014-03-30-04-20.m4a  hoge.mp3




再生は, mpg321 をインストールして使えばOKっぽい.
デバイスファイルへのアクセス権限の関係で,何も設定しないとユーザ権限では動作しない.
今回は面倒だったのでsudo を付けないと動かした.
sudo を付けたくない人は,ブログログ mpg321を一般ユーザーで再生できるようにする。 などを見て,デバイスファイルにアクセスできるように権限を設定しよう.
mpg321 のインストールおよび再生コマンドは以下の通り.



sudo apt-get install mpg321 
sudo mpg321 hoge.mp3 



ここに書いた方法で,Raspberry Pi から直接再生することができる.
しかし,上記のエンコード処理はRaspberry Pi でやると非常に遅い.
また,録音した音声ファイルのサイズは大きくなりがちなので,SDカードの容量も心配である.
なので,音声ファイルは聞くときに別のマシンに移してしまって,そのマシンでエンコードなり再生なりしたほうがいいと思ったのがやってみた感想である.

参考URL: ブログログ mpg321を一般ユーザーで再生できるようにする。






コマンドリスト







git clone https://github.com/akiradeveloper/radikorec.git
cd radikorec/
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py 
vi ./compile 
vi ./setup.py 
sudo make install
./compile  #失敗
sudo apt-get update
sudo apt-get install libssl-dev 
./compile 
sudo ./setup 
sudo apt-get install ffmpeg
./runtest 
vi my_script.sh
chmod +x my_script.sh 
mkdir ../radiko_data
./my_script.sh 
ffmpeg -i NHR-2014-03-30-04-20.m4a  hoge.mp3
sudo apt-get install mpg321 
sudo mpg321 hoge.mp3 








my_script.sh の中身







#!/bin/sh
radikorec \
 --channel=LFR \
 --duration=1 \
 --prefix=NHR \
 --directory=/home/deep/radiko_data





--
My Emacs Files At GitHub

2014年3月11日火曜日

Mac Port のselfupdate ができなかった時のメモ


長らく放置していたMac port.
Mac OS X も Mervericks にアップデートしたし,いい加減アップデートしないとなぁ,とselfupdate しようとすると…



$ sudo port selfupdate
---> Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
---> Updating the ports tree
---> MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl

Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: command execution failed


などと,エラーがでてしまった.

これの解決は,以下のページを参考(というかそのまま)にしたらできた.
macportをアップデートしようとしたらエラーになった。 - @thorikiriのてょりっき

要は,xcode のコマンドラインツールが入ってなかったらしい.
Mac OS X をMervericks にアップデートするとインストールし直さないといけないんだったっけ?
以下の通りコマンドを叩くと,ポップアップが出てきて,コマンドラインツールをインストールするか否かを聞いてくる.
OKを押せばインストールしてくれる.



$ sudo xcode-select --install


で,再度selfupdate を実行してみると…



$ sudo port selfupdate
Password:
---> Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
---> Updating the ports tree
---> MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl


The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated
$ port version
Version: 2.2.1



とちゃんとMac port が2.2.1へアップデートされたっぽい.

余談だが,バージョンを確認するときは port --version ではないので注意.
port --version と叩くと,以下の様に怒られる.




$ port --version
Error: global does not accept --version
Usage: port
[-bcdfknopqRstuvy] [-D portdir] [-F cmdfile] action [privopts] [actionflags]
[[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]...

"port help" or "man 1 port" for more information.





--
My Emacs Files At GitHub

2013年12月20日金曜日

岡山から離れて9ヶ月 〜岡山を離れて変わったこと,変わらなかったこと,etc〜


はじめに




この記事は大都会岡山 Advent Calendar 2013 - Adventarの20日目の記事となります.

昨日は仁志 能野さんのYOKIZO.com - 「本自炊」はじめました でした.

僕は,「本を自炊すれば部屋の荷物が少なくなっていいだろうなぁ」と思いつつ重い腰が上がらない今日このごろです.







岡山ではなにやってたの?




9ヶ月前までは,大都会岡山の国立大学である岡山大学で残念大学生をやってました.

岡山では勉強会にあちこち顔を出したり,たまに主催したりしてました.

研究室時代にはLinux カーネルの中弄って面白いことする研究をしてました.





今どこでなにやってるの?




現在は,関東の国立大学である某T大学で大学院生をやってます.

(まぁ,T大学って筑波大学なわけですが.)

つくばや東京でも,ときどき勉強会に参加してます.

研究室ではVMMを弄って面白いことをする研究をしてます.







岡山を離れて変わったこと








列車に乗るときにICカードを使うようになった




岡山にいるときはICカードなど持ってもいませんでした.

つくばに引っ越してからも,しばらくはICカードを持たずに生活してました.

ただ,東京近辺の列車は切符を買うのがあまりにも難しい!

えっ,乗り換え後の料金表が切符売り場にないんだが…? 連絡切符って言われても何円の切符買えばいいの??? という事態になります.

そんなわけで,いちいち値段調べて切符買って,なんてことしてられないのでICカードを買いました.



余談ですが,こちらではICカードはPASUMOとSUICAのどちらかが手に入ります.

ただ,どうせICカードを持つのならICOCAが良かったなぁと思います.

あの青いカモノハシのキャラ「イコちゃん」は割と好きなキャラだったので.

イコちゃん - Google Search







あれ?勉強会って懇親会が本番じゃないの?




つくばに来てから,何度か勉強会に参加することがありました.

そこでカルチャーショックだったのが「懇親会が地味」ということです.



岡山の勉強会というと,勉強会後の懇親会は結構盛大にやります.

飲み屋で懇親会して,さらに元気があればボーリングやカラオケへ,というのが割とよくありました,

また,勉強会参加者の半数以上は懇親会に参加してたと思います.

岡山の勉強会文化で育った僕は,「勉強会は懇親会が本番だ」と教わったほどです.

(もちろん,勉強会自体もちゃんとやりますよ)



しかし,関東での勉強会はどうも状況が違います.

懇親会というと飲み屋ではなく,飲食店で夕食会というのが多かったように思います.

また,あったとしても参加者も3割から多くて6割と言ったところだったと思います.

ときには,懇親会があるのかないのかよくわからないときもありました.



この文化が悪いというわけではありません.



東京の勉強会は平日夜におこなうものも少なくありません.

また,勉強会の頻度も多いです.

さらに,参加者が多いということもあります.

人が多く,頻度も多いため,内容も濃いものになっていると思います.

これは関東の勉強会の良い所だと思います.

ただ,このような状況で,毎回盛大な懇親会しようとして,勉強会本体がお座なりになったら本末転倒なわけです.

なので,関東での勉強会の懇親会が盛大でないのも自然といえば自然です.



端的にいえば,関東の勉強会は岡山の勉強会よりも,勉強会自体に注力している印象です.



一方で,岡山の勉強会の懇親会の良さは,楽しく色々は人とコミュニケーションをとることができる点だと思います.

他の技術者と交流を深めるという点で,これは非常よかったと思います.

この点は,関東の勉強会にはあまりない良さなのかなと思います.








岡山を離れても変わらなかったこと




まぁ,なんと言っても

  • 彼女できない









今後やろうと企んでいること




大都会岡山では,Web系やJVM系言語の勉強会は活発なのですが,カーネルのようなシステムソフトウェアの分野はあまり活発でないように思います.



そう思った僕は以前,「岡山でLinuxカーネルと戯れる会」という勉強会を主催しました.

第1回 は僕が主催し,第2回 は僕の後輩が主催してくれました.

ただ,3回目以降が続かず,元気がない状態です.



岡山を離れた僕ですが,やはり岡山でシステムソフトウェア分野を活発にしたいと思うわけです.

ただ,つくばから岡山まで行って勉強会の主催をするのは厳しいわけです…



そこで,Webでカーネルのソースコードリーディングを配信してみたらどうだろうと考えました.

ソフトウェアを勉強する上で,ソースコードを読むことは非常に実り多いことです.

しかし,ソースコード,特にカーネルのソースコードを読むのは結構な労力がかかります.

なので,ソースコードリーディングを配信して,見てる人からの質問に答えたり,アドバイスをもらったりしながら読めればいいなと思ったわけです.



最近研究の都合でNIC周りを勉強しないといけないので,最初はNICドライバのコードを読みたいと考えています.

年内はバタバタしそうなので,年を越して1月中にしたいと思います.







最後に




列車の切符のことや,勉強会の違いなど,思いつくままにいろいろ書いてみました.



明日はpatorashさんの番となります.



--
My Emacs Files At GitHub

2013年8月30日金曜日

GNU Globalで対応してない言語のコードを解析する.


はじめに




前回の記事 で紹介したGNU Globalを使ってブラウザでコードを読む方法は非常に便利.

しかし,このGNU Global,対応言語はC, C++, Yacc, Java, PHP4しかない

そう言われても,他の言語で書かれたソースコードもブラウザで読みたい時はでてくる.

というわけで,GNU GlobalでGNU Globalで対応していない言語もブラウザで読めるようにする方法をここに書いておく.




概要を一文で書いてしまうと,GNU Globalよりも多くの言語に対応し(そのかわりに機能が少ない)Ctagsを用い,TAGSファイルを生成し,これをhtagsにかける.






注意点




Ctagsを用いるので,Globalを用いて解析したのと同じように,とはいかない.

具体的には,ある関数や変数が参照されている場所の情報(Reference)は表示できない.

なぜなら,CtagsはGlobalと違い,Referenceを探す機能が存在しないからである.

また,htagsの結果表示されるhtmlも,関数や変数の定義にリンクは貼られいない.

結局,htmlで表示しても,Syntax highlightもリンクもないソースコードが表示されるだけである.




しかし,grepやdefinitionの検索には引っかかるようになるため,何も使わないよりは読みやすくなる.

対応言語の解析に比べれば,機能は多少劣るものの,同じ環境でより多くの言語のソースコードを表示できる,という点では便利である.






方法





  1. ctagsをインストール

    Linux MintやUbuntuなら以下のコマンドでインストール.




    sudo apt-get install ctags



  2. gtagsの設定ファイルのテンプレをコピー

    apt-get でGNU Globalをインストールした人は /usr/share/doc/global/examples/gtags.conf を適当なファイルにコピー.

    これを編集して,gtagsコマンドを実行するときにオプションで指定する.


  3. 設定ファイルを編集.

    ここでは,pythonのソースコードをctagsで解析するように編集.




    ctags-exuberant|Exuberant Ctags|ctags by Darren Hiebert:\
    :tc=common:\
    :suffixes=s,a,sa,asm,C,H,cpp,cxx,hxx,hpp,cc,c,h,y:\
    :extractmethod:\
    :GTAGS=/usr/local/bin/ctags-exuberant -xu %s | perl -ne '\
    if (/^operator \\S+\\s+function\\s/) { s/^operator //; }\
    ($name, $type, $no, $path, $line) = split(/[ \\t]+/, $_, 5);\
    printf(STDOUT "%-16s %4d %-16s %s", $name, $no, $path, $line);':


    のように書かれている箇所のうち,2箇所を変更する.


    1. :suffixes の右辺に py を追加.

      ここに,他の拡張子を設定すれば,その拡張子に対応する言語のソースコードも解析してくれる(はず).





    2. :GTAGS の右辺でctagsの実行ファイルのパスを指定する部分を変更.

      apt-get でインストールすると,デフォルトで書かれているパスとは異なるところにインストールされる.

      which ctags コマンドで実行ファイルのパスを確認し,指定する.








  4. gtagsの実行

    以下のようにオプションを指定し,gtagsを実行する.




    $ gtags --gtagsconf=<編集した設定ファイルのパス> --gtagslabel=ctags-exuberant


    --gtagsconf には先程編集した設定ファイルを指定する.







あとは,前回の記事 と同様にhtagsを実行して,htmlファイルを生成すればよい.









おわりに




とりあえず,非対応言語のソースコードもgtags, htagsを用いてhtmlページで表示することが可能になった.

しかし,やはり非対応言語の解析は貧弱であることは否めまい.

非対応言語が主なソースツリーを読む場合は,無理してGNU Global を使うよりも IDEを使ったほうがいいだろう.




この方法が有用なのは,主にCやJavaで書かれたソースツリーの中に少し多言語も混じってる,という場合だと思う.







--
My Emacs Files At GitHub