Twitterの名前を5分毎に東京の天気⛅☂☃と連動させるサーバレスプログラムを書いたら色々知らないことが出てきた話

# みんなが使えるようになりました(追記 2018/11/20)
###[**【祝】Twitterの名前をお天気と連動されるアプリを作った時の技術的な紹介【公開した🌥️】**](https://qiita.com/issei_y/items/35be6abf68f6c972386a)

# **導入**
**みなさんこんにちは！**
私は将棋プログラムPonanzaの作者、山本一成といいます。Qiita初投稿です。よろしくおねがいします。

いつものようにTwitterをしていた時、ふと思ったんです。
「Twitterの名前の部分が天気のEmoji:sunny::umbrella2::snowman2:と連動して変わったら嬉しいな」
つまりこんな感じですね ↓
<img width="806" alt="tmp.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/9251/310aa6fd-fd95-8058-e3ce-b176fc9599de.png">

いつもは、C++など低いレイヤーのプログラムを書くことがメインなので、こういったプログラムを書いたことがあまり経験がないのですが、よしいっちょやってみるかと思ってやってみました。

# **技術選択**
さっそく技術選択の段階です。
こういう類のプログラムは技術の選択がとても大切です（たぶん）。
正しい技術選択をすればとても幸せなのですが、間違えると末代までの不幸がプログラマに訪れます。

とりあえずTwitterでの名前はTwitterAPIを使えば、変更できそうです。
TwitterのAPIはTwitterのアプリ登録とかして、ConsumerKey・ConsumerSecretKey・AccessToken・AccessTokenSecretとか取得すればいいみたいです。これは検索すれば無限に出てくるので割愛。

続いてプログラム言語選択です。
python🐍も素敵でしたが、C#を選択しました。
プログラマというのはひな鳥🐣と一緒で最初の覚えた言語を親だと思うのです。
ついでにC#でTwitterAPIを操作するライブラリは[CoreTweet](https://github.com/CoreTweet/CoreTweet)というのが良さそうなので、それを選択します。
作者様ありがとうございます🙏🙏🙏

続いて、天気情報APIです。
世界には善意が溢れていて、こういったAPIはどなたかが用意してくれるものです。
探したら [OpenWeatherMap](https://openweathermap.org/)というのがありました。ありがたや🙇🙇🙇

自宅のPCを24時間動かすという選択は色々しんどいのでダメですね。
（そういう選択もなくはないですが、結局そういった運用は長続きしない気がします。）
それでサーバーをクラウドサービスを使って立てようかと思ったんですが、ふと思いました。
これは最近よく聞く**サーバーレス技術**というのを使うべきなんじゃないかな？

# **サーバーレス技術**
サーバーレス技術とはなんでしょうか？
いままで、細々とした処理（マイクロサービスと言うみたいです）をデプロイさせようと思ったら、以前はサーバーを新しく立てるか、既存のサーバーに相乗りさせてもらうしかなかったのです。
しかしサーバーレス技術を使えば、マイクロサービスごとに細かく管理できますし、嬉しい副次効果とかしては利用したCPU時間しか課金されないので、今回程度の使用量でしたら、無料かそれに近い値段で使用できます。

今回利用するサーバレス技術のサービスは[AWSLambda](https://aws.amazon.com/jp/lambda/)です。
クラウドサービスを牽引するAWSのサービスで C# のほか python, node.js, go, java 使えるようです。

図はAWSLambdaのWebUIです↓
今回は特に使うことはないのが、右側はDBやログです。実行したコードの結果を送るなどができるようです。
左側は実行させたいコードを発火💣させるイベント情報です。AWS各種サービスを連動させたり、APIをつないだり、一定間隔🕓で呼び出したりできます。
CloudWatchEventsを用意して、5分おきにイベントを発火させるように用意しました。
<img width="678" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/9251/71853e61-c684-023e-e94b-2e4abd5d2407.png">

# **実装**
Visual Studio2017を使用しました。
プログラマというのはひな鳥🐣と一緒で最初の覚えた(エディタ | IDE)を親だと思うのです。
AWSLambdaとVisual Studioは完全に連携ができており、AWSIAMというのを一度VS側で登録したら、VSだけでLambda側にコードを転送・実行ができます。完成度の高さに驚きました。
実際に書いたコードは100行ちょっとです。しかもその大半は今の天気に対応するemojiはどれかをif文で書き上げるコードで、大事なコードはこれだけです。めちゃ簡単です。

```csharp:
public class Function
{
	// デフォルトのテンプレートでは下の関数が書かれているが
	// public string FunctionHandler(string input, ILambdaContext context)

	// オーバロードしたこちらの関数を使ったほうが、色々幸せになる
	public string FunctionHandler(ILambdaContext context)
	{
 		// OpenWeatherMapAPIから天気を取得して対応するEmojiを返す
		var weather = TokyoWeather();
		var name = $"山本一成{weather}Ponanza";

		// TwitterAPIを経由してnameに変更する
		UpdateScreenName(name);
		return $"{DateTime.Now}:{name}";
	}
}
```

# **Emoji**
昔、英語の先生にEmojiのEはEmotionのEだと言われて驚いたことがあります。
確かに少しだけスペルが似ているような気がします。
それくらい世界に今や広がっているEmoji:couple_mm:、この記事📝でも積極的に使っています。
天気についてのEmojiを調べていたのですが、色々あります。OpenWeatherAPIが色々な[天気のidを返す](https://openweathermap.org/weather-conditions)のですが結構Emojiだけで対応できそうです。
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">TwitterAPI作成用絵文字確認ツイート<br>🌟🌀☂☃☀🌕⛅☁🌏</p>&mdash; 山本一成☀Ponanza (@issei_y) <a href="https://twitter.com/issei_y/status/980466304887869440?ref_src=twsrc%5Etfw">April 1, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="ja" dir="ltr">天気のemojiにも色々あって、例えば晴れ→曇りもこんな感じ。<br>☀→🌤️→⛅→🌥️→☁</p>&mdash; 山本一成☀Ponanza (@issei_y) <a href="https://twitter.com/issei_y/status/982110456473993217?ref_src=twsrc%5Etfw">April 6, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# **月齢を考慮した月のEmojiも可愛いのでいれた**
夜に曇りや雨出ない時は月のマークを出すようにしました🌝🌖🌔🌘🌒🌗🌓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/9251/69d91723-2e28-bd0a-f177-f720826aaa65.png)


# **日の出直後に起こるバグ問題**
お天気APIで日の出🌅、日の入り🌇時間も取れたので、それに従って昼夜の判定をしていました。

```csharp:
if (sunrise <= now && now <= sunset)
{
	// お昼かどうかの可能判定
}
```

それで数日運用していたのですが、その時にフォロワーさんから朝方に大陽:sunny:が出ている時に星🌟になっていると指摘されました。お天気APIの指定に従って表示しているだけだしなぁ～と考えていたんですが、しょうがないので朝に起きることにしました。朝6時🕕に起きたよ・・
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">朝方にしか起きないバグという、APIが絡んだ非常に苦しい条件のバグがあったのだが、朝早く起きることで解決した。</p>&mdash; 山本一成☀Ponanza (@issei_y) <a href="https://twitter.com/issei_y/status/984210263850139648?ref_src=twsrc%5Etfw">April 11, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

それで結論なのですが、お天気APIは一日前の日の出🌅、日の入り🌇を示していました。ただこれはバグというわけでなくUTC（世界標準時）視点🔭だから日付がずれているんだろうなという感じでした。仕方ないので以下みたいにコードを変更しました。

```csharp:
if ((sunrise <= now && now <= sunset) || ((sunrise + oneday) <= now && now <= (sunset + oneday)))
{
	// 日の出日の入り時刻は最大でも一日で一分程度しかズレないのでほぼ問題ない。
}
```

# **感想**
まったく知らない種類のプログラムを書いてみました。とてもおもしろくワクワクする体験でした。今回のプログラミングは驚くべきことにプログラム自体はほとんど書かずに調べてばかりでした。

これからのプログラムの世界はこういったコンポーネント化がどんどん進んでいき、それらを使いこなすプログラマが良いプログラマになんだろうと感じさせる出来事でした。

Twitterでよくつぶやいています。この記事が楽しかったら、ぜひフォロー⚡してください。
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">🌏名人に勝利した将棋プログラムの作者<br>🌍AIやプログラミングについて呟きます<br>🌎愛知学院大学特任准教授</p>&mdash; 山本一成⛅Ponanza (@issei_y) <a href="https://twitter.com/issei_y/status/986492393787502592?ref_src=twsrc%5Etfw">April 18, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# **追記**
自分でも実装してくれた人がいるみたいです。嬉しい:sunny::sunny::sunny:
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">東京の天気に合わせて自分の名前に絵文字を表示するプログラムを作りました(´･∀･`)<br>現在試験運用中で、飽きたら辞めるかもです。<br>完全に山本一成さん（<a href="https://twitter.com/issei_y?ref_src=twsrc%5Etfw">@issei_y</a>）の二番煎じです！<br><br>夜晴れの場合は、月齢を取得して対応した月の絵文字が表示されます！<br>🌑🌒🌓🌔🌕🌖🌗🌘<br><br>言語：PHP<br>更新間隔：10分</p>&mdash; ミルト🌧ARC (@miruto) <a href="https://twitter.com/miruto/status/985090489769590784?ref_src=twsrc%5Etfw">April 14, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">AWS lambda と Python3 を使って現在の天気をTwitterの名前に組み込むスクリプトを書きました。 on <a href="https://twitter.com/Qiita?ref_src=twsrc%5Etfw">@Qiita</a> <a href="https://t.co/MtlEGOd8yJ">https://t.co/MtlEGOd8yJ</a></p>&mdash; ひろにぃ☔あめ (@_hirony) <a href="https://twitter.com/_hirony/status/985206335787511808?ref_src=twsrc%5Etfw">April 14, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>