動かざることバグの如し

近づきたいよ 君の理想に

Nodejsで変数確認したりデバッグする方法

環境

  • nodejs 10

やりたいこと

rubybinding.pryみたいにプログラムコードの途中で実行を止めて変数の中身とか参照したい

やり方

例えば以下のようなjavascriptを用意する。

const val1 = 1;
const val2 = 2;

debugger

console.log(val1 + val2);

1つ目のポイントは止めたいところでdebuggerを入れる。

2つ目のポイントは実行をnode inspect xxx.jsとして実行する。

~/tmp $node inspect sample.js
< Debugger listening on ws://127.0.0.1:9229/0143445a-8d55-4c74-9a4c-00a11020097a
< For help see https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in sample.js:1
> 1 (function (exports, require, module, __filename, __dirname) { const val1 = 1;
  2 const val2 = 2;
  3

debuggerのところまで行くには「cont」と入力してエンター

debug> cont
break in sample.js:4
  2 const val2 = 2;
  3
> 4 debugger
  5
  6 console.log(val1 + val2);

対話的に実行したいなら「repl」と入力してエンター

debug> repl
Press Ctrl + C to leave debug repl
> val1
1
> val2
2
> val1 + 114514
114515

終了する際は「.exit」と入力するかCtrl+cを二回押す。

Rubyで配列をn分割する方法

スプラで待機している最中に考えてた。

その時は自分含めて5人いて、2人と3人にチーム分けしたかったのだが、それをRubyの1ライナーでやりたい。どうしようか

5人をAさん〜Eさんとする。ここまでは共通だと思う。

%w(Aさん Bさん Cさん Dさん Eさん).shuffle

方法1 group_byを使う

irb(main):016:0> %w(Aさん Bさん Cさん Dさん Eさん).shuffle.group_by.with_index{|a,i| i % 2 == 0}
=> {true=>["Aさん", "Bさん", "Eさん"], false=>["Dさん", "Cさん"]}

こっちのgroup_byRailsの方ではなく組み込みの方。with_indexでindexが取れるのでその値が偶数か奇数かで2分割する。シンプルではあるが、2分割にしかできないのがキズ

group_byの代わりにpartitionでも可

irb(main):037:0> %w(Aさん Bさん Cさん Dさん Eさん).shuffle.partition.with_index{|a,i| i % 2 == 0}
=> [["Cさん", "Dさん", "Eさん"], ["Bさん", "Aさん"]]

方法2 in_groupsを使う

これはRailsのメソッドだが、配列をn分割してくれるメソッド。しゅごい

[14] pry(main)> %w(Aさん Bさん Cさん Dさん Eさん).shuffle.in_groups(2)
=> [["Bさん", "Cさん", "Eさん"], ["Aさん", "Dさん", nil]]

これなら仮に人数増えて分割する数を増やしたいってなっても対応できる(8人なら4x4で分ければええやんってのはナシで

[16] pry(main)> %w(Aさん Bさん Cさん Dさん Eさん Fさん Gさん Hさん).shuffle.in_groups(3)
=> [["Cさん", "Eさん", "Aさん"], ["Bさん", "Fさん", "Dさん"], ["Hさん", "Gさん", nil]]

失敗例1 each_slice

これでも一応できる。しかし、引数に配列の長さ/2を明示的に渡さないといけないので。。。

irb(main):031:0> %w(Aさん Bさん Cさん Dさん Eさん).shuffle.each_slice(3).to_a
=> [["Bさん", "Dさん", "Eさん"], ["Aさん", "Cさん"]]

Capistranoで使えるshared_pathとかcurrent_pathの変数一覧

環境

current_pathとかshared_pathとかユーザーがsetでセットする変数とは別に、最初から定義されている便利な変数もいくつかある。これをうまく活用するとタスクがスッキリするのでメモ

変数一覧

変数名
deploy_to /var/www/article_vote
deploy_path /var/www/article_vote
current_path /var/www/article_vote/current
releases_path /var/www/article_vote/releases
release_path /var/www/article_vote/current
shared_path /var/www/article_vote/shared
stage_config_path config/deploy
deploy_config_path config/deploy.rb
repo_url https://github.com/thr3a/article_vote.git
repo_path /var/www/article_vote/repo
release_timestamp 20190119081416

どこで定義されてるの

公式ドキュメントにそれっぽい記述なかったのでソース見たほうが早い。

capistrano/paths.rb at master · capistrano/capistrano

Capistrano3系でgit submodulesを使ってデプロイをする

環境

最近はめっぽう聞かないが、gitにはサブモジュール(git submodules)という機能がある。

この機能自体は便利なんだろうけど、それをCapistrano経由でデプロイしようとすると厄介な話になってくる。というのもCapistranoはgit submodulesに公式で対応してないからである(2系は対応していたらしい

ってことはプラグイン入れないといけないね、ってことで探したらあった。その名も「capistrano-git-with-submodules

インストール

Gemfileに

gem 'capistrano-git-with-submodules'

を追加して bundle install

で、Capfileに

require "capistrano/scm/git-with-submodules"
install_plugin Capistrano::SCM::Git::WithSubmodules

を追加すればおk

あとは勝手にデプロイ時にサブモジュールもgit cloneしてくれる

注意点

公式サイトにも載っているが、3系とは3.7以降のみ対応している。それ未満のバージョンのCapistranoを使っている場合は同じ作者の「ekho/capistrano-git-submodule-strategy」を使う。