sprockets-commonerについて
sprocket-commonerというgemがよい感じだったので調べてみました。
sprocket-commonerで何ができるのかは下記qiitaに詳しくかいてあって、僕もこの記事で知りました。
qiita.com
結局のところ
・ES6構文とmoduleのimport/export
・npmモジュール
の2つが使えればよいと思っていたので、ちょうどよい感じです。
sprocket-commonerがなにをやっているのかをざっと眺めてみました。
sprockets-commoner/commoner.rb at master · Shopify/sprockets-commoner · GitHub
module Sprockets module Commoner def self.sprockets4? @@sprockets4 ||= Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new('4.0.0.beta') end end register_postprocessor 'application/javascript', ::Sprockets::Commoner::Processor register_transformer 'application/json', 'application/javascript', ::Sprockets::Commoner::JSONProcessor register_bundle_metadata_reducer 'application/javascript', :commoner_enabled, false, :| register_bundle_metadata_reducer 'application/javascript', :commoner_required, Set.new, :+ register_bundle_metadata_reducer 'application/javascript', :commoner_used_helpers, Set.new, :+ register_bundle_processor 'application/javascript', ::Sprockets::Commoner::Bundle register_dependency_resolver 'commoner-environment-variable' do |env, str| _, variable = str.split(':', 2) ENV[variable] end end
Sprockets::Commner::Processor が何かやっていそうです
sprockets-commoner/processor.rb at master · Shopify/sprockets-commoner · GitHub
Schmooze::Baseというクラスを継承しているのですが、
Schmoozeというgemは何をやっているかというと
schmooze/base.rb at master · Shopify/schmooze · GitHub
def spawn_process process_data = Open3.popen3( @_schmooze_env, 'node', '-e', @_schmooze_code, chdir: @_schmooze_root ) ensure_packages_are_initiated(*process_data) ObjectSpace.define_finalizer(self, self.class.send(:finalize, *process_data)) @_schmooze_stdin, @_schmooze_stdout, @_schmooze_stderr, @_schmooze_process_thread = process_data end
となっていて、子プロセスでnodeを起動させてそこでJSを実行しているようです。
Sprocketのcompile時に子プロセスでnode.jsを起動して、JSをトランスコンパイルしています。
ExecJSへの依存はありません。
importの辺りはSprocket::Commonerr::Bundleとbabel-plugin-sprockets-commoner-internalで頑張っているみたい。
まとめ
- Sprocketのcompile時に子プロセスでnode.jsを起動して、JSをトランスコンパイルしてる
特別なことをせずにnpmモジュールが使える
- ExecJSへの依存はない
逆にいうと、ExecJSではないので、rubyracerなどは使えない。
ファイルずつnode起動していくので、パフォーマンスの懸念はあるみたいです。
github.com
- coffeescriptのimportなど特別な機能を使わなければロックインされることはない
Rails5.1から、SprocketにES6、npmモジュールへの対応が入るし、Webpackerも出るので、5.1が出るまではsprocket-commoner、5.1がリリースされたらRailsデフォルトに戻るのがよいんじゃないかなーと思ってます。
sudoするとdocker-composeがcommand not found
現象:
docker-composeをインストールしているとき、sudo したときだけコマンドが見つからない。
原因:
visudo で編集できる secure_path に/usr/local/bin が含まれていない。
docker-composeは /usr/local/bin 配下にインストールされる
対応:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
に/usr/local/binを追加
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/local/bin:/usr/bin
何回もやって都度忘れてたのでかいとく
Go言語の関数とループ
A Tour of Goを進めてたのでその備忘
問題:
関数とループを使った簡単な練習として、 ニュートン法 を使った平方根の計算を実装してみましょう。
ニュートン法は、開始点 z を選び、以下の式を繰り返すことによって、 Sqrt(x) を近似します:
最初は、その計算式を10回だけ繰り返し、 x を(1, 2, 3, ...)と様々な値に対する結果がどれだけ正解値に近づくかを確認してみてください。
次に、ループを回すときの直前に求めたzの値がこれ以上変化しなくなったとき (または、差がとても小さくなったとき)に停止するようにループを変更してみてください。 この変更により、ループ回数が多くなったか、少なくなったのか見てみてください。 math.Sqrt と比べてどれくらい近似できましたか?
回答:
gist.github.com
docker toolboxで作成したdocker0のアドレス帯の変更
デフォルトでは 172.17.0.0/16 が使用されているが、社内ネットワークの都合でこれを変更したかったのでその方法です。
docker toolboxを利用する場合、docker-machineを利用して、boot2dockerのVMが起動していると思います。
docker-machine ssh
でdocker daemonが起動しているサーバにログインして以下の作業を行います。
まずdockerを停止
docker stop
既存のbridgeを削除します。
ifconfig docker0
で、docker0インタフェースに172.17.0.0/16が設定されていることがわかります。
この設定を残したまま、dockerの起動時オプションに別にアドレス帯を指定してもエラーになってしまうので、まず削除します。
ip link del docker0
で削除。
あとはdocker daemonをbipオプションを渡して起動する。
あまりよい方法ではないですが、
boot2docker/docker at master · boot2docker/boot2docker · GitHub
の
/usr/local/bin/docker daemon -D -g "$DOCKER_DIR" -H unix:// $DOCKER_HOST $EXTRA_ARGS >> "$DOCKER_LOGFILE" 2>&1 &
を
/usr/local/bin/docker daemon -D --bip=192.168.42.1/24 -g "$DOCKER_DIR" -H unix:// $DOCKER_HOST $EXTRA_ARGS >> "$DOCKER_LOGFILE" 2>&1 &
として、dockerを起動すると、 192.168.42.1/24 が適用されます。
ifconfig docker0
で結果が確認可能
mackerel-agentをchefでamazon-linuxにインストールするとエラーになった件
公式の手順にあるようにchefのcookbookを利用してインストールすると、サービスの起動時にエラーになる。
エラーの内容は以下
Starting mackerel-agent:/etc/init.d/mackerel-agent: 36 行: 7214 Trace/breakpoint trap $BIN ${APIBASE:+--apibase=$APIBASE} ${APIKEY:+--apikey=$APIKEY} --pidfile=$PIDFILE --root=$ROOT $OTHER_OPTS >> $LOGFILE 2>&1
結論:
最新版(v1.2.1)を利用する
cookbook 'mackerel-agent', tag: 'v1.1.0'
ではなく
cookbook 'mackerel-agent', tag: 'v1.2.1'
以下調べた履歴
mackerel.io
で、Amazon Linux AMI 2016.03での不具合が報告されているものの、修正済みのはず。
試しにchefではなく公式の手順で手動でインストールしてみると問題なくインストールできる。
手順は下記の内容
mackerel.io
この手順で入るってことは、何か別のものをインストールしているのかも?ってことで公式の手順にある "https://mackerel.io/file/script/amznlinux/setup-yum.sh"の内容を確認してみると
# import GPG key gpgkey_path=`mktemp` curl -fsS -o $gpgkey_path https://mackerel.io/assets/files/GPG-KEY-mackerel rpm --import $gpgkey_path rm $gpgkey_path # add config for mackerel yum repos rpm -ivh http://yum.mackerel.io/amznlinux/latest/x86_64/mackerel-repo-1-0.noarch.rpm
となっていて、amazon linux用のレポジトリを用意している様子。
一方chefのrecipeは
if platform?('centos') or platform?('redhat') or platform?('amazon') ~ yum_repository "mackerel" do gpgkey gpgkey_url if yum_cookbook_ver >= Gem::Version.new('3.0.0') description "mackerel-agent monitoring" url "http://yum.mackerel.io/centos/$basearch" action :add end
となっていて、これが原因だった。
"http://yum.mackerel.io/centos/$basearch"を"http://yum.mackerel.io/amznlinux/$releasever/$basearch"に書き換えたところ問題なく動作した。
そしてここまでたどり着いたところで、最新のレポジトリでは対応済みなことに気づいた。。
Support Amazon Linux repo · mackerelio/cookbook-mackerel-agent@499d779 · GitHub