Gentooホストで仮想環境を動かした

以前(qemu-kvmqemuにマージされてない時代)はqemuを生で使っていたのだが、libvirtを介してみることにした。まともにサービスをする仮想サーバを建てるのではなく、試しにプログラム走らせるテストアンドスクラップ用途なので仮想環境からホストに直接接続できたらセキュリティ的にまずいとかそういった話は一切無視している。また、通常そのような用途ならカーネルとか触らない限り今ならlxcのようなコンテナで良いし、それならlibvertじゃなくdockerがある。あくまで趣味的な手順記録である。


app-emulation/libvirtqemuとvirt-networkのUSEフラグを立てる。ゲストの入れ方によってはlvmも付ける。

# emerge -av qemu libvirt virt-viewer

多分下のようにカーネル設定に文句を言われるのでコンフィグ変えてホストのカーネルコンパイル

 *   CONFIG_NETFILTER_XT_TARGET_CHECKSUM:	 is not set when it should be.
$ qemu-img create -f qcow2 init.img 10G

適当にディスクイメージを作る。qcow2からrawへのコンバートもできるので、初めは適当にqcow2でok。

# /etc/init.d/libvirtd start

USE="virt-network"をたてていればこれで勝手にブリッジとかを作ってくれている様子。libvirtdがネットをシャットダウンまで面倒見るかどうかについての設定が/etc/conf.d/libvirtdにあるので LIBVIRTD_KVM_NET_SHUTDOWN="yes" としておく? しなくてもきちんとネットを管理しているような気がする。

# virt-install --name "InitVM" --ram 1024 --disk init.img,format=qcow2 --cdrom [debianのnetinstとか適当な.iso] --network network=default

libvirtが準備してくれたnetを使う時はroot権限じゃないとnetまわりで文句を言われる。
USE="virt-network"を立てていなかったら適当に手動でブリッジを作って使う。
sshdとかはこの段階で入れておけるなら入れておく。改めて言うがセキュリティ面は無視しているので便利なら余計なデーモンも入れているし、パッケージも精査しない。適当だ。

# virt-clone --original InitVM --name someVM --file=./someVM.img

これで毎回まっさらな環境をクローンしてきて使う。

# virsh start someVM
# virt-viewer someVM

これでゲストOSの内側から好きにできる。

[guest]# ifconfig | ip addr

で調べたipにsshで入ったりscpでファイルを送ったりして楽しむ。

# virsh undefine someVM

壊しすぎたらこれでさよならする。新しいクローンはうまくやってくれるでしょう……

噂の5ボタントラックパッド(Clickpad)の設定

Thinkpad X240 を買いました。
http://www.thinkwiki.org/wiki/Installing_Gentoo_on_an_X240
とりあえずGentooを入れますが、やはり新Thinkpadトラックパッドは噂通り乗り換え直後は使いにくいです。

# /usr/share/X11/xorg.conf.d/50-synaptics.conf
# This option enables the bottom right corner to be a right button on
# non-synaptics clickpads.
# This option is only interpreted by clickpads.
Section "InputClass"
       Identifier "Default clickpad buttons"
       MatchDriver "synaptics"
       Option "SoftButtonAreas" "60% 0 0 5% 40% 60% 0 5%"
       Option "AreaTopEdge" "4%"
EndSection

Option "SoftButtonAreas" は合計で8個の引数をとり、はじめの4つが右クリック、後の4つが中クリックの領域を指定します。0は領域の区切りを付けないという意味で、左上が原点でx軸正方向が右、y軸正方向が下(手前)、上の引用例だとx軸60%より右でy軸5%より上が右クリックキー、横40%-60%で縦5%より上が中クリックです。
AreaTopEdgeが4%なのでマウス操作と1%分被っている気がしますね。どうでもいいですが。


Thinkpadでは通常トラックパッドでマウスは動かさないので、快適なクリックのためにほとんどの領域を使いましょう。

Section "InputClass"
       Identifier "Default clickpad buttons"
       MatchDriver "synaptics"
       Option "SoftButtonAreas" "60% 0 0 70% 40% 60% 0 70%"
       Option "AreaBottomEdge" "1"
EndSection

これでおおむねT430sの感覚で適当に右親指を動かしても中クリックが誤発動せず右クリックできるようになります。manも読まずにXの設定をネットからコピペして使ってたらそりゃ使いづらいわな、と反省しました。
でも設定変えてもかなりとまどう。大丈夫かこのThinkpad

追記 設定ファイル場所変更

/usr/share/X11/xorg.confほげほげ以下はアップデートとか起動とか何かのタイミングで上書きされるので、上記設定ファイルの中身に書いてある通り、あるいはman xorg.confとかの内容どおり/etc以下の適当なディレクトリに設定ファイルをコピーしてから編集する。

MonoGameってのがあるらしいので触った

最近会った人から聞いた何かを無差別に触ってる期間なのだがなんか情報少なそうだったののメモ。

http://monogame.codeplex.com/
MonoGameを開発したいならgithubからclone、MonoGameで開発したいならこのサイトのダウンロードでイナフ。

http://kcat.strangesoft.net/openal.html
Windowsだと32bit版(?) OpenALが要求されるのでOpenAL softをOpenAL32.dllみたいなファイル名にしてsystem32だかsysWoW64だかに突っ込む。

Xamarin Studio(旧MonoDevelop)でAdd-inとしてXamarinStudio.MonoGame_*.mpackを追加したらコードの雛形付きプロジェクトが作れる

雛形はゲームのメインループのみ。Gameのプロパティに応じてUpdateが60times/secとDrawが60fpsになるべくなるよう呼ばれたり、ただ単純に繰り返すように呼ばれたりするらしい。
その他の便利そうなクラスのリファレンスがあればよかったのだが、Textureとかその辺の使い方はXNAを知ってる前提なのかドキュメントがないような……。

Rogue Legacy(ローグレガシー)は結構良ゲーム

http://www.roguelegacy.com/
http://store.steampowered.com/app/241600/?l=japanese

SteamでRogue Legacyを買ってプレイしたらなかなかよかったので紹介。日本語版はないようだけど、和名はローグレガシーかな。rogue-liteという言葉に釣られたら予想と全然違ったけど良かったよ。
操作は簡単な2Dアクションゲームで、ローグライクゲームのように毎回自動生成される城を悪魔城ドラキュラのように探索しつつ先祖の仇を討つ、いや、お金集めするゲーム。

ローグライク風に死んだら終わり。その世代の主人公は二度と帰って来ない。次にゲームを始めると三人の中から跡継ぎを選ばされ、親の遺した金を使って居城を拡張したり装備を買ったりして先代より少し有利になった状態で次の城に挑める。

この次世代の主人公を「選ばされ」るのが肝で、身長やクラス、多種多様な形質を持った跡継ぎで城を攻略するのはNethackで"Shall I pick a character's race, role, gender and alignment for you?"にyと答えた時のようだ。特性もなかなかおもしろく、メッセージにハゲ関連ジョークが出る奴(兜で隠してるのに!)、ジャンプ時におならをしてしまうような他愛もない奴、リーチが短いがヒットボックスが小さく狭い通路を通れる奴、画面上下反転してしまうようなきつーい奴までどの世代も違った主人公で城を探索するのが楽しい。

初め難易度は馬鹿高いが居城を拡張する事で主人公もレベルアップし、ちょっとずつちょっとずつ強くなっていくのでいつの間にか止めどきがわからなくなる。

Steamのストアページにもある通りゲームコントローラに良く対応しており、そういうので遊ぶと楽だろう。公式サイトに体験版もあるようだ。

AndroidをGentoo Linux上でビルドする方法、あるいは不審なバイナリをあまり使わずにNexusのrootになる手順

言いわけ:Webに転がっているいくつかのroot権限を取得する手順で用いているバイナリはオープンソースだったりもしますが、覗いてもよくわからなかったしどうせ自前ビルドするからとあまり深く追いませんでした。単にroot権限を取りたいだけならば他所をあたったほうがいいかもしれません。



Googleの推奨している環境はUbuntuで、手順もapt*を使ったものしかないが、gentooも理解すれば楽。
https://source.android.com/source/initializing.html

とりあえずGentooの場合特有なのは

の四点くらいで、残りは普通の手順のようだった。

以下もうちょっと詳しく。

関連パッケージを入れる

上記URLにapt-getの場合のパッケージ名が羅列されているが、それっぽいのを適当にemergeするとなんとかなると思う。build-essensialは多分ubuntu特有のもので、Ubuntuで{lib}hoge-devのようにバイナリと分けられているパッケージはGentooではたいていhogeで一緒に入ったりすることを念頭に入れつつeixなりemerge -[sS]なりで探す。Androidのバージョンによっていろいろ変わるだろうし、自分もまっさらな環境から入れたわけではないので本当ならば何を追加すればいいのかわからないので逐一ebuildを挙げたりはしない。
sdkを入れるのはebuildが用意されているので楽。

# emerge -av android-sdk-update-manager
# usermod -a -G android YOUR_LOGIN_USER

ログイン中のユーザだと即時グループが変わったりしないので、再ログインしてandroidグループに入る

$ id (androidグループに入ってるかの確認)
$ android

出てくるGUI画面のToolsあたりにadbが入ってると思うので適当にチェックボックス入れて難しい文面をあなたの顧問弁護士に見せて相談してAcceptすると後は自動でやってくれる。

実機を繋げられるようにする。

実機の方でUSB debugを有効にしておく。Jellybeansあたりから(?) Settings->About phonesのBuild numberを7回タップしたりして開発者向けオプションを出さなければならない。このとき間違えて近くの別項目を数回タップすると……ちょっとニッコリできるかもしれない。
/etc/udev/rules.d/51-android.rules に https://source.android.com/source/initializing.html のConfiguring USB Accessを参考にして項目を追加する。Googleがドキュメントを更新する前にデバイスを手に入れてしまった場合、実機をとりあえず繋いでみてdmesgあたりでidVendorを確認してそれを用いるとなんとかなる。

$ adb devices

でなんか繋がってるらしい事を確認できたら、adbとかfastbootでいろいろできるようになってるはずだ。

$ adb reboot bootloader

ブートローダがなんか画面に出てる状態にして、

$ fastboot oem unlock

で端末に出てる説明をよく読んで操作すればブートローダがアンロックされ、個人情報保護のためデータが全消去された後、自分でビルドした何か(あるいは道端で拾ってきた怪しげなバイナリ)をブートさせる事ができる状態になる。

ソースをダウンロードする。

これにはebuildは用意されてない。私も用意する気はない。しかたがないので
https://source.android.com/source/downloading.html
を見てその通り進めていく。repo内部で用いているgitの.gitは.repo/repo下にあるのでgitでの名前とかを変えたい場合はそこで操作する事。ソースのそこかしこに最終更新日から腐臭の漂うドキュメントもちらほら梱包されているが、まだまだたまには参考にはできる。

残念なことにソースのないドライバ類をダウンロードしないといけない。 https://developers.google.com/android/nexus/drivers から自分のデバイスに対応するものをダウンロード、ソースツリーのてっぺんで解凍してできたスクリプトを実行し、表示されたライセンスを懇意にしている弁護士に見せて問題がなければ"I ACCEPT"と入力してvendor/以下にバイナリをもらう。

ダウンロードが終わったらみんな大好きコンパイルの時間

https://source.android.com/source/building.html にある通り、lunchで設定を整えてmakeするだけ。*1
Gentooで行う場合少しだけ注意点がある。
自分は試していないがsun以外のjdkだとコンパイルに問題があるとか言う人もいるので

$ eselect java-vm list

でsunのものを使うようになってるか確認しておくといいかもしれない。
lunchがANDROID_JAVA_HOMEという環境変数を用いるがデフォルトではそんなものないので

$ ANDROID_JAVA_HOME=$JAVA_HOME lunch 

するなりANDROID_JAVA_HOMEの設定を.*shrcに書いておくなりする。
バイス毎のlunchのオプションは https://source.android.com/source/building-devices.html でわかるということになっているが、ここでもGoogleのドキュメント更新が遅い場合オプション無しで

$ lunch

するとよくあるもの一覧が対話的に選べるのでドキュメントには反映されてない端末がちゃんとmanifestにはあるかどうかの確認には良いだろう。-userdebugまでならそのまま対話的に選べるが、"full_デバイス名-eng"は自分でオプションとして渡さなければならない。rootが欲しいだけならば-userで、設定ファイルのro.secureを1に手で編集すれば良い。
makeしてAndroidのビルドは完了。
out/target/product/デバイス名/にboot.imgとかができている。-engを選んでいれば

$ fastboot boot boot.img
$ adb shell

でrootになれてるのを確認できるだろう。-userdebugならばadb rootでrootになれる事を確認できそうだ。動作を確認した後、

$ fastboot flash boot boot.img

で焼く事ができる。
外に持ち出すデバイスならば

$ fastboot oem lock

する事が望ましい。アンロックしたまま落としたデバイスを誰かに拾われて、その人が自前のイメージでbootすれば端末の中身は全て見る事ができるからだ。

(おまけ)カーネルも自前コンパイル

さて、上記の方法でビルドするとカーネルgoogleさんの奴のままだから、カーネルhttps://source.android.com/source/building-kernels.html にあるようにデバイスに適切なツリーをcloneして適切なコミットをcheckoutする。checkoutしないとclone直後のmasterは空だったりするから混乱しないように。

toolchain内のgcc*2のパスは上記リンクのbuilding-kernelsのドキュメントが古いから prebuilts/gcc/linux-x86/x86/i686-linux-android-*/bin/ に置きかえたり、今後どうなるかわからないがとにかく自分で探さないといけない。(多分普通の人はこれ。自分のコンピュータのアーキテクチャによる。)バージョンの違いでビルドできたりできなかったり、いろいろあるから試行錯誤しないといけない。正直私もよくわからない。

(おまけ)自前カーネルを組み入れる

できたカーネルをboot.imgに組み入れる方法なんだけど、実はここからちゃんとした手順を知らない。だから書かない。カーネル動かしたい人はsplit_bootimgで検索したりしていろいろ頑張ってほしい。ちゃんとした方法が本当はあるのかもしれないので、わかったら追記する。

追記 20130424

device///kernelに移した後、make cleanしてからmakeしたら自前カーネル組み入れられてるみたいでした。うっかり。

多分device///kernelからbuildのどこかにkernelを移してからmkbootimgされてから${OUT}のどこかに移していたのでしょう。make clean忘れずに。

*1:最近はmake userdebugとかじゃなくlunchなんだね

*2:本当はクロスコンパイル用gccも自前で準備したかったが、なんかうまくいかなかった。

mikutterのvendorのライセンスについて

ライセンスって面倒くさいよね。単にGPLで配布していいのかどうかは正直この早見表 http://www.gnu.org/licenses/license-list.html くらいで判断してるよ。実際https://twitter.com/kudzu_naoki/status/279844949715992578:twitterの日*1は早見表だけでできそうか否か判断したからね。

だけどmikutterアドベントカレンダーで不安になってる人がいたから、自分のアドベントカレンダーの順番の時にoverlayを公開するにあたって調べた部分、vendorの中身について書いとくね。

  • ライセンス
    • vendorの中身でそれが適用されてるもの

を列挙して、直後に解説を書いておくよ。

  • MIT
    • typed-array
    • oauth
  • Apache 2.0
    • addressible

これはみんな知ってるライセンスだよね。コピーレフトもないしどんな糞ライセンスで再配布しようとしまいとかまわないよ。

  • Artistic-2.0
    • memoize

なんかPerl出身のライセンスとして名前だけ聞いた事ある程度の人も多いんじゃないかな。僕もそうだったよ。http://dev.perl.org/licenses/ で明記されてる通り、GPLv1以降かArtisticでの再配布が認められてるよ。GPLv1以降ってなんか珍しいよね。

  • Rubyが配布するのと同じライセンス
    • bsearch
    • その他

面倒そうな表記だね。実際一度面倒だったんだよ。昔むかし単にRubyライセンスと言うと

I have obtained a copy of the Ruby license and studied it.  It has
some of the ambiguity problems of the Perl Artistic License, from
which it was derived.  Because of them, I can't say it is a free
software license.

Some small clarifications and small changes in the Perl Artistic
License make it a free software license and compatible with the
GPL--with little change in the meaning.  Would you please consider
replacing the Ruby license with that license?
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/30001 より引用

なんてstallman直々にあいまいな点があるよ、って言われてしまう内容だったんだって。だからmatzさんをはじめとするRubyコミッタ達がいろいろ頑張ってはなしあって二度のライセンス修正を経て、RubyKaigi2010でBSDLとのデュアルライセンスになってるんだってさ。http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20100827 だから2010年8月27日以降Rubyが配布するのと同じライセンスってのはRubyライセンスとBSDLのデュアルライセンスを指すんだ。というわけでBSDLの方を採用して、GPLv2以降で再配布できるよね。


さて、そんなわけでvendorの中身自体はREADMEで適用除外しておのおののライセンスで再配布、残りのソースと全体としてのmikutterはGPLv3で配布できる*はず*なんだ。一応おおまかに確認したうえで自前のoverlayに入れてるんで、ライセンスに問題があるかも……みたいなFUDじゃなくてきちっと○○というのが△△ライセンスに違反しています、って指摘欲しいな。公式と無関係の僕も不安になっちゃうからね。

20121224 追記

d_akiさんに教えていただいた。debianへの収録に際しての考察。こっちはskin類についてもあって参考になる。
http://vdr.jp/d/20121221.html#p01



僕はmikutterのコミッタでもなんでもない、ただの一利用者だから、公式見解と異なるかもしれないし間違ってる点もいっぱいあるかもしれないので、なんでもご指摘歓迎です。よろしくお願いします。

*1:この発言中の荒っぽい方法はGentoo portageの公式のものでなく、俺々オーバーレイでの話

fav2toshi_aアドベントカレンダー18日目?

このエントリは、 #fav2toshi_a Advent Calendar : ATNDの18?日目として書かれてしまったものです。
前の日は@arc680さんのhttp://d.hatena.ne.jp/arc680/20121217/1355750400です。
次の日は……ピンチヒッター誰なの?

    _ □□    _      ___、、、
  //_   [][]//   ,,-―''':::::::::::::::ヽヾヽ':::::/、  誰  を   こ
//  \\  //  /::::::::::::::::::::::::::::::i l | l i:::::::ミ  だ   作   の
 ̄      ̄   ̄/ /:::::::::,,,-‐,/i/`''' ̄ ̄ ̄ `i::;|  あ  っ   か
―`―--^--、__   /:::::::::=ソ   / ヽ、 /   ,,|/   っ  た   れ
/f ),fヽ,-、     ノ  | 三 i <ニ`-, ノ /、-ニニ' 」') !! の   ん
  i'/ /^~i f-iノ   |三 彡 t ̄ 。` ソ ハ_゙'、 ̄。,フ | )     は  だ
,,,     l'ノ j    ノ::i⌒ヽ;;|   ̄ ̄ / _ヽ、 ̄  ゙i )             |
  ` '' -  /    ノ::| ヽミ   `_,(_  i\_  `i ヽ、 ∧ ∧ ∧ ∧
     ///  |:::| ( ミ   / __ニ'__`i |  Y  Y Y Y Y
   ,-"        ,|:::ヽ  ミ   /-───―-`l  |  //     |
   |  //    l::::::::l\    ||||||||||||||||||||||/  |     // |
  /     ____.|:::::::|    、  `ー-―――┴ /    __,,..-'|
 /゙ー、,-―'''XXXX `''l::,/|    ー- 、__ ̄_,,-"、_,-''XXXXX |
/XX/ XXXXXXXXXX| |         _,  /ノXXXXXXXXXX|

こんな気分でしたが、#としぁがわるい*1ほいほいと参加登録した方が悪い。

ふぁぼ系プラグインなんて入れた事のない初心者なので、1つ1つ、丁寧に1週間分のtweetを読んで見たところ、「としぁさんらしいなぁ、mikutterの作者なんだなぁ」と感じられ*2、結局1週間の発言ほとんどにfav付けちゃいました。めんご。

↑のような事言いつつもだなんて催促しちゃったりもしていて、こうなるんだよなぁ。

*1:としぁがわるい……mikutterのうすい本がコミケ落選した時、原因として作られていたハッシュタグhttps://twitter.com/brsywe/status/208936731465093122

*2:twitterを彩るふぁぼ魔にふさわしい表現