ActiveJob で active_elastic_job を利用時、設定が反映されない

active_slastic_job を利用しているとき、Rails のバージョンを変更したところ、

I, [2018-10-12T16:21:11.029048 #653]  INFO -- : [d8e52f46-4c12-40b5-ab99-f593f6306a95] Started POST "/" for 127.0.0.1 at 2018-10-12 16:21:11 +0000
F, [2018-10-12T16:21:11.029747 #653] FATAL -- : [d8e52f46-4c12-40b5-ab99-f593f6306a95]   
F, [2018-10-12T16:21:11.029800 #653] FATAL -- : [d8e52f46-4c12-40b5-ab99-f593f6306a95] ActionController::RoutingError (No route matches [POST] "/"):
F, [2018-10-12T16:21:11.029837 #653] FATAL -- : [d8e52f46-4c12-40b5-ab99-f593f6306a95]   
F, [2018-10-12T16:21:11.029906 #653] FATAL -- : [d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) actionpack/lib/action_dispatch/middleware/debug_exceptions.rb:73:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) actionpack/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) railties/lib/rails/rack/logger.rb:38:in `call_app'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) railties/lib/rails/rack/logger.rb:26:in `block in call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) activesupport/lib/active_support/tagged_logging.rb:80:in `block in tagged'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) activesupport/lib/active_support/tagged_logging.rb:28:in `tagged'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) activesupport/lib/active_support/tagged_logging.rb:80:in `tagged'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) railties/lib/rails/rack/logger.rb:26:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) actionpack/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) actionpack/lib/action_dispatch/middleware/request_id.rb:27:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rack (2.0.5) lib/rack/method_override.rb:22:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rack (2.0.5) lib/rack/runtime.rb:22:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) activesupport/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) actionpack/lib/action_dispatch/middleware/executor.rb:14:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rack (2.0.5) lib/rack/sendfile.rb:111:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] rails (01294c25566a) railties/lib/rails/engine.rb:524:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] puma (3.12.0) lib/puma/configuration.rb:225:in `call'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] puma (3.12.0) lib/puma/server.rb:658:in `handle_request'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] puma (3.12.0) lib/puma/server.rb:472:in `process_client'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] puma (3.12.0) lib/puma/server.rb:332:in `block in run'
[d8e52f46-4c12-40b5-ab99-f593f6306a95] puma (3.12.0) lib/puma/thread_pool.rb:133:in `block in spawn_thread'

このように、No route matches が発生するようになった。
この原因は、config.active_elastic_job.process_jobs この変数がtrueになっていないときに起きる。

$ config/initializers/active_elastic_job.rb

こちらのファイルがロードされるタイミングが、

$ vendor/bundle/ruby/2.5.0/bundler/gems/active-elastic-job-96c6ace4b7f1/lib/active_elastic_job/railtie.rb (これは人によって変わる)

こちらより後にタイミングが変更されていて、設定が反映されなくなってしまっていた。

initializers に書くのはあきらめて、より実行のはやい、 config/environments/*.rb に書くことで解決する。


そもそも active-elastic-job は、最新のRailsに対応していなかったが、こちらのリポジトリで、最新のRailsでも動くように書き換えてあります。
https://github.com/unchi/active-elastic-job

ActiveAdmin の update url に対して、ajax通信すると302リダイレクトし続ける

例えば 管理画面上の action ボタンで、データを更新できるようにした場合ですが、

ActiveAdmin.register Message do
  index do
    script do
      raw <<-'EOS'
        function censor(id, url){
          var elem = document.querySelector('#message_'+id+' > .col-text > span');
          elem.innerText = "ほげほげ";
          $.ajax({ url: url, type: 'PUT', dataType: "json", data: { message: {text: "ほげほげ"} }});
        }
      EOS
    end
    selectable_column
    id_column
    column :text
    column :created_at
    actions do |v|
      item "ほげボタン", "javascript:censor(#{v.id}, #{raw admin_message_path(v).to_json});", class: "view_link member_link"
    end
  end
end

dataType json を指定しないと、302 リダイレクトループになってしまいます。


このイシューと同じ状況です。
https://github.com/activeadmin/activeadmin/issues/2345#issuecomment-41262778

Carrierwave から ActiveStrage に乗り換えたときに、予想外だったこと

route の一番下に、404用のアクションを定義していると、画像が表示されない

$ config/route.rb

# ...

get '*path', to: 'application#error_404'

これは、active storage が定義する 以下よりも先に、上記が処理されているため。

get "/rails/active_storage/blobs/:signed_id/*filename" => "active_storage/blobs#show", as: :rails_service_blob, internal: true

host を指定してファイルパスを取得したい

url_for を使用してフルパスを取得するように書かれていることが多いが、このメソッドはオプションでhostを指定できない。

polymorphic_url を利用すると、以下のようにすれば設定できる。

polymorphic_url(hoge.image, host: "http://*****/")

同時にActiveJob を使っていると、データのアップロードが非同期に自動で切り替わる

config.active_job.queue_adapter を inline ではなく、別の例えば active_elastic_job などにしていると、
内部で ActiveStorage::AnalyzeJob が利用されているため、勝手に非同期となる。
そのときの デフォルトの quere 名が default のため、このままではエラーになってしまう。

config.active_storage.queue で 別の quere名を設定する。

Alexa 開発時、スキルの呼び出し名の変更が反映されない

2018/09/21現在、スキルの呼び出し名を変更しても、それだけでは反映されない。
ストアに公開するための認定時にも、古い呼び出し名のまま動作確認が行われてしまう。

これを反映させるには、一度テストを無効にして、再度有効にすることで反映される。

f:id:unching-star:20180921202922p:plain

それにしても、メールで送られてくる、Alexaスキル 認定に関するフィードバックは、
指摘に関する再現方法も細かく記載され、修正方法まで書かれているため、とてもわかりやすい。
Apple も見習って欲しいですね。

Mysql8 に接続できないとき

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

MariaDBと同じく、ログイン認証プラグインがかわり、現在のユーザーとmysqlにログインしようとしているユーザーが異なるとログインできない状態になっている。
そのままの状態でも、rootのLinuxユーザーから実行すれば、mysql -u root で問題なく接続できる。

現在のプラグイン確認
use mysql;
SELECT user, host, plugin FROM user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+
プラグインを変更する
ALTER USER 'root'@'localhost' identified WITH mysql_native_password;

Your password has expired. To log in you must change it using a client that supports expired passwords.

パスワードを再設定する
ALTER USER `root`@`localhost` IDENTIFIED BY '', `root`@`localhost` PASSWORD EXPIRE NEVER;

UPS Eaton IPP を利用する

Daitron の製品、無停電電源装置(UPS) イートンCentOS 7 で利用するときの設定方法です。
Lenovo UPS 1000VA、UPS 1500VA は、EATON社製UPSです。

CentOS 7.4 インストール手順 | 無停電電源装置(UPS) | イートン
ここの説明で大体は大丈夫ですが、もっと良い情報を以下に書きます。

RPMインストール

rpm Download

rpm は、こちらからダウンロードする。CentOSなので、Red Hat と書かれているもの。

Intelligent Power® Protector v1.53
rpm Software Installer
x86_64 for Red Hat / Fedora / (Open) Suse
https://powerquality.eaton.com/support/software-drivers/downloads/de-intelligent-power-protector.asp

install は通常通り
$ rpm -ivh ipp-linux-1.53.150-1.x86_64.rpm


これで起動まで出来ています。

ファイヤーウォールの設定変更

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=5000/tcp
firewall-cmd --permanent --add-port=4679/tcp
firewall-cmd --permanent --add-port=4680/tcp
firewall-cmd --permanent --add-port=4679/udp
firewall-cmd --permanent --add-port=4680/udp
firewall-cmd --reload

これで設定は大方完了です。

設定ファイルを編集する

http://CentOSのIPアドレス:4679/

こちらにアクセスすると、IPP設定ページが表示されます。
初期のログイン、パスワードは、 admin、admin です。

この画面で編集した内容は、以下の場所に保存されています。

/usr/local/Eaton/IntelligentPowerProtector/configs/config.js

chefなどで管理する場合は、GUIで編集後に、設定ファイルをコミットするのがよいと思います。
設定編集後は、 再起動します。

$ service Eaton-IPP restart

以上です。

Serverless Framework で、functions block に定義した 関数名を参照する

$ serverless.yml

service: aws-nodejs # NOTE: update this with your service name

provider:
  name: aws
  runtime: nodejs8.10
  region: ap-northeast-1
  stage: ${opt:stage, 'development'}

...

functions:
  webApp:
    handler: 'handler.main'
    #name を指定しない
    ...
  
  WriteS3:
    handler: 'hoge.handle'

  ...

resources:
  Resources:
    ...

このように定義した時、lambda function の名前や、Arn を取得したい場合、Resources blockに定義したわけでは無いため、 `{Ref: webApp}` や `{ "Fn::GetAtt": ["webApp", "Arn"] }` では取得できません。

webApp の場合は、 WebAppLambdaFunction とすると、参照できます。
WriteS3 の場合は、WriteS3LambdaFunction となります。