Macアップデート時のNodeのエラー

macをsierraにアップデートしたら、↓こんな感じのエラーが出ました。 node_modulesを削除して npm install をしなおしたら解決 :)

> starter@0.0.0 start /Users/user_name/Documents/app/training_front_01
> gulp

[20:44:14] Requiring external module babel-register
/Users/user_name/Documents/app/training_front_01/node_modules/node-sass/lib/index.js:13
    throw new Error(errors.unsupportedEnvironment());
    ^

Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (51)
For more information on which environments are supported please see:
https://github.com/sass/node-sass/releases/tag/v3.8.0
    at Object.<anonymous> (/Users/user_name/Documents/app/training_front_01/node_modules/node-sass/lib/index.js:13:11)
    at Module._compile (module.js:571:32)
    at Module._extensions..js (module.js:580:10)
    at Object.require.extensions.(anonymous function) [as .js] (/Users/user_name/Documents/app/training_front_01/node_modules/babel-register/lib/node.js:152:7)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Users/user_name/Documents/app/training_front_01/node_modules/gulp-sass/index.js:183:21)

npm ERR! Darwin 16.6.0
npm ERR! argv "/usr/local/Cellar/node/7.8.0/bin/node" "/usr/local/bin/npm" "start"
npm ERR! node v7.8.0
npm ERR! npm  v4.2.0
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! starter@0.0.0 start: `gulp`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the starter@0.0.0 start script 'gulp'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the starter package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     gulp
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs starter
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls starter
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/user_name/.npm/_logs/2017-05-27T11_44_16_563Z-debug.log

参照:Node Sass does not yet support your current environment (macOS 10.12.1, Node 7.0.0) · Issue #1764 · sass/node-sass · GitHub

awscliでCloudFrontへ証明書をアップロード

CloudFrontの場合GUIが用意されていないのでawscliからアップロードします。書式は下記のようになっているので

aws iam upload-server-certificate --server-certificate-name 任意の名前 --path /cloudfront/ --private-key file://秘密鍵のパス --certificate-body file://SSL証明書のパス --certificate-chain file://中間証明書のパス

このように実行しました。

 aws iam upload-server-certificate --server-certificate-name ssl.xxxx --path /cloudfront/ --private-key file://~/xxxxx.pem --certificate-body file://~/xxxxx.cer --certificate-chain file://~/xxxxx.ca

が、書式としては合っているはずなのにエラーが起きてしまいました。

An error occurred (MalformedCertificate) when calling the UploadServerCertificate operation: Unable to parse certificate. Please ensure the certificate is in PEM format.

検索したところ file:// が指定していないというのがたくさん出てきたのですが、 僕の場合は証明書の期限前だったということでした。 確認方法は

openssl x509 -in xxxxx.cer -noout -dates
notBefore=Dec 25 15:00:00 2016 GMT
notAfter=Dec 27 14:59:59 2017 GMT

参考: http://kayakuguri.github.io/blog/2015/04/09/ssl-error/

capistrano3のupload!で『Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8』エラー

capistranoのタスクでディレクトリ内のファイルをリモートに上げる処理を↓のように書いていたところ

# lib/capistrano/tasks/uploads.rake

namespace :uploads do
  task :wpuploads do
    ask(:upload_path, nil)
    on roles(:web) do
      upload!('wp-content/uploads/', "/var/www/html/app_name/shared/wp-content/uploads/", via: :scp, recursive: true)
    end
  end
end

しばらくは順調に進んでいたのですが、一部の日本語ファイルをアップロードしようとした時このようなエラーが出てしまいました

(Backtrace restricted to imported tasks)
cap aborted!
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
/Users/user_name/chef/app_name/lib/capistrano/tasks/uploads.rake:18:in `block (3 levels) in '
Tasks: TOP => uploads:wpuploads
(See full trace by running task with --trace)

net-scpで起きるエラーのようで、下記のようにforce_encodingを追加したら問題なく進むようになりました。

# lib/capistrano/tasks/uploads.rake

module Net
  module SSH
    class Buffer
      def write(*data_list)
        data_list.each do |data|
          @content << data.dup.force_encoding('ASCII-8BIT')
        end
        self
      end
    end
  end
end

namespace :uploads do
  task :wpuploads do
    ask(:upload_path, nil)
    on roles(:web) do
      upload!('wp-content/uploads/', "/var/www/html/app_name/shared/wp-content/uploads/", via: :scp, recursive: true)
    end
  end
end

書く場所はもう少し工夫しないといけないな...

Aws::SQS::Errors::SignatureDoesNotMatch エラー

急にAws::SQS::Errors::SignatureDoesNotMatchが出てwebrickが起動できなくなりました。

/home/vagrant/app/vendor/bundle/ruby/2.2.0/gems/aws-sdk-core-2.2.5/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call': Signature expi$
ed: 20160104T065705Z is now earlier than 20160104T065845Z (20160104T071345Z - 15 min.) (Aws::SQS::Errors::SignatureDoesNotMatch)
        from /home/vagrant/app/vendor/bundle/ruby/2.2.0/gems/aws-sdk-core-2.2.5/lib/aws-sdk-core/plugins/param_converter.rb:20:in `call'
        from /home/vagrant/app/vendor/bundle/ruby/2.2.0/gems/aws-sdk-core-2.2.5/lib/seahorse/client/plugins/response_target.rb:21:in `call'
        from /home/vagrant/app/vendor/bundle/ruby/2.2.0/gems/aws-sdk-core-2.2.5/lib/seahorse/client/request.rb:70:in `send_request'
        from /home/vagrant/app/vendor/bundle/ruby/2.2.0/gems/aws-sdk-core-2.2.5/lib/seahorse/client/base.rb:207:in `block (2 levels) in define_opera$
ion_methods'

原因は20160104T065705Z is now earlier than 20160104T065845Zとあるように時刻のずれでした

$ date
2016年  1月  4日 月曜日 15:58:33 JST
$ sudo ntpdate ntp.nict.jp
 4 Jan 16:18:34 ntpdate[28994]: step time server 133.243.238.164 offset 1000.144849 sec
$ date
2016年  1月  4日 月曜日 16:18:38 JST

として修正したら起動できるようになりました。

ActiveAdminでリレーション先のIDを検索する

kind -> question -> userとそれぞれ1対1で関連付けされている時、いつも通り

filter :user, as: :numeric

と書いてもuserモデルを検索できません。

filter :question_user_id, as: :numeric

のように書けば関連先のuser_idで検索することが出来ます。 また、kindが複数のquestionを持つ時は複数形にすればよさそうです(未検証)

filter :questions_user_id, as: :numeric

Railsでマルチスレッドを使用した場合に RuntimeError: Circular dependency detected while autoloading constant エラーがでる

Railsでマルチスレッドを使用してActveRecordのクエリを並列に実行しようとしたら『RuntimeError: Circular dependency detected while autoloading constant …』というようなエラーがでました。エラーの詳細は

RuntimeError (Circular dependency detected while autoloading constant DayRange):
  app/models/stock.rb:27:in `get_year_data'
  app/controllers/api_controller.rb:122:in `block in graph_data'

のようになっていました。

Railsでは一度読み込んだファイルをキャッシュして2回目は読み込まないようにしているようなのですが、マルチスレッドを使用すると読み込んでいないファイルを同時に読み込みに行った場合に、片方のスレッドが読み込んだあともう片方のスレッドがもう読み込み済みとなって読み込まずエラーになるようです。

# config/application.rb

module DataAnalysis
  class Application < Rails::Application
    config.eager_load_paths += %W(#{config.root}/app/models/stock.rb)
  end
end

参照: http://qiita.com/tjnet/items/cecf9eae6e34a057e4d8

redirect_toでパラメータをつけてリダイレクトする

いろいろ試してみましたがredirect_toにパラメータがつかなかったので、パスの生成時にパラメータをつけることにしました。

redirect_to admin_users_path(q: params[:q]), alert: "選択したアイテムを無効に設定しました"