Hello, GreaseMonkey script

知っている人は知っていると思いますけど、ブラウザ三国志、というゲームをやっております。mixi の。

で、困ったことがあって、それはなにかというと「建設中の建物がどれか分かりづらい」という問題なんですが、文句をいっても仕方がないので、GreaseMonkey script を書くことにしました。

結論から言うと、これがハマりにハマりました。まあ、フリが長いと怒られるので、さっさと成果から。

[cc_JavaScript]
// ==UserScript==
// @name pikachu_3594
// @namespace http://shigematsu.org/
// @include http://*.3gokushi.jp/village.php*
// @description browser sangokushi utilities
// ==/UserScript==

function disp() {
var xpath = ‘//*[@id=\”actionLog\”]/ul/li/span[@class=\”buildStatus\” and starts-with(text(),\”建設\”)]/a’;
var snaps = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

for (var i = 0; i < snaps.snapshotLength; ++i) { snaps.snapshotItem(i).href.match(/x=(\d+)&y=(\d+)/); var x = parseInt(RegExp.$1); var y = parseInt(RegExp.$2); var c = 'mapicon' + (101 + x * 7 + y).toString().substr(-2); var e = document.getElementsByClassName(c)[0]; var o = (new Date() % 1000) / 1000.0; e.style.opacity = Math.round(o); } window.setTimeout(function() { disp(); }, 500); } disp(); [/cc] ロジックは見ての通りですが、最初は、jQuery で書いたんです。[cci_JavaScript]j$('#actionLog>ul>li>.buildStatus:contains(建設)’)[/cci] みたいな感じで。

Firefox でのデバッグの仕方が分からなくて、すべて Safari でテストして問題なく動いていたんですが、GraseMonkey script にすると動かなくなる。

そしたら、どうも jQuery って、GreaseMonkey の中の世界では、標準では使えない見たいで、素直に [cci_JavaScript]document.evaluate()[/cci] で書きました。

デバッガは、FireBug という Extension を入れたんですが、Safari に比べて慣れの問題もあるんでしょうが、圧倒的に使いづらく感じて、かなり苦痛です。

後どうでもいいことですけど、数値を文字列に変換する時に頭に 0 を足す処理。

結構多くの人が、(‘0’+num.toString()).substr(-2) みたいに実装すると思うんですけど、かくいう自分もそうでした。

で、目からウロコだったのは、まあ、有名人ですけど、OpenSpace の古籏さんに教えていただいた小技ですけど、2 桁必要なら、100 足して、常に 3 桁になるよう数値の段階で処理してしまうわけです。

たし算は、文字列の連結よりも遥かに低コストですから。

今までは、[cci_c]snprintf()[/cci] とかが使える世界にいましたので、久しぶりに 20 年とか前の BASIC 時代の記憶がよみがえりました。

にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしへ
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしに参加しています。 励みになりますので、足あとがわりに、ランクアップにご協力下さい。

2 thoughts on “Hello, GreaseMonkey script

  1. jQuery ですが、元々のページでは読み込んであるので、少々乱暴ですが、[cci_JavaScript]j$ = unsafeWindow.jQuery[/cci] とすれば、使えるようになりました。

    あと、[cci_JavaScript]parseInt(foo)[/cci] ってイチイチかかなくても、[cci_JavaScript]+foo[/cci] でいいみたいですね。

  2. Pingback: 奇行百出 Lv2

Leave a Reply