###### tags: `Advent calendar mis.w54代2021`
# 20日目
# 1人で完結する安価スレを作れるアプリを作ってみた
[みす54th Advent Calendar 2021](https://adventar.org/calendars/6570)の20日目を書かせていただく54代**SEED**です。いやー、時間立つの早いですね。気づいたらもう新年まで2週間を切っておりますが、皆様いかがお過ごしでしょうか。さて、今年を振り返る時期となりました。私は今年何をしていたのかと考えてみましたが、特に去年と変わらない一年だった気がします。多分。
追記:記事が長くなりすぎたので。[本題はこちら](#実際に使ってみよう!)
## はじめに
突然ですが、皆さんは**安価スレ**をご存知でしょうか?なんJwiki先生には以下のように書かれていました。
>安価スレとは、「安価」を中心にしたスレッドの総称である。
これだけ聞いても、そもそも**安価**とはなにかわからない方もいると思うので(自分も最近まで知りませんでした)こちらも某大百科から引用してきました。「安価」とはネット掲示板でレスアンカーを指す言葉です。
>主にインターネット掲示板で使われる、他の書き込みにリンク(レス)されるための書式である。
ただ、それらを見ても??という方が多いので、実際の安価スレを見てみましょう

こちらは[【安価スレ】回転寿司きたやで](https://ondemoopen.livedoor.blog/archives/9945794.html)というタイトルのスレで、かっぱ寿司に来て注文を安価で決めるといった内容になっています。
まず、最初にスレ主が以下のような書き込みをしていますね。ここでかかれている>>2という書き込みは先程説明にあったレスアンカー(以下安価)機能を用いたものでこのスレの未来に書き込まれるであろう2番目の書き込みにメンションを当てています。そして、他者が書き込むのを待ち、実際に2番目書き込まれたものを注文するのです。
```
かっぱ寿司や
まずは>>2 から
```
これが安価スレです。そんな安価スレですが、重要な原則が有ります。それは**安価は絶対**です
どういう意味かというと正当な理由なしに安価を指定し直すことができないということです。実際、このスレではこのような場面が有りました。

これはどのような場面かというと、78番目のレスでスレ主が84番を安価で指定していますが、その指定されたものが**野菜入りチキンライス70g**だったわけです。つまり離乳食です。
当然、通常はこんなものを注文したいわけないのですが、先程の原則を思い出してください。**安価は絶対**
つまり、正当な理由がなければこの安価を無視することができないわけです。このスレ主はこの原則を守りちゃんと注文してますね(偉い)

このように安価スレはスレ主が思いもしない展開になることがあり、そういった展開はやってる側も見る側にも魅力的だと思いますし(主観)、それが安価スレの魅力だと思います(小泉進次郎構文)
しかし、そんな安価スレにも短所が有ります。それは**常に作成したスレに参加する人が現れるとは限らない**ということです。安価スレやりてえなぁと感じて安価スレを作成するのはいいものの、書き込んでくれる人がいないと安価スレは当然成立しません。安価スレの魅力として、スレ主と書き込みを行う参加者が繰り広げるストーリーが面白い(小並感)というのがあると思うのですが、その他者を巻き込まなければならないという性質があるがゆえに他者が介入するかしないかで安価スレが成立するか否かが左右されてしまうわけです。
そこで私は安価の書き込みをなげたときに事前に登録したメニューからランダムで商品名を書き込ませる機構を作ればいつでも気軽に安価スレごっこを楽しめるのではないかと考え今回アプリ作成しました。
# 作ったもの
そして実際に作ったものが[こちら](https://www.cheapthread.jp/)になります。

こちらはトップページですが、これを見た方の殆どが「あれ、これ安価スレのアプリじゃないやん」と思う方がいると思いますが、こちらが今回作ったものです。作ったというか前回のアドカレのシーズンで作った[ガチャアプリ](https://hackmd.io/@1ZOuQGiSRpu_i5qP_Uiu1g/HJnMbEs3P)(こちらもこの記事同様怪文書でかつ黒歴史なのであまりリンク先の記事は見ないでほしい)に追加機能を作成したという形になります。実際に安価機能を作成するついでにこのアプリに何点か改善をしています。実際に改善したものとしては以下が有ります。
- クソコードの修正
- ガチャ、リスト一覧のUI改善
- 雑にAPI作成
- csv出力に対応
- VPSにデプロイ
## 改善したもの
まあそれぞれの変更点をダイジェストで見てみましょう。
追記: ここの文章が長くなりすぎたので興味がなければ[本題](#実際に使ってみよう!)を見てください。
### クソコードの修正
実際に去年作ったアプリですがコードが相当ガバでした。同じ内容のことを書いてるのにメソッドでまとめていなかったり、余計にSQL文を生み出すコードをしたり(~~これは一部直っていない希ガス~~)、テーブルのデータ型が明らかにおかしい部分があったりetc..
それらを気になる部分だけ修正し、コード規約に乗っ取る感じのコードに(rubocopにぶちこむなど)しました。
まあ、[github](https://github.com/SEED0228/cheapthread)を見てください。あと、すごくどうでもいいのですが、レポジトリ名をcheapthreadとしていますが、去年から安価スレを作りたいと考えていたのでこのレポジトリ名になっています。(安価=>レスアンカーなのでankerthreadだろとかいうのはやめてください)
### ガチャ、リスト一覧のUI改善
まず、ガチャですが本家の[サイゼリヤ1000円ガチャ](https://saizeriya-1000yen.marusho.io/)のレイアウトに大幅に寄せました。

また、リストごとにガチャの背景色、フォントの色を変更できるようにしました。

一覧画面も多少UI改善する努力をしました。

画像のガチャ: [マクド](https://cheapthread.jp/lists/7/gacha/price) [くら寿司](https://cheapthread.jp/lists/4/gacha/calorie) [はま寿司](https://cheapthread.jp/lists/5/gacha/default) [スシロ-](https://cheapthread.jp/lists/6/gacha/price)
### csv出力に対応
リスト要素を登録する際、値段、カロリー、メニュー名を手入力する必要が有りましたが、csvで読み込みができるようになりました。なので、以下の手順でリストを登録できるようになりました。
- アカウントを作成します

- リストを作成します

- 次のような内容の"hoge.csv"を作成します
```
name,price,calorie
あ,889,464
い,334,443
う,364,364
え,114,514
```
- リスト追加ボタンを押します

- リスト要素をcsvからインポートし、更新ボタンを押します

- リストをもとに○円、○kcal、○連ガチャができるようになります

### VPSにデプロイ
もともと[heroku(旧バージョン)](http://cheapthread.herokuapp.com/)にあげていたのですが、API用に登録した[VPS](https://cheapthread.jp/)に移行し、ドメイン(cheapthread.jp)を取得しました。
なお、使用しているVPSですが「WebARENA Indigo™」の一番安いプランを使ってます。月額税込み349円です。クソ安いです。個人用途であればおすすめです。
### 雑にAPI作成
APIを作ってみました。discordでガチャを呼べます

# 実際に使ってみよう!
さて、前置きがクソ長くなってしまいましたが、安価スレ機能の紹介をします。
まず、実際に作成する手順ですが今回はスシローの安価スレを作成したいので、[ガチャ一覧](https://cheapthread.jp/)からスシローの安価ボタンを押します。

すると、スレッド作成画面になるので作成ボタンを押します

そうなると、スレッド画面に移行するので実際に安価を追加した書き込みをして見ましょう。

すると安価した番号以上の番号まで自動的に商品名の書き込みがされます。

## 実際に使ってみた!
昨日実際にスシローにいって例の安価スレ機能を使ってみました!すし食いてーなぁと思いとりあえず、安価書き込みをしてみました。

すると...

**だし巻き玉子!?ねぎま汁!?**
普段絶対注文しないであろうメニューが出てきて困惑を隠せませんでしたが、安価の大原則である**安価は絶対**を破るわけには行きません。そういうわけでしぶしぶ...
なお、唯一まともそうな軍艦甘海老は品切れでありませんでした(悲しい)

ちなみに意外とうまかったです。
そのまま安価を続けていきました。

お、やっと寿司が食える...
ここに来て...


余計なもの(pͪoͣnͬpͣoͥnͭpͣa͡inͥ)があるもののまともな寿司を食べることができ、「そういや、寿司屋に来てるんだよなぁ」と思いながらお寿司を堪能してました。

そして、次の6回の安価で寿司を獲得することができ、このとき何かに乗っていました。
そうです。
**調子に**
私が、中トロ(165円)を食べている中、一緒にスシローに行っていただいたI.TK氏がフェアの大トロ(110円)を食してるのを見て、なぜキャンペーンで大トロが110円で食えるのに中トロを165円で食ってるんだ?、
**俺も大トロ食いてぇなぁ**
そう考えてしまいました。その考えが、自身を苦しめることを知らずに...

**大トロ食いてぇなぁ**と考えてしまった罪深き私に待っていたのは揚げ物地獄でした

いやぁ、きついっす...
しかし、まだこのときの自分は諦めていませんでした。
このときには自分の中に確かに「諦めない心」がありました。
その気持ちが私の次の安価のレスを送る手を止めてはくれませんでした。
そして、次こそは大トロ食うぞということで

**33:4**

**66:8**

**99:12**

**132:16**

**165:20**

コラ〜〜〜〜〜〜!
怒りのあまり卓上調味料を全部倒してしまいました~!(大嘘)

ある中カラカラ〜!
そして、昼からハイボールを飲むアル中と化してしまいました

おいしーかもー(瀕死)
もう、ゴールしていいよね...
なお、[くら寿司](https://cheapthread.jp/lists/4) [はま寿司](https://cheapthread.jp/lists/5) [スシロ-](https://cheapthread.jp/lists/6)はすでにリストを作成しているのでみなさんもやりたい方がいれば、ぜひ挑戦してみてくださいね(涙目)
### 結果発表
[今回作成したスレ](https://cheapthread.jp/threads/402a8751-cd43-48eb-86d5-3d90f6027793)
| メニュー | 値段 | kcal | 個数 |
| --- | --- | --- | --- |
| だし巻き玉子 | 110 | 93 | 1 |
| 鮨し人流 渾身一滴 本鮪ねぎま汁 | 385 | 55 | 2 |
| ぶりとろ | 165 | 82 | 1 |
| まぐろ山かけ | 110 | 94 | 1 |
| まぐろユッケ(黄身醤油) | 110 | 111 | 1 |
| とろっとプリン | 110 | 237 | 1 |
| 天然生車えび | 110 | 36 | 1 |
| かつお | 110 | 87 | 1 |
| いかすみマヨ | 110 | 85 | 1 |
| いくら | 165 | 82 | 1 |
| えび天にぎり | 110 | 146 | 2 |
| 特ネタ中とろ | 165 | 89 | 2 |
| 鶏せせり唐揚げ | 363 | 379 | 1 |
| とろ~~りあったかフォンダンショコラ |220 | 282 | 1 |
| 煮あなご | 110 | 97 | 1 |
| まるごと海老の柚子こしょう天ぷら | 330 | 254 | 1 |
| 白ばい貝食べ比べ(生・炙り) | 330 | 64 | 1 |
| 京都峯嵐堂のわらびもち | 110 | 97 | 1 |
| 寒ぶり | 110 | 111 | 1 |
| 野沢菜巻 | 110 | 148 | 1 |
| 角ハイボール | 385 | 55 | 1 |
| 計 | 4598 | 2934 | 24 |

ただただ会計が恐怖でした。改めてカロリーを見てみると恐ろしいですね。1日あたりの成人男性小カロリー摂取の目安は2200±200kcal程度が目安という中この一食でそれを有に超えるカロリーを摂取したことになるのですね...
吉野家さんのスタミナ超特盛丼もびっくり
なお、その日の夜はなにも食いませんでした
## さいごに
結構長い怪文書になってしまいましたが、是非[これ](https://cheapthread.jp/)で遊んでみてください。あと、[github](https://github.com/SEED0228/cheapthread)ものせておくので、アドバイスとかここへんだよとか何かあれば[twitter](https://twitter.com/SEED0228777)やdiscord、slackなんかで連絡してくださるとありがたいです。
明日はharrison君が面白い記事をかいてくれると思うので寝ます。おやすみなさい。
アドカレRTA 05\:06\:30