tag:blogger.com,1999:blog-90864028293526494012024-03-13T23:08:38.669+09:00時羽金也の技術帳deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.comBlogger47125tag:blogger.com,1999:blog-9086402829352649401.post-28605245480758700742017-01-12T18:31:00.000+09:002017-01-12T18:32:08.254+09:00<div class="outline-2" id="outline-container-sec-1">
<h2 id="sec-1">
MobileOrg で Agenda ファイルを org-directry 以外の場所に置くと何が起こるか? <span class="tag"><span class="gblog">gblog</span></span></h2>
<div class="outline-text-2" id="text-1">
</div>
<div class="outline-3" id="outline-container-sec-1-1">
<h3 id="sec-1-1">
<span class="section-number-3">1.1</span> はじめに</h3>
<div class="outline-text-3" id="text-1-1">
何やらMobileOrgの同期がうまくいかないなぁ,と思ったときについカッとなってコードを読んだ時の簡単なメモです.<br />
<br />
※以下,本文中では,Emacs のシンボル(関数や変数)は(シンボル)で書いてます<br />
<br /></div>
</div>
<br />
<div class="outline-3" id="outline-container-sec-1-2">
<h3 id="sec-1-2">
<span class="section-number-3">1.2</span> 何が起きる?</h3>
<div class="outline-text-3" id="text-1-2">
<ul class="org-ul">
<li>(org-mobile-push) はうまくいく (Emacs –> MobileOrg アプリ)<br /><br />
<ul class="org-ul">
<li>(org-agenda-file) でファイルのフルパスを指定していれば.<br /><br />
</li>
</ul>
</li>
<li>(org-mobile-pull) はうまくいなかい (MobileOrg アプリ –> Emacs)<br /><br />
</li>
</ul>
片方だけうまくいくおかげで,問題に気づくのにちょっと時間かかった.<br />
<br /></div>
</div>
<div class="outline-3" id="outline-container-sec-1-3">
<h3 id="sec-1-3">
<span class="section-number-3">1.3</span> なぜなのか?</h3>
<div class="outline-text-3" id="text-1-3">
</div>
<div class="outline-4" id="outline-container-sec-1-3-1">
<h4 id="sec-1-3-1">
<span class="section-number-4">1.3.1</span> org-mobile-pull の挙動</h4>
<div class="outline-text-4" id="text-1-3-1">
早い話が, <b>(org-mobile-pull) は Agenda ファイルが (org-directory) 以下にあることを想定している</b> .<br />
<br />
<br />
<ul class="org-ul">
<li>(org-mobile-pull) は独自のフォーマットで差分を読み込み,パースして,適用する.<br /><br />
<ul class="org-ul">
<li>Dropbox で同期していれば,MobileOrg アプリは差分情報を (org-mobile-directory)/(org-mobile-capture-file) に保存する<br /><br />
<ul class="org-ul">
<li>(org-mobile-directory) は設定が必要なので,init.el などで設定しているはず.<br /><br />
</li>
<li>(org-mobile-capture-file) はデフォルトだと,"mobileorg.org"<br /><br />
</li>
</ul>
</li>
<li>(org-mobile-pull) 時に,(org-mobile-capture-file) から(org-mobile-inbox-for-pull) へコピーする<br /><br />
<ul class="org-ul">
<li>(org-mobile-index-for-pull) のデフォルト値は "~/org/from-mobile.org"<br /><br />
</li>
</ul>
</li>
<li>この差分を記述するフォーマットはともかく,変更箇所の記述方法が問題<br /><br />
<pre class="example">=~[[olp:<ファイル名>:H1/H2/H3][Head名]]~=
</pre>
となっている.<br /><br />
</li>
<li>これを,(org-mobile-locate-entry) が実際のファイルパスとポジションに変換する.<br /><br />
<ul class="org-ul">
<li>このとき,ファイルパスは <b>(org-directry)</b> /<ファイル名>になる.<br /><br />
<ul class="org-ul">
<li>(org-directory) はデフォルトで "~/org"<br /><br />
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="outline-4" id="outline-container-sec-1-3-2">
<h4 id="sec-1-3-2">
<span class="section-number-4">1.3.2</span> org-mobile-push の挙動</h4>
<div class="outline-text-4" id="text-1-3-2">
じゃあ,push はどうなのよというと,実は Agenda ファイルが (org-directory) 以下になくても動くようになっている<br />
<br />
<br />
<ul class="org-ul">
<li>(org-mobile-push) は.org ファイルを丸々転送している.<br /><br />
<ul class="org-ul">
<li>コピー元は, <b>(org-agenda-files) からファイルパスごと</b> 取ってくる<br /><br />
</li>
<li>暗号化しているときは,(org-mobile-capture-file) 経由で暗号化して転送するっぽい<br /><br />
</li>
<li>でも,この時も .org は暗号化せずに転送しているように見えるけど,大丈夫か?(動かしたわけじゃないから実際はどうなのかわからないけども)<br /><br />
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<br />
<div class="outline-3" id="outline-container-sec-1-4">
<h3 id="sec-1-4">
<span class="section-number-3">1.4</span> おわりに</h3>
<div class="outline-text-3" id="text-1-4">
Agenda ファイルはちゃんと,(org-directory) 以下に置きましょう.<br />
<br />
どうしてもいやなら,MobileOrg か org-mobile.el を改造しましょう.<br />
<br /></div>
</div>
</div>
deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-37055923999502257812015-04-09T17:48:00.001+09:002015-04-09T17:48:42.853+09:00resize2fs と fdisk で ext4 のパーティションを縮小する<div id="outline-container-sec-1" class="outline-2"><br /><h2 id="sec-1"><span class="section-number-2">1</span> resize2fs と fdisk で ext4 のパーティションを縮小する</h2><br /><div class="outline-text-2" id="text-1"><br /></div><div id="outline-container-sec-1-1" class="outline-3"><br /><h3 id="sec-1-1"><span class="section-number-3">1.1</span> はじめに</h3><br /><div class="outline-text-3" id="text-1-1"><br />パーティションの拡大縮小はいつもGParted を使っていた.<br /><br />しかし,今回はディスプレイが繋がっていないマシンのパーティションを変更するために,CLI で操作できるresize2fs と fdisk で操作した.<br /><br />結構悩んだが,わかればそんなにややこしい手順じゃないはず.<br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-2" class="outline-3"><br /><h3 id="sec-1-2"><span class="section-number-3">1.2</span> 作業の流れ</h3><br /><div class="outline-text-3" id="text-1-2"><br />パーティションを縮小すると言っても,実はパーティションのサイズだけ縮小してもダメらしい.<br /><br />ファイルシステムのサイズも変えないといけないんだそうだ.<br /><br />しかも,この2つのサイズが一致してないとまずいらしい.<br /><br /><br /><br />resize2fs はサイズ指定なしで実行すると,ファイルシステムのサイズを可能な限り大きくする.<br /><br />つまり,パーティションのサイズいっぱいにファイルシステムのサイズを広げてくれる.<br /><br />これを利用すれば,面倒な計算なしに,ファイルシステムとパーティションサイズのサイズを合わせられる.<br /><br />(逆にパーティションサイズに合わせて縮小,ということはやってくれないっぽい?)<br /><br /><br /><br />というわけで,以下の手順を取る.<br /><br /><br /><ol class="org-ol"><br /><li>resize2fs でファイルシステムを縮小(予定サイズよりもちょっと小さめに)<br /><br /></li><br /><li>fdisk でパーティションのサイズを縮小(予定サイズに縮小)<br /><br /></li><br /><li>resize2fs でファイルシステムのサイズをパーティションのサイズに合わせる(勝手に計算してくれる)<br /><br /></li><br /></ol><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-3" class="outline-3"><br /><h3 id="sec-1-3"><span class="section-number-3">1.3</span> resize2fs でファイルシステム</h3><br /><div class="outline-text-3" id="text-1-3"><br />今回は/dev/sdb1 を512GB から32GB に縮小する例を示す.<br /><br /><br /><br />まずは,resize2fs でファイルシステムのサイズを予定サイズより少し小さめに変更.<br /><br />512GB–>31GB の変更は結構時間がかかる(10分くらい?).<br /><br /><br /><pre class="example"><br /># e2fsck -f /dev/sdb1<br />e2fsck 1.42.5 (29-Jul-2012)<br />Pass 1: Checking inodes, blocks, and sizes<br />Pass 2: Checking directory structure<br />Pass 3: Checking directory connectivity<br />Pass 4: Checking reference counts<br />Pass 5: Checking group summary information<br />/dev/sdb1: 184019/30777344 files (1.9% non-contiguous), 7022898/123088640 blocks<br /># resize2fs /dev/sdb1 31G<br />resize2fs 1.42.5 (29-Jul-2012)<br />Resizing the filesystem on /dev/sdb1 to 8388608 (4k) blocks.<br />The filesystem on /dev/sdb1 is now 8388608 blocks long.<br />#<br /></pre><br /><br />次にfdisk でパーティションのサイズを変更する.<br /><br />操作的にはサイズを変更というより,元のパーティションを削除して,同じところに小さいサイズのパーティションを作りなおすと,なる.<br /><br /><br /><pre class="example"><br /># fdisk /dev/sdb<br />The device presents a logical sector size that is smaller than<br />the physical sector size. Aligning to a physical sector (or optimal<br />I/O) size boundary is recommended, or performance may be impacted.<br /><br />Command (m for help): p<br /><br />Disk /dev/sdb: 512.1 GB, 512110190592 bytes<br />255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors<br />Units = sectors of 1 * 512 = 512 bytes<br />Sector size (logical/physical): 512 bytes / 4096 bytes<br />I/O size (minimum/optimal): 4096 bytes / 4096 bytes<br />Disk identifier: 0x000c3f6e<br /><br />Device Boot Start End Blocks Id System<br />/dev/sdb1 * 2048 984711167 492354560 83 Linux<br />/dev/sdb2 984713214 1000214527 7750657 5 Extended<br />Partition 2 does not start on physical sector boundary.<br />/dev/sdb5 984713216 1000214527 7750656 82 Linux swap / Solaris<br /><br />Command (m for help): d <-- パーティション削除<br />Partition number (1-5): 1<br /><br />Command (m for help): n <-- 新しいパーティション作成<br />Partition type:<br />p primary (0 primary, 1 extended, 3 free)<br />l logical (numbered from 5)<br />Select (default p):<br />Using default response p<br />Partition number (1-4, default 1):<br />Using default value 1<br />First sector (2048-1000215215, default 2048):<br />Using default value 2048<br />Last sector, +sectors or +size{K,M,G} (2048-984713213, default 984713213): +32G<br /><br />Command (m for help): p<br /><br />Disk /dev/sdb: 512.1 GB, 512110190592 bytes<br />255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors<br />Units = sectors of 1 * 512 = 512 bytes<br />Sector size (logical/physical): 512 bytes / 4096 bytes<br />I/O size (minimum/optimal): 4096 bytes / 4096 bytes<br />Disk identifier: 0x000c3f6e<br /><br />Device Boot Start End Blocks Id System<br />/dev/sdb1 2048 69208063 34603008 83 Linux<br />/dev/sdb2 984713214 1000214527 7750657 5 Extended<br />Partition 2 does not start on physical sector boundary.<br />/dev/sdb5 984713216 1000214527 7750656 82 Linux swap / Solaris<br /><br />Command (m for help): w<br />The partition table has been altered!<br /><br />Calling ioctl() to re-read partition table.<br />Syncing disks.<br />#<br /></pre><br /><br />最後にファイルシステムのサイズをパーティションのサイズに合わせる.<br /><br /><br /><pre class="example"><br /># resize2fs /dev/sdb1<br />resize2fs 1.42.5 (29-Jul-2012)<br />Resizing the filesystem on /dev/sdb1 to 8650752 (4k) blocks.<br />The filesystem on /dev/sdb1 is now 8650752 blocks long.<br />#<br /></pre><br /><br />これで完了(のはず)<br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-4" class="outline-3"><br /><h3 id="sec-1-4"><span class="section-number-3">1.4</span> おわりに</h3><br /><div class="outline-text-3" id="text-1-4"><br />パーティションの操作にあまり慣れていなかったので,結構調べるのに時間かかった.<br /><br /><br /></div><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-15514921200341351582015-04-09T02:02:00.001+09:002015-04-09T02:02:32.160+09:00Debian でQEMU をビルド<div id="outline-container-sec-1" class="outline-2"><br /><h2 id="sec-1"><span class="section-number-2">1</span> Debian でQEMU をビルド</h2><br /><div class="outline-text-2" id="text-1"><br /></div><div id="outline-container-sec-1-1" class="outline-3"><br /><h3 id="sec-1-1"><span class="section-number-3">1.1</span> はじめに</h3><br /><div class="outline-text-3" id="text-1-1"><br />QEMU の環境を何度も作る機会があったので,書いておく.<br /><br /><br /></div><br /></div><br /><div id="outline-container-sec-1-2" class="outline-3"><br /><h3 id="sec-1-2"><span class="section-number-3">1.2</span> 参考ページ</h3><br /><div class="outline-text-3" id="text-1-2"><br /><a href="http://furandon-pig.hatenablog.com/entry/2014/05/09/232358">Debian上にOSvビルド環境を構築してみた - 夜はいよいよ冴えたのだ。</a><br /><br />記事自体はOSv の環境構築について書いているものであるが,その一部としてQEMU のビルドの方法が書かれている.<br /><br />その部分をありがたく参考にさせていただいた.<br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-3" class="outline-3"><br /><h3 id="sec-1-3"><span class="section-number-3">1.3</span> 環境</h3><br /><div class="outline-text-3" id="text-1-3"><br /><pre class="example"><br /># cat /etc/debian_version<br />7.8<br /># uname -a<br />Linux kvm-host2 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux<br /></pre><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-4" class="outline-3"><br /><h3 id="sec-1-4"><span class="section-number-3">1.4</span> 手順</h3><br /><div class="outline-text-3" id="text-1-4"><br />まずはqemu のソースコードを入手する.<br /><br />ソースコードはgit でクローンするので,git のインストールも行う.<br /><br /><br /><pre class="example"><br /># apt-get install git<br /># git clone git://git.qemu.org/qemu.git<br /></pre><br /><br />次にビルドに必要なパッケージをインストールする.<br /><br /><br /><br /><pre class="example"><br /># apt-get install make<br /># apt-get install gcc<br /># apt-get install pkg-config<br /># apt-get install libglib2.0-dev<br /># apt-get install libcap-dev<br /># apt-get install libattr1-dev<br /># apt-get install libpixman-1-dev<br /></pre><br /><br />次に,ビルドの準備をする.<br /><br />具体的には,ビルドしたいQEMU のバージョンのソースコードへチェックアウト,configure の実行である.<br /><br />configure の実行はオプションが多くなりがちなので, <code>setup.sh</code> というスクリプトファイルにして実行してみた.<br /><br /><br /><pre class="example"><br />cd ~/qemu<br />git checkout v2.2.1<br />vi setup.sh<br /></pre><br /><br /><div class="org-src-container"><br /><br /><pre class="src src-sh">./configure --prefix=/opt/qemu-2.2.1 <span style="color: #00ff00;">\</span><br /> --target-list=x86_64-softmmu,x86_64-linux-user <span style="color: #00ff00;">\</span><br /> --enable-kvm <span style="color: #00ff00;">\</span><br /> --enable-vhost-net <span style="color: #00ff00;">\</span><br /></pre><br /></div><br /><br /><pre class="example"><br /># sh setup.sh 2>&1 | tee -a _setup.log<br /># make -j8 2>&1 | tee -a _make.log<br /># make install 2>&1 | tee -a _make-install.log<br /></pre><br /><br />最後に動作確認<br /><br /><br /><pre class="example"><br /># /opt/qemu-2.2.1/bin/qemu-system-x86_64 --version<br />QEMU emulator version 2.2.1, Copyright (c) 2003-2008 Fabrice Bellard<br /></pre><br /></div><br /></div><br /><div id="outline-container-sec-1-5" class="outline-3"><br /><h3 id="sec-1-5"><span class="section-number-3">1.5</span> おわりに</h3><br /><div class="outline-text-3" id="text-1-5"><br />書いてみて気づいたが,特別難しいところはなさそう.<br /><br />ビルドに必要なパッケージをいつも忘れるくらい.<br /><br /><br /></div><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-79845142783504332162015-03-20T12:20:00.001+09:002015-03-20T12:20:29.339+09:00Grub のブートメニューををシリアルポート経由で出力する<div id="outline-container-sec-1" class="outline-2"><br /><h2 id="sec-1"><span class="section-number-2">1</span> Grub のブートメニューををシリアルポート経由で出力する</h2><br /><div class="outline-text-2" id="text-1"><br /></div><div id="outline-container-sec-1-1" class="outline-3"><br /><h3 id="sec-1-1"><span class="section-number-3">1.1</span> 動作環境</h3><br /><div class="outline-text-3" id="text-1-1"><br /><ul class="org-ul"><br /><li>$ uname -a<br /><br />Linux debian 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 GNU/Linux<br /><br /></li><br /><li>$ sudo grub-install -v<br /><br />grub-install (GRUB) 1.99-27+deb7u2<br /><br /></li><br /></ul><br /></div><br /></div><br /><div id="outline-container-sec-1-2" class="outline-3"><br /><h3 id="sec-1-2"><span class="section-number-3">1.2</span> 設定方法</h3><br /><div class="outline-text-3" id="text-1-2"><br />注) コマンドはあとで思い出しながら書いたところがあるので,コピペしても動かないかも<br /><br /><br /><br /><code>/etc/default/grub</code> に以下を追記<br /><br /><br /><pre class="example"><br />GRUB_TERMINAL_INPUT='serial console'<br />GRUB_TERMINAL_OUTPUT='serial console'<br />GRUB_SERIAL_COMMAND='serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1'<br /></pre><br /><br /><code>grub-mkconfig</code> で設定ファイルを更新.<br /><br /><br /><pre class="example"><br /># grub-mkconfig -o /boot/grub/grub.cfg<br /></pre><br /><br />出力された <code>/boot/grub/grub.cfg</code> を確認する.<br /><br /><br /><br /><pre class="example"><br /># grep 'serial' /boot/grub/grub.cfg<br />serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1<br />terminal_input serial console<br />terminal_output serial console<br /></pre><br /><br />これで再起動すれば,GRUB のメニューがシリアルポート経由で出力される.<br /><br /><br /></div><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-49250396854346778592015-02-16T06:50:00.001+09:002015-02-16T06:50:25.159+09:00iPXE でBitVisor をネットワークブートしよう<div id="outline-container-sec-1" class="outline-2"><br /><h2 id="sec-1">iPXE でBitVisor をネットワークブートしよう</h2><br /><div class="outline-text-2" id="text-1"><br /></div><br /><div id="outline-container-sec-1-1" class="outline-3"><br /><h3 id="sec-1-1">はじめに</h3><br /><div class="outline-text-3" id="text-1-1"><br />BitVisor のブートは,ローカルディレクトリにイメージを置いて,Grub から起動する方法を取ることが多いかなと思うが,これは開発時には結構面倒.<br /><br />なぜなら,トライアンドエラー中にBitVisor のイメージを差し替えるためだけに,BitVisor なしで一度ブートしないといけないから.<br /><br />ネットワークブートなら,サーバーにおいてあるBitVisor のイメージを差し替えればいいので,楽.<br /><br />というわけで,ネットワークブートの方が楽だよ,と先輩に教わった方法をここに書く.<br /><br /><br /><br /><br />恐らく,ブートするのがBitVisorだからと言って特別なことはあまりない.<br /><br />Linux をiPXE でネットワークブートするのと設定はほぼ同じだと思う(Linux はやったことないけど.)<br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-2" class="outline-3"><br /><h3 id="sec-1-2">環境</h3><br /><div class="outline-text-3" id="text-1-2"><br /><ul class="org-ul"><br /><li>iPXEサーバーマシン: Raspberry Pi<br /><br /></li><br /><li>OS: Raspbian<br /><br /></li><br /></ul><br /></div><br /></div><br /><div id="outline-container-sec-1-3" class="outline-3"><br /><h3 id="sec-1-3">必要なもの</h3><br /><div class="outline-text-3" id="text-1-3"><br /><ol class="org-ol"><br /><li>BitVisor を起動マシンするマシン(BIOS の設定でネットワークブートを有効にできるもの)<br /><br /></li><br /><li>Raspberry Pi<br /><br /></li><br /><li>GNU make が動くx86マシン(1. のマシンでもいい)<br /><br /><ul class="org-ul"><br /><li>iPXE のイメージとBitVisorのイメージを作るのに必要<br /><br /></li><br /></ul><br /></li><br /></ol><br /></div><br /></div><br /><div id="outline-container-sec-1-4" class="outline-3"><br /><h3 id="sec-1-4">設定方法</h3><br /><div class="outline-text-3" id="text-1-4"><br /></div><div id="outline-container-sec-1-4-1" class="outline-4"><br /><h4 id="sec-1-4-1">TFTP のインストール & 設定</h4><br /><div class="outline-text-4" id="text-1-4-1"><br />使うのはtftpd-hpa.<br /><br /><br /><br /><pre class="example"><br />$ sudo apt-get install tftpd-hpa <br />$ sudo vi /etc/default/tftpd-hpa <br />$ sudo service tftpd-hpa start<br /></pre><br /><br />設定ファイルの変更は以下の通り<br /><br /><br /><div class="org-src-container"><br /><br /><pre class="src src-diff"><span style="color: #0000ff; font-weight: bold;">4c4</span><br /><span style="color: #ff0000;"><</span><span style="color: #ff0000;"> TFTP_DIRECTORY="/srv/tftp"</span><br /><span style="color: #0000ff; font-weight: bold;">---</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> TFTP_DIRECTORY="/var/lib/tftpboot/"</span><br /><span style="color: #0000ff; font-weight: bold;">6c6</span><br /><span style="color: #ff0000;"><</span><span style="color: #ff0000;"> TFTP_OPTIONS="--secure"</span><br /><span style="color: #0000ff; font-weight: bold;">---</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> TFTP_OPTIONS="--secure -4"</span><br /></pre><br /></div><br />上記設定では, <code>/var/lib/tftpboot</code> にiPXE のイメージを置く設定.<br /><br /><code>/var/lib/tftpboot</code> がない状態でtftpd-hpa を起動しようとすると,失敗するらしい.<br /><br /><br /><br />オプションに <code>-4</code> をつけた理由.<br /><br />= オプション追加せずにtftpd-hpa を起動しようとしたら,Raspbian でIPv6 が無効になってて動かなかったから.<br /><br /><a href="http://chamaken.blogspot.jp/2011/04/obs600-debian-squeeze-1.html">ちょっと jot: obs600 で 再度 debian squeeze - その 1</a><br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-4-2" class="outline-4"><br /><h4 id="sec-1-4-2">DHCP サーバーのインストールと設定</h4><br /><div class="outline-text-4" id="text-1-4-2"><br /><pre class="example"><br />$ sudo apt-get install isc-dhcp-server<br />$ sudo vi /etc/dhcp/dhcpd.conf #設定ファイルの編集<br />$ sudo service isc-dhcp-server<br /></pre><br /><br />設定ファイルの変更(というより追記)は以下の通り<br /><br /><br /><div class="org-src-container"><br /><br /><pre class="src src-diff"><span style="color: #0000ff; font-weight: bold;">107a108,118</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> </span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> subnet 192.168.0.0 netmask 255.255.255.0 {</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> deny unknown-clients; # 下記でMACアドレスが登録されてない起動マシンは無視. </span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> host deep-desktop {</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> hardware ethernet 00:60:6E:EB:5A:D8; # 起動マシンのMACアドレス.</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> fixed-address 192.168.0.20; # BitVisorを起動するマシンに割り振るIPアドレス</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> option host-name "deep-desktop"; # host *** の部分と同じ.</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> next-server 192.168.0.30; # tftp サーバのIPアドレス.</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> filename "bitvisor-boot.kpxe"; # ipxe イメージのファイル名</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> }</span><br /><span style="color: #00ff00;">></span><span style="color: #00ff00;"> }</span><br /></pre><br /></div><br />これで,MACアドレス <code>00:60:6E:EB:5A:D8</code> から要求が来たら, TFTP で <code>/var/lib/tftpboot/bitvisor-boot.kpxe</code> を送る.<br /><br /><code>bitvisor-boot.kpxe</code> というのは,iPXE のイメージファイル.<br /><br />このファイルの作り方は後述.<br /><br /><br /></div><br /></div><br /><div id="outline-container-sec-1-4-3" class="outline-4"><br /><h4 id="sec-1-4-3">iPXE をイメージを作成</h4><br /><div class="outline-text-4" id="text-1-4-3"><br />iPXE はイメージファイルをtftp で起動マシンに投げて,起動マシンで実行される.<br /><br />なので,起動マシンがx86 ならx86向けにビルドする.<br /><br />というわけで,以下のイメージファイルの作成の操作はx86マシンでやる.<br /><br /><br /><pre class="example"><br />$ git clone git://git.ipxe.org/ipxe.git<br />$ cd ipxe/src<br />$ vi bitvisor-boot.ipxe <br />$ cat bitvisor-boot.ipxe <br />#!ipxe<br />dhcp<br />boot bitvisor.elf<br />$ make -j4 bin/undionly.kpxe EMBED=bitvisor-boot.ipxe<br /># scp bin/undionly.kpxe deep@raspberrypi:~<br /></pre><br /><code>bitvisor-boot.ipxe</code> はiPXE でのブート処理を記述するファイル.<br /><br />上記の設定で,サーバーの <code>/var/lib/tftpboot/bitvisor.elf</code> をブートする.<br /><br />今回は書かないが,この設定をいじると,ブートするイメージを選択するメニューを出せたりもする.<br /><br /><br /><br />make の結果, <code>bin/undionly.kpxe</code> が作成される.<br /><br />これが,iPXE のイメージファイル.<br /><br />このファイルをRaspberry Pi 上に置く.<br /><br /><br /><br />以下は,Raspberry Pi上で操作.<br /><br />TFTP のディレクトリにiPXE のイメージを置く(ついでにファイル名も変える)<br /><br /><br /><pre class="example"><br />$ sudo cp undionly.kpxe /var/lib/tftpboot/bitvisor-boot.kpxe<br /></pre><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-4-4" class="outline-4"><br /><h4 id="sec-1-4-4">BitVisor のビルド</h4><br /><div class="outline-text-4" id="text-1-4-4"><br />これもx86マシンでやる.<br /><br /><br /><pre class="example"><br />$ wget http://sourceforge.net/projects/bitvisor/files/latest/download?source=files -o bitvisor-1.4.tar.gz<br />$ tar -zxvf bitvisor-1.4.tar.gz <br />$ cd bitvisor-1.4/<br />$ tar -zxvf bitvisor-1.4.tar.gz <br />$ cd bitvisor-1.4/<br />$ history | tail -n3<br />$ make config # 動かすだけならデフォルト設定で大丈夫だと思う(多分)<br />$ make -j4<br />$ scp bitvisor.elf deep@raspberrypi:~<br /></pre><br /><br />Raspberry Pi でbitvior.elf をTFTP のディレクトリに配置.<br /><br /><br /><pre class="example"><br />$ cp bitvisor.elf /var/lib/tftpboot/bitvisor.elf<br /></pre><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-4-5" class="outline-4"><br /><h4 id="sec-1-4-5">いざブート…の前にBIOS 設定</h4><br /><div class="outline-text-4" id="text-1-4-5"><br /><ul class="org-ul"><br /><li>ブートする前にBitVisor を起動するマシンのBIOS の設定を変更<br /><br /><ul class="org-ul"><br /><li>ネットワークブートを有効にする(大抵どこかにあると思うので探そう,これなかったら諦めて別のマシンを用意して)<br /><br /></li><br /></ul><br /></li><br /><li>ブートの優先順位でネットワークブートを再優先にする<br /><br /><ul class="org-ul"><br /><li>優先順位の選択にネットワークブートを出すには,ネットワークブートを有効化してから一時Save&Exit しないといけないので注意.<br /><br /></li><br /></ul><br /></li><br /></ul><br /></div><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-5" class="outline-3"><br /><h3 id="sec-1-5">おわりに</h3><br /><div class="outline-text-3" id="text-1-5"><br />今回はRaspberry Pi をサーバにしてみたが,VMでもいいからx86 マシンを用意できるからそっちの方が多分よい.<br /><br />なぜなら,iPXE のイメージを差し替えるときにいちいち別のマシンでビルドしないといけないから…<br /><br /><br /><br />雑な説明になってしまったので,質問や突っ込みがあれば,是非お願いします.<br /><br />(TFTP とかiPXE の仕組みはたぶん3割くらいしかわかってないので,仕組みとかは質問されても答えられないと思うけど…)<br /><br /><br /></div><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-27275373418319494262015-01-21T08:46:00.001+09:002015-01-21T09:13:35.424+09:00org-mobile-pull/push を自動実行する設定<div class="outline-2" id="outline-container-sec-1"><br />
<div class="outline-3" id="outline-container-sec-1-1"><h3 id="sec-1-1"><span class="section-number-3">1.1</span> はじめに</h3><div class="outline-text-3" id="text-1-1">org-mobile でTODO 管理とかすると,PC からの入力がストレスレスで良いのだけど,なにせ,いちいちコマンド叩いて同期するのが面倒.<br />
<br />
というわけで,自動的にorg-mobile-pull とかorg-mobile-push とかするようにしてみた.<br />
<br />
まだ,この設定で動かした時間短い(30分ぐらい)ので,どこかおかしなところを見逃してる可能性ある.<br />
<br />
だから,あんまり鵜呑みにしないようにお願いします.<br />
(追記: 後述のcapture ファイル監視でのpullは動いてないっぽい... 2015/01/21 09:12)<br />
<br />
<br />
</div><br />
</div><br />
<div class="outline-3" id="outline-container-sec-1-2"><br />
<h3 id="sec-1-2"><span class="section-number-3">1.2</span> やること</h3><br />
<div class="outline-text-3" id="text-1-2"><br />
<ul class="org-ul"><li>Emacs が開いている間,アイドル時間が一定時間以上でpull してpush</li>
<li><strike>org-mobile-capture-file が変更されたらpull</strike> (追記: 下記の設定では動いてないぽい)<br />
<br />
<ul class="org-ul"><li>capture ファイルは,org-mobile で同期取るときに使う差分を保持する一時ファイルだったかな? とにかく,他のデバイスとかで編集するとこのファイルが更新されるっぽい.</li>
</ul></li>
<li>ファイルをセーブするときにはpush</li>
<li>ファイルを開くときにはpull</li>
</ul><br />
</div><br />
</div><br />
<div class="outline-3" id="outline-container-sec-1-3"><br />
<h3 id="sec-1-3"><span class="section-number-3">1.3</span> 参考にしたコード</h3><br />
<div class="outline-text-3" id="text-1-3"><br />
以下のリンクにあるサンプルコードを参考にした<br />
<br />
<a href="https://github.com/matburt/mobileorg-android/wiki/FAQ#How_do_I_get_orgmode_to_execute_orgmobilepush_automatically">FAQ · matburt/mobileorg-android Wiki</a><br />
<br />
やってることは<br />
<br />
<br />
<ul class="org-ul"><li>org-mobile に登録したファイルを保存すると,その後アイドル時間30秒経過するとpush を実行</li>
<li>24時間に一回の頻度でpush</li>
<li>Emacs 起動時にpull</li>
<li>org-mobile が更新されたらpull</li>
</ul><br />
</div><br />
</div><br />
<div class="outline-3" id="outline-container-sec-1-4"><br />
<h3 id="sec-1-4"><span class="section-number-3">1.4</span> やってみる</h3><br />
<div class="outline-text-3" id="text-1-4"><br />
</div><div class="outline-4" id="outline-container-sec-1-4-1"><br />
<h4 id="sec-1-4-1"><span class="section-number-4">1.4.1</span> コード</h4><br />
<div class="outline-text-4" id="text-1-4-1"><br />
<div class="org-src-container"><br />
<br />
<pre class="src src-emacs-lisp">(<span style="color: cyan; font-weight: bold;">defvar</span> <span style="color: yellow;">org-mobile-sync-timer</span> nil
<span style="color: lime;">"Timer that `</span><span style="color: lime;">org-mobile-sync-timer</span><span style="color: lime;">' used to reschedule itself, or nil."</span>)
<span style="color: yellow;">;;</span><span style="color: yellow;">pullしてpush する関数</span>
(<span style="color: cyan; font-weight: bold;">defun</span> <span style="color: blue; font-weight: bold;">org-mobile-sync</span> nil
(interactive)
(org-mobile-pull)
(org-mobile-push))
<span style="color: yellow;">;;</span><span style="color: yellow;">idle 時間が60秒経過すると自動でpullしてpush</span>
(<span style="color: cyan; font-weight: bold;">defun</span> <span style="color: blue; font-weight: bold;">org-mobile-set-sync-timer</span> nil
(interactive)
(setq org-mobile-sync-timer (run-with-idle-timer 10 60 t 'org-mobile-sync))) <span style="color: yellow;">;;</span><span style="color: yellow;">修正 2015/01/21 09:04</span>
<span style="color: yellow;">;;</span><span style="color: yellow;">自動pull, push を無効にする(一応用意してみたが使うかどうか...)</span>
(<span style="color: cyan; font-weight: bold;">defun</span> <span style="color: blue; font-weight: bold;">org-mobile-clear-sync-timer</span> nil
(interactive)
(cancel-timer org-mobile-sync-timer))
<span style="color: yellow;">;;</span><span style="color: yellow;">↓要修正 (追記:2015/01/21 09:11)</span>
<span style="color: yellow;">;;</span><span style="color: yellow;">指定されたファイルを指定された時間で監視,更新されたらorg-mobile-pull を実行</span>
(<span style="color: cyan; font-weight: bold;">defun</span> <span style="color: blue; font-weight: bold;">install-monitor</span> (file secs)
(run-with-timer
0 secs
(<span style="color: cyan; font-weight: bold;">lambda</span> (f p)
(<span style="color: cyan; font-weight: bold;">unless</span> (< p (second (time-since (elt (file-attributes f) 5))))
(org-mobile-pull)))
file secs))
<span style="color: yellow;">;; </span><span style="color: yellow;">capture ファイルを5秒ごとに監視,更新されたらorg-mobile-pull 実行</span>
(install-monitor (file-truename
(concat
(file-name-as-directory org-mobile-directory)
org-mobile-capture-file))
5)
<span style="color: yellow;">;; </span><span style="color: yellow;">org-mobile に登録したファイルを保存するとpush</span>
(add-hook 'after-save-hook
(<span style="color: cyan; font-weight: bold;">lambda</span> ()
(<span style="color: cyan; font-weight: bold;">when</span> (eq major-mode 'org-mode)
(<span style="color: cyan; font-weight: bold;">dolist</span> (file (org-mobile-files-alist))
(<span style="color: cyan; font-weight: bold;">if</span> (string= (file-truename (expand-file-name (car file)))
(file-truename (buffer-file-name)))
(org-mobile-push)))
)))
<span style="color: yellow;">;; </span><span style="color: yellow;">org-mobile に登録したファイルを開くとpull</span>
(add-hook 'find-file-hook
(<span style="color: cyan; font-weight: bold;">lambda</span> ()
(<span style="color: cyan; font-weight: bold;">when</span> (eq major-mode 'org-mode)
(<span style="color: cyan; font-weight: bold;">dolist</span> (file (org-mobile-files-alist))
(<span style="color: cyan; font-weight: bold;">if</span> (string= (file-truename (expand-file-name (car file)))
(file-truename (buffer-file-name)))
(org-mobile-pull)))
)))
(org-mobile-set-sync-timer) ;; ←追記 2015/01/21 09:00
</pre><br />
</div><br />
<ul class="org-ul"><li>ファイルをセーブするときpushするコードは,元のコードから遅延を省いただけ.</li>
<li>capture ファイル変更でpull するコードは元コードそのまま</li>
</ul><br />
</div><br />
</div><br />
</div><br />
<br />
<div class="outline-3" id="outline-container-sec-1-5"><br />
<h3 id="sec-1-5"><span class="section-number-3">1.5</span> おわりに</h3><br />
<div class="outline-text-3" id="text-1-5"><br />
とりあえず,これでしばらく使ってみる.<br />
<br />
もしかしたら何か問題あるかも知れない.<br />
<br />
問題が見つかって,気が向いたらこの記事直します.(無責任)<br />
<br />
<br />
</div><br />
</div><br />
</div><br />
<br />
-- <br />
<a href="http://github.com/rileyrg">My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-64046524714354926812015-01-19T07:10:00.001+09:002015-01-19T07:10:21.687+09:00Emacs Lisp を少し勉強した<div id="outline-container-sec-1" class="outline-2"><br /><h2 id="sec-1"><span class="section-number-2">1</span> Emacs Lisp を少し勉強した   <span class="tag"><span class="gblog">gblog</span></span></h2><br /><div class="outline-text-2" id="text-1"><br />Emacs Lisp のコードを読むときに知らなくて困った(多分)基本的な所をメモ.<br /><br />困ったときに調べたものだけメモしているので,網羅はしてない.<br /><br /><br /></div><br /><div id="outline-container-sec-1-1" class="outline-3"><br /><h3 id="sec-1-1"><span class="section-number-3">1.1</span> コンスセル</h3><br /><div class="outline-text-3" id="text-1-1"><br />「CARスロットおよびCDRスロットと呼ばれる 2つのポインタから成るオブジェクトです。」らしい.<br /><br />「各スロットは、任意のLispオブジェクトを指すことができます。」<br /><br />ドット記法とかで表現する.<br /><br /><code>(A . B)</code> と書くと,A がCARスロット,B がCDR スロット<br /><br /><br /><br />参考ページ:<br /><br /><a href="http://www.geocities.co.jp/SiliconValley-Bay/9285/ELISP-JA/elisp_29.html">GNU Emacs Lispリファレンスマニュアル: Cons Cell Type</a><br /><br /><br /></div><br /></div><br /><br /><br /><div id="outline-container-sec-1-2" class="outline-3"><br /><h3 id="sec-1-2"><span class="section-number-3">1.2</span> cons obj1 obj2</h3><br /><div class="outline-text-3" id="text-1-2"><br />obj1 とobj2 から成るコンスセルを作る関数.<br /><br />(cons 1 2) => (1 . 2)<br /><br /><br /></div><br /></div><br /><div id="outline-container-sec-1-3" class="outline-3"><br /><h3 id="sec-1-3"><span class="section-number-3">1.3</span> リスト</h3><br /><div class="outline-text-3" id="text-1-3"><br />リストはコンスセルの入れ子構造.<br /><br /><code>(1 2 3)</code> と表示する.<br /><br />この実態は,CARスロットが1, CDR スロットが(2 3) のコンスセル.<br /><br />2と3 が要素のリスト(2 3) の実態は CARスロットが2, CDR スロットが(3) のコンスセル<br /><br />3だけが要素のリスト(3) の実態は CAR スロットが3, CDR スロットが空リストの()<br /><br />ドット表記だと(1 . (2 . (3 . ())<br /><br />(cons 1 (2 3)) => (1 2 3)<br /><br />(cons 1 ()) => (1)<br /><br />また,空リスト() はnil とも書く<br /><br />つまり,<br /><br />(cons 1 nil) => (1)<br /><br /><br /></div><br /></div><br /><div id="outline-container-sec-1-4" class="outline-3"><br /><h3 id="sec-1-4"><span class="section-number-3">1.4</span> 関数car, cdr</h3><br /><div class="outline-text-3" id="text-1-4"><br />コンスセルのCAR スロットを取り出すのがcar 関数,CDR スロットを取り出すのがcdr 関数.<br /><br />リストに適用すると,以下のような感じ.<br /><br />(car '(0 1 2)) => 0<br /><br />(cdr '(0 1 2)) => (1 2)<br /><br /><br /></div><br /></div><br /><div id="outline-container-sec-1-5" class="outline-3"><br /><h3 id="sec-1-5"><span class="section-number-3">1.5</span> シングルクォートは何?</h3><br /><div class="outline-text-3" id="text-1-5"><br />car やcdr の例では'(0 1 2) とリストの前に「'」がついている.<br /><br />これは,リストを評価しないようにするためのものらしい.<br /><br />リストを評価するとは,リストのCAR スロット(第一要素)を関数名,第二引数以降を関数の引数として,計算するということ.<br /><br />Lisp は(0 1 2) とだけ書いて実行すると,0 を関数名,1 を第一引数,2 を第二引数として計算しようとするらしい.<br /><br />これをせずに,リストとしてそのまま置いておくために,シングルクォートをつける.<br /><br />関数名や変数名の前に「'」をつけるのも同じ理由のようである.<br /><br /><br /><br />参考ページ:<br /><br /><a href="http://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp_2.html#SEC13">Programming in Emacs Lisp: List Processing</a><br /><br /><br /><br />また,別の説明で,おそらくより厳密な説明が以下のリンクにある.<br /><br /><a href="http://www.mew.org/~kazu/doc/elisp/symbol.html">Emacs Lisp</a><br /><br />これをちゃんと理解するためには,シンボルというものを理解しないといけないらしい.<br /><br />また,シンボルなるものの構造については以下のリンクが詳しいと思う.<br /><br /><a href="http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp_8.html#SEC104">GNU Emacs Lispリファレンスマニュアル: シンボル</a><br /><br />このあたりの理解は今後の課題.<br /><br /><br /></div><br /></div><br /><div id="outline-container-sec-1-6" class="outline-3"><br /><h3 id="sec-1-6"><span class="section-number-3">1.6</span> let</h3><br /><div class="outline-text-3" id="text-1-6"><br />ローカル変数を定義して,最後のリストを評価する.<br /><br /><br /><br />(let (ローカル変数の定義のリスト) フォーム1 … フォームn)<br /><br /><br /><br />ローカル変数の定義のリストは以下の構文<br /><br />((ローカル変数名1 初期値1) ローカル変数名2 … (ローカル変数名n 初期値n))<br /><br />(ローカル変数名1 初期値1) と言うリストは,ローカル変数名1 が初期値1 で初期化することを示す.<br /><br />一方,ローカル変数2 とだけ書いていると,ローカル変数2 はnil で初期化する.<br /><br /><br /><br />フォームとは,Emacs Lisp のコードと思えばいいのかな?<br /><br />let 全体の戻り値は,最後のフォーム(フォームn) の戻り値になる.<br /><br /><br /><br />例:<br /><br />(let ((x 3)) x) => 3<br /><br />(let ((x 3) (y 2)) x y) => 2 ;; 最後のフォームがlet の戻り値になる<br /><br />(let ((x 3) (y 2)) (+ x y)) => 5<br /><br />(let ((x 3) y (z 4)) (list x y z)) => (3 nil 4) ;; (list x y z) はx y z を要素とするリストを返す<br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-7" class="outline-3"><br /><h3 id="sec-1-7"><span class="section-number-3">1.7</span> スペシャルフォーム(special form) とマクロ</h3><br /><div class="outline-text-3" id="text-1-7"><br />普通,リストの形式で書いて実行すると,全てのリストが評価される.<br /><br />しかし,例外があるらしく,それがspecial form というらしい.<br /><br />先のlet はその一つ.<br /><br />(let ((x 3) (y 2)) (+ x y)) の(x 3) はリストだが,これを関数として評価していない(したらx なんて関数はないとエラーが出るはず)<br /><br />一方,一番後ろの(+ x y) は評価されている.<br /><br />このように,let の引数に関しては,一番後ろしか評価しない,ということになっているようである.<br /><br />他にも,値を変数に代入するsetq などがそうらしい.<br /><br /><br /><br />また,スペシャルフォームという言葉を調べていると,マクロという言葉もよく見かける.<br /><br />マクロは,ユーザー定義のスペシャルフォームらしい.<br /><br />参考ページ:<br /><br /><a href="http://shigemk2.hatenablog.com/entry/20120408/1333861629">スペシャルフォームとマクロ - by shigemk2</a><br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-8" class="outline-3"><br /><h3 id="sec-1-8"><span class="section-number-3">1.8</span> dolist</h3><br /><div class="outline-text-3" id="text-1-8"><br />実は,このブログの内容は,dolist のサンプルコードがわからなくて調べだしたのがきっかけ.<br /><br />つまり,今回のブログはここがゴール.<br /><br /><br /><br />dolist もlet のようにスペシャルフォーム.<br /><br />構文は以下.<br /><br />(dolist (ローカル変数 リスト [戻り値]) フォーム1 … フォームn)<br /><br /><br /><br />リストの要素を一つずつローカル変数に代入してフォーム1 からフォームn の処理を繰り返す<br /><br />python とかでいうforeach 的なやつ.<br /><br />戻り値を設定しないと,dolist の戻り値はnil になる.<br /><br />また,戻り値に未定義の変数は使えないので,予め定義する必要がある.<br /><br />例:<br /><br />(let ((sum 0)) ;; 戻り値に使う変数を定義<br /><br /> (dolist (x '(1 2 3) sum)<br /><br /> (setq sum (+ x sum)))) => 6<br /><br /><br /></div><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-2861477023338352182014-12-11T02:56:00.001+09:002014-12-11T02:56:47.008+09:00org-export-as が吐く html の文字コードでハマる<div id="outline-container-sec-1" class="outline-2"><br /><h2 id="sec-1"><span class="section-number-2">1</span> org-export-as が吐く html の文字コードでハマる</h2><br /><div class="outline-text-2" id="text-1"><br />org-googlecl (<a href="https://github.com/rileyrg/org-googlecl">https://github.com/rileyrg/org-googlecl</a>) でこのブログに記事を投稿するためにごにゅごにょやってたらハマった.<br /><br />(ちなみに,org-googlecl は4年前から更新されてないみたいで,Org-mode のバージョンアップに合わせて自分で直さないと動かない)<br /><br />僕の環境では, <code>org-googlecl-blog</code> というコマンドで blogger で投稿するようになってる.<br /><br />このコマンドの中では,Org-mode のフォーマットを HTML に変換したあとに少し整形して googlecl のコマンドに渡すということをやってる.<br /><br />この HTML に変換する処理を今は <code>(org-export-as 'html nil t nil nil)</code> という関数でやっているのだが,これがEUC-JP しか吐いてくれない.<br /><br />EUC-JP だと googlecl さんがエンコードできねーと文句言うもんだからさて困った.<br /><br /><br /><br />結論としては, <code>org-googlecl-blog</code> コマンドを叩く前に <code>C-x RET c</code> でコマンドを実行する際の文字コードを utf-8 に指定すればとりあえず utf-8 で HTML が吐かれるようになった.<br /><br />なんか,釈然としないが,とりあえず今日はつかれたし,こんなことやってる場合ではないような気がするのでこれで置いとく.<br /><br /><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-82084381824596599022014-12-11T02:24:00.001+09:002014-12-11T02:24:43.249+09:00Org-mode で C-c C-e l 押下でLaTeXに\ エクスポートできなくなった時の話<div id="outline-container-sec-1" class="outline-2"><br /><h2 id="sec-1"><span class="section-number-2">1</span> Org-mode で C-c C-e l 押下でLaTeXにエクスポートできなくなった時の話   <span class="tag"><span class="gblog">gblog</span></span></h2><br /><div class="outline-text-2" id="text-1"><br />Org-mode で LaTeX へエクスポートしようと <code>C-c C-e l</code> 押下すると, <code>Symbol's function definition is void: org-e-latex-export-to-latex</code> とか言われたので場当たり的に対処<br /><br />半年か一年か放ったらかしになっていた古いEmacs, Org-mode の設定で,Gentoo さんがバシバシアップデートしてくれるEmacs とOrg-mode を使えばやっぱり問題が起きるわけで.<br /><br />とりあえず,対処療法的に問題が見つかったら潰している感じ.<br /><br />今回は,Org-mode <code>C-c C-e l</code> でLaTeX をエクスポートしようとしたら, <code>Symbol's function definition is void: org-e-latex-export-to-latex</code> と言われたので対処.<br /><br /><br /></div><br /><div id="outline-container-sec-1-1" class="outline-3"><br /><h3 id="sec-1-1"><span class="section-number-3">1.1</span> 環境</h3><br /><div class="outline-text-3" id="text-1-1"><br />現環境<br /><br /><br /><ul class="org-ul"><br /><li>Emacs version: GNU Emacs 24.4.1<br /><br /></li><br /><li>Org-mode version: Org-mode version 8.2.6<br /><br /></li><br /></ul><br />以前使ってた環境(うろ覚え)<br /><br /><br /><ul class="org-ul"><br /><li>Emacs version: GNU Emacs 23.4 くらいだったような気がする<br /><br /></li><br /><li>Org-mode version: 7.9.3 くらいだったような気がする<br /><br /></li><br /></ul><br /></div><br /></div><br /><div id="outline-container-sec-1-2" class="outline-3"><br /><h3 id="sec-1-2"><span class="section-number-3">1.2</span> org-e-latex-export-to-latex って何?</h3><br /><div class="outline-text-3" id="text-1-2"><br />昔の Org-mode の Contrib の中にある関数らしい.<br /><br />どうやら設定ファイルの中で古い Org-mode の Contrib を呼び出してるのがまずいらしい.<br /><br /><br /></div><br /></div><br /><br /><div id="outline-container-sec-1-3" class="outline-3"><br /><h3 id="sec-1-3"><span class="section-number-3">1.3</span> 問題回避(解決したとは言ってない)</h3><br /><div class="outline-text-3" id="text-1-3"><br />以前,org-md (Markdown へのエクスポートなどの機能を提供する) を試すために,org-mode/contrib/lisp をロードしていたが,正直全く使ってない.<br /><br />なので,とりあえず今回は org-mode/contrib/lisp のロードをやめるようにした.<br /><br />これで,=C-c C-e l l= でLaTeX へエクスポートされるようになった.<br /><br /><br /></div><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-55211827441858391092014-12-04T23:29:00.001+09:002014-12-04T23:29:30.873+09:00OSv のパッチを送るには<div id="outline-container-1" class="outline-2"><br /><h2 id="sec-1">はじめに</h2><br /><div class="outline-text-2" id="text-1"><br /><br /> <a href="http://qiita.com/advent-calendar/2014/osv">OSv Advent Calendar 2014 - Qiita</a> 4日目(4日目に公開できたらいいな).<br/><br /><br /> <br/><br /> 以前,<a href="http://connpass.com/event/9512/">OSvもくもく会#4 〜OSvで遊んでみよう〜 - connpass</a> でOSv へのパッチの送り方を教えていただいたので,紹介する.<br/><br /><br /> <br/><br /> なお,この記事の中身OSv というよりはGit の使い方っぽい.<br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-2" class="outline-2"><br /><h2 id="sec-2">OSv のパッチ</h2><br /><div class="outline-text-2" id="text-2"><br /><br /><ul><br /><li>メールで送る<br/><br /><ul><br /><li>Github のpull req ではない<br/><br /></li><br /><li>Linux のやり方に近い(気がする)<br/><br /></li><br /></ul><br /><br /></li><br /><li>パッチが受け入れられたら,github のリポジトリにマージしてもらえる.<br/><br /><ul><br /><li>マージされるとこんな感じ→ <a href="https://github.com/cloudius-systems/osv-apps/commit/fdeb89efa69c84d7ba01a4842451c8190ba78486">https://github.com/cloudius-systems/osv-apps/commit/fdeb89efa69c84d7ba01a4842451c8190ba78486</a><br/><br /></li><br /><li>(パッチの中身はCで書いたHello WorldをOSv に組み込むサンプルコード)<br/><br /></li><br /></ul><br /><br /></li><br /></ul><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-3" class="outline-2"><br /><h2 id="sec-3">送る流れ</h2><br /><div class="outline-text-2" id="text-3"><br /><br /><ul><br /><li><code>git format-patch</code> でパッチを生成<br/><br /></li><br /><li><code>git send-email</code> で送る<br/><br /><ul><br /><li><code>git send-email</code> を使わずにメールを送ってもいいけど,使った方が無難(僕は使わずに妙なことになった)<br/><br /></li><br /></ul><br /><br /></li><br /></ul><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-4" class="outline-2"><br /><h2 id="sec-4">パッチファイルを作る(git format-patch)</h2><br /><div class="outline-text-2" id="text-4"><br /><br /><ul><br /><li>git のユーザー名とメールアドレスを設定しておく<br/><br /></li><br /><li>変更を加えてローカルリポジトリにコミットまでする<br/><br /></li><br /><li><code>git format-patch -s <commit id></code><br/><br /><ul><br /><li>OSvにパッチを送る時は <b>-s オプションは必須</b>.<br/><br /><ul><br /><li>このオプションはパッチファイルに署名を追加する.<br/><br /></li><br /></ul><br /><br /></li><br /><li>–subject-prefix='PATCH v2' とオプションをつけると,パッチのタイトルの先頭にprefix を追加できる.<br/><br /><ul><br /><li>パッチを修正して再度送る場合などに,"PATCH v2" などとつける.<br/><br /></li><br /></ul><br /><br /></li><br /></ul><br /><br /></li><br /><li>コマンド実行の結果,"0001-commit-message.patch" のようなファイル名でパッチファイルが生成される.<br/><br /></li><br /></ul><br /><br /><br /></div><br /><br /><div id="outline-container-4-1" class="outline-3"><br /><h3 id="sec-4-1">生成されるパッチの中身</h3><br /><div class="outline-text-3" id="text-4-1"><br /><br /><br /><br/><br /><pre class="src src-diff"><span style="color: #b3b3b3;">From 9a81c71e4a64acdb62ffdfc8f5d5fbe77eca48a8 Mon Sep 17 00:00:00 2001</span><br /><span style="color: #b3b3b3;">From: Takaaki Fukai <<a href="mailto:deep.wiki@gmail.com">deep.wiki@gmail.com</a>></span><br /><span style="color: #b3b3b3;">Date: Sun, 9 Nov 2014 07:48:23 +0000</span><br /><span style="color: #b3b3b3;">Subject: [PATCH v2] add a native code example</span><br /><br /><span style="color: #b3b3b3;">Signed-off-by: Takaaki Fukai <<a href="mailto:deep.wiki@gmail.com">deep.wiki@gmail.com</a>> ←-s オプションでついた署名</span><br /><span style="background-color: #737373;">---</span><br /><span style="color: #b3b3b3;"> native-example/Makefile | 10 ++++++++++</span><br /><span style="color: #b3b3b3;"> native-example/README | 1 +</span><br /><span style="color: #b3b3b3;"> native-example/hello.c | 6 ++++++</span><br /><span style="color: #b3b3b3;"> native-example/module.py | 3 +++</span><br /><span style="color: #b3b3b3;"> native-example/usr.manifest | 1 +</span><br /><span style="color: #b3b3b3;"> 5 files changed, 21 insertions(+)</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/Makefile</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/README</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/hello.c</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/module.py</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/usr.manifest</span><br /><br /><span style="color: #b3b3b3;">diff --git a/native-example/Makefile b/native-example/Makefile</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..0271bcb</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/Makefile</span><br /><span style="background-color: #737373;">@@ -0,0 +1,10 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">.PHONY: module</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">module: hello</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">CFLAGS = -std=gnu99 -fpie -rdynamic</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">hello: hello.c</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> $(CC) -pie -o $@ $(CFLAGS) $(LDFLAGS) hello.c</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">clean:</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> rm -f hello</span><br /><span style="color: #b3b3b3;">diff --git a/native-example/README b/native-example/README</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..7ce6e3e</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/README</span><br /><span style="background-color: #737373;">@@ -0,0 +1 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">This is a minimal sample of porting native code.</span><br /><span style="color: #b3b3b3;">diff --git a/native-example/hello.c b/native-example/hello.c</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..be1cf2b</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/hello.c</span><br /><span style="background-color: #737373;">@@ -0,0 +1,6 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">#include <stdio.h></span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">int main(){</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> printf("Hello from C code\n");</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> return 0;</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">}</span><br /><span style="color: #b3b3b3;">diff --git a/native-example/module.py b/native-example/module.py</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..16c9bae</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/module.py</span><br /><span style="background-color: #737373;">@@ -0,0 +1,3 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">from osv.modules import api</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">default = api.run("/hello")</span><br /><span style="color: #b3b3b3;">diff --git a/native-example/usr.manifest b/native-example/usr.manifest</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..b79ddd9</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/usr.manifest</span><br /><span style="background-color: #737373;">@@ -0,0 +1 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">/hello: ${MODULE_DIR}/hello</span><br /><span style="background-color: #553333;">-</span><span style="background-color: #553333;">- </span><br /><span style="color: #b3b3b3;">1.9.3</span><br /></pre><br /><br /><br /> <br/><br /><br /> <br/><br /></div><br /></div><br /><br /></div><br /><br /><div id="outline-container-5" class="outline-2"><br /><h2 id="sec-5">パッチを送る</h2><br /><div class="outline-text-2" id="text-5"><br /><br /><br /></div><br /><br /><div id="outline-container-5-1" class="outline-3"><br /><h3 id="sec-5-1">前準備: メーリスの購読</h3><br /><div class="outline-text-3" id="text-5-1"><br /><br /><ul><br /><li>パッチを送る前にOSv の開発者メーリングリストの購読をする<br/><br /><ul><br /><li>メーリングリストはGoogle グループ<br/><br /></li><br /><li>メーリングリストのURL: <a href="https://groups.google.com/d/forum/osv-dev">https://groups.google.com/d/forum/osv-dev</a><br/><br /></li><br /></ul><br /><br /></li><br /></ul><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-5-2" class="outline-3"><br /><h3 id="sec-5-2">前準備: git send-email の設定</h3><br /><div class="outline-text-3" id="text-5-2"><br /><br /> (これが一番面倒)<br/><br /><ul><br /><li>参考URL: <a href="http://d.hatena.ne.jp/fixme/20110212/1297564806">LinuxカーネルHack: git commitからgit send-emailでGMailアカウントを用いたパッチ送信まで - ひっそりらぼ</a><br/><br /></li><br /><li>まずは必要なものをインストール<br/><br /></li><br /></ul><br /><br /><br /><br/><br /><pre class="example"># yum install git-email<br /># yum install msmtp<br /># yum install ca-certificates<br /></pre><br /><br /><ul><br /><li><code>~/.gitconfig</code> に以下を追記<br/><br /></li><br /></ul><br /><br /><br /><br/><br /><pre class="example">[sendemail]<br /> smtpserver = /usr/bin/msmtp<br /></pre><br /><br /><ul><br /><li><code>~/.msmtprc</code> を作成(以下はGmail アカウントからメールを送るための設定)<br/><br /></li><br /></ul><br /><br /><br /><br/><br /><pre class="example"># Example for a user configuration file<br /># Set default values for all following accounts.<br />defaults<br />tls on<br />tls_trust_file /etc/ssl/certs/ca-bundle.crt ←(※1)<br />logfile ~/.msmtp.log<br /># My email service<br />account gmail<br />host smtp.gmail.com<br />port 587<br />from deep.wiki@gmail.com<br />auth on<br />user deep.wiki@gmail.com<br />password ****************** ←(※2)<br /># Set a default account<br />account default : gmail<br /></pre><br /><br /><ul><br /><li>(※1)ディストリによってはファイルのパスが違うかもしれない.上はFedoraの例.<br/><br /></li><br /><li>(※2)Google の2段階認証を有効にしているときは,アプリケーション固有パスワード<br/><br /></li><br /></ul><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-5-3" class="outline-3"><br /><h3 id="sec-5-3">メールを送る</h3><br /><div class="outline-text-3" id="text-5-3"><br /><br /><ul><br /><li><code>git send-email 0001-add-a-native-code-example.patch</code> を実行<br/><br /></li><br /><li>起動すると"Who should the emails be sent to (if any)?" と送り先メールアドレスを聞かれる.<br/><br /><ul><br /><li>osv-dev@googlegroups.com と入力<br/><br /></li><br /></ul><br /><br /></li><br /><li>"Message-ID to be used as In-Reply-To for the first email (if any)?" と聞かれる.<br/><br /> とりあえず何も入れずにEnter で良かったはず.<br/><br /></li><br /><li>送信するメールの中身が表示されるので,確認してyを入力<br/><br /></li><br /></ul><br /><br /><br /><br/><br /><br /><br/><br /><pre class="example">[root@openstack-host apps]# git send-email 0001-add-a-native-code-example.patch <br />0001-add-a-native-code-example.patch<br />Who should the emails be sent to (if any)? osv-dev@googlegroups.com <br />Message-ID to be used as In-Reply-To for the first email (if any)? <br />(mbox) Adding cc: Takaaki Fukai <deep.wiki@gmail.com> from line 'From: Takaaki Fukai <deep.wiki@gmail.com>'<br />(body) Adding cc: Takaaki Fukai <deep.wiki@gmail.com> from line 'Signed-off-by: Takaaki Fukai <deep.wiki@gmail.com>'<br /><br />From: Takaaki Fukai <deep.wiki@gmail.com><br />To: osv-dev@googlegroups.com<br />Cc: Takaaki Fukai <deep.wiki@gmail.com><br />Subject: [PATCH v2] add a native code example<br />Date: Thu, 4 Dec 2014 14:10:45 +0000<br />Message-Id: <1417702245-4428-1-git-send-email-deep.wiki@gmail.com><br />X-Mailer: git-send-email 1.9.3<br /><br /> The Cc list above has been expanded by additional<br /> addresses found in the patch commit message. By default<br /> send-email prompts before sending whenever this occurs.<br /> This behavior is controlled by the sendemail.confirm<br /> configuration setting.<br /><br /> For additional information, run 'git send-email --help'.<br /> To retain the current behavior, but squelch this message,<br /> run 'git config --global sendemail.confirm auto'.<br /><br />Send this email? ([y]es|[n]o|[q]uit|[a]ll): y<br />OK. Log says:<br />Sendmail: /usr/bin/msmtp -i osv-dev@googlegroups.com deep.wiki@gmail.com<br />From: Takaaki Fukai <deep.wiki@gmail.com><br />To: osv-dev@googlegroups.com<br />Cc: Takaaki Fukai <deep.wiki@gmail.com><br />Subject: [PATCH v2] add a native code example<br />Date: Thu, 4 Dec 2014 14:10:45 +0000<br />Message-Id: <1417702245-4428-1-git-send-email-deep.wiki@gmail.com><br />X-Mailer: git-send-email 1.9.3<br /><br />Result: OK<br /></pre><br /><br />(ブログ書くときにやりかたを思い出すために別のアドレスに送ったときのログから送り先だけ"osv-dev@…"に変えたもの.実際のパッチを投げた時のではないので日付とかはお察し)<br/><br /><br /><br/><br /></div><br /></div><br /><br /></div><br /><br /><div id="outline-container-6" class="outline-2"><br /><h2 id="sec-6">おわりに</h2><br /><div class="outline-text-2" id="text-6"><br /><br /> パッチを送るまでに少々面倒な手順が必要だけど,一度設定してしまえば, <code>git format-patch</code> と <code>git send-email</code> コマンドだけでパッチを送れるようになる.<br/><br /> 最初は <code>git send-email</code> を使わずにメーラーにパッチをコピペして送ったろうとしてみた.<br/><br /> しかし,妙な空行が入ったりして逆に面倒だったので,最初から <code>git send-email</code> 使った方がよい.<br/><br /><br /> <br/><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-9235197757326215122014-11-10T22:00:00.001+09:002014-11-10T22:00:43.936+09:00OSv もくもく会#4 の作業メモ<div id="outline-container-1" class="outline-2"><br /><h2 id="sec-1">はじめに</h2><br /><div class="outline-text-2" id="text-1"><br /><br />以前 <a href="https://github.com/syuu1228/fedora-chroot-image">https://github.com/syuu1228/fedora-chroot-image</a> を使わせて頂いて,OSv をビルドできる環境を整えた.<br/><br />で,自分で書いたC のHello World を動かそうとしてうまくいかなくて終わったような気がする.<br/><br /><br /><br/><br />今回こそはC のHello World を動かす.<br/><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-2" class="outline-2"><br /><h2 id="sec-2">最新版のコードをビルドする</h2><br /><div class="outline-text-2" id="text-2"><br /><br />自分の環境は2,3ヶ月放置していたものなので,まずはOSv の最新のコードをpull してくる.<br/><br />まぁ,pull してmake すればいいだろうと軽い気持ちでpull し始めたわけだが…<br/><br /><br /><br/><br />chroot 環境で<br/><br /><br /><br/><br /><pre class="example"># cd /root/osv<br /># git pull<br /></pre><br /><br /><br />とりあえず何も考えずにmake 叩く<br/><br /><br /><br/><br /><pre class="example"># make<br /></pre><br /><br /><br />ばばーん<br/><br /><br /><br/><br /><pre class="example"> ...(中略)<br />make[1]: Entering directory `/root/osv/build/release.x64'<br />/root/osv/build.mk:928: *** Error: libstdc++.a needs to be installed.. Stop.<br />make[1]: Leaving directory `/root/osv/build/release.x64'<br /><br />make: *** [all] Error 2<br /></pre><br /><br /><br />新しいライブラリが必要になっているみたいなので,それをインストール<br/><br /><br /><br/><br /><pre class="example"># yum install libstdc++-static.x86_64<br /></pre><br /><br /><br />もう一回make<br/><br /><br /><br/><br /><pre class="example"># make -j7<br /></pre><br /><br /><br />ばばーん(2回目)<br/><br /><br /><br/><br /><pre class="example">...(中略)<br /> CC libc/errno/strerror.o<br />/root/osv/libc/errno/strerror.c:12:45: fatal error: ../../musl/src/errno/__strerror.h: No such file or directory<br /> #include "../../musl/src/errno/__strerror.h"<br /> ^<br />compilation terminated.<br /> CC libc/locale/duplocale.o<br />make[1]: *** [libc/errno/strerror.o] Error 1<br />make[1]: *** Waiting for unfinished jobs....<br />make[1]: Leaving directory `/root/osv/build/release.x64'<br />make: *** [all] Error 2<br /></pre><br /><br /><br />サブモジュールが増えてるらしい.<br/><br />サブモジュールもちゃんとアップデートする.<br/><br /><br /><br/><br /><pre class="example"># git submodule update --init --recursive<br /></pre><br /><br /><br />3度目の正直<br/><br /><br /><br/><br /><pre class="example"># make -j7<br /></pre><br /><br /><br /><br />ばばーん<br/><br /><br /><br/><br /><pre class="example">...(中略)<br />make[3]: Leaving directory `/root/osv/modules/lua/build/luarocks-2.1.2'<br />out/bin/luarocks install luasocket 3.0-rc1<br />Warning: Failed searching manifest: Failed loading manifest: Failed extracting manifest file<br />Installing http://luarocks.giga.puc-rio.br/luasocket-3.0rc1-1.src.rock...<br />Using http://luarocks.giga.puc-rio.br/luasocket-3.0rc1-1.src.rock... switching to 'build' mode<br /><br />Error: Failed unpacking rock file: /tmp/luarocks_luarocks-rock-luasocket-3.0rc1-1-2801/luasocket-3.0rc1-1.src.rock<br />make[2]: *** [out/lib/lua/5.2/socket/core.so] Error 1<br />make[2]: Leaving directory `/root/osv/modules/lua'<br />Traceback (most recent call last):<br /> File "/root/osv/scripts/module.py", line 239, in <module><br /> args.func(args)<br /> File "/root/osv/scripts/module.py", line 196, in build<br /> make_modules(modules, args)<br /> File "/root/osv/scripts/module.py", line 100, in make_modules<br /> raise Exception('make failed for ' + module.name)<br />Exception: make failed for lua<br />make[1]: *** [process-modules] Error 1<br />make[1]: Leaving directory `/root/osv/build/release.x64'<br />make: *** [all] Error 2<br /></pre><br /><br /><br />要らないファイルが残ってたらしい.<br/><br />とりあえずmake clean, git clean した.<br/><br /><br /><br/><br /><pre class="example"># make clean<br /># git clean -xdf<br /></pre><br /><br />で解決.<br/><br /><br /><br/><br />4度目の正直<br/><br /><br /><br/><br /><pre class="example"># make -j7<br /></pre><br /><br /><br />でやっとビルドができた.<br/><br />これでスタート地点.<br/><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-3" class="outline-2"><br /><h2 id="sec-3">リハビリ: Java のHello World の組み込み型を思い出す</h2><br /><div class="outline-text-2" id="text-3"><br /><br /> 参考URL <a href="https://github.com/cloudius-systems/osv-apps/tree/master/java-example">https://github.com/cloudius-systems/osv-apps/tree/master/java-example</a><br/><br /><ul><br /><li>最低限必要なファイルは以下の模様.<br/><br /><ul><br /><li>Hello.java<br/><br /></li><br /><li>Makefile<br/><br /></li><br /><li>module.py<br/><br /></li><br /><li>usr.manifest<br/><br /></li><br /></ul><br /><br /></li><br /></ul><br /><br /><br /></div><br /><br /><div id="outline-container-3-1" class="outline-3"><br /><h3 id="sec-3-1">Hello.java</h3><br /><div class="outline-text-3" id="text-3-1"><br /><br /> Java プログラムの本体<br/><br /><br /><br/><br /><pre class="src src-java"><span style="color: #00ffff;">public</span> <span style="color: #00ffff;">class</span> <span style="color: #98fb98;">Hello</span>{<br /> <span style="color: #00ffff;">public</span> <span style="color: #00ffff;">static</span> <span style="color: #98fb98;">void</span> <span style="color: #87cefa;">main</span>(<span style="color: #98fb98;">String</span> <span style="color: #eedd82;">args</span>[]){<br /> System.out.println(<span style="color: #ffa07a;">"Hello"</span>);<br /> }<br />} <br /></pre><br /><br /><br /> <br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-3-2" class="outline-3"><br /><h3 id="sec-3-2">Makefile</h3><br /><div class="outline-text-3" id="text-3-2"><br /><br /> 特に難しいところはなさそう.<br/><br /> 普通と違うのは <code>module: Hello.class</code> の行くらいか?<br/><br /><br /><br/><br /><pre class="example">module: Hello.class<br /><br />%.class: %.java<br /> javac $^<br /><br />clean:<br /> rm -rf *.class<br /></pre><br /><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-3-3" class="outline-3"><br /><h3 id="sec-3-3">module.py</h3><br /><div class="outline-text-3" id="text-3-3"><br /><br /> デフォルトの起動コマンドや引数を指定しているっぽい. <br/><br /><br /><br/><br /><pre class="src src-python"><span style="color: #00ffff;">from</span> osv.modules <span style="color: #00ffff;">import</span> api<br /><br />api.require(<span style="color: #ffa07a;">'java'</span>)<br /><br /><span style="color: #eedd82;">default</span> = api.run_java(classpath=[<span style="color: #ffa07a;">'/my-example'</span>], args=[<span style="color: #ffa07a;">'Hello'</span>])<br /></pre><br /><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-3-4" class="outline-3"><br /><h3 id="sec-3-4">usr.manifest</h3><br /><div class="outline-text-3" id="text-3-4"><br /><br /> これはあんまりわかってない.<br/><br /><br /><br/><br /><pre class="example">/my-example/Hello.class: ${MODULE_DIR}/Hello.class<br /></pre><br /><br /><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-3-5" class="outline-3"><br /><h3 id="sec-3-5">ビルド&実行</h3><br /><div class="outline-text-3" id="text-3-5"><br /><br /> ここでは,my-example というイメージ名で上記のプログラムを組み込んだイメージを作る.<br/><br /> 上記4つのプログラムをapps/my-example 以下に置く.<br/><br /> osv のルートディレクトリで以下のコマンドを実行.<br/><br /><br /><br/><br /><pre class="example">make image=my-example<br />scripts/run.py<br /></pre><br /><br /></div><br /></div><br /><br /></div><br /><br /><div id="outline-container-4" class="outline-2"><br /><h2 id="sec-4">本題: C のプログラムを組み込む</h2><br /><div class="outline-text-2" id="text-4"><br /><br /><ul><br /><li>参考URL: <a href="https://github.com/cloudius-systems/osv-apps/blob/master/memcached/Makefile">https://github.com/cloudius-systems/osv-apps/blob/master/memcached/Makefile</a><br/><br /></li><br /></ul><br /><br /><br /></div><br /><br /><div id="outline-container-4-1" class="outline-3"><br /><h3 id="sec-4-1">memcached をビルドしてみる</h3><br /><div class="outline-text-3" id="text-4-1"><br /><br /> 参考にしているmemchached のソースツリーにあるMakefile を見てみると,make 時にusr.manifest などを作成しているらしい.<br/><br /> 作成した後の状態を見たいので,まずはこれをビルドしてみる<br/><br /><br /><br/><br /> ビルドしようとしたら,あれこれ無いと言われるのでインストールする<br/><br /><br /><br/><br /><pre class="example"># yum install libevent-devel.x86_64<br /></pre><br /><br /><br /> 僕がビルドしたときは,apps/memcached/src が空っぽだった.<br/><br /> 本来はここにソースコードがダウンロードされるはずなのだが,何かが原因でうまくダウンロードされていなかったみたい.<br/><br /> これは,以下のようにmemcached ディレクトリをclean すれば解決した.<br/><br /><br /><br/><br /><pre class="example"># pushd apps/memcached/<br /># make clean<br /># popd<br /></pre><br /><br /><br /> memcached のビルド完了<br/><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-4-2" class="outline-3"><br /><h3 id="sec-4-2">Makefile</h3><br /><div class="outline-text-3" id="text-4-2"><br /><br /> 色々見た結果,気をつけないといけなさそうなのはMakefile のCFLAGS くらいに見える.<br/><br /> memcached では以下のように指定されている.<br/><br /><br /><br/><br /><pre class="example">CFLAGS = -std=gnu99 -fpie -rdynamic -DHAVE_CONFIG_H<br /></pre><br /><br /> CFLAGSのオプション<br/><br /><dl><br /><dt>-std=gnu99</dt><dd>C99+GNU拡張<br/><br /></dd><br /><dt>-fpie</dt><dd>位置独立実行形式(Position-Independent Executalbe)<br/><br /> ちなみに,共有ライブラリをコンパイルするときの-fpicは位置独立コード(Position-Independent Code)<br/><br /></dd><br /><dt>rdynamic</dt><dd>動的リンク可能なバイナリを作る<br/><br /></dd><br /><dt>-DHAVE<sub>CONFIG</sub><sub>H</sub></dt><dd>…よくわからん<br/><br /></dd><br /></dl><br /><br /><br /><br/><br /> たぶん,-DHAVE<sub>CONFIG</sub><sub>H</sub> はmemcached 特有な気がするので,今回のHello World アプリからは削除.<br/><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-4-3" class="outline-3"><br /><h3 id="sec-4-3">最終的なコード</h3><br /><div class="outline-text-3" id="text-4-3"><br /><br /> あとは,細々した要らないところを消していくだけで動いた.<br/><br /> 最終的なコードは以下の通り.<br/><br /> (以下のdiff のルートディレクトリはapps/ なので注意)<br/><br /><br /><br/><br /><pre class="src src-diff"><span style="background-color: #737373;">---</span><br /><span style="color: #b3b3b3;"> native-example/Makefile | 10 ++++++++++</span><br /><span style="color: #b3b3b3;"> native-example/hello.c | 6 ++++++</span><br /><span style="color: #b3b3b3;"> native-example/module.py | 3 +++</span><br /><span style="color: #b3b3b3;"> native-example/usr.manifest | 1 +</span><br /><span style="color: #b3b3b3;"> 4 files changed, 20 insertions(+)</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/Makefile</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/hello.c</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/module.py</span><br /><span style="color: #b3b3b3;"> create mode 100644 native-example/usr.manifest</span><br /><br /><span style="color: #b3b3b3;">diff --git a/native-example/Makefile b/native-example/Makefile</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..0271bcb</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/Makefile</span><br /><span style="background-color: #737373;">@@ -0,0 +1,10 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">.PHONY: module</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">module: hello</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">CFLAGS = -std=gnu99 -fpie -rdynamic</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">hello: hello.c</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> $(CC) -pie -o $@ $(CFLAGS) $(LDFLAGS) hello.c</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">clean:</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> rm -f hello</span><br /><span style="color: #b3b3b3;">diff --git a/native-example/hello.c b/native-example/hello.c</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..be1cf2b</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/hello.c</span><br /><span style="background-color: #737373;">@@ -0,0 +1,6 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">#include <stdio.h></span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">int main(){</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> printf("Hello from C code\n");</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;"> return 0;</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">}</span><br /><span style="color: #b3b3b3;">diff --git a/native-example/module.py b/native-example/module.py</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..16c9bae</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/module.py</span><br /><span style="background-color: #737373;">@@ -0,0 +1,3 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">from osv.modules import api</span><br /><span style="background-color: #335533;">+</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">default = api.run("/hello")</span><br /><span style="color: #b3b3b3;">diff --git a/native-example/usr.manifest b/native-example/usr.manifest</span><br /><span style="color: #b3b3b3;">new file mode 100644</span><br /><span style="color: #b3b3b3;">index 0000000..b79ddd9</span><br /><span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">/dev/null</span><br /><span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/native-example/usr.manifest</span><br /><span style="background-color: #737373;">@@ -0,0 +1 @@</span><br /><span style="background-color: #335533;">+</span><span style="background-color: #335533;">/hello: ${MODULE_DIR}/hello</span><br /><span style="background-color: #553333;">-</span><span style="background-color: #553333;">- </span><br /><span style="color: #b3b3b3;">1.9.3</span><br /></pre><br /><br /><br />以上で,C のHello World をOSv に組み込めました.<br/><br /><br /><br/><br /></div><br /></div><br /><br /></div><br /><br /><div id="outline-container-5" class="outline-2"><br /><h2 id="sec-5">おわりに</h2><br /><div class="outline-text-2" id="text-5"><br /><br /> 実は上記のようなCで書かれたHello Worldをポーティングするようなサンプルコードはこれまでosv-apps のリポジトリになかった.<br/><br /> そこで,syuu先生の勧めで上記のパッチをOSvのメーリングリストに送ってみたところめでたくマージされた.<br/><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-45948202681354009462014-11-06T06:34:00.003+09:002014-11-06T06:35:52.950+09:00glibc のビルドでハマったポイント&手順諸事情でglibc をビルドした時にハマったことのメモ.<br />
記事中のコマンドはコピペで書いたのではなく,記憶を頼りに手打ちしているので,コピペして動かしたりすると危険.参考程度に見てください.<br />
<br />
<br />
<h2>
ハマったポイント</h2>
- gawk ないとmake でこける<br />
- make install の前に/target_dir/ld.so.conf を作らないとこける<br />
<h2>
ビルド準備</h2>
- glibc をダウンロード(Git でクローンしたりアーカイブをダウンロード&解凍したり)<br />
- gawk をインストールする.<br />
これがないとmake でこける(こけてハマったのでこの記事書いてる).<br />
<blockquote class="tr_bq">
# apt-get install gawk</blockquote>
<br />
あとはいろんなところで解説があるのと同じようにビルド作業<br />
<br />
<h2>
ビルド手順</h2>
- 以下では~/glibc_ver にダウンロードしてきたglibc があることにする<br />
- 諸事情(ユーザーアカウントを作るのが面倒というとても深刻な事情)のため,すべてroot で作業しているが,ユーザーアカウントがある場合はユーザーアカウントでやったほうが安全.--prefix=${HOME}/install_target_dir とかにすればsudo なしでインストールまでできるはず(参考URLを見るとそう書いてあるからきっとそう)<br />
- インストール先は/root/my_glibc<br />
<br />
# cd ~/glibc_ver<br />
# mkdir build<br />
# cd build<br />
# ../configure --prefix=/root/my_glibc<br />
# make<br />
# touch /root/my_glibc/etc/ld.so.conf<br />
# make install<br />
<br />
<h3>
参考URL</h3>
Linux From Scratch:gcc、glibcインストール « 仙人の心得<br />
http://blog.mktime.com/archive/340.html<br />
<br />
chroot 環境に glibc を突っ込むメモ — togakushi.bitbucket.org 0.1 documentation<br />
http://togakushi.bitbucket.org/build/html/glic2.5_install.htmldeephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-67374030638630704032014-09-13T03:36:00.001+09:002014-09-13T03:37:53.583+09:00Ubuntu でKVM のブリッジ接続の設定をする<br />
<code>/etc/network/interfaces</code> の設定.<br />
<br />
編集前にはバックアップをとっておくべき.<br />
<br />
<br />
<br />
<br />
<code>/etc/network/interfaces</code> の設定例(固定IP)<br />
<br />
<br />
<br />
<br />
<pre class="example"># The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto p6p1
iface p6p1 inet manual
auto br0
iface br0 inet static
address xx.xx.xx.xx
netmask 255.255.255.0
network xx.xx.xx.0 #最後は大抵0
gateway xx.xx.xx.1 #最後は大抵1?
broadcast xx.xx.xx.255 #最後は大抵255
bridge_ports p6p1
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
dns-nameservers xx.xx.xx.xx #わからなかったらとりあえずgateway と同じで</pre>
<br />
<br />
<br />
libvirt が勝手に作るNAT 用のブリッジインターフェイスを削除.(大抵はvirbr0 という名前かな)<br />
<br />
<br />
<br />
<br />
<pre class="example">$ sudo virsh net-autostart default --disable
$ sudo virsh net-destroy default</pre>
<br />
<br />
<code>brctl show</code> で確認するとvirbr0 が消えてる.<br />
<br />
<br />
<br />
<br />
<code>network-manager</code> がいると設定を上書きされるらしい(未検証)なので,とりあえず <code>network-manager</code> を消しとく.<br />
<br />
<br />
<br />
<br />
<pre class="example">$ sudo apt-get remove network-manager</pre>
<br />
<br />
<br />
ネットワークを再起動<br />
<br />
<br />
<br />
<br />
<pre class="example">$ sudo service networking restart</pre>
<br />
<br />
これで <code>br0</code> にIP がふられてたらOK.<br />
<br />
以上.<br />
<br />
<br />
<br />
<br />
<br />
-- <br />
<a href="http://github.com/rileyrg">My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-3688567864452605422014-08-31T19:42:00.002+09:002014-12-11T03:02:23.894+09:00Mercurial でlog をツリー表示(グラフ表示)<pre class="example">$ hg log -G
</pre>
もしくは<br />
<pre class="example">$ hg log --graph
</pre>
-- <br />
<a href="http://github.com/rileyrg">My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-66406939224132427982014-05-19T13:09:00.001+09:002014-05-19T13:09:06.586+09:00Mac OS X+ Virtual Box + CapstanでOSvを動かす<br /> <a href="http://goo.gl/uM9z2W">OSvもくもく会#1 〜OSvで遊んでみよう〜 - connpass</a> に行って,OSv を動かしてきたので,それのまとめ.<br/><br /><br /><br/><br /> この記事では,OSv のイメージのダウンロード,実行を勝手にやってくれるCapstan というアプリケーションを使って,OSv を動かす方法を書く.<br/><br /> 以下では,OSv のデフォルトイメージをVirtualboxで動作させ,ホストマシンからSSH で接続する.<br/><br /><br /><div id="outline-container-1" class="outline-2"><br /><h2 id="sec-1">動作環境</h2><br /><div class="outline-text-2" id="text-1"><br /><br /><ul><br /><li>マシン: Mac Book Air 2011<br/><br /></li><br /><li>OS: Mac OS X 10.9.2<br/><br /></li><br /><li>Virtual Box: version 4.2.18<br/><br /></li><br /></ul><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-2" class="outline-2"><br /><h2 id="sec-2">前提</h2><br /><div class="outline-text-2" id="text-2"><br /><br /> Virtual Box は既にインストールされているものとします.<br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-3" class="outline-2"><br /><h2 id="sec-3">Go のインストール</h2><br /><div class="outline-text-2" id="text-3"><br /><br /> Capstan はGo で書かれている.<br/><br /> このため,Capstan を実行するために,まずGo をインストールする.<br/><br /><br /><br/><br /> 以下のURL から,Mac 用のパッケージである <code>go1.2.2.darwin-amd64-osx10.8.pkg</code> ダウンロードして,インストールする.<br/><br /> <a href="https://code.google.com/p/go/wiki/Downloads?tm=2">https://code.google.com/p/go/wiki/Downloads?tm=2</a><br/><br /><br /><br/><br /> Go はパッケージをインストールしただけでは動作せず,以下のように環境変数を設定しないといけない.<br/><br /><br /><br/><br /><pre class="example">$ export GOROOT=/usr/local/go <br />$ export PATH=$PATH:$GOROOT/bin<br /></pre><br /><br /> <code>GOROOT</code> はGo がインストールされた先を設定する.<br/><br /> 上記のパッケージからインストールした場合だと <code>/usr/local/go</code> になる.<br/><br /> また,2行目では,Go の実行ファイルにパスを通している.<br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-4" class="outline-2"><br /><h2 id="sec-4">Capstan のインストール</h2><br /><div class="outline-text-2" id="text-4"><br /><br /> Capstan のインストールには,go のパッケージマネージャ的なものを使う.<br/><br /> 使う前に,パッケージマネージャがインストールする先を <code>GOPATH</code> という環境変数で設定する必要がある.<br/><br /> 今回は, <code>$HOME/go</code> にインストールするようにした.<br/><br /><br /><br/><br /> その後, <code>go get</code> で,Capstan のGit リポジトリを指定し,インストールする.<br/><br /><br /><br/><br /><pre class="example">$ mkdir $HOME/go<br />$ export GOPATH=$HOME/go<br />$ go get github.com/cloudius-systems/capstan<br /></pre><br /><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-5" class="outline-2"><br /><h2 id="sec-5">Capstan によるOSv の実行</h2><br /><div class="outline-text-2" id="text-5"><br /><br /> Capstan の実行ファイルは <code>$HOME/go/bin</code> 以下にある.<br/><br /> 下記のようにCapstan を実行すれば,OSv のデフォルトイメージをダウンロードして,起動する.<br/><br /><br /><br/><br /><pre class="example">cd $HOME/go/bin<br />./capstan run cloudius/osv<br /></pre><br /><br /> 初回は,イメージをダウンロードするため,時間がかかる.<br/><br /> 2度目移行は,既にダウンロードされたイメージを実行するので,あまり時間はかからない.<br/><br /><br /><br/><br /> 上記コマンドによってOSv が動作すれば,ターミナルに <code>[/] %</code> と表示される.<br/><br /> これは,OSv のデフォルトイメージに入っているシェルである.<br/><br /> <code>ls</code> とか <code>ifconfig</code> が使える.<br/><br /> 使えるコマンド一覧は <code>help</code> コマンドで表示できる.<br/><br /><br /><br/><br /> 上記の起動コマンドでは指定していないが, -p オプションを付けることで,VMMを指定することができる.<br/><br /> Virtual Box であれば, <code>-p vbox</code> といった感じ.<br/><br /> Virtual Box しか入ってない環境ならば,上記のように,何も指定しなくても勝手にVirtual Box 用のイメージをダウンロードして実行する.<br/><br /><br /><br/><br /> ちなみに,Virtual Box のGUI管理ツールを起動してみると, <code>cloudius/osv</code> というインスタンスが実行中になっていることが確認できる.<br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-6" class="outline-2"><br /><h2 id="sec-6">ホストマシンからSSHを繋ぐ</h2><br /><div class="outline-text-2" id="text-6"><br /><br /> OSv のデフォルトイメージでは,sshd が動作しているため,ホストマシンからSSHで入ることができる.<br/><br /> Virtual Box 上のOSv にSSHでログインするには,起動時のコマンドでにポートフォワーディングの指定をする必要がある.<br/><br /> OSv は一度止めて(shell で <code>exit</code> コマンドを叩くと止まる) 以下のコマンドで再度OSv を起動する.<br/><br /><br /><br/><br /><pre class="example">./capstan run -f 2222:22 cloudius/osv<br /></pre><br /><br /> その後,別のターミナルで以下のようにすれば,OSv にSSHで入れる.<br/><br /> ユーザ名は <code>admin</code>, パスワードも <code>admin</code> である.<br/><br /><br /><br/><br /><pre class="example">$ ssh admin@localhost -p 2222<br /></pre><br /><br /> 僕の環境では,SSHログインの際にパスワードを聞かれるまでに5分か10分くらいかかった.<br/><br /> (原因はよくわかっていない.)<br/><br /> なかなかパスワードを聞かれなくても気長に待つように.<br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-7" class="outline-2"><br /><h2 id="sec-7">余談</h2><br /><div class="outline-text-2" id="text-7"><br /><br /><ul><br /><li>ssh で入ってifconfig と叩くと,出力がssh 側ではなく,シリアル側に出てしまう.<br/><br /> ls はちゃんとssh 側に出力される.<br/><br /><br /><br/><br /></li><br /><li>自分のマシンでOSv をビルドしたい場合は,Mac OS X では無理なのでLinux を使いましょうとのこと.<br/><br /><ul><br /><li>ビルドの推奨環境はFedora ,Ubuntu でも動きそう.<br/><br /></li><br /><li>ビルドする方法は, <a href="http://goo.gl/kky53t">Debian上にOSvビルド環境を構築してみた - 夜はいよいよ冴えたのだ。</a> でわかりやすく書かれている.<br/><br /><ul><br /><li>僕はLinux Mint 14 でこのブログの方法通りにやって OSv のデフォルトイメージを動作させることができた.<br/><br /></li><br /></ul><br /><br /></li><br /><li>Debian Stable は何か罠があるらしい.<br/><br /></li><br /></ul><br /><br /></li><br /></ul><br /><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-54816296893868432072014-04-10T02:45:00.001+09:002014-04-10T02:45:41.382+09:00git diff で色をつける<br /> git diff で色をつける設定は以下のコマンドで<br /><br /><br /><br /><pre class="example">$ git config --global color.ui true<br /></pre><br /><br /><br /> <br /> diff を表示するために使う pager プログラムが <code>lv</code> になっていると文字化けしてうまくdiffが表示されないらしい.<br /> (僕の環境では,何も設定してなかったが,どうもlvが使われているようだった.)<br /> そこで,pager を設定する.<br /> ここでは "lv -c" とオプション付きでlv を実行するようにしているが,"less" にしても大丈夫.<br /><br /><br /><br /><pre class="example">$ git config --global core.pager "less"<br /></pre><br /><br /><br /><br /><div id="table-of-contents"><br /><h2>Table of Contents</h2><br /><div id="text-table-of-contents"><br /><ul><br /><li><a href="#sec-1">1 参考URL</a></li><br /></ul><br /></div><br /></div><br /><br /><div id="outline-container-1" class="outline-2"><br /><h2 id="sec-1">参考URL</h2><br /><div class="outline-text-2" id="text-1"><br /><br /> <a href="http://git-scm.com/book/ja/Git-のカスタマイズ-Git-の設定">Git - Git の設定</a><br /> <a href="http://d.hatena.ne.jp/takihiro/20100523/1274567613">git diff や git log の文字化け対応 - takihiro日記</a><br /><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-36360294642760761572014-03-30T05:33:00.001+09:002015-08-23T05:59:43.418+09:00Raspberry Pi で Radikorec を使ってみる.<br />
家で目的もなく動いてるRaspberry Pi さんにラジオを録音してもらいたくなった.<br />
そこで, Raspberry Pi に <code>radikorec</code> をインストールしてみた.<br />
Raspberry Pi に限らず,たいていのUnix 系OSならほぼ同じ手順でインストールできそうだった.<br />
<br />
<div id="table-of-contents">
<br />
<h2>
Table of Contents</h2>
<br />
<div id="text-table-of-contents">
<br />
<ul>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-1">1 環境</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-2">2 radikorec のソースコードをダウンロード</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-3">3 distributeをインストール</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-4">4 その他必要なものをインストール</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-5">5 インストールスクリプトの編集</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-6">6 インストールスクリプトの実行</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-7">7 試験的に動かしてみる.</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-8">8 放送局コードについて</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-9">9 おまけ: mp3に変換して,コマンドラインから再生する.</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-10">10 コマンドリスト</a></li>
<li><a href="https://www.blogger.com/blogger.g?blogID=9086402829352649401#sec-11">11 my_script.sh の中身</a></li>
</ul>
<br /></div>
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-1">
<br />
<h2 id="sec-1">
環境</h2>
<br />
<div class="outline-text-2" id="text-1">
<br />
<br />
<マシン><br />
Raspberry Pi<br />
<br />
<OS><br />
Raspbian 7.1<br />
<br />
<カーネル><br />
Linux raspberrypi 3.6.11+ #538 PREEMPT Fri Aug 30 20:42:08 BST 2013 armv6l GNU/Linux<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-2">
<br />
<h2 id="sec-2">
radikorec のソースコードをダウンロード</h2>
<br />
<div class="outline-text-2" id="text-2">
<br />
<br />
radikorec のリポジトリは <a href="https://github.com/akiradeveloper/radikorec">akiradeveloper/radikorec · GitHub</a> にある.<br />
ここから,クローンする.<br />
<br />
<br />
<br />
<br />
<pre class="example">git clone https://github.com/akiradeveloper/radikorec.git</pre>
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-3">
<br />
<h2 id="sec-3">
setuptools <strike>distribute</strike> をインストール</h2>
(2015/08/22 更新: setuptools を使うように内容を変更)<br />
<br />
radikorec のインストールのために、python のパッケージ管理ツールであるsetuptools を使うため、これをインストールする.<br />
<br />
(この記事ではもともとdistribute を使うように書いていたが、distribute は2013年にsetuptools に取り込まれているらしいので、setuptools を使うほうがよいらしい<br />
また、元々この記事で紹介していた distribute インストール用のスクリプトへのリンクが切れてしまっている.<br />
このため、setuptools を使うように内容を変更した.)<br />
<div class="outline-text-2" id="text-3">
<br />
<br />
<strike><code>distributete</code> というpython のライブラリ? をインストール.</strike><br />
<strike>因みに,何のためのライブラリかはよくわかってない.</strike><br />
<strike><br />
</strike> <strike>昔は <code>distributete</code> でなはく <code>setuptools</code> というライブラリが主流だったらしい.</strike><br />
<strike>現在は, <code>setuptools</code> の開発は止まっており,それを引き継いで開発されているのが <code>distribute</code> ということらしい.</strike><br />
<strike>というわけで,今回は <code>distribute</code> をインストールする.</strike><br />
<strike>(このことに関連して,あとでradikorecのインストールスクリプトを修正する必要がある.)</strike><br />
<strike><br />
</strike> <strike>参考URL: <a href="http://mymemo.weby117.com/develop/python-package-manager.html">Pythonパッケージ管理ツールまとめ | サイト運営の私的メモ</a></strike><br />
<br />
<br />
<br />
<br />
<pre class="example"><strike>$ curl -O http://python-distribute.org/distribute_setup.py</strike>
$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
$ sudo python distribute_setup.py
</pre>
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-4">
<br />
<h2 id="sec-4">
その他必要なものをインストール</h2>
<br />
<div class="outline-text-2" id="text-4">
<br />
<br />
以下のコマンド(Debian 系)<br />
<br />
<br />
<br />
<pre class="example">sudo apt-get update
sudo apt-get install libssl-dev
sudo apt-get install ffmpeg</pre>
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-5">
<br />
<h2 id="sec-5">
インストールスクリプトの編集</h2>
(2015/08/22 更新: setuptools を使うように内容を変更)<br />
<div>
<br /></div>
<div class="outline-text-2" id="text-5">
<br />
<br />
<code>compile</code> と <code>setup.py</code> ファイルを編集.<br />
<code>compile</code> の方は <code>rtmpdump</code> のソースコードをgitリポジトリからクローンしてくるのだが,このリポジトリの指定先が参照できないので,変更.<br />
<strike><code>setup.py</code> は <code>setuptools</code> ではなく <code>distributete</code> をインストールしたための変更.</strike><br />
<br />
<br />
編集内容は以下の通り.<br />
<br />
<br />
<br />
<pre class="src src-diff"><span style="color: #b3b3b3;">$ git --no-pager diff</span>
<span style="color: #b3b3b3;">diff --git a/compile b/compile</span>
<span style="color: #b3b3b3;">index ef82607..8cf921e 100755</span>
<span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">a/compile</span>
<span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/compile</span>
<span style="background-color: #737373;">@@ -6,7 +6,8 @@</span><span style="background-color: #737373;"> pwd</span>
<span style="color: #b3b3b3;"> make</span>
<span style="color: #b3b3b3;"> cd -</span>
<span style="background-color: #553333;">-</span><span style="background-color: #553333;">git clone https://github.com/svnpenn/rtmpdump.git</span>
<span style="background-color: #335533;">+</span><span style="background-color: #335533;">git clone git://git.ffmpeg.org/rtmpdump</span>
<span style="background-color: #335533;">+</span><span style="background-color: #335533;"># git clone https://github.com/svnpenn/rtmpdump.git</span>
<span style="color: #b3b3b3;"> cd rtmpdump</span>
<span style="color: #b3b3b3;"> pwd</span>
<span style="color: #b3b3b3;"> make SYS=posix </span>
<strike><span style="color: #b3b3b3;">diff --git a/setup.py b/setup.py</span>
<span style="color: #b3b3b3;">index ecba8a4..5b2df88 100644</span>
<span style="background-color: #737373;">--- </span><span style="background-color: #999999; font-weight: bold;">a/setup.py</span>
<span style="background-color: #737373;">+++ </span><span style="background-color: #999999; font-weight: bold;">b/setup.py</span>
<span style="background-color: #737373;">@@ -1,5 +1,5 @@</span>
<span style="background-color: #553333;">-</span><span style="background-color: #553333;">#from distutils.core import setup</span>
<span style="background-color: #553333;">-</span><span style="background-color: #553333;">from setuptools import setup</span>
<span style="background-color: #335533;">+</span><span style="background-color: #335533;">from distutils.core import setup</span>
<span style="background-color: #335533;">+</span><span style="background-color: #335533;">#from setuptools import setup</span>
<span style="color: #b3b3b3;"> setup(</span>
<span style="color: #b3b3b3;"> name = 'radikorec',</span></strike>
</pre>
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-6">
<br />
<h2 id="sec-6">
インストールスクリプトの実行</h2>
<br />
<div class="outline-text-2" id="text-6">
<br />
<br />
以下のコマンドを実行する.<br />
<br />
<br />
<br />
<pre class="example">sudo make install
./compile
sudo ./setup </pre>
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-7">
<br />
<h2 id="sec-7">
試験的に動かしてみる.</h2>
<br />
<div class="outline-text-2" id="text-7">
<br />
<br />
以下のコマンドでradikorecを試してみることができる.<br />
<br />
<br />
<br />
<pre class="example">./runtest</pre>
<br />
<br />
これを実行すると. <code>/tmp/</code> 以下にログや録音した音声ファイルができるはず.<br />
<code>ffmpeg</code> のインストールを忘れてると,録音したのにエンコードできなくて音声ファイルが出力されない.<br />
僕は,毎度この段階で <code>ffmpeg</code> がないことに気づくので,実際に <code>./runtest</code> で音声ファイルを出力したことはなかったりする.<br />
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-8">
<br />
<h2 id="sec-8">
放送局コードについて</h2>
<br />
<div class="outline-text-2" id="text-8">
<br />
<br />
radikorec を使うときに,録音したい放送局を放送局コードで指定する.<br />
これを知るためには,<a href="http://radiko.jp/v2/api/program/today?area_id=JP14">http://radiko.jp/v2/api/program/today?area_id=JP14</a> へアクセスして返ってきたxml を見ればいいっぽい.<br />
<code><station io=hoge></code> の <code>hoge</code> の部分が放送局コード<br />
その放送局が何かはすぐしたの <code><name></code> に書いている.<br />
<br />
参考URL: <a href="http://www.asahi-net.or.jp/~sy8y-siy/memo/radiko/index.html">FreeBSD で radiko を録音する。</a><br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-9">
<br />
<h2 id="sec-9">
おまけ: mp3に変換して,コマンドラインから再生する.</h2>
<br />
<div class="outline-text-2" id="text-9">
<br />
<br />
raspberry pi イヤホン端子もあるので,再生して聞くこともできる.<br />
m4a 形式を直接コマンドラインから再生する方法がよくわからなかったのでmp3に変換してから再生してみた.<br />
以下のようにやればできた.<br />
<br />
m4a → mp3 は以下のようにやればできる.<br />
<br />
<br />
<br />
<pre class="example">ffmpeg -i NHR-2014-03-30-04-20.m4a hoge.mp3</pre>
<br />
<br />
<br />
<br />
再生は, <code>mpg321</code> をインストールして使えばOKっぽい.<br />
デバイスファイルへのアクセス権限の関係で,何も設定しないとユーザ権限では動作しない.<br />
今回は面倒だったのでsudo を付けないと動かした. <br />
sudo を付けたくない人は,<a href="http://master00asia.blog28.fc2.com/blog-entry-470.html">ブログログ mpg321を一般ユーザーで再生できるようにする。</a> などを見て,デバイスファイルにアクセスできるように権限を設定しよう.<br />
<code>mpg321</code> のインストールおよび再生コマンドは以下の通り.<br />
<br />
<br />
<br />
<pre class="example">sudo apt-get install mpg321
sudo mpg321 hoge.mp3 </pre>
<br />
<br />
<br />
ここに書いた方法で,Raspberry Pi から直接再生することができる.<br />
しかし,上記のエンコード処理はRaspberry Pi でやると非常に遅い.<br />
また,録音した音声ファイルのサイズは大きくなりがちなので,SDカードの容量も心配である.<br />
なので,音声ファイルは聞くときに別のマシンに移してしまって,そのマシンでエンコードなり再生なりしたほうがいいと思ったのがやってみた感想である.<br />
<br />
参考URL: <a href="http://master00asia.blog28.fc2.com/blog-entry-470.html">ブログログ mpg321を一般ユーザーで再生できるようにする。</a><br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-10">
<br />
<h2 id="sec-10">
コマンドリスト</h2>
<br />
<div class="outline-text-2" id="text-10">
<br />
<br />
<br />
<br />
<br />
<pre class="example">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 </pre>
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-11">
<br />
<h2 id="sec-11">
my_<span style="font-size: large;">script</span>.sh の中身</h2>
<br />
<div class="outline-text-2" id="text-11">
<br />
<br />
<br />
<br />
<br />
<pre class="src src-sh"><span style="color: #ff7f24;">#</span><span style="color: #ff7f24;">!/bin/</span><span style="color: cyan;">sh</span>
radikorec <span style="color: lightsalmon;">\</span>
--channel=LFR <span style="color: lightsalmon;">\</span>
--duration=1 <span style="color: lightsalmon;">\</span>
--prefix=NHR <span style="color: lightsalmon;">\</span>
--directory=/home/deep/radiko_data</pre>
<br />
<br /></div>
<br /></div>
<br />
<br />
-- <br />
<a href="http://github.com/rileyrg">My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-89388477612277205472014-03-11T17:09:00.001+09:002014-03-11T17:09:36.616+09:00Mac Port のselfupdate ができなかった時のメモ<br /> 長らく放置していたMac port.<br /> Mac OS X も Mervericks にアップデートしたし,いい加減アップデートしないとなぁ,とselfupdate しようとすると…<br /><br /><br /><br /><pre class="example">$ sudo port selfupdate<br />---> Updating MacPorts base sources using rsync<br />MacPorts base version 2.1.2 installed,<br />MacPorts base version 2.2.1 downloaded.<br />---> Updating the ports tree<br />---> MacPorts base is outdated, installing new version 2.2.1<br />Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl<br /><br />Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: command execution failed<br /></pre><br /><br /> などと,エラーがでてしまった.<br /><br /> これの解決は,以下のページを参考(というかそのまま)にしたらできた.<br /> <a href="http://goo.gl/B0RAlz">macportをアップデートしようとしたらエラーになった。 - @thorikiriのてょりっき</a><br /><br /> 要は,xcode のコマンドラインツールが入ってなかったらしい.<br /> Mac OS X をMervericks にアップデートするとインストールし直さないといけないんだったっけ?<br /> 以下の通りコマンドを叩くと,ポップアップが出てきて,コマンドラインツールをインストールするか否かを聞いてくる.<br /> OKを押せばインストールしてくれる.<br /><br /><br /><br /><pre class="example">$ sudo xcode-select --install<br /></pre><br /><br /> で,再度selfupdate を実行してみると…<br /><br /><br /><br /><pre class="example">$ sudo port selfupdate<br />Password:<br />---> Updating MacPorts base sources using rsync<br />MacPorts base version 2.1.2 installed,<br />MacPorts base version 2.2.1 downloaded.<br />---> Updating the ports tree<br />---> MacPorts base is outdated, installing new version 2.2.1<br />Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl<br /><br /><br />The ports tree has been updated. To upgrade your installed ports, you should run<br />port upgrade outdated<br />$ port version<br />Version: 2.2.1<br /><br /></pre><br /><br /> とちゃんとMac port が2.2.1へアップデートされたっぽい.<br /><br /> 余談だが,バージョンを確認するときは <code>port --version</code> ではないので注意.<br /> <code>port --version</code> と叩くと,以下の様に怒られる.<br /><br /><br /><br /><br /><pre class="example">$ port --version<br />Error: global does not accept --version<br />Usage: port<br /> [-bcdfknopqRstuvy] [-D portdir] [-F cmdfile] action [privopts] [actionflags]<br /> [[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]...<br /> <br />"port help" or "man 1 port" for more information.<br /></pre><br /><br /><br /><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-59685094988382257092013-12-20T22:08:00.001+09:002013-12-20T22:19:12.767+09:00岡山から離れて9ヶ月 〜岡山を離れて変わったこと,変わらなかったこと,etc〜<div id="table-of-contents">
<div id="text-table-of-contents">
<div>
<br /></div>
</div>
</div>
<div class="outline-2" id="outline-container-1">
<h2 id="sec-1">
はじめに</h2>
<br />
<div class="outline-text-2" id="text-1">
<br />
<br />
この記事は<a href="http://www.adventar.org/calendars/75">大都会岡山 Advent Calendar 2013 - Adventar</a>の20日目の記事となります.<br />
<br />
昨日は仁志 能野さんの<a href="http://www.yokizo.com/2013/12/19/3957">YOKIZO.com - 「本自炊」はじめました</a> でした.<br />
<br />
僕は,「本を自炊すれば部屋の荷物が少なくなっていいだろうなぁ」と思いつつ重い腰が上がらない今日このごろです.<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-2">
<br />
<h2 id="sec-2">
岡山ではなにやってたの?</h2>
<br />
<div class="outline-text-2" id="text-2">
<br />
<br />
9ヶ月前までは,大都会岡山の国立大学である岡山大学で<s>残念</s>大学生をやってました.<br />
<br />
岡山では勉強会にあちこち顔を出したり,たまに主催したりしてました.<br />
<br />
研究室時代にはLinux カーネルの中弄って面白いことする研究をしてました.</div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-3">
<br />
<h2 id="sec-3">
今どこでなにやってるの?</h2>
<br />
<div class="outline-text-2" id="text-3">
<br />
<br />
現在は,関東の国立大学である某T大学で大学院生をやってます.<br />
<br />
(まぁ,T大学って筑波大学なわけですが.)<br />
<br />
つくばや東京でも,ときどき勉強会に参加してます.<br />
<br />
研究室ではVMMを弄って面白いことをする研究をしてます.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-39Lp_TwAfBY/UrRCAvFfj6I/AAAAAAAAAYI/LcOgsudXSxk/s1600/IMG_20131214_164609.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-39Lp_TwAfBY/UrRCAvFfj6I/AAAAAAAAAYI/LcOgsudXSxk/s320/IMG_20131214_164609.jpg" width="240" /></a></div>
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-4">
<br />
<h2 id="sec-4">
岡山を離れて変わったこと</h2>
<br />
<div class="outline-text-2" id="text-4">
<br />
<br />
<br /></div>
<br />
<br />
<div class="outline-3" id="outline-container-4-1">
<br />
<h3 id="sec-4-1">
列車に乗るときにICカードを使うようになった</h3>
<br />
<div class="outline-text-3" id="text-4-1">
<br />
<br />
岡山にいるときはICカードなど持ってもいませんでした.<br />
<br />
つくばに引っ越してからも,しばらくはICカードを持たずに生活してました.<br />
<br />
ただ,東京近辺の列車は切符を買うのがあまりにも難しい!<br />
<br />
えっ,乗り換え後の料金表が切符売り場にないんだが…? 連絡切符って言われても何円の切符買えばいいの??? という事態になります.<br />
<br />
そんなわけで,いちいち値段調べて切符買って,なんてことしてられないのでICカードを買いました.<br />
<br />
<br />
<br />
余談ですが,こちらではICカードはPASUMOとSUICAのどちらかが手に入ります.<br />
<br />
ただ,どうせICカードを持つのならICOCAが良かったなぁと思います.<br />
<br />
あの青いカモノハシのキャラ「イコちゃん」は割と好きなキャラだったので.<br />
<br />
<a href="https://www.google.co.jp/search?q=%E3%82%A4%E3%82%B3%E3%81%A1%E3%82%83%E3%82%93&source=lnms&tbm=isch&sa=X&ei=0jW0Uv3ZJ4mJlQWzy4HADg&ved=0CAkQ_AUoAQ&biw=1280&bih=864">イコちゃん - Google Search</a><br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-3" id="outline-container-4-2">
<br />
<h3 id="sec-4-2">
あれ?勉強会って懇親会が本番じゃないの?</h3>
<br />
<div class="outline-text-3" id="text-4-2">
<br />
<br />
つくばに来てから,何度か勉強会に参加することがありました.<br />
<br />
そこでカルチャーショックだったのが「懇親会が地味」ということです.<br />
<br />
<br />
<br />
岡山の勉強会というと,勉強会後の懇親会は結構盛大にやります.<br />
<br />
飲み屋で懇親会して,さらに元気があればボーリングやカラオケへ,というのが割とよくありました,<br />
<br />
また,勉強会参加者の半数以上は懇親会に参加してたと思います.<br />
<br />
岡山の勉強会文化で育った僕は,「勉強会は懇親会が本番だ」と教わったほどです.<br />
<br />
(もちろん,勉強会自体もちゃんとやりますよ)<br />
<br />
<br />
<br />
しかし,関東での勉強会はどうも状況が違います.<br />
<br />
懇親会というと飲み屋ではなく,飲食店で夕食会というのが多かったように思います.<br />
<br />
また,あったとしても参加者も3割から多くて6割と言ったところだったと思います.<br />
<br />
ときには,懇親会があるのかないのかよくわからないときもありました.<br />
<br />
<br />
<br />
この文化が悪いというわけではありません.<br />
<br />
<br />
<br />
東京の勉強会は平日夜におこなうものも少なくありません.<br />
<br />
また,勉強会の頻度も多いです.<br />
<br />
さらに,参加者が多いということもあります.<br />
<br />
人が多く,頻度も多いため,内容も濃いものになっていると思います.<br />
<br />
これは関東の勉強会の良い所だと思います.<br />
<br />
ただ,このような状況で,毎回盛大な懇親会しようとして,勉強会本体がお座なりになったら本末転倒なわけです.<br />
<br />
なので,関東での勉強会の懇親会が盛大でないのも自然といえば自然です.<br />
<br />
<br />
<br />
端的にいえば,関東の勉強会は岡山の勉強会よりも,勉強会自体に注力している印象です.<br />
<br />
<br />
<br />
一方で,岡山の勉強会の懇親会の良さは,楽しく色々は人とコミュニケーションをとることができる点だと思います.<br />
<br />
他の技術者と交流を深めるという点で,これは非常よかったと思います.<br />
<br />
この点は,関東の勉強会にはあまりない良さなのかなと思います.<br />
<br />
<br /></div>
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-5">
<br />
<h2 id="sec-5">
岡山を離れても変わらなかったこと</h2>
<br />
<div class="outline-text-2" id="text-5">
<br />
<br />
まぁ,なんと言っても<br />
<ul><br />
<li>彼女できない</li>
</ul>
<br />
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-6">
<br />
<h2 id="sec-6">
今後やろうと企んでいること</h2>
<br />
<div class="outline-text-2" id="text-6">
<br />
<br />
大都会岡山では,Web系やJVM系言語の勉強会は活発なのですが,カーネルのようなシステムソフトウェアの分野はあまり活発でないように思います.<br />
<br />
<br />
<br />
そう思った僕は以前,「岡山でLinuxカーネルと戯れる会」という勉強会を主催しました.<br />
<br />
<a href="http://atnd.org/events/33003">第1回</a> は僕が主催し,<a href="http://atnd.org/events/36156">第2回</a> は僕の後輩が主催してくれました.<br />
<br />
ただ,3回目以降が続かず,元気がない状態です.<br />
<br />
<br />
<br />
岡山を離れた僕ですが,やはり岡山でシステムソフトウェア分野を活発にしたいと思うわけです.<br />
<br />
ただ,つくばから岡山まで行って勉強会の主催をするのは厳しいわけです…<br />
<br />
<br />
<br />
そこで,Webでカーネルのソースコードリーディングを配信してみたらどうだろうと考えました.<br />
<br />
ソフトウェアを勉強する上で,ソースコードを読むことは非常に実り多いことです.<br />
<br />
しかし,ソースコード,特にカーネルのソースコードを読むのは結構な労力がかかります.<br />
<br />
なので,ソースコードリーディングを配信して,見てる人からの質問に答えたり,アドバイスをもらったりしながら読めればいいなと思ったわけです.<br />
<br />
<br />
<br />
最近研究の都合でNIC周りを勉強しないといけないので,最初はNICドライバのコードを読みたいと考えています.<br />
<br />
年内はバタバタしそうなので,年を越して1月中にしたいと思います.<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-7">
<br />
<h2 id="sec-7">
最後に</h2>
<br />
<div class="outline-text-2" id="text-7">
<br />
<br />
列車の切符のことや,勉強会の違いなど,思いつくままにいろいろ書いてみました.<br />
<br />
<br />
<br />
明日はpatorashさんの番となります.</div>
<br /></div>
<br />
<br />
-- <br />
<a href="http://github.com/rileyrg">My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-2453331971769976652013-08-30T21:31:00.001+09:002013-08-30T21:32:01.320+09:00GNU Globalで対応してない言語のコードを解析する.<div id="outline-container-1" class="outline-2"><br /><h2 id="sec-1">はじめに</h2><br /><div class="outline-text-2" id="text-1"><br /><br /><p> <a href="http://tokikane-tec.blogspot.jp/2013/08/gnu-global.html">前回の記事</a> で紹介したGNU Globalを使ってブラウザでコードを読む方法は非常に便利.<br/><br /> しかし,このGNU Global,対応言語はC, C++, Yacc, Java, PHP4しかない<br/><br /> そう言われても,他の言語で書かれたソースコードもブラウザで読みたい時はでてくる.<br/><br /> というわけで,GNU GlobalでGNU Globalで対応していない言語もブラウザで読めるようにする方法をここに書いておく.<br/><br /></p><br /><p><br/><br /> 概要を一文で書いてしまうと,GNU Globalよりも多くの言語に対応し(そのかわりに機能が少ない)Ctagsを用い,TAGSファイルを生成し,これをhtagsにかける.<br/><br /></p></div><br /><br /></div><br /><br /><div id="outline-container-2" class="outline-2"><br /><h2 id="sec-2">注意点</h2><br /><div class="outline-text-2" id="text-2"><br /><br /><p> Ctagsを用いるので,Globalを用いて解析したのと同じように,とはいかない.<br/><br /> 具体的には,ある関数や変数が参照されている場所の情報(Reference)は表示できない.<br/><br /> なぜなら,CtagsはGlobalと違い,Referenceを探す機能が存在しないからである.<br/><br /> また,htagsの結果表示されるhtmlも,関数や変数の定義にリンクは貼られいない.<br/><br /> 結局,htmlで表示しても,Syntax highlightもリンクもないソースコードが表示されるだけである.<br/><br /></p><br /><p> <br/><br /> しかし,grepやdefinitionの検索には引っかかるようになるため,何も使わないよりは読みやすくなる.<br/><br /> 対応言語の解析に比べれば,機能は多少劣るものの,同じ環境でより多くの言語のソースコードを表示できる,という点では便利である.<br/><br /></p></div><br /><br /></div><br /><br /><div id="outline-container-3" class="outline-2"><br /><h2 id="sec-3">方法</h2><br /><div class="outline-text-2" id="text-3"><br /><br /><ol><br /><li>ctagsをインストール<br/><br /> Linux MintやUbuntuなら以下のコマンドでインストール.<br/><br /><br /><p><br/><br /><pre class="example">sudo apt-get install ctags<br /></pre><br /><br /></p></li><br /><li>gtagsの設定ファイルのテンプレをコピー<br/><br /> apt-get でGNU Globalをインストールした人は <code>/usr/share/doc/global/examples/gtags.conf</code> を適当なファイルにコピー.<br/><br /> これを編集して,gtagsコマンドを実行するときにオプションで指定する.<br/><br /></li><br /><li>設定ファイルを編集.<br/><br /> ここでは,pythonのソースコードをctagsで解析するように編集.<br/><br /><br /><p><br/><br /><pre class="example">ctags-exuberant|Exuberant Ctags|ctags by Darren Hiebert:\<br /> :tc=common:\<br /> :suffixes=s,a,sa,asm,C,H,cpp,cxx,hxx,hpp,cc,c,h,y:\<br /> :extractmethod:\<br /> :GTAGS=/usr/local/bin/ctags-exuberant -xu %s | perl -ne '\<br /> if (/^operator \\S+\\s+function\\s/) { s/^operator //; }\<br /> ($name, $type, $no, $path, $line) = split(/[ \\t]+/, $_, 5);\<br /> printf(STDOUT "%-16s %4d %-16s %s", $name, $no, $path, $line);':<br /></pre><br /><br /> のように書かれている箇所のうち,2箇所を変更する.<br/><br /></p><ol><br /><li><code>:suffixes</code> の右辺に <code>py</code> を追加.<br/><br /> ここに,他の拡張子を設定すれば,その拡張子に対応する言語のソースコードも解析してくれる(はず).<br/><br /><br /><p><br/><br /></p></li><br /><li><code>:GTAGS</code> の右辺でctagsの実行ファイルのパスを指定する部分を変更.<br/><br /> apt-get でインストールすると,デフォルトで書かれているパスとは異なるところにインストールされる.<br/><br /> <code>which ctags</code> コマンドで実行ファイルのパスを確認し,指定する.<br/><br /><br /><p><br/><br /></p></li><br /></ol><br /><br /></li><br /><li>gtagsの実行<br/><br /> 以下のようにオプションを指定し,gtagsを実行する.<br/><br /><br /><p><br/><br /><pre class="example">$ gtags --gtagsconf=<編集した設定ファイルのパス> --gtagslabel=ctags-exuberant<br /></pre><br /><br /> <code>--gtagsconf</code> には先程編集した設定ファイルを指定する.<br/><br /></p></li><br /></ol><br /><br /><br /><p> <br/><br /> あとは,<a href="http://tokikane-tec.blogspot.jp/2013/08/gnu-global.html">前回の記事</a> と同様にhtagsを実行して,htmlファイルを生成すればよい.<br/><br /></p><br /><p> <br/><br /></p></div><br /><br /></div><br /><br /><div id="outline-container-4" class="outline-2"><br /><h2 id="sec-4">おわりに</h2><br /><div class="outline-text-2" id="text-4"><br /><br /><p> とりあえず,非対応言語のソースコードもgtags, htagsを用いてhtmlページで表示することが可能になった.<br/><br /> しかし,やはり非対応言語の解析は貧弱であることは否めまい.<br/><br /> 非対応言語が主なソースツリーを読む場合は,無理してGNU Global を使うよりも IDEを使ったほうがいいだろう.<br/><br /></p><br /><p><br/><br /> この方法が有用なのは,主にCやJavaで書かれたソースツリーの中に少し多言語も混じってる,という場合だと思う.<br/><br /></p></div><br /><br /></div><br /><br /><div id="outline-container-5" class="outline-2"><br /><h2 id="sec-5">参考URL</h2><br /><div class="outline-text-2" id="text-5"><br /><br /><ul><br /><li><a href="http://d.hatena.ne.jp/tkuro/20110621/1308653766">ErlangのソースコードでGNU globalを使う - 初学者の箸置</a><br/><br /></li><br /><li><a href="http://tokikane-tec.blogspot.jp/2013/08/gnu-global.html">時羽金也の技術帳: Gnu Globalを使ってブラウザでソースコードを快適に読む.</a><br/><br /></li><br /></ul><br /><br /><br /><p> <br/><br /></p><br /><p> <br/><br /></p></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-4043008394860145852013-08-29T15:29:00.001+09:002013-08-29T15:29:57.601+09:00Gnu Globalを使ってブラウザでソースコードを快適に読む.<div id="outline-container-1" class="outline-2"><br /><h2 id="sec-1">はじめに</h2><br /><div class="outline-text-2" id="text-1"><br /><br /> 最近よく使うGnu Globalの導入方法を書いておきます.<br/><br /> ブラウザでコードを読めるのはとても便利です.<br/><br /><br /> <br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-2" class="outline-2"><br /><h2 id="sec-2">動作確認環境</h2><br /><div class="outline-text-2" id="text-2"><br /><br /><dl><br /><dt>OS</dt><dd>Linux Mint 14<br/><br /></dd><br /><dt>Gnu Global</dt><dd>バージョン5.7.1<br/><br /></dd><br /></dl><br /><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-3" class="outline-2"><br /><h2 id="sec-3">導入方法</h2><br /><div class="outline-text-2" id="text-3"><br /><br /> まず,Gnu Globalをインストール.<br/><br /> Ubuntuなら以下のコマンドでインストールできる.<br/><br /><br /><br/><br /><pre class="example">$ sudo apt-get install global<br /></pre><br /><br /> 次に,TAGSファイルというものを作る.<br/><br /> これは,以下のコマンドで作れる.<br/><br /><br /><br/><br /><pre class="example">$ gtags -v<br /></pre><br /><br /> -v オプションは途中経過を表示するオプションなので,なくてもよい.<br/><br /><br /><br/><br /> 次は,ブラウザで表示するためのHTMLとCGIを作る.<br/><br /> これは,以下のコマンドで作れる.<br/><br /><br /><br/><br /><pre class="example">$ htags -afFnvsx<br /></pre><br /><br /> 大量に指定されているオプションの意味は以下のとおり.<br/><br /> -a アルファベット順に並べる<br/><br /> -f 検索フォームを作る<br/><br /> -F フレームを作る<br/><br /> -n 行番号をつける<br/><br /> -s シンボルにもリンクを貼る<br/><br /> -v 途中経過を表示<br/><br /> -x xml形式で出力<br/><br /><br /><br/><br /> ここまでで,必要なファイルの作成は完了した.<br/><br /> 最後に,CGIを動かすためにApacheの設定を行う.<br/><br /> 今回は,とりあえず手元のマシンで動かすための設定を書く.<br/><br /><br /><br/><br /> 解析した結果のファイルは <code>/home/hoge/source/HTML/</code> にあるものとします.<br/><br /> 以下のブログを参考に(というよりそのまま)している.<br/><br /> <a href="http://goo.gl/DrvaqL">Androidでソース検索(GNU GLOBAL) 電脳羊(Android Dream)</a><br/><br /><br /><br/><br /> まずapache2をインストール.<br/><br /><br /><br/><br /><pre class="example">$ sudo apt-get install apache2<br /></pre><br /><br /> 次に, <code>/etc/apache2/sites-available/default</code> を変更する.<br/><br /> このファイルの変更は管理者権限が必要なので,ファイルを開くときにsudoを忘れずに.<br/><br /> 変更箇所は2箇所.<br/><br /><ol><br /><li>DocumentRootの変更.<br/><br /> <code>DocumentRoot /var/www</code> をコメントアウト(行頭に#を追記)し, <code>DocumentRoot /home/hoge/source/HTML</code> を追加.<br/><br /></li><br /><li>CGIを有効にする.<br/><br /> 以下をコメントアウト.<br/><br /><br /><br/><br /><pre class="example">ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br /><Directory "/usr/lib/cgi-bin"><br /> AllowOverride None<br /> Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br /> Order allow,deny<br /> Allow from all<br /></Directory><br /></pre><br /><br /> 以下を追記.<br/><br /><br /><br/><br /><pre class="example"><Directory "/home/hoge/source/HTML/cgi-bin"><br /> AllowOverride None<br /> Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br /> Order allow,deny<br /> Allow from all <br /></Directory><br /></pre><br /><br /></li><br /></ol><br /><br /><br /> <br/><br /> この変更が終わったら,以下のコマンドでapache2を再起動.<br/><br /><br /><br/><br /><pre class="example">$ sudo /etc/init.d/apache2 restart<br /></pre><br /><br /><br /> <br/><br /> その後,ブラウザで,<a href="http://localhost">http://localhost</a> にアクセスすると,Globalのページが表示される.<br/><br /> また,左上で関数や変数の定義,参照などを検索できる.<br/><br /> この検索機能は,CGIでやっているので,これがうまく行かないときは,apacheの設定がうまくいってない可能性が高い.<br/><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-4" class="outline-2"><br /><h2 id="sec-4">おわりに</h2><br /><div class="outline-text-2" id="text-4"><br /><br /> サーバにおいて,外から見れるようにしたいときなどは,もっとちゃんとapatchの設定をしないといけないと思います.<br/><br /> ですので,apacheの設定方法を調べてください.<br/><br /> 僕もよくわからないので,誰か教えてほしい←<br/><br /><br /><br/><br /><br /> <br/><br /><br /><br/><br /><br /><br/><br /><br /> <br/><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-2031732133065802672013-08-21T22:46:00.001+09:002013-08-21T22:46:37.243+09:00ブログのデザインを変えてみました.タイトルの通り,そして,見た通り,ブログのデザインを大幅に変えてみました.<br />
<br />
以前は黒背景に白文字だったのですが,あれはやはり見にくいな,と思い,白背景に黒文字に変えました.<br />
<br />
また,セクション名が大きくして,本文の色と少し変えてみました.<br />
<br />
デザインを変えて,見やすくなれば幸いです.<br />
<br />
これまでの記事内容などは変更しておりません.<br />
デザインを変えただけですので,驚かないでください.deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-53846699355818163922013-08-21T07:09:00.001+09:002013-08-21T22:33:59.953+09:00Linux の コンソール(非GUI) をEmacsのキーバインドにする.<br />
<br />
<div class="outline-2" id="outline-container-1">
<br />
<h2 id="sec-1">
動作確認環境</h2>
<br />
<div class="outline-text-2" id="text-1">
<br />
<br />
OS: Fedora 18<br />
<br />
キーボード: 英字配列キーボード<br />
<br />
この方法では,英字配列で,Emacsバインドになると思われる.<br />
<br />
(日本語配列のキーボードでは試してない.)<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-2">
<br />
<h2 id="sec-2">
方法</h2>
<br />
<div class="outline-text-2" id="text-2">
<br />
<br />
結論だけ言うと,カーネルのブートオプションに <code>KEYTABLE=emacs</code> を追加するだけでOK.<br />
<br />
以下は,その具体的な設定方法を書く.<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-3">
<br />
<h2 id="sec-3">
具体的な設定方法</h2>
<br />
<div class="outline-text-2" id="text-3">
<br />
<br />
grub2の場合は, <code>/etc/default/grub</code> の <br />
<br />
<br />
<br />
<pre class="example">GRUB_CMDLINE_LINUX=""</pre>
<br />
<br />
の行を<br />
<br />
<br />
<br />
<br />
<pre class="example">GRUB_CMDLINE_LINUX="KEYTABLE=emacs"</pre>
<br />
<br />
に書き換えて,ターミナルから,<br />
<br />
<br />
<br />
<br />
<pre class="example">$ grub2-mkconfig /boot/grub/grub.cfg </pre>
<br />
<br />
を実行すればいい.<br />
<br />
<br />
<br />
<br />
最終的には,grub.cfgには,以下のようなエントリーが追加されればOK.<br />
<br />
カーネルを指定する. <code>linux</code> から始まる行の最後に <code>KEYTABLE=emacs</code> が入っていればよい.<br />
<br />
<br />
<br />
<pre class="example">menuentry 'Linux Mint 14 MATE 64-bit, 3.5.0-27-generic (/dev/sda1)' --class linuxmint --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 <UUID>
else
search --no-floppy --fs-uuid --set=root <UUID>
fi
linux /boot/vmlinuz-3.5.0-27-generic root=UUID=<UUID> KEYTABLE=emacs
initrd /boot/initrd.img-3.5.0-27-generic
}</pre>
<br />
<br />
これは,Grub(2でないもの)にも同様に使える技である.<br />
<br />
<br />
<br /></div>
<br />
<br /></div>
<br />
<br />
<div class="outline-2" id="outline-container-4">
<br />
<h2 id="sec-4">
おまけ</h2>
<br />
<div class="outline-text-2" id="text-4">
<br />
<br />
起動してから,emacsバインドに変えたい時は,<br />
<br />
<br />
<br />
<pre class="example">$ loadkeys emacs</pre>
<br />
<br />
で,簡単に変わる.<br />
<br />
よく,keymapの圧縮ファイルを展開して,CpasLockの部分を書き換えて… みたいは方法があるが,あれよりずっと簡単.<br />
<br />
ただし,日本語配列でEmacsバインドに変えたい場合は,やはり,keymapの圧縮ファイルを展開して…しないといけない.</div>
<br /></div>
<br />
<br />
-- <br />
<a href="http://github.com/rileyrg">My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-82616195027103718002013-08-01T23:57:00.001+09:002013-08-01T23:57:14.055+09:00Xenを動かす<br /> ちょっと,Xenを試したくなったので,家のマシンでXenを動かしてみた.<br/><br /> dom0が起動するところまでやってみた(と思う.自分でもよくわかってない.).<br/><br /> とりあえず,メモ書き.<br/><br /><br /><div id="outline-container-1" class="outline-2"><br /><h2 id="sec-1">構成</h2><br /><div class="outline-text-2" id="text-1"><br /><br /> 目指す構成は以下の通り.<br/><br /><ul><br /><li>HDDにLinux Mint(sda Grub2)<br/><br /></li><br /><li>SSDにCentOS(sdb Grub)<br/><br /></li><br /><li>sdaのGrub2からsdbのGrubへチェインロード<br/><br /></li><br /><li>sdbのGrubからXenを起動<br/><br /></li><br /></ul><br /><br /> HDDに入ってるLinux Mintの環境は壊してたくないのでそっとしておく. <br/><br /> わざわざチェインロードしているのは,Xenの設定の時に,CentOSのカーネルの場所とgrubの設定の場所を同じにした方が面倒にならなさそうだったから.<br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-2" class="outline-2"><br /><h2 id="sec-2">CentOSをインストール</h2><br /><div class="outline-text-2" id="text-2"><br /><br /> 以下のページを参考にした.<br/><br /> <a href="http://goo.gl/wsRmPA">自宅サーバーにCentOS6.3とソフトをインストール | ハーレーと趣味に生きるNEXT</a><br/><br /><br /><br/><br /><ul><br /><li>適当なミラーサーバからCentOSのminimalのISOをダウンロード<br/><br /></li><br /><li>USBからブートしたいので,UnetbootinでUSBにイメージを書き込み.<br/><br /></li><br /><li>USBに <b>もとのISOもコピーしないといけない</b><br/><br /></li><br /><li>インストール時にsdbにGrubをインストールするのを忘れないように<br/><br /> (デフォだとsdc(USBメモリに書き込むようになってるので変更))<br/><br /></li><br /></ul><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-3" class="outline-2"><br /><h2 id="sec-3">sdaのGrub2の設定</h2><br /><div class="outline-text-2" id="text-3"><br /><br /> 以下のページを参考にした.<br/><br /> <a href="#linux---Boot-GRUB2-to-GRUB-or-GRUB2-on-another-disk---Super-User">linux - Boot GRUB2 to GRUB or GRUB2 on another disk - Super User</a><br/><br /><ul><br /><li>sdaのLinux Mintの <code>/boot/grub/grub.cfg</code> に追加<br/><br /><br /><br/><br /><pre class="example">menuentry "Other Disk" {<br /> insmod part_msdos<br /> set root='(hd1)'<br /> drivemap -s hd0 hd1<br /> chainloader (hd1)+1<br />}<br /></pre><br /><br /> 本当は <code>/etc/grub.d/40_custom</code> に書き込んで, <code>update-grub</code> を叩くべき.<br/><br /> rebootし,追加したエントリーを起動すると,sdbのGrubが起動するはず.<br/><br /></li><br /></ul><br /><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-4" class="outline-2"><br /><h2 id="sec-4">もしsdbのGrubでメニューが表示されなかったら</h2><br /><div class="outline-text-2" id="text-4"><br /><br /> 以下のページを参考にした.<br/><br /> <a href="http://goo.gl/bGxOQ3">asterisk Fedora - EtCetera/GRUB</a> <br/><br /> もし,Grubは起動するが,プロンプトしか出ないときはとりあえず.以下のコマンドを叩いて,メニューを出す.<br/><br /><br /><br/><br /><pre class="example">> configfile /grub/grub.conf<br /></pre><br /><br /> 表示されたメニューから,CentOSが起動したら,一度Grubをsdbにインストールし直すと,ちゃんとメニューがでるようになる.<br/><br /> GrubのインストールはsdbのCentOSから以下のコマンドを叩く.<br/><br /><br /><br/><br /><pre class="example"># grub-install /dev/sdb<br /></pre><br /><br /></div><br /><br /></div><br /><br /><div id="outline-container-5" class="outline-2"><br /><h2 id="sec-5">CentOSでの設定</h2><br /><div class="outline-text-2" id="text-5"><br /><br /><br /></div><br /><br /><div id="outline-container-5-1" class="outline-3"><br /><h3 id="sec-5-1">ネットワーク設定</h3><br /><div class="outline-text-3" id="text-5-1"><br /><br /> <code>/etc/sysconfig/network-script/ifcfg-eth0</code> を編集<br/><br /><br /><br/><br /><pre class="example">onboot=no<br /></pre><br /><br /> の行を<br/><br /><br /><br/><br /><pre class="example">onboot=yes<br /></pre><br /><br /> と変更.<br/><br /> その後,rebootすればネットワークはつながった.<br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-5-2" class="outline-3"><br /><h3 id="sec-5-2">xenの設定</h3><br /><div class="outline-text-3" id="text-5-2"><br /><br /> 以下のページを参考にした.<br/><br /> <a href="http://wiki.centos.org/HowTos/Xen/Xen4QuickStart#head-a5cc806b90ef787b9e2064b183fd92daf19600c8">HowTos/Xen/Xen4QuickStart - CentOS Wiki</a><br/><br /><br /><br/><br /> 以下のコマンドでXen用のCentOS(のカーネルかな?)とXenをインストール<br/><br /><br /><br/><br /><pre class="example"># yum install centos-release-xen<br /># yum install xen<br /></pre><br /><br /><br /> ここまで終わったあとに, <code>/boot/grub/grub.conf</code> を確認.<br/><br /> defaultのカーネルが3.4.xxx になってれば問題ない.<br/><br /> もしdefaultが2.6.xxxならば,3.4.xxxのほうに変える.<br/><br /> その後,<br/><br /><br /><br/><br /><pre class="example"># /usr/bin/grub-bootxen.sh<br /></pre><br /><br /> ちなみに,grub.confのdefaultで設定しているカーネルイメージをロードするエントリーが複数あると,このスクリプトは正常に動作しないので注意.<br/><br /><br /><br/><br /> このスクリプトを実行した後に, <code>/boot/grub/grub.conf</code> を再度確認してみる.<br/><br /> 3.4.xxx.のエントリーが以下のように変わってるはず.<br/><br /><br /><br/><br /><pre class="example">title CentOS (3.4.46-8.el6.centos.alt.x86_64)<br /> root (hd0,0)<br /> kernel /xen.gz dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all<br /> module /vmlinuz-3.4.46-8.el6.centos.alt.x86_64 ro root=/dev/mapper/vg_xen01-lv_root rd_LVM_LV=vg_xen01/lv_swap rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=uk rd_NO_MD LANG=en_GB rd_LVM_LV=vg_xen01/lv_root SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM rhgb quiet<br /> module /initramfs-3.4.46-8.el6.centos.alt.x86_64.img<br /></pre><br /><br /> 元々kernelコマンドとinitrdコマンドで読み込んでいたものがmoduleコマンドで読み込まれるようになっている.<br/><br /> また,kernelコマンドでは,xenのイメージ?を読み込んでいる.<br/><br /><br /><br/><br /></div><br /></div><br /><br /></div><br /><br /><div id="outline-container-6" class="outline-2"><br /><h2 id="sec-6">動作確認</h2><br /><div class="outline-text-2" id="text-6"><br /><br /> GrubからCentOS (3.4.46-8.el6.centos.alt.x86<sub>64</sub>)をブートしてみる.<br/><br /> ブート後,以下のコマンドを叩いてみる.<br/><br /><br /><br/><br /><pre class="example"># xm --info<br /></pre><br /><br /> このコマンドを叩くと,Xenに関する情報が大量に出てくる.<br/><br /> もし,Xenが動作してないと,"本当にXen動いてる?"(意訳)的なメッセージが出てくる.<br/><br /><br /><br/><br /></div><br /><br /></div><br /><br /><div id="outline-container-7" class="outline-2"><br /><h2 id="sec-7">参考URLまとめ</h2><br /><div class="outline-text-2" id="text-7"><br /><br /> <a href="http://goo.gl/wsRmPA">自宅サーバーにCentOS6.3とソフトをインストール | ハーレーと趣味に生きるNEXT</a><br/><br /> <a href="http://wiki.centos.org/HowTos/Xen/Xen4QuickStart#head-a5cc806b90ef787b9e2064b183fd92daf19600c8">HowTos/Xen/Xen4QuickStart - CentOS Wiki</a><br/><br /> <a href="http://goo.gl/bGxOQ3">asterisk Fedora - EtCetera/GRUB</a> <br/><br /> <a href="http://goo.gl/kEjktS">linux - Boot GRUB2 to GRUB or GRUB2 on another disk - Super User</a><br/><br /></div><br /></div><br /><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0tag:blogger.com,1999:blog-9086402829352649401.post-90671046692047854692013-06-30T23:19:00.001+09:002013-06-30T23:19:39.092+09:00Linuxのコンソールの文字サイズを調整する方法.<br /><p> Linuxをテキストモードで起動するときの文字サイズを調整する方法.<br/><br /> 文字サイズを調整するために,コンソールの解像度を変更する.<br/><br /> 解像度の変更方法は,ブートオプションに<br/><br /></p><br /><p><br/><br /><pre class="example">video=800x600<br /></pre><br /><br /> のように,解像度を指定するオプションを追加する.<br/><br /></p><br /><p><br/><br /> コンソールの文字を大きくしたい時は解像度を下げればよい.<br/><br /> 逆に,コンソールの文字を小さくしたい時は解像度を上げればよい.<br/><br /></p><br /><p> <br/><br /></p><br /><p><br/><br /></p><br/>-- <br/><a href='http://github.com/rileyrg'>My Emacs Files At GitHub</a>deephttp://www.blogger.com/profile/00311446549675141229noreply@blogger.com0