gitの使い方

先ほど研究室で質問されてこんなやり取りをしました:

「gitを勉強中だがよくわからない」
「どういうところが?」
「コマンドは理解したが、バージョンとかブランチとかをどう使ったらいいのか?」
「どういうことがしたい?」
「いまプログラムの派生版を複数のディレクトリにおいて並行作業している。これがgitを使うと上手に管理できると思うが?」
「できる。前のリビジョンのバックアップのつもりで使っているのなら複数のディレクトリは複数のリビジョンに対応する。方向性の違う拡張を別々のディレクトリで作業しているのであれば、それぞれのディレクトリはブランチに対応する」
“gitの使い方” の続きを読む

ソフトウェア公開とライセンス

ソフトウェアの公開とライセンスに関して議論をする場があったので、気づいたことや感じたことを書いておきます。

例えば Linux 用の一般的な(glibcを動的にリンクしている=LGPLが適用される)実行バイナリを、登録者だけが利用できるように、ダウンロードサイトにパスワード保護をかけたり、ZIPファイルにパスワード暗号化をかけたりすることは、LGPLに違反する恐れがあるそうです。
だとすると過去にGalatea Toolkitを配付した際にも不適切な状況があったかも知れません。。
“ソフトウェア公開とライセンス” の続きを読む

ソフトウェア構成管理

むかしバージョン管理システムの本を書いたことがある私に「ソフトウェア構成管理」について教えて欲しい、という相談がありました。

私は基本的にソフトウェア開発で生計を立てているわけではなく、手段としてのソフトウェア開発における、技術と人の問題に興味を持ってきました。
直接のきっかけは「バグのないソフトウェアを目指して」というテーマで読みあさった一連の書籍です。
そしていまの私も、ソフトウェア構成管理については、昔の読書の知識からあまり進歩していません。

“ソフトウェア構成管理” の続きを読む

Panasonic と Vine

2008年1月に Panasonic Let’s Note でひどい目にあった。

乱暴に言えば、Windows Update がパソコンを壊したのだ。日本でしか売れていないマイナー機種は、もはや Microsoft で動作検証されてすらいない、という事実に気づくきっかけになった。

長年使い続けた Let’s Note が、気づいたら「高品質の代表」ではなくなっていたことに愕然とした。「グローバルでない製品を使うのはリスク」という認識を持つようになった。

2008年4月に Lenovo ThinkPad X300 に乗り換えた。(高かったが。。)中国メーカーに事業譲渡されて劣化したという意見もあるが、それを言うなら Apple 製品も製造は中国や台湾だ。本当はトラックポイントがお気に入りだったし、PgUp PgDn のあるキーボードが使いたかったので、乗り換えて満足した。

もちろん高品質と手放しで喜べたわけではなく、まず Windows XP にダウングレードしたあと、Muteボタンがうまく動かなくて苦労した。調べたらウイルスバスターとの互換性問題だった。(ウイルスバスターがガラパゴスだった)試したら Microsoft OneCare がよかったので、ウイルス対策ソフトの乗り換えを行った。(販売終了になってしまったのが残念だが)

今年の夏ごろから、バッテリーの故障とキーボードの故障に相次いで見舞われた。しかし、Lenovo は部品を注文して自分で取り替えればたいていのことはできるので、あまり悩むこともなく、時間は無駄にならなかった。

さすがに Let’s Note より重たいけれど、慣れてしまった。内蔵 DVD ドライブを使う機会がほとんどないので、セカンドバッテリに換装した。

SSD 64GB はちょっと物足りないが、逆に大事なデータをこまめにバックアップする習慣がついたから、必ずしも悪いとは言えない。それでも VMWare で Ubuntu を使うには少し足りないが。。。1440×900 の画面が使えるのはありがたい。

****

私が Let’s Note T1 に飛びついたのは 2003 年ごろで、当時は周りの人はみんなバイオノート派だったので珍しがられた。

いまや Let’s Note でない人を探す方が難しいが、Let’s Note 派の人が「原因不明のトラブル」に見舞われている率が去年くらいから高まっているように感じる。

私の職場でも「異常な温度上昇」「電源トラブル」などなど。

先日は私が座長をしていた学会のセッションで、自分の発表を始めようとしてプロジェクターにつないだ人が、突然 Let’s Note の電源が入らなくなった。おかげで10分くらい時間が無駄になった。けっきょくバッテリーを外して付け直したら復旧したのだが。

Twitter の kazuyo_k さんもデバイスドライバーの相性でそうとうお困りだった様子だが、私が去年1月に経験したトラブルのことを思い出すと、最近の Panasonic にいかにもありそうなトラブル、という気がする。

こうしてグローバルでない商品はいつのまにか腐っていくのだな、という実感を持っている。

****

すこし前に、ある人にGalateaの動作確認を頼まれてVine Linux 5の64bit版を仕方なく入れてみた。

そもそも1年前までGalateaはVine Linuxを動作対象にしていた。自分も日常的にVineを使っていた。Vineは「日本語環境が充実している」のが売りだった。日本語フォント、かな漢字変換システム、日本語の入力がちゃんとできる Emacs エディタや、日本語の論文作成ができるようにチューニングされた LaTeX などなど。

1.x の時代(10年前だ)には Linux はカーネルが 1.0 系だった。そもそも Linux そのものが「枯れていなかった」。NFSサーバを運用してみたらファイルがぶっ壊れて、仕方なく Solaris に戻したこともあった。サーバとして、デスクトップ環境として、まともに使えるようになったのは Vine 2.5 あたりからだった。商用版が発売され、日本ではそれなりに普及していたはずだ。

Vine 2.x, 3.x, 4.x とずっと使い続けた感想として、明らかにこの数年、Vineは「腐って」きた。3.x の時代には「日本語のフォントが間違っている」ことがあった(教授の名前の1文字だったので、とても困った)。開発者グループに連絡をしたがすぐには直してもらえず、仕方なく某商用 TrueType フォントに差し替えて使った。

昨年6月にはサーバの更新で Vine 4.2 を使おうとして、NIS サーバの設定ファイルにバグを見つけた。そのとき気づいた。「もう誰も Vine なんて使ってないんじゃないか」と。

ちょうど Ubuntu Linux が台頭しはじめていた。あちこちで「Ubuntu があれば Windows はいらない」と言われ始めるほど、高い完成度を誇り始めていた。

Ubuntuでは国際化されたバージョンに「日本特有のパッケージを追加して使う」という考え方になっている。コアの部分は世界中で使われ、不具合がないようにグローバルに検証されているのだ。

Linux カーネルの更新に1年に2回追従していた Ubuntu と異なり、Vine は(もともと「保守的」な開発方針であったため)カーネルが古すぎて新しいハードウェアで動かない、ということが当たり前だった。自分で差し替えることはできたが「だれも使っていない使い方」を試行錯誤するのは苦痛だった。

GalateaはターゲットをUbuntuに切り替えた。自分の(職場の)Linux環境も1年前からUbuntuへの移行を進めた。腐ったLinuxと心中することを回避できた。

2年以上かかって先日やっと Vine 5 がリリースされた。頼まれて仕方なくいじってみたが、駄目だ、と思った。Vine で XXX が動かない、と聞かれても、やっぱり「それは Vine が腐っているからだ」と答えるしかない。

ちなみに32bit版も試してみたら、多少まともだった。だが、ダウンロードのデフォルト選択肢が64bit版だったことは理解に苦しむ。

****

私にいろいろ相談してくださった方は、けっきょく Let’s Note で Vine 5 のオーディオデバイスをどうしても認識できない、とのことで、今年は Galatea for Linux の演習を断念されたとのこと。私に言わせれば「最悪の組み合わせ」だ。。

「グローバルでない製品を使うのはリスク」というのはハードウェアにもソフトウェアにも当てはまりそうだ。

  • 追記(2009-10-01): 上記は私の経験に基づく仮説であり、特定の製品の開発プロセスについては推測に過ぎません。特定の製品が頻繁に故障しているように見えるのは、特定の製品のユーザが圧倒的に多いことによるバイアスかも知れません。また、この記事に関してもう一つお伝えしたいことは「評判は頻繁に変化しうる」ということです。ソフトウェアもハードウェアも現在ちょうど新しいバージョンに変わるタイミングですので、いろいろな方の評価を御確認の上、ご自身でご判断ください。本記事の誤りをご指摘いただいた場合は、お詫びして修正をするつもりですが、本記事をお読みになったことで不利益が生じたとしても責任は負いかねます。御了承ください。

Ubuntu 8.04 (vmware) + rails 2.3.2

Ruby on Rails 2.3.2 を使える環境を作る手順。何度も同じ失敗をしたので、備忘録として書きます。

使用したのは Ubuntu 8.04 日本語リミックスの VMware 仮想マシン(VMware Player 2.5.1 on Windows XP)。

安易に 8.10 にアップグレードしたら open-vm-tools がおかしくなり、eth0 を認識しなくなったので、8.04 のまま使うことにしました。HGFS は使えないのですが、ホストOS(Windows XP)とのあいだでコピー&ペーストができるので便利です。

apt-get でインストールされる gem はバージョンが古いので、このままでは後の作業がうまく行きません。

/var/lib/gems/1.8/ にインストールされるのは古い gem の挙動、/usr/lib/ruby/gems/1.8/ にインストールされるのが新しい(望ましい?)gem の挙動のようです。

  • 2009-08-12 追記:Debian パッケージの gem をそのまま使うと /var/lib/gems 以下にインストールされる、ということらしいです。Ubuntu 9.04 の /usr/bin/gem1.8 (gem 1.3.1) においても /var/lib/gems に実行ファイルが生成されることを確認しました。
$ sudo apt-get install ruby rubygems
$ gem -v
0.9.4
$ which gem
/usr/bin/gem
  • 追記 (2009-05-20) Ubuntu 9.04 の rubygems1.8 はバージョン 1.3.1 でした。

手作業で gem 1.3.1 を入れる。

$ sudo gem install rubygems-update-1.3.1.gem
$ sudo /var/lib/gems/1.8/bin/update_rubygems
...
RubyGems installed the following executables:
/usr/bin/gem1.8
If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.

古い /usr/bin/gem と新しい /usr/bin/gem1.8 が共存しているので、手作業で対応。

$ gem -v
/usr/bin/gem:10:Warning: Gem::manage_gems is deprecated and will be removed
on or after March 2009.
/usr/bin/gem:23: uninitialized constant Gem::GemRunner (NameError)
$ gem1.8 -v
1.3.1
$ pushd /usr/bin; sudo mv gem gem.org ; sudo ln -s gem1.8 gem; popd
$ gem -v
1.3.1

gem 1.3.1 を使って rails を入れる。

$ sudo gem install rails
Successfully installed rake-0.8.4
Successfully installed activesupport-2.3.2
Successfully installed activerecord-2.3.2
Successfully installed actionpack-2.3.2
Successfully installed actionmailer-2.3.2
Successfully installed activeresource-2.3.2
Successfully installed rails-2.3.2
7 gems installed
...
$ rails -v
Rails 2.3.2

アプリケーション hoge を作って、sqlite3 で rake test を通す。

$ rails hoge
$ cd hoge
$ rake test
rake aborted!
no such file to load -- sqlite3

sqlite3 環境が足りないから rake test が通らない。下記サイトを参考に対処。

$ sudo apt-get install ruby1.8-dev swig libsqlite3-dev
$ sudo gem install sqlite3-ruby

migrate して test する。

$ rake db:migrate
(in /home/nishi/hoge)
$ rake test
(in /home/nishi/hoge)
/usr/bin/ruby1.8 -I"/home/nishi/hoge/lib" -I"/home/nishi/hoge/test"
"/usr/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader.rb"
/usr/bin/ruby1.8 -I"/home/nishi/hoge/lib" -I"/home/nishi/hoge/test"
"/usr/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader.rb"
/usr/bin/ruby1.8 -I"/home/nishi/hoge/lib" -I"/home/nishi/hoge/test"
"/usr/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader.rb"

test が通ったので、server を動かしてブラウザから確認する。

$ script/server
Welcome aboard
You're riding Ruby on Rails!
About your application's environment
Ruby version	        1.8.6 (i486-linux)
RubyGems version	1.3.1
Rack version	        1.0 bundled
Rails version	        2.3.2
Active Record version	2.3.2
Action Pack version	2.3.2
Active Resource version	2.3.2
Action Mailer version	2.3.2
Active Support version  2.3.2
Application root	/home/nishi/hoge
Environment	        development
Database adapter	sqlite3
Database schema version	0

git を使う

Vine Linux 4.2 に git のパッケージがあったので、使ってみました。

下記の手順の中で、別の場所に新しいディレクトリをまったく作らないで作業ができている、というところが、CVS や Subversion と異なる点(手軽さという意味で大きなメリット)だと思います。

インストール(Ubuntu でも同様)

$ ssh yellow
$ sudo apt-get update
$ sudo apt-get install git-core
  • Vine 3.x には git-core パッケージはないみたいです

個人のデフォルトを設定する

git config --global user.email "nishimoto@m.ieice.org"
git config --global user.name "Takuya Nishimoto"
  • ~/.gitconfig に書き込まれるようです

既存のディレクトリをバージョン管理下におく。ここでは職場で使っている bibdb という自前ツールの例。

$ cd /export/htdocs/html/bibdb/
$ git init
  • カレントディレクトリに .git ディレクトリが作成され、これがレポジトリになる

管理したいファイルを追加する

$ git add *.php *.txt
$ git add cgi-bin/update_publication.cgi
$ git add *.jpg *.gif .htaccess

追跡されているファイルとされていないファイルを確認する

$ git status

commit する

$ git commit -m "first commit"
  • これにより、追跡されているファイルが .git 内に保存され、比較・復元が可能になる

編集してみる

$ emacs -nw 00readme.txt

差分を確認

$ git diff
diff --git a/00readme.txt b/00readme.txt
index ff26fee..c15f626 100644
--- a/00readme.txt
+++ b/00readme.txt
@@ -4,3 +4,7 @@
TODO:
<A5><A2><A5><C3><A5><D7><A5><ED><A1><BC><A5><C9><A4><B5><A4><EC><A4><BF>pdf<A4><F2>chmod 644<A4><B9><A4>
+
+2009-03-06 by nishimoto
+
+ $ git init
  • TODO: 文字化けの解決
    • 環境変数 GIT_PAGER を使うのかな?

差分を commit する

$ git commit --all -m "readme updated"
[master]: created b5f0737: "readme updated"
1 files changed, 4 insertions(+), 0 deletions(-)

履歴を確認する

$ git log
commit b5f073788c35befd95f5a907777c221f17e63d1e
Author: Takuya Nishimoto <nishimoto@m.ieice.org>
Date:   Fri Mar 6 17:01:05 2009 +0900
readme updated
commit 42dff939ec85d2faa212ba42ff617f5fdac215e6
Author: Takuya Nishimoto <nishimoto@m.ieice.org>
Date:   Fri Mar 6 16:42:51 2009 +0900
first commit

ブランチを確認する

$ git branch
* master

ブランチを作る

$ git branch experiment
$ git branch
experiment
* master

別のブランチで作業してみる

$ git checkout experiment
Switched to branch "experiment"
$ emacs -nw 00readme.txt
$ git diff
diff --git a/00readme.txt b/00readme.txt
index c15f626..be17e40 100644
--- a/00readme.txt
+++ b/00readme.txt
@@ -8,3 +8,8 @@ TODO:
2009-03-06 by nishimoto
$ git init
+
+2009-03-06 by nishimoto
+
+ git branch : experiment
+

experiment ブランチに commit する

$ git commit --all -m "00readme modified"
[experiment]: created 609c427: "00readme modified"
1 files changed, 5 insertions(+), 0 deletions(-)

master ブランチに戻す

$ git checkout master
Switched to branch "master"
$ cat 00readme.txt
[yellow]
/home/httpd/html/bibdb/
TODO:
アップロードされたpdfをchmod 644する
2009-03-06 by nishimoto
$ git init

experiment の更新を master にマージする

$ git merge experiment
Updating b5f0737..609c427
Fast forward
00readme.txt |    5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)

マージできたことを確認する

$ git branch
experiment
* master
$ cat 00readme.txt
[yellow]
/home/httpd/html/bibdb/
TODO:
アップロードされたpdfをchmod 644する
2009-03-06 by nishimoto
$ git init
2009-03-06 by nishimoto
git branch : experiment

リンク

更新記録

  • 2009-03-10 : 事前に git config で user.name などを指定するようにしました。

Ubuntu Linux 8.10 + freeglut3 + FreeType2

GLUT で日本語を表示するのは面倒だと思っていましたが、意外に簡単でした。

とはいえ、例によって単純なコピーペーストでは成功しなかったので、メモしておきます。

// main.cpp
// encoding : UTF-8
//
// sudo apt-get install libftgl-dev freeglut3-dev
// g++ -g -I/usr/include/freetype2 -lglut -lftgl main.cpp
//
#include <GL/glut.h>
#include <FTGL/ftgl.h>
#define FONT "/usr/share/fonts/truetype/vlgothic/VL-Gothic-Regular.ttf"
FTFont *font;
void display(void)
{
glClearColor(0.0, 0.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1.0, 1.0, 1.0, 1.0);
FTPoint point(-1, 0, 0);
font->Render("日本", -1, point);
glFlush();
}
int main(int argc, char *argv[])
{
font = new FTGLPolygonFont(FONT);
if (font->Error()) exit(1);
font->FaceSize(0);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

Ubuntu Linux 8.10 + Lenovo ThinkPad X300

トラックポイントを青ボタンと同時に押したときにスクロールする設定。

$ sudo gedit /etc/X11/xorg.conf
Section "ServerFlags"
Option "AutoAddDevices" "false"
EndSection
Section "InputDevice"
Identifier	"Configured Mouse"
Driver		"mouse"
Option		"CorePointer"
Option    	"Emulate3Buttons"     	"false"
Option          "EmulateWheel" 		"true"
Option          "EmulateWheelTimeOut" 	"200"
Option          "EmulateWheelButton" 	"2"
Option          "XAxisMapping"        	"6 7"
Option          "YAxisMapping"        	"4 5"
Option          "ZAxisMapping"        	"4 5"
EndSection

参考リンク:

Festival in Ubuntu

英語の音声合成フリーソフトの現状について引き続き調査中です。

Ubuntu Linux 8.04.1 で espeak が簡単に使えることはわかったのですが、Festival も簡単に使えました。

$ sudo apt-get install festival festvox-don

$ festival

Festival Speech Synthesis System 1.96:beta July 2004

Copyright (C) University of Edinburgh, 1996-2004. All rights reserved.

For details type `(festival_warranty)’

festival> (SayText “Hello”)

#<Utterance 0xb6974f88>

$ echo “(SayText \”Hello.\”)” | festival

synaptic で見たかぎりでは festvox の English Female パッケージはないようです。残念。