2014年12月11日木曜日

org-export-as が吐く html の文字コードでハマる


1 org-export-as が吐く html の文字コードでハマる



org-googlecl (https://github.com/rileyrg/org-googlecl) でこのブログに記事を投稿するためにごにゅごにょやってたらハマった.

(ちなみに,org-googlecl は4年前から更新されてないみたいで,Org-mode のバージョンアップに合わせて自分で直さないと動かない)

僕の環境では, org-googlecl-blog というコマンドで blogger で投稿するようになってる.

このコマンドの中では,Org-mode のフォーマットを HTML に変換したあとに少し整形して googlecl のコマンドに渡すということをやってる.

この HTML に変換する処理を今は (org-export-as 'html nil t nil nil) という関数でやっているのだが,これがEUC-JP しか吐いてくれない.

EUC-JP だと googlecl さんがエンコードできねーと文句言うもんだからさて困った.



結論としては, org-googlecl-blog コマンドを叩く前に C-x RET c でコマンドを実行する際の文字コードを utf-8 に指定すればとりあえず utf-8 で HTML が吐かれるようになった.

なんか,釈然としないが,とりあえず今日はつかれたし,こんなことやってる場合ではないような気がするのでこれで置いとく.





--
My Emacs Files At GitHub

Org-mode で C-c C-e l 押下でLaTeXに\ エクスポートできなくなった時の話


1 Org-mode で C-c C-e l 押下でLaTeXにエクスポートできなくなった時の話   gblog



Org-mode で LaTeX へエクスポートしようと C-c C-e l 押下すると, Symbol's function definition is void: org-e-latex-export-to-latex とか言われたので場当たり的に対処

半年か一年か放ったらかしになっていた古いEmacs, Org-mode の設定で,Gentoo さんがバシバシアップデートしてくれるEmacs とOrg-mode を使えばやっぱり問題が起きるわけで.

とりあえず,対処療法的に問題が見つかったら潰している感じ.

今回は,Org-mode C-c C-e l でLaTeX をエクスポートしようとしたら, Symbol's function definition is void: org-e-latex-export-to-latex と言われたので対処.




1.1 環境



現環境



  • Emacs version: GNU Emacs 24.4.1


  • Org-mode version: Org-mode version 8.2.6



以前使ってた環境(うろ覚え)



  • Emacs version: GNU Emacs 23.4 くらいだったような気がする


  • Org-mode version: 7.9.3 くらいだったような気がする






1.2 org-e-latex-export-to-latex って何?



昔の Org-mode の Contrib の中にある関数らしい.

どうやら設定ファイルの中で古い Org-mode の Contrib を呼び出してるのがまずいらしい.






1.3 問題回避(解決したとは言ってない)



以前,org-md (Markdown へのエクスポートなどの機能を提供する) を試すために,org-mode/contrib/lisp をロードしていたが,正直全く使ってない.

なので,とりあえず今回は org-mode/contrib/lisp のロードをやめるようにした.

これで,=C-c C-e l l= でLaTeX へエクスポートされるようになった.






--
My Emacs Files At GitHub

2014年12月4日木曜日

OSv のパッチを送るには


はじめに




OSv Advent Calendar 2014 - Qiita 4日目(4日目に公開できたらいいな).




以前,OSvもくもく会#4 〜OSvで遊んでみよう〜 - connpass でOSv へのパッチの送り方を教えていただいたので,紹介する.




なお,この記事の中身OSv というよりはGit の使い方っぽい.






OSv のパッチ











送る流れ





  • git format-patch でパッチを生成


  • git send-email で送る


    • git send-email を使わずにメールを送ってもいいけど,使った方が無難(僕は使わずに妙なことになった)












パッチファイルを作る(git format-patch)





  • git のユーザー名とメールアドレスを設定しておく


  • 変更を加えてローカルリポジトリにコミットまでする


  • git format-patch -s <commit id>


    • OSvにパッチを送る時は -s オプションは必須.


      • このオプションはパッチファイルに署名を追加する.





    • –subject-prefix='PATCH v2' とオプションをつけると,パッチのタイトルの先頭にprefix を追加できる.


      • パッチを修正して再度送る場合などに,"PATCH v2" などとつける.








  • コマンド実行の結果,"0001-commit-message.patch" のようなファイル名でパッチファイルが生成される.








生成されるパッチの中身







From 9a81c71e4a64acdb62ffdfc8f5d5fbe77eca48a8 Mon Sep 17 00:00:00 2001
From: Takaaki Fukai <deep.wiki@gmail.com>
Date: Sun, 9 Nov 2014 07:48:23 +0000
Subject: [PATCH v2] add a native code example

Signed-off-by: Takaaki Fukai <deep.wiki@gmail.com> ←-s オプションでついた署名
---
native-example/Makefile | 10 ++++++++++
native-example/README | 1 +
native-example/hello.c | 6 ++++++
native-example/module.py | 3 +++
native-example/usr.manifest | 1 +
5 files changed, 21 insertions(+)
create mode 100644 native-example/Makefile
create mode 100644 native-example/README
create mode 100644 native-example/hello.c
create mode 100644 native-example/module.py
create mode 100644 native-example/usr.manifest

diff --git a/native-example/Makefile b/native-example/Makefile
new file mode 100644
index 0000000..0271bcb
--- /dev/null
+++ b/native-example/Makefile
@@ -0,0 +1,10 @@
+.PHONY: module
+module: hello
+
+CFLAGS = -std=gnu99 -fpie -rdynamic
+
+hello: hello.c
+ $(CC) -pie -o $@ $(CFLAGS) $(LDFLAGS) hello.c
+
+clean:
+ rm -f hello
diff --git a/native-example/README b/native-example/README
new file mode 100644
index 0000000..7ce6e3e
--- /dev/null
+++ b/native-example/README
@@ -0,0 +1 @@
+This is a minimal sample of porting native code.
diff --git a/native-example/hello.c b/native-example/hello.c
new file mode 100644
index 0000000..be1cf2b
--- /dev/null
+++ b/native-example/hello.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main(){
+ printf("Hello from C code\n");
+ return 0;
+}
diff --git a/native-example/module.py b/native-example/module.py
new file mode 100644
index 0000000..16c9bae
--- /dev/null
+++ b/native-example/module.py
@@ -0,0 +1,3 @@
+from osv.modules import api
+
+default = api.run("/hello")
diff --git a/native-example/usr.manifest b/native-example/usr.manifest
new file mode 100644
index 0000000..b79ddd9
--- /dev/null
+++ b/native-example/usr.manifest
@@ -0,0 +1 @@
+/hello: ${MODULE_DIR}/hello
--
1.9.3














パッチを送る








前準備: メーリスの購読











前準備: git send-email の設定




(これが一番面倒)






# yum install git-email
# yum install msmtp
# yum install ca-certificates



  • ~/.gitconfig に以下を追記







[sendemail]
smtpserver = /usr/bin/msmtp



  • ~/.msmtprc を作成(以下はGmail アカウントからメールを送るための設定)







# Example for a user configuration file
# Set default values for all following accounts.
defaults
tls on
tls_trust_file /etc/ssl/certs/ca-bundle.crt ←(※1)
logfile ~/.msmtp.log
# My email service
account gmail
host smtp.gmail.com
port 587
from deep.wiki@gmail.com
auth on
user deep.wiki@gmail.com
password ****************** ←(※2)
# Set a default account
account default : gmail



  • (※1)ディストリによってはファイルのパスが違うかもしれない.上はFedoraの例.


  • (※2)Google の2段階認証を有効にしているときは,アプリケーション固有パスワード









メールを送る





  • git send-email 0001-add-a-native-code-example.patch を実行


  • 起動すると"Who should the emails be sent to (if any)?" と送り先メールアドレスを聞かれる.


    • osv-dev@googlegroups.com と入力





  • "Message-ID to be used as In-Reply-To for the first email (if any)?" と聞かれる.

    とりあえず何も入れずにEnter で良かったはず.


  • 送信するメールの中身が表示されるので,確認してyを入力










[root@openstack-host apps]# git send-email 0001-add-a-native-code-example.patch 
0001-add-a-native-code-example.patch
Who should the emails be sent to (if any)? osv-dev@googlegroups.com
Message-ID to be used as In-Reply-To for the first email (if any)?
(mbox) Adding cc: Takaaki Fukai <deep.wiki@gmail.com> from line 'From: Takaaki Fukai <deep.wiki@gmail.com>'
(body) Adding cc: Takaaki Fukai <deep.wiki@gmail.com> from line 'Signed-off-by: Takaaki Fukai <deep.wiki@gmail.com>'

From: Takaaki Fukai <deep.wiki@gmail.com>
To: osv-dev@googlegroups.com
Cc: Takaaki Fukai <deep.wiki@gmail.com>
Subject: [PATCH v2] add a native code example
Date: Thu, 4 Dec 2014 14:10:45 +0000
Message-Id: <1417702245-4428-1-git-send-email-deep.wiki@gmail.com>
X-Mailer: git-send-email 1.9.3

The Cc list above has been expanded by additional
addresses found in the patch commit message. By default
send-email prompts before sending whenever this occurs.
This behavior is controlled by the sendemail.confirm
configuration setting.

For additional information, run 'git send-email --help'.
To retain the current behavior, but squelch this message,
run 'git config --global sendemail.confirm auto'.

Send this email? ([y]es|[n]o|[q]uit|[a]ll): y
OK. Log says:
Sendmail: /usr/bin/msmtp -i osv-dev@googlegroups.com deep.wiki@gmail.com
From: Takaaki Fukai <deep.wiki@gmail.com>
To: osv-dev@googlegroups.com
Cc: Takaaki Fukai <deep.wiki@gmail.com>
Subject: [PATCH v2] add a native code example
Date: Thu, 4 Dec 2014 14:10:45 +0000
Message-Id: <1417702245-4428-1-git-send-email-deep.wiki@gmail.com>
X-Mailer: git-send-email 1.9.3

Result: OK


(ブログ書くときにやりかたを思い出すために別のアドレスに送ったときのログから送り先だけ"osv-dev@…"に変えたもの.実際のパッチを投げた時のではないので日付とかはお察し)










おわりに




パッチを送るまでに少々面倒な手順が必要だけど,一度設定してしまえば, git format-patchgit send-email コマンドだけでパッチを送れるようになる.

最初は git send-email を使わずにメーラーにパッチをコピペして送ったろうとしてみた.

しかし,妙な空行が入ったりして逆に面倒だったので,最初から git send-email 使った方がよい.







--
My Emacs Files At GitHub

2014年11月10日月曜日

OSv もくもく会#4 の作業メモ


はじめに




以前 https://github.com/syuu1228/fedora-chroot-image を使わせて頂いて,OSv をビルドできる環境を整えた.

で,自分で書いたC のHello World を動かそうとしてうまくいかなくて終わったような気がする.




今回こそはC のHello World を動かす.









最新版のコードをビルドする




自分の環境は2,3ヶ月放置していたものなので,まずはOSv の最新のコードをpull してくる.

まぁ,pull してmake すればいいだろうと軽い気持ちでpull し始めたわけだが…




chroot 環境で




# cd /root/osv
# git pull



とりあえず何も考えずにmake 叩く




# make



ばばーん




 ...(中略)
make[1]: Entering directory `/root/osv/build/release.x64'
/root/osv/build.mk:928: *** Error: libstdc++.a needs to be installed.. Stop.
make[1]: Leaving directory `/root/osv/build/release.x64'

make: *** [all] Error 2



新しいライブラリが必要になっているみたいなので,それをインストール




# yum install libstdc++-static.x86_64



もう一回make




# make -j7



ばばーん(2回目)




...(中略)
CC libc/errno/strerror.o
/root/osv/libc/errno/strerror.c:12:45: fatal error: ../../musl/src/errno/__strerror.h: No such file or directory
#include "../../musl/src/errno/__strerror.h"
^
compilation terminated.
CC libc/locale/duplocale.o
make[1]: *** [libc/errno/strerror.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory `/root/osv/build/release.x64'
make: *** [all] Error 2



サブモジュールが増えてるらしい.

サブモジュールもちゃんとアップデートする.




# git submodule update --init --recursive



3度目の正直




# make -j7




ばばーん




...(中略)
make[3]: Leaving directory `/root/osv/modules/lua/build/luarocks-2.1.2'
out/bin/luarocks install luasocket 3.0-rc1
Warning: Failed searching manifest: Failed loading manifest: Failed extracting manifest file
Installing http://luarocks.giga.puc-rio.br/luasocket-3.0rc1-1.src.rock...
Using http://luarocks.giga.puc-rio.br/luasocket-3.0rc1-1.src.rock... switching to 'build' mode

Error: Failed unpacking rock file: /tmp/luarocks_luarocks-rock-luasocket-3.0rc1-1-2801/luasocket-3.0rc1-1.src.rock
make[2]: *** [out/lib/lua/5.2/socket/core.so] Error 1
make[2]: Leaving directory `/root/osv/modules/lua'
Traceback (most recent call last):
File "/root/osv/scripts/module.py", line 239, in <module>
args.func(args)
File "/root/osv/scripts/module.py", line 196, in build
make_modules(modules, args)
File "/root/osv/scripts/module.py", line 100, in make_modules
raise Exception('make failed for ' + module.name)
Exception: make failed for lua
make[1]: *** [process-modules] Error 1
make[1]: Leaving directory `/root/osv/build/release.x64'
make: *** [all] Error 2



要らないファイルが残ってたらしい.

とりあえずmake clean, git clean した.




# make clean
# git clean -xdf


で解決.




4度目の正直




# make -j7



でやっとビルドができた.

これでスタート地点.









リハビリ: Java のHello World の組み込み型を思い出す




参考URL https://github.com/cloudius-systems/osv-apps/tree/master/java-example


  • 最低限必要なファイルは以下の模様.


    • Hello.java


    • Makefile


    • module.py


    • usr.manifest











Hello.java




Java プログラムの本体




public class Hello{
public static void main(String args[]){
System.out.println("Hello");
}
}










Makefile




特に難しいところはなさそう.

普通と違うのは module: Hello.class の行くらいか?




module: Hello.class

%.class: %.java
javac $^

clean:
rm -rf *.class








module.py




デフォルトの起動コマンドや引数を指定しているっぽい.




from osv.modules import api

api.require('java')

default = api.run_java(classpath=['/my-example'], args=['Hello'])








usr.manifest




これはあんまりわかってない.




/my-example/Hello.class: ${MODULE_DIR}/Hello.class









ビルド&実行




ここでは,my-example というイメージ名で上記のプログラムを組み込んだイメージを作る.

上記4つのプログラムをapps/my-example 以下に置く.

osv のルートディレクトリで以下のコマンドを実行.




make image=my-example
scripts/run.py








本題: C のプログラムを組み込む





memcached をビルドしてみる




参考にしているmemchached のソースツリーにあるMakefile を見てみると,make 時にusr.manifest などを作成しているらしい.

作成した後の状態を見たいので,まずはこれをビルドしてみる




ビルドしようとしたら,あれこれ無いと言われるのでインストールする




# yum install libevent-devel.x86_64



僕がビルドしたときは,apps/memcached/src が空っぽだった.

本来はここにソースコードがダウンロードされるはずなのだが,何かが原因でうまくダウンロードされていなかったみたい.

これは,以下のようにmemcached ディレクトリをclean すれば解決した.




# pushd apps/memcached/
# make clean
# popd



memcached のビルド完了









Makefile




色々見た結果,気をつけないといけなさそうなのはMakefile のCFLAGS くらいに見える.

memcached では以下のように指定されている.




CFLAGS = -std=gnu99 -fpie -rdynamic -DHAVE_CONFIG_H


CFLAGSのオプション


-std=gnu99
C99+GNU拡張


-fpie
位置独立実行形式(Position-Independent Executalbe)

ちなみに,共有ライブラリをコンパイルするときの-fpicは位置独立コード(Position-Independent Code)


rdynamic
動的リンク可能なバイナリを作る


-DHAVECONFIGH
…よくわからん







たぶん,-DHAVECONFIGH はmemcached 特有な気がするので,今回のHello World アプリからは削除.









最終的なコード




あとは,細々した要らないところを消していくだけで動いた.

最終的なコードは以下の通り.

(以下のdiff のルートディレクトリはapps/ なので注意)




---
native-example/Makefile | 10 ++++++++++
native-example/hello.c | 6 ++++++
native-example/module.py | 3 +++
native-example/usr.manifest | 1 +
4 files changed, 20 insertions(+)
create mode 100644 native-example/Makefile
create mode 100644 native-example/hello.c
create mode 100644 native-example/module.py
create mode 100644 native-example/usr.manifest

diff --git a/native-example/Makefile b/native-example/Makefile
new file mode 100644
index 0000000..0271bcb
--- /dev/null
+++ b/native-example/Makefile
@@ -0,0 +1,10 @@
+.PHONY: module
+module: hello
+
+CFLAGS = -std=gnu99 -fpie -rdynamic
+
+hello: hello.c
+ $(CC) -pie -o $@ $(CFLAGS) $(LDFLAGS) hello.c
+
+clean:
+ rm -f hello
diff --git a/native-example/hello.c b/native-example/hello.c
new file mode 100644
index 0000000..be1cf2b
--- /dev/null
+++ b/native-example/hello.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main(){
+ printf("Hello from C code\n");
+ return 0;
+}
diff --git a/native-example/module.py b/native-example/module.py
new file mode 100644
index 0000000..16c9bae
--- /dev/null
+++ b/native-example/module.py
@@ -0,0 +1,3 @@
+from osv.modules import api
+
+default = api.run("/hello")
diff --git a/native-example/usr.manifest b/native-example/usr.manifest
new file mode 100644
index 0000000..b79ddd9
--- /dev/null
+++ b/native-example/usr.manifest
@@ -0,0 +1 @@
+/hello: ${MODULE_DIR}/hello
--
1.9.3



以上で,C のHello World をOSv に組み込めました.










おわりに




実は上記のようなCで書かれたHello Worldをポーティングするようなサンプルコードはこれまでosv-apps のリポジトリになかった.

そこで,syuu先生の勧めで上記のパッチをOSvのメーリングリストに送ってみたところめでたくマージされた.




--
My Emacs Files At GitHub

2014年11月6日木曜日

glibc のビルドでハマったポイント&手順

諸事情でglibc をビルドした時にハマったことのメモ.
記事中のコマンドはコピペで書いたのではなく,記憶を頼りに手打ちしているので,コピペして動かしたりすると危険.参考程度に見てください.


ハマったポイント

- gawk ないとmake でこける
- make install の前に/target_dir/ld.so.conf を作らないとこける

ビルド準備

- glibc をダウンロード(Git でクローンしたりアーカイブをダウンロード&解凍したり)
- gawk をインストールする.
これがないとmake でこける(こけてハマったのでこの記事書いてる).
# apt-get install gawk

あとはいろんなところで解説があるのと同じようにビルド作業

ビルド手順

- 以下では~/glibc_ver にダウンロードしてきたglibc があることにする
- 諸事情(ユーザーアカウントを作るのが面倒というとても深刻な事情)のため,すべてroot で作業しているが,ユーザーアカウントがある場合はユーザーアカウントでやったほうが安全.--prefix=${HOME}/install_target_dir とかにすればsudo なしでインストールまでできるはず(参考URLを見るとそう書いてあるからきっとそう)
- インストール先は/root/my_glibc

# cd ~/glibc_ver
# mkdir build
# cd build
# ../configure --prefix=/root/my_glibc
# make
# touch /root/my_glibc/etc/ld.so.conf
# make install

参考URL

Linux From Scratch:gcc、glibcインストール « 仙人の心得
http://blog.mktime.com/archive/340.html

chroot 環境に glibc を突っ込むメモ — togakushi.bitbucket.org 0.1 documentation
http://togakushi.bitbucket.org/build/html/glic2.5_install.html

2014年9月13日土曜日

Ubuntu でKVM のブリッジ接続の設定をする


/etc/network/interfaces の設定.

編集前にはバックアップをとっておくべき.




/etc/network/interfaces の設定例(固定IP)




# 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 と同じで



libvirt が勝手に作るNAT 用のブリッジインターフェイスを削除.(大抵はvirbr0 という名前かな)




$ sudo virsh net-autostart default --disable
$ sudo virsh net-destroy default


brctl show で確認するとvirbr0 が消えてる.




network-manager がいると設定を上書きされるらしい(未検証)なので,とりあえず network-manager を消しとく.




$ sudo apt-get remove network-manager



ネットワークを再起動




$ sudo service networking restart


これで br0 にIP がふられてたらOK.

以上.





--
My Emacs Files At GitHub

2014年5月19日月曜日

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


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




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

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



動作環境





  • マシン: Mac Book Air 2011


  • OS: Mac OS X 10.9.2


  • Virtual Box: version 4.2.18









前提




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






Go のインストール




Capstan はGo で書かれている.

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




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

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




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




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


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

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

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






Capstan のインストール




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

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

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




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




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








Capstan によるOSv の実行




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

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




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


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

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




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

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

ls とか ifconfig が使える.

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




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

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

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




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






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




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

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

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




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


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

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




$ ssh admin@localhost -p 2222


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

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

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






余談





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

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





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









--
My Emacs Files At GitHub

2014年4月10日木曜日

git diff で色をつける


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



$ git config --global color.ui true




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



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





Table of Contents







--
My Emacs Files At GitHub

2014年3月30日日曜日

Raspberry Pi で Radikorec を使ってみる.


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




環境




<マシン>
Raspberry Pi

<OS>
Raspbian 7.1

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







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




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




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








setuptools distribute をインストール

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

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

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


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

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

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




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








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




以下のコマンド(Debian 系)



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







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

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



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


編集内容は以下の通り.



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

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

 setup(
     name = 'radikorec',








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




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



sudo make install
./compile 
sudo ./setup 








試験的に動かしてみる.




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



./runtest


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








放送局コードについて




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

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






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




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

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



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




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



sudo apt-get install mpg321 
sudo mpg321 hoge.mp3 



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

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






コマンドリスト







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








my_script.sh の中身







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





--
My Emacs Files At GitHub

2014年3月11日火曜日

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


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



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

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


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

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

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



$ sudo xcode-select --install


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



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


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



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

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




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

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





--
My Emacs Files At GitHub