最近MISTEL社のキーボードを購入したので快適にタイピングしながらお送りしております。今日はActiveAdminを利用する際に、カスタムフィルターを実装したい場合のお話をしたいと思います。*ActiveAdminとは、管理画面を簡単に導入できるgemです。)})ここで問題発生。Calendar18日目の記事です。体育館予約を自動化したいこんにちは。Fablicのサーバーサイドエンジニア、Jamesです。去年のアドベントカレンダーでこんな記事を書きました。Driverで体育館予約システムに自動ログインできたけど体育館全然空いてないから予約できないやんけ!と言う記事です。去年は自動でログインした後に心が折れてやめてしまいました。上記の記事を当時所属していたチームはそこまでしっかりとした活動もせず、たまに大会に出て試合をするスタイルでやっていました。それなりに楽しくやっていたのですがこの一年で自分を取り巻くバスケ環境が紆余曲折あり、なぜか新チームを立ち上げることになりました。気がつけばそのチームの代表になっていました。恐ろしいことでしょう。代表になったからには同じチームでやっている仲間達と楽しいバスケットボールライフを送りたいものです。真剣にやる」メンバーが集まりました。我々は学生のように毎日練習することはできませんが、週1ぐらいの練習でできる限りのことをして都民大会で上位を狙うことを目標に活動することになりました。なるとやはり立ちはだかる壁は、そうですね。体育館予約を自動化したいはい、我々は2017年になっても体育館の予約で消耗しています。Bryantファン必読の本でした(エルニドで撮影。エルニドは楽園でした。体育館の予約の仕方が直感的に理解しづらいこの一点に尽きます。今回は前回とは違い責任が増えたので根気よく取り組むことにしました。仕様のために何度もやり直しをするなどしながら調査を続けていると、普段世の中に出ているWebサービスがどれだけユーザーに寄り添っているのかと感激して涙が溢れてきました。して調査を続けていると以下の仕様がわかってきました。予約は9-22時の間に行うことができる。予約は基本的に抽選である翌月の体育館予約の抽選は前月の1-5日に行われる結果が6日に出る結果を反映した後の9日から当該月のキャンセル分の予約が可能キャンセルされた予約は早い者勝ち1つの予約をすると最初の画面からやり直さなければならないので、複数の予約を同時に行うことは不可能なんという仕様でしょうか。毎月9日の朝9時に翌月の予約の勝敗が全て決まってしまうではありませんか。その時間にものすごいスピードで予約をしてしまえばだいたいよさそうです。キャンセル後は早い者勝ちなのでそれを漏れなく予約すればよさそうです。抽選の内容に関してはこちらとしてはタッチできない部分なので諦めます。(根気よく抽選も申し込んではおりますが、これまで1日しか当選したことがありません、、、)つまり、我々に必要なものは体育館のキャンセル状況を確認して、空きが出ていたら自動で予約できる何かということがわかりました。作りたいものが少し具体的になりました。類似するシチュエーションを利用して仮で予約してみるさて、作りたいものが具体的にはなりましたがやはり空いている体育館がありません。どのような状態になれば予約完了に出来るかがわからないので開発が進めません。去年の自分だったらここでまた心が折れて、この企画はまた来年に持ち越されていたでしょう。2017年の僕は一味違いました。人は守りたいものができた時に強くなれるものです。作りたいものを作ろうとするのではなく、可能な限り類似するシチュエーションを利用して他の施設を予約してみることにしました。「体育館予約システム」のためにまずは「会議室予約システム」を作ることになるとは思いませんでした。この作戦が功を奏しました。「会議室予約システム」の完成後、体育館キャンセルをチラチラ見ていたら平日ですが体育館空きがある日も奇跡的に発見することができ、「体育館予約システム」に生まれ変わらせることができました。コードは公開したくないので(ライバルを増やしたくないw)具体的な内容は伏せますが、フレームワークも使っていないRubyのスクリプトです。app.rbこの1行をターミナルで実行するだけでキャンセル状況を見て予約出来るプログラムがかけました。マンバメンタリティー!サーバー上で動かせるようにする最後は書いたプログラムを定期的に実行させるだけです。そのためにはサーバーが必要になります。最初は「どこかのサーバーにcron登録するのかー、会社の開発機にでも置くかw」とか考えていたのですが、ものすごく便利なサービスがありました。みなさんご存知Herokuです。headlessモードを利用する必要があるので、Buildpackをインストールする必要があります。(Herokuの管理画面から簡単にできます。Schedulerというプラグインがあり、これを使うとポチポチ設定するだけで簡単に定期実行してくれます。cron登録を代行してくれるだけかもしれないですが、とても楽でした。katsulog.tech予約完了後の通知機能をつけるこうして一定の時間で予約をすることが可能になりました。予約が成立しているか常に確認しに行くのは不便です。Notifyを利用して予約が完了したらチームのLINEグループに通知が行われるようにしました。Notifyはトークンを渡してHTTPポストするだけなので簡単でした。我々のチームは安定したバスケットボールライフを送っております。これまでよりチームプレイも増えてきて、とある市民大会では優勝することもできました。こんなに首から頭下げてると思いませんでした。合計で300行も満たないコードで幸せな気持ちにさせてくれるRubyにも改めて感激しました。このように業務で得た知識が私生活をも充実させてくれるのはこの仕事のいいところであると思います。何より、仲間たちとバスケをする時間が増えたことがとても嬉しいです。いうのは大切だと思います。結局のところ根性な気がします。使うべきではないが、:attr_readerには問題はないのではないか?また、順番に依存した処理にその変数を使いたい時はゲッタで使うべきではなく、メソッドの返り値からスタートして、ローカル変数で渡すべき従ってある変数が多用されるからむやみにゲッタメソッドをつけるのではなく、initializeで外側から渡してくる変数などそのクラスの構成要素となり機能を表しているようなものに対しては積極的に使うべきだと考えたとはいえこれは宗教戦争みたいなもんなのかな結論がまとまったので忘れないうちに雑に書きましたが、気分が乗ったらちゃんと書きます。何か知見があればコメントをいただけると幸いです。発売日見たら2013年ってあったので、しょうがないかという気持ちになった。スクリーンプレーやボールのもらい方の一つ一つが理論として記されていて、非常に勉強になった。自分のようにコーチがいない環境でバスケットボールをしていた選手にとっては最高の教材なのではないだろうか?しかし、あまりに文書になっているのでちょっと分かりづらいというのが正直なところである。これをそのまま動画にするだけでもかなりチャンスありそうである。バスケットボールコーチ・選手のための情報サイトこのブログにも死ぬほどありがたい情報がまとまっていた。以前、会社の技術ブログでactiveadminのちょっとしたTipを書いた。inFablic有名なgemって言っても所詮はライブラリだしDSLだしそんなに役にも立たないだろうけど一部の人の役に立てばいいかなーくらいに考えてたんだけど、Twitter見てたらある日突然外国人に感謝された。なんやねんこれーって思ってリンク先見て見たらactiveadminのwikiページで、なんと俺の書いたブログが引用されていた。github.com普段使ってるライブラリの作者とこう繋がれて、引用してくれてちょっと嬉しかった。大したことしてないし、多分彼自身もブログの内容読めてないと思うけどwわざわざ引用してくれた上に、日本語でメッセージくれてインターネッツに久々に感動しました。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。