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