3ヶ月くらい前にSNSっぽいSNSは辞めたわけですが、Twitterを辞めてしまうとちょっとしたアウトプットするにも全てブログ(もしくはメモ用のサイト)でやる必要があり、これは結構手間なのでブログ未満でカジュアルにポストできるのを自作しました。

構想から実行へ


もともと辞めよう(という意思を記事にした[1])のが、このブログによると2月中旬で実際に辞めたのは7月下旬だったようです。(ブログはこういう時に便利だ)

辞めたいというのが強くなったのは4月ぐらいだった気がします。その時は別のものを作っていた(絶賛放置中)のですが、その時からその後に自前でTwitterの代わりのような、なにかつぶやくものを実装してみようかな。と、思っていました。時を同じくして、hail2u.netというサイトをCSSか何かの調べ物をした際に見つけました。後にこちらのサイトが最終的に「実装するぞ」という気持ちを後押ししてくれることになります。

8月も中旬くらいになって、作るか。という気持ちになりました。これならすごく単純なCRUDのAPIだけで済むし、おそらく今まで作りかけで放置してきたものと違って、短時間で動くところまで実装できるので、どこかのサーバにのせるところまで持っていけるだろう。と。しかし、こんなものを自前でやるなんて人はそうそういない。なんというか、多くの人は到底やろうとも思わないことをやる…というのはなんか気が引けるものがありました。

そんなことを思っていた矢先に、前述のhail2u.net近況というページが自前で実装されていることに気づきました。こちらはてっきりTwitterの内容を流しているものだと思っていたのですが、そのページや過去の記事を読むと自前で実装しているのがわかります。

この方の実装は後述する私のサーバぶっ立ててAPIで…というようなややこしいことはしておらず、ほぼ間違いなく、生成処理は全てローカルで完結していると思います。しかし、こういう一人でつぶやくのを自前で実装するということを考える人すらそんなにいないだろう。というところに、まさか実際に実装して公開している人がいるなんて…。なんというか、失礼ながら妙な親近感のようなものを覚えました。

これが後押しになって、自分もやるか。という気持ちになりました。

箱庭


おそらく、自分一人でつぶやいて自分一人で読む。ということをしている人は予想以上に多くいると思います。そして、そういった人たちの多くはTwitterの鍵アカウントやSlackなどのチャンネルを利用してやったりするのだと思います。が、そうではないんです。求めるものはそうではない。

なぜ、こんなものを自前で実装するのでしょうか。今まで上手く説明できる言葉がみつからなかったのですが、考えていて思いついたのが「箱庭」です。自分のいろんなものを箱庭のように囲ってインターネットに公開したい。という感じなのではないかと思います。思うに、ブログなどの延長線上の行為・欲求だと思います。

余談になりますが、前述のhail2u.netは書棚というページに運営者の方が読了した本も表示してあり、近々そちらを真似して自分もこのサイトに本のページを作りたいと思ってます。

Cahsper


実装したやつですがGitHubに絶賛放流中です。いちおう動くやつがここにあったり、加工前のJSONも確認することができます

Cahsper

プロジェクト名は始め「つぶやく」の英単語をベースにしようかと思ったのですが、英語では「Murmur」と、なんかとても牛みたいな感じでエレガントではありません。ですので「ささやく」を英語にした「whisper」をベースにすることにしました。しかし、動詞をそのままプロジェクト名にするのもアレなのでもうひとひねり必要だと考えました。

そこでもともと語感が好きだった「casper」と「whisper」を足して「Cahsper」としました。Google翻訳に放り込んで発音させると「カスパー」という発音になるのですが、誰が何を言おうと「Cahsper」で「キャスパー」です。

なぜわざわざサーバを立てるのか


なぜAPIサーバを立てるのか?というと、一応自分はたぶんサーバサイドに少し寄ってるかもしれないくらいのソフトウェアエンジニアなので、そのスタックを磨いておきたいというのがあります。普段仕事で触っていると残念ながら既に出来上がったものを保守するということの方が多く、自分の好き勝手出来ないとか、フルスタックフレームワークで機能多すぎだし、フレームワークが勝手になんかやってるし、よくわからんとかいう状況がままあります。このサイトをいろいろやっていく中で、仕事では学べないものもたくさんありましたので、それと同じように自分で作って自分で改善していく中で継続してサーバサイドの学習ができれば。という気持ちがあります。

使っている技術などについて


絶賛放置中のやつの技術スタックをほぼそのまま踏襲し、ScalaとAkka HTTPを軸にしました。前述のとおり、フルスタックフレームワークだとよくわからんけど設定したら動いたとか、なんかルールに乗っ取ってやるのが嫌なので、できるだけ組み合わせを調べながら自由に組みたいというのがありました。最終的に自分が運用している静的サイトのどちらかに表示することになるので、APIのみでよいというのもありました。あとは、Scalaを数ヶ月ごとに触っては忘れるということを繰り返しているので、継続してさわるような環境を作っておきたかったです。仕事で使っている技術でやるのが最も手っ取り早いのですが、それをしなかったのは察してください。

認証はAWS Cognitoにしました。APIという時点でヘッダに認証用のトークンをつけて投げるということになると思うのですが、どうやってトークンを発行するかを考えると、そこは自前でやるよりももう管理できるサービスを使った方が早いのは間違いなく、加えて今回は早くサーバにのせてしまいたいというのもありました。これは今までの経験からとりあえず動かさないと飽きて途中でやめるのが明らかだからです。事実、コントリビュートグラフを見ると、作り始めて即飽きて1ヶ月ほど触らなかったのが丸わかりです。

幸いにも今回はやる気が戻ったので、戻った後はとりあえず最低限で良いのでサーバにのせることを重視しました。そのため、いろいろ機能実装されてないですが、まあ、エライ人も「早く仕上げろ」とかいってたので、とりあえず動かせたのでよかったです。必要最低限とは言え、例えばusersテーブルとか更新や削除に使うためのidカラムは、いちおう実装しておきました。これらはどうせ一人で使うし、更新削除もMySQL Workbenchで行うのでいらないという気持ちはあるのですが、変更し辛いのでとりあえず実装しました。

設定は全て環境変数から取得するようにしました。これは今までいろんなOSSをdockerで動かす際に設定ファイルをマウントさせていたのですが、その方法だとバージョンアップが非常にめんどくさく、その経験から環境変数のみで完結させるようにしました。

サーバはAWS LightSailを選びましたが、正直失敗したのではという気もしています。どうもCPUに制限がかかるようで、始めに$5のvCPU1コア 1GBのもので作業していたところ、Let’s EncryptのインストールとかDokcerでごちゃごちゃやっているとCPUのパワーが不足してしまい、CPUの制限がかかる。しかし、作業は継続している。ので、CPUは100%に張り付く。ので作業は進まない…というスパイラルが発生して圧倒的になにもできなくなってしまいました。こういうので待つのが嫌いなので、勢いで$20のインスタンスまで上げてしまいました。本当は$10までにとどめたかったのですが、$10のものはvCPU1コアで、CPU不足である以上は2コア以上にする必要があったためです。

コメントの投稿はJavaSciptで簡単なコンソールアプリかもしくは簡単なフォームのようなものを作ろうかと思ったのですが、AWS Amplifyとかいうもののドキュメントのどこから手をつければよいのかがわからず、どうせ自分しか使わないし、最も簡単な方法で投稿できればよいだろう。ということで引数を渡したらcurlで投げるシェルスクリプトを作りました。

その他


いざインストールがおわってしまえば、インスタンスのリソースがスカスカなのでもう一つくらい何か動かすつもりです。おわり。


  1. 記事にしたのがそこで、実際もっと前には辞めようと思い始めていた ↩︎