2015年3月20日金曜日

Grub のブートメニューををシリアルポート経由で出力する


1 Grub のブートメニューををシリアルポート経由で出力する




1.1 動作環境




  • $ uname -a

    Linux debian 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 GNU/Linux


  • $ sudo grub-install -v

    grub-install (GRUB) 1.99-27+deb7u2






1.2 設定方法



注) コマンドはあとで思い出しながら書いたところがあるので,コピペしても動かないかも



/etc/default/grub に以下を追記



GRUB_TERMINAL_INPUT='serial console'
GRUB_TERMINAL_OUTPUT='serial console'
GRUB_SERIAL_COMMAND='serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1'


grub-mkconfig で設定ファイルを更新.



# grub-mkconfig -o /boot/grub/grub.cfg


出力された /boot/grub/grub.cfg を確認する.




# grep 'serial' /boot/grub/grub.cfg
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal_input serial console
terminal_output serial console


これで再起動すれば,GRUB のメニューがシリアルポート経由で出力される.






--
My Emacs Files At GitHub

2015年2月16日月曜日

iPXE でBitVisor をネットワークブートしよう


iPXE でBitVisor をネットワークブートしよう





はじめに



BitVisor のブートは,ローカルディレクトリにイメージを置いて,Grub から起動する方法を取ることが多いかなと思うが,これは開発時には結構面倒.

なぜなら,トライアンドエラー中にBitVisor のイメージを差し替えるためだけに,BitVisor なしで一度ブートしないといけないから.

ネットワークブートなら,サーバーにおいてあるBitVisor のイメージを差し替えればいいので,楽.

というわけで,ネットワークブートの方が楽だよ,と先輩に教わった方法をここに書く.




恐らく,ブートするのがBitVisorだからと言って特別なことはあまりない.

Linux をiPXE でネットワークブートするのと設定はほぼ同じだと思う(Linux はやったことないけど.)






環境




  • iPXEサーバーマシン: Raspberry Pi


  • OS: Raspbian






必要なもの




  1. BitVisor を起動マシンするマシン(BIOS の設定でネットワークブートを有効にできるもの)


  2. Raspberry Pi


  3. GNU make が動くx86マシン(1. のマシンでもいい)


    • iPXE のイメージとBitVisorのイメージを作るのに必要








設定方法




TFTP のインストール & 設定



使うのはtftpd-hpa.




$ sudo apt-get install tftpd-hpa
$ sudo vi /etc/default/tftpd-hpa
$ sudo service tftpd-hpa start


設定ファイルの変更は以下の通り




4c4
< TFTP_DIRECTORY="/srv/tftp"
---
> TFTP_DIRECTORY="/var/lib/tftpboot/"
6c6
< TFTP_OPTIONS="--secure"
---
> TFTP_OPTIONS="--secure -4"


上記設定では, /var/lib/tftpboot にiPXE のイメージを置く設定.

/var/lib/tftpboot がない状態でtftpd-hpa を起動しようとすると,失敗するらしい.



オプションに -4 をつけた理由.

= オプション追加せずにtftpd-hpa を起動しようとしたら,Raspbian でIPv6 が無効になってて動かなかったから.

ちょっと jot: obs600 で 再度 debian squeeze - その 1






DHCP サーバーのインストールと設定




$ sudo apt-get install isc-dhcp-server
$ sudo vi /etc/dhcp/dhcpd.conf #設定ファイルの編集
$ sudo service isc-dhcp-server


設定ファイルの変更(というより追記)は以下の通り




107a108,118
>
> subnet 192.168.0.0 netmask 255.255.255.0 {
> deny unknown-clients; # 下記でMACアドレスが登録されてない起動マシンは無視.
> host deep-desktop {
> hardware ethernet 00:60:6E:EB:5A:D8; # 起動マシンのMACアドレス.
> fixed-address 192.168.0.20; # BitVisorを起動するマシンに割り振るIPアドレス
> option host-name "deep-desktop"; # host *** の部分と同じ.
> next-server 192.168.0.30; # tftp サーバのIPアドレス.
> filename "bitvisor-boot.kpxe"; # ipxe イメージのファイル名
> }
> }


これで,MACアドレス 00:60:6E:EB:5A:D8 から要求が来たら, TFTP で /var/lib/tftpboot/bitvisor-boot.kpxe を送る.

bitvisor-boot.kpxe というのは,iPXE のイメージファイル.

このファイルの作り方は後述.





iPXE をイメージを作成



iPXE はイメージファイルをtftp で起動マシンに投げて,起動マシンで実行される.

なので,起動マシンがx86 ならx86向けにビルドする.

というわけで,以下のイメージファイルの作成の操作はx86マシンでやる.



$ git clone git://git.ipxe.org/ipxe.git
$ cd ipxe/src
$ vi bitvisor-boot.ipxe
$ cat bitvisor-boot.ipxe
#!ipxe
dhcp
boot bitvisor.elf
$ make -j4 bin/undionly.kpxe EMBED=bitvisor-boot.ipxe
# scp bin/undionly.kpxe deep@raspberrypi:~

bitvisor-boot.ipxe はiPXE でのブート処理を記述するファイル.

上記の設定で,サーバーの /var/lib/tftpboot/bitvisor.elf をブートする.

今回は書かないが,この設定をいじると,ブートするイメージを選択するメニューを出せたりもする.



make の結果, bin/undionly.kpxe が作成される.

これが,iPXE のイメージファイル.

このファイルをRaspberry Pi 上に置く.



以下は,Raspberry Pi上で操作.

TFTP のディレクトリにiPXE のイメージを置く(ついでにファイル名も変える)



$ sudo cp undionly.kpxe /var/lib/tftpboot/bitvisor-boot.kpxe





BitVisor のビルド



これもx86マシンでやる.



$ wget http://sourceforge.net/projects/bitvisor/files/latest/download?source=files -o bitvisor-1.4.tar.gz
$ tar -zxvf bitvisor-1.4.tar.gz
$ cd bitvisor-1.4/
$ tar -zxvf bitvisor-1.4.tar.gz
$ cd bitvisor-1.4/
$ history | tail -n3
$ make config # 動かすだけならデフォルト設定で大丈夫だと思う(多分)
$ make -j4
$ scp bitvisor.elf deep@raspberrypi:~


Raspberry Pi でbitvior.elf をTFTP のディレクトリに配置.



$ cp bitvisor.elf /var/lib/tftpboot/bitvisor.elf





いざブート…の前にBIOS 設定




  • ブートする前にBitVisor を起動するマシンのBIOS の設定を変更


    • ネットワークブートを有効にする(大抵どこかにあると思うので探そう,これなかったら諦めて別のマシンを用意して)




  • ブートの優先順位でネットワークブートを再優先にする


    • 優先順位の選択にネットワークブートを出すには,ネットワークブートを有効化してから一時Save&Exit しないといけないので注意.










おわりに



今回はRaspberry Pi をサーバにしてみたが,VMでもいいからx86 マシンを用意できるからそっちの方が多分よい.

なぜなら,iPXE のイメージを差し替えるときにいちいち別のマシンでビルドしないといけないから…



雑な説明になってしまったので,質問や突っ込みがあれば,是非お願いします.

(TFTP とかiPXE の仕組みはたぶん3割くらいしかわかってないので,仕組みとかは質問されても答えられないと思うけど…)






--
My Emacs Files At GitHub

2015年1月21日水曜日

org-mobile-pull/push を自動実行する設定


1.1 はじめに

org-mobile でTODO 管理とかすると,PC からの入力がストレスレスで良いのだけど,なにせ,いちいちコマンド叩いて同期するのが面倒.

というわけで,自動的にorg-mobile-pull とかorg-mobile-push とかするようにしてみた.

まだ,この設定で動かした時間短い(30分ぐらい)ので,どこかおかしなところを見逃してる可能性ある.

だから,あんまり鵜呑みにしないようにお願いします.
(追記: 後述のcapture ファイル監視でのpullは動いてないっぽい... 2015/01/21 09:12)





1.2 やること



  • Emacs が開いている間,アイドル時間が一定時間以上でpull してpush
  • org-mobile-capture-file が変更されたらpull (追記: 下記の設定では動いてないぽい)

    • capture ファイルは,org-mobile で同期取るときに使う差分を保持する一時ファイルだったかな? とにかく,他のデバイスとかで編集するとこのファイルが更新されるっぽい.
  • ファイルをセーブするときにはpush
  • ファイルを開くときにはpull




1.3 参考にしたコード



以下のリンクにあるサンプルコードを参考にした

FAQ · matburt/mobileorg-android Wiki

やってることは


  • org-mobile に登録したファイルを保存すると,その後アイドル時間30秒経過するとpush を実行
  • 24時間に一回の頻度でpush
  • Emacs 起動時にpull
  • org-mobile が更新されたらpull




1.4 やってみる




1.4.1 コード





(defvar org-mobile-sync-timer nil
  "Timer that `org-mobile-sync-timer' used to reschedule itself, or nil.")
;;pullしてpush する関数
(defun org-mobile-sync nil
  (interactive)
  (org-mobile-pull)
  (org-mobile-push))

;;idle 時間が60秒経過すると自動でpullしてpush
(defun org-mobile-set-sync-timer nil
  (interactive)
  (setq org-mobile-sync-timer (run-with-idle-timer 10 60 t 'org-mobile-sync)))  ;;修正 2015/01/21 09:04


;;自動pull, push  を無効にする(一応用意してみたが使うかどうか...)
(defun org-mobile-clear-sync-timer nil
  (interactive)
  (cancel-timer org-mobile-sync-timer))

;;↓要修正  (追記:2015/01/21 09:11)
;;指定されたファイルを指定された時間で監視,更新されたらorg-mobile-pull を実行
(defun install-monitor (file secs)
  (run-with-timer
   0 secs
   (lambda (f p)
     (unless (< p (second (time-since (elt (file-attributes f) 5))))
       (org-mobile-pull)))
   file secs))

;; capture ファイルを5秒ごとに監視,更新されたらorg-mobile-pull 実行
(install-monitor (file-truename
                  (concat
                   (file-name-as-directory org-mobile-directory)
                   org-mobile-capture-file))
                 5)

;; org-mobile に登録したファイルを保存するとpush
(add-hook 'after-save-hook
          (lambda ()
            (when (eq major-mode 'org-mode)
              (dolist (file (org-mobile-files-alist))
                (if (string= (file-truename (expand-file-name (car file)))
                             (file-truename (buffer-file-name)))
                    (org-mobile-push)))
              )))

;; org-mobile に登録したファイルを開くとpull
(add-hook 'find-file-hook
          (lambda ()
            (when (eq major-mode 'org-mode)
              (dolist (file (org-mobile-files-alist))
                (if (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


  • ファイルをセーブするときpushするコードは,元のコードから遅延を省いただけ.
  • capture ファイル変更でpull するコードは元コードそのまま






1.5 おわりに



とりあえず,これでしばらく使ってみる.

もしかしたら何か問題あるかも知れない.

問題が見つかって,気が向いたらこの記事直します.(無責任)






--
My Emacs Files At GitHub

2015年1月19日月曜日

Emacs Lisp を少し勉強した


1 Emacs Lisp を少し勉強した   gblog



Emacs Lisp のコードを読むときに知らなくて困った(多分)基本的な所をメモ.

困ったときに調べたものだけメモしているので,網羅はしてない.




1.1 コンスセル



「CARスロットおよびCDRスロットと呼ばれる 2つのポインタから成るオブジェクトです。」らしい.

「各スロットは、任意のLispオブジェクトを指すことができます。」

ドット記法とかで表現する.

(A . B) と書くと,A がCARスロット,B がCDR スロット



参考ページ:

GNU Emacs Lispリファレンスマニュアル: Cons Cell Type







1.2 cons obj1 obj2



obj1 とobj2 から成るコンスセルを作る関数.

(cons 1 2) => (1 . 2)





1.3 リスト



リストはコンスセルの入れ子構造.

(1 2 3) と表示する.

この実態は,CARスロットが1, CDR スロットが(2 3) のコンスセル.

2と3 が要素のリスト(2 3) の実態は CARスロットが2, CDR スロットが(3) のコンスセル

3だけが要素のリスト(3) の実態は CAR スロットが3, CDR スロットが空リストの()

ドット表記だと(1 . (2 . (3 . ())

(cons 1 (2 3)) => (1 2 3)

(cons 1 ()) => (1)

また,空リスト() はnil とも書く

つまり,

(cons 1 nil) => (1)





1.4 関数car, cdr



コンスセルのCAR スロットを取り出すのがcar 関数,CDR スロットを取り出すのがcdr 関数.

リストに適用すると,以下のような感じ.

(car '(0 1 2)) => 0

(cdr '(0 1 2)) => (1 2)





1.5 シングルクォートは何?



car やcdr の例では'(0 1 2) とリストの前に「'」がついている.

これは,リストを評価しないようにするためのものらしい.

リストを評価するとは,リストのCAR スロット(第一要素)を関数名,第二引数以降を関数の引数として,計算するということ.

Lisp は(0 1 2) とだけ書いて実行すると,0 を関数名,1 を第一引数,2 を第二引数として計算しようとするらしい.

これをせずに,リストとしてそのまま置いておくために,シングルクォートをつける.

関数名や変数名の前に「'」をつけるのも同じ理由のようである.



参考ページ:

Programming in Emacs Lisp: List Processing



また,別の説明で,おそらくより厳密な説明が以下のリンクにある.

Emacs Lisp

これをちゃんと理解するためには,シンボルというものを理解しないといけないらしい.

また,シンボルなるものの構造については以下のリンクが詳しいと思う.

GNU Emacs Lispリファレンスマニュアル: シンボル

このあたりの理解は今後の課題.





1.6 let



ローカル変数を定義して,最後のリストを評価する.



(let (ローカル変数の定義のリスト) フォーム1 … フォームn)



ローカル変数の定義のリストは以下の構文

((ローカル変数名1 初期値1) ローカル変数名2 … (ローカル変数名n 初期値n))

(ローカル変数名1 初期値1) と言うリストは,ローカル変数名1 が初期値1 で初期化することを示す.

一方,ローカル変数2 とだけ書いていると,ローカル変数2 はnil で初期化する.



フォームとは,Emacs Lisp のコードと思えばいいのかな?

let 全体の戻り値は,最後のフォーム(フォームn) の戻り値になる.



例:

(let ((x 3)) x) => 3

(let ((x 3) (y 2)) x y) => 2 ;; 最後のフォームがlet の戻り値になる

(let ((x 3) (y 2)) (+ x y)) => 5

(let ((x 3) y (z 4)) (list x y z)) => (3 nil 4) ;; (list x y z) はx y z を要素とするリストを返す






1.7 スペシャルフォーム(special form) とマクロ



普通,リストの形式で書いて実行すると,全てのリストが評価される.

しかし,例外があるらしく,それがspecial form というらしい.

先のlet はその一つ.

(let ((x 3) (y 2)) (+ x y)) の(x 3) はリストだが,これを関数として評価していない(したらx なんて関数はないとエラーが出るはず)

一方,一番後ろの(+ x y) は評価されている.

このように,let の引数に関しては,一番後ろしか評価しない,ということになっているようである.

他にも,値を変数に代入するsetq などがそうらしい.



また,スペシャルフォームという言葉を調べていると,マクロという言葉もよく見かける.

マクロは,ユーザー定義のスペシャルフォームらしい.

参考ページ:

スペシャルフォームとマクロ - by shigemk2






1.8 dolist



実は,このブログの内容は,dolist のサンプルコードがわからなくて調べだしたのがきっかけ.

つまり,今回のブログはここがゴール.



dolist もlet のようにスペシャルフォーム.

構文は以下.

(dolist (ローカル変数 リスト [戻り値]) フォーム1 … フォームn)



リストの要素を一つずつローカル変数に代入してフォーム1 からフォームn の処理を繰り返す

python とかでいうforeach 的なやつ.

戻り値を設定しないと,dolist の戻り値はnil になる.

また,戻り値に未定義の変数は使えないので,予め定義する必要がある.

例:

(let ((sum 0)) ;; 戻り値に使う変数を定義

(dolist (x '(1 2 3) sum)

(setq sum (+ x sum)))) => 6






--
My Emacs Files At GitHub

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