パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください -4ページ目

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

こんにちは!パーク社員のゆんぼうです。

Webアプリ開発のクロスブラウザ対応したときに注意したいことを紹介します。

今回は、Javascriptの「onStorage」イベントについてです。

動作確認した環境

OS: Windows 10 Pro

ブラウザ名 バージョン
Google Chrome 62.0.3202.94
Mozilla Firefox 57.0
Microsoft Edge 41.16299.15.0
Microsoft Internet Explorer (IE11) 11.64.16229.0

onstorageとは

Web Storageの1つである「LocalStorage」に変化が起こった場合にイベントが発生します。

https://developer.mozilla.org/ja/docs/Web/API/WindowEventHandlers/onstorage

 

以下のデモページをブラウザのタブを2つにしてそれぞれ表示してみてください。

 

【デモはこちら】

【ソースファイルはこちら】

 

LocalStorageのsetItem、getItem、removeItem, clear の動作が確認できます。

onStorageを確認するためには、「input:」テキストボックスに文字を入力して「setItem」ボタンを押下してください。LocalStorageの値が変わり、別のタブの「Log:」イベントが通知されます。

 

「abcdefg」をsetItemにすると別のタブに以下のログが表示されます。

[23:33:12] onstorage: key=itemKey, oldValue=null, newValue=abcdefg

 

以下のような実装になっています。

$('#setItemButton').on('click', function () {
  var itemValue = $('#itemInput').val();
  localStorage.setItem('itemKey', itemValue);
});
window.onstorage = function (e) {
  log('onstorage: key=' + e.key + ', oldValue=' + e.oldValue + ', newValue=' + e.newValue);
};

ブラウザ毎のonStorageの挙動

クロスブラウザ対応で注意したいこととして、IE11とその他のブラウザでは、onStorageイベントの挙動が異なります。IE11では、setItemを実行したタブと別のタブの両方にonStorageイベントが通知されます。その他のブラウザでは、別のタブの片方のみ通知されます。

ブラウザ名 localStorageの値を変えたタブ その他のタブ
Google Chrome 通知されない 通知される
Mozilla Firefox 通知されない 通知される
Microsoft Edge 通知されない 通知される
Microsoft Internet Explorer (IE11) 通知される 通知される

複数タブの同期 (onChange)

onStorageイベントを利用して、複数タブでテキストボックスの値を同期してみたいと思います。

以下のデモページをブラウザのタブを2つにしてそれぞれ表示してみてください。

 

【デモはこちら】

【ソースファイルはこちら】

 

「input:」テキストボックスに文字を入力すると、別のタブにその内容が反映されています。テキストボックスでonChangeイベントが通知されるとlocalStorageのsetItemを実行しています。そのため、別タブにonStorageイベントが通知されて、別タブのテキストボックスに反映されます。

$('#itemInput').on('change', function () {
  // テキストボックスのフォーカスが外れたタイミングで呼ばれる
  var itemValue = $('#itemInput').val();
  localStorage.setItem('itemKey', itemValue);
});
window.onstorage = function (e) {
  log('onstorage: key=' + e.key + ', oldValue=' + e.oldValue + ', newValue=' + e.newValue);
  $('#itemInput').val(e.newValue);
};

複数タブの同期 (onKeyup)

onChangeイベントと同様に、onKeyupイベントでテキストボックスの値を同期してみたいと思います。

以下のデモページをブラウザのタブを2つにしてそれぞれ表示してみてください。

 

【デモはこちら】

【ソースファイルはこちら】

 

しかし、onKeyupイベントで実装された場合、IE11では、「ローマ字入力」で日本語を入力すると正しく入力できません。onChangeイベントでは、テキストボックスのフォーカスが外れたタイミングで通知されますが、onKeyupイベントは、キーボードのキーを離したタイミングで通知されます。そのため、onKeyupイベントでsetItemを実行すると、そのタブにonStorageイベントが通知され、入力中のテキストボックスに対して値が更新されてしまいます。例えば、「こ」と入力した場合は、onStorageイベントには「k」がnewValueとして通知されるため、タイミングによってはテキストボックスに「k」が表示されてしまうことがあります。

$('#itemInput').on('keyup', function () {
  // キーボードのキーを離したタイミングで呼ばれる
  var itemValue = $('#itemInput').val();
  localStorage.setItem('itemKey', itemValue);
});
window.onstorage = function (e) {
  log('onstorage: key=' + e.key + ', oldValue=' + e.oldValue + ', newValue=' + e.newValue);
  // IE11では、テキストボックス入力中に、newValueで上書きされる
  $('#itemInput').val(e.newValue);
};

このように、IE11ではonStorageイベントの挙動が異なるため、複数タブの同期をとる場合は注意が必要です。

 

以上です。

以下のファイルがあるとします。

 

$ more testawk.csv

z,a,q,1

2,w,s,x

c,d,e,3

4,r,f,v

 

以下のコマンドで上記のファイルの1列目と2列目を結合した値を

末尾に追加したファイルを作成できます。

 

$ cat testawk.csv | awk -F',' 'BEGIN{OFS=","} {$5=$5$1$2; print}' > testawk_new.csv

$ more testawk_new.csv

z,a,q,1,za

2,w,s,x,2w

c,d,e,3,cd

4,r,f,v,4r

以下のファイルがあるとします。

 

$more testcut.csv

z,a,q,1

2,w,s,x

c,d,e,3

4,r,f,v

 

以下のコマンドで上記のファイルの最初の列を削除した

ファイルを作成できます。

 

$cat testcut.csv | cut -d "," -f 2- > testcut_new.csv

$more testcut_new.csv

a,q,1

w,s,x

d,e,3

r,f,v

 

 

こんにちは!パーク社員のゆんぼうです。
今回は、Dockerのパフォーマンスをモニタリングできるツールを調査しました。
その3つ目として、「Prometheus」 を紹介します。

Prometheusとは

「Prometheus」とは、リアルタイムでパフォーマンスを監視できるツールです。
公式ページ: https://prometheus.io/

以下の特徴があります。

  ・WEBページでグラフの表示が可能

  ・「Prometheus Server」と「exporter」の構成で運用する

  ・アラート機能 (Eメール, Slackなど連携可)

  ・長期間の監視データの蓄積が可能。Prometheusと同じローカルディスクに保存される

 

「Prometheus Server」と「exporter」で行っていることは下記の通りです。

Prometheus Server 各exporterのAPIからメトリクス情報の取得と蓄積、WEBページの表示、アラート通知を行う。
exporter ログからメトリクス情報を生成する。メトリクス情報のAPIを提供する。「node exporter」や「cAdvisor」などがある。

 

Prometheusの環境構築手順

環境構築手順は下記の通りです。

 

・Windows 10 Pro

・Docker Toolbox (v17.07.0-ce)

・docker-machine でマシンを作成済みとします。

  ・マシン1: 192.168.99.103 → 「Prometheus」と「node exporter」をインストールします。

  ・マシン2: 192.168.99.104 → 「node exporter」をインストールします。

  ・マシン3: 192.168.99.105 → 「cAdvisor」をインストールします。

  ・マシン4: 192.168.99.106 → 「cAdvisor」をインストールします。

 

1. 「Docker Quickstart Terminal」を起動します。

2. マシン1をアクティブにして、『prometheus.yml』を作成します。内容は下記の通りです。

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    monitor: 'codelab-monitor'

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    scrape_timeout: 2s
    honor_labels: true
    static_configs:
      - targets: ['192.168.99.103:9090']

  - job_name: 'docker-host'
    scrape_interval: 5s
    scrape_timeout: 2s
    metrics_path: /metrics
    static_configs:
      - targets: ['192.168.99.103:9100', '192.168.99.104:9100']
        labels:
          group: 'docker-host'

  - job_name: 'docker'
    scrape_interval: 5s
    scrape_timeout: 2s
    metrics_path: /metrics
    static_configs:
      - targets: ['192.168.99.105:8080', '192.168.99.106:8080']
        labels:
          group: 'docker'

3. マシン1で『docker-compose.yml』を作成します。内容は下記の通りです。

version: '3'
services:
  prometheus:
    image: prom/prometheus
    volumes:
       - /C/test1/prometheus.yml:/test1/prometheus.yml
    expose:
      - '9090'
    ports:
      - '9090:9090'
    restart: always
    command: 
      - '-config.file=/test1/prometheus.yml'
  grafana:
    image: grafana/grafana
    expose:
      - '3000'
    ports:
      - '3000:3000'
    restart: always
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: admin
      GF_USERS_ALLOW_SIGN_UP: 'false'
      GF_USERS_ALLOW_ORG_CREATE: 'false'
  node_exporter:
    image: prom/node-exporter
    expose:
      - '9100'
    ports:
      - '9100:9100'
    restart: always
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro

4. マシン1で下記のコマンドを実行します。 

$ docker-compose up -d

5. マシン2をアクティブにして、『docker-compose.yml』を作成します。内容は下記の通りです。

version: '3'
services:
  node_exporter:
    image: prom/node-exporter
    expose:
      - '9100'
    ports:
      - '9100:9100'
    restart: always
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro

6. マシン2で下記のコマンドを実行します。 

$ docker-compose up -d

7. マシン3、4をそれぞれアクティブにして、『docker-compose.yml』を作成します。内容は下記の通りです。

version: '3'
services:
  cadvisor:
    image: google/cadvisor:latest
    expose:
      - '8080'
    ports:
      - '8080:8080'
    restart: always
    privileged: true
    networks:
      default:
        aliases:
          - cadvisor
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker:/var/lib/docker:ro

8. マシン3、4それぞれで下記のコマンドを実行します。 

$ docker-compose up -d

9. 下記のURLにアクセスします。
http://192.168.99.103:9090 (Prometheus標準Webページ)

http://192.168.99.103:3000 (Grafanaで表示したWebページ)

 

PrometheusのWEB画面の操作手順

PrometheusのWEB画面の操作手順は下記の通りです。

1. メニューから「Graph」選択します。「- insert metric at cursor -」のプルダウンを選択します。

 

2. 「Execute」ボタンを押下します。

 

3. 「Graph」ボタンを押下します。

 

4. グラフが表示されます。

 

クエリーは、下記のように変更して、「Execute」ボタンを押下すると、「docker」グループに所属しているデータだけ表示することができます。

go_memstats_alloc_bytes

go_memstats_alloc_bytes{group="docker"}

クエリの入力方法は下記のURL参照してください。
https://prometheus.io/docs/querying/basics/

 

5. メニューの「Alerts」を選択するとアラート一覧が表示されます。

 

6. メニューの「Status」を選択して、「Targets」を選択すると、メトリック取得対象が表示されます。

PrometheusのWEB画面の操作手順 (Grafana)

Grafanaでは、Prometheusが標準で用意しているWebページよりもグラフィカルなページを表示することができます。

 

1. ログイン画面において、ID「admin」, PW「admin」を入力して、「Login」ボタンを押下します。

 

2. データソースを設定して、「Save & Test」ボタンを押下します。

 

3. 「Dashboards」を選択して、「import」ボタンを押下します。「Prometheus Stats」を選択します。

 

4. 「Prometheus」のグラフが表示されます。

 

5. 新しくグラフを追加した際に、Prometheusのクエリーを指定することが可能です。

 

以上です。

こんにちは!パーク社員のゆんぼうです。
今回は、Dockerのパフォーマンスをモニタリングできるツールを調査しました。
その2つ目として、「cAdvisor」 を紹介します。

cAdvisorとは

「cAdvisor」とは、リアルタイムでDockerのコンテナのパフォーマンスを監視できるツールです。
公式ページ: https://github.com/google/cadvisor

以下の特徴があります。

  ・WEBページでグラフの表示が可能

  ・1秒毎に同じホストにあるコンテナのメトリクス情報を収集する

  ・メトリクス情報のAPIを提供しており、「Prometheus」や「InfluxDB」と連携が可能

  ・長期間の監視データの蓄積は行わない(メモリ上に直近60秒の情報を保持するのみ)

 

cAdvisorの環境構築手順

環境構築手順は下記の通りです。

 

・Windows 10 Pro

・Docker Toolbox (v17.07.0-ce)

・docker-machine でマシンを作成済みとします。(IP: 192.168.99.102)

 

1. 「Docker Quickstart Terminal」を起動します。

2. 『docker-compose.yml』を作成します。内容は下記の通りです。

version: '3'
services:
  cadvisor:
    image: google/cadvisor:latest
    expose:
      - '8080'
    ports:
      - '8080:8080'
    restart: always
    privileged: true
    networks:
      default:
        aliases:
          - cadvisor
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker:/var/lib/docker:ro

3. 下記のコマンドを実行します。 

$ docker-compose up -d

4. 下記のURLにアクセスします。
http://192.168.99.102:8080

cAdvisorのWEB画面の操作手順

WEB画面の操作手順は下記の通りです。

以上です。