それマグで!

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

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

sshfs でFUSEマウントしたフォルダへの転送速度を測定した

sshfs でFUSEマウントしてみました。

sshfs は gvfs などネットワークフォルダとしてSSHを扱えるものですね。

sudo apt install sshfs

マウント

mkdir mnt
sshfs takuya@192.168.11.125:/home/takuya mnt

転送してみました。

takuya@:Desktop$ dd if=test.img of=mnt/test.img 
2000000+0 レコード入力
2000000+0 レコード出力
1024000000 bytes (1.0 GB, 977 MiB) copied, 116.963 s, 8.8 MB/s

やっぱりFUSEは速度でないですね。CPU周りの問題なんでしょうか

それでも gvfs よりは速いです。

gvfs でssh FUSEマウントしたファイルシステムの書き込みが遅い

gvfs でマウントしつかってて、どうも遅い。

速度測定してみた

あまりに遅いので、1GBの転送は途中で諦めてしまった。

takuya@:Desktop$ dd if=test.img of=/run/user/1000/gvfs/sftp:host=192.168.11.125/home/takuya/test.img
^C97031+0 レコード入力
97031+0 レコード出力
49679872 bytes (50 MB, 47 MiB) copied, 126.678 s, 392 kB/s

10MBで試した結果がこちらです。

takuya@:takuya$ dd if=/dev/urandom  of=test.img bs=1k count=10000
10000+0 レコード入力
10000+0 レコード出力
10240000 bytes (10 MB, 9.8 MiB) copied, 12.7177 s, 805 kB/s

なんどか試してみましたが、sftp は 1MB/s で、afp/smb は 3MB/s が限界でした。FUSEなのでマウントしてるLinuxクライアント側のメモリ量やCPU速度にも影響を受けますが、めっっちゃ遅いですね。

ssh の転送速度を測定をしてみる

SSHの速度を測定しようと思い立った。

なんかネットワークが遅いので、SSHでの速度測定をしてみることに。

速度測定するコマンド

ファイルの準備

dd if=/dev/urandom  of=test.img bs=1k count=1000000

転送

cat test.img  | ssh host.tld 'dd of=/dev/null '

ssh でパイプする

ssh でパイプするとファイル転送ができる。

cat test.img | ssh host ' cat - > test.img'

dd は of だけ指定すると標準入力

dd は if / of で指定するけど、標準入力からもととれる。

実際にやってみた例

takuya@:Desktop$ dd if=/dev/urandom  of=test.img bs=1k count=1000000
1000000+0 レコード入力
1000000+0 レコード出力
1024000000 bytes (1.0 GB, 977 MiB) copied, 39.8002 s, 25.7 MB/s
takuya@:Desktop$ cat test.img  | ssh myhost 'dd of=/dev/null '
sign_and_send_pubkey: signing failed: agent refused operation
2000000+0 レコード入力
2000000+0 レコード出力
1024000000 bytes (1.0 GB, 977 MiB) copied, 9.16781 s, 112 MB/s

ファイル書き込みがボトルネックになっていないか

先程の例は、純粋にネットワーク速度に近いものが出ているはず。ファイルに書き込んでみたいと思う

この場合は、ファイルIOがメモリキャッシュされないように結構な量を書き込む必要がある。たぶん3GBくらい

SSD 相手に書き込んだとき

takuya@:Desktop$ cat test.img  test.img test.img | ssh host.tld ' dd of=test.img'
sign_and_send_pubkey: signing failed: agent refused operation
6000000+0 レコード入力
6000000+0 レコード出力
3072000000 bytes (3.1 GB, 2.9 GiB) copied, 30.6751 s, 100 MB/s

HDDを相手に書き込んだとき

takuya@:Desktop$ cat test.img test.img test.img  | ssh host.tld ' dd of=./mount/96.作業用/test.img'
sign_and_send_pubkey: signing failed: agent refused operation
6000000+0 レコード入力
6000000+0 レコード出力
3072000000 bytes (3.1 GB, 2.9 GiB) copied, 35.9622 s, 85.4 MB/s

メモリキャッシュがきいてる気もする。が、まぁ実際に使ってる速度に近い測定結果ナノではないでしょうか。

あくまで概算

ssh は圧縮されたりするので、本当のネットワークの速度よりも若干高くなる。 /dev/urandom を使うことで圧縮されないようにはしてるけど。

我が家の環境では 111 MB/s でているようである。

ところが、Samba経由したり WebDAV 経由すると 3MB/s くらいしかでない。こまった。

curl でもできる

curl を使ってもできる

これはSFTPで速度測定になる。

takuya@:~$ curl sftp://192.168.11.125/home/takuya/test.img > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2929M  100 2929M    0     0  42.3M      0  0:01:09  0:01:09 --:--:-- 44.0M
100 2929M  100 2929M    0     0  42.3M      0  0:01:09  0:01:09 --:--:-- 42.3M

/dev/urandom の速度

ちなみに、/dev/uramdom でdd したときの速度が 25MB/s 程度のCPUで測定しました

gvfs あたらめ gio でログインしたときだけネットワークのドライブをマウントする

Ubuntu のGVSマウントをログイン時にしたい。

ubuntu デスクトップのログイン時のマウント機能と同等のマウントしたい

fstab や autofs でもできるが、そっちはシステム全体なのでわかりやす。gvfs は面倒かと思ったけど、使ってみたらgvfs が圧倒的に楽だったのでメモ。

管理の側面から考えると、ログイン時にマウントされる方が嬉しいし。そもそもmount でマウントポイントが見れないのでいいかな

これを使うメリット

ネットワークの越しのマウントに、root 権限も、マウントポイントも要らないので、mountコマンド初心者でも使いやすい。

gvfs とは

最近は gio という名前になっているようです。

いろいろな、ネットワークのドライブをFUSEでマウントしてくれたりする。Ubuntuだと次の「アカウントの追加」で追加設定したストレージに使われている。

f:id:takuya_1st:20190520162638p:plain:w200

実際にマウントされたら次のようになる。左の柱に出てくるネットワークの場所ですね。

f:id:takuya_1st:20190520162721p:plain:w200

gvfs はマウントポイントがわかりにくい

gvfs でマウントされている

gvfs-mount -l

これは、mountで出てくる。けど分かりにくいかもしれません。

takuya@:~$ mount | grep gvfs
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
takuya@:~$ 

ちなみに、gvs-mount はいまは gio を使う

gio moout -l 

gio/gvfs でネットワークをマウントしてみる。

gio mount "cifs://takuya@my-nas/takuya's%20home/"

他にも、SSHフォルダをSFTPでマウントするには。

gio mount "ssh://takuya@my-sftp-server/"

などと、URLでプロトコルを指定してマウントしFUSEとして使えるのでめっちゃ便利。あれ、もうローカルにストレージが要らなくね?

など手軽にマウントできるじゃん。

GUI ツールで管理できる。

gigoloという管理ツールがありました。

sudo apt install gigolo

f:id:takuya_1st:20190520163613p:plain

gigoloGUIで管理できる。いいじゃん gigolo

これ使えば、システム全体に関係なくマウントできるから、ルート権限もいらないしめっちゃ楽じゃん

f:id:takuya_1st:20190520163626p:plain

ログイン時に自動的に接続したい

touch ~/MountAtLogin.sh
chmod +x  ~/MountAtLogin.sh

ファイルの中身を書く

## ~/MountAtLogin.sh
gio mount ssh:takuya@my-server/

最後に

Ubuntu自動起動するアプリケーション に登録して終了

これで、ログイン時に再接続されるのでWindowsのネットワーク・ドライブのような運用ができる。便利。

2019-05-24 追記

手軽だけど、どうも速度が遅く、HDMIキャプチャの録画ファイルの保存に失敗しているようである。そこで速度測定してみました

どうも、gvfs でマウントしたドライブはFUSEの呼び出しループの中で、CPU処理に影響を多分に受けていると思われる。

あまり多量のファイルを扱うのは得策でないと思う。

参考資料

wordpress をniginx のリバースプロキシの背後に設置した場合の mixed contents 対策

nginx の背後に wordpress を設置したら mixed content

wordpress を設置したんだけど、 .htaccess も使いたいと言われて、nginx から apache+php-fpm にリバースプロキシをした。するとhttp/https混在コンテンツになってしまった。

対策。

nginx → apache で リバースプロキシするさい X-Forwarded-Proto を追加する。

nginx 側

     proxy_set_header X-Forwarded-Proto https;

nginx などリバースプロキシでhttpsだとメモを残してヘッダにつけて送る(今回は HTTP_X_FORWARDED_PROTO  を使う)

wordpress 側 wp-config.php

<php
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
  $_SERVER['HTTPS']='on';
  }

HTTP_X_FORWARDED_PROTOをphp 側で受け取って HTTPS 変数を上書きする。

その他の対策方法

  • nginx → apache2 のリバースプロキシをオレオレ証明書https でやるとか。
  • apache2→ php-fpm で構成して apache2 から https だよと宣言するとか

まぁいろいろと考えられるけど、一番手っ取り早いのは wp-config.php を弄ることだった。

これは、CloudflareやAWS ELB などでHTTPSをONにした場合にも同じことが言える。

chrome の開発ツールのConsoleの履歴を消す。

Chrome の devtool の履歴を消す方法。

ChromeのJSコンソールに、パスワードとか直書きで書いてしまったときに。

パソコン本体にロックが掛かるようにしておけば全く問題ないのだけれど、画面共有中にうっかり誰かに見られても困るだろうし。

履歴を消すには、右クリック

f:id:takuya_1st:20190516201309p:plain
me

昔は、もっとめんどくさかったのに。簡単になってるのでメモ

動的に複数script を追加したときに読み込みを待つ。Promise版(body/headに足したあと待つ)

JS で動的ロードして関数を追加する。

適当な関数を突っ込んで、ロードされるのを待ってから、関数を使いたい。 とりあえず、script.onload で解決することはわかってるんだけど。読み込みたい関数が複数だと、全部ロードされるのを待つのをコールバック・チェーンで待つのはしんどかったので、Promise.allにした。

外部JSを追加してロード待つ

document に script タグを動的に追加して、onload 関数を仕込む。それをPromiseにして、複数のURLが全部ロード終わってResolveされるまでを、Promise.all()で待つ。

function import_script( urls ){
  return Promise.all( urls.map(function(url){return new Promise(function(resolve,reject){
    var script = document.createElement('script');
    script.src = url;
    script.onload=resolve;
    document.head.appendChild(script);
  })}));
}

ロード待ってからなにかする。

import_script( ["https://example.com/example.js", "https://example.com/example2.js"] ).then(function(){
  // main 
  console.log('loaded');
 // ここにロード後に実行したい処理を書く。
})

なんでこんな事やってるのか?

「babel とか webpackでトランスパイラすりゃいいじゃん?」

違うんだ、そうじゃないんだフロント開発じゃないんだ。

Chrome拡張で、メインページにスクリプトをInjectして追加したいとか。Bookmarkletでページにスクリプトを追加してなにかやりたいとか。

そういうときに足りないライブラリや、ショートカット関数を追加したい時があるんですね。

関連資料

気づいたら、ずっとおなじようなことやってんだww私はwww「まるで成長してない」

sed で数字の繰り返しを正規表現で置換するには、文字指定が違う

sed で数値指定する

数字のマッチは、次のようになる。

sed '/[[:digit:]]/'
sed '/[0-9]/'

正規表現に親しんでいると、つぎように \d を書きたくなるが、これは動かない。

sed '/\d/'  # 動かない。

sed で複数桁の数字にマッチさせる。

動かない

sed '/[[:digit:]]+/'

動く

sed '/[[:digit:]]\+/'

元データ:サンプル

nl とfor を使ってぱぱっとデータを作ります。

takuya@bookmarklets$ for e in aaa bbb ccc ; do echo $e; done | nl
     1  aaa
     2  bbb
     3  ccc

sed で行頭の数字を置換してみます。

行番号を sed コマンドで除去を試みてみます。

takuya@bookmarklets$ for e in aaa bbb ccc ; do echo $e; done | nl |  sed  's/[[:digit:]]\+\s\+//g'
     aaa
     bbb
     ccc
takuya@bookmarklets$ for e in aaa bbb ccc ; do echo $e; done | nl |  sed  's/[0-9]\+\s\+//g'
     aaa
     bbb
     ccc
takuya@bookmarklets$ for e in aaa bbb ccc ; do echo $e; done | nl |  sed  's/\d\+\s\+//g'
     1  aaa
     2  bbb
     3  ccc

まとめ

  • \d は動かないので [[:digit:]] or [0-9] を使う
  • + は解釈されないので \+ を使う。

この辺は ed / vi の置換に似てるね。

ちなみに、私が使っているのは gsed ( gnu sed ) です。

2019-05-16 追記

gsed

参考資料

regex - How to match digits followed by a dot using sed? - Super User

sed 文字列が含まれる行を削除する

sed で、文字列を探し、文字列が見つかった行を消す。

sed -e '/search/d'

検索語 search を含む行を削除。 これで指定文字列を探してその行を除去することができる。

行をまるごと消すのに、改行コードは必要ない。

ありがちなミス。

sed  's/search\n//' ## これはうまくいかない

改行コードを送るはめんどくさい。なぜなら、sedは1行ずつ処理することが前提だからだ。

コマンドの動作サンプル

3行のテキストサンプルを作ります。

for e in aaa bbb ccc ; do echo $e ;done  | nl
     1  aaa
     2  bbb
     3  ccc

ここから bbb にマッチする行を消してみます。

for e in aaa bbb ccc ; do echo $e ;done  | nl | sed -e '/bbb/d'
     1  aaa
     3  ccc

f:id:takuya_1st:20190515173803p:plain

使用例: sudo reboot を削除する。

コマンドの履歴から。sudo reboot を探してコマンド履歴をきれいにする。 reboot が履歴検索で暴発したらめんどくさいので。

cat .bash_history  | sed  -e '/^sudo reboot/d'  

ちゃんと消えているか確認。

cat .bash_history  | sed  -e '/sudo reboot/d'  |  grep 'sudo reboot' | wc -l 
0

awkperl / ruby などでもできるが。

sed が一番手っ取り早いし、sed で置換と行削除を覚えておくと捗りそうですよね。

てか、ゴミデータが混じったときに行ごと削除するのは、めっちゃ使うんで丸暗記してもいいくらい

参考資料

https://qiita.com/takech9203/items/b96eff5773ce9d9cc9b3

git clone 時にリモートのブランチ名を指定して clone する

git clone 時にブランチ名もまとめて指定したい

あとでチェックアウトすりゃいいんだけど。よく使うものは、まとめて指定してシェルスクリプトにしといたほうが楽だし。

Slackなどで人に伝えるとき、コマンドで送ったほうが楽だし。知っておいて損はない。ブランチ名を含めて clone するコマンドはこちら。

git clone -b  $ブランチ名  $レポジトリURL

たとえばこんな感じ

git clone -b issue/1024 git@github.com:takuya/node2shell.git

ブランチを直接にclone できたらほんの少しだけ楽かもしれない。

iPhoneとiCloudに認証エラーにでロックのとき問合わせ電話するAppleの電話番号

icloudiPhone で2FAの認証に失敗した

2FA の認証コードは、失敗することがある。iPhone/Mac に送信される2ファクタ認証のコードとセンターに登録されるコードが1つずれることがある。複数回認証コードを送ったときに発生する。

認証コードを送信する画面で放置したとき、久しぶりのログインなどで結構な頻度で起きる。

24時間待つしか無い

2ファクタが有効なApple ID でログインに完全に失敗しロックしたときには、ロック時間がなんと24時間です。急いでいるときなどは本当に致命的です。

直電話するには

問い合わせ窓口の電話番号がある

0120-277-535

ただ、直接コールすると待ち時間が発生する。また、直接電話してもロックは解除されない。

直接電話するのは、認証コード以外の「急いで解決したい問題」があるときです。

なんで電話番号が必要?

認証コード通さないと問い合わせもできない。

Appleのサポートにログインするためには、2FAが必要で、2ファクタ認証にトラブルが起きたら問い合わせも容易ではない。

認証コードトラブルが起きときの問い合わせ

別アカウント作って問い合わせるのが手っ取り早いと思う。

2FA の利便性と堅牢性

セキュリティ的には向上するが、Appleバイスを紛失したり、交通事故などで破損してしまったらiCloudにアクセスする手段がない。

堅牢な故に、利便性が損なわれていることを常に意識しておこう。

2FAのデメリットを意識し、2FAの他にパスワードの強化やログインメールアドレスの秘匿などのセカンドベストな対策も検討していいと思う。

iPhoneを探すでiPhoneを探せない。

iPhoneを探すという便利な機能があるのだが、デバイスが1台も手元にないと一切ログインができなくなる。

iPhone/iPad/macOS が手元にあるかSMSが受信可能である必要がある。

2要素認証をするのであれば、万が一のために別の電話番号を登録しておくこともお忘れなく。*1

Appleファミリー共有や、家族の電話番号を予備として登録しておくこともお忘れなく。*2

うっかり2FAを有効にしてしまったら

2週間以内であれば解除できるので、その中で、有効性と利便性を十分検討する必要がある。

定期的にログインして2FAが送信されるデバイスを確認

2FAは定期的にログインして2FAの有効性を確認する必要があります。いざというときに2FAが通知されない恐れがあるので、各デバイスにちゃんと通知されるか、数ヶ月に1度はたまに確認しておくとGoodです。 定期的なパスワード変更並みに、めんどくさい羽目になります。

参考資料

サポートや修理サービスに関する Apple へのお問い合わせ - Apple サポート

*1: 認証のためだけにSMSなSIMカードを契約し続けるのは本当に馬鹿らしい話ですけど。

*2: ここまできたら、セキュリティ向上というより囲い込みを疑ってしまう。

npm で自作のパッケージをgit(gitlab/githubなど)からadd(インストール)する

npm で自分のパッケージを使いたい

npmjs.com にパッケージを公開しても良いんだけど、既存のパッケージをちょっと触ったくらいのパッケージを公開するのは忍びない。

自分のgitレポジトリのnpm パッケージを npm add したいとき。

git のレポジトリを package.json に登録する。

npm ので、gitレポジトリをインストール

npm init 
npm install "git+ssh://git@gitlab.example.com/takuya/my-sample.git"

package.json

インストール後のpackage.json はこんな感じになる。

{
  "name": "sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "my-sample": "git+ssh://git@gitlab.example.com/takuya/my-sample.git"
  }
}

アップデートしたいとき。

レポジトリ側をアップデートしたあとの、利用側では次のようにする。

npm update

npm で自作コマンドを自分のためだけに一瞬だけnpmjs公開することを通してnpm公開を学ぶ

経緯

パブリックな名前空間を自分専用に使うのは、本当は駄目なんだろうけど、npm みてると my own private なパッケージが結構あるので、ヤッたもん勝ちっぽいので試すことに。そりゃ本当は、 private つかえとか 自分のサーバーでnpm registry たてて使えとか、レポジトリを指定しろとか、npm pack して持ち出せよとかいろいろあると思うんですが。

試すだけならpublish 直後72時間以内に忘れずに unpublish 公開を取り下げられる。ちゃんと削除できるので、試すだけなら大丈夫。大丈夫。さきっちょ☆だけ。さきっちょだけだから。

TL:DR

npm adduser
npm init
npm publish 
mkdir other_proj; cd other_proj
npm i $name 
node ./node_module/bin/my-pachakge
npx helo

準備1:アカウント

npm にアカウントを作成する アカウントないと始まらないので! f:id:takuya_1st:20190511002551p:plain

準備2:npm コマンドにアカウントを覚えさせる

npm adduser

f:id:takuya_1st:20190511002557p:plain

ここで覚えさせた adduser 結果は global の設定として ~/.npmrc に書かれる

takuya@~$ cat .npmrc
prefix=/Users/takuya/.lib/node
//registry.npmjs.org/:_authToken=xxxxxxxxxxxxxxxxx

どのユーザーでログインしたのかわからなくなったら

npm whoami

作業1:公開するモジュールを作る

mkdir tekito
cd tekito
npm init

npm のパッケージを作成すると、次のような質問が聞かれる。

takuya@tekito$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (tekito) takuya-1st-npm-examples
version: (1.0.0) 0.0.1
description: 作業用
entry point: (index.js)
test command:
git repository:
keywords:
author: takuya
license: (ISC) GPL-3.0-or-later
About to write to /Users/takuya/tekito/package.json:

{
  "name": "takuya-1st-npm-examples",
  "version": "0.0.1",
  "description": "作業用",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "takuya",
  "license": "GPL-3.0-or-later"
}

package nameを決める。

npm.js に公開されても、他人に迷惑がかからないように、なるべく自分だけの名前にしておく

ライセンス

とりあえず、GPLでしょやっぱり。GPLは、"GPL-3.0-or-later"と指定します。

test

ここはテストコマンドだけど、後でちゃんと実装する。

git repos 

git repos がアレばどこでもいいと思うんだけど。gitlab とか bitcuket でソース公開してるならそれを書いておけばいいのかな? たぶんnpmjs のパッケージ詳細に掲載される。(試してない)

main ( entry point ) 

これ大事。require したときにこのファイルが最初に実行される。

作業2:コードを書く

index.js にコードを書く

// require ; 最初に実行される。
console.log( "hello from index" );

index.js は main に指定したのでここがrequire 時に実行される。

公開する。

コード書いて、プライベート情報が暴露され得ないと確認したら、公開する

npm publish

確認する。

新しい、プロジェクト(フォルダ)を作って、インストールしてみる プロジェクト(フォルダ作成)

mkdir my-project; cd my-project

公開したやつを持ってくる。

npm i takuya-1st-npm-examples

require してみる。

my-project/requre-test.js

require ("takuya-1st-npm-examples");

require を書いたファイルを実行する。

cd my-project
node requre-test.js
> hello from index 

ここまでで、npmjs に公開とインストールが完了する。

ちなみに、ちゃんとrequire できるのは、global.module.paths にちゃんと反映されているから。

takuya@sample$ node -e 'console.log(global.module.paths)'
[ '/Users/takuya/Desktop/my-project/node_modules',
 '/Users/takuya/Desktop/my-project/node_modules',
  '/Users/takuya/node_modules',
  '/Users/node_modules',
  '/node_modules' ]

コマンドを作る。

次に、npm i 後に使えるコマンドを作る。

自作コマンドを作っておくと npm i するだけでいつもの自分のコマンドがインストールできる。

公開しているパッケージのプロジェクトを開いて。

package.json に "bin" を追加する

bin に指定した名前で コマンドが作られる。

"bin": {
"hello": "hello-command.js"
},

この場合、hello という名前で、 hello-command.js  が実行できるように、node_modules の下にコマンドが作られる。

しかも cmd.exe など Windows 環境でも動くように作られる。

コマンドの中身はjs ファイルだが、shebang や cmd 呼び出しにも対応してくる。windowsだと hello.cmd が作られるはずです。

コマンドの中身を作る。

コマンドの中身を書きます。

#!/usr/bin/env node
console.log("hello takuya san");

コマンドを作ったら公開します。

npm publish

すでに公開している場合は、バージョンを上げてやります。

vim packages.json
## version を上げる
"version": "1.0.4"

または

git add  .
git commit -m 'add'
npm version 1.0.4

なぜ、git コマンドがでてくるかというと、git 管理されているフォルダはgit commit 済みでないと npm version を使えません。

使ってみる。

自分の適当なプロジェクトで 公開したパッケージのコマンドを使います。

npm i takuya-1st-npm-examples

コマンドが作られます。

takuya@ my-project$ ls -l  ./node_modules/.bin/hello
lrwxr-xr-x 1 takuya staff 29 2019-04-17 19:25 ./node_modules/.bin/hello -> ../takuya-1st-npm-examples/hello-command.js

json ファイルに、"hello": "hello-command.js" と指定したのでショートカットが作られています。便利。

自作のコマンドをいつでも便利に使う。

ちゃんとコマンドが動くことが確認できました。

ここまできたら、もうglobal を使っても安心です。

自分のシェル環境に 自作のコマンドをglobal インストールしてしまいます。

$npm -g i takuya-1st-npm-examples

これで、よく使うコマンドをnodejs で記述することが出来て管理もインストールも楽ちんになりました。

プロジェクトにいるときだけ コマンドを使いたい

bin の場所は次になります。

$(npm root)/.bin

インストールしたコマンドをローカル(npm)で使うときは

$(npm root)/.bin/hello 

これを省略するには、npx が使えます。

npx hello

npxは便利なのでglobal に入れておくといいかも。npm i -g npx

npmjs は公共スペース

マナー厨の老害っぽいですが、npmjs は公共スペースなので他人の迷惑にならないようなパッケージ名で後悔しましょう。

(ってうか、gitlab/github などのgitレポジトリをpackage.json で指定するほうがいいよ絶対。)

それか、ちゃんとnpmjs に課金してプライベートを使う

f:id:takuya_1st:20190511002600p:plain

package.json に private : true をちゃんと書くことでプライベートなります。

あと、名前に@をつけてScopedであることを明示するとか

あとはVerdaccioのようなprivate registry を自前で用意して作成するという手もある。

公開を取り下げる。

もし本当に、ちょっと試したいだけだったのなら、ちゃんとunpublish でモジュールを削除すること。

公開後72 時間未満なら、ちゃんと消せるんだよ。

> npm unpublish "takuya-npm-sample" ---foce

今回取り上げたこと

  • npm でパッケージ公開
  • npm でコマンドを作成
  • npm でrequire の main( entry point )

今回取り上げなかったこと

  • module export
  • npm --global と ローカル
  • npm のrequire Path

参考資料

https://qiita.com/TsuyoshiUshio@github/items/850245c5fb40310ede9b

bashのループと数字比較を組み合わせでVPNを接続開始して接続待ち、接続後に処理をする。

bash のサンプルプログラムを考えてた。

よくあるパターンとして、

〇〇を実行して〇〇が△△になるのをまってから、□□する

を考えてみた。

VPN の接続を待機する

今回のサンプルはMacVPNを接続し、接続待ちをし、VPN接続が完了したらルーティングを加える。

vpn の接続

mac の場合は次のようにする。

networksetup -connectpppoeservice "$VPN_NAME"

VPNの接続名は次のようにして取得できる

VPN_NAME=$(networksetup -listallnetworkservices  | \grep interlink )

VPNの接続状態を取得する。

[[ $(networksetup -showpppoestatus $VPN_NAME )  == connected ]];

IPルーティングのテーブルにVPNへの経路を追加する。

ip route add $TARGET_IP/32 dev ppp0

一定間隔で状態をウォッチして、指定時間超えたら失敗とみなす。

これは、bashの数値演算と数値の比較を組み合せる。

while check_status
do
 sleep -1 ;  (( cnt++ )); 
  if (( $cnt > 30 )) ; then return 1 ; done
done

全部まとめたのがこれ。

接続を試行して、接続中を待機しつつ、接続後にIP routing をする。

最初に考えた処理待ちをしながら処理が終わったらXXXするのサンプルとしては良いと思う。

ここでは、コマンドがノンブロッキングな場合を想定している。

VPN_NAME=$(networksetup -listallnetworkservices  | \grep interlink )
TARGET_IP=192.168.111.156

function isConnected(){
  [[ $(networksetup -showpppoestatus $VPN_NAME )  == connected ]];
}
function disconnectVPN(){
  networksetup -disconnectpppoeservice "$VPN_NAME"
}

function connectVPN(){
  #
  isConnected || networksetup -connectpppoeservice "$VPN_NAME"
  cnt=0
  while !isConnected ; do 
    (( cnt++ ))
    printf "${cnt} time  .waiting...\r"
    sleep 1
    if (( $cnt > 30 )) ; then
      echo failed.
      return 1 ;
    fi
  done;
  return 0;
}

function addRoute(){
  echo add route 
  ip route add $TARGET_IP/32 dev ppp0
}

function  main() {
  #
  echo start
  ## 
  connectVPN && addRoute;
  
}

main;

関連資料

bashのif文で数字の比較を評価条件ぱぱっとやる方法(C言語スタイル - それマグで!

git でclone 元のリモートレポジトリのURLを確認

git の clone 元

レポート作ったり、git のURL教えてと言われたときに

git config --get remote.origin.url

または

git remote show origin

clone したら origin に入るので、remote/originから確認する。