DRYな備忘録

Don't Repeat Yourself.

はじめてのR

インストール

% brew install r
% R

R version 3.5.0 (2018-04-23) -- "Joy in Playing"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin16.7.0 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。

R は多くの貢献者による共同プロジェクトです。
詳しくは 'contributors()' と入力してください。
また、R や R のパッケージを出版物で引用する際の形式については
'citation()' と入力してください。

'demo()' と入力すればデモをみることができます。
'help()' とすればオンラインヘルプが出ます。
'help.start()' で HTML ブラウザによるヘルプがみられます。
'q()' と入力すれば R を終了します。

> q()
Save workspace image? [y/n/c]: n
%

イントロ

> x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
> x
[1] 10.4  5.6  3.1  6.4 21.7
> y <- 1/x
> y
[1] 0.09615385 0.17857143 0.32258065 0.15625000 0.04608295
> x + y
[1] 10.496154  5.778571  3.422581  6.556250 21.746083
> x * y
[1] 1 1 1 1 1
  • 1行5列のベクトルxをつくる
  • xの各要素の逆数を要素とする1行5列のベクトルyをつくる
  • ベクトルの和
  • ベクトルの内積

わかる。

ひきつづき。

Rによるやさしい統計学

Rによるやさしい統計学

はじめてのR: ごく初歩の操作から統計解析の導入まで

はじめてのR: ごく初歩の操作から統計解析の導入まで

Go言語のgoroutine、channel、sync、contextなどについて学習

なんだかんだで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 easy_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を有効にしたい

追記 2018/10/29

chromeモジュールが使えなくなる、という指摘は半分正しくて半分間違ってる(いくらでもやりようがある)のでもうちょっとちゃんとした記事を書きました。

medium.com

以下原文ママ


背景

  • 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 スキルアップに効く技術と知識