月曜日, 6月 30, 2008

やっと、仕事が動き出す?

いやぁ~、長いこと待ったもんだ。。。 やっと、正式に動けるようになりました。 これで、ホントの社会復帰になるんだ!!と思っております。 しかし、あんまり息巻いていると しんどくなっちゃうんであんまり頑張らない方向で。。。w

日曜日, 6月 29, 2008

OpenIDってどうやって使うんだ??

えーと、わからんです。。。
Bloggerでも使える(認証プロバイダっていうやつ?)ようなことは聞いたんですけど、
どうも見つけられずにいます。

まぁ、OpenIDがつかえないと・・・って場面が今のところはないので、困ってはいないんですが
認証機構としてのOpenIDの在り方は僕的には在りだと思っているので、
(変に色んなところでIDとかを作るくらいならその下位レイヤーとして色んなサイトを横断的に認証可能ってのは楽ちんだと思うしね)必要になったらもう少し真面目に使えるようにしてみようと思う。

土曜日, 6月 28, 2008

Trac用メモ

Apache上でTracを動かすときのSELinuxのラベル設定 Tracのプラグインのキャッシュディレクトリのドメインは http_tmp_t 普通のtemp_tとは違うんですね。。。 一つ勉強になりました。

金曜日, 6月 27, 2008

やっぱり、これって路駐になるんですよね。。。

最近、ふと思ったんですが、 現在、僕が通っている仕事場はオフィス街なんですけど、 駐輪所が皆無というような場所なんです。 まぁ、わかる人は大阪城ホールの周辺を想像してみてください。 で、仕方がないので、タクシーとかがよく客待ちしているエリアにこんな風に止めてるんですけど やっぱり路駐だよね。。。 困っていることが一つ それは、この配置に対して90°で見事にママチャリ達が壁を作っていることがあるんです。 それも写真に撮ってやろうかと考えたんですが、 ちょうどこのときは大阪城ホールで誰かのコンサートがあったらしく、 ものすごい人だったのでやめときました。 だって、何か恥ずかしくないですか? 人でもなく自転車を取り続けているってのは。。。

木曜日, 6月 26, 2008

iPod touch

最近、ほしいなぁ~と思うアイテムなんですが、 いかんせん、高いのがネックなのと 音楽聴くだけならnanoの方がいいんじゃね?という話を耳にして 僕は一体どんな使い方を想定しているんだろうか?と考えてみた。
  • 音楽を聴く(まぁ、これは普通だな)
  • 無線Lanでメールのチェック(どこまで使いこなせるだろう?)
  • 起動が早いらしい↑の要件をサクっと終われそうな気がする
  • その他はまぁ、どうでもいいやw
こんな要件なんですよね。 特にtouch用のアプリとかつくりたいとかって考えてないんで、 そこまでこだわらなくてもいいのかなぁ~ しかし、iPhoneにするつもりは全くないんで、 あの仕様や料金プランを突き詰めると、あんまりメリットを感じないから。。。

水曜日, 6月 25, 2008

学習教材を考えてみる

できれば、使えるツールがいいなぁ~なんて漠然としたことを考えています。 とりあえず、意気込みを見せとくかということで、 Subversion1.5をインストール 何か、内部の管理方式が変わったとかどうとかで。。。 まぁ、何とかなるだろう。 とりあえず、マインドマップとかでも使って今あるアイデアを形にしてみたいもんだなぁ~

火曜日, 6月 24, 2008

NFSのディレクトリでsvn commitするとlock取得に関するエラーが出る

NFSで定義したディレクトリ上のリポジトリへコミットを実行すると
Can't get exclusive lock on file '%s'
なんてことをおっしゃられるので、 ちょこっと調べてみることに。。。
日本語訳はすぐに見つかり
ファイル '%s' に対して排他的なロックを取得できません
うーん、日本語訳にしてもすぐには解決しそうにないなぁ~
で、いろいろ調べてるとNFS上のリポジトリにコミットしようとして同じよう症状に遭遇している方を発見!!

その方は結局ローカル上にリポジトリを再構成して対応されたようでした。。。

僕も一旦はそうしようかと考えたんですが、
以前、使えていたような記憶が頭の片隅に残っていたので、
食い下がって調べてみた。

とりあえず、NFSのロック機構はどうなってんだ??ってところから始まり、

サーバ側の設定は?

クライアント側の設定は?

iptablesか?

selinuxか?

とあれこれ調べていて、ひとつ気になったのは
クライアント側のnfslockのデーモンって起動しないとロックできねーんじゃないか??

結果としてそれが当たりでロックできないよぉ~っていうメッセージも出ることなく問題なしで動くようになった。

僕のなけなしの知識ではrpcでサーバ-クライアント間のやり取りをやっているんで、
ロックしたよ~って情報をクライアント側のnfslockからサーバに通知してあげないとダメなんですね。。。(ほんとにあってるのかな^^;)

てっきり、今まではそんなもんは必要ない?(というか意識したことがなかった。。。)と思っていたんですが、いろいろ出てくるもんです。

いつの間にかTrac0.11のRCが取れたのがリリースされてる

ちょっと、mod_wsgiってのがどんなものなのか?ってのが気になって Tracをダウンロードしてこようと思ったら、 Trac 0.11RC2じゃなくなってる!! RCってのは「Release Candidate」ってことね。もうチョイで正式に。。。ってニュアンスで受け取ってるけど問題ないのかな??? で、入れて少し動かしてみる。。。 当然だけど全部英語だ。。。 しかし、Genshiを使ったテンプレートってどんなもんなんだろ? yumで入れようとするとClearSilverがくっついてくるので、 腹立たしくてeasy_install trac==0.11で入れてみたんですが、 まぁ、ぼちぼち触りながら感触を確かめてみるか。

月曜日, 6月 23, 2008

seboolをチェックするようにしよう

最近、SELinuxがらみでひっかかることが多かった。 (まぁ、多いのは今も変わらんのですが。。。) 「selinuxをoffにしたら動きました」ってのはよく情報として手に入るんだが、 せっかく、エライ人たちが用意してくれたもんだし使いこなせるようになろうと努力はしています。 何となくトラブルシュートの手順が見えてきた。
  1. とりあえず、setenforceでPermissiveモードにして動きを確認
  2. selinuxではない部分の設定apacheならhttp.confとか
  3. 2で問題がなければこれでsetenforceを実行すれば動くはず
  4. ここまで来てPermissionDenyとかって怒られるようなら、とうとうSELinuxが当たりっぽくなってくる
  5. とりあえず、ざっくりaudit2allow -d -lで何か足りないポリシーが無いかチェックする
  6. 関連のファイルのタイプをチェックする。おかしかったらchconで修正
  7. これでも動かないならaudit.logを確認する(SELinuxがらみならそれっぽいメッセージがあるはず)
  8. それっぽいメッセージに関連するsebool値を確認するgetsebool |grep hoge
  9. ずらずら出てくるパラメータからそれっぽいものをチェックしてonにしてみる
最近はこんな感じかなぁ~

日曜日, 6月 22, 2008

たまには悩む

僕だって、たまには?悩むことだってあります。。。 最近、どうも技術的なことに対する興味が薄れてきていて、 何か新しいことでも学んでみたいなぁ~と思っているんですが、 いかんせん飽きっぽいところがあるんで、 キチンとしたお題が無いと何か燃えないんですよねぇ~ ちょっと前にはJavaFX+EclipseLink+Derbyで会計用ソフトでも作ってみようかとも考えてみたんですが、いまいち乗り気になれない状態になっています。。。 それで、Trac0.11RC2に走ってみたんですが、Linux環境になるといかんせんうまく動かすことができないという現状にイライラが。。。 未だに通っている医者には「何か不安なことありますか?」って聞かれるけど、 この向上心の消失とでもいうのかな?そういう曖昧な状態なんで、 それが漠然とした不安なのかもしれないが、どうも決め手に欠けるところがあって、 「う~ん、最近は不安になることはないですねぇ~」なんて調子の良いことを言っている。 これから先どうなっちゃうんだろ???

土曜日, 6月 21, 2008

食パン+グラタン

久しぶりに自分で晩御飯を作ってみました。 そんでもって、こんなん作ってみました。 食パン+グラタン 題して「パンでグラタン」・・・ 駄目だ!!もう、そんな商品あるじゃん!! まぁ、とりあえず作ったんだしタイトルは考えたいんだけど うまいネーミングないかねぇ~

木曜日, 6月 19, 2008

状態遷移図

よく、業務画面(またはレコード)の状態を細かく分析するのは難しいもんだ。。。 未だにどこまで落としこめばいいのかよくわからなくなる。 何かいい方法ってないんですかね?

水曜日, 6月 18, 2008

精神論

プレスブログさんのところから、「リアル夏こそキアイダー」っドリンクのタイアップページを紹介されました。 とりあえず、紹介の記事を読んでて一番びっくりしたのが、 北京オリンピック公式エネルギー飲料 「リアル夏こそキアイダー というフレーズ!! マジっすか!? また、合わせてアニマル浜口氏が気合巡業夏場所と言われるイベントをやられるそうな。 まぁ、「気合だー!!」ってな具合に一喝して回るんだろうなぁ~という想像だけは簡単に思い浮かぶ。 確かにアニマル浜口氏がでてくるなら、このロゴもありだなぁ~と
話を戻して、動画の中で自分が気に入ったのを選んでね。と言われるがまま見てみたんですが、「これって、アメバじゃないとみれないんじゃ。。。」と少し不安が。。。 まぁ、問題なくみれたんですけどねw まず、最初は何か言ってるぞってな具合だったんですが まず、言わせてください。「福井さんって誰やねん!!」 「え~と」って連呼します。 20秒くらいは「何かえーとが多いなぁ~」と思ってたんですが、 「徐々にお前の気合が足りてないんじゃー!!」と突っ込みたくなるんです。 最終的には「電話かい!」って具合でした。 どりあえず、コンビニで見つけたら買ってみるかw

DB2のJDBC Type2にハマる

今日、仕事場でよくわからない現象が発生した。 それは、次のような事象でした。 各端末で次の操作をおこなう。 Javaでmarge文を発行(PrepareStatement#executeUpdate()) 対象DBはWindows2000server DB2 v8.2で更新するのは同じDBインスタンスの同一レコード 他にそのレコードは更新しない状況下であることは当然 marge実行時の戻り値が変なんです。 JDBCのAPI仕様上、PrepareStatement#executeUpdate()はreturn intとなってます。
  1. 端末Aでは、mergeのreturn 1
  2. 端末Bでは、mergeのreturn 0
  3. 端末Cでは、mergeのreturn 1
というような結果になった。 ちなみに端末A,B,Cの全てで対象レコード1件が更新(when matched then)されます。 ここで、結果を見直すと・・・ 「何で端末Bではreturn 0なんだ??」って状態になるんです。。。 最初はクラスローダが読み込んでいるJDBCドライバのverが違うのかな?と思っていたんですが、そういうわけでもないみたい。 (みんな、同じくDB2 v8のレガシードライバだということはすぐにわかったんですが。。。) ここからは、わかったことを
  1. 端末Aは確かにbuildlevelっていう値がB,Cとは違っていたが、BとC同じだった。
  2. 端末Bで使用しているドライバをClassLoader#getResource()で導き出し、端末Aで使用してもreturn 0になるわけではない。(return 1)
  3. java.sql.Connection#getMetaData()#getDriverVersion()を見てみると、同じドライバクラスを利用しているのに表示されるバージョンが違うということに気づく
  4. とりあえず、DB2Driverクラスを逆コンパイルしてソースを追いかける。
  5. getDriverVersionをどんどん追跡していくと。。。
  6. nativeメソッドにたどり着き、そこでふと気づく「そういや、Type2で接続してたんだよね。。。」
  7. Type2ってのはType4のようにダイレクトに接続するのではなく、一端クライアントのネイティブライブラリを通して接続する種類であることを思い出し、DB2Driverクラスが読み込んでいるdllを探し始める
  8. 端末ごとにdllのversionをチェックしてみると驚きの結果が。。。
場所 :db2jdbc.dll :LegacyDriver(buildlevel) 端末A :8.1.7.447 :s040812(DB2Clientのdb2java.zip) 端末B :8.1.0.36 : s021023(Websphere付属?のdb2java.jar) 端末C :8.1.8.762 :s021023(Websphere付属?のdb2java.jar) みんな、バラバラやん!! そりゃないよ。。。 しかし、dllのversionが8.1.0だとmargeのreturnが0になるってどうなんだろ?? 最終的に端末Bのクライアントを再インストールしてとりあえず解決とした。 (FixPackを適用すれば回避できるかも。。。)

火曜日, 6月 17, 2008

飼殺し

何か物騒なタイトルになっちゃったけど、 現在の僕の職場での状況がまさにそれに該当してます。。。 契約した案件にストップがかかってしまって余剰人員その1となってしまっています。。。 上の人もそのあたりは重々承知のはずなんだけどねぇ~ 簡単なお手伝いでも良いんで何か僕にお題を下さい。 まぁ、お金は出るんで問題ないと言えば問題ないんですけど。。。 やることが無くなってきて どうしたもんかと色々考えてます。 この時間を利用してもっとも僕にとってプラスになることを考えてみるが、 イマイチ「これだー!!」っていうのは思いつけない。。。 今日はとりあえずEclipseLinkのWikiが結構まとまってきていたので、 それを元に実験でもしてみるかぁ~と思っていたんですが、 もう、集中力なんか保てるわけもなく、眠いこと眠いこと。。。 「ぼぉ~」としながらcvs2svnのスクリプトを流してみたりしてました。 cvs2svnのスクリプトは昔も使ったことがあったので、楽勝だと思っていたんですが、 困ったことにコンバートするのに時間がかかりすぎて使用しているPCのCPUが100%になったまま。。。 とりあえず、プロセスの優先度を通常以下にして他のこと(まぁ、Web見るくらいですけど。。。)をこなしてた。 今日中に終わりそうな気がしなかったので、ほったらかしにして帰ってきてやった。 なんで、Revのsort処理に何時間もかかるんだ?? まぁ、結果は明日行ったらわかるだろう。。。

月曜日, 6月 16, 2008

年金と保険のお知らせとチェーンリング交換の効果

とうとうやってきた。。。 払う金は当然のことながらないよ。。。 分割できんのかなぁ~?? 住民税の方は4期に分かれているからいいんだけど、 国民健康保険については、 去年は減免してもらって、 そのうえそのまま窓口で払ってしまったから払い方がまったくもってわかんないです。。。
話は変わって、先週末に取り換えたチェーンリング 36t→46tへの変更によって、かなりクランクが重くなったような気がする。 しかし、一回一回の踏み込みによる加速感?とでも言っていいのか、 レスポンスがすごく良くなったような気がする。 少し、路面が凸凹なところを走るとチェーンカバーがカタカタ鳴るということがわかったんもんで、 とりあえず、今日家に帰ってきてから結束バンドを利用して固定してみました。 結束バンドの色が白しかないもんだからブラウンのフレームには浮いて目立つかとも思ったが、まぁ大丈夫だろうw

日曜日, 6月 15, 2008

なつかしいなぁ~

今日はTVでインディ・ジョーンズを見てた。 ほんと、なつかしいなぁ~ ちっちゃい頃、一番好きな映画だった。 (といっても映画館で見たわけではないけどね。。。) その後、インディの幼少期をシリーズ化したやつがやってたけど、 確か「インディ・ジョーンズ 若き日の冒険」?とかってタイトルだったと思うんですけど。。。 あれって、DVDボックスで発売されてないかなぁ~? ふと、Amazonを見てみたけど DVDじゃなくてVHSって書いてある。。。 VHS! さすがに時代を感じさせますなぁ~ 今回の映画公開でDVDボックスが出てくれるとうれしいなw

NFS4に苦戦中 続き

とりあえず、NFSv4からは若干今までのNFSとは毛色が違うんだということがわかってきた。 それはfsidってパラメータだ!! fsid=0ならroot扱いになっちゃうぜ!って説明を読んで、 最初はさっぱり何言ってんだ?って感じだったが、 クライアント側での呼び出し例を読んでてやっと理解した。
mount -t nfs4 host:/ /hoge/hoge -o オプション色々
参照元がなぜにルートになってるんだ??って思っていたんだけど、 説明を読むとfsid=0の場合、あたかも/(rootディレクトリ)であるように見せることができるらしい。 とりあえず、理解はしたんだが fsid=1とかだと、マウントするときは今までと同じだと思っていたんだが、 見つからないと言われ続ける。。。 そして、小さく書かれている文面を確認してしまいました。。。 fsidの機能はまだ成熟してないよ~ ・・・ もう、面倒だからv3で接続しよう。

土曜日, 6月 14, 2008

NFS4に苦戦中

どーしても、NFS4でmountできません。。。 iptablesのポートも通してみた。 NFSの機構がresolveして名前解決していることも理解したので、 DNSの代わりにhostsで代用して突破した。 しかし、それでもinternal errorとなる。。。 メッセージはこんな感じです。
nfs: server ホスト名 not responding, timed out
どうも、名前解決まではできてるみたいだけど、「レスポンスが返ってこねーよ」的にメッセージですね。。。 結局、ホストとクライアントのどっちが悪いんだろうか??? とりあえず、Sharing files with NFSv4 on Fedoraを参考にやってみたんだけどうまくいかないんだよね。。。

チェーンリングを交換

やりました。 こんな感じに まずは、作業前の状態作業開始前 なんか、周りが散らかってるようにも見えるが気にしてはいけません。。。 次にこのピスト君を選んだ理由の一つであった、チェーンガードを取り外します。 チェーンガードだけ見ると「何これ?」って感じです。チェーンカバー まぁ、こんなのはともかく!! ここからが、本番です!! とりあえず、チェーンカッターでチェーンを切るためにチェーンを緩めます。チェーンを緩めたところ そして、ドキドキのチェーンカッターでのチェーン切断です。チェーン切断中 意外と簡単だった。 しかし、チェーンが無いとなんか随分まぬけだなぁ~ しかし、このあとあんなに苦労するとは。。。 まぁ、その話は後に回して続いて今使っているチェーンリングを取り外します。 取り外す際にクランクから外して取り付けようと思っていたんですが、 工具代をケチって10mmのレンチを買ってきたらサイズが合いませんでした。。。 (専用工具はキチンと買いましょうってことなんでしょうね。。。) とりあえず、チェーンリングのみを分解し、クランクの間を通すようにして取り外します。 まるで知恵の輪ですよ。。。 そして、チェーンリングを取り替えたのがこの姿です。 チェーンリング取り換え後1チェーンリング取り換え後2 (あんまりアップしたのを見られると傷だらけなのがわかっちゃいますね。。。) ついでに言うと、チェーンが外れないようにするカバー(名前忘れた。。。)を とりあえず、現在使っているものをそのままつけといたんですが、これじゃ意味ないよね。。。 そして! ここからが、一番大変でした。。。 チェーンの張替です。 とりあえず、前回利用していたチェーンのコマ数を数えてみると94コマでした。 しかし、これってチェーンリング36tの場合の話であって、今回取り替えた46tの場合には確実にコマ数が足りないんです!! そこで、とりあえず適当(今思うとエラい冒険したもんだと。。。)に長さを合して、まずは切断です。。。 そして、外した部分のコマを繋ぎ直します。 が、しかし!! 困ったことにIZUMIのVチェーンに接続用のピンが無かったんで、 切断した際に取り出したピンを再利用として四苦八苦です。 切って余った部分のチェーンをほどほどにピンを残した状態で外していき、 それで、接続し直すといった作業をやりました。 (正直、次は接続用の専用ピンを買おうと思います。) そして、こうなりました!!新しいチェーン 最後にチェーンカバーを取り付けようとすると、 サイズが合わない!? とりあえず、干渉しないように取り付けるには取り付けてみたんですが、 大丈夫だろうか?? 最終的にこうなりました。作業完了 作業時間はさっと2時間弱くらいかな? チェーンカバーとチェーンが外れないようにするやつを外そうかな?? とりあえず、調子を見ながら考えようと思います。 まだ、試乗してないんですけど メンテナンススタンド上で回してみても、ギア比の違いが感じ取れます。 こいつはいい走りをしてくれそうだ♪ 最後に最近よくピスト乗りの方を見かけるんですが、 ある意味正統派?なのかもしれませんが、ブレーキつけてないんですよね。。。 あれはやっぱり危ないと思うんですよ。 (僕はチキンなんでブレーキを取り付けてます。緊急時以外はそうそう使わないですが。。。) しかし、あの人たちのおかげでピスト排斥運動でも起こってしまったらどうしよう。。。 と、しょうもない不安がたまによぎります。。。

金曜日, 6月 13, 2008

お薬減りました

今日はあまりにも仕事が暇(ユーザ側の回答待ち)なんで、 思い切って(?)仕事を休んでみた。 そこで、土曜日は人が多くて待ち時間が長い病院へ さすがは金曜ということもあって、人は少ない!! で、今日話した内容は まぁ、たわいもない話でしたが、 結果として
  1. 寝る薬 ⇒ なし
  2. 抗うつ薬 ⇒ 減少
ここにきてついに減ってきたー!! バンザーイ、バンザーイ

木曜日, 6月 12, 2008

ついに来た!!

前回、注文しておいた
  • チェーンリング
  • チェーン
  • チェーンカッター
が届きました!! 仕事も暇なので、明日は仕事を休んで組み換えだ!! とりあえず、組み換えしてレポートしてみようと思います。 しかし、IZUMIのピスト用チェーンを買ったんですが、 購入時にはシルバーで予約していたんですよ。。。 しかし、今日届いたチェーンを見てみると、見間違えようもないくらいゴールドなんです。。。 とりあえず、購入した店(名前は内緒w関西では結構有名らしいけど。。。)に即電話で確認
店のおばちゃん「はい、○○です。」 僕「すいません。そちらで商品を購入したものなんですけど、確認したいことがあるんですがいいですか?」 店のおばちゃん「はい、どうぞ」 僕「納品書も確認したんですけど、IZUMIのチェーンなんやけどね。シルバーで注文してたのに届いたのはゴールドやってんけど。。。確認してもらえます?」 店のおばちゃん「あら、すいません。ちょっと確認してきます。 ねぇ~カ・・」 ~保留中~ 店のおばちゃん「お待たせしました。IZUMIのピスト用チェーンはVチェーンの一種類でその色しか無いですね~」 僕「えぇー、Webのカタログにはシルバーのチェーン載ってたで!!どうなってんのさ!!」 店のおばちゃん「でも、IZUMIのはそれしかないんですよ。すいません。。。」 ここで、責め続けても僕にメリットは無いなと判断して 僕「わかりました。お手数をおかけしました。」
う~ん、ゴールドか。。。 何かめっちゃ目立ちそうな気がする。。。 あ、でもチェーンガード(黒の半透明)があるからそんなに目立たないかw
話は全く変わるが、CTUのFW設定を変えてからなのか、Kernelのversionを上げたのが原因なのか? nfsdが起動してくれないんです。 こんなメッセージが(一部抜粋です)
rpcbind: server localhost not responding, timed out RPC: failed to contact local rpcbind server (errno 5). nfsd: last server has exited nfsd: unexporting all filesystems RPC: failed to contact local rpcbind server (errno 512).
とりあえず、Kernelについては関係ないような気がする。 そう考える理由は
  1. FC8でyum updateでkernelのversionを上げてから動かなくなった。
  2. 思い切ってFC9へyum upgradeをかけてみた。でも動かない。
  3. yum remove nfs* portmapで一回削除してから、再度インストールしてみる。でも動かない。
FC8だろうがFC9だろうが関係ないってところからネットワークがらみなんだろうと考えています。 そもそも、rpcbind: server localhost not responding, timed outって言ってるくらいだから、rpc通信で何かがブロックされてるんじゃないのかなぁ~?? まぁ、おいおい調べていくことにしようと思う。
(2008/6/14追記) 単にSELinuxが原因だったみたいです。。。 何か非常に恥ずかしい。。。 てっきり、ホームサーバはSELinuxをdisabledにしてたつもりだったんだよね。。。 モジュールを作ってもよかったんですが、 「まぁ、そこまでしなくてもいいかw」ということで解決です。

水曜日, 6月 11, 2008

色々ある日だなぁ~

仕事の方はまったく進展が見えないですけどね。。。 「わくわく青色申告2」を購入してみた。 とりあえず、ずっと伝票を入力し続けた。。。 ところで、交通費ってどうやって清算しようかな? ICOCA使ってたらチャージした時に領収書をもらうようにしないと。。。 後は伝票入力の裏でホームサーバのFedora8 x86_64を9に上げてみました。 何のことはなくすんなりアップグレードは完了です。 話は戻るが、伝票はマメに入力しようというお話でした。

火曜日, 6月 10, 2008

CTUのFW設定が。。。

VMServerの絡みでプライベートアドレスのBクラスレベルまでをあれこれ操作しないとうまくいかないってことがわかった。。。 めんどくせー とりあえず、自由に使えるサーバとして考えてDDNSも取ったんだけど。。。 内部ネットワークがうまく機能してくれないと、 何も始められないよ。。。 せっかくTrac0.11でも入れてGenshiだっけ? ClearSilverで散々な目にあってるだけにjQueryを使ってるテンプレートエンジンであるGenshiに期待してるんですけど。。。 あれで日本語用にちょこちょこっとテンプレートのインターフェースを操作しようと考えていたのに。。。 とりあえず、nfsが動いてくれないことにはどうしようもないよね。。。 あえて、nfsを使わずにrsyncで同期を取るというのも一つの手なのかもしれない。。。 もしもの場合にはそっち方向で考えてみるか。。。

月曜日, 6月 09, 2008

10mmの六角レンチを買ってきた

こんばんは、いやぁ~、仕事が・・・まったく進まないがらです。 (進まないのは僕のせいでは無いのであしからず) そんなことはともかく!! チェーンリングを取り換えるのに必要そうなものを 今日、買ってきた。 といっても10mmの六角レンチだけですけどね。。。 ホントは専用の工具があればいいんだけど、 どうしてだか専用ってつくと高いんだよねぇ~

日曜日, 6月 08, 2008

サイトのwidthを思い切って1000pxにしてみる

前々から思っていたことなんですが、3カラムのレイアウトを使っていると どうしても使いにくいというか読みにくなぁ~と思うことがたびたびあった。 そこで! 思い切って横幅を1000pxにしてみました。 analyticsの解像度とかを見てる限り、 まぁ、世間一般的に問題ないだろうと思う。

たまには自転車の話でも

今日はのんびりと過ごしていたんですが、 ふと思い立って自転車屋へ行ってきました。 まあ、目当てのものはなかったんですが。。。 そういうこともあって、ネットで注文しちまった。。。 前々から変えようと思っていたチェーンリングを36tから46tに変えてみようと 注文してみました。 PDCって前に「何それ?」って思ってたんですが、 チェーンリングの固定位置の直径のことを言うんですね。 いやぁ~調べた調べたw いきなり10丁も歯数を上げるとどうなんだろうか?? こればっかりは体で経験するしかないのかもしれない。。。

土曜日, 6月 07, 2008

TracAPIを使ったSubversionコミットメール

昨日のやつをもう少し精査してみました。 trac-post-commit-hook.pyを少しいじって(いじる場所はちょっと前に書いてます。) とりあえず、作ったのは
  • trac.svn.notification.py
  • postcommit_notify_email.cs
の2つです。 .csはClearSilverのテンプレートだそうだ。 ソースはこんな感じ まずはtrac.svn.notification.py
# -*- coding: utf-8 -*-

# Copyright (C) 2003-2006 Edgewall Software
# Copyright (C) 2003-2005 Daniel Lundin 
# Copyright (C) 2005-2006 Emmanuel Blot 
# All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://trac.edgewall.org/wiki/TracLicense.
#
# This software consists of voluntary contributions made by many
# individuals. For the exact contribution history, see the revision
# history and logs, available at http://trac.edgewall.org/log/.
#
# Author:gara
#

from trac import __version__
from trac.config import *
from trac.core import *
from trac.notification import NotifyEmail
from trac.util.datefmt import format_datetime
from trac.util.text import CRLF, wrap
from trac.versioncontrol.api import NoSuchChangeset
from trac.versioncontrol.diff import unified_diff
from trac.mimeview.api import is_binary
import md5

_kindmap = {'dir':u"ディレクトリ", 'file':u"ファイル"}
_actionmap = {'add': u"追加", 'copy': u"コピー",
            'delete': u"削除", 'edit': u"更新",
            'move': u"移動"}

logfile = "postcommit_notification.log"
LOG = True

if LOG:
  f = open (logfile, "w")
  f.write("Begin Log\n")
  f.close()
  def log (s, *params):
      f = open (logfile, "a")
      f.write(s % params)
      f.write("\n")
      f.close()
else:
  def log (s, *params):
      pass

class PostCommitNotificationSystem(Component):

  always_notify_owner = BoolOption('notification', 'always_notify_owner',
                                   'false',
      u"""チケットの担当者に常に通知メールを送信するかを設定します (''0.9 以降'') 。""")

  always_notify_reporter = BoolOption('notification', 'always_notify_reporter',
                                      'false',
      u"""''報告者'' フィールドにあるアドレスに常に通知メールを
      送信するかを設定します。""")

  always_notify_updater = BoolOption('notification', 'always_notify_updater',
                                     'true',
      u"""チケットの属性の変更者に常に通知メールを
      送信するかを設定します。""")


class PostCommitNotifyEmail(NotifyEmail):
  """Subversionのコミット情報をメール送信"""

  template_name = "postcommit_notify_email.cs"
  from_email = 'trac+ticket@localhost'
  COLS = 75

  def __init__(self, env):
      self.env = env
      self.repos = self.env.get_repository()
      self.repos.sync()
      NotifyEmail.__init__(self, env)
      self.prev_cc = []

  def notify(self, rev):
      self.rev = rev
      try:
          chgset = self.repos.get_changeset(rev)
      except NoSuchChangeset:
          return # キャッシュされているチェンジセットの値からはみ出ている
      self.chgset = chgset
      self.message = wrap(self.chgset.message,
                                       self.COLS, initial_indent=' ',
                                       subsequent_indent=' ', linesep=CRLF)
      self.reporter = ''
      self.owner = ''
      subject = self.format_subj()
      link = self.env.abs_href.changeset(self.rev)
      self.link = link
      self.hdf.set_unescaped('email.subject', subject)
      self.hdf.set_unescaped('email.commit.author', self.chgset.author)
      self.hdf.set_unescaped('email.commit.date', format_datetime(self.chgset.date))
      self.hdf.set_unescaped('email.commit.diff', self.unified_diff())
      self.hdf.set_unescaped('email.commit.message', self.message)
      self.hdf.set_unescaped('email.commit.link', self.link)
    
      NotifyEmail.notify(self, self.rev, subject)

  def get_recipients(self, rev):
      notify_reporter = self.config.getbool('notification',
                                            'always_notify_reporter')
      notify_owner = self.config.getbool('notification',
                                         'always_notify_owner')
      notify_updater = self.config.getbool('notification',
                                           'always_notify_updater')

      ccrecipients = self.prev_cc
      torecipients = []

      return (torecipients, ccrecipients)

  def format_subj(self):
      prefix = self.config.get('notification', 'smtp_subject_prefix')
      if prefix == '__default__':
          prefix = '[%s]' % self.config.get('project', 'name')
      if prefix:
          return '%s rev:%s' % (prefix, self.rev)
      else:
          return 'rev:%s' % (self.rev)

  def get_message_id(self, rcpt, modtime=0):
      """Generate a predictable, but sufficiently unique message ID."""
      s = '%s.%08d.%d.%s' % (self.config.get('project', 'url'),
                             int(self.rev), self.chgset.date,
                             rcpt.encode('ascii', 'ignore'))
      dig = md5.new(s).hexdigest()
      host = self.from_email[self.from_email.find('@') + 1:]
      msgid = '<%03d.%s@%s>' % (len(s), dig, host)
      return msgid

  def send(self, torcpts, ccrcpts):
      dest = self.reporter or 'anonymous'
      hdrs = {}
      hdrs['X-svn-changeset-ID'] = str(self.rev)
      msgid = self.get_message_id(dest)
      hdrs['In-Reply-To'] = msgid
      hdrs['References'] = msgid
      NotifyEmail.send(self, torcpts, ccrcpts, hdrs)

  def unified_diff(self):
      txt = CRLF
      try:
          chgset = self.repos.get_changeset(self.rev)
      except NoSuchChangeset:
           return # out of scope changesets are not cached
      for set in chgset.get_changes():
          lst = list(set)
          path = list(set)[0]
          kind = list(set)[1]
          change = list(set)[2]
          base_path = list(set)[3]
          base_rev = list(set)[4]
          if kind != u"file":
              continue
          if change == u"add":
              continue
          elif change == u"delete":
              continue
          elif change == u"move":
              continue
          elif change == u"copy":
              continue
          new_node = self.repos.get_node(path, chgset.rev)
          old_node = self.repos.get_node(base_path, base_rev)
          txt += CRLF
          txt += u"diff: " + path + CRLF
          line = "%s %s %s" % (_actionmap.get(change), _kindmap.get(kind), path)
          txt += wrap(line, self.COLS, linesep=CRLF) + CRLF
          txt += wrap(u"Unified Diff--------------------------------------------------------------", self.COLS, linesep=CRLF) + CRLF
          new_content = new_node.get_content().read()
          old_content = old_node.get_content().read()
          if is_binary(new_content) or is_binary(old_content):
              txt += u"(バイナリファイルが異なっています)" + CRLF
              continue

          txt += wrap(u"--- %s (リビジョン %s)" % (base_path, base_rev), self.COLS, linesep=CRLF) + CRLF
          txt += wrap(u"+++ %s (リビジョン %s)" % (path, chgset.rev), self.COLS, linesep=CRLF) + CRLF
          context = 3
          options = ['-U%d' % -1]
          options.append('-B')
          options.append('-i')
          options.append('-b')
          for option in options:
              if option.startswith('-U'):
                  context = int(option[2:])
                  break
          for line in unified_diff(old_content.splitlines(),
                                new_content.splitlines(), context,
                                    ignore_blank_lines='-B' in options,
                                    ignore_case='-i' in options,
                                    ignore_space_changes='-b' in options):
              txt += wrap(line, self.COLS, linesep=CRLF) + CRLF

      return txt
そんでもってpostcommit_notify_email.cs
更新 (更新者: <?cs var:email.commit.author ?>):
更新日時: <?cs var:email.commit.date ?>

コメント:
<?cs var:email.commit.message ?>
<?cs var:email.commit.diff ?>
--
Commit URL: <<?cs var:email.commit.link ?>>
<?cs var:project.name ?> <<?cs var:project.url ?>>
<?cs var:project.descr ?>
こんなんでも、誰かの参考になれば。。。 いいなw

ありゃ?日付が変わってる。。。

以前、TracでSubversion側からチケット更新を行った場合にメールを飛ばそうとしていたんですが、 細かく整理するとやりたいことは以下のようなことになります。
  1. Trac上でチケットの編集 ⇒こりゃ既存の機能っすね
  2. Subversion上でコミット ⇒これだけで考えれば、そんなに難しくないと思う
  3. Subversion上でコミットしてコミットメッセージ内にチケットを操作するコマンドを埋め込む
この3に関しては、何も考えずに1と2を用意すると チケットの更新メール + Subversionのコミットメール の2通が飛んでくる。。。 内容は同じなのにそりゃ邪魔だろということで、 3のパターンのときにはTracサイドのチケット更新メールにSubversionのコミット情報を埋め込む方向でモジュールを作り始めた。 せっかくなので、2についてもtracパッケージで用意されているパッケージ群を使って送れるとおもしろいかなぁ~と思って、早速作ってみた!
# -*- coding: utf-8 -*-

# Copyright (C) 2003-2006 Edgewall Software
# Copyright (C) 2003-2005 Daniel Lundin 
# Copyright (C) 2005-2006 Emmanuel Blot 
# All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://trac.edgewall.org/wiki/TracLicense.
#
# This software consists of voluntary contributions made by many
# individuals. For the exact contribution history, see the revision
# history and logs, available at http://trac.edgewall.org/log/.
#
# Author:がら
#

from trac import __version__
from trac.config import *
from trac.core import *
from trac.notification import NotifyEmail
from trac.util.datefmt import format_date
from trac.util.text import CRLF, wrap
from trac.versioncontrol.api import NoSuchChangeset
from trac.versioncontrol.diff import unified_diff
import md5



_kindmap = {'dir':u"ディレクトリ", 'file':u"ファイル"}
_actionmap = {'add': u"追加", 'copy': u"コピー",
           'delete': u"削除", 'edit': u"更新",
           'move': u"移動"}

logfile = "postcommit_notification.log"
LOG = True

if LOG:
 f = open (logfile, "w")
 f.write("Begin Log\n")
 f.close()
 def log (s, *params):
     f = open (logfile, "a")
     f.write(s % params)
     f.write("\n")
     f.close()
else:
 def log (s, *params):
     pass

class PostCommitNotificationSystem(Component):

 always_notify_owner = BoolOption('notification', 'always_notify_owner',
                                  'false',
     u"""チケットの担当者に常に通知メールを送信するかを設定します (''0.9 以降'') 。""")

 always_notify_reporter = BoolOption('notification', 'always_notify_reporter',
                                     'false',
     u"""''報告者'' フィールドにあるアドレスに常に通知メールを
     送信するかを設定します。""")

 always_notify_updater = BoolOption('notification', 'always_notify_updater',
                                    'true',
     u"""チケットの属性の変更者に常に通知メールを
     送信するかを設定します。""")


class PostCommitNotifyEmail(NotifyEmail):
 """Subversionのコミット情報をメール送信"""

 template_name = "postcommit_notify_email.cs"
 from_email = 'trac+ticket@localhost'
 COLS = 75

 def __init__(self, env):
     self.env = env
     self.repos = self.env.get_repository()
     self.repos.sync()
     NotifyEmail.__init__(self, env)
     self.prev_cc = []

 def notify(self, rev):
     self.rev = rev
     try:
         chgset = self.repos.get_changeset(rev)
     except NoSuchChangeset:
         return # キャッシュされているチェンジセットの値からはみ出ている
     self.chgset = chgset
     self.message = wrap(self.chgset.message,
                                      self.COLS, initial_indent=' ',
                                      subsequent_indent=' ', linesep=CRLF)
     self.reporter = ''
     self.owner = ''
     self.hdf.set_unescaped('email.commit_body_hdr', self.format_hdr())
     subject = self.format_subj()
     link = self.env.abs_href.changeset(self.rev)
     self.hdf.set_unescaped('email.subject', subject)
     self.hdf.set_unescaped('email.commit.author', self.chgset.author)
     self.hdf.set_unescaped('email.commit.date', format_date(self.chgset.date))
     self.hdf.set_unescaped('email.commit.change_paths', self.change_paths())
     self.hdf.set_unescaped('email.commit.diff', self.unified_diff())
     self.hdf.set_unescaped('email.commit.message', self.message)
  
     self.link = link
     NotifyEmail.notify(self, self.rev, subject)

 def format_hdr(self):
     txt = ""
     for set in self.chgset.get_changes():
         lst = list(set)
         path = list(set)[0]
         kind = list(set)[1]
         change = list(set)[2]
         base_path = list(set)[3]
         base_rev = list(set)[4]
         txt += "[%s]: %s" % (self.rev, wrap(path,
                              self.COLS, linesep=CRLF))
     return txt

 def get_recipients(self, rev):
     notify_reporter = self.config.getbool('notification',
                                           'always_notify_reporter')
     notify_owner = self.config.getbool('notification',
                                        'always_notify_owner')
     notify_updater = self.config.getbool('notification',
                                          'always_notify_updater')

     ccrecipients = self.prev_cc
     torecipients = []

     return (torecipients, ccrecipients)

 def format_subj(self):
     prefix = self.config.get('notification', 'smtp_subject_prefix')
     if prefix == '__default__':
         prefix = '[%s]' % self.config.get('project', 'name')
     if prefix:
         return '%s [%s]' % (prefix, self.rev)
     else:
         return '[%s]' % (self.rev)

 def get_message_id(self, rcpt, modtime=0):
     """Generate a predictable, but sufficiently unique message ID."""
     s = '%s.%08d.%d.%s' % (self.config.get('project', 'url'),
                            int(self.rev), self.chgset.date,
                            rcpt.encode('ascii', 'ignore'))
     dig = md5.new(s).hexdigest()
     host = self.from_email[self.from_email.find('@') + 1:]
     msgid = '<%03d.%s@%s>' % (len(s), dig, host)
     return msgid

 def send(self, torcpts, ccrcpts):
     dest = self.reporter or 'anonymous'
     hdrs = {}
     hdrs['X-svn-changeset-ID'] = str(self.rev)
     hdrs['X-svn-changeset-URL'] = self.link
     msgid = self.get_message_id(dest)
     hdrs['In-Reply-To'] = msgid
     hdrs['References'] = msgid
     NotifyEmail.send(self, torcpts, ccrcpts, hdrs)

 def unified_diff(self):
     txt = ""
     try:
         chgset = self.repos.get_changeset(self.rev)
     except NoSuchChangeset:
          return # out of scope changesets are not cached
     for set in chgset.get_changes():
         lst = list(set)
         path = list(set)[0]
         kind = list(set)[1]
         change = list(set)[2]
         base_path = list(set)[3]
         base_rev = list(set)[4]
         if kind != u"file":
             continue
         if change == u"add":
             continue
         elif change == u"delete":
             continue
         elif change == u"move":
             continue
         elif change == u"copy":
             continue
         new_node = self.repos.get_node(path, chgset.rev)
         old_node = self.repos.get_node(base_path, base_rev)
         new_content = new_node.get_content().read()
         old_content = old_node.get_content().read()
         txt = wrap("", self.COLS, linesep=CRLF)
         txt += u"diff: %s" % wrap(path, self.COLS, linesep=CRLF)
         txt += wrap(u"------------------------", self.COLS, linesep=CRLF)
         txt += wrap(u"--- %s (リビジョン %s)" % (base_path, base_rev), self.COLS, linesep=CRLF)
         txt += wrap(u"+++ %s (リビジョン %s)" % (path, chgset.rev), self.COLS, linesep=CRLF)
         context = 3
         options = ['-U%d' % -1]
         options.append('-B')
         options.append('-i')
         options.append('-b')
         for option in options:
             if option.startswith('-U'):
                 context = int(option[2:])
                 break
         for line in unified_diff(old_content.splitlines(),
                               new_content.splitlines(), context,
                                   ignore_blank_lines='-B' in options,
                                   ignore_case='-i' in options,
                                   ignore_space_changes='-b' in options):
             txt += wrap(line, self.COLS, linesep=CRLF)

     return txt

 def change_paths(self):
     txt = ""
     try:
         chgset = self.repos.get_changeset(self.rev)
     except NoSuchChangeset:
          return # out of scope changesets are not cached
     for set in chgset.get_changes():
         lst = list(set)
         path = list(set)[0]
         kind = list(set)[1]
         change = list(set)[2]
         base_path = list(set)[3]
         base_rev = list(set)[4]
         line = "%s %s %s" % (_actionmap.get(change), _kindmap.get(kind), path)
         txt += wrap(line, self.COLS, linesep=CRLF)
      
     return txt
うーん、正直まだ未完成。。。 叩き台ができたってところかな? 基本的にTracの設定に準拠して動かそうと思っているのでこんな感じかな?と思っています。 しかし、Pythonってなかなかデバックしにくい。。。 そう思うのは僕だけかな?

木曜日, 6月 05, 2008

とりあえず、SELinuxをオフにしなくてもTracが動くようになりました

やっとできた。。。 初めから真面目に $ man audit2allow で調べとけばよかった。。。 manで見た中で例があげらっれており、以下のような文面だった。
EXAMPLE
      NOTE: These examples are for systems using the audit package. If you do
      not use the audit package, the AVC messages will be in /var/log/messages.
      Please substitute /var/log/messages for /var/log/audit/audit.log in the
      examples.

      Using audit2allow to generate monolithic (non-module) policy
     $ cd /etc/selinux/$SELINUXTYPE/src/policy
     $ cat /var/log/audit/audit.log | audit2allow >> domains/misc/local.te
     $ cat domains/misc/local.te
     allow cupsd_config_t unconfined_t:fifo_file { getattr ioctl };
     
     $ make load

     Using audit2allow to generate module policy

     $ cat /var/log/audit/audit.log | audit2allow -m local > local.te
     $ cat local.te
     module local 1.0;

     require {
             role system_r;

             class fifo_file {  getattr ioctl };

             type cupsd_config_t;
             type unconfined_t;
      };

     allow cupsd_config_t unconfined_t:fifo_file { getattr ioctl };
     

     Building module policy manually

     # Compile the module
     $ checkmodule -M -m -o local.mod local.te
     # Create the package
     $ semodule_package -o local.pp -m local.mod
     # Load the module into the kernel
     $ semodule -i local.pp

     Using audit2allow to generate and build module policy
     $ cat /var/log/audit/audit.log | audit2allow -M local
     Generating type enforcment file: local.te
     Compiling policy: checkmodule -M -m -o local.mod local.te
     Building package: semodule_package -o local.pp -m local.mod

     ******************** IMPORTANT ***********************

     In order to load this newly created policy package into the kernel,
     you are required to execute

     semodule -i local.pp
そこで、最終的にこんな具合にやってみた。
$ mkdir /etc/selinux/targeted/src $ mkdir /etc/selinux/targeted/src/policy $ cd /etc/selinux/targeted/src/policy $ audit2allow -d -m local > local.te $ checkmodule -M -m -o local.mod local.te $ semodule_package -o local.pp -m local.mod $ semodule -i local.pp
こんな感じでPermmision系のエラーが出る度に さっきのコマンドをくりかえし、 $ semodule -R で再読み込みをさせていく形で とりあえず、Tracが動くように。。。 こんなやり方でええのかなぁ~

水曜日, 6月 04, 2008

まだまだSELinux

引き続きお勉強中です。 そもそも、sourceパッケージがなくなって そのためのコマンドが色々用意されていることにやっと気付きました。。。 もう少し、semoduleとかのコマンドをしっかり見直そうと思う。

火曜日, 6月 03, 2008

[FC9]SELinuって難しい

最近、SELinuxの設定方法をあれこれやっていたんですが、 まず、世間様がいうところのsourceパッケージがねぇ~!! ってところからスタートしました。。。 まあ、ソースはyumdownloaderを使って拾ってきたSELinux自体のソースを展開という形で 何とかなることはなったんですが、 どうやら、Referenceパッケージなるtar.gzがあったんで、それを展開してみると ネットで調べてたMakeファイルが見つかり、build.confをごにゃごにゃいじると なんとかsrcディレクトリを作成することに成功しました。 さあ、これでSELinuxを使ったまま、Trac-Postgresの連携ができれば・・・ audit2allowで調べた内容をどのモジュールに反映すればいいのやら。。。 もう少し彷徨ってみます。。。

月曜日, 6月 02, 2008

過去の亡霊

いやはや、昔お世話になったところで、 働いているんですが、 もう、何年か経つのに未だに僕が何も分からずにただただ一生懸命に(あの時は何にあんなけ一生懸命になれたんだろ??)作ったantのスクリプトが使われていたり。。。 「ちょっと、フォローしてあげて」と言われ見てみたら、 関連するsourceの@authorには僕の名前が。。。 「あ!これ僕が作ったやつだ。。。」 「ホントに実在する人だったんですか!?」 って、あんた。。。 そりゃ、自分の作ったもんに覚悟でも見せなきゃダメでしょ! そんなこともあって感慨深い思いをしていたら、 別のシステムで 「がらさ~ん、へるぷ~」 「なんやなんや??」 「ここの動きなんですけど。。。」 なんだか言いにくそうだなぁ~ 「うーん、Assertでとまちゃってるね」 トレースログを読みながら内心(HogehogeTag・・・?何か見たような覚えが。。。) と冷や汗をかきつつ、 「何か作ったような気もするし、僕も手伝うからちょっと調べてみようか?」 数分後 「これは!バグ!?」 「う~ん、バグにしてはそう動くようにしっかりロジックが書かれているように思えるんだが。。。 でも、確かに既存バグっぽいね」 しかし、(DBのデータが正しくないと動かないのは当然なんじゃ。。。)と思いつつ いくつか対応方法を挙げておいた。 (冷たいようだがこのシステムの作業を請け負ってきてるんじゃないんで、後は自分たちで何とかしてください!) 「まあ、影響範囲を調べるのが先だね。たぶん明日はヒマだからわかんないことがあったら聞いておくれ」 なんて恩着せがましく言って逃げてきた。。。(といっても隣の席なんだよね。。。) 内心では「ごめんよ~ごめんよ~作っといて何でたしたのかCVSのコメントにも碌に書かなかった僕が悪かった~」としっかり思っています。 しかし、まさか1日で3システム分(実際作業しているシステム+フォロー2システム)を見るとさすがに 使っているパッケージの違いがあれこれありすぎて頭がパニックに。。。

日曜日, 6月 01, 2008

selinuxとTrac

Apacheで動かしているんですが、 selinuxのラベル設定が思いのほかうまくいかず。困っていたんです。。。 しかし、こんなに簡単に済むとは思ってもいませんでした。
chcon -R --reference=/var/www/html /var/trac/
これで、いいんだろうか。。。?

failed to read qemu headerのときのメモ

かなり久々。。。 忘れないようにここに書きこんでおく。 ちょっとした手違いで libvirtでイメージを起動しようとすると failed to read qemu header なんておっしゃられて起動しない。。。 vmwareserverを使って...