ちょっと前からGoogleDocsで数式が書けるようになりましたが、 これがGoogle Chart APIを使って実装されているようです。 しかもTeX記法。

以下のようなHTMLで、

   1  <img src="http://chart.apis.google.com/chart?cht=tx&amp;chs=1x0&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=f(x)%3D%5Cint_0%5E%7Bx%7Dg(t)%5C%2Cdt" />

こんな数式を埋め込む事ができます。

ちなみに下は拙作のFormulaによる数式。

See Also

posted by Png genki on Tue 29 Sep 2009 at 14:27

iPhoneのアプリを作っていると、様々なframeworkを使う場面に出くわします。その際に、色々なインストールの仕方があるようなので、メモしておきます。

via http://code.google.com/p/json-framework/wiki/InstallationInstructions#Option_1:_Copy_the_JSON_source_files_into_your_project

その前にメモ

  • 方法によってステップ3でJSON.hのimport方法が違います。
  • 方法3で、"Copy Files"フェーズができるのですが、DestinationがFrameworks、Products Directoryでどれがいいかよくわかってないです。Buildは通ってもエミュレータで動かないときとかあります。

方法1:ソースをプロジェクトにまるごとコピーする

  1. ソースが含まれているフォルダを追加したいプロジェクトのClassesグループにドロップ
  2. 'Copy items into destination group's folder' オプションをチェック
  3. コード内で #import "JSON.h"などと書いて使う

方法2:iPhoneカスタムSDKを使う

なんかあんまりないかなと思って割愛w

方法3:埋め込みフレームワークを使う

  1. ~/Library/Frameworksディレクトリを作成
  2. JSON.frameworkファイルを上で用意したディレクトリにコピーする
  3. "Add existing file"メニューを選んで、~/Library/Frameworks/JSON.frameworkファイルをアプリケーションに追加する
  4. ターゲットを選択、右クリックして"Add - New Build Phase - New Copy Files Build Phase"メニューを選択
  5. コード内で #import <JSON/JSON.h>などと書いて使う
posted by Png satoko on Mon 28 Sep 2009 at 07:05

BSON

最近流行のMongoDBの内部で使われているデータ形式。

posted by Png genki on Sun 27 Sep 2009 at 18:11

S-IDE では操作対象の要素を xpath で指定することができる。

例:xpathの明示
コマンド対象
clickxpath=//h2/a

対象要素を特定するこの機能は Element Locator と呼ばれ、 Selenium Core で提供されている。

   1  BrowserBot.prototype.findElement = function(locator, win) {
   2      var element = this.findElementOrNull(locator, win);
   3      if (element == null) throw new SeleniumError("Element " + locator + " not found");
   4      return element;
   5  }
(selenium-core-1.0.1/core/scripts/selenium-browserbot.js)

従って、S-IDE の対象指定以外での場所、 例えば自作関数内や getEval の中などで使いたい場合には、 上記の findElement を直接呼び出すとよい。

HP2703/2842
MP1413/1413

   1  function isHpFull(percent) {
   2    var path = '//tr[0]/td[1]';
   3    var hp   = selenium.browserbot.findElement(path).split('/');
   4    var hp1  = parseInt(hp[0]);
   5    var hp2  = parseInt(hp[1]);
   6    return ((hp1 * 100 / hp2) > percent);
   7  }

例:HPが90%以上ある場合は宿屋に入らない
コマンド対象
gotoIfisHpFull(90)skip_inn
clicklabel=宿屋
labelskip_inn

関連として、Selenium 環境ではない状態の Mozilla で xpath を扱うには、 document.evaluate が便利である。

   1  function xpath2text(path) {
   2    var result = document.evaluate(path, doc, null, 7, null);
   3    var item = result.snapshotItem(0);
   4    return item.innerHTML;
   5  }

参考

  • https://developer.mozilla.org/ja/Introduction_to_using_XPath_in_JavaScript
posted by Png maiha on Fri 25 Sep 2009 at 21:50

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


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