iCal週間天気予報を支える技術

この記事は「[個人アプリ/サービス開発の進め方と運用、得た学び - 02【PR】 Lenovo Advent Calendar 2020](https://qiita.com/advent-calendar/2020/lenovo_app_02)」に参加しています。

# iCal週間天気予報とは

「スケジュールを確認するときに合わせて天気も確認できたらな」という人は多いでしょう。
私もその一人です。
そして、これまでは「livedoor天気予報」というサービスがあり、iCal形式で配信される天気予報をカレンダーアプリに登録することで、チェックしていました。
しかし、2020年7月31日をもって、このサービスの終了が発表されたのです。

ここで困った私は、自分で作ろうと思い立ちました。
（裏側の話をすると、以下の本を執筆している最中で、livedoor天気予報について紹介していたのです。）

『ITエンジニアがときめく自動化の魔法』
https://www.amazon.co.jp/dp/4802612486

ところが、サービスが終了してしまうと、本の読者は試せなくなってしまいます。
書いたページを省略する、という判断もあったのですが、自分で似たようなサービスを作ってみることにしました。
そして、自分で作るだけでなく、他の人にも使ってもらおう、と考えたのです。

そして、できあがったのが「iCal週間天気予報」です。
https://weather.masuipeo.com

詳しい使い方はサイトを見ていただければと思います。

# どんな技術で動かしているのか

ここはQiitaですので、その裏側について解説します。

## iCalとは

今回提供するiCal週間天気予報は名前の通り「iCal形式」で配信するものです。
iCalはiCalendarの略で、その書式はRFC 5545で定められています。

iCloudのカレンダーや、Googleカレンダーなどに登録して使用でき、これらのカレンダーアプリが自動的に更新を取得してくれます。
フォーマットはただのテキスト形式で、以下のような形で作成し、Webサーバーに配置するだけです。

```txt
BEGIN:VCALENDAR
省略
END:VCALENDAR
```

## 天気情報の取得

天気情報は気象庁が提供しているXMLデータを使うことにしました。
気象庁では、「防災情報XML」というデータを配信しており、無料で使用できます。
http://xml.kishou.go.jp

詳しい情報は上記のサイトを見ていただくとわかるので省略しますが、観測所ごとに毎日の天気予報や週間天気予報などを配信されています。
今回はこの週間天気予報のデータを使用しました。

## フォーマットの変換

このサービスを提供するためには、上記の気象庁のサイトから取得したXML形式のデータをiCal形式に変換する必要があります。
今回はレンタルサーバーで実行するため、手軽なPHPを選択しました。
PHPには```simplexml_load_file```という関数が用意されているので、この関数でXMLファイルを取得し、取得した項目をiCal形式に変換するだけです。

これを、各都道府県のすべてのXMLファイルに対して実行し、iCal形式のテキストファイルとして保存しておきます。

## ファイルの提供

変換したファイルをWebサーバーの公開領域に、iCal形式のテキストファイルとして配置します。
逆に言えば、公開しているのはこの単純なテキストファイルだけなので、見た目上はシンプルな静的サイトです。
（1日に1回、上記の変換処理を実行してファイルを上書きするだけ）

## 開発時間

実際には、上記の変換処理だけなので、開発に要した時間はXMLファイルのフォーマットの理解を含めて2日程度です。
その後、実際に自分だけで1週間ほど運用してみて、特に問題なさそうなので、公開することにしました。

# 公開前に考えたことと公開後の状況

## アクセス数の予測

一般に公開するにあたり、どのくらいのアクセス数が来るのか予測しておく必要があります。
それによって、レンタルサーバーを使うのか、AWSなどのクラウドを使うのか判断しようと考えました。

とはいえ、個人が提供するサービスをどのくらいの人が使ってくれるのか、想像もつきません。
そこで、1つの目安として1万人という数値を考えました。
なんの根拠があるわけでもありませんが、1万人が使うサービスとなれば、それなりの規模だと考えられます。

そして、1万人が1日に3回アクセスする（カレンダーアプリが1日3回更新する）と考えると、1万×3回×30日＝月間約90万PVとなります。
ただのテキストファイルだけなので、月間100万PV程度ならレンタルサーバーでも問題ない、というのは私の経験から判断できました。
（過去にそれ以上のものを運営していたため）

もしこれを大きく超えることになれば、大成功だと考えて途中でクラウドに移行することになるかな、と考えていました。
（最初からクラウドという選択肢もありましたが、個人事務所のWebサイトとして契約しているレンタルサーバーなら無料で使えるため）

## 実際に公開してみて

公開を開始してから、noteに記事を書きました。
https://note.com/masuipeo/n/nf6636e5919b8

公開したのが7月下旬で、少しずつアクセスが増えてきます。
そして、8月に入ったあたりで、Twitter上で多くのつぶやきが出てきます。

「livedoor天気予報が終了してカレンダーの天気が更新されない」

このようなツイートを見つけるたびに、今回のサービスを開始したことを返信で紹介していきました。
これを繰り返していると、着実にアクセス数が増えていきました。

そして2ヶ月が経とうとしている9月末、ついに1日のアクセスが想定していた3万回に到達。
開始前に想定していた「1万人が1日に3回アクセスする」という状況が生まれました。

そして、翌月は1ヶ月で110万PVを超えてきました。
その時の記事がこちらです。
https://note.com/masuipeo/n/nd2dade6f8ce2

ただし、上記の記事を見ていただくとわかるのですが、通常のブログなどと違って特定の日にバズって100万PVという状況ではない、ということです。
常に安定して毎日3万PV〜4万PVくらいを繰り返しています。

## 今後について

上記の記事からまた約1ヶ月が経ちました。
現在も安定して1日4万PV〜5万PVあたりを継続しています。

特に集中したアクセスがあるわけでもないので現在のところはこのままレンタルサーバーでもいいかな、と考えています。
（これが10倍になると、さすがにレンタルサーバーでは耐えられないような気がしますが）

# 今回のサービスを作っての学び

最後に、今回のサービスを作って気づいたことを改めて紹介します。

## ちょっとしたことでも手を動かすことが大事

今回のプログラムは、XMLファイルをiCal形式に変換するだけのプログラムです。
iCal形式のフォーマットを知っており、提供されているXMLファイルのレイアウトがわかっていれば、1時間もかからずに作成できるでしょう。

しかし、それを実際に作ってみて、公開してみると1万人を超える人に使っていただけるようになりました。
livedoor天気予報の終了というタイミングがあったことも事実ですが、やはり手を動かしてやってみると、iCalを何か他に使えないかな、というアイデアも生まれてきます。

## 発信することが大事

今回も、ただ公開するだけでは多くの人に使ってもらえるところまでいかなかったと思います。
しかし、Twitterなどで積極的に宣伝（紹介）をすることで、多くの人に届きました。

そして、一部のYouTubeなどで紹介され、確実に利用者が増えていきました。
このQiitaもそうですが、記事を作成することで多くの人の目にとまり、使ってもらえるようになります。

個人でサービスを開発したけれど、なかなか利用者が増えない、という場合は発信力をつけていかないといけないと改めて感じました。