[個人開発]Next.js + App Engine + Firebaseで名言とかYoutubeの再生位置を共有するサービスを作った話

[Wepoi](https://wepoi.net/meigen/new)っていう（特に名前に意味はない）Webアプリを作りました。
＊ Wepoi←読み方はうぇぽいのつもりでいます

# 作ったもの
## Meigen（読み方はめいげんです）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/Unsha8QtTS">https://t.co/Unsha8QtTS</a> 作成者:同僚 <a href="https://twitter.com/hashtag/Meigen?src=hash&amp;ref_src=twsrc%5Etfw">#Meigen</a> <a href="https://twitter.com/hashtag/Wepoi?src=hash&amp;ref_src=twsrc%5Etfw">#Wepoi</a> <a href="https://twitter.com/_wepoi_?ref_src=twsrc%5Etfw">@_wepoi_</a>さんから</p>&mdash; hiko1129 (@_hiko1129) <a href="https://twitter.com/_hiko1129/status/1160519283681779712?ref_src=twsrc%5Etfw">August 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Meigenは、こんな感じでなんでもない感じの発言を名言っぽい？感じに投稿して共有できます。

<img width="600" alt="Screenshot_20190811_205652.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/5786141f-c452-4c59-9f52-467e3f2006af.jpeg">
自分が遊びとして使ったり、会社のSlackで同僚に使ったりしてもらってます。（皆優しい）

## Tube（読み方はつべです）
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/96faac3b-3c4d-740c-0592-73f74049842c.gif)
Tubeは、こんな感じでYoutubeの再生位置を複数登録して共有できます。ただそれだけのやつです。
https://wepoi.net/tube/JilklUrpCwW1ekPCxqIx

# 使った技術
* Next.js(TypeScript)
* Firebase（Cloud Storage, Firestore）
* App Engine（Standard Environment）

Next.jsはFirebase Hosting + Cloud Functionsの構成ではなくApp Engineに乗せてます。
Firebase Hosting + Cloud Functionsで行う場合は、リージョンがus-central1じゃないと無理そうだったのでApp Engineにしてます。

ドメインはGoogle Domainsで取得してます。

# なぜ作ったか（開発の経緯）
Meigenは、某炎上広告を見て、ちょっと枠と色がつくだけで純粋なただのテキストで見えるのよりもずっと映えるなーって思ったのと、川柳少女見てて川柳っぽい縦書きがTwitterで見れたら良いなと思ったのがきっかけです。ただのテキストだと味気ないし、ちょうどOGP使っているものの流れが来てるなーと思ったので作りました。

TubeはYoutubeのコメント欄見てて動画の再生位置を共有するニーズがあるなーって思ったのがきっかけです。友人に面白い動画を共有するときに、「25分の辺りと45分の辺りが最高だから。」みたいな感じで伝えるんだったら、複数個の再生位置を登録して、共有できるようにするのが良いんじゃないかなーと思ったので作りました。

# 学んだこと
* Webフォントはimgタグのsrc属性の中から取得できない [svg @font-face works in svg but not when included in a page](https://stackoverflow.com/questions/20577316/svg-font-face-works-in-svg-but-not-when-included-in-a-page)
* svgの中で普通にHTMLタグやCSSが使える [foreignObject](https://developer.mozilla.org/ja/docs/Web/SVG/Element/foreignObject)
* Google Domains周りの使い方
* TypeScriptの高度な型周り
* 人が何を求めているのかわからないってこと
* CSS全般（避け続けてきたので）
* 縦書きに関するCSS


幸いなことに、TypeScript、Next.js、App Engine、Firebaseすべて[ゲームエイト](https://qiita.com/organizations/game8)で使っているので、その辺りについては普通にハマることなく使えました。

一部はメモ残しておきました。
* [firebase functionsの諸々の設定方法](https://qiita.com/hiko1129/items/0fcef289ea644b62814a)
* [[React + TypeScript] Reactで特定のコンポーネントのPropsの型を取り出す方法](https://qiita.com/hiko1129/items/23d0fd310787de2d43b5)
* [TypeScriptである型から特定のプロパティのみ除外する方法](https://qiita.com/hiko1129/items/0df54be0e1498d28574d)

# あとがき
正直どちらも誰も使わないようなものかもしれないですが、一応ちゃんと公開できたのでよかったです。

次は誰かにちゃんと使われるもの作れたら良いなーと思っています。起業の科学に書いてあるような内容を個人レベルで置き換えて進めていけたらって思ってます。

# おまけ
以前同僚がReact.js Meetupで発表してきたWebアプリ→[エンジニア顔判定](https://tranquil-marker-241605.firebaseapp.com/)
よかったら遊んでみてください。

# 開発時にお世話になったサイト
[TypeScript特有の組み込み型関数](https://log.pocka.io/posts/typescript-builtin-type-functions/)
[Vue.jsとFirebaseでOGP画像生成系のサービスを爆速で作ろう](https://qiita.com/serinuntius/items/3017fb6ef51cd47352f6)
[超簡単！GAEアプリにカスタムドメインとSSLを適用する方法！！](https://www.apps-gcp.com/gae-apply-customdomain-and-ssl-setting/)