ンンンパ

ふとしです

移転しました

npm run scripts で current directory を参照したい。

環境変数を使います。

$PWD ではダメ

npm run foo は常に基準となるディレクトリで実行されるので、たとえば以下の npm run here は、配下のディレクトリに潜っても同じ結果を返します。

"scripts": {
  "here": "echo $PWD"
}

これは current directory を考慮せずに node_modules を一定の条件で使えるので、とても便利です。

なので先に設定しておく

便利ですが、 current directory が欲しい場合もありますので、別個に環境変数を設定し、それを参照します。

"scripts": {
  "here": "echo $C_D"
}
$ C_D=$PWD npm run build

これで実行したディレクトリを得られます。(しかし調べればビルトインで参照できる変数がありそうである)

おわり。

なぜ

watchify

いまは watchify でコンパイル行為を行なっており、こういう build を用意しています。

"scripts": {
  "build": "watchify -t babelify --extension=js ./index.js -o ./built.js -v"
}

特定のディレクトリを指定して watchify

SPA を作成している時分にはこれでよかったのですが、今は自習として、共通のライブラリを使う別々の小さな js ファイルを作成するということをやっています。

いっぱいあるし、個々の build は書きたくない。

このようにしておいて

"scripts": {
  "build": "watchify -t babelify --extension=js $C_D/index.js -o $C_D/built.js -v"
}
$ C_D=$PWD npm run build

余分な js を書く必要がなくてハッピーでした。(脱 Gulp 中かつ、なんらかの他のランナーも使う予定がなかった)

就職できました。

1年間の無職を終えました。

HeartRails | ハートレイルズ | ザ・ウェブサービス・カンパニー

よろしくおねがいします。

Capybaraのウェイト時間で足りない場合、さらに待たせる。

Capybaraはfindなどの要素検索メソッドで、見つかるまである程度の時間待ってくれます。

時間が足りない場合は

Capybara.default_max_wait_time = 30

などとすることで時間を増やせます。

all('hoge')[0].clickだとおなじみのundefined method `click' for nil:NilClassで終わる

終わりますので、終わらせないために適当にrescueします。

def re_find(wait = 0.5, count = 20, &block)
  yield
rescue
  raise if count == 0

  sleep wait
  re_find(wait, count - 1, &block)
end
re_find { page.all('a.niceButton')[0].click }

これで中断もできますし、急場はしのげますね。

Access-Control-Allow-Originが設定されてないWeb APIを叩くために中継サーバー書いた。

大げさなタイトルみがありますがただのRailsです。

github.com

うすうす実装なのでさがせばあるんでしょうけど、人が書いたもの使いたくない場合ってあるじゃないですか。

起動

$ TARGET=http://you-want-to-ajax.server.com ALLOW=http://your-local-js.server.com rails s

つかう

あとはhttp://your-local-js.server.comでうごくJavaScriptからhttp://localhost:3000のRailsを叩くだけ。

Ajax側の実装でエンドポイントの根本ドメイン変えられるようにしておけば安心ですね。

わからんかった

method == 'OPTIONS'のときはControllersession.idが取れないので、みんなたちで使えるような仕様にはできなかったので、ローカルだけで使えるものになった。

なんでかな。

vue-routerのroutesを全部出すやつ

だいたい見れる。

log(dig(router))
function digState (state, path = []) {
  state.nextStates.forEach((nextState) => {
    if (nextState.handlers) {
      nextState.handlers.forEach((handler) => path.push(handler))
    }
    if (nextState.charSpec.validChars) {
      digState(nextState, path)
    }
  })

  return path
}

function digNames (names, path = []) {
  for (let name in names) {
    router._recognizer.names[name].handlers.forEach((handler) => path.push(handler))
  }
}

function dig (router, path = []) {
  digState(router._recognizer.rootState, path)
  digNames(router._recognizer.names, path)

  return path
}

function log (path) {
  let logged = {}
  let logs = []
  path.forEach((hh) => {
    let h = hh.handler
    if (logged[h.fullPath]) {
      return
    }
    if (h.name) {
      logs.push(['/' + h.name, '=>', h.fullPath].join(' '))
    } else {
      logs.push(h.fullPath)
    }
    logged[h.fullPath] = true
  })

  logs.sort().forEach((l) => console.log(l))
}

ActiveAdmin辺りでCircular dependency detected while autoloading constant Fooが出る場合の措置。

Rails 4.2.7、ActiveAdmin 1.0.0.pre4で発生しました。

普通にやってる分には出ないんですけど、下の記事みたいに外からRails.application.require_environment!すると、models関連でCircular dependency detected while autoloading constant Fooが出ます。

mmmpa.mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmpa.net

措置

読み込み順序が問題なので、autoload_pathsの先頭にmodelsのディレクトリを追加してから、require_environment!します。

Rails.application.config.autoload_paths.unshift("#{Rails.root}/app/models")
Rails.application.require_environment!

ベーシック認証が必要なサイトにアクセスするテストで、ダイアログをシカトするためにNginxでProxyする。

Phantomjsじゃ動いてくれないJavaScriptライブラリがありまして(よくある)、Selenium + Firefoxでスクリーンショットおじさんになっています。

nginx.conf

実際はRubyではないのでこのようなコードではないんですけど、概念的にこんな感じです。

server {
    listen       8080;
    server_name  localhost;

    location / {
        proxy_set_header Authorization "Basic #{Base64.encode64 'id:password'}";
        proxy_pass https://my-secret-web-site.com;
    }
}

Base64エンコードしたのをヘッダに含めます。

一般的にはブラウザでのアクセスの際や、エンドポイントの設定ファイルでhttps://id:password@my-secret-web-site.comでやったりするんでしょうけど、ライブラリがパースをしくじったり、なんかブラウザに丸出しになるのがイヤって時に使えます。