2020/06/19

Azure Data Factory を使って、GCS から Azure Blob Storage へデータ転送

AzureのData Factoryを使って、Google Cloud StorageからAzure Blob Storageへデータを転送する方法です。

が、ほとんどの場合はMSの公式ドキュメント「Azure Data Factory を使用して Google Cloud Storage からデータをコピーする」で間に合っています。

ところが今回、GCSの特定のバケットにのみ閲覧権限を付与してデータを引っ張りたいと思ったら意外に苦労したので、その備忘録です。なお、当方はAzure初心者ですので、もしかしたら当たり前のことなのかもしれませんが、その辺は割り引いてください。

その前に、GCS。

GCSにて、とあるプロジェクトの中にたくさんバケットを持っている場合に、その中から選んで閲覧権限を付与したい場合があります。例えば、releaseバケットと、workバケットがあって、workは内部用として使っており、外部の人にはreleaseのみ閲覧権限を付与したいなど。

この場合、例えば次のどれかで可能です:
  • Google AccountをバケットのACLに登録する
    • これが一番簡単。閲覧権限を付与したい相手がGoogle Accountならば、それをバケット単位のアクセス制御リストに登録すればOK。Google Cloud Consoleのバケットの画面に「権限」タブがあるので、そこから登録できる。
  • Service Accountを作成して、アクセス条件をつける
    • Google IAMにてサービスアカウントを作成し、ストレージオブジェクト閲覧者のロールを付与。また、同時に「条件」にて、特定のバケット名を指定する。例えばバケット名が release ならば、resource.name == "projects/_/buckets/release" ||
      resource.name.startsWith("projects/_/buckets/release/") を条件に入れる。
  • ロールなしのService Accountを作成して、バケットのACLに登録する
    • IAMにて、Service Account作成の際にロールをなにも付与しないと、何もできないサービスアカウントができます。次にGCSのバケットの権限設定にて、そのサービスアカウントにストレージオブジェクト閲覧者の権限を付与すればよいです。
もっと他にもあるかもしれませんが。

さて、これらのアカウントをAzureから見えるようにします。

GCSのコンソールから「設定」「相互運用性」に行って、HMACキーを作成します。Google Accountならば一番下の「ユーザーアカウントのHMAC」から。サービスアカウントなら「サービスアカウントのHMAC」から。HMACキーを作ると、アクセスキーとシークレットがもらえるので、これを記録しておきます。


次にAzure Data Factory。ここもほぼ公式ドキュメントと一緒です。

Data Factoryを立ち上げて、「Manage」「Linked Service」「+New」でNew Linked Serviceが沢山出てくるので、その中から Google Cloud Storage (S3 API) を選択します。


すると、Access Key ID とSecret Access Key を入れる画面になるので、ここに先ほど作成したHMACのアクセスキーとシークレットを入れます。また、service URLにはHMACキーを作った場所に書いてあったリクエストエンドポイント「 https://storage.googleapis.com 」を書きます。名前は適宜、runtimeはそのままでOK。


記入したらCreateするのですが、ここで注意。

「Test Connection」は失敗しますが、気にしない。


ここがはまりポイントでした。Google Account(ユーザーアカウント)を使っている場合はここは成功するのですが、サービスアカウントを使っていて、かつ限定的な閲覧権限しか付与していないと、failします。ドキュメントには「storage.bucket.getとstorage.bucket.listがいるよ」と書いてあるのですが、読み取れるバケットを制限しているので、閲覧権限にそれらを付与してもうまくいきませんでした。(例えば、上の二つ目の方法、サービスアカウントを閲覧+bucket.get, bucket.listでロールを付与し、条件をつけなければ、ここがsuccessしますが、条件をつけるとNG。)

さて、Data Factoryでデータ転送するには、Azure Blob Storageの方もLinked Serviceに入れておかなきゃとのことで、+NewからAzure Blob Storageを選んで作成。

つぎに、一番左に戻って「Author」からDataSets→New Dataset→ Google Cloud Storage(S3 API) → Binary を選んで、Linked Serviceに先ほど作成したGCSのLinked Serviceを指定。これがデータソース。また、シンクとして同様にAzure Blob Storageも作ります。

DataSetsの下に先ほど作ったDatasetが現れるので、パスなどを指定。ここで、GCSのDatasetは、[Browse]をおしてもLoading Errorになります。先ほど、Test Connectionでエラーが出たのと同じ理由です。もし繋がっていると、ここでバケットの選択画面になるのですが、バケット一覧のアクセス権限がないのでダメなのだろうと思います。よって、Browseを押さずにFile Pathを埋めます。Containerの欄にバケット名を、Directoryのところにファイルパスを、Fileのところにファイル名を入れます。Directoryまで入っていれば、Fileは空欄でもワイルドカード扱いしてもらえるようです。

Blob Storageの方も同様に、Containerにコンテナ名をいれて、後は適当に指定します。

最後に、New Pipeline でパイプラインを作成して、Move And Transformから「Copy Data」をドロップ。選択すると出てくるメニュー画面から、SourceとSinkをそれぞれ先ほど作ったDatasetで指定して、「Publish All」し、Add Trigger → Trigger Nowで実行しますと、データがGCSからBlob Storageへ流し込まれます。

以上です。

ほぼ公式ドキュメントと同じなのですが、ポイントは「Connection Failed」でも気にしないというところでした。

2020/06/01

atcoder ABC169-Eをちゃんと考えてみた

表題の通りです。ややこしかったので、ちゃんと考えてみました。

問題は、次:
https://atcoder.jp/contests/abc169/tasks/abc169_e

 中央値の最小値、最大値がそれぞれ$\{A_i\}$の中央値と$\{B_i\}$の中央値であるのはすぐにわかるのですが、問題は、その間を全て埋め尽くすことができるかどうか。解説pdfでは、$x$を一個ずつ増やしていけば全部網羅できる、と、さらっと書いてあるのですけれど、$x$の可動域が小さい場合を想像すると、本当にそんなにうまく構成できるのかどうか、想像がつきにくいです。

まず、$N$が奇数の場合。

$\{A_i\}$のインデックスを並べ替えた$\{n_1,...,n_N\}$を、$A_{n_1} \le ... \le A_{n_N}$となるように作ります。同様に、$\{B_j\}$のインデックスを並べ替えた$\{m_1,...,m_N\}$も、$B_{m_1} \ge ... \ge B_{m_N}$となるように作成します。$\{n_i\}$と$\{m_j\}$は一般に異なる数列になります。

次に、集合$N_A, N_B$を、$N_A = \{ n_1, ... , n_{(N+1)/2}  \}$, $N_B = \{ m_1, ... , m_{(N+1)/2}  \}$とします。$\#N_A = \#N_B = (N+1)/2$です。

すると、上で示した中央値の最小値、最大値はそれぞれ$A_{n_{(N+1)/2}}$, $B_{m_{(N+1)/2}}$になります。ややこしいのでそれぞれ$A'$, $B'$とし、この区間を$I=[A',B']$とします。また、$A_i \le A'$ for all $i \in N_A$, $B_j \ge B'$ for all $j \in N_B$です。目標は、$I$内の任意の整数$z$を中央値として実現するような$\{x_1,...,x_N\}$を作ることです。

ここで、$N_A$と$N_B$とは一般に異なる集合なのですが、要素数が両方とも$(N+1)/2$であることから、$N_A \cap N_B$は空集合にはなりません。また、$k=\#(N_A \cap N_B)$、$k_A = \#(N_A \setminus N_B)$, $k_B = \#(N_B \setminus N_A)$とすると、$k_A=k_B$かつ$\#(\overline{N_A \cup N_B})=k-1$がわかります。

$N_A \setminus N_B$に入っている$k_A$個のインデックス$i$は区間$I$以下、$N_B \setminus N_A$に入っている$k_B$個のインデックス$j$は区間$I$以上で、かつ相手方に入っておらず、同数存在します。もし、これら以外のインデックスを用いて区間$I$内の任意の値を中央値として構成できれば、区間$I$の左右に同数の$x_i$, $x_j$をそれぞれ$x_i=A_i$, $x_j=B_j$として採用しても中央値は変わりません。つまり、この問題は$k_A = k_B = 0$として一般性を失いません。よって以下では、$k_A=k_B=0$, $N=2k-1$とします。

さて、$k_A=k_B=0$ならば$N_A = N_B$となり、また、この中に入っているインデックス$i$の全てについて、$A_i \le A'$, $B_i \ge B'$です。つまり、$i \in N_A = N_B$について、$[A_i,B_i] \supset I$です。$k$は少なくとも1以上なので、どれか一つの$i$を固定して、その$i$について$x_i = z$とします。この$z$が、実現したい中央値です。$N_A=N_B$以外のインデックスが$k-1$個あるので、それらを任意にとります。すると、$z$の左右には最大$k-1$個の$x_i$が配置されます。最後に、$N_A=N_B$にまだ$k-1$個のインデックス$j$が残っており、そのインデックスの区間は区間$I$を包含するので、$z$の左右のどちらにでも配置することができるため、両方の個数が等しくなるように$x_j$を採用すれば、$z$を中央値として実現することができました。

次に、$N$が偶数の場合はちょっとややこしいです。

$N$が偶数の場合、今回の中央値の定義は、中央を挟む二つの数の平均です。よって中央値の最小値$A'$、最大値$B'$はそれぞれ

$A' = \frac{A_{n_{N/2}} + A_{n_{N/2+1}}}{2}, B' = \frac{B_{m_{N/2}} + A_{m_{N/2+1}}}{2}$

となります。注意として、この値は整数/2の中で値を取ります。問題は、この区間$[A',B']$の間の全ての整数/2について、それを中央値とするような$\{x_1,...,x_N\}$を構成することです。

$N$:evenの場合は、$N_A = \{n_1,...,n_{N/2}\}$, $N_B = \{m_1,...,m_{N/2}\}$とします。インデックスの採用範囲が少し違います。すると、$i \in N_A$ならば$A_i \le A_{n_{N/2}} \le A'$、$j \in N_B$ならば$B_j \ge B_{m_{N/2}} \ge B'$です。

さらに同様に、$N_A \cap N_B$などを考え、$k, k_A, k_B$を作成すると、 $\#(\overline{N_A \cup N_B}) = k$になります。

まず$k = 0$の場合。$N_A \cap N_B = \emptyset$なので、$N_A + N_B =$全体になります。よって、$n_{N/2} \in N_A$, $n_{N/2+1} \in N_B$, $m_{N/2} \in N_B$, $m_{N/2+1} \in N_A$です。さらに、$A_{n_{N/2}}$は$A'$以下で一番大きい$A$ですし、$B_{m_{N/2}}$は$B'$以上で一番小さい$B$なので($n' = n_{N/2+1}$, $m' = m_{N/2+1}$として)

$A_{m'} \le A_{n_{N/2}} \le A' \le A_{n'} \le A_{m_{N/2}},$

$B_{n_{N/2}} \le B_{m'} \le B' \le B_{m_{N/2}} \le B_{n'}$

が成立しています。なお、$m'$と$n_{N/2}$, $n'$と$m_{N/2}$はそれぞれ等しいかもしれません。




 $A'$, $B'$はその定義からそれぞれ$A_{n_{N/2}}$と$A_{n'}$, $B_{m'}$と$B_{m_{N/2}}$の平均だったので、 $x_{m'} \in [A_{n_{N/2}},B_{m'}]$と$x_{n'} \in [A_{n'},B_{m_{N/2}}]$をとって、その平均$z$として$[A',B']$の中の任意の整数/2を作ることができます。(両方を最小にして$A'$, 最大にして$B'$ができ、間が繋がっているので、全ての整数/2を作成可能。)

$n' \in N_B$, $m' \in N_A$だったので、それ以外のインデックスは$N_A$, $N_B$ともに$N/2 -1$個ずつ残っており、かつ、$i \in N_A - {m'}$なら$A_i \le A_{n_{N/2}} \le x_{m'}$, $j \in N_B - {n'}$なら$x_{n'} \le B_{m_{N/2}} \le B_j$なので、$A_i$, $B_j$ともに中央値候補を構成する$x_{m'}$, $x_{n'}$の外側に同数配置できます。よって、$k = 0$の場合に$[A',B']$に含まれる任意の整数/2について、それを中央値とする$\{x_i\}$を構成することができました。

最後に$k > 0$の場合。$k > 0$なので、$I=[A_{n_{N/2}},B_{m_{N/2}}]$として、$[A_i,B_i] \supset I$なる$i$が$k$個、 $[A_j,B_j] \subset I$なる$j$が同数の$k$個あります。これらのインデックスを一旦全て取り除いて、$k=0$の状態にすると、中央値を構成できるので、そこにこれら$k$個ずつの要素を、次のように追加していきます。

 $[A_j,B_j] \subset I$なる$j$を一つ取ります。もし$[A_j,B_j]$が$[x_{m'},x_{n'}]$から左右どちらかにはみ出しているならば、そのはみ出している側に適当に$x_j$を置きます。これに対して、$i$を$[A_i,B_i] \supset I$の側から一つとって、この区間から$x_j$を、$[x_{m'},x_{n'}]$からはみ出して$x_i$とは反対側に置きます。この操作によって中央値を構成する$x_{m'}, x_{n'}$が中心にあることは変わらないので、中央値は変わりません。

また、もし $[A_j,B_j]$が$[x_{m'},x_{n'}]$の左右どちらにもはみ出していない場合、つまり、$x_j \in [x_{m'},x_{n'}]$でしかとれない場合でも、$x_i$は$[x_{m'},x_{n'}]$を含む大きい区間から任意に採用できるので、$x_i$との平均がちょうど$z$と一致するように$x_j$を採用することができます。よってこの場合でも、中央値を変えずに$x_i$, $x_j$を追加することができました。こうして$k > 0$の場合でも、この操作を$k$回繰り返して、中央値$z$をとる数列$\{x_i\}$を構成することができました。

以上。

と、できるだけ厳密に考えてみました。もちろん、もっと簡単に説明できるかもしれませんし、「一個ずつずらす」が明確にイメージできる方には冗長すぎると思いますが、ご参考まで。

2020/05/19

WSLのUbuntuとgccをアップグレードした(備忘録)

WSL(Windows Subsystem for Linux)をアップグレードしたので、その備忘録。

そもそもの発端は、atcoder.jp が主催する競技プログラミングの問題で最大公約数を算出する際の関数「gcd」が、c++17で加わったという話を聞いて、ずっとc++11を使ってきたが、そろそろ17にしようかなと思ったこと。競プロ用には、gcd は実装も容易で、自前ライブラリに入れてあるのでそれをコピペすれば十分なのですが、せっかく標準のがあるのならそれを使わない手はないし、それも含めて新しいライブラリを使えるようにしていこうと思って。

さて、私がatcoderに参加するときの手元の環境は、
  • エディタ = Visual Studio
  • コンパイラ = g++/WSL Ubuntu
  • テスト実行 = WSL Ubuntu Console
VSでコードを書き、そのコードをWSLコンソールにてg++でコンパイルしてテストを実行しています。以前はatcoder内のコードテストを使っていたのですが、コンパイルや実行が遅いことがたまにあって、デバッグで何度もコンパイルと実行を繰り返すならローカルの方が便利。VSの中でコンパイルから実行までできてもいいのですが、標準入力にデータを入れるのがちょっと面倒なので、WSLでコンパイルとテストをしています。

で、gcdが入っているコードを実行しようとしたところ、コンパイルエラーが出てしまい、調べたらgccのバージョンが古い。これをアップグレードしなければならないのだけれど、apt-getでは入ってこないし、ググると、gccだけアップグレードするのはなかなか大変そう。

だったら、Ubuntuごとアップグレードすれば?ということで、Microsoft Storeをのぞいてみたところ、Ubuntu 20が最新版で上がっていました。これをインストールし、gccもインストールしてバージョンを確認したところ、g++9まで上がっていました。もちろん、std=c++17も無事使えました。

ところで、このアップデート中にちょっと気になったところをいくつか備忘録で。

ひとつは、WSLのバージョンについて。

WSLにはWSL1とWSL2があって、WSL1とUbuntu20は相性が悪いよ、という記事(「(今はまだ)WSL1にUbuntu 20.04を入れるな」)を見つけたので、今使っているWSLのバージョンを確認しようとしたところ、いろんな記事で書かれている「PowerShellで、wsl -l -v」が実行できない。似たようなコマンドオプションは、「wsl -l」で、これによってインストールされているUbuntuが表示され、どちらが既定になっているかが表示されるものの、「wsl -l -v」の結果としていろんな記事で示されている、WSLのバージョンナンバーが出てこない。Windows Updateしろとか、PowerShellのアップデートをしろとかいろいろあったけれども、どれも不発。なんだろう?結局わからずじまいで、WSLのバージョンもわからず。作業中、PowerShellのバージョンを調べる方法も記事によってまちまちで、MSはこういうとこだぞ、と内心思いつつ。その点、Linuxは大体どれも同じような書式だったり、ググって出てきた記事がだいたいあてはまったり、オプションもだいたい似たような書式で、--version と書いておけばversionが見られたりするのでいいですね。まあ、普段はエンジン開発のテストくらいでしか使わないし(本チャンはクラウドのインスタンスを使うので)、あとは競プロなので、g++のコンパイルさえできればあまり問題がないかな・・・。

次に、Ubuntuの選択について。

Ubuntu20を入れると、前のUbuntuが消えるわけではなくて、別環境としてインストールされました。ので、旧Ubuntuの環境も引き続き残っています。ホームディレクトリなども別々なので、先のUbuntuでいろいろ整備した環境は、もう一度作り直す必要があります。といっても私の場合は、gcc, vim, screenくらいしか使わないのですが。

で、Shift+右クリックのコンテキストメニューに「Linuxシェルをここにひらく」があるのですが(注:人によってはこのメニューがない方もいらっしゃるそうで、めちゃめちゃ使いやすいのでぜひ入れた方がいいです。ただ、入れ方は知りません。)、これで立ち上がるUbuntuが、上のwslコマンドで現れた「既定」のUbuntuになりました。既定の変更は「wsl -s」で可能。

PS C:\Users\username\Desktop> wsl -l
Windows Subsystem for Linux ディストリビューション:
Ubuntu-20.04 (既定)
Ubuntu
PS C:\Users\username\Desktop>

こんな感じ。用途によって選んで使うと便利そうです。



2020/04/14

TeamsをRedmine風に使いたい

かなり昔から、高速道路の料金生成業務のタスク管理にRedmineを使っているのですが、全く使いこなしていません。様々な権限設定や詳細な承認フローなどを全部すっ飛ばして、ただのToDoリストとしてしか使えていなくて、なのにやたら起動が重いので、正直なところ全然見に行く気にならず、チケットを放置していてよく怒られます。

そんなRedmine、私たちには宝の持ち腐れになっているので、何かもうちょっと軽いアプリに乗り換えたいなと思っていたところにこの在宅ワークブームが訪れまして、以前からよく使っていたzoomと、特定の業務で使っていた(やはり自分は使っていなかった) slackに加えて、Teamsがかなり良いらしいと言う噂を聞きつけて使ってみています。

Teams、かなり良いですね。zoomとほぼ同じように使えます。zoomと違うのは、Teams外の人をミーティングに入れられないくらい?でも、TeamsはOffice365にくっついてきて、およそみんな持っているので、そこもあまり気になりません。

さて、そのように最初はzoomのMS版として、相手によって使い分けていたTeamsですが、ちゃんと見てみると、slackと同じことができたりして面白そう。そして、Plannerを入れればタスク管理もできると。もしかして、今使っている宝の持ち腐れ的な(そして手間とコストがかかっている)Redmineを、Teamsで置き換えられるのでは?

 と思ってPlannerを入れてみたのですが、何かが違う。Redmineと比較するのが間違っているのだろうと思うのですが、タスク管理が本当にただのToDoリストで、Redmineのように、タスクについて議論した内容をそれにくっつけておくために記入できる欄が、ただのメモ欄で、小さすぎる。この窓にコードを貼ったり、ケースを並べたりすることが想像できない。Redmineはフォントを変えられないのが(当時。今は知らない)致命的にイヤだったのですけれど、こちらはこちらで、この小さい箱の中で議論したくない・・・。

じゃあ、「投稿」の方で議論をして、それをタスクにくっつければいいじゃないかと気がつきました。そうすれば、タスクはただのToDoリストでも、それについての議論がちゃんと投稿の方に残っているので、Redmineっぽさは保たれます。もちろん、詳細な権限設定や承認フローなどは作れませんが、簡易Redmineというか、簡易Issue管理というか、Issueに紐付けて議論を保存しておくことができる。

その方法は以下。

まず、Plannerでタスクの題名を決め、期日と担当者を決めて、タスクを作成します。

次に、タスクの「…」を押して、「タスクへのリンクをコピー」します。

そしたら、[投稿]タブに行って、上をペーストして新しい会話を始めます。ペーストすると、タスクの題名にリンクがくっついた感じで貼られます。それがただの会話ではなく、タスクだとわかりやすいようなマークをつけておいてもいいです。

そして、そのタスクについての議論は、この投稿への返信の中で実施します。そうすると、以下、タスクについての言及がスレッドとして繋がって保持されます。

議論の結果、当該タスクが解決したら、 スレッドの一番上に戻ってタスクへのリンクを押すと、plannerのタスクに飛べるので、そこでタスクを完了します。もちろん、完了だけではなくて、タスクについての操作(アサインを変えたり、ステータスを変えたり、期日を変えたり)は、このリンクをたどってplannerに飛べば、いつでもできます。

ここまで。


このようにしておくと、Redmineのエッセンスのうち、Issueと、それについての議論の保存の部分はかなり再現できました。Redmineを使いこなしていなかったのですが、これならなんとか使えるかも。

もう一つ、タスクの側から投稿に飛ぶためには(例えば、過去のタスクで、投稿がどこに行ったかわからない時など)、 やはり投稿へのリンクをタスク側にコピペしておけばよくて、投稿側の「…」から「リンクをコピー」して、タスクのメモ欄に貼っておけばいいです。ちなみに、投稿からplannerへはTeamsアプリ内で遷移できるのですが、plannerから投稿への遷移はなぜか一旦ブラウザを経由するので、ちょっといけてないです。改善求む。

あと、そんなことは slack+asana とかでできるじゃんってのもその通りで、あくまでも Office365 のなかだけでやるっていうニーズのソリューションです。Officeはいいけど他のアプリを入れたらダメって会社は多いので。ちなみに、ウチは今日から asana 始めてみました。いいですね、asana。機能ももちろんですが、やっぱフォントやデザインが良いと、生産性上がりますよ。その意味でRedmineは、機能は素晴らしいのですが、残念。

最後に予防線ですが、Teamsを使い始めたのもつい最近なので、上のように使うのが正しいのかどうか、一般的かどうかは全く存じません。また、もっとこうすればいいのにっていう使い方があるのかもしれません。そういうのがあったらぜひ教えていただけるとありがたいです。

2019/12/02

外食インカレ2019最終審査会 感想

2019.11.30に日本青年館にて行われました、「外食インカレ2019 最終審査会」を見てきました。外食インカレは、大学生・大学院生が提案するビジネスアイデアコンテストで、今年で二回目。フードサービス協会・フードサービス学会が主催で、私は学会側から裏方としての参加でした。今年のテーマは、2020年オリパラ以後の日本を見据えて、1.外食産業の生産性向上、2.グローバル視点での外食産業マネジメントのあり方、の二点でした。昨年同様、大学2,3年生の皆さんの興味深いアイデア、ビジネスプランを拝見し、とても面白かったです。

そこで、せっかく面白いプレゼンを拝見しましたので、その感想を備忘録しておこうと思います。

最終審査会のエントリーは6組17名。実はその前に、今年の全応募が120ほどあり、第一次審査で30程度に絞られたあとの最終審査会だったそうで、最終まで勝ち残っただけですばらしいです。一応、一位から三位まで順位がつきましたが、どれも非常に興味深く、示唆に富む内容だったと思いました。

もちろん、学部学生さんの発表ですので、経営や労務等、大人の目線で見れば足りないところや甘いところがあるのが当たり前です。でも、そういったスレてしまった大人には気がつかない視点や、知らないからこそ浮き出て見えるところに鋭く切り込むような提案があるのがこういうコンペの醍醐味だと思います。つまり、そういう外からのアイデアをうまく現状とすり合わせて、変えていくことができるかどうかは、大人の側の役目だし、責任だと思います。


【①夜の給食 外食産業が子供の「こ食」を解決】

山形大学3年生の皆さんの作品。子供が夜一人で食事をとる、「個食」が今問題になっているので、これを解決するためにフードサービス業が食事付き学童保育をやったらどうか、という提案です。
確かに、学童保育で夕食はレアで、民間の学童ならば対応してくれるところもありますが、公のところではほぼない(そもそも、あまり遅くまでは預かってくれない)と思います。我が家でもなるべく夜7時頃までには迎えに行くようにはしていますけれど、たまに遅くなってしまうとき、学童さんに軽食をお願いしたりしています。
最近は子ども食堂という選択肢もありますが、そちらはボランティアベースであり、毎日開催されているものではないとのこと。学童保育は親の都合に合わせてほしいというのが働く親の要望とすれば、日程が合わなければなかなか難しいのかもしれません。
そこで、外食で学童保育も兼ねたららどうか?というご提案。外食ならば、給食で最も難しいところの食事を提供する設備はありますし、メニューも数がでれば、栄養面などを考慮した専用メニューを開発することもできるかもしれません。
栄養バランスは私も思うところで、毎日食べて栄養バランスがうまく取れればいいなと、外食しながらいつも思いますが、外食はバランスが悪い、自宅はバランスが良い、というのは昔の話。ちゃんと選択すれば、外食でもしっかりバランスをとった食事ができます。そういえば、2018の外食インカレでは、栄養バランスを考えたメニューレコメンドのアプリを開発するという提案があったような・・・。
あとは気になるお値段。一食300程度に抑えても、一ヶ月20日間で6000円。お店側としては、夜の稼げる時間に席を占有するので、300円では難しいとすると、もっと高くなりますが、そうすると家計への圧迫も強まります。しかし、これからの少子高齢化社会、子供は社会全体の宝で、働ける大人はみんなしっかり働こう、という方向に進めば、親が働いている間の子供への支出を公に頼るのもありだと思います。今、そこに投入される税金は、将来私たちの老後を支える働き手になるし、今その子達を支えてあげることで、その親御さんが気兼ねなく働ければ、今の税収がアップします。

なお、この発表がみごと優勝を勝ち取りました。社会問題に鋭く切り込みつつ、外食産業の将来も見据えたすばらしいアイデア、と、審査員の皆様方(外食の社長さんたちと農水省、経産省の方)絶賛でした。


【②訪日外国人向け「あの味」ガチャ】

中京大学3年生の皆さんの作品。声を張った掛け合いのプレゼンが斬新かつコミカルで、終始会場が和やかでした。発表内容の「あの味」ガチャもとても斬新。
国際線の空港に、和食を作れる調味料を封入したガチャを置こうという話。お好み焼き玉と天ぷら玉。帰国の際、余った小銭をガチャに使って、調味料を持って帰ってもらい、食材は地元で調達して、和食を作る。和食自体を輸出するのではなくて、和食を作る体験を売るっていうのが面白かったです。食べるだけなら和食レストランがあるけれど、作ろうと思ったら調味料集めが大変なので、ガチャで持って帰ってもらったらいいじゃん、っていう発想がいい。確かに、日本にいても、外国の料理を作ろうと思ったら、食材はなんとかなっても調味料はなかなか買えない。お店で買えないわけではなくて、その量を買っても他に使えないし、という意味で。
プレゼンが対話形式で、めちゃめちゃ練習したんだろうなという好感度が高かったです。あと、「あの味」ガチャというネーミングも好きです。

ちなみに、審査員席の後ろにいたのでぼそっと聞こえてきたのが、このカプセルにはいるかなぁ?という声。この大きさだと一人分くらいだそうです。

【③ママドルタイム】

続いても中京大学から二年生チーム。プレゼンの雰囲気(対話形式だとか、声の張り方とか)が②とほぼ同じだったので、発表順が続いてしまったのはちょっと残念でしたが、面白かったです。
さて、ファミレスなどでは昼食が終わってそこから夜までの間にお客さんが少ないので、その時間を狙って、お店が主催でママの交流会をしたらどうかという話。ん?よくやってるよね?って思いながら聞いていたところ、「幼児ではなく、0~3才をもつママ対象」ということで、なるほど。確かに、保育園や幼稚園に入って、だんだんとママとも、パパともなどができてくると、もう地域コミュニティなどに頼らずとも交流できるのですけれど、最初は確かにそうでした。私も地域の児童館主催の0歳児のなんとか会に行ったことあります。(ママたちしかいなくて、扉を開けた瞬間「しまった!」と思いましたが。)特に0歳児持ちは孤独かもしれません。
また、公がセットしてくれる会はなにかと敷居が高く感じるものですけれど(ホントはそんなことないのですが、長子の0歳児のときはそんなことも全然わからないので)、入りやすそうで、お店の人も感じよく迎え入れてくれて、出入り自由な感じがするファミレス開催はいい感じがしました。
また、0歳児連れは入れる店が限られているので、外食に非常に困るのですが、こういうイベントを開催してくれているお店ならば、気兼ねなく入ることができます。
保育園、幼稚園のプロモーションの場というアイデア、これは気がつきませんでした。都心近くにいると、保育園も幼稚園も常に応募過多の激戦ですので。


【④Moppy ~もったいないをHappyに 価値ある消費へ~】

文教大学3年生の発表は、スマホアプリMoppyの紹介でした。Moppyは、食べられずに廃棄されてしまう食品を減らすアプリで、ドタキャンSOSとテイクアウトの二本立て。ドタキャンされて余ってしまった料理をMoppyユーザーに向けて発信して来店してもらったり、賞味期限切れ間近の食品をテイクアウトしてもらったりします。
個別のチェーンや店舗ではやっているところがありそうですが、スマホアプリはホームページ争奪が激戦で、たまにしか発生しないドタキャンSOSは、沢山の店舗が連合しないと、アプリをインストールしてもらえないでしょう。どれだけのチェーンや店舗を集められるかが鍵のような気がします。
外食時の持ち帰りドギーバッグについても、わさびシートを使って雑菌の繁殖を抑えるなどのアイデアがありました。一方で、これは質問もさせて頂いたのですが、ドギーバッグの科学的な衛生面ではなくて、法的・政治的な意味での衛生面、つまり、持ち帰り食品で万が一事故が発生した場合、原因の特定や責任の所在について行政の対応方針がちゃんと出ていないと、お店側はリスクを負いきれず、その結果、ドギーバッグが使われず、食品ロスが減らないという結果になってしまいます。そこで、審査員席に農水省の方がせっかくいらっしゃっていたのでお伺いしたところ、消費者庁を中心に基本的に自己責任の上で持ち帰ってもらうという方針が出ているとのこと。あとはこれが啓蒙されると、もっと持ち帰って消費できる食品が増えると思います。(参考:消費者庁 食品ロス削減関係参考資料(pdf)
あとは、スマホ決済なのは今風ですね。ドタキャンSOSがさらにドタキャンされたら泣きっ面に蜂、お店の方をそんな気持ちにさせないためにも、さくさくスマホ決済で、あとは店舗に寄るだけなのは便利です。


【⑤程よい高さの映える仕切り ~1人客用の仕切りの提案~】

日大2年生の発表は調査研究モノ。私は一応フードサービス学会ではデータ分析担当なので、こちらのご発表は私の担当だなと勝手に思っていました。
調査研究の内容は、外食のカウンター席で真ん中席(両側に別のお客さんが座る席)に座ったとき、両側に仕切りがあるとどの程度集中でき、また、ストレスを軽減できるのか、また、その仕切りの高さによって受けるストレスは変わるのか、その結果、滞在時間はどう変化するのか、というもの。ストレスの計測は実際に食事をしてもらうのではなくて、計算問題をやってもらったあとアンケートで集中度やストレスがどうだったかに答えてもらう。
仕切りの高さは15cm、30cm、45cmの三種類。結果は、30cmの仕切りでもっとも集中でき、かつ、リラックス度が低かったので、30cmが推奨されました。 ストレスは与えすぎず、かといってリラックスさせすぎても長居されてしまうので、30cmがちょうどよいとのこと。
結果のグラフだけではそれらの調査がどの程度信頼できるのかわかりませんでしたし、高すぎず低すぎず、真ん中の高さのものが最もリラックス度が低いという結果は測定誤差のような気もするのですが、まずはこういう調査を実際にやってみて、そこから実務的な施策に繋げてみるということで、大学生の課題としてはちょうどよかったと思います。あとは、統計的検定まで踏み込んで回答を吟味できるとよいですが、そこは3年生、4年生になってからぜひ取り組んでみてもらえたらと思いました。



【⑥スマホゲームでホワイト産業に!】
神奈川大学からは工学部の学生さんが、働き方をよりよくするサービスの提案でした。飲食店でのアルバイトをゲーミフィケーションによって楽しく、有意義な活動に変化させよう、というご発表で、プレゼンの画面もドラクエのようなRPGの画面を模した作りで面白かったです。
確かに、飲食店でのアルバイトはドラクエのようにLevel 1の初心者から始まって、日々レベルを上げたり、クエストをこなしていったりするゲームのようなものです。人によって向き不向きもあり、仲間と一緒に力を合わせて取り組んだり、足りないところを補い合ったり、ゲーム仕立てにするのにちょうど良いかもしれません。
興味深かったのは、アルバイトをする飲食店を変更してもレベルが維持されるというところ。前のお店での経験値がそのまま次のお店でも活かされて、多少は新しい仕組みに慣れる必要はあるものの、それまで育成してきたアビリティは引継がれます。
このサービスが一番すばらしい点は、冒険者のデータが取れて、それが見える化されるということです。日々のアルバイトでの活動やコミュニケーション、こなしたクエスト、それらがすべてドラクエのような世界観の中でデータとして残っているということ、また、それは「転職」してもある程度引継がれていって、自分の成長を俯瞰できるところ、さらには、誰かとの関係においてデータによってそれぞれの得手不得手が可視化されるので、パーティーを組みやすいこと。
データが取れていることでお店側は何ができるかというと、アビリティとクエストとの間の関係性を計算でき、さらにそれをオペレーションの最適化に繋げることができるというところです。シフト最適化や給与最適化という話題がプレゼンの中にもありましたが、まさにゲーミフィケーションによってリアルデータが取得でき、データに基づくオペレーションができるようになることが、この仕組みの最も重要な点だと思います。
実際、シフト最適化プログラムの作成依頼はしばしばあるのですが、データが乏しいことがいつも問題になります。経営者視点では、簡単に「それぞれの仕事に得意な人をあてて」とか、「相性の良い人をペアにして」ということが出てくるのですが、現実的にはそれらを示すデータはほぼありません。 いつも言いますが、データ分析で上手くいっているところの多くは、上手くいくためのデータを取る仕組みを作ったところです。その視点では、このサービスは人的資源配置最適化のための基礎データをとるプラットホームとしてかなり決定版なサービスであるように思います。もちろん、アルバイトさんが面白がってちゃんと使ってくれるような仕掛けは、もっともっと考えていく前提で。


【おわりに】

ということで、全6組の感想でした。昨年に引き続き、非常に興味深いイベントでした。外食の企業の経営者の皆さんも真剣に発表を聞いていらっしゃいましたし、産学を繋げる意味も大きかったように思います。そういえば学生さんのコメントで、アルバイトの経験はあったけれども、このイベントを通して外食の経営側の視点を持つことができたというお話しがありました。こういう機会があることで、アルバイトの側でしか知らなかった外食業界を、経営側として感じることができると、優秀な人材が集まるきっかけにもなると思います。もし来年も開催されるようでしたらぜひ裏方として携わり、学生のみなさんの面白い発表をまた拝見したいと思います。