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

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

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

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

netdataとは

「netdata」とは、リアルタイムでパフォーマンスを監視できるツールです。
公式ページ: https://hub.docker.com/r/titpetric/netdata/

以下の特徴があります。

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

  ・環境に合わせて、設定を行う必要がない

  ・実行速度が速く、また負荷も低いため、1秒毎にデータ収集が可能

  ・プラグインを使用すると収集できるデータの種類を追加することが可能

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

  ・長期間の監視データの蓄積は行わない(数日程度)

 

下記にサンプルページがありますでご覧になられてはいかがと思います。
サンプルページ: https://my-netdata.io/#demosites
 

netdataの環境構築手順

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

 

・Windows 10 Pro

・Docker Toolbox (v17.07.0-ce)

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

 

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

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

version: '3' 
services: 
  netdata: 
    image: titpetric/netdata:latest 
    ports:
      - '19999:19999' 
    restart: always
    cap_add: 
      - SYS_PTRACE
    volumes: 
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro

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

$ docker-compose up -d

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

netdataのWEB画面の操作手順

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

 

以上です。

ファイル構成は Redux 3.7.2 を、
ファイル名やディレクトリ名は主に React 16.0.0 を参考にしています。
  Redux: https://www.jsdelivr.com/package/npm/redux
  React: https://www.jsdelivr.com/package/npm/react

結論から言えばこんなファイル構成と package.json になります。
 

ファイル構成
my-package/
  src/                -- ソースコード
    index.ts            -- メインモジュール (エントリポイント)
    submodule1.ts       -- 他のモジュールからインポートするモジュール
    submodule2.ts       --      〃
    ...
  umd/ (or dist/)     -- UMD ビルド
    my-package.js
    my-package.min.js
  types/              -- TypeScript 型定義
    index.d.ts
    submodule1.d.ts
    submodule2.d.ts
    ...
  es/                 -- ES 2015 モジュール群
    index.js
    submodule1.js
    submodule2.js
    ...
  cjs/ (or lib/)      -- CommonJS モジュール群
    index.js
    submodule1.js
    submodule2.js
    ...
  LICENSE
  README.md
  package.json
package.json
{
  "name": "my-package",
  "version": "0.0.0",
  "main": "./cjs/index.js",
  "module": "./es/index.js",
  "jsnext:main": "./es/index.js",
  "types": "./types/index.d.ts",
  "jsdelivr": "./umd/my-package.min.js",
  "unpkg": "./umd/my-package.min.js",
  "files": [
    "umd",
    "cjs",
    "es",
    "types",
    "src"
  ],
  ...
}

以下、このようにした私の言い分です。


■ ソースコードを提供しよう (src/)

ソースコードを npm パッケージに含めるかどうかは完全に任意です。
Redux はソースコードを含めていますが、 React は含めていません。
個人的には何かトラブったときに読みたくなる可能性があるので含めてほしいです。

■ ️UMD ビルドを提供しよう (umd/ または dist/)

UMD は IIFE + AMD + CommonJS です。
HTML の script タグで読み込む (IIFE) ことも、
スクリプト実行時に非同期で取り込む (AMD) ことも、
モジュールバンドラーでくっつけることもできます。

バンドルしていない CommonJS モジュール群を別途提供する場合 (後述)、
UMD は提供せず AMD は捨てて IIFE を提供するという選択肢もあるかと思います。
が、わざわざ AMD を捨てるより思考停止して UMD を提供すれば良いと私は思います。
(IIFE に対する UMD のオーバーヘッドなんて微々たるものでしょう。)

CommonJS モジュール群を別途提供しない場合は
package.json の main フィールドに UMD ビルドのパスを書きましょう。
https://docs.npmjs.com/files/package.json#main
CDN からの利用を想定するなら
package.json の jsdelivr フィールドと unpkg フィールドに minified UMD ビルドのパスを書きましょう。
https://www.jsdelivr.com/features#publishing-packages
https://unpkg.com

ディレクトリ名は Redux では dist/ ですが React では umd/ です。
(React 15 では dist/ でしたが 16 で umd/ に変更されています。)
私は dist/ という言葉に意味を感じられないので (他のファイルも distribution には違いないので) umd/ としています。


■ TypeScript 型定義を提供しよう (index.d.ts または types/)

お願いします (私が一応 TSer なので)。

そして
package.json の types フィールド (または typings フィールド) にメインモジュールの型定義のパスを書きましょう。
https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html

ディレクトリ名として typings という言葉も使えそうですが、
TypeScript の黒歴史を彷彿とさせるので私は避けています。
https://github.com/typings/typings

Redux ではパッケージルートに index.d.ts が置かれています。
ちな Flow の型定義は見当たりませんでした。
React は Facebook なので Flow 推しだと思うのですが、
TypeScript の型定義も Flow の型定義も見当たりませんでした。


■ ️ES 2015 モジュールを提供しよう (es/)

ES 2015 モジュールの時代がやってきました (やっと...きました)。

Rollup はプラグインなしでは ES 2015 形式のモジュールじゃないと読み込めません。
https://github.com/rollup/rollup-plugin-commonjs
webpack 2+ は ES 2015 形式のモジュールじゃないと Tree Shaking できないようです。
https://github.com/indutny/webpack-common-shake
主要ブラウザーは import ステートメントを実装し始めているようです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import
# NodeJS でも 8.5.0 で ES モジュール機能が実装されましたが、 9.1.0 現在も実行時オプションに --experimental-modules フラグを付けた上で拡張子を .mjs にする必要があります (https://nodejs.org/api/esm.html)。
# 今回はブラウザー向けパッケージの話に絞ります。

ということで ES 2015 モジュールを提供しましょう。
 
そして
package.json の module フィールドと jsnext:main フィールドにメインモジュールのパスを書きましょう (jsnext:main はもう要らないかもですが一応)。
https://github.com/rollup/rollup-plugin-node-resolve
https://webpack.js.org/configuration/resolve/#resolve-mainfields

重要な注意点として、モジュール形式は ES 2015 でも、使用できる言語機能やライブラリはサポート対象とする実行環境次第 (IE 11 を含めるなら ES 5 相当) になるかと思います。
Rollup や webpack 2+ は ES 2015 の import 構文を解析してモジュールをくっつけることはできますが、他の構文のトランスパイルや Polyfill の提供はしないからです。

たとえば Object#assign() を使いたい場合、次のいずれかの対処が必要になるかと思います。

* Ponyfill を dependencies に含めてインポートする
* Polyfill を読み込んでから自身のモジュールを利用するよう利用者に懇願する
* IE 11 はサポート対象外だと明言する

結局モジュール形式以外は CommonJS モジュール群を提供していたこれまでと同じです。

# 私は依存パッケージの数だけ Object#assign() の代替実装が読み込まれているような気がしてなりません。
# 最終的に利用するアプリでは core-js や babel-polyfill を読み込むかもしれないのに...


■ ️CommonJS モジュール群は必要に応じて提供しよう (cjs/ または lib/)

ES 2015 モジュールが読み込めない古いモジュールバンドラー (browserify とか webpack 1.x とか) や NodeJS 向けに、バンドルしていない CommonJS 形式のモジュールを提供する場合があります。
UMD ビルドも CommonJS モジュールとして読み込めますが、未バンドルの CommonJS モジュール群も別途提供した方が良い場合が多いと思います。理由は以下。

たとえばパッケージ a, b のメインモジュールがいずれもパッケージ z を読み込んでいるとします。
  var a = require('a');
  var b = require('b');
と書いたとき、
もし a, b がいずれも未バンドルの CommonJS であれば、 require('z') は 2 回呼ばれますが、実質的に z が読み込まれるのは 1 回です。
もし a がバンドル済み (UMD ビルド) であれば、すでに z は a に「組み込まれて」しまっており、 b のメインモジュールはそれを知らずに require('z') するので、 z は 2 回読み込まれることになります。

依存パッケージが全くないのであれば UMD で十分かと思いますが、
そうでないなら UMD ビルドではとても効率が悪くなってしまう可能性があるので、
未バンドルの CommonJS モジュール群も提供しましょう。
 
そして
package.json の main フィールドにメインモジュールのパスを書きましょう。
https://docs.npmjs.com/files/package.json#main
https://webpack.github.io/docs/configuration.html#resolve-packagemains
https://github.com/browserify/browserify#packagejson

ディレクトリ名は Redux では lib/ ですが React では cjs/ です。
(React 15 では lib/ でしたが 16 で cjs/ に変更されています。)
私は lib/ という言葉に意味を感じられないので cjs/ としています。

ディレクトリを掘らずパッケージルートに CommonJS モジュール群を置いているパッケージもあります。
たとえば react-router (4.2.0 現在)
https://www.jsdelivr.com/package/npm/react-router
次のように、複数のモジュールを必要に応じて個別に読み込むようなパッケージ (メインモジュールが「唯一のエントリポイント」ではないパッケージ) では便利かもしれません。
  var module1 = require('that-package/module1');
  var module3 = require('that-package/module3');


■ 結論

結論は最初に書きました。

ちな実際に個人的に npm でパッケージを公開してみましたが、
他のパッケージに依存しなかったので CommonJS モジュール群は含めませんでした。
https://www.npmjs.com/package/ripplet.js
https://www.jsdelivr.com/package/npm/ripplet.js

以上、ちかでした

windowsでファイル名を変更する際に使用するrenコマンドですが、ワイルドカードを使用する際には注意が必要です。

 

例えば、以下のようにファイル名を変更したいとします。

<変更前のファイル名>  

・1AS5LA1Z.txt

・2AS5MA2Y.txt

・12AS5NA3X.txt

<変更後にしたいファイル名>

・1AS4LA1Z.txt

・2AS4MA2Y.txt

・12AS4NA3X.txt

 

ワイルドカードを使用して、以下のコマンドを打ちます。

>ren *AS5* *AS4*

 

するとファイル名は以下のようになります。

・1AS5LAS4.txt

・2AS5MAS4.txt

・12AS5NAS4.txt

 

新ファイル名(上記の例だと*AS4*)で使用した*<文字列>のワイルドカードを使用すると、*の右にある文字(上記の例だとA)を文字列の右から検索し、そこから右を変更してしまいます。

 

一度に変換できなくなってしまいますが、ワイルドカードの?を使用するとうまくいきます。

 

>ren ?AS5* ?AS4*

<変更後ファイル名>

・1AS4LA1Z.txt

・2AS4MA2Y.txt

 

>ren ??AS5* ??AS4*

<変更後ファイル名>

・12AS4NA3X.txt