DRYな備忘録

Don't Repeat Yourself.

【メモ】なんだかんだでvirtualenvが使いやすかったのでメモ

% pip install virtualenv
% mkdir -p ${HOME}/.venv/default
% virtualenv -p python3 ${HOME}/.venv/default
% echo 'source ${HOME}/.venv/default/bin/activate' >> ${HOME}/.zshrc
% mkdir -p ${HOME}/.venv/myproject
% virtualenv -p python2.7 ${HOME}/.venv/myproject
% source ${HOME}/.venv/myproject/bin/activate
(myproject) % python --version
Python 2.7.10

【Webpack】TypeError: Cannot read property 'watchRun' of undefined

問題

% ./node_modules/.bin/webpack
# 中略
TypeError: Cannot read property 'watchRun' of undefined

調査

解決

% ./node_modules/.bin/webpack --version
3.11.0
% npm install --save-dev -D webpack@4.0
% ./node_modules/.bin/webpack --version
4.0.1
% ./node_modules/.bin/webpack
# うごいた

Pythonの開発環境立ち上げメモ(virtualenvを使った最小構成)

現状確認

% which python
/usr/bin/python
% python --version
Python 2.7.10
% which easy_install
/usr/bin/easy_install
% which pip
pip not found
%
% sudo pip_install virtualenv
% virtualenv -p /usr/bin/python ~/.venv/default
% source ~/.venv/default/activate
(default) % pip install awscli

PROMPTが変わるのうざいな

% export VIRTUAL_ENV_DISABLE_PROMPT=1

デフォルトでdefaultを使うようにしたい

% echo 'source ${HOME}/.venv/default/activate' >> ~/.zshrc

また、何かのプロジェクトで切り分けたい環境があれば

% virtualenv -p /usr/local/bin/python3 ~/.venv/another-project
% source ~/.venv/another-project/bin/activate

とかする。

Chrome拡張の開発でwebpackを使わずにES6のimportを有効にしたい

背景

  • JSのプロジェクトで、特に僕はChrome拡張を作ることが多いんですが、ES6 syntaxを使いたい
  • だいたいのES6 syntaxは、Chrome(現在 65.0.x)で使える
  • ただし、問題は import です

Background Script でimportを使う

medium.com

つまりHTML5準拠のブラウザでは<script type="module" src="..."></script>とすれば、これをエントリポイントとして以下importは解決されるんだけど、ということは逆にmanifest.jsonbackground.scriptsでBackgroundスクリプトを指定するとtype="module"属性を与えられないので、わざわざbackground.pageを使ってそこから<script>しましょうね、という話。

manifest.json

{
    "background": {
        "page": "src/html/background.html"
    }
}

src/html/background.html

<script type="module" src="src/js/background.js"></script>

Use ES6 import in Background Script · otiai10/chrome-extension-es6-import@ecf1267 · GitHub

Content Script でも、importを使いたい、のだが

同様の理由で、manifest.jsoncontent_scripts[i].jsでいきなりimportを使っても

Uncaught SyntaxError: Unexpected identifier

となる。 Uncaught SyntaxError: Unexpected identifier · otiai10/chrome-extension-es6-import@154b321 · GitHub

どうにかして、HTMLを起因としたjsのロードをしたい。

scriptタグのインジェクション

manifest.jsonの表現力では、どうにもcontent_scriptのjsをtype="module"でロードさせることができないので、<script>タグそのものをページのHTMLに挿入すればよかろう、という発想。

まず、manifest.jsonではinject.jsを読ませる

manifest.json

     "content_scripts": [
       {
         "matches": ["<all_urls>"],
-        "js": ["src/js/content.js"]
+        "js": ["src/js/inject.js"]
       }
     ],
     "permissions": [

inject.jsでは、<script>タグの動的挿入を行う。

src/js/inject.js

(() => {
  const src = chrome.extension.getURL('src/js/content.js');
  console.log(src);
  const script = document.createElement('script');
  script.setAttribute('src', src);
  script.setAttribute('type', 'module');
  document.body.appendChild(script);
})();

いい感じに動きそうだが、これでも以下のエラーが出る。

GET chrome-extension://invalid/ net::ERR_FAILED

どうやらネットワークっぽいエラーで、jsのpathが正しく指定されていないか、あるいはもっと別の原因が考えられる。なお、inject.jsconsole.logさせたsrcのURLをクリックすれば正しくcontent.jsの内容が見えるので、pathが正しく指定されていない、ということはなさそう。

web_accessible_resources を指定すればよい

manifest.jsonweb_accessible_resourcesというフィールドでは、ウェブからのリダイレクトなどの参照を許すChrome拡張内のリソースのパスを指定することができる。まさに今回、Chrome拡張側から見れば第三者の立場であるHTMLから、Chrome拡張内のリソースを<script src="...">でロードさせようとしているので、これに該当する。

このとき、content.jsだけではなく、content.jsを起因とするすべてのimportで参照されるリソースをweb_accessible_resourcesに指定する必要があるので、ワイルドカードを使った。

     ],
     "permissions": [
       "<all_urls>"
+    ],
+    "web_accessible_resources": [
+      "src/js/*"
     ]
 }

f:id:otiai10:20180327212500p:plain

いい感じに動いた。

ソースコードまとめ

github.com

懸念

  • node_modules以下にあるパッケージをどうやってimpotするか
    • full pathを書けばimportできるだろうけれど、Chrome拡張としてリリースビルドにどう含めるか
  • そもそもリリースビルドにnode_modules以下のすべてを含めるわけにはいかない

結論

  • webpack使お...

DRY

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター! 速習シリーズ

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター! 速習シリーズ

Dockerコンテナ同士のNFSのサーバ・クライアント疎通サンプル

サーバの起動

イメージはこれ → docker-nfs/server at master · otiai10/docker-nfs · GitHub

% docker-machine create \
  --driver amazonec2 \
  --amazonec2-region ap-northeast-1 \
  --amazonec2-security-group otiai10-test \
  otiai10-server

% eval $(docker-machine env otiai10-server)

% docker run \
-it --rm \
--net host \
--privileged \
otiai10/nfs-server

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 00-config: executing...
[cont-init.d] 00-config: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
rpc.mountd: Version 1.3.0 starting

あるいはこれ → daapミドルウェアを使ったGoのソースコードからのNFSサーバの起動 · GitHub

クライアント×2の起動と疎通確認

% docker-machine create \
  --driver amazonec2 \
  --amazonec2-region ap-northeast-1 \
  --amazonec2-security-group otiai10-test \
  otiai10-client-test

% eval $(docker-machine env otiai10-client-test)
% docker pull otiai10/nfs-client

イメージはこれ → docker-nfs/client at master · otiai10/docker-nfs · GitHub

% docker run -it --rm \
--name client_1 \
--privileged \
-e SOURCE=172.31.16.219:/ \
otiai10/nfs-client

root@e2b6f924bda5:/# echo "Hello! Hello! This is ${HOSTNAME}!" >> /root/mountpoint/greeting.txt
root@e2b6f924bda5:/#
% docker run -it --rm \
--name client_2 \
--privileged \
-e SOURCE=172.31.16.219:/ \
otiai10/nfs-client

root@91f46eeb21d3:/# ls -la /root/mountpoint/
total 12
drwxrwxrwx 2 root   root    4096 Mar 22 07:55 .
drwx------ 3 root   root    4096 Mar 14 11:08 ..
-rw-r--r-- 1 nobody nogroup   36 Mar 22 07:55 greeting.txt
root@91f46eeb21d3:/#
root@91f46eeb21d3:/# cat /root/mountpoint/greeting.txt
Hello! Hello! This is e2b6f924bda5!
root@91f46eeb21d3:/# 
root@91f46eeb21d3:/# echo "How's it going? I'm ${HOSTNAME}. Nice to meet you!" >> /root/mountpoint/greeting.txt
root@91f46eeb21d3:/#
root@e2b6f924bda5:/# cat /root/mountpoint/greeting.txt
Hello! Hello! This is e2b6f924bda5!
How's it going? I'm 91f46eeb21d3. Nice to meet you!
root@e2b6f924bda5:/#

いけてる。雑に構成。

f:id:otiai10:20180322172815p:plain

各イメージの挙動は、以下のDockerfileの通り。

github.com

DRYな備忘録として

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

インフラエンジニアの教科書2 スキルアップに効く技術と知識

インフラエンジニアの教科書2 スキルアップに効く技術と知識

【メモ】【NFS】DockerコンテナをクライアントとするNFSの疎通確認

背景

ログ

サーバは、同VPN内に立っている前提で、クライアントを作っていく。

# 準備
% docker-machine create \
--driver amazonec2 \
--amazonec2-region ap-northeast-1 \
--amazonec2-security-group otiai10-test \
otiai10-container-client-test
% eval $(docker-machine env otiai10-container-client-test)
% docker run -it --rm debian
root@1dd362335dc0:/# mkdir foobar
root@1dd362335dc0:/# mount 172.31.23.148:/root/export foobar
mount: permission denied

permission deniedと出る。

mount: permission denied

docker run--privilegedを追加。

% docker run -it --rm --privileged debian
root@eea3be2246c4:/# mkdir foobar
root@eea3be2246c4:/# mount 172.31.23.148:/root/export foobar
mount: wrong fs type, bad option, bad superblock on 172.31.23.148:/root/export,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

wrong fs typeと出る。

mount: wrong fs type

# さっきのつづき
root@eea3be2246c4:/# apt-get update -qq
root@eea3be2246c4:/# apt-get install -y nfs-common
root@eea3be2246c4:/# mount 172.31.23.148:/root/export foobar
root@eea3be2246c4:/#
# お、いったか?
root@eea3be2246c4:/# cat foobar/foobar.txt
おっぱい!
root@eea3be2246c4:/#

いきましたね。

まとめ

Dockerfile ↓

github.com

DRYな備忘録として

Docker入門

Docker入門

TCP IPとNFS―UNIXでのインターネットワーキング (アジソン ウェスレイ・トッパン情報科学シリーズ)

TCP IPとNFS―UNIXでのインターネットワーキング (アジソン ウェスレイ・トッパン情報科学シリーズ)

【AWS】EC2上にNFSサーバを構築する(最小要件)

背景

前回記事

otiai10.hatenablog.com

で、NFSサーバ構築の要素を検証したので、今回は最小要件実装を試す。とはいっても、デバイスの追加せず、ルートボリュームをマウントポイントとするだけの違い。

ログ

Webコンソールから、インスタンスの立ち上げ。この際、追加のEBSをアタッチしない。

% ssh -i ~/Documents/otiai10.tokyo.pem ec2-user@13.231.255.177
[ec2-user@ip-172-31-23-148 ~]$ sudo -s
[root@ip-172-31-23-148 ec2-user]# cd
[root@ip-172-31-23-148 ~]# pwd
/root
[root@ip-172-31-23-148 ~]# mkdir export
# マウントされるディレクトリを/root/exportとした
# 外部への公開
[root@ip-172-31-23-148 ~]# echo '/root/export *(rw,async,no_root_squash)' >> /etc/exports
[root@ip-172-31-23-148 ~]# systemctl status nfs
[root@ip-172-31-23-148 ~]# systemctl start nfs
[root@ip-172-31-23-148 ~]# exportfs -a -r
[root@ip-172-31-23-148 ~]# exportfs -v
/root/export      <world>(rw,async,wdelay,hide,no_subtree_check,sec=sys,secure,no_root_squash,no_all_squash)
[root@ip-172-31-23-148 ~]# systemctl status nfs
[root@ip-172-31-23-148 ~]# netstat -lntp | grep 2049
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::2049                 :::*                    LISTEN      -
[root@ip-172-31-23-148 ~]#

クライアント側から疎通確認。適当に、同SecurityGroup内に作る。このSecurityGroupは同SecurityGroup内同士の2049ポートが開いている。

% ssh -i ~/Documents/otiai10.tokyo.pem ec2-user@52.197.124.165
[ec2-user@ip-172-31-22-126 ~]$ mkdir mountpoint
[ec2-user@ip-172-31-22-126 ~]$ 
[ec2-user@ip-172-31-22-126 ~]$ sudo mount 172.31.23.148:/root/export ./mountpoint
[ec2-user@ip-172-31-22-126 ~]$ df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    488M   60K  488M   1% /dev
tmpfs                       497M     0  497M   0% /dev/shm
/dev/xvda1                  7.8G  1.1G  6.7G  14% /
172.31.23.148:/root/export  8.0G 1016M  7.0G  13% /home/ec2-user/mountpoint

サーバ上でなんか書いたのち、再度クライアントで、

[ec2-user@ip-172-31-22-126 ~]$ ll mountpoint/
total 0
[ec2-user@ip-172-31-22-126 ~]$ ll mountpoint/
total 4
-rw-r--r-- 1 root root 16 Mar 12 05:49 foobar.txt
[ec2-user@ip-172-31-22-126 ~]$ cat mountpoint/foobar.txt
おっぱい!
[ec2-user@ip-172-31-22-126 ~]$

NFSマウントポイントの同期が確認された。

DRYな備忘録として