それマグで!

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

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

動的に複数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から確認する。

フレッツ網内折返しのv6 で拠点間を単純にIPIP/GREでトンネル接続してVPNする。

フレッツのv6網の網内同士で通信したい。

フレッツのv6オプションを申し込んだら、フレッツ網内(広域イーサネット)内部での通信ができるようになる。しかも追加料金無し!

これはいいオモチャになりそうだとずっと思っていて、ようやく一通りをLinuxルータで扱えるようになったのでメモとして残します。

フレッツのIPv6オプション

このオプションが有ると、インターネットを経由せずに通信が可能です。

f:id:takuya_1st:20190506142217p:plain https://flets.com/v6option/

初期ONに切れてる人もいるようですが、私個人としてはデフォルト有効は素晴らしいのではないか、などと思ってる。ISP経由しなくても隣近所の一般のご家庭と通信ができるようになる。しかも無料で。NTT東西がNTT法で縛り付けられた結果で生まれた謎のインターネット、それが広域イーサネットです。

NTTでフレッツ・v6オプションを契約している人は切れた方がいい(デフォルト設定でのセキュリティは皆無) - Qiita

設定例

今回はどちらの拠点間もLinuxルーターで構成することにした。

## mode ipip6 
## 拠点1ルーター
ip -6 tunnel del tun1 mode ip4ip6 remote 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  local 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
ip -6 tunnel add tun1 mode ip4ip6 remote 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  local 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
ip link set tun1 up
ip addr add 172.16.1.2/30 dev tun1
ip route add 192.168.2.0/24 via 172.16.1.1 dev tun1
iptables -I INPUT -i tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -j ACCEPT
iptables -I OUTPUT -o tun1 -j ACCEPT
iptables -I FORWARD -o tun1 -j ACCEPT

ローカル側とリモート側の違いは remote と local だけなので、同じ設定をリモートとローカルを入れ替えて通すだけ

## 拠点2ルーター
ip -6 tunnel del tun1 mode ip4ip6 local 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  remote 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
ip -6 tunnel add tun1 mode ip4ip6 local 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  remote 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
### 以下IP以外はヤッてることが同じ
ip link set tun1 up
ip addr add 172.16.1.2/30 dev tun1
ip route add 192.168.1.0/24 via 172.16.1.1 dev tun1
iptables -I INPUT -i tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -j ACCEPT
iptables -I OUTPUT -o tun1 -j ACCEPT
iptables -I FORWARD -o tun1 -j ACCEPT

上記設定に必要なもの

Linuxカーネルのモジュールのロード

modprobe ip6_tunnel

パケットのフォワーディングをできるような設定(ルーターに使ってるなら最初から入れてるはず)

$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

rp_filter  はオフ

$ sysctl net.ipv4.conf.tun1.rp_filter
net.ipv4.conf.tun1.rp_filter = 0

greの場合。

ipip6(ip4ip6) のところが、grev6 になる。

ip -6 tunnel del tun1
ip -6 tunnel add tun1 mode grev6 local 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  remote 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b

GRE のパケットを許可する

iptables -A INPUT -p gre -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT

拠点間通信の速度

Linux ルータの限界が200Mbps 程度なのでそれまで出てた。速度上限がわからない。上限が見えないなんて、サイヤ人みたいだな。

フレッツのv6オプションについて知っておくこと。

広域イーサネットでIPv6で通信ができる。IPv6は自動的に払い出される。そして半固定。NTT側からRAで払い出される。

ひかり電話契約の有無で、取得方法が異なる。ひかり電話なしの場合、RAで取得する。ひかり電話契約があるとNTTのHGWからDHCPv6-PDで払い出される。*1

いずれの場合もv6 対応したOSを挿すだけでv6が使えるようになる。

v6広域イーサネットを経由してインターネットに出ていくにIPoEを使うには契約が必要。だが、インターネットに出ていかないならISP契約が必要ない!でも通信はできる。あとはわかるな。

IPv6があるとフォールバックする

IPoE契約してないPPPoEのISP(IPv4)のまま、v6を有効にするとインターネットつながらない「壊れたv6インターネット」になってしまう。そのためインターネット接続開始時に遅延を感じてしまう。

これは、IPv6通信が失敗するまでIPv4を通信をしないv6優先のためで、iOSなどはSafariでページを開く際にこのフォールバックが発生し体感でモタツキを感じてしまう。

フォールバックによる遅延防止→IPv6 をLAN内部に展開しない

拠点間通信にv6を使うのであれば、ルーターだけIPv6を受け取ってLAN内部はv4で運用すれば良いわけです。つまりLAN内部へフレッツIPv6のパケットを通さなければ問題は解決する。

iptables(ip6tables) で v6 のLAN内部へFORWARDを止めてしまえばいい。

今回はルーターだけにv6 アドレスを持って拠点間通信させる予定。なので ipt6ables のINPUTでルーター(CPU)側にだけパケットを通せば、フォールバック問題は見て見ぬふりができる。

v6 インターネットへLANを公開しない

ip6tables でRA/DHCPv6 などICMPパケットを止めてしまえるので、LAN内部の各種機器がフレッツv6 アドレスを受け取らずにすみ、LANがインターネットに公開されることもなくなる。

ひかり電話ありの場合は、HGWで設定ができる。

ひかり電話なしの場合は、ip6tables で止めてしまえばいい。ググってもパススルーとか対応機器を用意しましょうとかあれこれ書いてあるけど、自由なソフトウェアで構成できないルーターはちょっと・・・

*1: ホームゲートウェイを経由しなければひかり電話なしと基本的には同じと考えていい。 PDあるけど

ubuntu の暗号化インストールのディスクを拡張する

ubuntu を暗号化ディスクでインストールすると

ubuntuを暗号化ディスク(dm-crypt) でインストールすると、LVM on LUCKSでインストールされていました。

ノートPCなど物理的に紛失しそうなデバイスは暗号化ドライブを使ったほうが無難ですし、SSD/HDDを物理的に強奪されるリスクを考えると暗号化ディスクのほうが無難なので、暗号化ディスクにしていた。

とくにUSBメモリにインストールしたUbuntuディスクには暗号化ドライブが望ましい。

USBメモリの容量拡張で dd で移動したとき、暗号化ドライブの取扱いを確認したのでメモ。

LVM on LUCKS

ubuntu の暗号化パーティションはLVMが暗号化ドライブの上に構築している

ディスクの構成を lsblk で確認すると次の通り。

sda                       8:0    0 223.6G  0 disk  
├─sda1                    8:1    0   512M  0 part  /boot/efi
├─sda2                    8:2    0   732M  0 part  /boot
└─sda3                    8:3    0    36G  0 part  
  └─sdb3_crypt          253:0    0    36G  0 crypt 
    ├─ubuntu--vg-root   253:1    0    28G  0 lvm   /
    └─ubuntu--vg-swap_1 253:2    0     8G  0 lvm   [SWAP]

ubuntuが入っている root ファイルシステムスワップは crypt デバイス上に存在する。 起動時は /boot, /boot/efi から起動するので efi ブート中に cryptsetup で暗号化を解除してくれる。

LVMなのでリサイズは通常の方法と変わらない。

実は、ここがあまりに簡単すぎて拍子抜けだったのだが、容量の拡大・縮小は、通常のLVMを用いた処理と何ら変わらない。本当にdm 関連は便利ですね。

手順

次の手順で拡張した。 起動できるUSBドライブが1つ必要

  1. ubuntu のインストールUSBを作る
  2. インストール用USBでLiveとして起動する(インストールしないで使う)
  3. 暗号化ドライブを解除
  4. gdisk/fdisk でパーティションを拡張
  5. LVM を拡張
  6. e2fsck / resize2fs でファイルシステムを拡張
  7. 再起動

ブート後にターミナルを開く

ターミナルを開いたら、暗号化ディスクにアクセスできるようにする

sudo cryptsetup luksOpen /dev/mapper/sbd3_crypt my-crypt-drive

このコマンドは、次のようになっている。

sudo cryptsetup luksOpen $DEVICE_PATH $VolumeName

これで準備完了

gdisk や gparted でディスクを変更

ディスクの容量を確保する

sudo gdisk /dev/sda

LVM で容量を確認

sudo pvs 
sudo vgs 

追加した容量分が、PV/VGに増加していることを確認する。

lvextend で容量を割り当てる

sudo lvexnted -l +100%FREE ubuntu-vg/root

ファイルシステムを拡張

最後に、LV上に展開されているファイルシステムを拡張する 私の場合EXT4なのでEXT4の手順に従う

sudo e2fsck -p /dev/mapper/ubuntu--vg/root

チェックが終わったら、パーティションファイルシステムを拡張する。

sudo resize2fs /dev/mapper/ubuntu-vg-root

再起動

マウントしてみたり、テストして無事に終わったら、再起動

まとめ

暗号化ドライブをつかっていても、 LVM on LUCKS は、LVM上にLVMを作っているような感じで、特に新しい知識も必要なく、リサイズすることができた。

暗号化ドライブなので、扱いが面倒かなと思ったけど、全然そんなことなかった。

いまのところ暗号化ドライブを使っていて特に問題はないので今後も使っていきたい。

UPnPでポートを開放を試し、ルータのUPnPの設定をテストする。

UPnPが正常に動いているか確認したい。

UPnPで、クライアントからルーターにポートをリクエストして、自分宛てにポート転送してもらう。

ルーターIPv4で動いてるとポートフォワーディングを自動的にFirewallに書いてくれる。

Mac からUPnPをリクエストする。

UPnPを設定する方法は、ルーターごとに違うのでそちらに書くとして。

UPnPのリクエストを手軽に試したらどうしたら良いだろうか?

PortMap というMacの app を見つけた。

f:id:takuya_1st:20190426180627p:plain

実際に試してみた。

これが、UPnPでポートをリクエストしてルータから割り当て貰うのに成功した図。

f:id:takuya_1st:20190426121919p:plain

UPnP試せるのは良い。

TCPの細かい仕様を知らなくても手軽にポート開放ができたり、UPnPが動か調べられるのは良い。

とくに、UPnPがマルウェアに悪用されてポート開放されたりするので、最近はオフにしたいことが多いので、ちゃんとオフにできたか調べられるのは良い。

関連サイト

https://codingmonkeys.de/portmap/

https://github.com/monkeydom/TCMPortMapper/releases

動的にscript を追加したときに読み込みを待つ(body の最後とかheadに足したあと待つ)

動的に script タグを書き出したとき

関数が欲しくて、あとでチョコっとScriptを書き出すJSを書いたときに、そのスクリプトがロードされるのを待つ。

スクリプトがロードされないと使いたい関数がロードされないもんね。

onload でできた

意外にシンプルな解決策で解決したわ。

サンプルコード

var src_url = 'http://example.com/example.jp'
var load_func = function(){
  console.log("loaded")
}

(function(src_url, callback){
  document.body.appendChild(function(src_url, callback) {
    var u = new URL(src_url);
    sc = document.createElement("script");
    sc.type = "text/javascript";
    sc.src = u.toString();
    sc.onload = callback;
    return sc;
  }(src_url,callback));
})(src_url, load_func );

もっと、then() とか promise 使おうかと思ったけど、すごく簡単に解決したのでこれで良い。

2019/05/16 追記

ロードが1つだけってことはないので、複数のscript url をロードするようにPromiseに仕立て直した。

http://takuya-1st.hatenablog.jp/entry/2019/05/16/194721

rclone でサーバー(gdrive/owncloudなど)のファイルをローカルにFUSEマウントする。

rclone に mount オプションを見つけたのです。

早速使用してレポートします。

rclone mount でリモートをFUSEとしてマウントする。

マウントした結果がこちら

f:id:takuya_1st:20190422125207p:plain

マウントコマンド(シンプルでいい)

rclone mount remote locale-dir

REMOTE は名前で識別すると楽なので config から読み出すといい(詳しくは --config )

使用感

初回起動はディレクトリの一覧を読み込むので少し時間がかかる。

f:id:takuya_1st:20190422125417p:plain

読み込んでしまえば、あとはファイルを開くときやサムネイル転送に時間が掛かる程度。

ファイルを開いてしまえばあとは(キャッシュされるのかな?)開くの早い

アップロード:ローカル→リモート

ローカルにファイルを作れば、ファイルの転送が始まる。自動的に検出して転送してくれる。

Macの場合iCloud Driveのようにゲージが表示されて

削除:ローカル→リモート

削除もリモートに反映される。こっちは早い。

楽ちん。

rclone mount 

具体例

mkdir /home/takuya/mounts/data
rclone mount $remote /home/takuya/mounts/data

これでいいのだ。

調べてないこと

同時に複数人が編集をしたときの衝突。

活用法を考える。

  • Dropbox代わり
    • リモートの転送先をいじればDropboxなど専用のクライアントが一切なしに、保存先を自由にできる
  • git 代わり
    • 有料G○○gle Drive などバージョンをアーカイブしてくれるサーバーならバージョン管理にgitを嫌がるデザイナ*1でも使いやすいかもしれない
  • SFTPクライアント代わり

たとえば、docker にファイルシステムとかいらんのかもしれない。仮想マシンなどもrclone でリモートをマウントすれば・・・・

*1:* 滅びろって思うけど

magick で写真のプライバシーのメタ情報(exif)やサムネイルを削除

写真を加工してもサムネイルが更新されない。

こういう場合は、写真(JPEG)に埋め込まれている。サムネイルが更新されない可能性がある。もしくはブラウザ(Finder)のキャッシュ。

私の場合、convert で色を反転させたけどサムネイルが更新されなかったので、JPEGexif:thumbnail やSOFが更新されてないんだろうと推測

写真のEXIF を削除するコマンドと同様にできる

mogrify -strip sample.jpg 

または

convert -strip a.jpg b.jpg

サムネイルの更新もstrip でできるって少し考えたら気づいただろうけど、わざわざ検索してしまったので、メモを残すことにした。

私的なプライバシー情報を剥がす

このやり方は、以前にも書いたことがある。GPSなどの情報を消す方法と同じ。

個人情報を削除するコマンドでサムネイルを剥がせる。

takuya-1st.hatenablog.jp

もし、exif の特定情報だけを更新したいときは

これも以前に書いた。Exiftool でできる。

takuya-1st.hatenablog.jp