Windowsのvagrantのインストーラが一緒にインストールしたruby等を使うvagrant plugin 'vagrant_cmd'

を作りました。

vagrant plugin install vagrant_cmd

でインストールして

vagrant cmd

とすると

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

[VAGRANT]C:\vagrant>

のようなプロンプトが出ます。ここでrubyとか打つとvagrant がインストールしたrubyが実行されますし、gemも実行出来ます。さらにls, gccなどのMinGWコマンドも使えます。
exit するともとの環境に戻ります。あ、当然Windwos環境でのみ動作します。ほかの環境では必要ないだろ。

なぜこんな物が必要かというとwindowsrubyをインストールして vagrant インストールしてchef-soloインストールして、とかするとどのgemで何をインストールしたか分からなくなりそうだからです。まあ vagrant のインストールしたいろんな環境を壊すかも知れない・ちゃんとしたrubyが入ってるかどうか分からないので、まだテスト段階……

vagrant で openssh の代わりにputtyを起動したい

前回までのお話:vagrant sshssh が起動させられるけど別にputtyとか開いてたらなんか魅力半減なのでMinGWssh入れた

けどターミナルがcmdだと非常に面倒。

4/22追記 下記より、 vagrant-multi-putty 使った方がいいよ!

で、sshコマンドを乗っ取ってminttyからsshを開くようにしたい。 C:\vagrant\vagrant\embedded\bin に ssh.cmd というファイル名でバッチファイル作ればいいことが分かった。

@mintty ssh %*

という内容のssh.cmd を C:\vagrant\vagrant\embedded\bin に置くと、minttyからsshが開くけどなんか日本語の扱いがおかしい。そこで下のように書き換えてputtyを利用するようにした。


なんか貼り付けられない……こちらから→ https://gist.github.com/nazoking/5352687

puttyとopenssh は起動オプションが違う。rubyで次の変換を行っている。

    • ポート指定 -p XXX → -P XXX
    • キー指定 -i XXXX → -i XXX だけどopenssh のファイルはそのままでputtyで開けない
      • 開くファイルをputtygen で読み込んでputty用の秘密鍵に変換してやる必要がある。(上のワンライナーではそこまで面倒を見ていなくてファイル名の最後に ppk を付け足してるだけなので C:\Users\自分\.vagrant.d\insecure_private_key を読み込んで同じ位置にputty用の秘密鍵を .ppk を付けて保存する
    • sshオプション -o → puttyだとどうなるか分からないので無視する

かなりはまりどころが多い windows に Vagrant 1.1 で sandbox ( sahara )

  • 最新(今日なら 1.1.5 )をダウンロード http://downloads.vagrantup.com/
  • ユーザー環境変数設定 HOME = C:\Users\nazoking 的な自分用のを設定
    • これを設定しておかないと c:\.vagrant.d とか作られてはまる><
  • コマンドラインから
    • vagrant plugin install sahara
    • gcc がないエラーが出る場合はconfig.ymlの修正がうまくいってないと思われる。
    • vagrant plugin list で sahara が入っていることを確認
  • vargrant で出てくるコマンド一覧で sandbox が無いことを確認(ある場合は以下の手順は不要じゃないかな)
    • 0.0.13 は vagrant1.1で動かない><
    • C:\Users\nazoking\.vagrant.d\gems\gems\sahara-0.0.13 が出来ていることを確認
      • 出来てない場合は 環境変数 HOME の設定が出来ていないと思われる。
    • 中身を https://github.com/ryuzee/sahara からダウンロードしたzipに入れ替える
    • vagrant を実行すると sandbox コマンドが使えることを確認する

あと個人的にはMingw + ssh 入れて vagrant ssh 出来るようにしておかないと魅力半減。vargrant がmsys入れてるんだからそれに足して欲しい……

gccがないエラーを同じ問題に困ってる人が検索出来るように貼り付け

C:\vagrant\>vagrant plugin install sahara Installing the 'sahara' plugin. This can take a few minutes...
C:/vagrant/vagrant/embedded/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:556:i
n `rescue in block in build_extensions': ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError)

        C:/vagrant/vagrant/embedded/bin/ruby.exe extconf.rb
creating Makefile
 generating generator-i386-mingw32.def
 compiling generator.c
 make: gcc: Command not found
 make: *** [generator.o] Error 127

Gem files will remain installed in C:/Users/skita/.vagrant.d/gems/gems/json-1.7.7 for inspection.
Results logged to C:/Users/skita/.vagrant.d/gems/gems/json-1.7.7/ext/json/ext/generator/gem_make.out
        from C:/vagrant/vagrant/embedded/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:534:in `block in build_extensions'
        from C:/vagrant/vagrant/embedded/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:509:in `each'
        from C:/vagrant/vagrant/embedded/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:509:in `build_extensions'

Play! framework 2.0 から 2.1 に移行したときの苦労話

を見ながらやったけどそれだけじゃうまく動いてない。

  • パッケージ名がいくつか変わった
    • play.api.PlayException.UsefulException => play.api.UsefulException
  • null を返していたプロパティーなどがOptionを返す用になった
    • UsefulException.cause など
    • cookie.maxAge など
  • Html.+ が非推奨になって Html.+= に
  • json の扱いが変わった
    • jacksonの新しいやつ使ってたけど変更が大変そうだったので使わないようにした
    • Json.toJson が使えなくなった
  • multipartFormDataパーサがファイル未送信時もテンポラリファイルを作って返すようになった
    • なんで・・・
    • MultipartFormData[TemporaryFile].get()
    • ファイルサイズなどを見て未送信かどうかを判断しないといけなくなった
  • testの設定にフレームワーク縛りが入った
  • eclipse から インテグレーションテストすると javascript の読み込みが失敗する
    • テスト中に classpath に target/scala-2.10/classes を無理矢理追加するようにした
  • DB.withTransaction がその中でreturnしているとコミットもロールバックもしてくれなくなった
  • seleniumjquery 1.7.1 をうまく実行出来ない
    • 1.8.1に変えたらうまく動いてる
  • scala が 2.10 になった(追記:以下勘違いかも コメント欄参照)
    • for( i <- aaa) などでaaaがfilterだけ実装していれば仕えたけれどforeach等を実装しないと使えなくなった。
    • then というメソッド名が警告が出るようになった
    • 可変数引数の扱いが変わってるっぽい。暗黙の型変換がうまくいってない→明示的に変換するようにした
  • テストが落ちる socket closedとかいって落ちる(3/29追記)


あと Enumerator.fromCallback が警告が出て Enumerator.generateM をつかえといってくるけどよくわからない・・・(;´Д`) Enumerator.outputStream が使いやすそう。

svnのプロジェクトをgithubにコピーし続ける

svnで公開されているオープンソースプロジェクトをgithubで追跡し続けたい。
変更したい場合gitの方が便利なので。なんかそういうサービス・プログラム既にありそうだけど見つからなかったです……(あったらそっち使うので誰か教えて……)
今回は flashからxmpp/jabberが使える xiff というプロジェクトをやってみる。

svn から git にclone

mkdir xiffsync # 作業用
git svn clone -s http://svn.igniterealtime.org/svn/repos/xiff
cd xiff/

標準的な構成だったので -s そのまま使えた。

このままだとtagがブランチになっているので、それぞれのブランチにタグを打つ

for i in `git branch -r|grep tags|sed 's/  tags\///g'`; do git tag $i tags/$i ; done

適当だけどこんな感じでまあ動いたので。

github に push。github上ではリポジトリが出来ている前提

git remote add origin git@github.com:nazoking/xiff.git

定期化

リポジトリにpush出来るだけの公開鍵を作る

cd .. # xiffsync に戻る
ssh-keygen -f github_deploy_key
cat github_deploy_key.pub

これをリポジトリの設定のDeploy keysに登録する。

git でこの鍵を使うためのsshラッパー xiffsync/git_ssh.sh

#!/bin/bash
BASEDIR=$(dirname $( readlink -f $(which $0) ))

ssh -i $BASEDIR/github_deploy_key "$@"

cron に登録するためのバッチ xiffsync/github_sync.sh

#!/bin/bash -x
BASEDIR=$(dirname $( readlink -f $(which $0) ))

cd $BASEDIR/xiff
git svn rebase
GIT_SSH=$BASEDIR/git_ssh.sh git push origin master

この xiffsync/github_sync.sh を定期的に動かせば大丈夫なはず……?

TODO:(誰か教えて)

  • git svn rebase して変化がなかったらgit pushしたくない
  • ブランチのコピー……
  • タグのコピーも自働化して……
  • github のプロジェクトをフォークした後にcloneし続ける手順も誰か……

Redmineのチケットのステータスは「〜待ち」にすべき

チケットは「それをすることによって何が起こるか?それがされていないために何ができないか?」が大事だ。何をするか?はチケットのタイトルに書かれる。「何ができていないか?」がわかるようにした方がいい。

Redmineのデフォルトのステータスは次の物だけれど

新規
新たに登録されたもの。作業は未着手。
進行中
担当者が作業に着手。
解決
担当者の作業が終了。テスト/レビュー待ち。
フィードバック
差し戻し。作業が完了したものについてテストやレビューを行った結果、修正や追加の作業が必要となったもの。
終了
作業終了。
却下
作業を行わずに終了。採用されなかった新機能の提案、バグとして報告されたが修正する必要のないもの(報告者の誤認など)

チケットのステータスの意味 | Redmine.JP

大抵「新規→終了」という流れになる。なぜなら「終了」以外に変更する意味があまり見いだせないからだ。また状況とステータスが合致しているのかどうかわかりにくい。チケットは復活したもの以外は常に新規のチケットであるし、終了するまでは常に進行中である。解決はテストが終了するまでは解決していないので利用されない。このようにするとすっきりする。

  • 作業担当割り当て待ち
  • 作業完了待ち
  • レビュー待ち
  • デプロイ前テスト待ち
  • デプロイ待ち
  • デプロイ前差し戻し対応待ち (デプロイ前テストで発見されたバグなど)
  • デプロイ後テスト待ち
  • デプロイ後修正完了待ち (デプロイ後テストで発見されたバグなど)
  • 終了

ステージングと本番があるなら「ステージングデプロイ待ち」「本番デプロイ待ち」のように分けた方がいいだろう。

さらに「何が出来ていないか?」に対して「出来ていない」のか「出来ない」のかがわかるように「タスクのブロック」を使えるといいんだけどあんまりUIがいけてないしブロックされていても一覧で確認出来ないので……

play2.0のフォームテンプレートヘルパーの表示項目を細かく制御する

play2.0 の scala template のフォームテンプレートヘルパーは便利なんだけど飾りが多すぎてちょっとルールから抜けようとすると結構大変
とりあえずこんなのを用意しておけば

fieldOnly.scala.html

@(elements: views.html.helper.FieldElements)
@elements.input

使い方

   views.html.helper.checkbox(form("delete"))(fieldOnly,implicitly[Lang])

出力

<input type="checkbox" id="delete" name="delete" value="true"  >

他にFieldElementを生成するだけのコードとかも用意しておいた方が便利そう

import play.api.templates.Html
import views.html.helper.FieldElements
import views.html.helper.FieldConstructor
import play.api.data.Field

  /** id属性を計算する */
  def getId(field: Field, args: Seq[(Symbol, Any)]): String = args.toMap.get('id).map(_.toString).getOrElse(field.id)
  /** フィールドのみを表示する FieldConstructor */
  object fieldOnly extends FieldConstructor {
    def apply(elements: FieldElements): Html = elements.input
  }
  /** FIeld から FieldElement型にする */
  def fieldElemet(field: Field, args: (Symbol, Any)*)(implicit lang: play.api.i18n.Lang): FieldElements =
    FieldElements(getId(field, args), field, Html.empty, args.filter(arg => !arg._1.name.startsWith("_") && arg._1 != 'id).toMap, lang)
  /** フィールドに対するラベルの表示 */