[追記] 最後の方、ちょっと不明瞭だったので修正しました。


amend使ったこと無かったのでメモ。

前提

   1  # edit comment.rb    
   2  # edit product.rb  
   3  git commit -am "wrong commit"
(上記のファイルを修正、product.rbを間違ってコミット)

そして、下記の順で変更・修正します:

間違ってコミットしたファイルをコミットから外す

   1  git reset HEAD~1 app/models/product.rb
(変更は維持されたまま、コミットから外されます:unstageという)
(こうすると、# Changed but not updated:のところに出てくる)

コミットメッセージの修正

   1  git commit --amend
(メッセージを修正できる) (+上でcommitから外したファイルを確定する)

amend時にコミットメッセージを再利用する

via http://www.jukie.net/~bart/blog/git-amend

@onoさんにこの記事を教えて頂いたのですが、筆者の方はコミットメッセージを再利用するgit ammendコマンドを作っておくという技を使っておられるようです:

   1  git config --global alias.amend 'commit --amend -C HEAD'
   2  
   3  #今後(メッセージはそのままで)コミットを修正したい時は下記でOK:
   4  git amend

さらに流れ的には、

  1. コミットしてから、
  2. さらにファイルを編集、
  3. それをgit addでファイルを追加、
  4. git commit --amendで3で追加したのを直前のコミットに加える

というワークフローを使って運用。超こまめにコミットして作業したいときに便利そうです!

posted by Png satoko on Fri 25 Sep 2009 at 01:40 with 2 comments

前回のアップデート申請がリジェクトされてしまったので、問題を解決して再度申請いたしました。 すでにご購入いただいた方々には申し訳ありませんが、もう少しだけお待たせする事になってしまいそうです。

今回のアップデート内容は以下のようになっております。

  • データを3倍に増強(当社比)
  • 平米単価/坪単価の表示切り替え
  • iPod touch対応
  • Twitter連携機能
  • UIの改良

最新のデータに更新したため、最近の景気動向を反映して全体的に地価が下落しています。

それでは、今後ともよろしくお願いいたします。

See Also

posted by Png genki on Thu 24 Sep 2009 at 00:14

ちょっと前になりますが、Snow LeopardでTerminalCopyOnSelectが動かないというレポートを頂いておりました。 まだSnow Leopardへの移行ができていなくて放置状態だったのですが、 Nyahoさんがgithubでpull requestを送ってくれたのでmergeしてみました。

TerminalCopyOnSelect.bundle.zip

手元の環境では動作検証できていないのでSnow Leopardで動くかどうかは未確認ですが、環境をお持ちの方はお試しあれ。

See Also

posted by Png genki on Wed 23 Sep 2009 at 10:17 with 1 comment

S-IDE でループや条件分岐といったフローコントロールを行うためのメモ

下策:TRをコピペ

[ユースケース] 無限でなくていいから適度にいますぐ

例:好きなだけコピペ
コマンド対象
open/users/new
typenamemaiha
typepassxxxxx
open/users/new
...

1,000オペレーションは全然大丈夫だったけど、 10,000ぐらい書いたら色々重くなったので注意

中策:flowControl extension を使う

[ユースケース] ループだけでなく条件分岐もできる

インストール

Andrey が作った flowControl は Selenium 用であるが、 それを Darren が S-IDE に移植した(goto_sel_ide.js) ので Selenium Core 拡張として読み込ませる。

  • http://51elliot.blogspot.com/2008/02/selenium-ide-goto.html

例:華麗に goto
コマンド対象
labelcreate_user
open/users/new
typenamemaiha
typepassxxxxx
gotocreate_user

上策:while で攻める

[ユースケース] goto はリアルで無限なので while で回数指定する

例:while で500ループ指定
コマンド対象
store0i
whilestoredVars.i++ < 500
open/users/new
typenamemaiha
typepassxxxxx
endWhile

flowControlのその他の命令及び詳細な使い方は

  • http://wiki.openqa.org/display/SEL/flowControl
posted by Png maiha on Mon 21 Sep 2009 at 17:40

自作関数をIDE上で利用するには、 定義した js ファイルを[オプション]→[設定]にある「Selenium Core 拡張スクリプト」で指定する。

user.js

   1  function eachTag(name, attr, value, func) {
   2    var win = selenium.page().getCurrentWindow();
   3    var tags = win.document.getElementsByTagName(name);
   4    for (var i=0; i<tags.length; i++) {
   5      if (tags[i].getAttribute(attr) == value) { func(tags[i]); }
   6    }
   7  }
   8  
   9  function reportErrors() {
  10    eachTag('div', 'class', 'fieldWithErrors' , function(e) {LOG.warn(e.innerHTML);});
  11  }

例:エラー内容のデバッグ表示
コマンド対象
open/users/new
typenamemaiha
clickAndWaitcreate
getEvalreportErrors()

例:ランダムな文字列とか
コマンド対象
open/users/new
typenamemaiha
typepassjavascript{randomWord(8)}

(※ "function randomWord(size)" が user.js に定義済として)

posted by Png maiha on Sun 20 Sep 2009 at 18:44

自然言語の場合はよくわからないけれど、 プログラミング言語に関しては、まず書きたいプログラムが特定の言語に依存せずにプログラムそのものとして脳内にあって、それをプログラミング言語に翻訳しながらソースコードに置き換えていっているように感じる。

多分、フローやデータ構造については、言語の力を借りずに思考できるのかもしれない。

posted by Png genki on Sat 19 Sep 2009 at 17:52

私の場合はCucumberのfeatureをもちろん英語で書いた方が楽なんだけど、日本で生活している以上、日本語で書いた方がいい場合もある。そのため、簡単な日英対訳表をCucumber v0.3.101時点のlanguages.ymlからまとめました。

フィーチャの定義

英語 (原文)日本語 (推奨)日本語 (alt)
Featureフィーチャ機能
Background背景-
Scenarioシナリオ-
Scenario Outlineシナリオアウトラインシナリオテンプレート
テンプレ
シナリオテンプレ

シナリオの定義 (Given-When-Then)

英語 (原文)日本語 (推奨)日本語 (alt)
Featureフィーチャ機能
Given前提-
Whenもし-
Thenならば-
Andかつ-
Butしかし但し
Examplesサンプル

参考リンク

posted by Face lchin on Fri 18 Sep 2009 at 14:02

ちょっと多忙につきblogでのアウトプットが低下してますが、 地価2009 バージョン1.1のアップデート申請を完了しました。

特に問題がなければ、1週間から2週間程度でお手元に届くと思います。

よろしくお願いいたします。

posted by Png genki on Thu 17 Sep 2009 at 14:14

waitForCondition を使う

waitForCondition(script, timeout)
Arguments:

    * script - the JavaScript snippet to run
    * timeout - a timeout in milliseconds, after which this command will return with an error

停止条件は activeRequestCount で判定する。

例:PrototypeでAjaxリクエストを待つ
コマンド対象
clickfoo_button
waitForConditionselenium.browserbot.getCurrentWindow().Ajax.activeRequestCount == 05000

例:jQueryでAjaxリクエストを待つ
コマンド対象
clickfoo_button
waitForConditionselenium.browserbot.getCurrentWindow().jQuery.active == 05000

参考

  • http://d.hatena.ne.jp/cinquanta/20090501/1241675577
  • http://codelevy.com/2007/11/05/selenium-and-ajax-requests
posted by Png maiha on Thu 17 Sep 2009 at 10:41

Heroku経由でSinatraを使ってみているのですが、ModelとしてSequelを使ってみることにしました。

Userクラスを作る

DBをオンメモリにしておいて、テーブル作成・クラスの宣言

   1  % irb
   2  require 'rubygems'
   3  require 'sequel'
   4  
   5  DB = Sequel.sqlite
   6  DB << "CREATE TABLE users (id INTEGER PRIMARY KEY, name VARCHAR(255) not NULL)"           
   7   
   8  class  User < Sequel::Model
   9  end

これから、User.なんとかでデータの作成などできます。

   1  User.create(:name => 'satoko')
   2  
   3  User.find(:name => 'satoko')
   4  User.find(:id => 1).update(:name => 'satoko')
   5  User.find(:id => 1).delete
   6  User.first
   7  
   8  User.all
   9  => [#<User @values={:name=>"satoko", :id=>1}>]
  10  
  11  DB[:users].filter(:name => 'satoko').sql
  12  => "SELECT * FROM `users` WHERE (`name` = 'satoko')"

findは1件操作なので、複数件の場合はfilterで行う

   1  User.filter("id > ?", 0).limit(10).each {|u| p[:name]}
   2  => #<Sequel::SQLite::Dataset: "SELECT * FROM `users` WHERE (id > 0)">

また、@orepuriさんに教えてもらったのですが、all、first、eachなどがあって初めてSQLが発行されるそうで、なかなか面白いです

References

Sequel概要(2年前の資料なので、コード的には古いかもしれません)
http://www.slideshare.net/zhesto/ruby-off-rails-japanese

チートシート
http://sequel.rubyforge.org/rdoc/files/doc/cheat_sheet_rdoc.html
http://cheat.errtheblog.com/s/sequel/

Classリファレンス:ModelやDatasetなど
http://sequel.rubyforge.org/documentation.html

posted by Png satoko on Wed 16 Sep 2009 at 21:29