ssh-agentによるパスフレーズスキップ

今作業中の環境では、まず踏み台へsshでログインし、その後本命のマシンへssh接続しています。しかし、踏み台と本命マシンで鍵が異なるため、本命マシンへの接続時に毎回パスフレーズを入力する必要があって面倒に感じていました。

踏み台ログイン後にssh-agentを起動しても、別ターミナルで踏み台にログインするとそちらではssh-agentの設定が反映されません。

色々と調べていると、ssh-agent起動時にSSH_AGENT_PIDとSSH_AUTH_SOCKの2つの環境変数が設定され、sshはこの設定を元にssh-agentに認証させるらしい、ということが分かりました。

そこで、ログイン時にssh-agentが起動していたら環境変数を設定するよう.bash_profileに記述することにしました。

#!/bin/bash

#################################
# SSH-AGENT check.
#################################
user_name=`who am i | awk '{print $1}'`
ssh_agent_pid=`ps -U $user_name | grep -v grep | grep ssh-agent | awk '{print $1}'`
ssh_sock_dir=/tmp/`ls -l /tmp | grep "$user_name" | awk '{print $9}'`
ssh_auth_sock=$ssh_sock_dir/`ls -l $ssh_sock_dir | grep "$user_name" | awk '{print $9}'`

if [ "$ssh_agent_pid" != "" -a "$ssh_auth_sock" != "" ]
then
echo ssh-agent running!!!
SSH_AGENT_PID=$ssh_agent_pid
SSH_AUTH_SOCK=$ssh_auth_sock
SSH_AGENT_CHECKED="yes"
export SSH_AGENT_PID
export SSH_AUTH_SOCK
export SSH_AGENT_CHECK
fi

unset user_name
unset ssh_agent_pid
unset ssh_sock_dir
unset ssh_auth_sock


また、ログアウト時にssh-agentをkillし忘れて大変なことにならないよう、.bash_logoutに次のように設定しました。

#!/bin/bash

#################################
# SSH-AGENT check & kill.
#################################
if [ "$SSH_AGENT_PID" != "" -a "$SSH_AUTH_SOCK" != "" -a "$SSH_AGENT_CHECKED" != "yes" ]
then
ssh-agent -k
fi

ssh-agentが起動していてかつSSH_AGENT_CHECKEDがyesで無い場合、つまりssh-agentを起動したターミナルの場合のみ、ssh-agentをkillします。



普段あまりシェルスクリプトを書かないので少し時間はかかりましたが、便利な開発ライフが遅れてハッピーです。

続・PS3eye.axの問題?

PS3eye.axの不具合?の続き。
今回はコードから問題点を見つけます。

videoInputでの処理

videoInputを利用した初期化からキャプチャ画像取得までの流れは次のような感じです。

// videoInut インスタンス作成
videoInput *vi = new videoInput();

// デバイスを列挙し、デバイス数を取得
int n = vi->listDevices();

// デバイスを初期化(ここでは末尾に列挙されたデバイスを使用する)
vi->setupDevice(n-1, capW, capH);

// キャプチャした画像データへのポインタを取得
char *img;
if( vi->isFrameNew(n-1) ) {
	img = (char *)vi->getPixels(n-1,false);
}


setupDevice()の中では、指定されたカメラ(具体的にはカメラに対応したDirectShowフィルタ?)がサポートする機能を取得(http://msdn.microsoft.com/ja-jp/library/cc355061.aspx)し、指定した解像度のフォーマットでカメラを初期化しています。
ただし、指定した解像度をカメラがサポートしていない場合も想定して(だと思うのですが)、カメラがサポートする最小解像度、最大解像度、細分度というパラメータを用いて適切な解像度でカメラを初期化するようです。
細分度については、MSDNで以下のように説明されています。

使用しているキャプチャ カードが、160 x 120 ピクセルから 320 x 240 ピクセルの間のすべての解像度で JPEG フォーマットをサポートしているとする。この場合、サポートされている解像度間の違いは 1 である。なぜなら、サポートされている各解像度に対して 1 ピクセル加算または減算することによって、次のサポートされている解像度を得ているからである。サポートされている解像度間におけるこの差は、細分度と呼ばれる。

ビデオ能力


videoInputの実装では、だいたい次のようにして解像度を決めています。

int tempW = 999999;
int attemptWidth  = capW;
bool exactMatchX = false;

if(scc.OutputGranularityX >= 1)
{
    for(int x = scc.MinOutputSize.cx; x <= scc.MaxOutputSize.cx; x+= scc.OutputGranularityX)
    {               
        //If we find an exact match
        if( attemptWidth == x ){
            exactMatchX = true;
            tempW = x;                              
        }

        //Otherwise lets find the closest match based on width
        else if( abs(attemptWidth-x) < abs(attemptWidth-tempW) ){
            tempW = x;                              
        }
    }
}


値を最小解像度から最大解像度の範囲内で細分度の分ずつ増加させて、完全一致する、もしくは近い値を調べています。
この後、exactMatchXがtrueならattemptWidthを、falseならtempWをキャプチャ幅として設定するといった感じです。
上記はX軸のみですが、Y軸でも同様に処理しています。

PS3eyeの設定に問題?

PS3eyeでは最小解像度、最大解像度、細分度が次のように設定されています。

scc.MinOutputSize.cx : 640
scc.MinOutputSize.cy : 480
scc.MaxOutputSize.cx : 640
scc.MaxOutputSize.cy : 480
scc.OutputGranularityX : 0
scc.OutputGranularityY : 0

どうやら、解像度640x480のみサポートするようです。
前述のコードから行けば、細分度が0なので最初のif文に引っかかることなく先へ進んでしまうため、tempWの初期値999999がキャプチャ幅として設定されることになります。

ちょいと試してみたところ細分度が1以上あれば期待通りに設定できるので、当初は「細分度0を指定しているPS3eyeのDirectShowフィルタであるPS3eye.axの問題」と思っていたのですが、MSDNに次のような記述があります。

GetStreamCaps を使って次に公開するペアは、最小能力 640 x 480、最大能力 640 x 480、細分度 0 を組み合わせた 640 x 480 JPEG のメディア タイプとなる。

ビデオ能力

細分度0というのは、解像度を640x480に限定するといった意味のようですね。
と、いうことは・・・

本当の問題と対策

問題はPS3eye.axではなく、細分度0に正しく対応していない(と思われる)videoInputにあるようです。
対策としては、

1.videoInputを修正して今後も使用する
2.PS3eyeSDKを利用する

といった感じでしょうか。
videoInputは昨年の4月から更新が途絶えているようなので、絶賛更新中のPS3eyeSDKを利用するべきですかね。

あ、あれ?

videoInput、更新されてる・・・Jan 2009ってめっちゃ最近・・・

Fixes:

  • some non freed memory issues.
  • a bug with closest device matching.
  • a potential bug from not setting the lSampleSize of the media type. Thanks Peter!
  • restartDevice remembers all your settings now.
videoInput Library


この問題も今回の更新で直っているっぽいですね。
問題のあった箇所も、「とりあえず希望の解像度を設定してみる→エラーならこれまでと同様に最適なサイズをサーチ、設定する」という流れになっているので
大丈夫そうです。
自作のアプリにも適用してみましたが、特に問題はありません。


ファイルのタイムスタンプが2/2になってるので、多分昨日UPされたんだろーなぁ・・・






というわけで皆さん、PS3eyeとvideoInput(最新のやつね!)は使える子でしたよ!!!(なんつーオチだ)

PS3eye.axの不具合?

今、OpenCVvideoInput libraryを使って、WEBカメラ映像を加工する簡単なアプリを作ってます。WEBカメラPS3用のウェブカメラを使おうと思って早速はまったんだけど、ぐぐっても原因が分からなかったので記事にしときます。




WEBカメラにはlogicoolこれを使用してそれらしいのが出来ていたんだけど、各所でPlayStation eyeがかなりいい感じと書かれていたので、使えないのかなぁと調べましたらば、DirectShowのフィルタさえあればvideoInput経由のキャプチャはOKな感じ。
PlayStation eye自体はPCでの利用は公式にはサポートしていないのでドライバ始め関連ソフトは公式なものは一切無い。ぐぐってみたところ、これ(以下、PS3eye)にドライバやDirectShowフィルタ、更にはSDKまでくっついてることが分かりました。

PS3eyeをインストールすればDirectShowフィルタもインストールされるはずなので、インストール、添付アプリでの動作確認後、PlayStation eyeを接続して自分のアプリを起動してみました。
すると、videoInputでちゃんと認識はしているようで、

***** VIDEOINPUT LIBRARY - 0.1991 - TFW07 *****


VIDEOINPUT SPY MODE!

SETUP: Looking For Capture Devices
SETUP: 0) PS3Eye Camera
SETUP: 1 Device(s) found

と表示はされます。
が、その後

SETUP: Setting up device 0
SETUP: PS3Eye Camera
SETUP: Couldn't find preview pin using SmartTee
SETUP: 640 by 480 not supported closest supported size is 9999999 9999999
SETUP: Setting capture size to 9999999 by 9999999
SETUP: Media Type is RGB24 no conversion needed

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

と表示されてアプリケーションごと落ちてしまいます。
どうやら解像度を640x480で指定したにも関わらず、うまく認識できずに9999999x9999999に設定しちゃうようです。
しかもvideoInput内部で落ちてる模様。

videoInputはソースが公開されているので、どうなっているのか見ることにしました。




そんな長い内容ではないんだけど、どうにも集中力が続かないので、残りは明日。



追記(2009/02/04):
改めて見直すとPS3eye.axの不具合ではないのかも知れません。次の記事で詳細を書きます。

ハンター生活を振り返る

ハンター稼業に従事して早2ヶ月半。ちまちまとソロプレイを続けております。


現在村長☆4緊急クエスト「絶対強者」でティガレックスに3回挑んで返り討ちにあってます。
この2ヵ月半のハンター生活で磨いたスキルで果敢にも立ち向かってるのですが、なかなか上手いこと行きませんな。(スキル大したことねぇw)


さっきのチャレンジでは瀕死状態まで持っていきながら、奴の寝床である洞窟の狭いエリアで咆哮→突進のコンボを喰らって昇天。
風呂に入って気分を切り替えるついでにこっちを更新してます。


周りでやってる友人がおらずkaiにも繋いでいない、狩りに割ける時間も一日1クエぐらい。そんなプレイ時間120h前後の私のHRはいまだに2のまんま。それでも飽きずに続けられるのはゲームシステムのお陰なのかなと思います。


購入当初は何の予備知識もなく、「まぁ適当にLVでも上げりゃ時間掛かっても先進めるっしょw」と軽く見ていたのですが、いざ始めてみたらLVなんてありゃしねぇw
しかもアクション系のゲームを長い間やっていなかったために勘が鈍りまくっていたこと、なかなか操作に慣れないことが災いして死にまくり。
最初の2週間は高台から大きい猪を弓でぺちぺち葬って(相手の攻撃が届かないのでやられない)は畑を耕すというチキンぶり。ある意味引き篭もりとも言える状態が続き、そうなると当然飽きてしまうわけで「やっぱ向いてないわ〜」と感じてしばらくの間ハンター生活からは身を引いていました。


しかしある日、はてブ経由で「はじめてのモンハンシリーズ」の動画を知り、衝撃を受けたのでした。
並み居るモンスターを苦労しながらも倒して成長していく主人公。動画に付いたコメントにも応援の言葉が並びます。


「あれ、意外と行けるんじゃね??」


そう思うようになったのは「はじめて」シリーズを全部見終えた後でした。


最初の頃はスキルが足りなくて当然。それを補う術はいくらでもある。そしてその術がいらなくなったとき、プレイヤーは自らの成長したことを実感することになる。大事なのは、成長しているのはゲームの中のキャラクターではなく、プレイヤー自身のスキルであること。


この点に思い至った(事前に調べとけっちゅーの)時、私は再び狩りの世界に身を投じて行ったのでした。
そして今、主人公が滞在している村に来る原因になった*1飛竜と対決するところまで来たと言うわけです。



色々と大げさに書いたんですが、一連の動画を見なければ今のハンター生活はなかったと思います。動画のUP主さんはもう初心者ではないということで、シリーズを変えて動画をUPしていらっしゃいます。
ブログもしてはるみたいですね。



さてもう一狩りして寝るかなー!
皆さんも良いハンターライフを!!





追記:
ハイクの方にちょこちょこと狩りに関する独り言を書き込んでます。

*1:プロローグ参照のこと

ハンターになりました

なぜかふと思い立ち、ハンター稼業に従事してみることにしました。


モンスターハンターポータブル 2nd G - PSP

モンスターハンターポータブル 2nd G - PSP


一日一時間狩れればよい方だけどな・・・


実はこっちも楽しみ。


ファンタシースターポータブル - PSP

ファンタシースターポータブル - PSP


サターンもドリキャスも持っている身としては、久々にSEGAのゲームもいいかと思って・・・


さて、ハンター生活初日だけど・・・普通の生活を送るのに支障があるんですけど!アナログスティック?の位置が下過ぎて間違って十字キー押しちゃうんですけど!
敵が来た!と思ってよけようとしたら視点がグルグル変わって攻撃くらいまくり。蜂みたいなのキライ!


こないだ電車で隣に座った高校生らしき男の子がPSPを取り出して狩りを始めたのを見たんだけど、あのスティック捌き、実はすごかったのか・・・


訓練所のクエストをひとつ終えたんだけど、壁を登れることに気づかず、30分くらい歩いていけるところをウロウロウロウロしてました。トナカイみたいなモンスターいっぱい殺しちゃいました。多分かなり無駄な殺生。


オイラ、ハンター向いてないのかなぁという思いがヒシヒシとしてるんですが、id:ExaFieldには東京で狩りに付き合ってもらおうと思うのでヨロシク!

つながる・・・のかッ!?

はてなTシャツ欲しい!



むむむ、どなたとペアルックにすればいいか・・・



ここはやはり最近人気急上昇中でお気に入りのid:ooo0_temaki_0oooさんだろ!



ペアルックよろしくです!!!!