d.sunnyone.org
sunnyone.org

ページ

2012-06-20

Gitで失敗コミット+修正コミットをひとつのコミットにする(git rebase -i)

gitを使っていて、間違ってコミットしたファイルを修正したコミットを、後からくっつける(正しく作ってコミットしたときと同じにする)方法。

概要としては、git rebase -iを使い、特定のコミットに戻した後、interactiveにコミットを操作する。

以下、手順。
1) 状態確認
git logで、状態を確認する。
$ git log --oneline
68af727 Write CCC                →でも他のコミットをしてしまった
719560b Write BBB (Retry)        →間違いに気づいてまたコミットした
92746af Write BBB                →ここでコミットしちゃったんだけど
585c5d6 Write AAA
84041cf Created initial files.

「Write BBB」で誤って、「Write BBB (Retry)」で修正をして、コミットしたのを、「Write BBB」に統合する。(Retry)の時点でうっかりamendを忘れた感じ。

2) rebase -iで「Write AAA」の時点に戻す
git rebase -iをすると、指定したコミットから後の処理をeditorで指定してリプレイできる。

$ git rebase -i 585c5d6

エディタが開くので、(Retry)の「pick」の部分を「f」に変更する。

pick 585c5d6 Write AAA
pick 92746af Write BBB
pickf 719560b Write BBB (Retry)  ←修正
pick 68af727 Write CCC

# Rebase 84041cf..68af727 onto 84041cf
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message ←fはfixup
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
「f」でなく、「s」にすると、コミットログを修正できる。

保存してエディタを終了すると、修正される。
[detached HEAD a7fb63f] Write BBB
 1 files changed, 1 insertions(+), 1 deletions(-)
Successfully rebased and updated detached HEAD.

3) 確認
くっついている。
$ git log --oneline
d519a6c Write CCC
a7fb63f Write BBB
585c5d6 Write AAA
84041cf Created initial files.

git本当に難しい...






ScanWebにスマートフォンUIとプレビュー機能を追加


前に「SheevaPlugを使ってScanSnap fi-5110EOXをネットワーク対応スキャナにする」という話で、簡単なWebUI (scanweb)を作ったが、以下の点が不便だったので、改良を加えた。思想はそのまま、作りはごっそり変更という形。

  •  スマートフォンからボタンが操作しにくい
    →jQuery Mobileを利用したスマートフォンインタフェースを実装
  • 結果がわからないので、裏表が間違っていたりしてもわからない
    →プレビュー機能を実装
launchpadのjunkに置いてあったが、launchpadのprojectを作るほどでもないので、githubに置いた。必要であれば、zipで落とすなりgit cloneするなりお願いします。
https://github.com/sunnyone/scanweb

操作イメージは、以下のような形。
スキャンを押してしばらくすると...↓
 プレビューとログが出力される。

生のWEBrickはしんどくなってきたので、Sinatraを使った。プレビューはどうしているかというと、pdfを作るときに、サムネイルの入ったzipファイルを作るようにして、Webから呼び出されたら中身のファイルを抽出して表示するようにしている。

jQuery Mobileは使いやすくて、↑の画面には装飾されたボタンなんかがあるけど、CSSやJSは全然書いてない。マークアップのルールにしたがっただけ。こういう適当なアプリでは、見た目は何も考えなくてよくなってすばらしい。

問題は、SheevaPlugが遅くて、スキャン後の後処理にかなりの時間がかかること。これは想定外だった...

2012-06-12

PowerShellをMSBuildから呼び出す

MSBuildは、MSの世界のAntのようなもの。そのMSBuildから、PowerShellのスクリプトブロックを呼び出す方法。

きれいな方法を目指すのであれば、PowerShell MSBuild Taskというものがあり、そのTaskを呼び出してPowerShellを実行すればよいのであるが、入っているdllが32bitであった。

32bit版MSBuildから呼べばいい話なのだと思うが、他のツールとの関連が面倒なので、本エントリでは安直にpowershellコマンドを呼ぶ方法を紹介する。

単純に書けば簡単で、Execタスクを利用して、powershell -Command "& { }" を呼び出せばよい(この表記については、PowerShell.exe コンソールのヘルプを参照。)

ただし、生で記述するとごちゃごちゃするので、MSBuildのPropertyGroupの中に、コマンドの始まりと終わりの文字列をPSBegin, PSEndなどとして定義し、ExecのCommand属性で$(PSBegin) $(PSEnd)などのように使うことで、ちょっときれいに書ける。
 
 例は以下のとおり。


上述のように、Invoke-Commandを使ってのリモートの呼び出しを塊にしておけば、リモート呼び出しもさっくり書ける。(リモートからPowerShellを呼ぶ環境を作るのが難しいのはまた別の話。)

参考:http://blog.brianhartsock.com/2009/10/20/using-powershell-scripts-from-msbuild-scheduled-tasks-etc/


まったく余談だが、勝手な要素をどんどん作っていくのがキモチワルイ...


2012-06-11

Javaっぽいスクリプト言語BeanShell クイックスタート

前のエントリとは打って変わって、今度はJava世界のお話。

BeanShellは、JavaVM上で動くスクリプト言語。Javaっぽい文法で、Javaのライブラリを利用することができる。簡単な説明はこちら:http://news.mynavi.jp/column/jsr/031/index.html

どうしてこれを使いたかったかというと、JMeterからBeanShellのスクリプトを実行することができるため、前処理等で好きな処理を実行することができる(らしい)ためである。
(ctxやvarsなど、JMeterからBeanShell側に渡ってくる変数から、JMeterのデータを操作することができる。らしい。これはまだ試してない。)

基本

マニュアルのQuick Startにある通り、bshのjarにクラスパスを通し、"bsh.Console"か"bsh.Interpreter"のクラスを動作させることで、実行することができる。
http://www.beanshell.org/manual/quickstart.html#Quick_Start

C:\temp> java -cp c:\opt\bsh\bsh-2.0b2.jar bsh.Interpreter
BeanShell 2.0b2 - by Pat Niemeyer (pat@pat.net)
bsh % System.out.println("Hello, World");
Hello, World
bsh %

bsh.Interpreterは、ふつうのインタプリタで、/bin/bashみたいなものだと思えばOK.
bsh.Consoleは、GUIつきのコンソールを出してくれる。そのため、Windowsでは、以下のようなバッチファイルを準備しておくと便利。



ファイルを実行

ファイルに書いたスクリプトを実行するには、bsh.Interpreterにファイル名を渡せばよい。ファイル名のあとにさらに引数を書くと、プログラム側のbsh.argsから取得できる。

c:\temp\sample.bsh




C:\temp> java -cp c:\opt\bsh\bsh-2.0b2.jar bsh.Interpreter c:\temp\sample.bsh FIRST-ARGUMENT
args[0]: FIRST-ARGUMENT

編集環境を作る

Eclipse上で動くEclipseShellを試してみたが、なにやらいまいちだったので、安直にサクラエディタを使うことにした。サクラエディタの設定 > タイプ別設定一覧からJavaを選択し、設定変更で「ファイル拡張子」にbshを加えれば、色づけはそれっぽく使える。

ツール>外部コマンド実行(Ctrl+F5)で実行できると便利なので、以下のようなバッチファイルを作成して実行できるようにする(~%4とかは適当。$@的に書く方法もあると思うが調べていない。)



あとは「外部コマンド実行」ダイアログから以下のように指定すればOK
C:\opt\bsh\bsh-interpreter.bat $F FIRST-ARGUMENT

ここまでわかれば、あとはJVMの世界なので、適当に使えると思う。

PowerShellとWPFでシンプルGUIプログラミング

ずっとWindowsでお手軽にGUIを作る方法を探していたが、ついに見つけてしまったかもしれない。

欲しかったのは、こんな感じのことができるもの:
  • なるべく追加ソフトウェアをインストールせずに使えるもの
  • 複雑なレイアウトは別にできなくてもよい
  • UIはなるべくシンプルに書ける
  • プロジェクトなどを必要とせず、1ファイルのスクリプトで表現できる
どのようにするかというと、PowerShellスクリプト上にXAMLをインラインで記述し、WPFのUIを作ればよい。

以下、ボタンを押すとWebサービスを呼び出して、テキストボックスに東京の天気を表示する例である。


PowerShellの仕組み上、.NETでできることはできるだろうとわかっていたので、Windows Formsを使えばいけそうな気はしていたが、コードがごちゃごちゃしそうでやめていた。
しかしWPFという発想はなかった。

なお、「なるべく追加ソフトウェアをインストールせずに使えるもの」という条件を外せば、ShowUIというモジュールがあり、よりPowerShell的に記述できる(らしい)。しかし使う人みんな入れないといけないので、ちょっと微妙だと思っている。

また、蛇足であるが、PowerGUIというエディタが便利。一度走らせると、ダイナミックな言語にも関わらず、ちゃんとVisual Studio的な補完が可能である。

参考:
http://stackoverflow.com/questions/5829787/powershell-wpf-from-xml-findname-problem
http://thepowershellguy.com/blogs/posh/archive/2009/05/15/powershell-v2-get-weather-function-using-a-web-service.aspx
http://www.dougfinke.com/blog/index.php/2011/07/24/extending-powershell-to-the-gui-with-showui/