iPhoneアプリで学ぶ「サーバーレス」の基本概念 ~ with ショートカットアプリ ~

# サーバーがやらなければ誰がやる？
「サーバーレス」って言葉が悪い。僕は悪くない
※文中の「僕」は、非エンジニアです。カンファレンスとかでうんうん、と頷いているのに感想聞くと「よくわからなかった！」という無能っていますよね？そいつの正体です。

トレンドの一つとしてもっともよく挙がるものの一つとして「サーバーレス」があると思います。エンジニアとして働いている方々がこの言葉から連想する内容は、おそらく同一のもので食い違いは生じないでしょう。
ただ無能に対して安易にこの言葉を使うと、あとになって困るのは技術者のあなたです。
文字面から、「サーバーがなくても動くんだ！当番制で常にリクエストを待っている人が居るのかな？」とか考えます。これが無能たる所以なのですから。

以降、「サーバーレスをこれから勉強する方」や、そういった方に「サーバーレスを教えてあげたい方」達に参考としてもらえるとこのうえなく光栄です。

# 前提①：AWS Lambdaを例として進めます
「同一のシステムや実行環境を連想する」と言っても、細かい認識の違いは無数にあると思います。コンテナをベースとして自前構築した環境であったり、サービスプロバイダーの特定のサービスなどなど。
今回は「概念を知る、コツを掴む」ということをテーマとしますので、この記事で出てくるサーバーレスというワードはAWSのLambdaを想定していただければと思います。
> [AWS Lambda サービスサイトリンク](https://aws.amazon.com/jp/lambda/)

# 前提②：サーバーレスの概念について学ぶ最初の一歩を記載しています
サーバーレスの具体的な内容については上記のAWSリンクや専門書をオススメしたいのですが、今回はどういう技術として捉えればよいのかを考えるため、例示を中心として説明しています。
ざっくりとした処理実行のイメージは以下の流れを想定しています。
・トリガーとなるイベントが発生
・サーバーレスサービスが予め決められていた処理を実行
・処理結果のアウトプット

※AWSのサービスサイトで見た場合、下図のような単純な動きを想定しています。
![AWS Lambd実行イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332187/153d5263-870c-e08b-34a1-ef281f03681b.png)


# ..ここで閑話休題（※ジョジョ６部ネタバレあり）
ジョジョ６部で出てくる「ジェイル・ハウス・ロック」というスタンドをご存知でしょうか？相手の記憶を限定するスタンドで、対象は３つのことまでしか記憶できなくなります。
これにより対象はスタンドや本体の顔、能力を覚えておくことができなくなりますが、ジョジョの登場人物の中でも屈指の有能であるエンポリオが２進数により記憶を永続化することで突破しました。

CPUは次から次へと処理を実行し続け過去を振り返りません。昔実行した処理は記憶媒体に覚えておいてもらえばいいのです。逆に言えば記憶媒体を利用しない処理は、同じ処理を要求されたときでもまたイチから作業を開始します。永続化する情報の取捨選択も構築の際のテクニックとなってくるかと思います。

# 本題：iPhoneの「ショートカットアプリ」
結構昔から「WorkFlow」というアプリとして提供されていましたが、出来が良すぎるためにAppleが買収、現在iOS純正のアプリとして提供されています。
![ショートカットアプリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332187/09c8c79d-dbd9-1962-ccc2-e35fe545e558.jpeg)


アプリ名の通り、iOS上でユーザーがちまちまやっているような定型的な操作を簡略化してくれるアプリです。（AndroidではTaskerやMacrodroid を想像してください。）
はじめから「ギャラリー」としていくつかテンプレートが用意されています。
例. ウイジェットをタップすることで特定のプレイリストから楽曲をランダム再生させる。写真アプリの中のメニューからワンタップで任意のタグ付けをしてInstagramに投稿する。。など

ここからはサーバーレスの処理実行イメージ
・トリガーとなるイベントが発生
・サーバーレスサービスが予め決められていた処理を実行
・処理結果のアウトプット
の手順に従って動作するようなショートカットを作ってみましょう。

今回は、「ウィジェットのボタンをタップしたときにテキスト入力のボックスが開き、Twitterで検索したい言葉を入力すると、ハッシュタグをつけてTwitter上のツイートを検索してくれる」というショートカットを作成したいと思います。処理の順序は以下のような流れです。
・ウィジェットのボタンをタップする（イベントとなるトリガー）
・テキストの入力を要求する → 入力されたテキストの先頭に#タグをつける → 「#テキスト」をTwitterで検索する （処理の実行）
・検索結果を表示し、ショートカットを終了する （処理のアウトプットとタスクの終了）

# ショートカットの作成
設定画面とそれぞれのポイントのみを簡単にご説明します。
![ショートカット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332187/c5d8c9c3-8a3c-9b33-9ed1-d087089c4a41.png)


まずショートカットアプリを開き、「ショートカット作成」をタップします。（左図）
次の画面で、トリガーと処理を順番に当てはめます。①～⑤の処理について説明します。（右図）
**1.  「スクリプティング」を選択し、テキスト入力を受け付ける**
..ショートカットのウィジェットをタップしたときをトリガーとして、テキストの入力を受け付けるイベントです。青字「検索する言葉」は任意に決めてください。
**2.  「テキスト」を選択し、入力した文字列を任意形式のテキストに変換**
..先程の手順で入力した値（「指定入力」という変数）の先頭にハッシュタグをつけたテキストを作成します。
**3.  「変数」を選択し、テキストを変数として記憶する**
..ハッシュタグ付きのテキストを変数（青字「ハッシュタグワード」..任意に設定）に代入します。
**4.  「Safari」を選択し、変数をTwitterで検索**
..Safiri上で（Twitterアプリではなく..）Twitterページを開き、変数の内容を検索ボックスに入力した結果を表示します。
**5.  「スクリプティング」を選択し、タスクを終了させる**

右下の再生マークを押して、動作を確認してみてください。

**実行例 「Qiita」をテキスト入力した場合**
![ショートカット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332187/6a84c26a-64e7-6535-7dc7-7f0c203ef0e3.png)


要求されたボックスに「Qiita」と入力することで、#Qiita を検索した例です。

# 実行できましたか？
このショートカットではトリガーによってイベントが発生し、そのイベントをトリガーにまたイベントが..と連鎖することで検索結果が表示されていますが、本格的なサーバーレスの環境でも似たような動きを多用することになると思います。特に条件分岐や繰り返しなども必要になると思いますし、それらの動作もこのショートカットアプリ内で実行させることも可能です。

またプログラミング教育の環境などではロボットに対して「右を向く → ２歩進む → 左を向く → １歩進む..」など命令のブロックをつなげることでロボットを思い通りに動かしてみるなど、今回のような単一の処理の組み合わせから学ぶことが多いようですね。

# 総括
サーバーレスのメリットとしてよく言われるものであれば「課金体系が処理の回数に比例するので、コストの無駄が生じにくい」などが挙がるかと思います。
別の側面としては、「すでにできあがったシステムやサービス」のインプット、アウトプットを組み合わせることでより簡単に複合的な処理が可能になる、というメリットがあると思います。
特に各APIをベースにした開発手法が盛り上がりを見せている中で、常時稼働させておく必要のないサーバーレスは非常に合理的です。

どんなサービスにも言えることかもしれませんが、あるケースではベストプラクティスなサービスも別のケースでは全く使い物にならない可能性もあると思いますので、このような有用なサービスの特性を少しでも理解して取捨選択の幅を広げることが必要なんだなあと改めて思いましたし、深く理解できなくても概念程度はこの業界にいる以上勉強しておきたいものです。
Don't stay Incompetence, Stay hungly ..