それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

複数Gmailを手軽に管理する方法。スマホ設定も通知も迷惑メール対策がぐっと楽になるテクニック

Gmailのアカウントが増えすぎて困る

Gmailのアカウントが増えすぎ。

常時に大量にメールチェックするのがもう無理。っていうかメールは通知以外で殆ど使わないと思うんだ。

そうだフォワードしよう

メールは転送してフォワードしてしまえば良いのではないか。

メインのメアドに全部転送することにした。

メインのメアドはGSuite(Google Apps)を開始当初から使ってるので10年くらい。そこに全部持ってくることにした。

f:id:takuya_1st:20180222031206p:plain

転送設定

Googleアカウントには、転送を設定する。

f:id:takuya_1st:20180222003058p:plain

返信どうするの?→1箇所で全部返信できるよ

メインのメアドから返信出来ます。Gmailどうしで転送設定するとGmailではFromもそのまま使えるようになってて、超便利!

スパムフィルタがあって便利

GMailから転送するとスパムフィルタのフィルタ結果のメールしか転送されない。

つまり、古くからの単純転送とは違ってフィルタ済みのメールが転送される。

そのためずっと転送されるメールが少ない。

だから、メインのメアドのメールボックスが爆発する心配もあまりない。

f:id:takuya_1st:20180222031737p:plain

iPhone / iPad ( iOS ) の設定が楽

スマートフォンにメールボックスの設定や、通知設定をするとき、1つのアカウントだけを設定するので楽。複数アカウントを設定するのは機種変更時や端末追加でたくさん登録が必要になって面倒くさい。

f:id:takuya_1st:20180222031928p:plain

結論

Gmail複数アカウントを束ねるメアドを決めて使う。

転送だけじゃなく、「権限の移譲」ということで複数人でアカウント権限をシェアして使うことも出来る。

問い合わせメールや返信メールは権限の移譲で、自分のメアドなら転送設定が楽。

これでGmailのメアドを無限に増やせるんだけど、そのうち制限が掛かりそうなのでいまのうちにたくさんメアドとっておくほうが良いかもね。

参考資料

権限移譲

転送設定

Hacking Gmail (English Edition)

Hacking Gmail (English Edition)

bashの補完のcompgenでハイフン(ダッシュ/-)の引数を補完する

問題点

-list から -listDevice のようなcompletion が出来なくて、invalid option なっちゃう。

$ networksetup -list<TAB>
compgen 無効な引数です

キーワードの補完ができない。

ハイフンを付けた引数を補完するときは

compgen にハイフンをハイフン( -- )で渡してあげる。

compgen -W $list -- ${COMP_WORDS[COMP_CWORD]

-list -listdevice などのハイフンが入ったオプションを補完しようとすると、無効なオプション として compgen がwordとして compgen自身へのオプションとして持っていっちゃう

つまり

compgen -W ワードリスト -- '-list'

のようにしてあげないと、 -list から -listDevice のようなcompletion が出来なくて、invalid option なっちゃう。

compgen の使い方

compgen の使い方を見ておくと、次のようになっている。

compgen: compgen [-abcdefgjksuv] [-o option]
 [-A action] [-G globpat] [-W wordlist]  [-F function] 
[-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
    オプションに基づいた補完候補を表示します。

    シェル関数の中で補完候補を生成するために使用するように意図されています。
    オプション引数 WORD が与えられた場合、WORD に対して一致した候補が生成
    されます。

    終了ステータス:
    無効なオプションが与えられるかエラーが発生しない限り成功を返します

サンプル

-listXXXX が大量にあるコマンド補完する例です。

#!/usr/bin/env bash 

### 補完関数。
_takuya_networksetup (){
  curr="${COMP_WORDS[@]}"
  prev="${COMP_WORDS[$COMP_CWORD-1]}"
  cmd_name=networksetup

  if [[  $prev =~ $cmd_name ]] ; then 
      sub_command_list=$( networksetup -h | /usr/bin/grep networksetup | awk '{print $2}' )
      COMPREPLY=( $(compgen -W "$sub_command_list" -- ${COMP_WORDS[COMP_CWORD]}  ) ) 
    fi
}
complete -F _takuya_networksetup networksetup

参考商品

アタック Dash Button

アタック Dash Button

mysqldumpがなんかメッセージ吐くので、アップグレード

mysql の自動バックアップがWarnings

なんかエラー吐くので、しらべたら、MySQLMariaDB でしかもバージョンアップが終わってるのにテーブルが古いってことらしい

mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Scheduler were found damaged at server start (1577)
mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Scheduler were found damaged at server start (1577)

アップグレードコマンドを叩いてみた

root@acid: # mysqlcheck --no-defaults --check-upgrade --all-databases  --auto-repair -p 
Enter password:

そのご、アップグレードする。

root@acid:~# mysql_upgrade -p
Enter password:
MySQL upgrade detected
Phase 1/7: Checking and upgrading mysql database
Processing databases
mysql
mysql.column_stats                                 OK
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
mysql.gtid_slave_pos                               OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.host                                         OK
mysql.index_stats                                  OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.roles_mapping                                OK
mysql.servers                                      OK
mysql.table_stats                                  OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Phase 2/7: Installing used storage engines
Checking for tables with unknown storage engine
Phase 3/7: Fixing views from mysql
Phase 4/7: Running 'mysql_fix_privilege_tables'
Phase 5/7: Fixing table and database names
Phase 6/7: Checking and upgrading tables
Processing databases
epgrec
epgrec.rc_reserveTbl                               OK
(略 : データベースのテーブルを全部チェック
information_schema
performance_schema
wp_black
wp_black.wp1_commentmeta                           OK
(略 : データベースのテーブルを全部チェック
Phase 7/7: Running 'FLUSH PRIVILEGES'
OK
root@acid:~#

複数回の実行からは保護されてるっぽい

root@acid:~# mysql_upgrade -p
Enter password:
This installation of MySQL is already upgraded to 10.1.26-MariaDB, use --force if you still need to run mysql_upgrade
root@acid:~#

参考資料

https://dev.mysql.com/doc/refman/5.5/en/mysql-upgrade.html

https://mariadb.com/kb/en/library/mariadb-community-couldnt-execute-show-events-cannot-proceed-because-system/

今使ってるのMariaDBなのかMySQL(GPL)なのか、バージョンアップする前に調べたい。

apt で入れるのか、なにで入れてるのかわからなくなる。

docker のイメージだとか、mysql を含んだdeb とかあるから、ちゃんと確認した方がいいよね。

mysql takuya@localhost:(none)> select VERSION();
+--------------------------+
| VERSION()                |
|--------------------------|
| 10.1.26-MariaDB-0+deb9u1 |
+--------------------------+
1 row in set

参考資料

https://mariadb.com/kb/en/library/version/

マリアバージョン

bashでファイルを空にする。コマンド3種類

ファイルを空にしたい

フォルダやファイルの構造をそのままに、ファイルの中身を空っぽにしたい。

ファイルを消してtouch すれば良いんだろうけど、パーミッション設定しなおしたり面倒くさいよね。ファイルのinodeも変わってしまうので tail してたら tail し直しだ。ファイルをreadしてる常駐プロセスがあれば、そのでエラーになっちゃうし。

ファイルを空にする truncate

truncate -s0 path/to/file

これで、ファイルの中身を消せる。

truncate した場合の tail

tail してる場合は truncated と通知されるんですよ。

takuya@src$ tail -f src/index.html
aa
aa
tail: src/index.html: file truncated

ファイルを空にするリダイレクト

:>  /path/to/file

コマンドの : true と リダイレクト > を組合せて、ファイルをTruncateして空っぽにすることも出来る

echo で空文字 でもいい。

echo -n > /path/to/file

ddでマニアックに

もう一つの方法は dd でやるほうほう。これもマニアック。だけどちゃんとtruncateする。

要は ファイルをopen して先頭にカーソルを持ってきて何か書いてflush すれば良いわけです。

dd if=/dev/zero of=index.html bs=1 count=1

2018-02-26

追記修正

bashでファイルパスの相対パスを得る(絶対パスの取得やパスの正規化も)/realpath利用

realpath で解決

bashスクリプトで2つのファイルパス間の相対パスを取ろうとすると、計算が大変です。

LinuxMacもrealpath は入ってないので、 apt/brew でいれる必要があります。

realpath のインストール

macOS の場合はhomebrew で GNU Linux coreutils をいれる

brew install coreutils

coreutilsのインストールは好き嫌いが別れるのですが、私はGNUコマンドでいいからガンガン入れてしまってます。

絶対パスの取得

realpath ../../../.bashrc

相対パスの取得

realpath --relative-to=/Users/takuya/.ssh /

ちょっとわかりにくいけど、/Users/takuya/.sshからみた /相対パスが出力される。

. しか見えないときにわかりやすいかも

相対パスの取得の例

カレントディレクトリから、カレントディレクトリを見た場合

$ realpath --relative-to=.  .
.

下の階層を見た場合

/ から /tmp を見た場合

$ realpath -s --relative-to=/ /tmp/
tmp

基本的な相対パスの求めから

ディレクトリ Aからみたディレクトリ Bが欲しい時

$ realpath -s --relative-to=A B

ファイルA.txtからみたファイルB.txtへの相対パスが欲しい時

realpath --relative-to=$(dirname A.txt) B.txt

相対パスを求めるときは、 --relative-toディレクトリを入れるとわかる。

/var/www からみた /var/log

takuya@sites$ realpath --relative-to=/var/www /var/log
../log

/var/www/html からみた /var/log

$ realpath --relative-to=/var/www/html  /var/log
../../log

うん、この感じいいね。

/var/www/html/index.php からみた /var/log

んん????

$ realpath --relative-to=/var/www/html/index.php  /var/log
../../../log 

ああ、ファイル名をエントリとして1段の下の階層に来てしまうね。

ファイルをいれるときは dirname を使うよね。

$ realpath --relative-to=$(dirname /var/www/html/index.php)  /var/log
../../log 

持っててよかった realpath

realpath を入れておくと便利ですよね。

realpath コマンドがない場合

そういう時もありますよね。

python の os を使う。

import os.path, sys;
print os.path.relpath('A' ,'B')

ruby のpathnameを使う

require 'pathname'

path = Pathname.new("/tmp/foo")
base = Pathname.new("/tmp")

path.relative_path_from(base)

割となんとでもなるね。

curl で api に画像をアップロードするのに、base64をする。

application/json でファイルを送信する

curl でファイルアップロードをしようとしたら、Content-Typeを text/json で、本文にJSONで画像を入れろって言われたの。

echo {\"image\": \"$( base64 -w0 path_to_file )\" }  | \
curl -X POST -H "Content-Type: application/json" -d @-  http://localhost/api/photo

こうすれば、json を使っても画像を送信することが出来る。

APIでマルチパートを受け取って欲しい。

なんで、わざわざ base64 にして送らなきゃいけないんだろう。

HTTPはMultipart導入ででせっかくファイルアップロードを解決したのに、それを全部無視して、フレームワークが処理してるの。。。

車輪の再発明どころか劣化してると思った。バッカじゃないの??

pyenv でインストールされたpipを含めてupgradeする方法

pyenv の pythonバージョンアップしたい

pyenv でインストールしたpythonバージョンアップして、pipをmigrate したい・

pyenv はバージョン毎にpip環境が作られるから、pyenv でglobal をアップグレードすると、使ってたpipのパッケージが移動されずに真っ白な環境になってしまう。

そこで pipのパッケージをmigrationしたいと思った

pyenv-pip-migrate で一括アップグレード

pyenv-pip-migrate という モジュールがあって、コレを使えばマルっとバージョンアップしてくれることがわかった。

pyenv-pip-migrateのインストール

brew install pyenv-pip-migrate

これをインストールしたら準備完了

pyenv でバージョンアップする

現状が次のバージョンなので、これを3.6.4にする。

$ pyenv version
3.6.0 (set by /Users/takuya/.pyenv/version)

バージョンアップしよう

現状は 3.6.0 だったので、これをアップグレードしてpython の pip モジュールもアップグレードしていきます。

準備

brew install pyenv-pip-migrate

python の 最新版(2018-02-17現在)をいれる。

$ pyenv install 3.6.4
Installed Python-3.6.4 to /Users/takuya/.pyenv/versions/3.6.4

version 3.6.4 がインストールされました。

$ pyenv versions
  system
* 3.6.0 (set by /Users/takuya/.pyenv/version)
  3.6.4

pip を最新版バージョンに併せて置き換える。

python の一括が終わったら、pipを入れていきます。

今回は 3.6.0→3.6.4 にあげていきます。

$ pyenv migrate 3.6.0 3.6.4

これで、pip のインストールが始まる。

仕上げ

最後に仕上げです。新バージョンにglobalを変える

$ pyenv global 3.6.4

これで問題なく環境を移行できました。楽ちん!

せっかちな人向け

OLD_VERSION=$(pyenv version global version | sed 's/\s.*$//')
NEW_VERSION=$(pyenv install --list  | \sed "s/\s*//"  | \grep -P '^\d\.\d\.\d$' | \sort -nr | \head -n 1)
brew install pyenv-pip-migrate
pyenv install $NEW_VERSION
pyenv migrate $OLD_VERSION $NEW_VERSION
pyenv global $NEW_VERSION

エラーになったり、移行させるパッケージを選びたいよって人向け

現在のpipの状態は freeze で持っていけるので、それを使うといい

pip freeze > requirements.txt

つまり、古いバージョンの方で freeze して 新しいバージョンで install する。

pyenv global 3.6.7
pip freeze > requirements.txt
## 適当に編集
vim requirements.txt
## バージョンを切り替え
pip global 3.7.0
pip install -r requirements.txt

わざわざ、migration 入れないでいいのは便利。

参考資料

https://github.com/pyenv/pyenv-pip-migrate

python の datetime をUNIX timestamp にする方法

python で int 秒をとる

UNIX Epoch な時間が欲しいなーって思ったときにどうするか int秒のタイムスタンプがあったら嬉しいわけですよね。

#!/usr/bin/env python

import datetime
import time
import pprint

pp = pprint.pprint

a = datetime.datetime.strptime('2017-11-23 15:00', "%Y-%m-%d %H:%M")
pp( a.timestamp() )              # 1511416800.0
pp( time.mktime(a.timetuple()) ) # 1511416800.0
pp( int(a.strftime('%s')) )      # 1511416800

strftime 最強説

これ試して思ったけど、 strftime('%s') 最強じゃね? 言語に拘らず、時間のフォーマット変換できるじゃん。

strftime を標準実装してない JS とかは除くとして、strftime さえ覚えておけば、かなり使える知識になるね。

IntelliJ IDEA(系)でJSONを美しくする

JSONが1行で記載されてて、めんどくさかった。

JSONを整形したり、フォーマットを整えて閲覧しようとして、ついついプラグインを探していてなぜかソレを使っていたんだけど、落ち着いて考えたら、コードフォーマッターに掛ければいいんだと気付いた。

f:id:takuya_1st:20180214162130g:plain

そうだよね。コード整形にかけたら良かったんだよね。プラグインを検索とかアホなことしたので備忘録しておく。

IDE使うときはJSONをフォーマッターにかける

reformat code でjson 整形が一発。

f:id:takuya_1st:20180515225318p:plain

クラッチファイルを使うとさらに便利。

ちょっとしたファイルの整形くらいなら、 IntelliJ のSractchファイルを使うのが便利。

これは他のファイルにも使えるので覚える便利な手段。

css/ json / xml などなど

いちいちプラグイン入れなくていいですよね

phpstorm や rubymine や pycharm などでも使える手段

2018-05-15 追記。

メニューの画像を追加。

gitで追加したけど要らないファイルを消す(clean Untracked files)

git で作業してて困るのが「追加」ファイルの取扱い

git checkout でファイルの変更を取り消したり、ファイルの編集をなかったコトにすることは出来る

だが、あれこれ試してやっぱり使わなかったファイルを消すことはcheckout ではきない。

touch aaaaaaaaaaaaaaaaa
git checkout
ls
 aaaaaaaaaaaaaaa
##

未追跡のファイルに対して何もしないというのはある意味で便利だし、有能な機能なんだけど。

generator 系でミスったファイルを消したい

クラスのジェネレーションやテンプレの追加とか一発出来るコマンドがあったり、gulp のタスクをみすって作っちゃったファイルとかそういうのをまとめて消したいときにはどうする。

git clean でかいけつ

git clean -n # 消されるファイルをプレビュー
git clean -f # 確認しました。消してください。

これでディレクトリのツリーとワーキングツリーの状態が一致するようになる。

ディレクトリもある場合は、 -d をつける

git clean -f -d

つまりどういうことかというと

git status でコマンドを実行したときに出てくる。 Untracked files を消すということ gitignore で無視してるファイルは対象にならない。

この状態でこの条件でclean してあげれば、クラスのディレクトリ構成にゴミを作っても安心してもとに戻せるからガンガンファイルを足して多少コマンドでミスったくらいでも気にしなくていい。便利。

合わせて覚える git

  • git clean -i インタラクティブにファイルを指定する(条件指定とか)
  • git clean -x gitignore の対象のファイルを消す
  • git stash 作業中のファイルをどける

参考資料

https://stackoverflow.com/questions/61212/how-to-remove-local-untracked-files-from-the-current-git-working-tree

umask の初期設定を全部のユーザーに適用する

umask を全部のユーザーに強制する

umask と グループのsticky ビットを使って、ユーザー間でファイルを共有してファイルのパーミッションをグループで編集できるようにしておくと便利。

/etc/profile

このファイルは必ず読み込まれるので、ここの最上位で設定しておく。

umask 0002

ただし、ユーザーごとの~/profile や bashrc などで上書きが可能

ユーザー間のファイルの共有のこと

Linuxは現在では、ユーザー個別のグループを使うことになっていて、それがデフォルトグループになっているので、複数人でファイルを編集してるとパーミッションエラーで書き込み禁止なファイルが出来てしまったりする。元来、複数人でログインして使いまわすのが前提の「コンピュータ」だったのにね・

関連資料

bashrcの設定の読み込まれる順番 - それマグで!

SSHをSFTPに制限して、ディレクトリを制限(chroot)した専用アカウントを作る - それマグで!

gitコマンドでbranch表示するとlessされるので 常にno-pagerしたい

git のpager 設定したらbranchまでpager 表示される

それは望んでないんだわ。

f:id:takuya_1st:20180213145605g:plain:w300

特定のサブコマンドだけページャーしたい

git のサブコマンドでも git diffページャーしたいけど、 git branchページャーしたくない。

ページャー設定してしまうと すべてのコマンドでpager=less が有効になるらしい。こまった。

特定のサブコマンドだけページャーをless→cat にする。

.gitconfig

[pager]
  branch = cat

コマンドから

git config --global pager.branch cat

これで解決。

参考資料

man git-config

nginx + php-fpm で display_startup_erros=on にしてシンタックスエラーを表示する。

nginx と php の連携をしてphpシンタックスエラーを表示する

php-fpm 側の設定をしてしまうと、サイトごとやファイルごとに設定できないので、困ってた。

  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    include snippets/fastcgi-php.conf;
    fastcgi_param   PHP_VALUE "display_errors=on
        display_startup_errors=on
        error_reporting = E_ALL
        error_log = /var/log/nginx/foo-bar.error.log
    ";
}

順番を逆にすると動かない。。。

fastcgi_pass が逆になると動かない。なんでや

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_param   PHP_VALUE "display_errors=on
        display_startup_errors=on
        error_reporting = E_ALL
        error_log = /var/log/nginx/foo-bar.error.log
    ";
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

passより前に書かないと設定が有効にならない。何だこれハマるぞ。

今回、表示されなくてハマった動作環境はコレ。もしかしたらubuntu / debian のinclude の書き方と関係あるのかな~。

PHP Version  7.0.25-0ubuntu0.16.04.1
nginx version: nginx/1.10.3 (Ubuntu)

npm でインストール済み一覧を整理しアンインストール。

インストール済み一覧を表示する。

インストールの結果を表示するには depth

takuya@~$ npm list -g --depth=0
/usr/local/lib
├── hubot@2.19.0
├── jshint@2.9.5
├── jslint@0.11.0
├── less@2.7.2
├── npm@5.6.0
├── uglify@0.1.5
├── uglify-js@3.1.3
├── uglifyjs@2.4.11
├── undefined@0.1.0
├── update@0.7.4
└── upgrade@1.1.0

インストール一覧を見れる。

インストールした結果の一覧を見ることで、インストールしたものを明示的に消せる。楽。

npm list で検索結果が。。。

ふつうに一覧を検索すると大変なことに。

npm -g list

インストールされてるパッケージ結果が、、、すげぇ多すぎ。 インストール一覧を見るとゴチャゴチャ

  │ │ │   └── os-tmpdir@1.0.2 deduped
  │ │ ├─┬ figures@1.7.0
  │ │ │ ├── escape-string-regexp@1.0.5 deduped
  │ │ │ └── object-assign@4.1.1 deduped
  │ │ ├── lodash@4.17.4 deduped
  │ │ ├── mute-stream@0.0.6
  │ │ ├── pinkie-promise@2.0.1 deduped
  │ │ ├── run-async@2.3.0 deduped
  │ │ ├── rx@4.1.0
  │ │ ├─┬ string-width@1.0.2
  │ │ │ ├── code-point-at@1.1.0 deduped
  │ │ │ ├─┬ is-fullwidth-code-point@1.0.0
  │ │ │ │ └── number-is-nan@1.0.1 deduped
  │ │ │ └── strip-ansi@3.0.1 deduped
  │ │ ├── strip-ansi@3.0.1 deduped
  │ │ └── through@2.3.8 deduped
  │ ├── minimist@1.2.0 deduped
  │ ├─┬ mkdirp@0.5.1
  │ │ └── minimist@0.0.8
  │ ├─┬ npmlog@2.0.4
  │ │ ├── ansi@0.3.1
  │ │ ├─┬ are-we-there-yet@1.1.4
  │ │ │ ├── delegates@1.0.0
  │ │ │ └── readable-stream@2.3.3 deduped
  │ │ └─┬ gauge@1.2.7
  │ │   ├── ansi@0.3.1 deduped
  │ │   ├── has-unicode@2.0.1
  │ │   ├── lodash.pad@4.5.1
  │ │   ├── lodash.padend@4.6.1
  │ │   └── lodash.padstart@4.6.1
  │ └── object-assign@4.1.1 deduped
  ├── titleize@1.0.0

えっと、ドレをインストールしたっけ

深さを指定して検索すると何を入れたか解るので助かったのでメモ。

npm list -g --depth=0

不便なので、alias を作っておく

alias npm_installed='npm list --depth=0 '

npm_installed -g 

アンインストールしてみた。

takuya@~$ npm -g uninstall  pug
removed 57 packages in 0.706s

pug だけで 60 近いパッケージに依存してる。さすがパッケージ地獄のnpm だった。

インストールでえらーになったときに困った。

どのパッケージがぶっ壊れたのかを探してて地獄を見た。

npm で gitbook をインストールした

takuya@~$ npm -g install gitbook gitbook-cli
npm WARN deprecated ignore@3.1.2: several bugs fixed in v3.2.1
npm WARN deprecated tough-cookie@2.2.2: ReDoS vulnerability parsing Set-Cookie https://nodesecurity.io/advisories/130
npm WARN deprecated node-uuid@1.4.8: Use uuid module instead
/usr/local/bin/gitbook -> /usr/local/lib/node_modules/gitbook-cli/bin/gitbook.js
/usr/local/bin/gitbook -> /usr/local/lib/node_modules/gitbook/bin/gitbook.js

> fsevents@1.1.3 install /usr/local/lib/node_modules/gitbook/node_modules/fsevents
> node install

[fsevents] Success: "/usr/local/lib/node_modules/gitbook/node_modules/fsevents/lib/binding/Release/node-v59-darwin-x64/fse.node" is installed via remote
+ gitbook-cli@2.3.2
+ gitbook@3.2.3
added 1312 packages in 36.976s

2つ入れるのに、ほぼまっさらな状態から、1312 パッケージですか。。多いな。

npm インストールでぶっ壊して復旧に1時間近くかかったのでメモ