Linuxマシンの状態監視にsysstat&ksarがすごい便利

Linuxマシンで何かプロセスを動作させていて、プログラムのログを確認すると「昨日の晩はやたら重かったけどなんかあったかな」とその瞬間の状態を確認したかったりする。

そんなときはシステムの状態をログに残すsysstatが便利。
何ができるかというと、CPU使用率やメモリ使用率、ネットワークのトラフィック、IOなどをログに残してくれる。

sysstatについてはいますぐ実践! Linux システム管理を参照する。

sysstatを使うとバイナリファイルにログが吐かれ、sarコマンドでテキスト形式で状態を確認する事ができる。
が、テキストファイルなのでいまいち把握しづらい。
そこで、sarをグラフで表示してくれるksarを使用する。
これが結構便利だ。
SSHで接続して、相手サーバでsarコマンドを実行して自動でデータを取得しグラフを表示してくれる。よって、ログファイルをコピーしてきて・・・なんて事は必要ない。

sysstatのインストールは適当にapt-get install sysstatとか、yum install sysstatとか。

/etc/default/sysstatを開き、enable=”true”になっている事を確認する。

後はksarでログを見たいマシンに接続するだけ。
お手軽でとても便利。

abort: couldn’t find mercurial libraries

CentOS4.7にMercurial1.6.4を入れようとしたらPythonが古すぎると怒られた。
よってPython2.7を入れてからMercurialをインストール。
インストールは正しく成功したけどMercurial実行時に次のエラーが出た。

$ hg
abort: couldn't find mercurial libraries in [/home/kkitamu/bin /home/kkitamu/lib/python27.zip /home/kkitamu/lib/python2.7 /home/kkitamu/lib/python2.7/plat-linux2 /home/kkitamu/lib/python2.7/lib-tk /home/kkitamu/lib/python2.7/lib-old /home/kkitamu/lib/python2.7/lib-dynload /home/kkitamu/lib/python2.7/site-packages]
(check your install and PYTHONPATH)

どうやらMercurialのライブラリが見つからないようだ。
HOME以下にバージョンが異なるPythonがインストールされており、Mercurialはlib/python2.7を見に行ったが見つからないようだ。
調べてみるとMercurial用のライブラリがlib/python以下にインストールされているようだった。
よって $ export PYTHONPATH=/home/kkitamu/lib/python を実行しライブラリの場所を教えてあげる。
ホントはMercurialインストール時にlib/python2.7以下にインストールしてくれるのが正しそうだが・・・。
とりあえず様子を見てみよう。

夏休みに沖縄

遅めの夏休みに沖縄へ旅行に来ています。
台風が心配だったけど、結構天気はマシで良かった良かった。

玉取崎展望台からの夕焼け

プログラムを実行した際に、DLLが足りなくて起動しない場合にどのDLLが足りないかを調べる方法

開発したプログラムを他の環境に持って行くと次のエラーが出た。

このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。詳細については、アプリケーションのイベント ログを参照してください。

VistaでVC++ランタイムが足りないとこのエラーが出るようだ。全く持って意味不明すぎるエラーメッセージ・・・。しかもWindowsのバージョン毎に違うメッセージとはまたすばらしい。

で、ランタイムを入れるが次のエラーが出た。

アプリケーションを正しく初期化できませんでした。 0xc015002

ランタイム入れたのに何でだろう。ググるとVC++のランタイムが足りない時のエラーのようだが・・・。
と、そんなときにどのDLLが足りないかを調べる方法があるので、それで調べると問題が解決する。

まずDependency Walkerを起動する。

C:Program Files (x86)Microsoft Visual Studio 8Common7ToolsBinDepends.Exe

そして開いたウインドウに問題のあるexeファイルをD&Dする。

するとなぜかVC++2005のランタイムにも依存している事がわかった。一部のdllが2005でコンパイルされたからのようだ。と言う事で解決。

CAsyncSocketのCreateで例外

CAsyncSocketを使っていると、ポートのバインド時に例外が発生した。
ググっても日本語の情報がなかったのでメモを残しておく。

現象は、socket->Create(nPort)するとDebug Assertion Falied!と言われ、CMapPtrToPtr::GetValueAt内のアサーションに失敗する。

void* CMapPtrToPtr::GetValueAt(void* key) const{
// ↓ ここで例外
ENSURE(this);
if (m_pHashTable == NULL)
return NULL;

UINT nHash = HashKey(key) % m_nHashTableSize;

// see if it exists
CAssoc* pAssoc;
for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext){
if (pAssoc->key == key)
return pAssoc->value;
}
return NULL;
}

検索するとAfxWinInitすればいいよと書いてあったがすでにしている。
で、結果はAfxSocketInit()での初期化が足りなかったので、AfxSocketInit()を追加すると問題は解決した。

if(!AfxSocketInit()){
OutputErrorLog(_T("Failed to Initialize Sockets."));
}

ActiveRobotAPIでプロキシを使う

ActiveRobotAPIを使うとGoogle Wave外からウェーブを操作する事ができるが、この時、プロキシを使わないとHTTP通信ができない場合、うまくWaveサーバにつながってくれない。Google Wave APIとしてはプロキシの設定を行うAPIは用意されておらず、システムプロパティを設定する事でプロキシを使うようになる。

設定するプロパティはhttp.proxyHostとhttp.proxyPort。
詳しくはこちらを参照する。

System.setProperty("http.proxyHost","プロキシサーバのアドレス");
System.setProperty("http.proxyPort","ポート");
HelloNewWaveRobot robot = new HelloNewWaveRobot();
try {
robot.createNewWave("新しいウェーブです!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

ActiveRobotAPIでNo consumer key is found for the RPC server URL

ActiveRobotAPIはOAuthで認証する必要がある。
が、Robot Registrationでコンシューマキーとコンシューマシークレットを取得し設定したのにもかかわらずNo consumer key is found for the RPC server URLと怒られる場合がある。そんなときはロボットのコンストラクタでsetAllowUnsignedRequests(true);を呼び出す必要がある。

public ActiveRobot(){
setupOAuth(CONSUMER_KEY, CONSUMER_SECRET, "http://www-opensocial-sandbox.googleusercontent.com/api/rpc");
setAllowUnsignedRequests(true);
}

Git導入

何度かGit導入したいなと思うことがあったけれど、Eclipseでの対応が微妙だったりで導入してこなかったGit。
業務ではSubversionを利用しているのだけれど、分散リポジトリだったら便利だろうなと感じる機会も多い。
そこでGitを勉強するため入門gitを購入し、Gitの知識をインストールする。


しかしGitになれるまでは、当分Subversionと共用していこう。

Google CodeのSubversionと共に生きるには次のようにしてSubversionリポジトリをインポートする。

$ git svn clone -s  https://kenji.googlecode.com/svn/ KenjiRepository

上記のようにしてインポートすると、Subversionデフォルトの構成でインポートされる。すなわちhttps://kenji.googlecode.com/svn/以下のtrunkがmaster、tagsがタグ、のようにだ。

Google CodeのSubversionリポジトリへの変更のプッシュは次のようにして行う。
Google Codeのユーザ名はdcommitする際に指定する。git configで指定したユーザ名は、dcommitでは使用されないようだ。

$ git svn dcommit --username kenjikitamura

んでGoode Codeのパスワードを入れると無事にGitでの変更がSubversionに反映された。

Rubyで書かれたWaveロボットをHeroku上で動作させてみる。

あんどうさんがRuby版のWaveロボットライブラリを公開されたので、ちょっと動かしてみる。
Rubyを動かすサーバなんて無いよ!と言う人のためにHerokuと言う簡単にRubyで作ったWebアプリを公開するサービスがあるのでそれを利用する。

まずHerokuに登録し、Heroku Quickstart Guideに従ってやってみる。

herokuインストール

$ sudo /usr/bin/gem1.8 install heroku
Successfully installed mime-types-1.16
Successfully installed rest-client-1.4.2
Successfully installed rake-0.8.7
Successfully installed configuration-1.1.0
Successfully installed launchy-0.3.5
Successfully installed json_pure-1.4.3
Successfully installed heroku-1.9.11
7 gems installed
ERROR:  While executing gem ... (Gem::DocumentError)
ERROR: RDoc documentation generator not installed: no such file to load -- rdoc/rdoc

RDoc documentation generator not installedと怒られる。なのでRDocを入れる。

$ sudo apt-get install rdoc

gem install herokuが成功。次にHeroku上のプロジェクトを作成。

$ heroku create
/usr/lib/ruby/gems/1.8/gems/rest-client-1.4.2/lib/restclient.rb:9: no such file to load
-- net/https. Try running apt-get install libopenssl-ruby (LoadError)

libopenssl-ruby入れろと怒られたので従う。

$ sudo apt-get install libopenssl-ruby

公開鍵をアップロードし、Heroku上のプロジェクトを作成する。

$ heroku keys:add /HOGE/id_rsa.public

$ heroku create
Creating morning-flower-61..... done
Created http://morning-flower-61.heroku.com/ | git@heroku.com:morning-flower-61.git

できあがったようだ。名前を指定しなかったので、デフォルトの名前が生成された。

pushする。

$ git push git@heroku.com:morning-flower-61.git master

http://morning-flower-61.heroku.com/ にアクセスしてみる。するとGemが足りないようだ。ここ嫁と言われているので読む。

HerokuでGemを使うには設定が必要なようだ。
今回はHeroku gem manifestを利用する。
.gemsファイルに使用するGemを書いておくだけでよいようだ。

.gemsファイルにsinatraと記述し、git pushする。pushしようとすると次のように怒られた。

なるほど、gemはローカルにもないとダメなのか。ローカルにもsinatraをインストールし、再度git pushする。

次のURLにアクセスし、WaveロボットのProfile設定のJSONが取得できればOK!

Waveロボットレジストレーション

RubyでWaveロボットが動きそうなので、Waveロボットとして動作できるようレジストレーションを行う。Google Wave Robots API: RegistrationへGO!

Robot nameとRobot base URLは次のようにした。

ruby-robot-sample
http://morning-flower-61.heroku.com/sample-robot

Verify Tokenが表示されるので http://ROBOTURL/_wave/verify_token?st=1234 などのURLでこのトークンを返すようにする。ruby-robot-sample.rbのrobot.startの手前でverify tokenを設定する。(こういうやり方で良いのかな?)

# verify token
robot.verify_token = "TOKEN==";
robot.start

Verify TokenのURLにアクセスし、設定したトークンが表示されればOK。RegistrationのページのVerifyボタンを押そう。

Internal Server Error Error 500が出た・・・orz Googleの中の人はお休みのようです。

ちょっと時間を空けてもう一度すると、Unable to register your robot.と出た。
なんか怒られてるけどruby-robot-sample@googlewaverobots.comをウェーブに追加し、メッセージを投稿してみる。

キターーーー!!!

と言う事でHeroku上でRubyで書かれたWaveロボットが動きました!

第2回 京都GTUG Google Wave Hackathonを開催します

以下の日程で、第2回 Google Wave Hackathonを開催いたします。

日時
勉強会&Ideathon 2010/8/21 13:00 ~ 18:00(開場:12:30)
Hackathon本番 2010/8/29 10:00 ~ 18:00(開場: 9:30)

会場 京都リサーチパーク

主催:京都 Google Technology User Group(京都GTUG)
後援:京都リサーチパーク株式会社

—–
Hackathon とは「Hack(ハック)」と「Marathon(マラソン)」を組み合わせた造語で、エンジニアが一ヶ所に集まり、短期間で面白いサービスを開発するイベントです。まず、8/21にアプリケーションを開発するための基礎知識を学習するための勉強会があります。勉強会の後にチーム分けを行い何を作るかのアイデアを練っていただきます。そして1週間の準備期間を経て8/29の朝から開発を行い、夕方に作成したアプリケーションを発表します。

今回のテーマは、Google Waveです。
事前に勉強会(8月21日 13:00 – 15:00)を開催しますので、Google Waveを知らない方でも気軽に参加して頂けます。また、勉強会のみの参加も可能です。勉強会ではGoogle Waveの基礎からWaveガジェット、Waveロボットの作り方を簡単に紹介いたします。

  • Waveガジェット
    Google Waveのドキュメントに貼り付ける事ができる小さなアプリケーションで、多人数で共有するアプリケーションを作ることができます。
  • Wave ロボット
    ユーザがGoogle Waveのドキュメントに対して行った操作に対し動作するプログラムで、ユーザのサポート的なプログラムを作ることができます。また、ロボットから能動的にGoogle Waveのドキュメントに変更を加えることも可能です。いわゆる”ボット”です。

前回のGoogle Wave Hackathonを開催した頃から、Google Wave APIがかなり拡張されているので、前回参加された方も楽しめるHackathonになるかと思います。

Hackathon 当日は、数名ずつのチームで開発を進めますが、入門チームも用意しますので、学生の方もお気軽にご参加下さい。

申し込みはこちら!