Safari + JXA その 2

この間 の続きです。

いや、書いていてですね、ちょっとかったるかったんですよ、doJavaScript。

理由はいくつかあって、要するに文字列にしないといけないので、syntax highlighting が使えないとか。
それ以前の問題として、JavaScript って here document ってないですよね、多分。
複数行にまたがるような長いものは書きづらいと。

なもんで、ゴリゴリやってもいいんだけど、あまりに汚らしいので、ちょっとは綺麗に書こうかしらと。

今回の参考記事。

Marionette = function() {
    this.app = Application('Safari');
    this.world = this.app.windows[0].tabs[0];
};

Marionette.prototype.doJavaScript = function(script) {
    return this.app.doJavaScript('(' + script.toString() + ')()', {in: this.world});
}

Marionette.prototype.say = function(message) {
    var app = Application.currentApplication();
    app.includeStandardAdditions = true;
    app.say(message);
}

m = new Marionette();

result = m.doJavaScript(function(){
    return confirm("Hello, world!");
});

/* NG
var hello = "Hello, world!"
result = m.doJavaScript(function(){
    return confirm(hello);
});
*/

m.say((result ? 'OK' : 'Cancel') + ' returned');

というわけで、半分くらいうまくいったようですが、変数の受け渡しは、当然に NG でした。

これは、JSON.stringify() を使えばなんとかなるんじゃないかと思います。

(function (argv) {
    argv = JSON.parse(argv);
    console.log(argv);
    return 0;
})(JSON.stringify(['foo', 'bar', 'baz']));

say についても、Application.currentApplication() に対して呼べばうまく行きました。
ただ、日本語を喋れません。

Terminal の say コマンドだと -v で Kyoko を指定すればいいんですが、まあ、別に無理して日本語を喋らせる必要はないので、英語のままでいい気もしています。

そういえば、JXA で doShellScript すればいいという話かもしれません。

豪雨

今日は松山はかなりの雨でした。

写真は小田川ですが、余戸のあたりでは、用水路が溢れる寸前、もう 1cm も余裕が無いような状態で、道路も水浸しでした。

というわけで、薪作業はもちろんですが、前回の土砂崩れの復旧もままなりません。

空梅雨だと、それはそれで、夏場の渇水の問題があるのですが、最近の雨の振り方は極端なのですが、地球温暖化なのか、それとももともとの気候変動なのか、ただうちは山の裾野なので、警戒が必要です。

一応水路の掃除、点検は一昨日と昨日との晴れ間をぬってやっておいたので、良かったです。

山に大量の原木があり、伐採した木の片付けの依頼もあるので、少しづつ片付けていきたいと思います。

ちなみに小田には、お店屋さんのログの打ち合わせに行きました。
ハンドカットでやりたかったんですが、正直、全く時間が取れません。
このままだといつまでたっても完成しなさそうなので、マシンカットで検討しています。
予算内に収まればいいんですが。

昨日書いたとおりですが、FISKARS IsoCore ハンマー斧 ですが、本日予約の方には発送を完了いたしました。
あいにくの天気が続きますが、晴れたら、今まで割れなかった難物を気持よく割っていただければと思います。

FISKARS IsoCore 薪割りハンマー斧、入荷しました

ここのところ、雑貨屋 Hearth & Home 暖炉家 の一番人気の商品となっている FISKARS IsoCore 薪割りハンマー斧 が無事に入荷し、倉庫で検品作業が完了しました。

たいへんおまたせいたしましたが、ご予約いただいている方には、出荷を開始します。(明日、6/29 の発送となります)

今回は、20 本以上入荷しましたし、次の貨物も来月初旬に入荷するので、以降、在庫切れでご迷惑をお掛けすることがなくなればと思っています。

また、航空便により輸入したため価格を改定させていただいていた、FISKARS X25 薪割り斧 ですが、今回、船便で入荷したため、9,400 円(税込・送料別) → 8,800 円(税込・送料別)と、従来の価格に値下げいたしました。

これからも、輸入の経費を極力抑え、北米の価格に少しでも近づけられるように努力をしていきたいと思います。

それと、嬉しくないお知らせです。

STORES.jp より、モール運営にかかる経費の値上げの連絡がありました。

アイテムの管理コストが 1 点あたり、25 円/月(税別)チャージされるようになるため、細かな雑貨、たとえば、ストーブポリッシュであるとか、そういうアイテムの価格を改定せざるを得ません。

季節商品のため、売れ残ると 1 年間寝かせることとなるため、そういう場合、25 円 x 12 ヶ月 = 300 円経費がかかります。
これは極端な例ですが、在庫してから売れるまでに長いものですと、1 年以上かかるものもありますので、今後 5,000 円以下の商品ついては、倉庫経費に応じて、数百円の価格改定を行わせていただきます。

また、A4 サイズ以内、厚みが 3cm までの商品については、倉庫からではなく、お店から直送する形を取ろうと思いますが、この場合、送料の計算が煩雑になるので、わかりやすく買いやすい、送料込みの金額に整理していきたいと思います。

2016-06-24 21.20.37というのも、この間、猫砂をヨドバシカメラでお取り寄せしたのですが、たった 500 円の商品が、綺麗なダンボールに丁寧に梱包され、翌々日に届いた上に 10% 還元なんですね。

とても買いやすくて便利と思う反面、通販のお店をやっている立場からすると、恐怖を感じます。

だって、うちでやったら、送料のほうが商品よりも高いので、売れば売るほど、大赤字になりますが、ヨドバシカメラは、それで経営が成り立っているのです。

ニッチな市場だから、専門店のような北米の数倍の値段での高付加価値なビジネスモデルが良いとも思えませんが、本当に努力をしていかないと、いつ潰されてもおかしくないなと思う今日このごろです。

Safari + JXA

STORES やなんかもそうなんですが、意外とかゆいところに手が届きません。

Yahoo! Auctions なども、API で出品できるようにするといっていたのですが、問い合わせたら、できなくなりました、ということなので、ブラウザの側をスクリプトで制御して、決まった動作を(半)自動化しているのですが、今までは AppleScript で行っていたので、AppleScript と JavaScript、更に shell とのちゃんぽんだったわけです。

別に動いているものを特に書き換えるつもりもないのですが、最近覚えるよりも忘れるほうが早いので、なるべく単一の言語でやりたい、というのがありまして、重い腰を上げて JXA なるものを初めてみました。

というわけで、かなりの人にどうでもいいネタだと思いますが、備忘録として。

Imperia Online という村ゲーをしているのですが、これの特定の村を表示するスクリプトを書いてみました。
いや、ブックマークが 20 件までしか登録できないので、不便なので。

function run(argv) {
    se = Application('System Events');
    if (se.uiElementsEnabled()) {
        app = Application('Safari');
        app.includeStandardAdditions = true;
        
        //app.activate();
        //delay(1); // waiting for competition of ativatation
        
        // search Imperia Online Document
        world = null;
        for (i = 0; ! world && i < app.windows().length; ++i) {
            for (j = 0; j < app.windows[i].tabs().length; ++j) {
                console.log(app.windows[i].tabs[j]);
                if (app.windows[i].tabs[j].url().match(/imperiaonline/)) {
                    world = app.windows[i].tabs[j];
                    break;
                }
            }
        }
        
        if (!world) {
            return;
        }
        
        try {
            app.doJavaScript("xajax_switchVillageToGlobalMap('global-map-window', {x: 1701, y: -614})", {in:world});
        }
        catch (e) {
            console.log(e);
        }
    }
    else {
        with (Application('System Preferences')) {
            pane = panes.byId('com.apple.preference.security');
            pane.anchors['Privacy_Accessibility'].reveal();
            activate();
        }
    }
}

参考にしたのは、この辺り。

動作的には、Safari のすべてのウインドウを取得して、ウインドウの中にぶら下がっているすべてのタブを巡回し、URL をマッチして目的のタブを調べる、という部分、あとは、そこで取得したタブに対して、JavaScript を実行する、という部分で成り立っています。

例えば、Yahoo! Auctions で発送作業をしようと思った時など、発送情報が開かれているタブと、クリックポストの発送入力画面が開かれているタブと、その両方を取得して、それぞれで doJavaScript をすれば、通常できないクロスサイト・スクリプティングが簡単に可能になり、スクリプトメニューにそういうよく使うスクリプトは登録しておくこともでき、また、所詮はスクリプトですから、サイト側のデザイン変更などにも容易、かつ、迅速に対応ができるわけです。

ところで、今のところのハマっている部分。

いちいちエラー画面を出すのがイヤなので、通常は、say を使って喋らせているんですが、うまくいかないんですよね。
多分、Accessibility の権限設定が間違えているんだと思うんだけど。

こちらで参考にしたのは、openspc。
一体何年お世話になりっぱなしなんだろう。

少しだけ離乳食を食べてくれています

体重ですが、みな 600g くらいになり、本当ではとうに離乳食を食べてくれててもいいところだとは思うんですが、哺乳瓶をチュウチュウする姿が可愛いので、ついついミルクを上げ続けていたんですが、ようやく離乳食も、多少は食べてくれるようになりました。

ただ、ちゃんと食べないので、結局はミルク併用です。

離乳食にも好き嫌いはあるかと思うのですが、キリがないというのがあるのと、4 匹もいるので高いものや取り寄せないといけないものはちょっと難しいので、あるものをなんとか食べてもらいたいと思います。

中にはいきなりカリカリを食べられる子もいるとかいないとかで、そうなってくれると楽でいいんですけどね。

とりあえず、現状、無駄に鳴かないので、とても育てやすいです。

時間が取れないので、ゆっくり遊んであげることができにくいのですが、極力、ふれあう時間を長く取りたいと思います。

薪ヤードの見回り

崖が崩れていると連絡があったので、薪ヤードの見回りに行きました。

道路が何箇所か崩れていましたが、溜池が完全にあふれていて、道路が川になっている状態で、ちょっと晴れてくれないと、復旧も難しい状態でした。

ヤード自体は不具合はないんですが、草が随分と伸びてきていること、そして、重機用のハウスが梅雨入りまでに組み立てられなかったので野ざらしなのが気になります。

まあ、ハウスの組立作業も晴れてくれないとどうしようもないので、当面は何もできそうにありません。

その間にボチボチ、牽引免許をとっておきたいと思います。