読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

EC-CUBEで21世紀のお店屋さんごっこ~おきゃくさんをたくさんとうろくするよ~

おはようございます。先日、通っている園の卒園式がありました。早いもので、来年は長男が卒園します。kjunichiです。

背景

前回準備したdockerで作ったEC-CUBEの店舗にお客さんを登録しないと、いつまで待ってもお客さんが来ません。

abrakatabura.hatenablog.com

きみのおみせにたくさんおきゃくさんがきてかいものをしてもらうじゅんびをするよ。

こんぴゅーたーにおきゃくさんをとうろくしてもらおう!

今回はnightmareを使って、EC-CUBEのサイトに実際にアクセスして、入力して仮登録のメールを受信して、 本登録する作業を自動化してみるよ。

Nightmareの使い方

nightmareはv2.0からElectronを使うようになったWebサイト向けののテストツール。 昨今のJavaScriptなページでも頑張ると自動ブラウズできる模様。

超基本的なnightmareの使い方は以下。

const Nightmare = require('nightmare');       
const nightmare = Nightmare({ 
        show: true,
        switches : {'ignore-certificate-errors': null}
});

nightmare
  .goto('https://localhost:8443/')
  .evaluate(() => {
      return document.body.innerHTML;
  })
  .end()
  .then((result) => {
      console.log(result);
  })
  .catch((error) => {
      console.error('Search failed:', error);
  });

かいいんとうろくする

コンピュータに自動的にやってもらう手順

  • お店の入口のページを表示
  • 会員登録のリンクをクリック
  • お客さんの情報を入力する
  • 確認ボタンをクリックする
  • 確認画面の確認ボタンをクリックする

やってみて困ったところ

nightmareがおそい

ぺーじがひょうじされるのをまつひつようがあり、ひとつだけうごかすとじかんがかかる。

とちゅうでうごかなくなる。

どうじにいつつくらいnightmareをうごかして、じかんあたりのしょりけんすうをおおくした。 これにはNode.jsのclusterをつかうことで、かんたんにつくることができた。

たいさく

docker-compose psのけっかをちぇっくして、こんてながおちてるときはさいきどうするようにした。

成果物

git clone https://github.com/kjunichi/eccube-autodrive.git
cd eccube-autodrive
npm install
node registermember.js

学んだこと

  • node.jsのClusterモジュールの使い方
  • docker-composeでの死活監視
  • 大量にアクセスすると、hhvm,mailcatcherのコンテナが動かなくなる

EC-CUBEをh2oと連携させてdocker for macで動かしてosxfsが大変遅いことを体感した件

おはようございます。なかなか次男のおむつが外れません。それどころか、ここ最近、よく漏らします。kjunichiです。

背景

前々から、EC-CUBEを動かしたいとは思っていた。

最近Windows向けの記事が多かったけど、今回はMacでやってます。

こどもたちとのあそびをなんとか自分の趣味ともからめて何かできないかと、無い頭ひねって考えてみた。

21世紀でお店を開けば、当然オンラインでの店舗も必要ですよね、むしろ、実店舗をかまえない方が 21世紀は主流ではなかろうかと。

そこで、EC-CUBEをうごかし、21世紀のお店屋さんごっこをするという遊びをするべく、早速準備に入った。

DockerでEC-CUBEをうごかす

Qiitaの記事

を参考にやってみることに。

動かしたが、メチャおそい

docker-syncなるものを使うとファイルアクセスが早くなる旨が参考にした記事には書かれていたが、こどもたちとあそぶ程度なので、

docker-compose up -d

としてやっていた。

表示が遅い

Mac mini late2014なのも大きいが、いくらなんでも遅すぎるといったファーストインプレッション。

これでは、こどもたちにブーブー文句言われておみせやさんごっこができない。

h2oの力を借りてサクサクにする予定だった

まぁ、ちょっと遅すぎと思いつつも、Apachephpモジュールだからなのが大きいのだろうと考え、 h2oでFastCGIにすれば、劇的に高速化され、子供たちも文句を言わなくなるだろうと思い、やってみた。

この状態で、さすがに計測くらいはするかとtimeコマンドかまして、curlでトップページにアクセスしたら4秒もかかっている!!

改善策

一瞬真面目に、特権命令を有効にしてコンテナ上げなおして、straceするかと思ったが、 ふとdocker for macのファイル共有が遅いとのフレーズを思い出し、 コンテナ内にec-cube以下のディレクトリをコピーして、やり直した。

劇的に改善

HTTP/2でアクセスできるようになった事以外にも、fastcgiになったので 0.2秒程度になった。

 

成果物

せっかくなので、hhvmでやってみた。

学んだこと

  • ○○は遅いというのは、ほんとにくそ遅いということもある

  • docker for macでローカルの複数のファイルをコンテナで利用するのは、避けるべき

  • ec-cubeの設定が少しわかるようになった

apacheとの比較のため、/var/www/html/配下にec-cube,ec-cube2を同居させ、切り替えながら試している 際に、ec-cubeの初期設定もすこしわかるようになった。

設定ファイルを編集しないとクッキー周りでうまく行かないことがあった。(これは、もとにしたコンテナが、 ROOT_URLPATHを指定していた為であった)

  • h2oでPHPを使うのはホントに簡単だった

  • EC-CUBE 3の途中から、Windows環境でもeccube_install.phpにより導入が可能になったこと知った。

参考資料

WindowsだけでAmazon DashボタンのMACアドレスを取得できるjsを書いた

こんばんは。先日、保育園から習い事の教室に向かう際、以前、習い事の教室のトイレが故障しており、難儀したことがあり、かなり強く長男に、保育園で事前にトイレに行っておけと言ったのをすっかり忘れてましたが、長男はちゃんとそれを実践しており、感心したkjunichiです。

背景

LinuxMacだと、npmモジュールのnode-dash-buttonに付属のfindbuttonで Amazon DashボタンのMACアドレスが簡単に取得できる。

しかし、Windowsだと、このモジュールがWindowsに対応していないようで、 ビルドエラーとなり使えません。

代わりに当ブログでも何度か紹介しているwin-node-dash-button がつけるのですが、MACアドレスの検出のプログラムは付属していない。

MacLinuxが使えない環境だとこのMACアドレスを取得するところでつまずいて残念なことになる。

tanbonomannaka.hatenablog.com

なんて記事をたまたま見つけたから、ちょっと記事にしてみた。

つくった

パケットキャプチャー関連の知識がなかったので、勉強になった。 Cだとこの手のプログラムは面倒な印象を持っているが、Node.jsだと思った通り、わかりやすかった。 結局、win-node-dash-buttonのコードを少し手を入れるだけでよかった。

"use strict";

const Cap = require('cap').Cap,
    decoders = require('cap').decoders,
    _ = require("lodash"),

    Server =  function() {
        const self = this,
            savedMacAddr={},
            lastUpdate ="",
            cap = new Cap(),
            buffer = new Buffer(65536);

        this.packetReceived = (nbytes, trunc) => {
            const ret = decoders.Ethernet(buffer);
            if (ret.info.type === 2054) { // arp
                if(! savedMacAddr[ret.info.srcmac]) {
                    console.log(ret.info.srcmac);
                    savedMacAddr[ret.info.srcmac] = true;
                }
            }
        };

        this.start = (ip) => {
            const device = Cap.findDevice(ip),
                linkType = cap.open(device, "", 10 * 1024 * 1024, buffer);

            try {
                cap.setMinBytes(0);
            } 
            catch (e) {
                console.log(e);
            }

            cap.on("packet", self.packetReceived);

            process.on("SIGINT", self.stop);
        };

        this.stop = () => {
            console.log("Shutting down");
            cap.removeListener("packet", self.packetReceived);
            cap.close();
        };
    };

const srv = new Server();
srv.start('192.168.0.2'); // 192.168.0.2は動かすホストのIPアドレス

CapというnpmモジュールがUnix系だとlibpcapを使い、Windowsだとwinpcapを同梱しており、これを組み込むことで、 マルチプラットフォームでパケットキャプチャーを実現している。

自分のPCのIPアドレスもわからない場合

以下のような感じで、できたが、どんな環境でも動かくは不明。 osというNode.js標準モジュールで実装している。

const os = require('os');
nifs = os.networkInterfaces();
for(let nif in nifs) {
    if(nif.startsWith("Virtual")|| nif.startsWith("Loopback")) {
        continue;
    }
    //console.log(nif);
    for(let ad in nifs[nif]) {
        if(nifs[nif][ad].family == 'IPv4') {
            //console.log(nifs[nif][ad]);
            console.log(nifs[nif][ad].address);
        }        
    }
}

まとめ

Windows環境だとnode-dash-buttonではなく、win-node-dash-buttonを使う。 MACアドレスの取得は、win-node-dash-button付属のコードをちょっと変更するか、 この記事の検出用のコードを利用する。