webpackでコンパイル時のモードで設定を切り替える

これでいいのかちょっと分からないのですが、とりあえずはwebpackの設定ファイルはNodeで実行されているので、コマンドライン引数を読んで設定を切り替えるようにしてみました。

var config = []; // デフォルトの設定
switch (process.argv[2]) {
case '-p':
case '--production':
// 本番用の設定があればここでマージ
break;
case '-w':
case '--watch':
// 開発時用の設定があればここでマージ
break;
}
module.exports = config;

一部のnpmで昔問題が出ていたのでこのような設定をしていたんですが、今は問題なくなったので設定ファイルを戻すにあたって、後で思い出せるように残しておきました。

PHPで即時関数を実現する

call_user_funcを使うとできるようです

$hoge = 'test';
$result = call_user_func(function($str) {
return $str;
}, $hoge);
echo $result; // test

(追記) PHP7からの書き方

@nunulk さんに教えてもらったPHP7からの書き方。より直感的に書けるようになりましたね。

declare(strict_types=1);
$hoge = 'test';
$result = (function (string $str) {
return $str;
})($hoge);
echo $result; // test

PHPのsubstrのfalseが発生するパターン調査

substrをかなり厳格に使う必要があったので、以下のマニュアルを参考に、5.6.11での細かい調査をしたのでここに残しておきます。
http://php.net/manual/ja/function.substr.php

$string = '1234567890';

調査1

string の長さが start 文字より短い場合は FALSE が返されます。

var_dump(substr($string,  12)); // bool(false)
var_dump(substr($string,  11)); // bool(false)
var_dump(substr($string,  10)); // bool(false)
var_dump(substr($string, -11)); // string(10) "1234567890"
var_dump(substr($string, -12)); // string(10) "1234567890"

調査2

length が指定され、かつ負である場合、 string の終端からその文字数分の文字が省略されます (start が負の場合は、 開始位置を算出したあとで)。 もし start が切り出し位置を超える場合、 FALSE が返されます。

var_dump(substr($string,  -1, -5)); //string(0) ""
var_dump(substr($string,  -9, -5)); //string(4) "2345"
var_dump(substr($string,  -9, -5)); //string(4) "2345"
var_dump(substr($string,   4, -5)); //string(1) "5"
var_dump(substr($string,   6, -5)); //bool(false)

1行目はlengthが負であり、startは負で指定されているが算出後はlengthで指定した切り出し位置を超えているが空文字となっているように見受けられる。startが負である場合の時の挙動は後日再調査。

調査3

バージョン5.2.2 - 5.2.6の範囲内において

start が負の切り出しを意味したり 切り出し位置を超える値になった場合に false を返すようになりました。 それ以外のバージョンでは、文字列の先頭から取得します。

var_dump(substr($string, -12, -5)); //string(5) "12345"

調査4

length が指定され、かつ 0、NULL、もしくは FALSE であれば、空の文字が返されます。

var_dump(substr(0, 1, 1));    // bool(false)
var_dump(substr(null, 1, 1)); // bool(false)

MySQLでデータベースをuft8mb4で作成する

MySQLに絵文字を格納するためにutf8mb4のデータベースを作成します。

CREATE DATABASE example CHARACTER SET utf8mb4

実際に作成と確認をしていきます。

mysql> CREATE DATABASE example CHARACTER SET utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| example            |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
mysql> SHOW CREATE DATABASE example;
+----------+---------------------------------------------------------------------+
| Database | Create Database                                                     |
+----------+---------------------------------------------------------------------+
| example  | CREATE DATABASE `example` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

絵文字を使う場合、どうしても文字コードを変更できない場合はBLOB型を使うか、アプリケーション側で置換するなどで対応しましょう。

DockerコンテナのCPUやメモリの使用状況を確認する

DockerコンテナのCPUやメモリの使用状況が確認できる

docker stats [hash]

複数のコンテナを同時に見ることもできる

docker stats [hash] [hash2]

どのコンテナがどのような状態になっているか確認するときに使える

CONTAINER           CPU %               MEM USAGE/LIMIT     MEM %               NET I/O
4733td5abc51        0.05%               209.7 MB/1.074 GB   19.53%              657 B/400 B
12hdcj5371yf        0.06%               257.3 MB/1.074 GB   23.96%              2.315 kB/400 B

Macのdocker環境構築とよく使うコマンド一覧 (docker-machine版)

Mac上にDocker開発環境を構築する例です。前提条件としてVirtualBoxが必要です。

環境構築

必要なものをインストール

brew install docker
brew install docker-machine

docker用のVMを作成します

docker-machine create --driver virtualbox dev
docker-machine env dev

デフォルトのdockerコマンドのホストに作成したVMを設定します

eval "$(docker-machine env dev)"

insecure-registryを設定する

自作イメージをローカルのレジストリなど置いている時に設定します

docker-machine ssh dev "echo $'EXTRA_ARGS=\"--insecure-registry example.com\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"

docker-machineのIPを調べる

私は/etc/hostsあたりでここから取得できたIPをdocker.localに向けています

docker-machine ip dev

docker-machineで接続する

おかしなことがあった時に中で直接設定を見たりする時に重宝します

docker-machine ssh dev

docker-machineを停止する

PCを再起動する場合はdocker-machineを停止してあげましょう。

docker-machine stop dev

docker-machineを起動する

PCを再起動した時は既に作成したマシンを起動するだけでいいです。

docker-machine start dev

docker-machineのVM一覧

docker-machine ls

docker-machineのVMを削除する

docker-machine rm dev

メモ

Docker for Macというものが出たようです。まだ様子見ですが近いうちに試してみようと思います。
http://paiza.hatenablog.com/entry/docker_for_mac

Express + React + socket.ioでファイルをDropboxに直接ダウンロードする

Dropboxへの直接ファイルダウンロード機能が欲しかったので先週の土日休みで作りました。

hoge.png

  • ExpressでファイルダウンロードとDropboxへのアップロードをする
    • 並列で複数ファイル同時ダウンロード可能
  • WebSocketでファイルのダウンロードの進捗をリアルタイム表示
  • ReactでUIの構築

などをやっているシステムです。興味のある方は以下をご覧ください。

https://github.com/setouchi/cloudown

使ってみる

ビルド

git clone https://github.com/setouchi/cloudown.git
cd cloudown
npm install
npm install -g webpack
webpack -p
node index.js

起動スクリプトを作成します。立ち上がる(予定の)ホスト名やポートは環境変数で指定します。

#!/bin/sh
export CLOUDOWN_HOST=localhost
export CLOUDOWN_PORT=8080
export CLOUDOWN_WEB_SOCKET_PORT=8081
export DROPBOX_TOKEN=token
node /path/to/cloudown/index.js

起動

sh run.sh

実行したら http://localhost:8080 にアクセスするとCloudownの画面が表示されています。

技術メモ

/saveにJSONのPOST送信でダウンロードしたいファイルを送信できるようになっているので、外部のシステムとの連携が容易です。

JS周りだけどES6とES5がぐちゃぐちゃです。このシステムは今後100年くらいメンテするつもりなのでこれから少しずつかっこ良く直していく予定です。

suzu-downloadernode-dropboxは自家製です。前者はnpmで公開していて、後者はGithubにあります。詳細はpackage.jsonあたりをご覧ください。

ダウンロード失敗した時の通知とかログの消去がしっかりしていないので見直したい。ログはメモリ上にあるので再起動すれば消滅するが、ダウンロードしてアップロードに失敗した場合はファイルが残り続けるのでそこは何とかしたい。Sassに至ってはカスカスなので1万行くらい書いてUIをデザインしてみたい。

いつかDockerコンテナにする予定でそのために環境変数で設定をできるようにしているんですが、今はRaspberry PiでもDockerコンテナが簡単に立ち上げられるようになったみたいなので、近いうちに作っておきます。