病室で作った16個のもの全部
2021年の前半は重めの病気を患い、4ヶ月の闘病生活を送っていました。治療に苦しみながらも、少しでも楽になるためのものや単純に興味本位のものを沢山開発しました。今週から(多分)一旦仕事に戻れることになったので、作ったものを全部記録します。
- 1. 点滴したまま着脱できる上着
- 2. 虚構じゃないbot
- 3. 寝ると止まるpodcast
- 4. COCOA再起動アプリ
- 5. brbrBeat(ぶるぶるビート)
- 6. OpenKen
- 7. 寝てる人の割合分析
- 8. Stick Figure Recorder / 棒人間メイカー
- 9. 段階的に難易度を変えられる時計
- 10. みんなの忘れたニュース(再)
- 11. 富士山が見える建物マップ
- 12. 絶対右折したくない検索
- 13. ARタイムラプス
- 14. 東京断面テープ
- 15. 空を絵画に持ってくる
- 16. 自分がいつ呼ばれるか予測するページ
- おしまい
1. 点滴したまま着脱できる上着
健康だった頃は考えたことも無かったのですが、点滴をつけたままだと上着を着脱できないんですよね。抗癌剤治療は朝9時から深夜2時まで点滴が刺しっぱなしだったので、気軽に温度調整ができなくて困りました。そこで、袖を面ファスナーで開閉できるようにすることで、点滴をしたままでも着脱できる上着を作ってみました。
点滴つけたままだとセーターを脱着できない(袖に腕を通せない)のが辛くて、点滴つけたままでも着れる上着の設計図を描いた。そしたら妻と母が半日でユニクロの上着を改造してくれた。めっちゃいいよこれ、市販して!(調べたら似た構造のパジャマは見つけたけど上着は見当たらない。) pic.twitter.com/crTQXuID6d
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年1月17日
入院中はずっと助かっていました。ユニクロとか作ってくれないかなー。
2. 虚構じゃないbot
最近虚構新聞かと思うような現実のニュースが増えてきたような気がします。そこでTwitterや、はてなブックマークで「虚構新聞かと思った」のようなコメントが沢山ついたニュース記事を自動的にピックアップして紹介するbotを作ってみました。
虚構新聞好きなんだけど最近現実の虚構ぶりのほうが凄いので、「虚構新聞かと思った!」みたいなコメントがついているニュースを自動的にピックアップして紹介するBotを作りました。眺めるだけで面白いです。 https://t.co/nz6NLF8hTW
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年2月7日
運用して3ヶ月、話題になった虚構っぽいニュースを的確に拾ってくれて、割と人気アカウントになっています:
ただどうしてもコロナ関係の少し暗いニュースが多くなるので、もっと幅広く拾えるようになるといいですね。
3. 寝ると止まるpodcast
病室で本を読むのも辛い時は大体podcastを聞いてたんですが、寝落ちすると次回巻き戻すのが面倒臭い問題に悩まされていました。そこで、Fitbitが睡眠を検知したら自動的にスマホの再生を止めるアプリを作ってみました。
最近podcastを聞きながら寝るんだけど、いつも寝落ちしてどこまで聴いたかわからなくなるのでFitbitで睡眠を検知したらスマホの音楽/podcastを全部止めるアプリ作ってみた。今晩が楽しみだ。 https://t.co/DNAztHHOos
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年2月16日
使ってみると:
- 睡眠が誤検知されて起きてるのに止まってしまわないか不安になり、余計に動いてしまう(ので寝られない)
- いつ止まるかドキドキしているせいで寝られない
- 寝る直前に聞いてたことをあまり覚えてないので、結局10分ほど巻き戻すことになる
- でも朝起きてちゃんと止まってると嬉しい
という感じで、まだ実運用に耐えるには改善が必要そうです。そのうちリリースしたいと思います。
4. COCOA再起動アプリ
COCOAを毎日再起動させるだけのアプリです。朝のニュースでAndroid版COCOAは一日一回再起動が必要という(ひどい)ニュースを聞き、数時間で作りました。(最近のCOCOAは再起動しなくても良くなったそうです。)
任意のアプリを毎日再起動させる「毎日再起動」をリリース🚀しました。こちらからインストールできます: https://t.co/KTMDfXDHka
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年2月22日
厚生労働省いわく「COCOAを毎日再起動して」とのことですので、手動でそんなことやってられない方は是非ご利用ください。 https://t.co/KRO3RIS0At
厚生労働省のマークと再起動のアイコンをミックスさせた少し怪しいアプリアイコンにも関わらず、Playストアがちゃんと審査通してくれました。少し驚きです。
5. brbrBeat(ぶるぶるビート)
このブログを書くまですっかり忘れてた、一日で作ったSNSです。画面タップでリズムを作成・共有し、人のリズムをスマホの振動で感じて楽しむ新感覚振動投稿SNSです。「勉強が捗るリズム」とかを投稿しあったりして、スマホをブーブー言わせて感覚を楽しむ体験がしたくて作りました。朝3時のテンションで作ったら全然面白くなくて、友達と遊んだあと存在を忘れてました。たぶんリズム作成能力のある人が遊んでくれたら面白くなるんじゃないかと思います。誰かチャレンジしてみてください。
入院中に半日で作って一回遊んですっかり忘れてた新しいSNS「brbrBeat」。タップでビート(振動)を作ってシェアしたり、人のビートをフィールできる。画像・動画・音声の次の新しいメディアはこれだ!って朝3時のテンションで作ったら全然面白くなくて一人でウケてた思い出。 https://t.co/IzCRhfKlmX pic.twitter.com/LVCsi3ndhM
— 何も作らないほうのKen Kawamoto (@kenkawa_etc) 2021年5月10日
6. OpenKen
一時退院中に家族に見守ってもらえるように作った、フルオープンの生活見守りサイトです。装着したFitbitやスマホから位置情報や活動状態を収集し、リアルタイムでダッシュボードで表示します。我が家では、これを表示させたタブレットをリビングに飾っていました。
退院したとはいえ一人で出歩くと家族に心配かけるので、僕の状態(活動、心拍、位置など)がリアルタイムで見守れるOpenKenというサイトを作りました。誰にでも超openな新発想の見守りサイトなので全世界が僕を見守ればいいさ: https://t.co/bmqCIyZ40l pic.twitter.com/cOyCWfzBg2
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年3月14日
せっかくなので全世界に生活をフルに"open"にしたらなにが起きるか実験しようと思い、誰でも閲覧できるようにしてみました:
- 数週間後でも眺めてくれてる人がちらほらいました。運動してると閲覧数が上がるので、なんか面白いらしいです。
- 20人ぐらいに位置情報を見守られながら散歩すると「見られてる感」が結構強いです。必要以上に歩くの頑張ってしまいます。
- 特に危ないことは無かった。
7. 寝てる人の割合分析
祖父江慎さんの疑問「人間の一番多い%が寝ていた瞬間っていつだろう」が面白かったので、少し観点を変えて「一日のなかで一番多い%が寝ている時間」を計算してみました:
これとても面白い疑問だと思ったので、手持ちのデータで簡単に計算してみたら驚きの結果になった。ざっくり「人は現地時間の22時から6時の間寝てる」と仮定した場合、日本時間の8時に世界の86%が寝ているという結果に。逆に22時には3%しか寝ていない。極端すぎて少し計算結果に自信ない! https://t.co/O2J6d6vDBR pic.twitter.com/smzzmOr2OT
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年3月10日
日本時間6時には世界の79%が寝ている、逆に21時には世界の98%が起きているという結果に。(もとのツイートからは計算間違いや前提条件を変えているため少し値が違います。)仮定は少し乱暴(人は22時から6時まで寝る想定)ですが、そんなに大きく実情と違わないはず。ある程度偏りはあれど、人間は世界中に遍く分散しているイメージがあったので、ここまで極端な結果は意外でした。世界中の人が参加するイベントは夜9時に開催しろってことですね。
こういう、昔から存在するデータ(人口分布データ)を違った観点でみることで新しい知識を生むのはすごく楽しいですね。
8. Stick Figure Recorder / 棒人間メイカー
棒人間のgifを簡単に大量生成するために開発した、棒人間動画「録画」サイトです。
超便利なの作ってしまった。なにかと棒人間のgifが欲しいことがあるんだけど、自前でアニメーション作るのは大変。なのでウェブカメラで撮影した動画から棒人間gifを自動生成できるサイトを作った。PoseNetを使っているのでブラウザ上で動きます。遊んでみてください!: https://t.co/z6LtZbsB1P pic.twitter.com/ckPMe28URF
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年3月16日
ウェブカメラから取得した画像を骨格情報に変換し、棒人間として表示してgif化しています。GoogleのPoseNetを使うことで、完全にブラウザ内で完結させています。
作ったgifをアップできるGalleryの作品を参考に、是非自分の棒人間gifを作ってみてください。
9. 段階的に難易度を変えられる時計
時計に苦戦している子供のために作った、段階的に難易度を変えられる時計です。
子供が時計に苦戦してるので、今日は「段階的に難易度を上げていける時計」を作ってみました。最初は色がついていたり針に直接時間が書いてあったりして、難易度バーを上げていくと少しずつ視覚支援が減っていきます。時計の練習している方は使ってみてください: https://t.co/IfHR31jYAM pic.twitter.com/FGMD8ONZ64
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年3月19日
既存の練習用時計は視覚補助の種類が少なく、子供の習熟度に合わせて難しくしていけないのが不満だったため、こういうのを作りました。また、視覚補助をon/offの2値ではなく連続的に表示させることで、まるで麻の苗木を毎日飛び越えるように負担少なく次のレベルに移行できると思っています。
多分アプリにしたら売れると思ったんですが、面倒なのでソース含めオープンです。
10. みんなの忘れたニュース(再)
昔作った「みんなの忘れたニュースbot」を完全に作り直しました。色んな事情で半年ほど寝かせていたのですが、まだフォロワーが5万人以上いて再開の声が多くあったので、刷新することにしました。前バージョンの一番の不満が「何のニュースか分からない」ということだったので、一つ一つのニュースに関連ツイート含め紹介するページを自動生成し、Tweetからリンクするようにしました:
世間が [他山の石] について話さなくなって30日が経ちました。https://t.co/VxMeAVKYD6
— みんなの忘れたニュースBOT (@wasureta_news) 2021年4月25日
11. 富士山が見える建物マップ
こちらで既に解説していますが、オープンの地図データを使って、都内で富士山・東京タワー・隅田川花火が見える場所を探せる地図を作りました:
わーい隅田川花火が見える建物マップできたよ https://t.co/73LTJuLhLb pic.twitter.com/LFu3bpOzzz
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年4月2日
12. 絶対右折したくない検索
自分は完全にペーパーなのですが、どうしても運転しないといけなくなった時のために「極力右折を避ける経路を検索してくれる地図」を作ってみました:
ペーパードライバーすぎて右折が恐怖な人(自分)のために、右折をしなくていい経路を検索するナビを開発しました。「絶対右折したくない検索」https://t.co/rVoq0rsUpx ひたすら直進と左折をグルグル繰り返しながら、目的地に行ける経路を表示してくれます。 pic.twitter.com/yhht0fBkh4
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年4月13日
半分冗談で作ったページですが、実際に米国UPSは配達車の左折(日本でいう右折)を避けることで事故数や移動時間を減らしているそうです。また警察庁統計でも左折車による歩行者死亡事故の6倍の事故が右折車によって発生していることがわかっています(右折・左折件数毎のデータが無いので結論つけにくいですが。)元々僕は運転なんて殆どの人間がやるには高度・危険すぎると思っているので、自動運転が来るまでこういうハックで少しでも安全を確保するのはアリなんじゃないかと思います。
本業(Googleマップ)にだいぶ近いので危うい感じもしましたが、多分弊社が絶対に製品化しないだろうと信じて作ってみました。
13. ARタイムラプス
植物の定点観測を、固定カメラでやるのではなく、スマホカメラをARで位置合わせしてやるという実験です。
実験。毎日同じ構図で(アサガオとかの)写真を撮りたくて、ARでカメラの位置合わせができるアプリを作ってみた。昨日の撮影位置に3つの玉がAR表示されるので、それを合わせると昨日と同じ位置・角度で撮れる。ずっと固定カメラを庭に放置せずとも植物のタイムラプスが作れる、はず。 pic.twitter.com/3YcRu5aXpP
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年4月6日
まあ当然ながら固定カメラのほうが安定してますね。ちょっと実用には耐えなそう。
14. 東京断面テープ
日本語で「スカイライン」ってあまり聞き慣れないと思うのですが、観光地図とかでよく見る街のシルエットのあれです:
昔からこれが好きで、色んな角度から自動生成できたら面白いんじゃないかと思ってました。というわけで、国土交通省のオープンデータPLATEAUを使って作ってみました:
#PLATEAU のデータから東京のスカイラインを作って印刷してみたらちょっと素敵だったんだけど、こんなマスキングテープ(全長1.2m)需要あるかな。東京タワーからレインボーブリッジ周りが特にかっこいい。 https://t.co/yUCJMPE6Wd pic.twitter.com/gatiEHGGGN
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年5月1日
せっかくどんな角度でも作れるようになったので、山手線円周のスカイランをマスキングテープにしてみようかと思います。
15. 空を絵画に持ってくる
今の入院ってコロナの関係であまり病室も出られないし、来客も禁止されてるしで、代わり映えしない窓の外を眺め続けるしかありません。僕は2ヶ月間一つの部屋に居続けて、気が狂いそうになりました。そこでこうやって絵画の空を切り出して窓に貼り、実際の空を透過して見えるようにしたら空の変化に気づけて少し気が紛れるのではないかと思って作ってみました:
今日はゴールデンウイーク晴れが気持ちよすぎるので、いろんな絵画を大型連休化してみた。 pic.twitter.com/NeQI8dyTiU
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年5月3日
16. 自分がいつ呼ばれるか予測するページ
病院は待ち時間が多いですよね。殆どの時間は受付番号とのにらめっこで終わります。番号が呼ばれる早さから自分が呼ばれる時間を予測することは誰でもやると思うのですが、暇すぎてこれを半自動化してくれるページを作りました(病院で自分の番を待ちながら):
病院の呼び出し待ちの時間が暇すぎて、自分の受付番号がいつ呼ばれるか予測するページを作ったぜ。 https://t.co/yVZTbMScbl pic.twitter.com/DEGLdqNFJw
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2021年5月6日
おしまい
治療中(特に抗がん剤投与中)は「本業は休み」「入院中のため子育てができない」「色々新たな不都合に直面して開発のネタが出てくる」という、趣味の開発に非常に適した条件でした(治療が辛いことを除けば)。そのためこの4ヶ月間を振り返ると、治療よりも「楽しく色々作れた」という記憶のほうが強いぐらいです。この4ヶ月間楽しく開発できたのは、治療を耐えられるようにしてくれたお医者さん・看護師さんたち、家を守って色々サポートしてくれた家族、僕が作ったもので遊んで褒めてモチベーションを維持してくれた友人たちのおかげです。とりあえずは一旦生きられることになりました。ありがとうございます。
Plateauを使って「富士山🗻が見える場所マップ」を作ろう
急に街歩いてて「富士山見てぇ!」となることありませんか?僕はしょっちゅうあります。そんな時のために、富士山が見える場所を速やかに探せる地図を作ってみました:
本稿は「Plateauのデータで遊んでみたい!」「GISデータを使ってグリグリ動かせる3D地図を作ってみたい!」という方のために、この地図の作り方をざっくり解説します。ものすごく長いので、自分が興味のある部分だけ読んだらいいと思います。
全体の流れ
「富士山が見える建物を探す地図」作りはこんな流れで行います。みんなが富士山地図を作りたいわけじゃないと思うので、自分が実際につくりたい用途に合わせて適当に読み替えてください。
- データの読み込み:ダウンロードしたPlateauデータを自分のプログラムで好きに扱えるようにしょう。今回はJavaで扱う場合を解説します。
- データの解析:建物データを分析し、富士山が見える建物を拾い出しましょう。
- データの出力:可視化ページで表示できるように、データの出力を行いましょう。今回はGeoJSON形式(3D地図のため)と2Dタイル形式(2D地図のため)を出力する方法を解説します。
- 可視化ページの作成:みんなが遊べるように、ブラウザで動く可視化ページを作りましょう。今回はReact + leaflet + OSMBuildingsを使いました。
扱うデータ
最近話題になっているPlateauを使ってみました。国土交通省がリリースした、日本各都市の正確・精細な建物データです。Twitterで検索すると色々な方が美麗な可視化をしているのを見つけられると思いますが、本稿ではあまり美しい3DCGは出てきませんのでそこは期待しないでください。
まずはデータをダウンロードしましょう。Plateauの意識高い感じのトップページから見つけるのは困難なのですが、 ググるとダウンロードページが出てきます。何種類かデータフォーマットがありますが、プログラムからデータ解析したい場合は(世の中にあるライブラリ的に)CityGMLが良いと思います。
東京が14ファイルに分かれてzipされているので、全部ダウンロードしましょう。
CityGMLフォルダの中身
色んなzipがありますが、今回使うのは「bldg.zip」(建物データ)と「dem.zip」(地面の標高データ)との2つです。
データを読み込む
自分のプログラムで建物データを扱える環境を整えましょう。使いたい言語、環境によって色々方法が異なると思うので、「[言語] + CityGML」でググりましょう。筆者はJavaが好きなので、citygml4jというライブラリを使いました。作者が用意してくれているサンプルプログラムSimpleReader.javaを使えば難なく建物が読み込めると思います。
建物データ
まずは建物データを読み込んでみましょう。今回の「富士山が見える建物」のためにはざっくりとした形状が分かればいいので、「lod0roofedge」(一番荒い3Dデータ)しか使いません。これは、「高さ」と「外周の二次元形状」だけで建物を表す、最も荒い形式です。
<?xml version="1.0" encoding="UTF-8"?> <core:CityModel...> ... <core:cityObjectMember> <bldg:Building gml:id="BLD_ec49bb85-efc6-4bd4-acb2-c3f230b28e9c"> <!-- 地面からの高さなので注意 --> <bldg:measuredHeight uom="m">4.1</bldg:measuredHeight> <bldg:lod0RoofEdge> <gml:MultiSurface> <gml:surfaceMember> <gml:Polygon> <gml:exterior> <gml:LinearRing> <!-- 屋根の外周の座標値 --> <gml:posList> 35.56646362724824 139.7668571400079 5.8260000000000005 35.56647781006162 139.76683164441192 5.8260000000000005 ...
地形データ
同じく、demファイルも読み込んでみましょう。こちらは標高を表す三角形の羅列です:
<?xml version="1.0" encoding="UTF-8"?> <core:CityModel...> <core:cityObjectMember> <dem:ReliefFeature gml:id="RLF_4a7e5bc5-ad22-4522-91d2-b6bc0677b088"> <dem:lod>1</dem:lod> <dem:reliefComponent> <dem:TINRelief gml:id="DEM_4a7e5bc5-ad22-4522-91d2-b6bc0677b088"> <dem:tin> <gml:TriangulatedSurface srsName="http://www.opengis.net/def/crs/EPSG/0/6697" srsDimension="3"> <gml:trianglePatches> <gml:Triangle> <gml:exterior> <gml:LinearRing> <gml:posList> 35.53127756660067 139.7561542106938 2.9695 35.53127785139326 139.7566335063924 2.9885 35.53149395745237 139.75624222099665 2.9645 35.53127756660067 139.7561542106938 2.9695
なぜ地形データも必要かというと、前述の通り建物データには「地面から屋根までの高さ」しか入っていないからです。建物の相対位置を正確に知るためには、更に地面の標高を足し合わせる必要があるので、地形データも取得しました。
富士山が見える建物を全部探す
さて、建物と地形のデータをプログラムで扱えるようになったらシコシコと三角関数等とかを使いながら建物間の遮蔽関係を計算していきます。 この辺は作りたいものに依りすぎるので、参考程度にざっくりとだけ説明します:
まず建物毎に「絶対」高さを計算します。これは各建物が立っている場所の標高(地形データより)と、建物の高さを足し合わせたものを各建物について計算したものです:
次に、各建物について「富士山が見えるかどうか」を計算していきます。といってもなにか難しいことするわけではなく、愚直に「建物Aの屋上から富士山の五合目を見た時に建物Bが遮蔽するか否か」を総当り的に計算するだけです。こちらのアニメーションでは、ある建物(黒)から富士山を見た時に邪魔になる建物を赤く描画しています:
実際に総当りすると計算に数週間かかってしまうので、色々と枝刈りをして一時間半ぐらいに落とします。頑張りましょう。 多分これ、レイトレのアルゴリズムとか使えば一瞬で計算できたりすると思います。が、一回計算するだけなので、一時間半待ちました。
その結果、「富士山が屋上から見える建物群」が計算できました:
結果を使いやすい形に出力する
後述するように、今回はLeafletとOSMBuildingsを使ってデータの可視化を行います。 Leafletのためには2D画像のXYZタイル、OSMBuildingsもXYZタイル化されたGeoJSON形式で出力します。
XYZタイルってなに?
国土地理院の解説がわかりやすいのでそっちを読みましょう。 要は:
- [zoomLevel]-[x]-[y].pngのように同じ大きさ(256x256ピクセル)に分割された(メルカトル図法の)画像を事前に用意しておく
- zoomLevel=0の時には全世界を一つの画像(つまり 0_0_0.png)で地球を表す。
- zoomLevelが一つあがるたびに倍の詳細度になる。(つまりzoomLevel=1では 1-0-0.png, 1-0-1.png, 1-1-0.png, 1-1-1.pngの4枚の画像で地球を表す)。つまり一般的には 0 <= x,y < (1<<zoomLevel)
Leaflet用の2D画像を用意する
後述するLeafletは2D地図をブラウザで簡単に表示させてくれるライブラリです。前述したXYZタイル形式で画像を用意しておけば、至極簡単に描画してくれます。まずは画像だけ出力しておきましょう(雰囲気だけ):
// [0~1]のピクセル座標値を緯度[-90~90]に変換する // [https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames] public static double normalizedXToLongitude(double x) { return (x - 0.5)*360; } // [0~1)のピクセル座標値を経度[-180~180)に変換する // [https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames] public static double normalizedYToLatitude(double y){ return 2*Math.toDegrees(Math.atan(Math.exp(2*Math.PI*(0.5-y)))-Math.PI/4) } for(int zoomLevel = 0; zoomLevel <= 18; zoomLevel++) { // さっき説明したやつ。ズームレベルが1つあがるたびに詳細度が倍になる。 int tileSize = 1 << zoomLevel; for(int tileY = 0; tileY < tileSize; tileY++) { double tileWest = normalizedYToLatitude( tileY / (double) tileSize); double tileEast = normalizedYToLatitude( (tileY+1) / (double) tileSize); for(int tileX = 0; tileX < tileSize; tileX++) { double tileNorth = normalizedXToLongitude( tileX / (double) tileSize); double tileSouth = normalizedXToLongitude( (tileX+1) / (double) tileSize); // (どうにかして)タイル内に引っかかる建物をとってくる List<Building> buildingsInTile = fetch(tileNorth, tileWest, tileSouth, tileEast); // (どうにかして)描く BufferedImage img = draw(buildingsInTile); // 書き出す ImageIO.write(new File(String.format("tiles2d/%d_%d_%d.png", zoomLevel, tileX, tileY), "png", img); } } }
一つ一つのタイルはこのように、地球のどこかを切り取った小さな画像になります:
作った画像たちをCloud Storageにでもあげておきましょう:
gsutil -m cp -R tiles2d gs://[your bucket]
こうすれば、こんなURLでタイルをとってこれるようにまります: https://storage.googleapis.com/[your bucket]/tiles2d/{z}{x}{y}.png
OSMBuildings用のGeoJSONを書き出す
後述するOSMBuildingsは3D地図を簡単に表示させてくれるライブラリです。Leafletと同じように、XYZタイル形式で用意した3Dモデルのタイルを描画してくれます。こちらも同じように出力しておきましょう:
public Object renderBuilding(Building building) { List coordinates = building.lod0RoofEdge.stream() // 何故かlongitude, latitudeの順番なので注意 .map(p -> ImmutableList.of(p.coord.longitude, p.coord.latitude)) .collect(toImmutableList()); String color = building.canSeeFuji ? "#ff0000" : "#555555"; return ImmutableMap.builder() .put("id", building.buildingID) .put("type", "Feature") .put("properties", ImmutableMap.of( "color", color, "roofColor", color, "height",building.measuredHeight)) .put("geometry", ImmutableMap.of( "type", "Polygon", "coordinates", ImmutableList.of(coordinates))) .build(); } public Object renderBuildings(List<Building> buildings) { return ImmutableMap.of( "type", "FeatureCollection", "features", buildings.stream().map(::renderBuilding).collect(toImmutableList()) ); } // ... for文の定義まで上に同じ // (どうにかして)タイル内に引っかかる建物をとってくる List<Building> buildingsInTile = fetch(tileNorth, tileWest, tileSouth, tileEast); // (どうにかして)描く Map renderedBuildings = renderBuildings(buildingsInTile); // 書き出す String json = new Gson().toJson(renderedBuildings); File outFile = new File(String.format("tiles2d/%d_%d_%d.json", zoomLevel, tileX, tileY); exportFile(outFile, json);
これも上と同じように、Cloud Storageにでもあげておきましょう。
可視化ページの作成
富士山が見える建物マップではLeafletとOSMBuildingsを使って地図を描画しています。
Leafletで2D地図を描画する
描画自体はreact-leafletを使えばとても簡単です。
まず説明書の通り、index.htmlに以下の文を足しておきます:
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==" crossorigin="" />
そしてページの好きなところにMapContainerのcomponentを足しましょう:
import { MapContainer, TileLayer } from 'react-leaflet' <MapContainer center={initialCenter} zoom={initialZoom} scrollWheelZoom={true} style={{ height: "100%", width: "100%" }} > <-- 下にOSMの地図も描画しとく --> <TileLayer attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" opacity={0.3} /> <-- さっき作ったやつ! --> <TileLayer url="https://storage.googleapis.com/[your bucket]/tiles2d/{z}_{x}_{y}.png" /> </MapContainer >
これが上手く動くと、このようにOSMの上に自分で描画した建物が表示されるはずです:
はまる点としては、僕はNext.jsを使おうとして失敗しました。Leafletを使うにはcomponentをdynamic importする必要があるのですが、しかしdynamic importを使おうとすると、componentが一々再描画されてフリッカーしたりstateがリセットされる現象が解決できず、結局Reactを使いました。
OSMBuildingsで3D地図を描画する
こちらはreact用の優しいcomponentは用意されていません。なのでrefを使って自前で用意したdivにbindしましょう。 まずindex.htmlのどこかでOSMBuildingsのスクリプトを読み込んでおきます。
<script src="https://cdn.osmbuildings.org/4.0.0/OSMBuildings.js"></script>
そしてdivを作ってOSMBuildingsをbindしましょう:
import { useEffect, useRef, useState } from 'react'; const mapRef = useRef(); useEffect(() => { if (!mapRef.current) return; const osmb = new OSMBuildings({ container: mapRef.current.id, position: { latitude: 35.6620, longitude: 139.7038 }, zoom: 15, tilt: 45, minZoom: 15, maxZoom: 17 }); // こちらも下にOSMを描画しておく osmb.addMapTiles('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© Data <a href="http://osm.org/copyright">OpenStreetMap</a>' }); // さっき作ったGeoJSONタイル! osmb.addGeoJSONTiles(`https://storage.googleapis.com/[your bucket]/tiles3D/fuji/{z}_{x}_{y}.json`); }, [mapRef.current]); return <div id="map3D" ref={mapRef} />
これがうまくいくと、めでたく3D地図が描画されます:
データを見てみよう
最後に、可視化したデータから何か面白いことが見えるか探索してみましょう。 まずは標高データ。こうすると東京の0m地帯がはっきりよく見えますね: 渋谷(画面中央)が谷なのがよくわかります:
建物の高さを見ると、新宿の西と東が全然様相が違うことがわかりますね: そしてこの高い建物群のせいで、東側広範囲にわたって富士山が見えない領域が広がっています。建築基準として日照権などは定義されていますが、「富士山見える権」みたいなのが定義されたら面白いですね。僕は欲しい。
ついでなので、「富士山🗻と東京タワー🗼が両方見える建物」も探索してみました。多分物件情報とかと組み合わせたら面白いんじゃないかと思います。「富士山・東京タワー・スカイツリーが見えるマンション検索」とか作ったり、「景勝地が複数一枚の写真に収められる写真スポット探索サイト」とか作ったり。
他にもなにか富士山の見える建物の分布で発見がないか、是非さがしてみてください:
まとめ
本稿ではPlateauデータの取得、分析、そして人にブラウザで遊んでもらえる可視化ページの作成までを駆け足で解説しました。 Plateauのように使いやすいデータの登場により、データや可視化好きの人はお祭り状態のように喜んで色々作っています。
個人的な思いとして、遊んだ成果物を画像や動画としてアップするだけではなく、「みんながグリグリ動かして遊べる」環境を整えることがコミュニティから次のアイディアが生まれることに繋がると考えています。そのため、是非こういったデータを使った面白いアイディアを思いついたら、本稿を参考に(してもしなくても)、ぜひ「遊べる」プレゼンテーションをしてみて頂けると書いた甲斐があります。
ではまた!
2020年に作ったもの13選
今年も仕事の外で沢山作りました。気に入ってるものや話題になったものを少しまとめます。大体が「話題になったけどその後放ったらかしにしちゃいました」で終わってます。ごめんなさい頑張ります。
Unity少し覚えた
ずっと覚えるつもりだったUnityをようやく少し覚えました。おかげで今まで面倒だったARのアイディアを沢山実現できました:
1. 置き場所から家具を選べるAR
3月に作った「既存のアプリみたいに家具を選んでから置けるか確かめるのではなくて、置き場所を決めてから入る家具を見つけるほうがいいよね」という提案です。沢山共感の声をいただき、色々記事にもしてもらいました。
僕が家具を探してる時は既に置き場所が決まってる事が多いので、「ここになるべくピッタリ置ける家具」をARで検索できるアプリ作った。ニトリのアプリとかに内蔵されてたら嬉しいよね。 pic.twitter.com/w4u036qUDl
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年3月15日
実際にこれを使ってうちは庭の机とキッチンのゴミ箱を買いました。購入フローの完成度高めたり、家具販売サイト等にお話に行くのが面倒で放ったらかしにしちゃいました。
これで既製品の家具を買うだけではなく、部屋にピッタリな家具を自動生成してEMARFとかで発注できたらいいなーとか思ってます。
2. 屋内日時計
部屋の中にいても「外っぽさ」を楽しめる日時計。デバイスと太陽の位置関係から「正しい」影を計算しています。こういうちょっとしたアイディアをすぐ実現できるのもUnity素晴らしいですね。
Unity完全に理解したので、太陽の位置を計算して正しい影を投影する「部屋の中で使える日時計」を作った。机に置いておくとけっこう「外」感があって引きこもりには良い。 pic.twitter.com/6FrLMJDJDf
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年7月12日
「外出りゃいいじゃん」とか誰も言わないの優しいなと思いました。作ったときの気持ちは「tempescope」の時と少し似ていて、コロナとかを理由に引きこもらないといけないときは、部屋の空間を異世界化させるデバイスを作りたくなるんですね。
スマホそのままだと少し「表示させてる感」があるので、石の筐体にディスプレイを埋め込んで本物感を出そう、とか思ってるうちに放ったらかしにしてしまいました。
3. 縮尺の正しい太陽系AR
子供が宇宙好きなんですが、太陽や地球の距離感がいまいちピンと来てない感じだったので作ってみました。
太陽系を見れるARアプリは沢山あるんだけど、大きさと距離の縮尺が正しいのが見つからないので簡単に作ってみた。歩くことで太陽系のデカさが実感できる!週末は子供と7km先にあるはずの冥王星(太陽の直径が1.6mの場合)を探す旅に出ます。 pic.twitter.com/QWIhTNAG0p
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年10月20日
沢山話題にしていただいたので直ぐにリリースしようと思ってたんですが、歩いてる途中で位置をロストするバグを直すのが面倒で放ったらかしにしてしまいました。(数キロ歩いたあとこれが発生すると発狂するよ。)来年こそリリースします。
ずっと家にいた
今年は(会社の遠くに引っ越したこともあり)ほぼ一年間在宅勤務してました。そのせいか、働き方を楽しくするものを色々作りました:
4. 乗り過ごし検索
「このまま会社で降りずに電車に乗り続けたらどうなるんだろう」を検索できるサービス「乗り過ごし検索」。正月に作りました。絶対本業で作らなそうな機能なので、作ってて楽しかった。まさかこの数カ月後に通勤の概念自体が消えることになるとは思いもよりませんでした。
連休の終わりが受け止めきれないので、会社の駅で降りずに通り過ぎると行ける景色の良い場所🌴を探せる「乗り過ごし検索エンジン」を作った。明日の出勤失敗に使います。 https://t.co/mfEgahK6Kh
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年1月5日
5. ずっと祝日カレンダー
自分が平日だと思っている日に(海外にいる)同僚が祝日を満喫していることが妙に面白く感じ始めて作りました。一緒に働いている人たちが祝日だと、自分は休みじゃないのに少し自分も休み気分になるんですよね。そこで全世界の祝日を集めて毎日休みな気持ちになれるカレンダーを作ってみよう、と思ったのがこちらです。
年中ほぼ全ての日がどこかしらの国で祝日だという事実に気づいてしまったので、「ずっと祝日カレンダー」を作った。『今日はアルメニアで陸軍の日だからダラダラ仕事するかー』みたいに使ってください。 pic.twitter.com/Az2FIaQUAa
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年1月26日
試作して意気揚々とツイートしたら、過去に川村真司さんがほぼ同じコンセプトのカレンダーを(2010年に!)作成されていることを知りました。謝りに伺ったら「全然いいよ、一緒につくろうよ」(意訳)ということを言っていただき、川村さんと宗佳広さんと一緒に販売開始しました。おかげで自分一人では不可能なハイクオリティのデザインにしていただき、去年分は完売、2021年分はこちらで大好評販売しています:
6. ハンドソープを出すと(WHO推奨)30秒音楽が鳴るソープスタンド
コロナ時代に合わせて、手洗いを啓蒙しつつ(この頃は休校で家に居る)子どもたちにハンダ付けを体験してもらおうと考えて、こういうキットを作りました:
ハンドソープを出すと30秒(WHO推奨手洗い時間)の曲が鳴るソープスタンドを作った。楽しい。Arduinoのソースはこちら:https://t.co/nAsYnaJGKW
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年4月5日
A musical hand soap dispenser to get kids to wash for (WHO recommended) 30 seconds. pic.twitter.com/ZhUlWhuauo
7. ずっとカメラ目線になる顔フィルタ
一年間仕事仲間に合わずにWeb会議だけで仕事をしていると、段々「自分」=「相手のディスプレイに映る何か」という感覚になってくるんですね。そこで、自分の見え方をいじることで、自分自身を変えるよりも簡単に自己実現ができてしまうのではないか、と思って色々作りました。例えば、プレゼンのときにカメラを見る練習するよりも、画像変換でカメラを見ているようにしたほうが手っ取り早いんですよね。キモいので一日で使うのやめたけど。
Web会議で相手の顔見てると目が合わない問題を解決するために、どこ見ててもカメラ目線になるSnap Camera用フィルターを公開しました。脳みそ乗っ取られたみたいになるけど。こういうのiPhoneに標準搭載されるって噂だったよね。https://t.co/5lJuBIvef1 pic.twitter.com/Cct47wENc5
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年5月24日
この考えを突き詰めると、例えば毎日1%ずつ自分の顔にキアヌ・リーブスを混ぜていったら、一年後はチームにキアヌ・リーブス似のTLとして認識してもらえるんじゃないか、とか考えてます。来年チャレンジします。
音で遊んだ
なんか急に、音の可視化にはまった夏でした。
8. 音の速さが見えるデバイス
ありそうで(知ってる限り)無かった、音の速さを可視化するデバイスです。大科学実験で人間がやっていたことをデバイス化した感じですね。単純にマイクとLEDがくっついた基盤で、遠くまで並べると自分の出した音が広がっている様子が見えます。
単純だけど超面白いの作った!「音の速さが見えるデバイス」。音を感知すると光るモジュールを並べると、拍手の音が飛んでいく様子が目で見える。うちの子も「音が動いてくんだね!」と大興奮。長い廊下のある科学館とかに置かせてもらいたい。体育館なら同心円に広がってく様子や反響が見れるかも。 pic.twitter.com/1EM0coBNU9
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年8月2日
子供もパチパチ手を叩いて楽しそうでした。学校の先生とかから「授業で使いたい」という声を沢山いただいたので、販売できないか相談中です。使ってみたいというかたは是非ご連絡ください。
余談ですが、これ夜の公園に置いていると、近くで虫がリンリン鳴るとそこだけ光ってキレイなんです。そういう展示もみてみたいですね。
9. 姿の見えないセミを見つけられるアプリ
こういう音の可視化もしてました。敢えて複数スピーカーで音源推定するのではなく、指向性マイクを使ってスキャンしながら音源推定するという人力音源推定アプリです。
セミの声は聞こえるのに全然姿を見つけられないのが悔しくて、音源が見えるカメラをを作った。扇風機がうるさいのがよく見えるね。手元にあったのが指向性マイクしかなかったので「人力でスキャンしながら音量を測る」超低技術だけど、いつかスマホにマイクアレイを搭載できたら嬉しいね。 pic.twitter.com/G5Evzzfokx
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年8月23日
レーザーカッター買った
出社できている頃は会社のレーザーカッターを使っていたのですが、100%在宅になったため家庭用レーザーカッター を買いました。おかげで気軽に家で色々切れるようになり、ちょっとした試作が捗ります。
10. ネタバレおにぎり
例えばこんな「海苔でおにぎりのネタをバラしたい」みたいなちょっとしたアイディアをすぐに試作できるんですね。いつかプリンターのように一家に一台レーザーカッターと3Dプリンターがある時代が来るといいですね。ちなみに何故か海外でも話題になりました。おにぎり好きなんですかね。
レーザーカッターを使えば「あれ、鮭おにぎりどれだっけ」とならずに済むことに気づいた。「ネタバレ海苔」です。 pic.twitter.com/cNuu06ZCGZ
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年7月12日
11. 壁掛け夜景
現物みないと良さが全く伝わらない、「壁掛けできる夜景」です。レーザーカッターで黒い紙に目に見えないぐらいの小さい穴を開けて、透過した光で浮遊感のある夜の地球が表現できます。沢山人に見せたいのに、コロナのせいで家族しか見せられてない・・
宇宙から見た夜の地球が好きすぎて、レーザーカッターで「部屋に置ける夜景」を作ってみた。部屋の電気を消すとずっと見とれてしまう浮遊感。ついでに作った星空も良い。 pic.twitter.com/CgkklZhIUw
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年5月9日
12. 勝手にレゴが分類される箱
これマジでLEGO様に商品化してほしい、「小さいパーツが勝手に分類される箱」です。ダイソー様、期待してます。
レゴの小さいパーツが箱の底に潜って常に行方不明なので、勝手に分類される箱をレーザーカッターで作った。かなり便利なのでアクリルできれいに作り直そう。 pic.twitter.com/1Vg0eWDu6j
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年7月2日
その他
昔指導員に『「その他」の項目を作るぐらいなら分類しようとするな』と怒られた記憶を思い出しながら、その他の作ったものです。
13. レシピの「コスパ」をデータから定量化する
ちょうど夏ごろコロッケやポテサラの手間が話題になってましたね。レシピサイトからレシピをクローリングして、料理ごとの「手間」を定量化してみました。
「コロッケは手間の割に一瞬で食べられちゃうのでコスパ悪い」みたいな話が面白かったので、ネットからレシピをクローリングして料理の「人気」(=レシピ数)と「面倒臭さ」(=平均ステップ数)をグラフにしてみた。確かにコロッケはステップ数多い。それに比べて生姜焼きの良心的なこと。。。 pic.twitter.com/A0ZPnBIOpc
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年8月9日
この分析をしてから、僕が豚の生姜焼きを作る回数が少し増えた気がします。
まとめ
例年通り、色んなアイディアつまみ食いしながら試作ができると満足してリリースまで行ききらない年でした。なんなら去年話題にしてもらったみんなの忘れたニュースBotはサーバーを死なせたまま放置してしまったり。。
普段はここで「来年こそは全部ちゃんとリリースする」とか宣言する場所なんですが、それもちょっと違うような気もしてきました。まとまらないので終わります。
売り物に一度も手を触れずに作品販売するためのgraphic+STORES倉庫連携ガイド
思いつきで作った作品がバズったので数千冊販売したいが、家を在庫だらけにしたり梱包作業したりしたくない人(=私)のための備忘録です。
なぜ自宅で配送作業をしたくないかというと、単純に自分の品質管理能力に自信がないからです。
- 絶対家に在庫置いてたらカレーの匂いついたり子供が落書きするよね。
- 絶対梱包するときに髪の毛とか入るしOPP袋を指紋だらけにしちゃうよね。
- 絶対配達ラベル貼り間違えるよね。
- 絶対注文の状態がよく分からなくなって送り忘れたりするよね。
色々調べて印刷会社(e.g graphic)と倉庫サービスつきネットショップサービス(e.g STORES)を連携させれば印刷からお客様の手元まで一度も自分の家を経由せずに届けられることがわかりました。特に「一度も自宅を経由しない」部分についての情報がネットに無かったので、実際にやってみて分かったこと(とつまづきポイント)を似た悩みを抱えた方のために共有します。
ちなみに:
- STORES: 自分でネットショップを作れるサービスです。BOOTH/pixiv Factory等と同じで、どこも大体同じような倉庫サービスがあり、作品を預かって注文・決済・検品・OPP袋への封入・ピッキング・梱包・発送まで全部やってくれます。
- graphic:ネット印刷サービスです。他に沢山あるネット印刷サービスでも配送の際に「品名」さえちゃんと自由に記載できるなら同じように使えると思います。
作ったもの
ついでに今回販売したものを紹介します。発端は1月に作ったこちらです:
年中ほぼ全ての日がどこかしらの国で祝日だという事実に気づいてしまったので、「ずっと祝日カレンダー」を作った。『今日はアルメニアで陸軍の日だからダラダラ仕事するかー』みたいに使ってください。 pic.twitter.com/Az2FIaQUAa
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2020年1月26日
思いがけなく反響をいただいたので買いたい人を募集したら1万人以上の方が手を上げてくれました。過去の経験上、実際にお金を出してくれる人は事前登録者の5~10%ぐらいなので、1000部ぐらいのカレンダーを販売する方法を調べました。
宣伝ですが、2020年版は無事売り切り、2021年版のカレンダーはこちらで絶賛販売中:
graphic+STORESを連携させる手順
以下の手順を行えば、端から端まで一度も自宅を介さずに(クリックとメール1本だけで)STORESで受けたオーダーに対して倉庫から発送できるようになります。
1. STORESで入庫申請する
STORESで「倉庫>アイテムを預ける」から入庫申請をします。このときに付与される入庫IDと商品IDを大事に取っておきます: EGXYZ-WABCD 商品ID:E
2. graphicで発注する
印刷をgraphic(などの印刷サービス)で発注します。その際:
- 送り先は「1. 入庫申請」の際に表示されたSTORESの倉庫の住所を指定
- 品名に先程の入庫ID+商品IDを明記する(めちゃくちゃ大事、一番のつまづきポイントです。これを怠ると、倉庫に着荷した荷物は「宛先不明荷物」となり、入庫されずに放置された上に数万円取られます。一回やらかしました。)graphicを使わない場合は、品名を指定できることを問い合わせで確認したほうがいいです。
- ¥1500で分納できます。20部ぐらい自宅に送っておくと、何かと便利です。(取材のためSTORESより早く届けないといけなくなった時とか。)
STORESの入庫の案内では標準の入庫ラベルを利用するように書いていますが、入庫IDと商品IDさえ配達のダンボールに記載されていれば入庫できます。
graphicより送られる「受付日確定のお知らせ」に出荷予定日が記載されているので、これを控えましょう。
3. STORESに大量入庫を知らせる
200個以上の入庫をする際はSTORESのカスタマーサポートに連絡する必要があります。といってもメール一本で入庫数や予定日を伝えるだけです。詳しくはFAQを参照してください。
4. (graphicから発送されたら)発送をSTORESに知らせる
印刷が完了し、発送されるのを待ちましょう。カレンダー500部で6日間ぐらいです。発送されるとgraphicから発送のお知らせメールがとどきます。
STORESの入庫管理ページに「発送済み」ボタンがあります。実際に必要なのか分からないんですが、押しときましょう。僕はついでに宅配便の追跡番号をカスタマーサポートに伝えてますが、多分必要ないです。
5. 「入庫が完了しました」メールを待つ
数によりますが、graphicから発送された荷物が倉庫に着荷してから2~5日ぐらいでこういうメールが来ます:
これで入庫作業は完了です。これ以降はオーダーが来たら「倉庫から発送する」ボタンをクリックするだけでお客様に作品を送れるようになります:
余談ですが、graphicは(おそらく不良品の発生を見越して)発注より1%ほど多く印刷して送ってくれるみたいです。なので(今の所私の経験上)500部印刷したら505部送られてきます。ありがたく頂戴しましょう。
ひっかかりポイント
- いつまでたっても入庫完了にならない - 経験上、500部で着荷からだいたい2営業日ぐらいで入庫完了になりました。もしそれより大幅に遅れているようだと、不明品として扱われているかもしれません。STORESカスタマーサポートに問い合わせてみると状況を確認してくれます。(一度それで入庫IDの記載漏れのために不明入庫になっていることが判明し、管理手数料を取られました。)
- 着荷してるはずなのに「着荷待ち」と表示され続ける - 仕様みたいです。入庫完了(=商品を発送可能な状態になるまで)ずっと着荷待ちと表示され続けます。少し不親切ですね。
- 入庫不良品が出た - 入庫した商品に汚れがついていると、管理画面で「保留アイテム」として表示されます。(不良の詳細の写真などもつけてくれます。親切ですね。)カスタマーサポートにメールで「そのまま入庫してOKです」とか「自宅に返送してください」などの指示を送る必要があります。残念ながら「破棄してください」は受け入れてくれないので、無駄に送料がかかってしまいます。
で、いくらかかるの?
倉庫サービスに実際にかかったコストは以下です(2020年12月現在):
- 入庫料 ¥18
- 保管料 カレンダーだと¥0.2/日なので、平均2週間ぐらい保管されると想定して¥2.8
- 配送料 ¥370
なので、カレンダー一枚につき¥390ぐらいです。ここに決済手数料も乗ります。クリックポスト(¥198)と比べてたったのプラス¥192で検品・OPP封入・梱包・配送手配までやってくれると考えると、私にとってはかなり格安です。人によってここの感覚は違うかも。
他の方法
本記事で後述するgraphics+STORES以外にも色んな方法を検討しました。簡単に紹介していきます。
自力で全部頑張る
印刷会社(graphic)でカレンダーを1000部印刷し、自宅に配送して、注文をすべて自力で梱包・配送する方法です。梱包材(数円)を除けば配送料(定形外郵便なら¥140ぐらい、クリックポストなら¥198)と自分の時間だけなので、金銭的には一番安くできます。
ただ前述のように1000オーダーを間違えずに(鼻毛とか入れずに)完了させる自信がないし、毎日そのストレスに耐え続ける気がしないので諦めました。また個人的には少し多めにお金を払ってでも、次の作品作りの時間を作りたかったこともあります。
BOOTH倉庫
後述するSTORES倉庫とほぼ同じぐらいの値段感ですが、管理・配送・決済コストを計算したらSTORESのほうが少し安くなったので、今回はSTORESを使いました。YMMV。
あと少し気になったこととして、BOOTHは「倉庫に着荷してから発送できる状態になるまで最低7日間かかる」と利用ガイドに明記していたことです。(STORESでは1週間ぐらいと表記しており、実際は2日程度で終わりました)。急にバズった作品は需要予測が行いにくいため、少なめのロットで作って在庫を継ぎ足ししていくほうが安全です。そのため、印刷から入庫までの時間がなるべく短い方法を選ぶことが大事だと考えました。実際はBOOTHも最低7日といいつつ、もっと早いのかもしれません。経験された方は、共有していただけると助かります。
Amazon Fullfilment
利用料が高かったので、あまり調べませんでした。
まとめ
清潔に大量の作品を梱包・発送する自信がない私のような人間でも、一度も手を触れずに沢山発送することが出来ることが分かりました。私のように「作ってバズったはいいけどリリースが面倒」という作品を大量に抱えている人間としては、この方法を見つけられたことでモノづくり人生が少し変わりました。カレンダー売るとか言う前にこれ知っておきたかった、という情報を書いたつもりなので、同じような状況の方の一助になれば幸いです。ちなみにSTORESのステマっぽくなっちゃいましたが頼まれてもないですし一銭も貰ってません。
河本の実験室の2019年まとめ
今年もたくさん作ったので、特に話題になったものをまとめます。
1月・AR Sensor
スマホで測ったWifi電波強度などのセンサーデータを3次元空間上に可視化することで「ここWifi飛んでんな」が出来るアプリです。去年末にプロトタイプを作り、
2階に置いたWifiルーターが繋がりにくいので、ARで電波強度を可視化してみた。こんなのを20分で作れるARCoreすごい。 AR Visualization of Wifi signal strength in my house. pic.twitter.com/UVuHCRYfeX
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2018年12月24日
今年アプリとしてリリースしました:
いろんな人が家やオフィスで遊んだ動画を撮ってくれたのが地味に嬉しかったです。
Gigazineが紹介してくれたり、Interface誌で記事書いたりしました。
1月・ARで見る
ネットショップなどでよく見る[幅x長さx高さ]の表記を(多分)最短タップ数でAR可視化するアプリです。
装置とか家電調べてる時「128x145x285(mm)ってどんぐらいだ?」ってよくなるので、ブラウザとかから2クリックでAR表示できるアプリ作った。文字列選択して「共有」>「ARで見る」を選択するだけ。めっちゃ便利。 https://t.co/E9TJMxitpj pic.twitter.com/ZHA8E3a1Hy
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2019年1月13日
ARのアプリにありがちな 「まずは専用アプリを開いて数字を入力しましょう」みたいなUXが嫌いすぎて、最も自然にユーザをARまで連れて行く方法を考えたらこうなりました。めちゃくちゃ便利です。来年はもっとARがスマホの体験の色々なところに融合していくように、頑張りたいです。
3月・寝転がってるだけで子供がマッサージしたくなるTシャツ
昔作ったTシャツを綺麗に作り直してClubTで販売してみました。
以前作った「寝転がってるだけで子供がマッサージしたくなるTシャツ」をきれいに作り直して出品した:https://t.co/o4QXllvo8h 背中にプラレール幅対応のレールが描いてあるので、子供が大喜びでプラレールを走らせてくれます。気持ちいいです。 pic.twitter.com/5wZ8poE5hJ
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2019年3月3日
ふと思いついたアイディアを、在庫リスク0で販売できるのは本当に素晴らしい時代になったと思います。ネットメディアだけでなく、大体の国内キー局の朝のニュースや海外メディアが紹介してくれました。
5月・みんなの忘れたニュースBot
次から次へと炎上を楽しんでは忘れるネット文化が嫌で、こういうbot(@wasureta_news)を作ってみました:
最近のTwitterの色んなことに怒って忘れてを繰り返す空気が好きじゃないので、「忘れられて一ヶ月ぐらい経った話題」を自動で集めるBOTを作った。定期的に流れる「忘れた話題」を眺めると、新たな炎上ネタを見た時「俺これ一ヶ月後も覚えてるかな?」と冷静になれる気がする。 https://t.co/3gKU5QMnC6
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2019年5月6日
半年で4万9000人にフォローされ、また炎上ニュースに「これも一ヶ月後に忘れたニュースbotにツイートされるんだろうな」的なコメントがついているのをたまに見ることがあり、少しだけ人の意識を変えるのに役立ったのかなと思います。
11月・振り返りカメラ
なんで今までなかったんだろう的な家庭版ドラレコを作ってみました。
子育ては常に「いま撮ってれば良かった!」との闘いなので、Google Homeに「Ok Google, 今の残しといて」と言うと、リビングのカメラ動画を過去30秒さかのぼってGoogle Photosにアップするようにしてみた。さっそく子供が初めてカリカリを自分で食べるところを撮れてヒーロー。 pic.twitter.com/BuHCXHFrIx
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) 2019年11月4日
これが家に来てから毎日のように永久保存版ホームビデオが撮れて夫婦共々ご満悦です。
その他
あまり話題にならなかったけど他にも沢山楽しく作りました。気になったらTwitter見てみてください。
ちなみに本業では・・・
Google Maps上で口コミを要約するやつを作りました。飲食店等を決めるときにとても参考になるタグが表示されることが多いので、色々探してみてください。
まとめ
実はこの年になって初めて、作った物を売るという体験をしました(Tシャツで)。研究を売るとかサービスを売るとか仕事時間を売るとかではなく「物」。個人に直接お金を頂いて物を提供するのは、物凄い(「期待はずれだった」と怒られる)恐怖と充足感を同時に感じられて、ハマりそうです。
来年特にやりたいことは:
- プログラミング教育- 今年は色々子供と一緒に物作りをしていて、良い教育方法に色々思い悩みました。ブロック式プログラミングがいいのかとか、媒体はロボットがいいのかとか。ちょっと色々実験してみようかと思います。
- 割愛
- 売れる形にする- プロトタイプばかり作ってバズって喜ぶだけじゃなく、ちゃんと売れる形にまとめるのは大事だし楽しいな、と今年思えました。来年もっとやります。
「いま撮ってればよかった!」を無くす、さかのぼり屋内カメラを作った
子供と遊んでいると、予測不可能なタイミングで面白い事を言ったり、可愛い顔したり、初めて歩いたりします。そんなとき「カメラ回してればよかった!」と嘆いたことのある親は私だけではないはず。
そこで、事後にGoogle Homeに向かって「OK Google、いまの残しといて」と言うだけで過去に遡って動画を残しておけるカメラを作りました。
子育ては常に「いま撮ってれば良かった!」との闘いなので、Google Homeに「Ok Google, 今の残しといて」と言うと、リビングのカメラ動画を過去30秒さかのぼってGoogle Photosにアップするようにしてみた。さっそく子供が初めてカリカリを自分で食べるところを撮れてヒーロー。 pic.twitter.com/BuHCXHFrIx
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) November 4, 2019
構成
要素数が多く見えますが、一つ一つの要素は沢山の先人たちに踏み固められた技術です。今回の特徴はその繋ぎ方だけなので、要素の詳細説明は省きます。
動画の常時録画
まずUSBウェブカメラをラズパイにつなげて、常時録画し続けます。
- ウェブカメラ: 僕はこういう制作には大体Logicool C920を使ってます。安くて画質いいので。
- ラズパイ:僕が使ったのはRaspberry Pi 3Bですが、もっと新しいのあると思います。
常時録画といっても実は過去30秒だけを1秒ごとに区切って動画(TS)ファイルとして書き出し、古いファイルはどんどん捨てていってます。古いファイルを消していったほうがラズパイの容量が節約できるし、「ずっと撮られてる感」が減らせるので。
実際の録画には、ffmpegを使ってHLSで保存しています。ffmpegの設定は黒魔術感があって、正直あまり理解していません。沢山ググって色々な例を合成していった結果できたのが以下の呪文です:
これをラズパイで走らせると、実行ディレクトリ内に「stream.m3u8」というインデックスファイルと「stream*.ts」という動画ファイル群が作られ続けます。
このtsファイル一つ一つが、撮られた1秒毎の動画ファイルです。
Google Homeから呼び出す
Google Homeから発声を受け取って、ラズパイで任意のコードを実行させる方法は、沢山ネットに載っています。「ラズパイ google home」とかでググりましょう。
僕は「OK Google、リビングの動画を残して」というと、ラズパイで実行しているPythonプログラムが通知を受け取れるようにしました。
動画を結合する
Google Homeから通知を受け取ったら、ffmpegを使って出力用の動画ファイルを作ります。
まず、録画したtsファイルを新しい順に並べ、最新の30個(=30秒ぶん)のファイル名を書き出したテキストファイルを作ります。
これをffmpegに投げて、結合しつつひとまとめのmovファイルに書き出します。これで、過去30秒を映した動画ファイルができました。
ちなみにmp4に書き出したら何故かGoogle Photosへのアップがうまくいかなかったので、movを使っています。
Google Photosにアップする
Google Photosへのアップにはrcloneを使います。rcloneとは色々なクラウドサービスのファイル操作を担ってくれる便利なツールです。
公式ページがとても親切に書かれているので、設定に迷うことはないと思います。
先程作った動画ファイルをアップしましょう。(gphotoのところに自分が設定したGoogle Photoのターゲット名を入れる)
やってみた
こんなふうにクロマグロのぬいぐるみで遊んでいるときに、ふと今までの出来事を撮っておきたいと思ったとしましょう。「OK Google、リビングの動画残して」とつぶやきます。
一分後ほど待つと、遊んでいるときの動画がGoogle Photosにアップされます。
こんな動画が撮られます:
さいごに・・・
- カメラを持ち歩かずに言葉だけで「撮れる」のは本当に便利です。特に、「撮りたい瞬間にカメラを構えていなくても大丈夫」という安心感のおかげで、子供との遊びに集中できるのが嬉しいです。
- ただし、たまに音声入力がミスって「申し訳ございません、お役に立てそうにありません」とか言われてしまいます。過去30秒しか撮れないので、これは焦ります。「OK Google、いまのを『長めに』残しといて』と言えば5分ぐらい録画を残すようにすればいいと思います。
- 僕はカメラの未来は「ずっと録画してAIが良いシーンを選別」だと信じてますが、それができるまでの間はこういうハックでQOLをあげていきましょう。
- 関係ないですが、上の子が初めて立つ瞬間はたまたまカメラを回していたおかげで撮れました。月イチぐらいでリピート再生する宝物です。こういうツールを使って、もっと宝物が増えたら嬉しいですね。
つまらない安全講習ビデオをディープフェイクで「自分ごと化」する
安全講習のビデオってつまらないですよね。
免許の更新、社内のeラーニング、飛行機の離陸時など、様々な場面で僕らは講習ビデオを見させられます。
いくら役者さんが迫真の演技で危険な場面を演じても、僕みたいに共感力が薄い人間にはどうしても「他人事」に見えてしまって適当に見流してしまいます。本当は大事なのに。
そこで、安全講習ビデオを無理やり「自分ごと化」する方法を考えて試してみました。
事故ってるのが自分と家族だったら流石に見るんじゃない?
役者が演じる事故映像は「もしこれが自分や家族だったら」という変換を一旦行わないと吸収できません。しかし、自分や家族が危険な目にあっている場面を見れば直接脳の「ヤバい」エリアに働きかけられるのではないかと想像します。
そこでディープフェイクを使って、事故る対象者を自分や大事な人に変えてしまえば、急に「自分ごと」として捉えられるんじゃないかと考えました。:
ディープフェイクとは、機械学習を使って映像内の人を別の人に置き換えてしまう技術です。世間ではフェイクニュースやリベンジポルノで悪名高いやつですね。上の画像では、運転者の顔を僕の顔に置き換えています。
映像で見ると、かなり綺麗に(メガネも含めて)置き換えできていることがわかると思います。(ちなみに同乗者全員僕に置き換わってます。):
交通安全ビデオってどうしても「他人事」感が拭えないため真剣に見れない自分がいます。そこでDeep Fakeで役者の顔を自分の顔に置き換えることで、無理やり「自分ごと」化する実験をしてみました。ちょっと髪型違和感あるけど。 >河本の実験室 https://t.co/KULs1VoxZe pic.twitter.com/nYAo7rocYO
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) October 10, 2019
元映像: (警視庁公式チャンネル) 交通事故防止 「命を守るシートベルト」 後部座席着用
元の映像では「知らん人が危ない目にあってる」ぐらいにしか見えなかったシチュエーションが、自分が置き換わることで少しだけドキドキ感が増した実感があります。(僕を知らない人からすると、知らん人が知らん人に置き換わっただけなので全く分からないかも知れませんが。)
このような、自分や大事な人を出演させた「自分ごと化」映像を新米ドライバーや交通違反者にプレゼントしたら、少し危険の実感が増して、安全運転が望めるのではないでしょうか?
とはいいつつ、あまりに髪型が違うことや、同乗者が知らない人たちであることで、まだ少し違和感が残ります。同乗者をそれぞれ自分の家族に植え替えていけば、かなり現実感が増すんじゃないかと想像しています。あまり子供の年代が合っている映像が見つからなかったので試せませんでした。
他にも自転車事故を起こす河本の映像を作ってみたり:
急に車のドアが開いて驚く河本。骨格違いすぎて違和感ある。 (JA共済DVDより) pic.twitter.com/A4EppxZ6AR
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) October 10, 2019
元映像:(JA共済DVD)「危険を予測してみよう! ~被害事故~」
骨格が違いすぎて、あまり当てはまってない気がします。
下水機能が停止したトイレを流して怒られる河本:
災害時に下水機能が停止しているにも関わらず無理やりトイレを流して階下の住人に叱られる河本。(国土交通省公式チャンネルより) pic.twitter.com/9KN2a2MfZc
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) October 10, 2019
元映像:(国土交通省公式チャンネル)災害時のトイレ、どうする?
調子に乗って極秘情報をネットで漏らす河本:
見栄を張ってネットで極秘情報を漏洩させる河本。(警視庁公式チャンネルより) pic.twitter.com/OGhNSftlYd
— Ken Kawamoto(ガリのほう) (@kenkawakenkenke) October 10, 2019
元映像:(警視庁公式チャンネル)みんなで学ぼう!サイバーセキュリティ ①情報流出防止対策
これはちょっと似てますね。やはりもとの毛髪量が似てるほうが良さそうです。
やりかた
"faceswap"という、顔の抽出、学習、合成、映像の書き出しまで全部やってくれるツールを使いました。ほぼ、工夫の要素はなく、使うだけです:
GitHub - deepfakes/faceswap: Deepfakes Software For All
おわりに
映像を知っている人にすることで「他人事」を「自分ごと」にするという考え方は、色々応用がききそうです。例えば少し違う角度では、歴史写真に適用すると興味深い効果があるのではないかと思います。
教科書やドキュメンタリーなどで見すぎて実感が湧きにくくなった歴史的な写真や映像に自分や家族を出演させることで、「そこにいたのも自分と同じような人間なんだ」という実感を増す効果があるんじゃないかと想像します。モノクロ歴史写真をカラー化すると急に親近感と現実感が増すのと同じだと思います。なんとなく色々面倒くさそうなので、アップするのは自重しますが。
ディープフェイクは悪名が轟いていますが、視点を変えるとこのように(少しだけ)人のため世のためとなるような使い方がまだまだ転がっている気がします。faceswapは驚くほど簡単に使えたので、是非新しい使い方を考えて試してみてください。