2008年 01月 05日

svn2cl memo

svn2cl.sh --break-before-msg=2 --group-by-day  --include-rev --separate-daylogs 

が、コミットメッセージに入れているファイル名とかがうざいので

Index: svn2cl.xsl
===================================================================
--- svn2cl.xsl	(リビジョン 979)
+++ svn2cl.xsl	(作業コピー)
@@ -200,9 +200,18 @@
      </xsl:call-template>
     </xsl:when>
    </xsl:choose>
-   <xsl:call-template name="trim-newln">
-    <xsl:with-param name="txt" select="msg" />
-   </xsl:call-template>
+   <xsl:choose>
+    <xsl:when test="contains(msg, ':')">
+     <xsl:call-template name="trim-newln">
+      <xsl:with-param name="txt" select="substring-after(msg, ':')" />
+     </xsl:call-template>
+    </xsl:when>
+    <xsl:otherwise>
+     <xsl:call-template name="trim-newln">
+      <xsl:with-param name="txt" select="msg" />
+     </xsl:call-template>
+    </xsl:otherwise>
+   </xsl:choose>
   </xsl:variable>
   <!-- add newline here if separate-daylogs is in effect -->
   <xsl:if test="$groupbyday='yes' and $separate-daylogs='yes'"><xsl:text>&newl;</xsl:text></xsl:if>

結局 svn2cl.{sh,xsl} は、dotfiles と一緒にレポジトリにいれて管理するようにしました。

Ruby で ShipIt のようなことをやる gem shipit

昨日のアイデアのまま gem にしてみました。(自動化したくなったのでとりあえず gem として使えるようにしたかった)

名前に悩んで (rake-shipit) とか、むしろオリジナルの ShipIt から離れているから名前違うほうがいいのかとか (やってることはおなじはずだけど) 考えたのだけど、名前変えるのがいろいろ面倒になった。

.shipit とか使わずに Rake のタスクにしたのは、普通 Rake でリリースタスクを書いて rake release とかでリリースしていると思うので、そのへんを変えたくなかったのと、DSL みたいなのですむならそれにこしたことないなぁと思ったからです。

今のところかなりオレオレ専用な部分が多いので (cutagem つかえばいいとおもうよ!)、使いながらなおしたい。

Rake::ShipitTask.new do |s|
	s.Step.new {
		system("svn", "up")
	}.and {}
	s.Ask
	s.Task :rubyforge
	s.Step.new {
		raise "svn2cl.sh is not found" unless system("svn2cl.sh", "--version")
	}.and {
		system("svn2cl.sh --break-before-msg=2 --group-by-day  --include-rev --separate-daylogs")
	}
	s.ChangeVersion __FILE__, "VERS"
	s.Commit
	s.Task :clean, :package
	s.RubyForge
	s.Tag
	s.Twitter
end

ちゃっちゃと gem にするだけしとこう、とか思って作業をはじめたのだけど、結局いろいろデバッグしたりする必要があった……

gem spec に指定する version をうまく更新できなくて、実はまったくうまくいってないみたいだ (たまたま最初の二回うまくいっただけ……)
ChangeVersion と Rakefile がかなり相性悪い…… (内部でやってるから)

さらに GemPackageTask が spec をたんにわたすわけじゃなくて version を (コピーとして) わたすからどうにもできない……
ChangeVersion が走ったら rakefile よみなおす、みたいなことしないとだめだ……

Rake タスクを実行するとき rake コマンドを叩きなおすようにした (いままでは invoke で内部実行してた)。
ひどすぎるバグだったのでリリースした (リリースするのたのしくなるけど、一日何回もリリースするのってアレですよね……)

2008年 01月 04日

Rakefile で shipit ぽいの

require "shipit"

Rake::ShipitTask.new do |s|
	s.Ask
	s.Step.new {
		puts "prepare phase"
	}.and {
		puts "run phase"
	}
	s.Twitter "Notice to twitter"
end

Rake::ShipitTask.new do |s|
	s.Ask
	s.Task :test
	s.ChangeVersion
	s.Commit
	s.Task :clean, :package
	s.RubyForge
	s.Step.new {

	}.and {
	}
	s.Twitter
end

みたいに書けるやつは書いてみた ( http://coderepos.org/share/browser/lang/ruby/misc/shipit.rb )。gem にするか悩む

Rakefile つかう場合、基本的にはタスクをつくって、依存関係まとめて、だけでも問題ないんだけど、それだと途中で例外が発生したときに哀しいことになりやすいので、準備のフェーズと実行のフェーズ (外部への副作用がある処理) を分離するようにしてみた (もちろん完全に例外が発生しないようにはできない)。例えば twitter や rubyforge のアカウント設定が正しいか、とかを準備の段階でチェックしておけば、バージョン変更してコミットするまえにわかるので、別の環境で「アカウント設定しわすれてたー」「あーこっちもー」みたいなのはなくなる。


s. かくのがめんどいけど (instance_eval つかっても先頭が大文字なので定数あつかいになる)、 Rakefile は普通コピペでつくるので (cutagem とか new なんとかとか)、多少冗長でもいいし、リリースの順序なんて一回かいたらそんなに更新しないので、ちょっとめんどうくさい、ぐらいならいいかなぁ。

もっと簡単に

namespace :shipit do
	task :twitter do
	end

	task :twitter_prepare do
	end
end

みたいにして、命名規則で依存関係を自動でつくる、みたいなののほうがいいかなぁ……

あーだめだ。これだと引数をわたしにくい……

コピペビリティ重要 (処理がまとまっている)

2008年 01月 03日

Gyazo みたいにスクリーンショットを即 fotolife にアップロードするやつ

http://subtech.g.hatena.ne.jp/antipop/20071121/1195652375 を Ruby + Pit + atomutil とかで書いてみました。

最初は Perl のままアカウント情報のところだけ pit つかうようにしようと思ったのだけど、Pit もづーるがほしくなったりして、つくるなら Perl かかないととかいろいろ考えてたら Ruby で書いてしまっていた。

Shibuya.jpg

おつかれさまでした巫女さんが可愛いくて本当によかったですね。


50 mm f/2.2 0.003 sec (1/400) ISO200


50 mm f/2.8 0.003 sec (1/400) ISO200


50 mm f/3.2 0.001 sec (1/1600) ISO200


50 mm f/2.8 0.006 sec (1/160) ISO200


50 mm f/7.1 0.02 sec (1/50) ISO320


女の子みたいな現像 (謎) をしなかったやつ

今日の写美は作者の人が作品の説明をしていたのがおもしろかった (何がおもしろいのかわからない写真だったから、すこし世界観がひろがった気分)。

self portrait

Me

キモ☆ヲタ

2008年 01月 02日

RSpec

atomutil のテスト書くときに (一行たしただけだけど)、はじめてさわったけど、思ったよりよさそうだ (食わず嫌いだった)

とりあえず assert_equal って補完使っても入力するのめんどくさいんだよね……

gerry++

おなかいたいわけじゃないけどなぜか gerry...

アカウント情報を管理するコマンド pit

というのを適当にでっちあげてみました (まだ gem source に反映されてないかも)。こまごまとした自動化スクリプトで、毎回 ~/domain.yaml とかにパスワード書いたりして分離するのがめんどうくさいので、そのへんをうまいことやってくれる gem です。

require "rubygems"
require "pit"

config = Pit.get("vox.com", :require => {
	"username" => "your email in Vox",
	"password" => "your password in Vox",
	"nickname" => "your subdomain in Vox"
})

みたいに書いておくと、設定されてない場合は $EDITOR で設定ファイルを開いて保存し、設定情報が config に入ります。

コマンドラインからもセットすることができて

$ pit set vox.com

とかやると、設定名が vox.com である設定を $EDITOR でひらきます。

でもって、設定のセット (プロファイル) をいくつかつくることができて、デフォルトだと default というプロファイルに保存されます。

$ pit switch devel

とかでプロファイルの切り替えができます。(プロファイル名に何も指定しないと default にもどります)


Ruby 以外でも一応つかえるように

pit get foobar

を実行すると $stdout に YAML をはきます (ただし tty のときはパスワードふくむときこわいので出力しません pit get foo | lv とかやるとみれる)


保存された設定は ~/.pit に特に暗号化されずに保存されます。

twitter4r

require "time"
require "rubygems"
gem "twitter4r"
require "twitter"
require "pit"

Twitter::Client.new(Pit.get("twitter.com", :require => {
	"login"    => "login name",
	"password" => "password"
})).status(:post, "Test posting from twitter4r with pit.")