JavaScriptのAjaxでローカルファイルをアップロードする

jQueryを使わない生のJavaScriptでファイルをアップロードする。コールバックの処理にPromiseを用いてコードをシンプルにしている。

<!-- アップロードフォーム -->
<form id="form">
<input type="file" name="file_1">
<input type="submit" value="アップロード">
</form>
<script>
  // アップロードライブラリ
  var upload = function(endpoint, element) {
    return new Promise(function(resolve, reject) {
      element.addEventListener('submit', function(e) {
        e.stopPropagation();
        e.preventDefault();
        var xhr = new XMLHttpRequest();
        xhr.addEventListener('loadend', function () {
          var result = JSON.parse(xhr.responseText);
          if (xhr.status === 200) {
            resolve(result);
          } else {
            reject(result);
          }
        });
        xhr.open("POST", endpoint, true);
        xhr.send(new FormData(element));
      });
    });
  };
  // アップロードイベントの設定
  var form = document.getElementById('form');
  upload("http://example.com/uploader", form).then(function(it) {
    alert("success");
    console.log(it);
  }, function(it) {
    alert("failed");
    console.log(it);
  });
</script>

JavaScriptでページが読み込まれたら処理を実行する

ページの読み込みが完了してから処理を実行するにはloadイベントを実行すれば良いが、JavaScriptが非同期で実行される環境の場合既にページが読み込まれている事がある。既にページが読み込まれた後にloadイベントにバインドしても、処理は実行されないため、既にページが読み込まれているかというのをdocument.readyStateから読み取るのがコツ。

var hoge = function() {
alert('test');
};
if (document.readyState === 'complete') {
hoge();
} else {
window.addEventListener("load", function(e) {
hoge();
}, false);
}

docker-composeで特定のコンテナだけkillしたりrestartする

特定のコンテナのアプリケーションにバグがあったからと全体を再立ち上げしていたが、特定のコンテナだけを再起動したりできる。例えば再起動ならrestartの後に名前を追加する。

docker-compose -f hoge.yml restart app_name

この調子でkillとかもできるので是非使ってみましょう。statsはできなかったな。

評価版を使ってWindowsを90日無料で使う

こちらからWindowsの評価版のisoがダウンロードできる。ちょっとした検証とか少しだけ試しに使いたいだけならまずはこちらを試すのが良さそうだ。
https://www.microsoft.com/ja-jp/evalcenter/

VirtualBoxでフォルダをマウントする時はVirtualBoxから設定するだけではなく、ゲストOS側にVBoxWindowsAdditionsをインストールしなければならない。これが結構忘れる。

Docker Swarm で動作しているコンテナの内部にbashで入る

docker stack psで得られるIDは実際のコンテナIDではないため、実際に動作しているホストでdocker psを行ってCONTAINER IDを得た後で、動作しているホスト内でdocker exec -ti hash bashを行う流れとなる。今の所見つけられた方法はこれだけ。

実際にやってみます。まずスタック名を調べる

$ docker -H manage.swarm.local stack ls
NAME SERVICES
hoge 2

hogeスタックのコンテナ一覧を探す

$ docker -H manage.swarm.local stack ps hoge
ID            NAME              IMAGE  NODE            DESIRED STATE CURRENT STATE          ERROR PORTS
aserthjklqwy  hoge_hoge.1       hoge   01.swarm.local  Running       Running 19 hours ago
tw71341fsiac   \_ hoge_hoge.1   hoge   01.swarm.local  Shutdown      Rejected 19 hours ago
3610bgbnlanv  hoge_hoge2.1      hoge2  01.swarm.local  Running       Running 19 hours ago
rbkfaa901832   \_ hoge_hoge2.1  hoge2  01.swarm.local  Shutdown      Shutdown 19 hours ago

hogeスタックで動作しているコンテナが動作しているNODEに対してdocker psを実行しCONTAINAER IDを得る

docker -H 01.swarm.local ps | grep hoge_hoge.1
e74a07ec37a8  hoge  "/usr/bin/java -XX:+…"  19 hours ago  Up 19 hours  hoge_hoge.1.1.98h4f6of6gfqh7w3d7v5ytfdz

該当のコンテナが動作しているホストでexecを行う

$ docker -H 01.swarm.local exec -ti e74a07ec37a8 bash
root@e74a07ec37a8:/#

このような感じになる。スケールしなければいけない環境ではDocker Swarmは活きてくるが、単一ホストで動作させるだけならdocker-composeで十分だなと思う。

nodeコマンド実行時に環境変数を渡す

nodeコマンド実行時に環境変数を渡すには実行コマンドの手前に環境変数を定義する。

まずはテスト用にこんなスクリプトを作成しておきます。

console.log(process.env.NODE_ENV);
console.log(process.env.NODE_ENV2);

そして下記のように実行するとこのようになる。

$ NODE_ENV=prd node hoge.js

結果はこうなります。

$ NODE_ENV=prd node hoge.js
prd
undefined

複数渡すにはスペースで区切って単に追加するだけ。

$ NODE_ENV=prd NODE_ENV2=prd node hoge.js

結果はこうなります。

$ NODE_ENV=prd NODE_ENV2=prd node hoge.js
prd
prd

Ubuntuでadd-apt-repository: command not foundと言われた時の対策

下記のようなエラーが出た

root@38ac508afb51:/# add-apt-repository ppa:jonathonf/ffmpeg-3
bash: add-apt-repository: command not found

software-properties-commonpython-software-propertiesをインストールする

apt update
apt install software-properties-common python-software-properties

再度実行したら成功した

root@38ac508afb51:/# add-apt-repository ppa:jonathonf/ffmpeg-3
Backport and/or package of FFMPEG 3 and key libraries
***
Cumulative downloads at 2017-12-20: 68,504 (based on ffmpeg)
Total downloads of 3.4: 24,113
Total downloads of 3.3.2: 2,814
***
Find PPAs useful? Consider a donation to those you use.
More info: https://launchpad.net/~jonathonf/+archive/ubuntu/ffmpeg-3
Press [ENTER] to continue or ctrl-c to cancel adding it
gpg: keyring `/tmp/tmp759hyr6g/secring.gpg' created
gpg: keyring `/tmp/tmp759hyr6g/pubring.gpg' created
gpg: requesting key F06FC659 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmp759hyr6g/trustdb.gpg: trustdb created
gpg: key F06FC659: public key "Launchpad PPA for J Fernyhough" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

参考

https://qiita.com/strsk/items/3a46a27ed12c49740ad3