2019年12月20日金曜日

Sidekiqによる非同期処理

せっかく作ったが蔵入りになりそうなので残しておく

背景

昔作られていたオンライン処理で、データ量が想定より大きくなり過ぎたせいで
画面上で処理するとタイムアウトになってしまっていた。
タイムアウトと言ってもUI側だけで、バックグラウンドの処理は正常に行われている。
幸い社内のみ利用されている機能で、月一の処理だったので
保守係が手動で処理していた。
これをバッチ化できないかを検討。

業務要件

・ユーザ(経理)の方で任意の日付(処理日)を入れる必要がある為、オンライン上での入力は維持する必要がある。
・会計締め処理に合わせる必要がある為、なる早めの実行が必要。
・処理が終わった後、ユーザが作られたデータを確認する必要がある。

技術要件

・既に色んな機能がお互い依存しているスパゲティコードになっているので、修正箇所は最小限にしたい。
→既存の処理を切り出して非同期処理化する。
・ruby1.9, rails3.2.12

非同期処理実装のため検討したこと

Active Job
rails4.2以上対応だが、現在のバージョンは3.2.12だった為、断念

Delayed Job
キュー管理用のテーブルが必要で、Sidekiqより参考資料が少なそう。

Sidekiq
redisのインストールが必要だが、今のバージョンでも使えそうだったので採用

[Ruby on Rails] Sidekiq で非同期処理を実装する


Sidekiqのバージョン選びについて

・普通にインストール→Sidekiq 5.0.3が入った。
generateコマンドで使えるか確認
$ rails generate --help
Gem Load Error is: Sidekiq 5.0.3 does not support Ruby versions below 2.2.2.
→Requires Ruby 2.5+ and Redis 4.0+

ちなみに今のrubyバージョンは
$ ruby -v
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]
$ gem search ^sidekiq$ --all
Error loading RubyGems plugin "/usr/local/lib/ruby/gems/1.9.1/gems/yard-0.8.5.2/lib/rubygems_plugin.rb": can't modify frozen Hash (RuntimeError)

YAML safe loading is not available. Please upgrade psych to a version that supports safe loading (>= 2.0).


*** REMOTE GEMS ***
sidekiq (6.0.3, 6.0.2, 6.0.1, 6.0.0, 5.2.7, 5.2.6, 5.2.5, 5.2.4, 5.2.3, 5.2.2, 5.2.1, 5.2.0, 5.1.3, 5.1.2, 5.1.1, 5.1.0, 5.0.5, 5.0.4, 5.0.3, 5.0.2, 5.0.1, 5.0.0, 4.2.10, 4.2.9, 4.2.8, 4.2.7, 4.2.6, 4.2.5, 4.2.4, 4.2.3, 4.2.2, 4.2.1, 4.2.0, 4.1.4, 4.1.3, 4.1.2, 4.1.1, 4.1.0, 4.0.2, 4.0.1, 4.0.0, 3.5.4, 3.5.3, 3.5.2, 3.5.1, 3.5.0, 3.4.2, 3.4.1, 3.4.0, 3.3.4, 3.3.3, 3.3.2, 3.3.1, 3.3.0, 3.2.6, 3.2.5, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.2.0, 3.1.4, 3.1.3, 3.1.2, 3.1.1, 3.1.0, 3.0.2, 3.0.1, 3.0.0, 2.17.8, 2.17.7, 2.17.6, 2.17.5, 2.17.4, 2.17.3, 2.17.2, 2.17.1, 2.17.0, 2.16.1, 2.16.0, 2.15.2, 2.15.1, 2.15.0, 2.14.1, 2.14.0, 2.13.1, 2.13.0, 2.12.4, 2.12.3, 2.12.1, 2.12.0, 2.11.2, 2.11.1, 2.11.0, 2.10.1, 2.10.0, 2.9.0, 2.8.0, 2.7.5, 2.7.4, 2.7.3, 2.7.2, 2.7.1, 2.7.0, 2.6.5, 2.6.4, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.0, 2.3.3, 2.3.2, 2.3.1, 2.3.0, 2.2.1, 2.2.0, 2.1.1, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 1.2.1, 1.2.0, 1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.0, 0.11.2, 0.11.1, 0.11.0, 0.10.1, 0.10.0, 0.9.1, 0.9.0, 0.8.0, 0.7.0, 0.6.0, 0.5.1, 0.5.0)

2.17.8でインストール成功

Gemfile
# 非同期実行用
gem 'sidekiq', '2.17.8'


デフォルトだとログが標準出力になるらしいので
Railsのログとして出力されるように変更する

$ cat config/initializers/sidekiq.rb
Sidekiq::Logging.logger = Rails.logger

Sidekiq のロギングに Rails logger を利用する

Redisのインストール

redisをインストールせずにsidekiqのアプリケーションを起動すると、下記のエラーになってしまう。

[FATAL] [2019-12-19 12:39:12 +0900] [b2b2ab87ca2f7d6425d549be8609b04b] Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
apt install redis-server



コードの改修

コントローラ側の処理をワーカクラスに切り出し
app/workers/monthly_billing_request.rb

コントローラではワーカをキューに入れるように変更

class System::BillsController < ApplicationController
  def create
  :
    logger.debug('clear retry queue')
    Sidekiq::Queue.new.clear
    Sidekiq::ScheduledSet.new.clear
    logger.debug('MonthlyBillingRequest queuing start')
    MonthlyBillingRequest.perform_in(1.seconds, scheduled_at)
    logger.debug('MonthlyBillingRequest queuing end')
  :

ワーカはWorkerをincludeして実装
class MonthlyBillingRequest
    include Sidekiq::Worker
    sidekiq_options queue: :event, retry: false

  def perform(scheduled_at)
    ## 何か処理
  end
end

キューの確認について

バッチを実行するとキューに入るが、ちゃんとキューに入っているか・キューから実行されているかなどの確認をする為には redisで確認する必要がある。
redis-cli
Redis に保存されてる値を見ようと思った時に覚えておきたい redis コマンド 

画面から連続でボタンが押されると、キューも複数生成されてしまっていた。
アプリケーション側で制御する必要があるが、取り敢えず間違ったキューは削除したい。
Redisのデータを削除する方法


結局どうなったのか

非同期処理をしてもwebインスタンスに負荷が掛かることは変わらないことで
バッチ実行時にバッチ用のインスタンスを作って実行することで
この案は廃止された。

2019年12月16日月曜日

MG GUNDAM F90+ミッションパック E-TYPE&S-TYPE(プレミアムバンダイ)

キットの感想など
・初めてプレミアムバンダイでの購入。スーパーファミコンのF91ゲームから気になっていて、今更だけど旧キットを購入するのも真剣に考えたところ、これが発売されることを知って直ぐ購入した。
・本体はさすが最近のキット。細かく色分けされている。MGだからかも知れないが、いつも塗装していた装甲の裏側も別パーツになっていた。ポリキャップもなくなっている。
ある意味塗装するところがなくなって、少しは調子抜け。
・ディテールが細かくなっていることで墨入れ場所が増えている→スジボリが必要
・関節もだいぶ人間ぽく動くようになっていて、ガンプラとよりはおもちゃみたいな気がする。
・本体に比べて追加パーツは普通な感じ。
・Sタイプの腕パーツはカッコイイけど拳の状態ではめるのが難しい。いっそ、手は外した状態ではめた方が良いかも。あとパーツにはめ過ぎると後で外せなくなる。

今回やったこと
・一部塗装→スジボリ→スミ入れ→光沢トップコート→デカール→つや消し
・頭部にLED入れ→微妙だったのでエナメル線だけ除去

塗装済み&仮組み状態
ƒ/9 1/6 16mm ISO1600

ƒ/9 1/6 16mm ISO1600


制作期間
1ヶ月

ƒ/11 1.3秒 34mm ISO100

ƒ/11 1.6 秒 34mm ISO100

ƒ/11 1.3秒 33mm ISO100
ƒ/11 1秒 37mm ISO100
ƒ/11 1秒 45mm ISO100
ƒ/11 1/1 22mm ISO100
ƒ/11 1.3秒 31mm ISO100


反省点
・色分けがされていたことで塗装の手間は省けていたけど、形状が細かいことで墨入れ(筋彫り)の時間が掛かっていた。
・いつも武器系の色をどうするかが悩ましい。ビームライフルは丁度塗装を考慮していたのか塗装しやすかったけど、この色分けでよかったのか未だにも迷わしい。
Sタイプの武装は迷走中・・
・水転写式デカールが豊富に付いているのは嬉しい。ただ一番大きい「90」と書いていたデカールは取る時に失敗して少し切れてしまってた。
・デカールを定着させる為、先に光沢トップコートを吹いたがやっぱり本体はつや消しの方が好きだったので、やり直し。でも後からのトップコートは少し甘かったのか中途半端な感じになってしまった。
・ガンダムにLEDはあまり似合わない気がしてきた。
・接続部の穴が見えないのでSタイプの腕を装着が難しい。少しづつ動かしてハメる感じ。さらにハメすぎすると外れなくなる。
なんとか外せたが、擦りすぎてデカールが剥がれてしまった。
・なんだかんだ書いたけど、機会があればもう一回作りたい。その時は違うミッションパックを試してみよう。

参考

2019年12月8日日曜日

北鎌倉-円覚寺・明月院

前から行ってみようと思っていた、北鎌倉へ行ってきた。
本来は鎌倉も行けたので自転車で北鎌倉まで行ってみようと思ったが
今まで行ったことないところだし、地図を見ると何気に坂になっていたので
今回は藤沢まで自転車で行って、電車移動(大船乗り換え)することにした。

天気は良好だった。
ƒ/8 1/125 30mm ISO100

藤沢までは2時間20分ぐらい掛かってた。昼食にするか微妙な時間だったが
北鎌倉に美味しいのがあることを期待して、取り敢えず電車に乗った。

駅に降りて円覚寺に行った。
入り口には写真を撮っている人でいっぱいで直ぐ分かった。

ƒ/2.8 1/400 30mm ISO100
入場料は300円だけどsuicaでの決済が可能だった。
列に並んでいたら、隣に猫があった。

ƒ/4 1/60 30mm ISO1250

入り口には御朱印の列が。そういえば今回も持ってくるのを忘れてた。

弓道場があった。三的でうちよりも狭い道場だったが
昔ながらの建物の中だったので、ここで射をやるのもいいかも
管理とか片付けが大変そうだけど・・・

ƒ/4 1/60 30mm ISO125
前日雨だったせいかもしれないが
カメラを持っている人が多かった。今が丁度ピークだったかも。

ƒ/5 1/160 84mm ISO250
途中、別途入場料を払って入るところもあった。ちなみにお茶と菓子を頂けるところもあった。今度嫁と一緒に来たら入ってみよう。

円覚寺の紹介をしてくれるビデオをみたら丁度今日(12/8)成道会といたイベントをやっていたらしい。10時なので家から早めに行かないと見れなそうだけど、来年はどんな感じなのか見てみたい。


円覚寺 成道会


ƒ/6.3 1/60 30mm ISO1000


あと3箇所ぐらい廻りたかったので、鎌倉方面にあるいてみた。
途中にある明月院に入ることに。

入り口の橋に面白いオブジェがあった。ウサギと何か関連性があるのかな?

ƒ/6.3 1/60 30mm ISO1600
本来、アジサイが有名な場所らしく、いまの時期は少し寂しい感じもしたが
良い感じの庭園だった。

ƒ/6.3 1/100 55mm ISO1600
回る途中に行列を発見。どうやら、あの有名な「悟りの窓」の写真を撮る列だった。
ここまで来ているので写真を撮らない訳にはいかない。
20分以上並んでやっと写真が撮れた。

ƒ/5.6 1/30 36mm ISO1600

後から観ると後ろの人の迷惑にならないように慌ただしい雰囲気だったので微妙な感じだった。
今回は30mm少し超えだったけど、50mm(フルサイズだと70mm想定?)ぐらいのレンズだと余計なものが入らずに撮れそう。

昼飯もまだだったし、このままだと帰りが大変だったので
藤沢へ戻った。あとはラーメン屋で遅めの昼食。

帰りは丁度日が暮れるところで、西日が眩しかった。
家についたら暗くなってた。

色々やりたいことはあるけど、体力もないし、時間がない。
おまけに寒くてやる気がでない・・

SEL30M35購入


最近Amazonの買い物はAmazonのゴールドカードを利用していることで
ポイントが溜まりやすくなっていた。
自分の買い物の為にAmazonギフト券も集めていたので、そこにポイントもプラスされることは嬉しい。

だたし、前から気になったAmazonの仕様だが
kindleでの買い物は自動的にポイントが使われること。
私自身はあまりkindleで買い物することがないが
最近娘が鬼滅の刃にハマっていて
kindleでどんどん書い始めてる。
(どうやら紙の本は品薄で入手困難らしい)
お陰で頑張って(?)貯めていたポイントがどんどん減っていく。

まだ早いが、丁度Amazonのセールだったし
前から気になっていたマクロレンズであるSEL30M35を買うことに。
多分、ほしいものリストに2年ぐらい放置していたかも
中古だと13,300だった。



ポイントとギフト券だけだとまだ1万ぐらいしかなかったので
しかたなく残りはお金を注ぐことに。

サイズは標準レンズとこの前買ったSIGMA Contemporary 30mmの中間ぐらいだが
全然軽い。


初めての中古レンズだからか傷が気になっていたが、写真は問題なく取れていた。

ƒ/3.5 1/3 30mm ISO100
あまりにも細かいところを撮ってしまうと手抜きで作っているのがバレそう・・

今はガンプラしか撮るものがないが
これからお花のシーズンが始まったら望遠レンズの代わりに持って行こうと思う。
まだフィルタ要るのかな・・・

2019年12月2日月曜日

wireless headset ANTS activeの修理

約1年前、社販で安く買ったbluetoothイヤフォンだが、軽いし充電持ちもまあまあ良かったので
普段よく使っていた。なにより線から解放されたのが大きい。

これが最近になって左右をつなぐところの外皮が取れてしまって
少しあやしい状態に。
といたところ、いきなり音が出なくなった。充電してもONにならない。

もしかして電池が寿命かな?と思い、壊れたらまた買う覚悟で
一回開けてみることに。

どうやら左側で制御部が入っていて、右側にリチウムイオン電池が収納されている。
他に壊れたところがなければ電池だけ換えれば動きそう。



丁度、秋葉原へ行く機会があって電池を探してみたが
丁度入りそうなモデルは見当たらないし、値段も思ったより高い。
交換に失敗したリスクを考えると新しく買った方が良さそう。

改めて調べてみたら、いくつか単線している(半田しているところ)があったので
半田を付け直したら動くようになった。

しばらくは使えそうだけど、今度本当に電池の寿命になったら
社販の担当にでも聞いてみようか。

2019年12月1日日曜日

JSConf2019

どう参加したのか

どうやら会社でスポンサをやっていたことで、無料チケットが何枚か入って来たらしい。
ちなみに1,2日目参加が優先だったけど、二日目のみ参加で申請していた。
2日目も湘南国際マラソンがあったので、行くかどうかは正直半々だった。

最終的に申請した人はは私を含め二人しかなかった。
同じ日にPHPカンパーレンスもあった為か、開発部では私一人だった。


会場の様子

思ったより早く着いたら、門が閉まっていた。でも確認してみたらスポンサーチケットだと入れるらしい。



受付でいきなり名前を呼ばれてびっくりしたけど、昔うちの会社を辞めてた人が受付をしていた。懐かしい。

スケージュールでは10:00〜11:00オープンと書かれていたので、何かしらオープニングのイベントをやるかと思ったら何もしてなかった。早く来る理由がなかった・・
会場はまるで学校のような雰囲気で、実際学校時代に使っていた机とかもあった。
ROOM A/B/Cと別れていて、Cは屋上だった。寒かったけど大量に使い捨てカイロを置いていた。
wifiは提供されていたけど、全然繋がらなかった。
昼食は外で食べるつもりだったけど、弁当がでた。ランチセッションはなし。

参加したセッション

InversifyJSを用いたレイヤードアーキテクチャの構築
・密結合(tight coupling)解決のため"InversifyJS"を導入した話。DI対応するとテストコードが描きやすくなる。
Dependency Injection(依存性の注入)

Build and scale multiple Voice application by using TypeScript
・alexaのask-sdkの説明。ちなみに個人的には
このSDKになってからいきなり書き方が変わって、alexaスキル作りのやる気が無くなっていました・・
・似たような複数のalexaアプリの公開・アップデートについて

正攻法はあるのか !? 泥臭く戦った Node.js バージョンアップ一部始終
・Node.js 6系 一気に10系にする話。リリースノートをちゃんと確認すれば大きく問題ないらしい。

Migration from React Native to PWA
・マルチプラットフォームだとReact Nativeで管理が大変なのでPWAに移行した話
https://speakerdeck.com/ohbarye/migration-from-react-native-to-pwa

GraphQLを用いたECサイトにおけるパフォーマンス改善
・rails + erb(REST)→ GraphQL+React採用
https://speakerdeck.com/nobuhikosawai/improving-online-shopping-site-performance-which-using-the-graphql

JavaScriptのままでTypeScriptを始める
・JavaScriptを自分の環境だけTypeScriptぽく書ける話
https://ginpen.com/2018/08/17/vs-code-reads-js-as-ts/

最新のWeb技術でIoT開発をする
https://speakerdeck.com/9wick/zui-xin-falsewebji-shu-deiotwosuru
・初めてobnizについて聞いた。個人的なイメージとしては
jsで動くネット前提のarduinoみたいな感じ
https://obniz.io/ja/
arduinoにwifiユニットを付けて頑張ってみようと思っていたけど
obnizを知って少し感動。


感想

・小さめのイベントだったが、JSで出来るのなら何でもありで
話題が幅広かった。拾える知識は多いが、ベースがないと辛いセッションもある。
大艇はnodejsまたはreactを知っていれば大丈夫かと。
・英語発表セッションがこれほど多いのは初めてだった。
外国人率も高かった。日本語発表でも資料は英語になっていた。
・room Cは屋上だった為、寒さとの戦いだった。
・エンジニアは英語を勉強するべき。
・ノートPC持っていくのを忘れて、ハンズオンの参加ができなかった。



おまけ

・会場近くにレオナルドLG2号があったので、昼休みに行ってみた。
MGの高機動型ザク 黒い三連星バージョン(1999年)が安かったので購入。
・同じく中抜けしてヨドバシカメラなど遊びに行った。来年も秋葉原でやって欲しい。