AWS
C#
OpenWeatherMap

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


みんなが使えるようになりました(追記 2018/11/20)


【祝】Twitterの名前をお天気と連動されるアプリを作った時の技術的な紹介【公開した🌥️】


導入

みなさんこんにちは!

私は将棋プログラムPonanzaの作者、山本一成といいます。Qiita初投稿です。よろしくおねがいします。

いつものようにTwitterをしていた時、ふと思ったんです。

「Twitterの名前の部分が天気のEmoji:sunny::umbrella2::snowman2:と連動して変わったら嬉しいな」

つまりこんな感じですね ↓

tmp.PNG

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


技術選択

さっそく技術選択の段階です。

こういう類のプログラムは技術の選択がとても大切です(たぶん)。

正しい技術選択をすればとても幸せなのですが、間違えると末代までの不幸がプログラマに訪れます。

とりあえずTwitterでの名前はTwitterAPIを使えば、変更できそうです。

TwitterのAPIはTwitterのアプリ登録とかして、ConsumerKey・ConsumerSecretKey・AccessToken・AccessTokenSecretとか取得すればいいみたいです。これは検索すれば無限に出てくるので割愛。

続いてプログラム言語選択です。

python🐍も素敵でしたが、C#を選択しました。

プログラマというのはひな鳥🐣と一緒で最初の覚えた言語を親だと思うのです。

ついでにC#でTwitterAPIを操作するライブラリはCoreTweetというのが良さそうなので、それを選択します。

作者様ありがとうございます🙏🙏🙏

続いて、天気情報APIです。

世界には善意が溢れていて、こういったAPIはどなたかが用意してくれるものです。

探したら OpenWeatherMapというのがありました。ありがたや🙇🙇🙇

自宅のPCを24時間動かすという選択は色々しんどいのでダメですね。

(そういう選択もなくはないですが、結局そういった運用は長続きしない気がします。)

それでサーバーをクラウドサービスを使って立てようかと思ったんですが、ふと思いました。

これは最近よく聞くサーバーレス技術というのを使うべきなんじゃないかな?


サーバーレス技術

サーバーレス技術とはなんでしょうか?

いままで、細々とした処理(マイクロサービスと言うみたいです)をデプロイさせようと思ったら、以前はサーバーを新しく立てるか、既存のサーバーに相乗りさせてもらうしかなかったのです。

しかしサーバーレス技術を使えば、マイクロサービスごとに細かく管理できますし、嬉しい副次効果とかしては利用したCPU時間しか課金されないので、今回程度の使用量でしたら、無料かそれに近い値段で使用できます。

今回利用するサーバレス技術のサービスはAWSLambdaです。

クラウドサービスを牽引するAWSのサービスで C# のほか python, node.js, go, java 使えるようです。

図はAWSLambdaのWebUIです↓

今回は特に使うことはないのが、右側はDBやログです。実行したコードの結果を送るなどができるようです。

左側は実行させたいコードを発火💣させるイベント情報です。AWS各種サービスを連動させたり、APIをつないだり、一定間隔🕓で呼び出したりできます。

CloudWatchEventsを用意して、5分おきにイベントを発火させるように用意しました。

キャプチャ.PNG


実装

Visual Studio2017を使用しました。

プログラマというのはひな鳥🐣と一緒で最初の覚えた(エディタ | IDE)を親だと思うのです。

AWSLambdaとVisual Studioは完全に連携ができており、AWSIAMというのを一度VS側で登録したら、VSだけでLambda側にコードを転送・実行ができます。完成度の高さに驚きました。

実際に書いたコードは100行ちょっとです。しかもその大半は今の天気に対応するemojiはどれかをif文で書き上げるコードで、大事なコードはこれだけです。めちゃ簡単です。

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を返すのですが結構Emojiだけで対応できそうです。







月齢を考慮した月のEmojiも可愛いのでいれた

夜に曇りや雨出ない時は月のマークを出すようにしました🌝🌖🌔🌘🌒🌗🌓

image.png


日の出直後に起こるバグ問題

お天気APIで日の出🌅、日の入り🌇時間も取れたので、それに従って昼夜の判定をしていました。

if (sunrise <= now && now <= sunset)

{
// お昼かどうかの可能判定
}

それで数日運用していたのですが、その時にフォロワーさんから朝方に大陽:sunny:が出ている時に星🌟になっていると指摘されました。お天気APIの指定に従って表示しているだけだしなぁ~と考えていたんですが、しょうがないので朝に起きることにしました。朝6時🕕に起きたよ・・


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

if ((sunrise <= now && now <= sunset) || ((sunrise + oneday) <= now && now <= (sunset + oneday)))

{
// 日の出日の入り時刻は最大でも一日で一分程度しかズレないのでほぼ問題ない。
}


感想

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

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

Twitterでよくつぶやいています。この記事が楽しかったら、ぜひフォロー⚡してください。



追記

自分でも実装してくれた人がいるみたいです。嬉しい:sunny::sunny::sunny: