[go: up one dir, main page]


この記事は Google Maps Platform Blog の記事 " How two developers reached new heights with Google Maps Platform" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

編集者より: この投稿は、カスタムのストリートビュー画像と Google Maps Platform を使用して構築されたドイツ最高峰ツークシュピッツェ山の山頂までのバーチャル ツアーを提供している Web サイト Zugspitze360.com の共同制作者 David Schmidta 氏によるものです。

兄のフィルと私は写真を撮るのが好きです。写真撮影のテクニックと想像力の両方を発揮できることに、いつも魅了されています。私たちは仕事では Web テクノロジーを専門としているため、ストリートビューと 360 度写真に関心を持つようになったのはごく自然なことでした。熱意と好奇心もあって、私たちは仕事の合間にあちこちで 360 度写真を撮影しオンラインに投稿していました。ある日、兄がドイツ最高峰ツークシュピッツェ山の登山を記録するというアイデアを思い付きました。


兄と私は過去にツークシュピッツェ山の山頂まで登ったことはありますが、兄のアイデアを実現するために何が必要なのかはすぐには明確になりませんでした。およそ 1 万フィートの山頂にたどり着くのは簡単ではありません。登山を記録するのに必要な撮影機材すべてを携えた状態では、特にそうです。距離 にして 6 マイル、高度 6,500 フィートだけでも十分なのに、山頂までには Höllentalklamm 渓谷や Höllentalferner 氷河などの険しい地帯もあります。しかし、兄はこの一見不可能に思える偉業を、私と一緒に達成したいと言いました。に私の同意を取り付けました。

ドイツ最高峰のマップ化の計画

計画段階で、解決困難な多くのことに直面しました。登山をバーチャル化するには、どの程度の数のパノラマ写真が必要なのか。これらの写真すべてを撮影するには、どの程度の時間が必要なのか。休憩や充電はどこで行うのか。最終的に誰もが使える Web アプリを作ることは最初から明白で、その方法はすでにわかっていました。

さらに検討を重ね、天候に恵まれることも期待し、十分な自信を持ってこの試みを開始しました。カメラや三脚、GPS デバイス、必要なすべての登山用品を携え、休むことなく徐々に登山の様子を記録しました。多くの登山者が通り過ぎていきましたが、「この二人は一体何をやってるんだ」と思ったことでしょう。



山で 2 週間過ごした後、数千フィートの高さを登って疲労困憊した状態で、この骨の折れる冒険をやり遂げたという、達成感に浸る間もなく、数ギガバイトの画像を携えて帰宅の途につきました。しかし、画像を確認したところ、画像をオンラインにアップロードする作業は、画像を撮るのと同じぐらいに大掛かりな作業であることが判明しました。兄は何週間もかけて 1 つ 1 つの画像をつなぎ合わせる作業をおこない、その間、私はパノラマ写真をオンラインにアップロードするのに最適な方法を調べていました。

Google Maps Platform による ZUGSPITZE 360° の実現

これまでの経験から、Google Maps Platform が、360 度写真のホスティングを含め、有益かつ強力な一連の API を提供していることは理解していました。今回のプロジェクトでは、画像の量とサイズが膨大なため、大容量データをコスト効率よくホスティングする必要がありました。

パノラマ写真をアップロードするために、まずはストリートビュー アプリを使用した後で、Street View Publish API を使用しました。この方法で、バイナリ データだけでなく、パノラマ写真の実際の緯度・経度やパノラマ写真の相関関係などのメタデータも転送することができました。

カスタム構築のフロントエンドでは、Google Maps Platform の Maps Javascript API を使用してパノラマ写真を取得、表示しています。これは、通常のストリートビュー画像の表示に慣れているからです。Maps Javascript API では、このような操作方法を解説したとても詳しいドキュメントが公開されています。アップロードしたパノラマ写真のmatching ID を把握するため、情報を抽出するちょっとしたヘルパーツールをいくつか作成しました。さまざまなパノラマ写真をユーザーがナビゲートできるだけでなく、あらかじめ定めたツアーの見所にもユーザーがジャンプできるようにすることを目的としていました。


パノラマ写真とその正確な位置を照合する作業も難しいことに気付きました。険しい崖や狭い渓谷があるため、GPS の記録は必ずしも正確ではありません。期待される正確な位置というよりも、むしろクモの巣のような状態のときもありました。パノラマ写真をマップ内の対応する位置に配置し、さらに実際に歩いた経路を残すためのデータが必要でした。これを行うために Roads API を使用しました。Roads API によって、記録した GPS 座標を最も近い既知の道にスナップすることができました。また、より正確なものになるように、手作業でいくつか修正を加えました。

ZUGSPITZE 360° では、ツアー以外に小道や見所に関する情報も提供しており、追加の写真や該当する場所までの所要時間、距離などの詳細情報も合わせて示しています。また、ツークシュピッツェ山が登山口からどの程度離れているか、登山を開始できる起点に行くには出発点からどの経路をとるかを示したマップなど、登山を計画する場合に、登山前の検討や準備に役立つ貴重な推奨事項も多数掲載しています。これを行うのに、Directions API が役立ちました。

最後になりますが、登山者が自身の期待を共有できるようにしたいと考えていました。そこで、Street View Static API を使用して、ツアーの共有リンクに各パノラマビューを共有可能な形式で含めました。


Google Maps Platform のおかげで、自分たちの構想を実現することができました。最初は単純なアイデアだったものが、あらゆる人々を支援する複雑なプロジェクトに発展しました。このプロジェクトを実際に利用する人がどれほどいるのか、見当もつきませんでした。当然ながら、最も顕著な利用者は、テクノロジーや写真撮影というバックグラウンドが似ている、同じ志を持つ人々ですが、それ以外の多くの人々からもコメントが寄せられています。山頂に上ることを夢見て、家族を Höllentalangerhütte(山小屋)に連れて行った父親がいます。どのような用具が必要かもわからない登山初心者もいます。登山ルートを把握しており、プロジェクトを利用してフォロワーに危険な箇所を示している熱烈な登山家や登山指導者もいます。数十年前にこの山を登ったが、年齢や健康上の理由からこのルートを登れなくなった人から寄せられたコメントは最も心動かされるものでした。

私たちは本当に多くのことを学びました。膨大な労力を要するからと、開発をあきらめなくて良かったです。ZUGSPITZE 360° が熱烈な登山者に価値あるサービスを提供し続けることを心から願っています。

Google Maps Platform の詳細については、こちらの Web サイトを参照してください。

Posted by 丸山 智康 (Tomoyasu Maruyama) - Google Maps テクニカルアカウントマネージャ


この記事は、Google の Engineering Director である Andrew Lookingbill と Product Management Director の Ethan Russell による Google Maps Platform Blog の記事 " Beyond the Map: How we build the maps that power your apps and business" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

編集者より: この投稿は、Andrew Lookingbill と Ethan Russell によるものです。Googler 歴が長い 2 人の目標は、世界をマッピングして、世界中からアクセス可能な便利な地図を作ることです。絶え間なく進化する世界に適した地図を Google がどのように構築しているのか詳しく紹介していきます。デベロッパーには、革新的なユーザーエクスペリエンスを提供するために必要となるデータを、企業には、企業活動を最適化するのに役立つ位置情報ベースの知見を合わせてお伝えします。今回は、マッピングの基礎の紹介です。

十億以上の人々が Google マップを使って世界各地を探索しています。数百万ものアプリ、エクスペリエンスが Google のデータを使って構築されており、幅広いユーザー層やユースケースに対応したマップを Google はどのように構築しているのかという質問を受けることが多くなりました。その答えは、10 年以上にわたる基礎作りと、最新かつ正確なデータおよび知見を求めるユーザーの期待に対応できるようテクノロジーを改良することへの強いこだわりにあります。

画像への初期投資

Google は、Google マップと Google Maps Platform (旧称 Google Maps APIs)を発表して、わずか数年後にストリートビューを発表しました。一般ユーザーにとって、ストリートビューは自宅にいながら全世界をバーチャルに探索するのに役立ちます。Google はこの豊富な画像データセットを企業が利用できるようにしています。企業は自身が所有するアプリで実世界のコンテキストを提供することができます。たとえば、Trulia のような不動産サイトでは、Web サイトとアプリを使用して住宅購入予定者が近隣をバーチャルに探索して、好きな場所を見つけることをサポートをします。

Trulia でのストリートビューを使用した近隣の探索

このストリートビューによって後々のマッピングプロセス基盤ができました。Google の機械学習テクノロジーの進展と、87 か国、1,700 億を超えるストリートビュー画像により、これらの画像から自動的に情報を抽出し、顧客向けに道路名や住所、会社名などのデータを常に最新の状態にしておくことが可能です。「一枚の絵は千の言葉に値する」と言いますが、高解像度のパノラマ画像は 100 万の言葉に匹敵します。そのため、最高品質の画像や知見を顧客に提供できるよう、Google では高解像度のセンサーなどを装備した最新のトレッカー(英語)など、独自のハードウェアを開発しています。

信頼できる機関との提携

Google のプラットフォームを使ってミッションクリティカルなアプリ開発を検討している企業にとって、信頼できる最新情報の提供は不可欠です。そのため、Google では、米国地質調査所、メキシコの国立統計地理情報院(INEGI)、その他の自治体や宅地造成業者など世界中の 1,000 以上の信頼できるデータソースを使用しています。

Google の画像解析と第三者機関のデータを組み合わせることで、顧客にビジネスの原動力となる最も正確かつ信頼できるデータを提供しています。例えば、Lyftmytaxi などのライドシェア企業に対して、乗客の乗車 / 降車位置情報、最速ルートを運転手が取れるように交通量に応じたルート設定機能を提供しています。Google は、ルートが適切でなかったり乗車時間に遅れると、顧客がサービスを二度と利用しなくなる可能性があることを理解しており、信頼できる第三者機関とデータを簡単に共有できるようにしています。そこから、迅速にデータを取り込んで、世界中のライドシェア企業がカスタマーエクスペリエンスとビジネス効率を向上するのに役立つ機能に転化しています。

Google Maps Platform を使用した mytaxi のナビゲーション

実際の人々、実際のインサイト

データと画像は、地図作成の重要な要素です。ただし、データと画像は静的であるため、必要とされる特定の場所のコンテキストが必ずしも得られるわけではありません。通りのどこにいるかをコンテキスト化するのにストリートビューが役立つと考えるのであれば、レストランやコーヒーショップなどの特定の場所をコンテキスト化するのにユーザー作成コンテンツが役立つと考えるでしょう。熱烈なローカルガイド コミュニティ、アクティブな Google ユーザー、および Google マイビジネスを使用している事業主のおかげで、Google には道路閉鎖から特定の場所の雰囲気や新規ビジネスなどにいたるまで、ユーザーから毎日 2,000 万件もの情報が寄せられています。そして、情報が正確であることが十分確信できる場合にのみ、これらの情報を公開しています。

Google では、世界中の 1 億 5,000 万を超える場所に関してデータセットを構築することが可能になっており、Places API を通じてこのデータセットをデベロッパーに提供しています。Places API は、場所の名前、住所、評価、クチコミ、連絡先情報、営業時間、雰囲気に関する豊富なデータを備えています。このデータを使うことで、ユーザーはただ単にレストランを見つけるだけでなく、ベジタリアン向けのメニューがあり子供にも適したレストランを見つけることも可能です。

機械学習による革新速度と成長の維持 

ここまでで紹介したプロセスを経て、Google は信頼できる有益な地図を作成しています。しかし、もう一つスピードという大きな課題も存在します。Google のお客様が迅速に行動して革新を遂げる、その原動力となるためには、Google もかつてないほど迅速に世界を地図化する必要があります。世界各地で急速に変化が進む中、新しい情報を地図や製品にすばやく取り込まなければなりません。世界を地図化する速度を加速し、高い精度を維持しながら地図作成プロセスを自動化するよう、Google では機械学習に目を向けています。

Google が「曖昧な建物」と呼んでいる問題を機械学習でどのように解決したのか、例を挙げて説明します。Google では、画像の一部が建物かどうかを推測するアルゴリズムの課題に悩んでいました。これを解決するため、データ運用チームと協力し、一般的な建物の外形を手作業でトレースしました。現時点では、これが最善の解決策となっています。ただし、世界中の一般的な建物の外形すべてを手作業でトレースするには膨大な時間が必要です。そこで、一般的な建物の外形をトレースした後、この情報を使用し、どのような外形の建物が実際に存在する傾向にあるのか、および画像のどの部分が建物の境界や外形に対応するのかを機械学習しました。この方法によって、過去 10 年間に地図化した建物と同数の建物を 1 年間で地図化することができました。結果、Google が顧客と共有している地図が大幅に改善されています。

左側: 以前: 建物に外形線がない状態。右側: 現在: 地図に表示される建物の外形線が明確に


ストリート名がない場合の対応

ストリートビュー画像からの情報抽出については、前述したとおりです。Google は、機械学習とストリートビュー画像を併用することで、世界中のほぼすべての場所で家の番地を自動的に特定することができます。また、これは、世界で 220 を超える国や地域のマッピングを大幅に進展させるのに役立っています。

ただし、すべての家に実際に番地があるとは限りません。そのため、Google マップと Google Maps Platform では plus code をサポートしています。plus code は番地と同じように機能します。これにより、世界中の誰もが、友人や配送サービスと共有したりメールの送受信に使用したりできる住所を持つことが可能です。plus code はオープンソースであるため、どのデベロッパーでも入手、使用でき、Places API や Geocoding API にも組み込まれています。

これらの地域の地図化を支援し、すべての人々に住所を付与し、Google の API 製品にアクセスできるようにすることで、企業や地方自治体が地域社会に向けたサービスを向上でき、ロケーションベースの新しいエコシステムを成長させる機会も増大します。plus code の使用については、こちらにお問い合わせください。

長期にわたる取り組み

Google で 10 年余りを過ごした今でも(2 人合わせると 25 年)、実際の世界の変化に遅れをとらずついていく地図作成にワクワクして取り組んでいます。世界が変化するにつれ、人々を支援するためだけでなく、ビジネスの原動力となり、企業活動、業界、さらには世界をも変革するロケーションベースのツールを提供するために、Google は常に技術革新を行っています。

次回は、さまざまな地域での地図作成の課題に目を向け、これらの課題を克服するのに画像がいかに役立っているのか、これが企業やデベロッパーにとって何を意味するのかについて説明します。Google Maps Platform の詳細については、Google の Web サイトを参照してください。

本投稿に寄与したカスタマー エンジニアリング部門グローバルリードの Dave McClusky に感謝の意を表します。

Posted by 丸山 智康 (Tomoyasu Maruyama)  - Google Maps テクニカルアカウントマネージャ


Google Cloud Japan は 9 月 3 日 (火)、開発エンジニア、インフラエンジニア、運用エンジニア向けに「Google Cloud Kubernetes Day」を開催いたします。

実際に Kubernetes 環境でアプリやサービスの開発を実践されている先進的な企業を迎え、それぞれのアプリケーションのモダナイゼーションや、Kubernetes の事例についてお話しいただきます。
また、深い専門知識をもつ Google Cloud のエンジニアが、Google Kubernetes Engine (GKE) をはじめとした Google Cloud Platform を利用し、どのようにアプリやサービスのコンテナ化を行うのか、開発、運用の実際について解説します。

セミナー終了後は同会場にて懇親会を開催いたします。
ぜひ、Google Cloud Kubernetes Day にご参加ください。

申し込みはこちら
https://goo.gle/k8sdaybg

◆ 開催概要 ◆
名称: Google Cloud Kubernetes Day
日程: 2019 年 9 月 3 日(火)
時間: 14:00 - 20:00 / 受付開始 13:00
対象: 開発エンジニア、インフラエンジニア、運用エンジニア
定員: 700 名
会場: ベルサール渋谷ファースト
    〒150-0011 東京都渋谷区東1-2-20 住友不動産渋谷ファーストタワー
締切: 2019 年 8 月 30 日(金)締切
※ 参加費 無料、事前登録制

◆ アジェンダ ◆
【トークセッション】
◇ 14:00 - –14:40
 『失敗しないアプリケーションモダナイゼーションの考え方 
  〜 アセスメントから開発アプローチ 〜』
  Google Cloud Japan 北瀬 公彦、村上 大河
  株式会社フリークアウト 西口 次郎 氏
  富士フイルムソフトウエア 株式会社 ムサヴィ ジャハン アバディ セイド モハマド氏

◇ 14:40 - –15:00 休憩

◇ 15:00 - –15:40
 『Anthos で実現するモダンなアプリケーション管理プラットフォーム』
  Google Cloud Japan 篠原 一徳、長谷部 光治

◇ 15:40 - –16:20
 『ユーザからみた Anthos GKE On-Prem の利用について』
  NTT 国際通信株式会社 桑山 純弥 氏

◇ 16:20 - –16:40 休憩

◇ 16:40 - –17:20
 『GCP で実現する CI / CD 最前線』
  Google Cloud Japan 岩成 祐樹

◇ 17:20 - –18:00
 『kubemci を用いたカナリヤリリース 
  〜 グローバルチームにおける GKE の監視事例 〜』
  株式会社LOB 片平 健太郎 氏、高橋 辰徳 氏

【懇親会】
◇ 18:10–19:50


Posted by Takuo Suzuki - Developer Relations Team


Google Cloud に代表されるクラウド技術の進化が引き起こすその先の世界を、機械学習、VR / AR、IoT などの領域で活躍されているスタートアップの方々と一緒に議論するイベント「INEVITABLE ja night」。

第 10 回目となる今回は、「事業戦略と IT の融合:テクノロジー企業化への不可避な流れ」がテーマです。あらゆる業種、業態の企業において、事業戦略と IT の融合が一層求められています。そんな中で、どのような組織やリーダーシップが必要なのか、リーダーが注目するテクノロジーやエコシステムは何なのか? について、掘り下げていきます。
Google からは、ワークトランスフォーメーションについて、先日行われた Cloud Next ‘19 in Tokyo で発表された製品・サービスや活用事例を中心にお話します。
講演会後には恒例の交流会も行います。参加者様同士の交流はもちろん、日頃の業務の課題や悩みについても、ご相談 / 共有いただける良い機会となります。

本テーマにご関心のある方々のご参加をお待ちしています。

講演会後には恒例の交流会も行います。参加者様同士の交流はもちろん、日頃の業務の課題や悩みについても、ご相談 / 共有いただける良い機会となります。

本テーマにご関心のある方々のご参加をお待ちしています。

【開催概要】
イベント名 : INEVITABLE ja night - “インターネットの次にくるもの”
      第 10 回 事業戦略と IT の融合:テクノロジー企業化への不可避な流れ
日程 : 2019 年 9 月 17 日(火) 19:00 〜 21:00(開場 18:30 より)
会場 : グーグル合同会社
定員 : 200 名
ハッシュタグ : #inevitableja

プログラム :
INEVITABLE 対談 
 スピーカー:
  小野 和俊 氏 株式会社クレディセゾン 取締役
  辻 裕里 氏  株式会社SUBARU IT戦略本部情報企画部担当部長
  長谷川 秀樹 氏 株式会社メルカリ CIO
 聞き手:
  小島 英揮 氏、Still Day One合同会社 代表社員 パラレルマーケター・エバンジェリスト

ゲスト講演:
  辻村 孝嗣 氏 株式会社BoxJapan エンタープライズ営業1部 シニアエンタープライズアカウントエグゼクティブ

Google テクノロジーアップデート:
  小林 直史 グーグル・クラウド・ジャパン合同会社 カスタマーエンジニア

申し込みサイト:https://goo.gle/2Z9hqRg

多数のご参加をお待ちしております。
NEVITABLE TV のご案内

INEVITABLE TV では、イベントでは取り上げることができなかったこと、語り尽くせなかったことを中心に、「インターネットの次に来るもの」に関連する話題を深く掘り下げていきます。こちらもぜひご覧ください。 


この他にもさまざまなテーマでゲストスピーカーに登場いただいています。INEVITABLE TV からご覧ください。
Posted by Takuo Suzuki - Developer Relations Team

先日の投稿でお知らせしました通り、Google は Machine Learning (機械学習) の専門的な知識を持たない方向けにトレーニングを無料で提供するプログラム「ML Study Jams vol.3」を 2019 年 8 月 20 日(火)から 9 月 15 日(日)の期間中に開催します。





本日は、今回の ML Study Jams 期間中に使用する受講コースを決定いたしましたので、ご連絡いたします。

初心者向け

1) How Google does Machine Learning
2) Launching into Machine Learning


中級者向け

1) End-to-End Machine Learning with TensorFlow on GCP
2) Google Cloud Platform Big Data and Machine Learning Fundamentals

すでに以前の ML Study Jams で Machine Learning の基礎を学んだ方でも、新たな中級者向けコースで Machine Learning について学ぶことができます。




本プログラムは、オンライン学習プラットフォーム、Coursera 上にある Machine Learning 関連のコードラボを利用して行います。


今回のプログラムでは、チーム単位で参加しチーム毎に開催する形式となります。受講する仲間がいない方については、地域ごとのチームマッチングもサポートする予定です。チームがまだ決まっていない方も、登録してみてください。

ML Study Jams Vol.3 ご案内ページ
https://events.withgoogle.com/ml-study-jams-japan/


皆様のご応募をお待ちしております。


Posted by Takuo Suzuki - Developer Relations Team

この記事は Stan Grinberg による Google Ads Developer Blog の記事 "Campaign IDs and Budget IDs as 64-bit in Google Ads" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

アップデート(2019 年 8 月 5日): SharedSet ID も含めて 64 ビットに対応していることを確認するようにしてください。
アップデート(2019 年 7 月 26 日): Asset ID も含めて 64 ビットに対応していることを確認するようにしてください。

AdWords APIGoogle Ads API の Campaign ID と Budget ID は 64 ビット符号付き整数で、AdWords API では xsd:long 型、Google Ads API では INT64 型です。この API を組み込むアプリケーションは、この範囲の ID 値を扱う必要があります。

これまで、Google 広告の Campaign ID および Budget ID の最大値は 32 ビット符号付き整数の範囲内に収まっていましたが、まもなくこの範囲を超える見込みです。問題が起こらないように、アプリケーションが 64 ビット符号付き整数値の範囲の ID に対応していることを確認するようにしてください。

質問や懸念事項がある方は、遠慮なくフォーラムからご連絡ください。


Reviewed by Thanet Knack Praneenararat - Ads Developer Relations Team

この記事は Florina Muntenescu による Android Developers - Medium の記事 "Collections and sequences in Kotlin" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。



コレクションとシーケンス

コレクションを使った処理は一般的で、Kotlin の標準ライブラリにもたくさんの便利なユーティリティ関数が準備されています。さらに、評価方法の違いによる 2 つの方法でコレクションを処理できます。すなわち、Collection を使うと積極的処理を、Sequence を使うと遅延処理を行うことができます。この記事では、この 2 つの違いに加え、どの場合にどちらを使うべきか、またそれぞれのパフォーマンスへの影響について説明します。

コレクションとシーケンス

積極的評価と遅延評価の違いは、コレクションに対する変換が実行される タイミング にあります。
コレクション積極的 に評価されます。つまり、各操作は呼び出されたときに実行され、その結果が新しいコレクションに格納されます。コレクションに対する変換は、インライン関数です。例として、map がどのように実装されているかを見てみると、新しい ArrayList を作成するインライン関数であることがわかります。
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
  return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}
シーケンス遅延 評価されます。シーケンスには、中間操作末端操作の 2 とおりの操作があります。中間操作は即時実行されず、単に格納されるだけです。末端操作が呼び出されると、各要素に対して順番に中間操作が呼び出され、最後に末端操作が適用されます。中間操作(map、distinct、groupBy など)は別のシーケンスを返しますが、末端操作(first、toList、count など)はシーケンスを返しません。
シーケンスは集合内のアイテムへの参照は保持していません。シーケンスは元となるコレクションのイテレータから作られ、実行する必要があるすべての中間操作への参照を保持しています。
コレクションに対する変換とは異なり、シーケンスの中間操作による変換はインライン関数ではありません。インライン関数は格納することができませんが、シーケンスは変換処理を格納しなければなりません。map などの中間操作がどのように実装されているかを見てみると、新しい Sequence インスタンスの中に変換関数が格納されていることがわかります。
public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R>{      
   return TransformingSequence(this, transform)
}
first などの末端操作は、述部条件に該当するまで、シーケンスの要素に対して反復処理を行います。
public inline fun <T> Sequence<T>.first(predicate: (T) -> Boolean): T {
   for (element in this) if (predicate(element)) return element
   throw NoSuchElementException(“Sequence contains no element matching the predicate.”)
}
TransformingSequence(上の map で使われています)などのシーケンスの実装方法を見てみると、シーケンスのイテレータから next が呼ばれたタイミングで、格納されている変換も適用されていることがわかります。
internal class TransformingIndexedSequence<T, R> 
constructor(private val sequence: Sequence<T>, private val transformer: (Int, T) -> R) : Sequence<R> {
override fun iterator(): Iterator<R> = object : Iterator<R> {
   …
   override fun next(): R {
     return transformer(checkIndexOverflow(index++), iterator.next())
   }
   …
}
Kotlin 標準ライブラリでは、使っているのがコレクションかシーケンスかによらず、両方に対して find、filter、groupBy などの非常に幅広いオペレーションが提供されています。そのため、独自の操作を実装する前に、オペレーションを確認するようにしましょう。





コレクションとシーケンス

さまざまな図形を表すオブジェクトのリストがあるとします。それらの図形を黄色にした上で、最初に登場する正方形を探す場合を考えてみましょう。

コレクションとシーケンスにそれぞれの操作が適用される方法とタイミングを確認します。

コレクション

  • map の呼び出し — 新しい ArrayList が作成されます。最初のコレクションにあるすべてのアイテムに対して反復処理を行い、元のオブジェクトをコピーして色を変えることにより、変換を行います。次に、その結果を新しいリストに追加します。
  • first の呼び出し — 最初の正方形が見つかるまで、各アイテムの反復処理を行います。

シーケンス

  • asSequence — 元となるコレクションのイテレータからシーケンスが作成されます。
  • map の呼び出し — シーケンスが実行しなければならない操作リストに変換が追加されますが、操作自体は実行されません
  • first の呼び出し — これは末端操作なので、コレクションの各要素に対してすべての中間操作が呼び出されます。最初のコレクションに対して反復処理を行い、各アイテムに map と first をこの順番で適用します。2 つ目の要素で first の条件が満たされるので、コレクションの残りの要素に対して map が適用されることはありません。
シーケンスを使う場合、中間コレクションは作成されません。アイテムが 1 つずつ評価されるので、map は入力の一部に対してのみ実行されます。




コレクションとシーケンス — 積極的評価と遅延評価

パフォーマンス

変換の順番

大事なのは変換の順番です。この点は、コレクションとシーケンスのどちらを使うかにはよりません。先ほどの例は map 変換の結果ではないので、map を実行した後に first を実行する必要はありません。ビジネス ロジックの順番を逆転させ、コレクションに対して first を呼び出してからその結果を変換する場合でも、作成されるのは新しいオブジェクトである黄色い正方形 1 つだけです。シーケンスを使う場合は 2 つの新しいオブジェクトを作ることは避け、コレクションを使う場合はリスト全体を作ることを避けます。




変換の順番が重要 — 不要な処理を避ける

シーケンスを使うと、末端操作によって処理を切り上げることができる可能性があり、中間操作は遅延評価されるので、コレクションを使う場合に比べて不要な操作を省略できる可能性があります。変換の順番と変換同士の依存性について、常に確認するようにしましょう。

大きなデータセットをインライン化することによる影響

コレクション操作はインライン関数を使用しています。そのため、操作のバイトコードと、それに渡されるラムダ式のバイトコードがインライン化されます。シーケンスはインライン関数を使わないので、操作のたびに新しい Function オブジェクトが作成されます。
コレクションではすべての変換に対して新しいリストが作成されますが、シーケンスでは変換関数への参照が保持されるだけです。
1 つか 2 つの操作がある小さなコレクションを処理する場合、この違いによって大きな影響が生じることはありません。そのため、コレクションを使っても問題はないはずです。しかし、中間コレクションの作成を伴う大きなリストの処理は、大きな負荷となる可能性があります。そのような場合は、シーケンスを使うようにします。
残念ながら、コレクションやオペレーション チェーンのサイズがコレクションやシーケンスのパフォーマンスに与える影響について調査したベンチマークはないようです。
コレクションはデータを積極的に評価しますが、シーケンスは遅延評価します。データのサイズに応じて、最適なものを選ぶようにしましょう。小さなリストにはコレクションを、大きなリストにはシーケンスを使い、変換の順序に注意するようにしてください。

Reviewed by Yuichi Araki - Developer Relations Team

Google は Machine Learning (機械学習) の専門的な知識を持たない方向けにトレーニングを無料で提供するプログラム「ML Study Jams vol.3」を 2019 年 8 月 20 日(火)から 9 月 15 日(日)の期間中に開催します。




本プログラムは、オンライン学習プラットフォーム、Coursera 上にある Machine Learning 関連のコードラボを利用して行います。

今回のプログラムでは、チーム単位で参加しチーム毎に開催する形式となります。


ML Study Jams Vol.3 の流れ
  • オーガナイザー(代表者)が本サイトで申し込む
  • オーガナイザーが ML Study Jams Vol.3 について 8 月 19 日(月)開催の説明会に参加する
  • オーガナイザーがそれぞれ ML Study Jams Vol.3 の受講イベントを主催する

※説明会はオンラインで参加可能です。
※説明会に参加できない場合でも後日説明会の映像をご覧いただくことで説明を受けることができます。



どのようなチームで ML Study Jams Vol.3 の受講イベントを開催するかは自由です。

夏休みの間に学校の仲間と学ぶ、社内研修として会社の仲間と受講する、といった受講も可能です。

受講する仲間がいない方については、地域ごとのチームマッチングもサポートする予定です。チームがまだ決まっていない方も登録してみてください。




オーガナイザー説明会

オーガナイザーの方を対象とした説明会を開催します。

説明会では ML Study Jams Vol.3 のイベント開催にあたってのサポート内容や注意点を説明します。また、オーガナイザー同士の交流会も行います。



開催概要
日時:2019 年 8 月 19 日(月) 19:00 - 22:00

場所:Google 東京オフィス
   東京都港区六本木 6 -10-1 六本木ヒルズ 森タワー

※オンライン参加も可能です。
※説明会では Coursera のハンズオンをテスト受講いただきます。

 ハンズオン受講のためにノートパソコンをご持参ください。

※説明会の映像は後日オーガナイザーに公開します。

 説明会に参加できない方でも オーガナイザーとして ML Study Jams 受講イベントを開催できます。



対象・参加条件
  • Machine Learning (機械学習) に興味を持っているがまだ使ったことがない方
  • 他のクラウド サービスを使っていて、GCP を比較してみたいデベロッパーの方
  • 仲間と一緒に Machine Learning (機械学習)を学びたい方

以下に該当する方は参加をお断りする場合があります。
  • 受講イベントを営業や勧誘を目的として行う方
  • 受講イベント開催時に参加者から必要以上の個人情報を収集しようとする方
  • 営利目的で受講イベントを開催する方(会場費などの実費の徴収は問題ありません)

プレゼント

ML Study Jams Vol.3 に参加し、規定の条件を満たした方にプレゼントをお送りします。

一般参加者
指定されたコードラボを修了した方
オーガナイザーML Study Jams Vol.3 オーガナイザーを含めて 5 名以上が参加する受講イベントを開催した方

※プレゼントの発送は日本国内のみとなります。
※プレゼントの発送は 9 月下旬 ~ 10 月中旬を予定しています。
※プレゼントは写真とは異なる場合があります。










本プログラムのお申し込み

本プログラムへの参加はこちらのサイトより参加申し込みをお願いいたします。

皆様のご応募をお待ちしております。

Posted by Takuo Suzuki - Developer Relations Team

この記事は エンジニアリング部門副社長、Dave Burke による Android Developers Blog の記事 "Android Q Beta 5 Update" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。



Android Q ベータ版 5 が先日リリースされました。ベータ版 5 は、Android Q ベータ版として最終リリース版のシステム動作にかなり近いものになっています。デベロッパー API は、前回のアップデートで既に最終版になっています。そのため、アプリの互換性をテストして準備ができていることを確かめるには、今が絶好のタイミングです!

Pixel 端末をお持ちの方は、こちらで登録するとベータ版 5 を入手できます。登録済みで、Pixel 端末でベータ版 4 を受信している場合は、ベータ版 5 へのアップデートを自動的に取得できます。Android Q ベータ版プログラムに参加しているパートナーも、今後数週間で端末をベータ版 5 にアップデートする予定です。

Android Q ベータ版を使ってみたい方は、developer.android.com/preview をご覧ください。


ベータ版 5 の内容

ベータ版 5 アップデートには、Pixel 用の最新 Android Q システム イメージ、Android Emulator に加え、最終の Android Q デベロッパー API(API レベル 29)、公式の API 29 SDK、アップデートされた Android Studio 用ビルドツールが含まれています。これで、Android Q でのアプリのテストや、Android Q の機能を使ったビルドに必要なものはすべてそろいます。

ジェスチャー ナビゲーションのアップデート

Google I/O でもお伝えしましたが、私たちは、標準の Android ジェスチャー ナビゲーションをユーザーやデベロッパーに提供するため、パートナーの端末メーカーと密接に連携しています。ジェスチャー ナビゲーションを使うと、表示されるシステムの装飾やナビゲーションを最低限に減らし、全画面にコンテンツを表示するアプリを実現できます。これは、最新の狭額縁ディスプレイにとって特に重要です。ベータ版 5 では、皆さんからのフィードバックに基づいて、この機能の改善、強化をし、いくつかの重要な領域で、さらにアップデートを行いたいと考えています。


今回導入したのは、画面のいずれかの端からスワイプ ジェスチャーを行うことでアシスタントを呼び出す機能です。画面下の領域には、インジケーターが表示されていることに気づくはずです。この領域は、引き続き調整を行っています。

ナビゲーション ドロワーを使っているアプリでは、ユーザーがドロワーをつかんだとき、少しだけ内容が見えるような動作を追加しています。これにより、スワイプでナビゲーション ドロワーが表示されることがわかります。この機能は、すべてのバージョンの DrawerLayout で動作します。最も快適な操作になるように最適化されているのは DrawerLayout 1.1.0-alpha02 です。


フィードバックを受けて改善し、問題への対応を続けているもう 1 つの領域が、カスタム ランチャーです。特に、安定性や最近使ったアプリなどが対象になっています。ベータ版 6 以降では、カスタム ランチャーを使っているユーザーは、デフォルトで 3 ボタン ナビゲーションに切り替える予定です。すべてのユーザーがジェスチャー ナビゲーションに切り替えることができるように、残っている問題にはリリース後のアップデートで対処します。それまでの間、引き続きフィードバックをお寄せください
Android Q リリースに向けたアプリの準備

正式リリースが近づいている今、すべての Android デベロッパーが最優先で取り組むべきことは、互換性を維持するためにできる限り早く現在のアプリをアップデートすることです。
そのための方法を以下に示します。
  • 制限されている非 SDK インターフェースを使っているかどうかのテストを行い、同じ機能を持つ一般公開版の SDK や NDK に移行してください。詳細については、こちらをご覧ください。
  • アプリで使っているライブラリと SDK をテストしましょう。Android Q で予想どおり動作すること、プライバシー、パフォーマンス、UX、データ処理、パーミッションがベスト プラクティスに沿っていることを確認します。問題を見つけた場合は、最新バージョンの SDK にアップデートするか、SDK のデベロッパーに連絡してサポートを求めます。SDK の互換性に関する問題は、こちらから報告することもできます。
  • 互換性のあるアプリをアップデートして公開しましょう。テストと必要なアップデートを終えたら、すぐに互換性のあるアプリを公開することをお勧めします。これにより、Android ベータ版のユーザーがアプリをテストできるようになるので、ユーザーが Android Q にアップデートした際にスムーズな移行が可能になります。
これらの変更点をサポートするために皆さんの作業が必要になりますので、最終リリースに向けて、アプリへの影響を最低限にとどめ、皆さんからのフィードバックにすばやく対応してまいります。


Android Q の機能と API を使用してアプリを強化する
準備ができたら、Android Q に移行し、使用できる新しい機能や API について学習してください。最初に着手すべき重要な機能は、以下のとおりです。
以下の項目は、すべてのアプリで推奨します。
  • ダークテーマ: ダークテーマを追加するか Force Dark を有効にして、システム全体でダークテーマを有効にしているユーザーに一貫性のある体験を提供します。
  • ジェスチャー ナビゲーションのサポート: アプリを全画面対応させ、システムのナビゲーション ジェスチャーをカスタム ジェスチャーで補えるようにします。
該当するアプリでは、以下の項目にも対応することをお勧めします。

  • 通知のインタラクティブ性の向上: メッセージを含む通知を送っている場合は、通知で応答やアクションを提案して即座にアクションを実行できるようにすることで、ユーザーのエンゲージメントを向上させます。
  • バイオメトリックの強化: バイオメトリック認証を利用している場合は、BiometricPrompt に移行してください。これは、最新端末で指紋認証をサポートする際に推奨されている方法です。
  • 高度な録音機能: 字幕生成やゲームの録画をサポートするには、オーディオ再生のキャプチャを有効にします。これは、多くのユーザーを獲得し、広くアプリにアクセスしてもらう絶好の手段です。
  • コーデックの改善: メディア アプリでは、動画のストリーミングに AV1 を、ハイ ダイナミック レンジ動画に HDR10+ を試してみてください。会話や音楽のストリーミングには Opus エンコーディングを、ミュージシャンの方ならネイティブ MIDI API を使うことができます。
  • ネットワーク API の改善: アプリを使って Wi-Fi 経由で IoT 端末を管理しているなら、新しいネットワーク接続 API を使って設定、ダウンロード、印刷などの機能を試すことができます。

ここで紹介したのは、Android Q の多くの新機能や API のほんの一部です。すべての機能を確認したい方は、デベロッパー用の Android Q ベータ版サイトをご覧ください。

アプリのアップデートを Google Play に公開する

準備ができ次第、API 29 でコンパイルしたAPK、またはオプションで API 29 を対象とする APK アップデートを Google Play に公開できます。アップデートしたアプリが Android Q でも古いバージョンでも問題なく動作することを確認するために、Google Play テストトラックを使ってみてください。トラックを使うと、ベータ版 5 のユーザーを含む少人数のユーザーから初期段階でのフィードバックを安全に入手できます。その後、製品版への段階的ロールアウトを実施します。

ベータ版 5 の入手方法

入手方法は簡単です!サポート対象となっている Pixel 端末を登録するだけで、OTA(無線)でアップデートできます。すでに登録している方は、何もする必要はありません。ダウンロード可能なシステム イメージもこちらで公開しています。Android Q ベータ版プログラムに参加しているパートナーは、今後数週間で端末をアップデートする予定です。詳細については、android.com/beta をご覧ください。

開発を始めるには、安定版リリースの Android Studio 3.4 に公式 API 29 SDK およびツールをダウンロードするか、Android Studio 3.5 ベータ版にアップデートして最新の Android Q サポートを入手します。その後、こちらの手順に従って環境を設定し、リリースノートで既知の問題を確認してください。

今四半期中に行われる正式リリースの前に、もう 1 回ベータ版リリースを行う予定です。引き続き、フィードバックとリクエストをお寄せください。プラットフォームの問題(プライバシーや動作の変更点も含む)、アプリの互換性の問題サードパーティ SDK の問題の送信には、ホットリストを使うことができます。


Reviewed by Yuichi Araki - Developer Relations Team

この記事は デベロッパー アドボケート、Oscar Rodriguez による Android Developers Blog の記事 "Advanced in-app billing: handling alternative purchase flows" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


アプリやゲームを設計して開発するにつれ、収益化をどうするかが考え始めるときがあるでしょう。
Google Play でプロダクトを販売して収益化すると決めたら、販売するアイテムを表示するストア画面を作り、Google Play Billing Library を使ってユーザーが購入するダイアログを表示することになるでしょう。
ドキュメントや Billing Library TrivialDrive サンプルには詳しい説明が掲載されていますが、一般的なフローは次のようになります。
  1. UI スレッドから launchBillingFlow() メソッドを呼び出し、Google Play 購入ダイアログを表示します。
  2. 購入が成功すると、Google Play によって onPurchasesUpdated() メソッドが呼ばれ、購入オペレーションの結果が渡されます。
  3. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases API を使います。
  4. 消費可能アイテムは consumeAsync() で、消費不可アイテムは acknowledgePurchase() で購入を承諾します。
  5. 最後に、アプリ内で購入したアイテムを付与します。
まだ Google Play Billing AIDL API を使い続けているアプリでも、同じタスクを実行できます。なお、AIDL API は非推奨となっているので、できるだけ早く Google Play Billing Library に移行することを強くお勧めします。
AIDL API でも、フローはほぼ同じです
  1. getBuyIntent() リクエストまたは getBuyIntentExtraParams() リクエストを送って購入するアイテムを指定し、続いて startIntentSenderForResult() を呼び出して Google Play 購入ダイアログを表示します。
  2. 購入ダイアログが閉じられると、Google Play によって onActivityResult() メソッドに応答の Intent が送られます。ここで、購入が成功したかどうかを確認できます。
  3. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases API を使います。
  4. 購入が成功した場合、getPurchases() メソッドを呼び出して、まだ消費されていない所有アイテムの一覧を取得します。消費可能アイテムの場合は、consumePurchase() メソッドを呼び出して再購入できるようにします。
  5. 最後に、アプリ内で購入したアイテムを付与します。
ただし、以上のフローを実装しただけでは、すべてのタイプの購入を正しく処理することはできません。このフローで正しく購入を処理できないのは、主に 2 つの場合です。
1 つ目は、購入フローが完了する前に中断された場合です。たとえば、アプリがクラッシュした、ユーザーがアプリを強制終了させた、インターネット接続が失われた、などが考えられます。いずれにしても、Google Play で支払いの処理が終わっているにもかかわらず、ユーザーにアイテムが提供されていない状況に陥る可能性があります。この場合、アイテムは中途半端な状態です。Google Play はアイテムを消費するまで再購入が認められませんが、アプリやゲームでは前述のフロー以外でアイテムが消費されることはないからです。
2 つ目は、別の購入フローによって発生します。別の購入フローとは、アプリ内プロモーション、最近発表されたアプリ外サブスクリプション サーフェスサブスクリプション用プロモーション コード、Google と連携したその他のプロモーションなどを指します。この場合、ユーザーは Play ストアアプリで直接アイテムを入手しますが、その間、対象のアプリやゲームは一時停止されているか実行されていない状態にあります。または、対象のアプリがインストールされていない可能性もあります。
このような場合に備えて、Google Play Billing Library と Google Play Billing AIDL API には、承諾または消費されていない購入を検知できる仕組みが組み込まれています。
Google Play Billing API を使っている場合、次のようにします。
  1. アプリの onResume() コールバックで queryPurchases() メソッドを呼び出し、アイテムのリストを取得します。これを使って承諾していないアイテムを検知することができます。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases API を使います。
  3. 承諾されていない所有アイテムがある場合は、消費可能アイテムには consumeAsync() を、消費不可アイテムには acknowledgePurchase() を使って購入を承諾します。
  4. 購入したアイテムをアプリ内で付与します。
Google Play Billing AIDL API では、次のようにします。
  1. アプリの onResume() コールバックで getPurchases() メソッドを呼び出し、まだ消費されていない所有アイテムの一覧を取得します。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases API を使います。
  3. 消費可能アイテムの場合は、consumePurchase() メソッドを呼び出して再購入できるようにします。
  4. 最後に、アプリ内で購入したアイテムを付与します。
どちらの場合でも、この方法で消費されていないアイテムを検知して処理する場合は、ユーザーはアプリやゲームがそのアイテムについて通知してくれることを期待します。ダイアログやメッセージ ボックス、通知を表示し、アイテムが入手できたことをユーザーにお知らせすることをお勧めします。
アプリの onResume() コールバックは、プロセスが開始した場合に加え、フォアグラウンドになった場合にも呼ばれる点に注意してください。アプリやゲームが一時停止する前にどのような画面が表示されていたかにはよりません。たとえば、ホーム画面、ストア画面、ゲーム画面があるゲームでは、すべての画面から onResume() が呼ばれる可能性があります。最適なユーザー エクスペリエンスを実現するために、onResume() が呼ばれた際に表示されている画面に関係なく、承諾または消費していないアイテムを処理できるようにすることをお勧めします。優れたユーザー エクスペリエンスを提供するには、それぞれの画面でこの処理を徹底的にテストすることが欠かせません。
最後に、アプリで処理しなければならないもう 1 つのケースが存在します。それは、Play ストアアプリでアイテムを入手した際に、マルチウィンドウ モードで Play ストアアプリと対象のアプリの両方が見えている場合です。
Google Play Billing Library でこれをサポートするには、次のようにします。
  1. 保留になっている新しいアイテムがあることをアプリに通知するため、Google Play によって onPurchasesUpdated() メソッドが呼ばれます。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases API を使います。
  3. 消費可能アイテムは consumeAsync() で、消費不可アイテムは acknowledgePurchase() で購入を承諾します。
  4. 最後に、アプリ内で購入したアイテムを付与します。
Google Play Billing AIDL API では、次のようにします。
  1. アプリの onResume() コールバックで PurchasesUpdatedListener を登録し、com.android.vending.billing.PURCHASES_UPDATED インテントを受け取れるようにします。また、アプリの onPause() コールバックでリスナーの登録を解除します。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases API を使います。
  3. 保留になっている新しいアイテムがあることをアプリに通知するため、Google Play によってリスナーが呼ばれます。リスナーで getPurchases() メソッドを呼び出し、まだ消費されていない所有アイテムの一覧を取得します。消費可能アイテムの場合は、consumePurchase() メソッドを呼び出して再購入できるようにします。
  4. 最後に、アプリ内で購入したアイテムを付与します。
先ほどと同じように、ダイアログやメッセージ ボックス、通知を表示し、アイテムが入手できたことをユーザーにお知らせしましょう。
以上の手順に従えば、アプリやゲームは購入フローの中断や別の購入フローに確実に対処できるようになります。

Reviewed by Yuichi Araki - Developer Relations Team