コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

やりたくない作業はガチャで解決 iOSアプリChoreGachaの作り方

毎度おなじみクソアプリ Advent Calendar 2018の25日目、2年連続オオトリの記事でございます

「あなたにとって一番ためになったビジネス書はなんですか?」なんてことを面接とか飲んでるときとかに話したりするよね。

そんなときはオレはいつもカーネギーの「人を動かす」と答えている。 この本は本当にいい本で、オレは本編の他にも漫画版も持っている。

人に何かをしてもらいたいときには言い方や接し方が重要だよと当たり前のことを説いてる本で、「プログラムは人と違って嘘つかないから良い」とか言っていたかつてのオレのような人にはおすすめなんだな。 人を動かす 文庫版マンガで読み解く 人を動かす

そんなことはさておき、オレと同じ家に妻がいるんですけどね。 やれ「部屋を片付けろ」だの、「読んでもいない本を処分しろ」だの、「なんだかわからないケーブルを捨てろ」だの「謎のガジェット捨てろだの」頭ごなしに言うわけですよ。

本当にわかってない、ピープルマネージメントがわかってない。こんな言い方ではコミュニケーションの試験は赤点だ。

そんなにガミガミ言って人が動くわけがない、もっとこう片付ける気にさせるようにマネージメントしなさいよと、カーネギーの人を動かすを渡そうとするとどういうわけか火に油

しょうがないから片付けを仕組み化できるようなアプリを作らせろと言ったところ、そんなの作る時間があったら片付けろ言われる始末。至極まっとうな主張なのでぐうの音も出ない。

そんなこんなで妻が数日出張で家を開けたんですよ。

「これは片付けていいところを見せるチャンスだ」 「この隙きに片付けアプリを作って部屋を片付けまくって見返してやるぜ!!」

と言って作ったのが今回のこちら

作ったアプリ概要

「面倒くさいことややりたくないことはスキマ時間にちょっとづつやればいい」 ちょっとづつ何回もやればいずれ全部解決するという寸法だ。

やらなければならないけどやりたくないことを集めて、これらをガチャを回して一つに決める。決まったものを10分間実施し、時間が来たら音が鳴るというiOSアプリ

アプリ名

アプリ名はChoreGacha(チョアガチャ)、雑用(chore)をガチャを引いてこなしているのでチョアガチャ

登録されているChoreは以下の7個

  • テーブルや机を片付ける
  • 水回りを掃除する
  • 本棚を整理する
  • いらないものをメルカリに出品する
  • 伝票の仕分けをする
  • 筋トレかストレッチをする
  • 英語をちょっと勉強する

Choreの追加や編集は? できねぇよ。コード書き換えりゃあいいじゃねぇか

デモ


面倒くさいことをガチャで解決


しょうもないアプリの作り方

さて技術的にはそんなに高度なことはしていないが、作りたいもの機能をどうやって最小限に絞り込むのかについて、今回はいつもとは趣向を変えて例を示したい。

趣味で作って公開したものはバズらせたい気持ちもわかる。オレも正直せっかく作ったものが多くの人に知られてほしいとも思う。

わかるけれども少しばかりバズったところで人はすぐに忘れていくのだ、コンシューマの消費行動に我々クリエイターが疲弊する必要はないのだ。ないのだ!!

下記のことをして漠然としたやりたいことから、やるべきことを絞り込んで実装するという流れで作っていく

  • やりたいこと
  • MVPを考える
  • 具体的なタスクリストにする
  • タスクを潰していく(作っていくと判明したタスクの追加もする)

やりたいこと

  • 本棚の片付けや机の整理をちょっとづつやる
  • ガチャのように選びたい
  • タスクはタスクごとに制限時間をつける?
  • やる時間を設定(セレクトする5、10分 20分 30分)
  • ガチャを回す
  • ストップウォッチスタート
  • タスクの登録(内容と、選べる時間帯を複数)
  • デザインも適当なキットみたいのを当てたい
  • RxSwiftを使ってみたいから使う

MVPを考える

MVP(Minimum Viable Product)はプロダクトのコアだけ作る、機能の取捨選択した一番小さいプロダクトのことを指す。特に重要なのはやらないことを明確にして書き出しておくことだ。

やらないこと

  • タスクの登録はやらない
    • 固定値にする。モデルのリストをイニシャライズする
    • なので永続化もしない
  • アプリがバックグラウンドでどれだけ再生できるかは気にしない(最悪10分持てば良い)
  • 時間設定もなくていい画面が増えるから 10分とか固定
  • UIにこらない、デフォルトでいい、アニメーションもこらない
  • AutoLayoutを気にしない。iPhone Xで見られればいい
  • 1画面1ストーリーボードみたいにいい感じにしない
  • FatViewControllerを気にしてファイルをいい感じに分割しない

やること

  • ガチャを引く
  • タスク決定
  • タイマースタート
  • タイマーをっぽいことをバックグラウンドで動かす
    • -> どうやらストップウォッチ的なのはiOSアプリは作れないっぽい
      • ローカルプッシュ通知を使う
  • RxSwiftで書く。全然本質的じゃない書き方でいいのでRxを導入する

MVPから導き出されるUIは

  • トップ画面、ガチャを引く
  • タスク決定、タイマースタート開始ボタン
    • ストップウォッチをバックグラウンドで動かす
    • 10分後に通知が飛ぶ

MVPを作るためのタスク

  • [x] XcodeでUnitテスト付きで作りアイフォンでデバッグできるようにする
  • [x] CarthagoでRxswiftを入れて適当なプロプログラムを動かす
  • [x] 2枚めの適当な画面を作る
  • [x] ボタンを押したら画面遷移するようにする(ストーリーボードじゃなくてコードで)
  • [x] 画面遷移で値(最終的にはモデルクラス)を渡す
    • [x] 中間段階として文字列を渡す
    • [x] モデルを渡す
  • [x] タイマーを作る、時間が過ぎたら適当な音がなるようにする。バイブでもいい
    • [x] 適当なストップウォッチ機能を作る
    • [x] タイマーのバックグラウンド再生する
    • [x] ストップウォッチ機能をカウントダウンするようにする
    • [x] カウントが終わったら、音を鳴らすようにする
  • [x] モデルを作る、structで作ること
    • 内容: タイトル、対象時間を入れたいところだけど今回はタイトルだけ
  • [x] ガチャのロジックを作る
    • [x] ガチャを引く、選定、画面遷移
    • [x] 選ばれたモデルをラベル表示
  • [x] タイマー画面の調整
    • [x] 戻るボタンを付ける。タイマーもリセット(ちゃんと作ってないからリセットされるかも)
  • [x] 見た目を整える
    • [x] タイトル表示
    • [x] ボタン名をつける
    • [x] タイマー開始前のラベル名がlabelのままなので00とかにしておく
    • [x] サンプルのRxのコードを消す
  • [x] 他にやるとしたら
    • [x] バックグラウンドでタイマー完了後に音を鳴らせないのでローカル通知にする

じゃーねーロケットビーバイ!!

人を動かす 文庫版

人を動かす 文庫版

マンガで読み解く 人を動かす

マンガで読み解く 人を動かす

「キッチハイク! 突撃! 世界の晩ごはん」書評

KitchHikeというウェブサービスがあり

kitchhike.com

そこのCTOの藤崎さん*1と飲む機会があった。 飲んだあとにKitchHikeのオフィスに遊びに行った際に、社長の山本さんもいらっしゃってこのサービス名と同じ名前の本を山本さんが出したというので一冊いただきました。

「読んだら書評を書きますね!」と言ったはいいものの1年半ぐらい経ってこれを書いている。まだアマゾンで売っていてよかった。

キッチハイク!  突撃! 世界の晩ごはん

キッチハイク! 突撃! 世界の晩ごはん

さて重い腰を上げて書評を書いているかというと。

先日からバックパッカーのバイブルとも言える沢木耕太郎深夜特急を本棚の奥の方から引っ張り出して読み直していたところ、旅先で出てくる料理がとても美味しそうに魅力的に感じられた。

この旅の料理に特化した本があったよなぁというので「キッチハイク! 突撃! 世界の晩ごはん」を思い出したというわけだ。

「ちょっと世界一周してくるわ」と行く先々の国の家庭にお邪魔しては飯を食い歩いていた内容がこの一冊に収まっている。書き始めからこんな調子である。

いざ、モグモグ・ザ・ワールドだ!旅先の道端ででたった人に声をかけるのはもちろん、友だちの紹介(の更に紹介)、FacebookAirbnbを介して、「あなたのおうちでご飯を食べさせてくれませんか」とアプローチしまくることにした。

完全にヤベー奴である。

1つの国ごとに章だっていて、雑誌のコラムとして連載していたものなので文も長すぎず読みやすい。書きっぷりはなんとなく石田衣良池袋ウエストゲートパークシリーズの各章の終わりの方で事件の顛末やらが書かれているあたりを彷彿とさせる。

小難しく考えることなく読ませてくれる文章で暑い国のビールを飲みながら読むのが合いそうだ。

この本を一言で表現と「深夜特急 + 孤独のグルメ」と言ったところで、言い得て妙ではないかと思う。

この本を読んで、日本に馴染みのないなんか変わったものが食べたくなったら、キッチハイクのサービスで食べに行けばよいだろう(最高にうまいサービスへの誘導)

例えばこんなのとか、面白そうだよね。 ▼予約受付中▼ 12/09 シンガポールの定番朝食「カヤトースト」を食べよう! in 東京 - キッチハイク


さて、ソフトウェアエンジニア的な目線で、キッチハイクを語るとテックブログとてもよく書かれている。

tech.kitchhike.com

みんなが飛びつきがちな最新のテクノロジーをガンガン使ってますというのではなくて、モダン過ぎずレガシー過ぎないいい感じに、システム開発を技術的負債が出にくいようスキルレベルが高くないメンバーでも開発できるようなサステイナブルな開発をしていることが読み取れる。

キッチハイク!  突撃! 世界の晩ごはん

キッチハイク! 突撃! 世界の晩ごはん

深夜特急(1?6) 合本版

深夜特急(1?6) 合本版

劇的紀行 深夜特急 [DVD]

劇的紀行 深夜特急 [DVD]

*1:藤崎さんはオレが選ぶ三本の指に入るイケメンCTOなのである。

中国広州市にあるリトルアフリカ、そこにやってくる彼らは実際どこからやってくるのかデータを集めて検証した

f:id:kon_yu:20181007143852p:plain

ことのはじまり

「その日暮らしの人類学」という本で、タンザニアの人の暮らしぶりを書いた本がある。

この本ではタンザニアから衣料品や家電の買い付けのために香港から中国本土に渡り買い付けに行くということらしい。

本文から抜粋すると、

 なかでも広東省広州市には、サブ・サハラ以南のアフリカ系交易人が多く集まることから「チョコレート城」「リトル・アフリカ」「広州ハーレム」などと呼ばれる卸売商店街が形成されている。

中略

アフリカ系交易人が集まる場所は主に次の二つの区域であり、ここまで辿り着ければ、現地のアフリカ系住民や交易仲間に助けてもらうことができる。一つは白雲区の三元里周辺であり、もう一つは越秀区の小北路周辺である。

  • 小川さやか.「その日暮らし」の人類学~もう一つの資本主義経済~(光文社新書)より抜粋

というように、広州市にはリトルアフリカがあるらしい。これは面白そうだということで2018年の3月に実際に上述の本に書かれている広州市の小北路周辺行ってみた。

「その日暮らし」の人類学 もう一つの資本主義経

最近、「さいはての中国」という中国のあまりニュースに流れない変わったところを取材している本が発売され、これにも広州のリトルアフリカが紹介されていている。これも買って読んでいて最初に埼玉の西川口が紹介されていておもしろい。

さいはての中国

さいはての中国 (小学館新書)

さいはての中国 (小学館新書)

リトルアフリカの実際の様子

香港から国境を渡った深センから広州へ高速鉄道に乗車すると、確かに肌の黒い人達がチラホラいて、「ああ本に書かれていたことは本当なんだなぁ」と期待が高まった。

小北路周辺というのは、地下鉄小北(シャオベイ)駅付近のようで、地下鉄の駅を降りると中国系の人々の姿がめっきり減り、黒人・アラブ人の姿が目立つようになる。

ウイグルの人がやっているレストランがたくさんあり、同じイスラム教徒のアフリカ・アラブ系の人たちが食事をとっていた。 その中の1件に入ってみると、中国籍中央アジアっぽい顔立ちの夫婦が店を切り盛りしていた。メニューに写真があったので多分ラグメンと思われるものを食べた。(ラグメンってこんな食べ物だったような気がするが書いていて自信がなくなってきた)

普段中国で見るのは漢民族ばかりなので中国は多民族国家なのだな実感したし、切り盛りしている奥さんは美人だった。

商業ビルの中にはモスクもありイスラム教に対応している。(お祈りをしている人にお祈り前に撮影の許可はとってある。つたない英語とジェスチャーなので若干通じたかどうか怪しいが)

配送可能な国々を表示している看板には、日本人には馴染みの薄い国旗が目立つ

アフリカっぽい服も実は中国で作られ輸出されていることがわかる

その他高そうな偽物の時計や、偽物のiPhoneXが売られていた。

特に偽物のiPhoneなんて隣の世界一の電気街がある深センではキワモノゾーンで売っており、中国でも本物のiPhoneを使っている人が多くて、 誰が買うんだと思っていたらどうやらアフリカで売ろうとしているのかもしれない。

データを取得してタンザニアから来る人達がいるのか検証

リトルアフリカを歩いている様々な国の人っぽい人たちが実際どこから来てどこに向かっているのか、Instagramのデータを集めて集計して、 先の「その日暮らしの人類学」にかかれていたとおりタンザニアからやってくる人たちがいるのかどうか検証した。

データの取得方法

Instagramには投稿する写真に場所データを付けて投稿することができる。

また中国本土ではInstagramは、YoutubeTwitterFacebookと同様に規制がかかっておりアクセスできないので中国の人はあまり利用していない。 それに地元の人から見ると何でもない駅でも、遠い異国買い付けに来た人たちにとっては旅の目的地なのだ。そりゃインスタにも写真を上げるだろう。

先述した通りリトルアフリカの一つがある小米駅付近であり、小米駅を場所データとして投稿している画像をまず集めることにした。

ここで小米駅の英語表記である「Xiaobei Station」をInstagramで検索すると下記のようなページを見ることができる。

Xiaobei Station - Instagram

f:id:kon_yu:20181007142113p:plain:w300

  • このページの画像データからユーザの情報を抜き出し、365人分のInstagramのユーザ名のリストを取得した
  • このユーザ名のリストから、一人ひとりのユーザの投稿している画像データを一人あたり最大150件取得し、その中から位置情報が含まれているものを 20910件抽出した

生のデータは下記のリンクの「original」のシートに記載されている

pythongram_sample - Google スプレッドシート

このデータを元にGoogle Data Studioにプロットするとこのような世界地図にプロットしたものと、棒グラフで図示した。 (中国と香港は除外することでデータを見やすくしてある)

データ数の多い国別にランキングにしてみるとこの様になった。

順位 データ数
1 マレーシア 732
2 タンザニア 673
3 ロシア 590
4 アメリ 552
5 日本 448
6 タイ 398
7 フランス 367
8 イタリア 294
9 トルコ 289
10 オーストラリア 279

考察

データ数が圧倒的に多かった中国や香港と同様にマレーシアが1位なのはマレーシア経由で広州へ来ている可能性が考えられる。

その次にタンザニアがあり、検証したかった「その日暮らしの人類学」にかかれていたとおりタンザニアからやってくる人たちがいるのかどうかということとに関しては検証できただろう。

また世界地図にプロットしてあるデータを見る限りアラブ圏、アフリカ以外の世界中から広州のリトルアフリカにやってきているのがわかる。 ロシアやアメリカ、そして日本が続くのも気になるところだ。Instagramのデータなのでも観光目的できた場合に撮ったデータの場合も大いにある。

そこでもう少し検証を進めて、出身国をある程度推測した場合データがどうなるか調べてみることにした。

出身国を推定

1ユーザあたり1つの国で1枚データをGoogle Mapに表示

小米の場所データを付随してInstagramにアップしていたユーザーは365人、1ユーザが1つの国で投稿しているデータを1つだけ取り出してみた。 つまりAさんが、アメリカで投稿したデータが2つ、日本で投稿したデータが3つあった場合、アメリカで1つ、日本で1つだけ抽出するということだ。

その1ユーザが1つの国で投稿しているデータを一つだけ取り出した抽出したデータは1714件となった。 生のデータは下記のリンクの「国ごと」のシートに記載されている。

pythongram_sample - Google スプレッドシート

Googleマップのマイマップ機能を使ってその1714件プロットするとより具体的に世界中に散ってることが感覚的にわかる。 (マップ上のピンをクリックして、URLのリンクを開くとその対象のInstagramのページを見ることができるようにしてある)

各ユーザの居住国を推定してグラフ表示

各ユーザの国ごとの投稿したデータの数を比較し一番投稿が多い国は住んでいるところのデータであろうと仮定した。要は 一番投稿が多い国 = 居住国 とし、小北駅にの位置情報データ月の画像をInstagramに投稿していた365人分のユーザの出身国を集計した。

生のデータは下記のリンクの「推定出身国」のシートに記載されている。

pythongram_sample - Google スプレッドシート

このデータも、Google Data Studioにプロットした(中国と香港は除外することでデータを見やすくしてある)

データ数の多い国別にランキングにしてみるとこの様になった。

順位 データ数
1 タンザニア 28
2 マレーシア 18
3 タイ 15
4 ロシア 12
5 アメリ 11
6 日本 10
7 ケニア 8
7 マカオ 8
7 フランス 8
10 韓国 7

考察

圧倒的にタンザニアが多い、続いてマレーシア、タイと続く。 おそらくロシアからも中国南部の広州まで買い付けに来ていることがわかる、ロシアの場合は陸路で北の方で仕入れをしてそうだが、この辺も追って調べてみたい。

7位にケニアが登場していたり、プロットされて世界地図を見る限りサハラ砂漠あたりの以外のアフリカの各国々から広州に買い付けに来ているのが伺える。

出身国を各ユーザの投稿数の多い国と仮定した方法で、予想通りタンザニアが1位になったことは満足行く結果となった。

終わりに

香港に行った際には、重慶大厦という安宿がたくさん入ったビルで良く宿泊する。ヨーロッパ系、アジア系、アフリカ系の様々な人種の人たちが旅行や商売のためにやってくる。 初めてそのビルを訪れた2009年から特に商売できた人達が一体どこから来てどこに行くのかずっと気になっていた。

Webやテレビ、書籍で情報だけは知ることはでき、アフリカ・アラブ系の人たちが向かうらしいという広州に実際に行くことができた。 そして現地の肌感覚を掴んだ後に、今度はまたWebの世界を使って広州にやってきた人たちがどこから来ているのか調査することができた。

余談だが、これを読んで重慶大厦に泊まってみたいと思った人がいるかも知れないが自己責任でお願いしたい。2017年に泊まった際には、共同のトイレの取っ手が内側から外れていて23時頃に「Help me!!」と何度も叫ぶ羽目になった。人生で本当にヘルプミーなんて言うことになるとは。といった場所である。

「小北駅の位置情報付きでInstrgramに画像を上げているユーザの、他の位置情報付きの情報を使って調査する」という発想自体、現地で自撮りをしている黒人を見なければ得られなかった。Webを含むメディア -> 実地 -> Web の循環が、調査の仕方として面白く。大げさに言えば人の知を広げることになるんだなとしみじみ思う。

またこのInstrgramの位置情報を使って調査する手法は、それぞれの国や公的な機関が出した統計データよりも生き生きとしたナマのデータを取得することができて、社会学とか経済学の研究やフィールドワークに使えないかな? こういう方法があるよや使ってみたい人がいたら @kon_yu まで連絡ください。


どうやって画像情報を収集したのかと言うようなテクニカルな情報はこちら

qiita.com

ソースコードと実行結果のjsonやテキストファイルはこちら。プログラミング言語Pythonを使っている

github.com