[go: nahoru, domu]

この記事は Todd Kerpelman(Developer Advocate) による The Firebase Blog の記事 "Why is my Cloud Firestore query slow?" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

Cloud Firestore のパフォーマンスについては、「ベースのデータセットではなく結果セットのサイズに比例して高速化する」、「低速のクエリを作成するのは実質的に不可能だ」など、その素晴らしさを評価する声がよく聞かれます。そしてほとんどの場合、それは事実です。アプリでは莫大な数のレコードが格納されたデータセットに対するクエリを実行し、ユーザーが画面から親指を離すよりも早く結果を取得できます。

とは言え、デベロッパーからは「特定の状況では Cloud Firestore の動作が遅く感じられ、クエリの結果を取得するのに予想よりも時間がかかる」という意見を聞くこともあります。それはなぜでしょうか。今回は、Cloud Firestore の動作が遅くなったように見える場合に考えられる原因と、その対処方法をご紹介します。

理由その 1: データが多すぎる

クエリが遅くなったと感じる場合に第一に考えられる原因としてクエリ自体は非常に高速に実行されているのですが、クエリが完了した後にすべてのデータをデバイスに転送する必要があり、実際にはその処理に時間がかかっているのです。

たとえば、組織内の全営業担当者を対象にしたクエリを実行するとしましょう。このクエリは非常に高速に実行されます。しかし、その結果セットが 2,000 人の従業員のドキュメントで構成されていて、各ドキュメントに 75 KB のデータが含まれていたらどうでしょう。デバイスでは 150 MB のデータをダウンロードする必要があり、それが完了するまで結果は確認できません。


パフォーマンスを改善するには

この問題を解決するには、必要なデータ以外は転送しないようにするとよいでしょう。簡単なのは、クエリに制限を追加する方法です。従業員リストの結果のうち、ユーザーが必要なのは先頭のごく一部だけだと思われる場合は、クエリの最後に limit(25) を追加すれば、最初の方のデータのみダウンロードされ、その他のレコードはユーザーがリクエストした場合に限りダウンロードされるようにすることができます。これについてはこちらの動画で詳しく説明していますので、ぜひご覧ください。



一方、営業担当者 2,000 人全員のデータをクエリで取得する必要があると考える場合は、別の方法があります。最初のクエリで取得したいデータのみを含むドキュメントをこれらのレコードから分離し、その他の詳細なデータを含むドキュメントは個別のコレクションまたはサブコレクションにまとめるのです。後者のドキュメントは最初の取得時には転送されませんが、ユーザーの必要に応じて後からリクエストできます。



ドキュメントのサイズを小さくすると他にもメリットがあります。たとえば、クエリにリアルタイム リスナーを設定して、ドキュメントが更新されるとそのドキュメントがデバイスに送信されるようにしたい場合です。ドキュメントのサイズを小さくしておけば、リスナーで変更が発生するたびに転送されるデータの量も少なくなります。

理由その 2: オフライン キャッシュが大きすぎる

Cloud Firestore のオフライン キャッシュはとても優れた機能です。オフラインの永続性を有効にすると、ユーザーがトンネル内に入ったときや飛行機に 9 時間乗っている間でも、アプリはオンラインと「同じように機能」します。つまり、オンライン中に読み取ったドキュメントをオフラインでも利用でき、オフライン中に書き込んだデータは、アプリがオンラインに戻るまでローカルでキューに追加されます。さらに、クライアントの SDK ではこのオフライン キャッシュを利用して、大量のデータがダウンロードされないようにすることができるため、ドキュメントの書き込みなどのアクションを高速化できます。ただし Cloud Firestore は「オフライン優先」のデータベースとして設計されているわけではないので、今のところローカルでの大量のデータの処理には向いていません。

Cloud Firestore はクラウド内で、すべてのコレクションの全ドキュメントとそのフィールドをもれなくインデックスに登録しますが、(現時点では)オフライン キャッシュ用にこうしたインデックスを作成することはありません。つまり、オフライン キャッシュ内のドキュメントにクエリを実行する場合、Cloud Firestore ではクエリ対象のコレクションについて、ローカルに保存されているすべてのドキュメントを展開してからクエリと照合する必要があります。

別の言い方をすれば、バックエンドでのクエリは結果セットのサイズに応じて遅くなりますが、ローカルのオフライン キャッシュ内でのクエリは、クエリ対象のコレクションに含まれるデータのサイズに応じて遅くなります。

ところで、ローカルでのクエリが実際にどの程度遅くなるかは、状況によって異なります。ここで話題にしているのはローカル、つまりネットワークに接続していない状態でのオペレーションですが、これはネットワーク呼び出しを行うよりも速い可能性が(しかもかなりの確率で)あります。ただし、1 つのコレクションに含まれる大量のデータを分類しなければならない場合、あるいは単に動作が遅いデバイスを使用している場合、大きなオフライン キャッシュに対するローカル オペレーションは著しく遅くなる可能性もあります。

パフォーマンスを改善するには

最初に、前のセクションで説明したおすすめの方法を試してみてください。つまり、ユーザーが必要とするデータのみを取得できるようクエリに制限を追加し、不要な細かいデータはサブコレクションに移動することを検討します。また、以前の投稿の最後に取り上げた「複数のサブコレクションと単独の最上位コレクション」のどちらを使うべきかという観点で考えた場合、このケースでは「複数のサブコレクション」を採用した方がよいでしょう。そうすれば、キャッシュの検索対象が、こうした小さめのコレクションに含まれるデータのみとなるからです。

2 番目の方法は、必要以上のデータをキャッシュに詰め込まないようにすることです。私は、デベロッパーがキャッシュを意図的にこのように使用するケースをいくつか見たことがあります。アプリの最初の起動時に膨大な数のドキュメントにクエリを実行し、その後のすべてのデータベース リクエストにローカル キャッシュを強制的に参照させるというものです。通常、データベース コストを削減したり、以降の呼び出しを高速化したりする目的で用いられますが、実際にはメリットよりデメリットの方が大きい場合がほとんどです。

3 番目の方法は、オフライン キャッシュのサイズを小さくすることです。モバイル デバイスのキャッシュのサイズはデフォルトで 100 MB に設定されていますが、状況によっては(特に、大規模な 1 つのコレクションにほとんどのデータが格納されている場合は)、このサイズではデータが多すぎてデバイスで処理できない可能性があります。このサイズは、Firebase の設定で cacheSizeBytes の値を変更することで調整できます。特定のクライアントに対してサイズを調整するとよいでしょう。

4 番目に、永続性を完全に無効にして、何か変化があるか確認してみてください。この方法は通常はおすすめしません。前に述べたように、オフライン キャッシュは非常に優れた機能だからです。それでも、クエリが遅くなったように感じて、その理由がわからない場合は、永続性を無効にしてアプリを再実行することでキャッシュが問題の原因かどうかを判断できるでしょう。

理由その 3: ジグザグマージ結合に問題がある

「ジグザグマージ結合」という名前を私が個人的に気に入っていることはさておき、このアルゴリズムは複合インデックスに依存せずに複数のインデックスからの結果を統合できる点で非常に便利です。基本的には、ドキュメント ID 順に並べ替えた 2 つ(またはそれ以上)のインデックス間を行き来して一致を見つける仕組みになっています。

しかし、ジグザグマージ結合にも 1 つ弱点があります。どちらの結果セットもサイズが大きいにもかかわらず両者の共通部分が少ないと、パフォーマンスの問題が発生する場合があるのです。一例として、カウンター サービスも提供している高級レストランを検索するクエリを考えてみましょう。

restaurants.where('price', '==', '$$$$').where('orderAtCounter', '==', 'true')

両方ともかなり大きいグループですが、共通部分はおそらくほとんどありません。この場合、ジグザグマージ結合では、必要な結果を取得するために多くの検索を行う必要があります。

クエリのほとんどが高速に実行されているのに、特定のクエリを複数のフィールドに対して一度に実行している最中に遅くなる場合は、この状況に陥っている可能性があります。

パフォーマンスを改善するには

複数のフィールドにわたるクエリがが遅くなる場合、それらのフィールドに対する複合インデックスを作成することでパフォーマンスを改善できます。バックエンドでは、その後のすべてのクエリで、ジグザグマージ結合ではなくこの複合インデックスを使用するようになります。つまり、クエリは結果セットのサイズに比例して高速になるということです。

理由その 4: Realtime Database に慣れてしまっている

Cloud Firestore は、クエリ機能、信頼性、スケーラビリティの点で Firebase Realtime Database を上回ります。ただし北米で利用する場合は、一般に Realtime Database の方が低レイテンシです。通常はそれほど大きな差はなく、チャットアプリなどでは違いに気付くことはおそらくないでしょう。しかし、データベースの超高速応答に依存するアプリ(たとえばリアルタイム描画アプリやマルチプレーヤー型ゲームなど)の場合は、Realtime Database の方が「まさにリアルタイム」だと感じられるかもしれません。

パフォーマンスを改善するには

Realtime Database の低レイテンシが求められるプロジェクトを進めている(かつ、大部分のユーザーが北米にいると予想される)場合、もし Cloud Firestore の特有の機能が必要ないのであれば、そのプロジェクトの該当箇所には Realtime Database を使用するとよいでしょう。ただしその前に、以前のブログ投稿公式ドキュメントを確認して、2 つのデータベースそれぞれのメリットとデメリットを十分に理解しておくことをおすすめします。

理由その 5: 物理的な制約がある

ほぼ完ぺきな状況であっても、利用している Cloud Firestore インスタンスがオクラホマでホストされていて、ユーザーがニューデリーにいる場合、「光の速度」の関係で少なくとも 80 ミリ秒のレイテンシが発生します。そして現実的に、どのネットワーク呼び出しでも 242 ミリ秒前後のラウンドトリップ時間がかかります。そのため、Cloud Firestore がどれほど高速に応答しても、その応答が Cloud Firestore とデバイス間を移動する時間がどうしてもかかってしまうのです。

パフォーマンスを改善するには

まず、単回のフェッチの代わりにリアルタイム リスナーを使用することをおすすめします。クライアントの SDK 内でリアルタイム リスナーを使用すると、非常に優れた多くのレイテンシ補正機能が提供されるためです。たとえば Cloud Firestore は、ネットワーク呼び出しが戻るのを待っている間、キャッシュされたデータをリスナーに提示するため、ユーザーに結果を表示する時間がより高速になります。また、データベースへの書き込みはすぐにローカル キャッシュに適用されます。つまり、デバイスがサーバーによる確認を待っている間に、これらの変更が即座に反映されることがわかるでしょう。

次に、ユーザーの大半が所在する場所でデータをホストするようにします。最初にデータベース インスタンスを初期化する際に Cloud Firestore のロケーションを選択できるので、アプリに最適なロケーションはどこか、コスト面だけでなくパフォーマンス面も含めて十分に検討しましょう。

3 番目の方法としては、量子エンタングルメントに基づいた信頼性の高い安価なグローバル通信ネットワークを実装することが挙げられます。これにより、光の速度の問題を回避できるためです。この対応が済めば、おそらくライセンス料の支払いを終わらせることができ、そもそもどんなアプリを作っていたかも忘れてしまうかもしれません。

最後に

今後、Cloud Firestore のクエリが遅く感じる場面に遭遇したときは、上記の内容に目を通していずれかの状況に当てはまるかどうかを確認してください。なお、アプリのパフォーマンスを確認するには、実際の使用環境でのパフォーマンスを測定するのが一番です。この目的に最適なサービスとして、Firebase Performance Monitoring があります。

Performance Monitoring をアプリに統合して、クエリの実際のパフォーマンスを確認できるようカスタム トレースを 1~2 つ設定してみることをおすすめします。

Reviewed by Sophia Hu - Data Management Specialist, Google Cloud

この記事は Chrome セキュリティ チーム、Chris Thompson による Google Online Security Blog の記事 "Chrome UI for Deprecating Legacy TLS Versions" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

昨年 10 月、Chrome 81 で TLS 1.0 と 1.1 のサポートを削除する計画についてお知らせしました。この投稿では、削除の前段階として穏やかな警告 UI を導入すること、Chrome 81 で TLS 1.0 と 1.1 をブロックすることになる UI についてお知らせします。サイト管理者は、ただちに TLS 1.2 以降を有効にし、ここで紹介する UI が表示されないようにしてください。
以前の TLS の使用は減少していますが、現在もページ読み込みの 0.5% 以上で非推奨のバージョンが使われています。最終的なサポートの削除に向けた移行を容易にし、古い設定が動作しなくなったときにユーザーを驚かせることがないように、Chrome は 2 段階でサポートの終了に対応します。まず、非推奨のバージョンを使っているサイトに対して、新しいセキュリティ インジケーターを表示します。次に、ページ全面に警告を表示してサイトへの接続をブロックします。


削除前の警告
2020 年 1 月 13 日より、Chrome 79 以降で、TLS 1.0 または 1.1 を使用しているサイトに「Not Secure」インジケーターを表示し、ユーザーに古い設定であることを警告します。
新しいセキュリティ インジケーターと接続セキュリティ情報。2020 年 1 月以降、ユーザーが TLS 1.0 または 1.1 を使っているサイトにアクセスした際に表示される。

サイトで TLS 1.0 または 1.1 を使っている場合、Chrome はセキュリティ インジケーターをダウングレードし、ページ情報に詳細な警告メッセージを表示します。この変更では、ユーザーがページにアクセスする操作がブロックされることはありませんが、接続のセキュリティがダウングレードされていることが警告されます。
なお、Chrome の DevTools には既に警告が表示されるようになっています。非推奨のバージョンの TLS を使っていることをサイトオーナーに警告するためです。


削除後の UI
2020 年 3 月に Stable チャンネルにリリースされる予定の Chrome 81 以降では、TLS 1.0 または 1.1 を使っているサイトにアクセスしようとすると、ページ全体を覆うインタースティシャル警告が表示されて接続がブロックされます。
Chrome 81 以降では、TLS 1.0 または 1.1 を使っているサイトにアクセスしたユーザーに、全画面のインタースティシャル警告が表示される。最終的な警告は、今後変更される可能性がある。

サイト管理者は、ただちに TLS 1.2 以降を有効にしてください。サーバー ソフトウェアによっては(Apache や nginx など)、構成の変更やソフトウェアのアップデートが必要になる場合があります。さらに、すべてのサイトで TLS 設定を再確認することをお勧めします。最初のお知らせの際に、最新の TLS の基準について概要を説明しています。

企業向けリリースで SSLVersionMin ポリシーを “tls1.2” に設定すると、TLS 1.0 と 1.1 の最終的な削除について事前に確認することができます。この設定を行うと、クライアントが TLS 1.0 および 1.1 プロトコルで接続できなくなります。対応に時間がかかる企業は、このポリシーを使って TLS 1.0 や TLS 1.1 を有効化し直し、警告 UI を無効化することができます。ただし、この操作を行えるのは、2021 年 1 月までに限られます。

Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Chrome プロダクト マネージャー、Kenji Baheux による Chromium Blog の記事 "Experimenting with same-provider DNS-over-HTTPS upgrade" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


 ウェブを安全に使えるようにするという長年にわたる私たちの取り組みの一環として、Chrome 78 で DNS-over-HTTPS(DoH)実装を検証するための実験を行います。名前からもわかるとおり、この考え方は、HTTPS によって確保されるセキュリティとプライバシー上の重要な利点を DNS にもたらします。DNS は、指定されたウェブサイトをホスティングしているサーバーをブラウザが判断する仕組みです。たとえば、パブリック WiFi に接続しても、DoH を使っていれば、他の WiFi ユーザーが皆さんの見ているサイトを知ることはできなくなります。また、なりすましフィッシング攻撃も防ぐことができます。この実験は、既に DoH をサポートしている DNS プロバイダと連携して実施します。実験の目的は、現在の DNS サービスを DoH バージョンにアップグレードすることで、ユーザー間のセキュリティやプライバシーを改善することにあります。このアプローチでは、使用する DNS サービスは変わらず、プロトコルだけが変わります。そのため、既存の子ども向けの保護を含め、現在の DNS プロバイダが行っているコンテンツ制御の有効性は変わりません。

さらに具体的に説明します。Chrome 78 で行う実験では、ユーザーの現在の DNS プロバイダが DoH 対応プロバイダのリストに掲載されているかどうかを確認し、そのプロバイダが提供する同等の DoH サービスにアップグレードします。DNS プロバイダがリストに掲載されていない場合、Chrome は現在の動作を継続します。リストに掲載されるプロバイダは、プライバシーとセキュリティに対する強い姿勢、DoH サービスに向けた準備の完了、実験の参加への同意という条件を満たすプロバイダから選択されました。実験の目的は、Chrome の実装を検証し、パフォーマンスへの影響を評価することです。 

この実験は、サポートされているすべてのプラットフォーム(Linux と iOS を除く)で、一部の Chrome ユーザーを対象に行われます。Android 9 以上で、ユーザーが Private DNS 設定で DNS-over-TLS プロバイダを指定している場合、Chrome は関連付けられている DoH プロバイダを使い、エラー時にはシステムの Private DNS にフォールバックする場合があります。

DNS プロバイダの現状を維持し、プロバイダの同等な DoH サービスへのアップグレードのみを行うので、同じユーザー エクスペリエンスが維持されます。たとえば、DNS プロバイダが提供する不正なソフトウェアからの保護やペアレンタル コントロール機能は引き続き動作します。DoH が失敗した場合、Chrome はプロバイダの通常の DNS サービスを使います。Chrome 78 の chrome://flags/#dns-over-https でフラグを無効にして、実験をオプトアウトすることも可能です。


ほとんどのマネージド Chrome リリースは、実験の対象外になります。企業や教育機関の管理者の方は、今後のリリースノートを読んで DoH ポリシーについての詳細をご確認ください。このポリシーは、Chrome Enterprise ブログでも公開する予定です。

DNS には 35 年の歴史があり、さまざまな関係者が利用して多様なユースケースを実現しています。特に、ISP が提供する家族向けの安全なコンテンツ フィルタリングにおいて、DNS が重要な役割を果たせることは承知しています。そのため、重要なステークホルダー(ISP や DNS プロバイダ、オンラインの安全性を専門とする組織など)を巻き込んで手順についての議論を行いつつ、家族向けフィルターなどの現在利用されているユーザー向け機能を尊重した段階的なアプローチをとります。また、Chrome の機能とパフォーマンスの改善への協力に同意したユーザーから送られるパフォーマンスや信頼性に関する統計、ユーザーによるフィードバックも考慮します。

この実験は、ユーザーのプライバシー、セキュリティ、安全性を改善するために、協力して歩まなければならない長い道のりのつつましい第一歩です。DoH が実環境でどのように動作するか、確認するのが待ち遠しくてたまりません。皆さんからのフィードバックもお待ちしています!

Reviewed by Eiji Kitamura - Developer Relations Team

この記事は Leo Postovoit による The AMP Blog の記事 "Powerful impact: Why we AMPized the Australian pop culture site – GOAT" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


NOVA Entertainment はオーストラリアでも特に有名なメディア ブランドで、過去 19 年間にわたってラジオ、メディア、ローカル コンテンツに携わってきました。その NOVA がポップカルチャーやニュース、エンターテイメント向けのモバイル ファースト プラットフォームとして構築したのが GOAT です。

GOAT は、プログレッシブを重視した WordPress ビルドの開発によって恩恵を受けた最初の NOVA のサイトです。GOAT の編集者たちの目標の 1 つは、アクセスしやすく便利で高速なフォーマットによってコンテンツを届けることです。パフォーマンスとユーザビリティは最優先事項です。ここでは、GOAT の技術革新において AMP と PWA がどのようなインパクトをもたらしたのかについて説明します。

課題
GOAT ウェブサイトには、パフォーマンスとユーザビリティに関する問題が発生していました。ユーザー エクスペリエンスを改善して多くの端末との互換性を向上させるための最優先事項は、サイトのパフォーマンスを向上させることでした。サイトがコンテンツやアセットをレンダリングする際に遅延が生じ、ユーザーやオンサイト体験、共有体験の妨げになっていました。これは驚くべきことではありません。サイトへのエンゲージメントのレベルにパフォーマンスがどれほど重要かは、複数の調査結果が一貫して示しています。
今年東京で開催された技術カンファレンスの講演の冒頭で、Google 社員の Jeany Halliman は、Google がメディアサイトの訪問者を対象に「サイトを見る際に一番嫌なこと」を尋ねた調査について触れました。

「広告業界出身の私は、いつも(訪問者が嫌うのは)広告だと思っていました。しかし、ユーザーの大半は、遅いウェブサイトと答えたのです」 – Jeany Halliman



このグラフは、ページを離れる理由は遅すぎるから、と回答したユーザーが 46% にのぼることを示している。

この回答と、ページのスピードが直帰率に与える影響を細かく観測した結果には、明らかに相関性があります。しかし、過大な広告戦略が注目され、多くのメディアサイトがそれに対する「反動」を受けていることを考えれば、多くの方にとって、スピードがページの広告よりも上位に来ていることは驚きだったはずです。

チャンス
NOVA は、WordPress エンジニアリング エコシステムのリーダー的存在であり、Google と連携して公式の AMP Plugin for WordPress のメンテナンスを行っている XWP に連絡しました。XWP は、Rolling Stone、News Corp Australia、Rogers などの大手パブリッシャーや、Cloudinary、Google、BigCommerce、Automattic などの技術パートナー向けに美しく複雑なソリューションを開発していることで知られ、ウェブを進化させることを重視して仕事に取り組んでいます。

NOVA のステークホルダーが示した主要な目標は、パフォーマンス、拡張性、ユーザビリティでした。そのため、XWP にとっては、向かうべき道がプログレッシブ AMP によるアプローチであることは明白でした。

一方で、AMP ファースト戦略に移行するにあたって最も重要な目的は明らかでした。ユーザーが繰り返し利用し、喜んで共有してくれる高速な体験を作成するには、CI/CD、自動テスト、高可用性ホスティングを含む開発のベスト プラクティスを駆使して確実に拡張性や安定性を実現することも重要です。GOAT サイトは、コードの品質が高く、最新の WordPress の実装に関する留意点を踏まえて構築されているので、早いだけでなく、長く使えるものとして作られています。

解決策
AMP やその他のパフォーマンス改善策に精通している XWP は、NOVA が GOAT サイトで達成したい目標を実現するため、さまざまな実装を検討しました。最も適していたのは、1 つのコードベースで開発を効率化できる AMP ファースト戦略でした。

そこからさらに一歩進めた GOAT は、PWA 機能プラグイン(これも XWP と Google が連携して開発しています)のすばらしい事例とも言えるでしょう。このプラグインは、Service Worker を活用してオフライン モードや通知などの追加機能を提供します。また、この定義済みソリューションでは、AMP と PWA のメリットを今までになく簡単に組み合わせることができる amp-install-serviceworker コンポーネントが活用されています。

現在含まれている PWA 機能の範囲は限定的ですが、長期的な目標として、PC やモバイル端末へのインストール機能、さらに充実したオフライン モードやプリフェッチ ページ、ネイティブのプッシュ通知などを追加したいと考えています。これらの機能は、ウェブのあちこちに見られる強力な PWA と同様のものです。

広告の組み込み 
広告の読み込みが適切に設定されていない場合、ページのパフォーマンスが低下する原因となる可能性があります。GOAT のようなメディア重視のサイトでは、特にその傾向が顕著です。AMP を使うということは、XWP が GOAT の広告スタックを実装する際に、AMP 標準に準拠したアプローチを採用しなければならないということです。  完全に AMP 対応されていない広告プロバイダを利用するために多少の妥協は必要になりましたが、結果的には、広告収入を頼りにするメディアサイトとしてかなり高いパフォーマンスを実現しました。これは 2 つの長所を兼ね備えています。すなわち、優れたユーザー エクスペリエンスを実現でき、広告の読み込みも次善の方法で最適化されているので、パフォーマンスの低下につながることはありません

結果 
ここまで説明してきたように、GOAT は NOVA のサイトで初めて統合編集ワークフローとパフォーマンスを重視したテーマビルドを実稼働させたものです。これは PWA サイトであると同時に、すべてのテンプレートがネイティブ AMP として構築されています。パフォーマンス面での成果は明らかです。



この図は、AMP の実装前と実装後の GOAT のページ パフォーマンス統計を示す。
  • 複数のプロパティの編集操作を統合しています。
  • モバイルの Google Pagespeed Insights スコアは 7 から 77 に上昇しました。
  • WebPageTest 3G テスト: 実装前 / 実装後。ポイント: レンダリング開始時間(Start Render)が 1.5 秒短縮されました。操作が可能になるまでの時間は、43 秒からわずか 10 秒になりました。
  • Lighthouse テスト: 実装前 / 実装後。最初のコンテンツ描画(First Contentful Paint)が 5.8 秒から 2.5 秒になりました(3.3 秒短縮)。パフォーマンス スコアは 7 から 65 に上昇しました。最初の CPU アイドル時間(First CPU Idle)は 16.2 秒から 5.9 秒に短縮されました。
  • GTmetrix: 実装前 / 実装後。PageSpeed スコアは D(63%)から B(82%)に上昇しました。
AMP の活用を始める
GOAT サイトの AMP ファースト戦略で達成した結果をもとに、AMP を活用して現在のビジネスの課題を解決する方法について、さらに学習することをお勧めします。
  • AMP の詳細については、amp.dev にあるプロジェクトのホームページをご覧ください。  
  • 自分のサイトの互換性を評価し、AMP によってパフォーマンスとユーザー エクスペリエンスの恩恵を得られるかを確認してみたい方は、AMPized.com(WordPress サイトで AMP のメリットを実現する XWP のサービス)をご覧ください。
執筆者: XWP ストラテジスト、Leo Postovoit

Reviewed by Chiko Shimizu - Developer Relations Team

この記事は Naina Raisinghani による The AMP Blog の記事 "amp-script: AMP ❤️ JS" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

今年の AMP Conf では、<amp-script> のデベロッパー プレビューを紹介しました。本日は、<amp-script> の一般公開についてお知らせします。カスタム JavaScript は、AMP コンポーネントによって別の Worker スレッドで実行されます。そのため、超高速な AMP ページはそのままに、カスタム JavaScript を追加できるようになります。
<amp-script> を使うと、既存の AMP コンポーネントでは実現できなかったユースケースに対応できます。また、AMP ページと非 AMP ページでコードを共有することもできます。JavaScript フレームワークを使うことも可能です。次にあげるのは、<amp-script> チームが構築してきたいくつかのサンプルです。


検証機能付き複数ページフォーム
セクション移動時に検証を行う複数ページフォームの例
上の例を見て興味を持った方は、<amp-script> を試してみてください。なお、AMP のパフォーマンスを保証するために、いくつか制約がある点に注意が必要です。
  • コンテンツのジャンプ: 通常の <amp-script> では、意図しないコンテンツのジャンプを回避するため、ユーザーのジェスチャーが発生しないとページのコンテンツを変更することはできません。 
  • ページ読み込み: <amp-script> はユーザーの操作なしにページのコンテンツを変更することはできないので、ページの読み込み時にコンテンツを変更することもできません。
  • スクリプトのサイズ: 1 つの <amp-script> で使うスクリプトは、150 kB 以下である必要があります。なお、お気に入りの JS フレームワークを使うことはできますが、150 K の制限内に収まっている必要があります。
  • API のサポート: Web Worker ですべての API がサポートされているとは限りません。WorkerDOM には、許可されている API のリストが掲載されています。また、いくつかの DOM のメソッドやプロパティはまだ実装されていません。リスト全体は、WorkerDOM の互換性で公開されています。追加してほしい API がある方は、問題として送信してください、
<amp-script> は、React、Preact、Angular、Vue.js、jQuery、D3.js など、皆さんが既に利用しているかもしれないフレームワークに対応しています。

この点は、AMP を使っているデベロッパーから寄せられた最も重要な要望でした。AMP Project は、スピードという AMP の価値提案を維持しつつ、この要望に対処できたことをうれしく思っています。<amp-script> の動作の詳細については、こちらをご覧ください。また、このガイドに従って <amp-script> を試してみてください。このすばらしい手法を使うと、これまでは不可能だったたくさんのユースケースを実現できるようになります。

<amp-script> の使用に関する問題や機能リクエストがありましたら、遠慮なくお知らせください


投稿者: Naina Raisinghani(Google AMP Project、プロダクト マネージャー)


Reviewed by Chiko Shimizu - Developer Relations Team

この記事は Allen Huang and Rohan Shah (Product Managers on Android UI) による Android Developers Blog の記事 "Gesture Navigation: A Backstory" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


Android Q の最大の変更点の 1 つが、新しくなったジェスチャー ナビゲーションです。新しいシステム ナビゲーション モードでは、画面の左端または右端から内側にスワイプすると前の画面に戻ることができ、画面の下部から上にスワイプするとホーム画面に戻ることができます。また、画面の下隅から斜めにスワイプするとデバイス アシスタントが起動します。

システム ナビゲーションをジェスチャー モデルに移行したことで、ナビゲーション ボタンを非表示にしてアプリの画面領域を拡げ、より臨場感あふれるエクスペリエンスを実現できるようになりました。

今回は、ナビゲーション デザインの過程でどのような課題に直面し、難しい選択を迫られたときどのような理由で決断したかなど、新しいシステム ナビゲーションにまつわる裏話を披露します。ジェスチャーのデザインに関して少々マニアックな部分にまで踏み込みますが、デベロッパー並びに OEM パートナーの皆様とユーザーの利便性のバランスをどう取るかについて、Google がいかに頭を悩ませたかをご理解いただけたらと思っています。アプリをこれらの変更に対応させる方法については、Medium の記事シリーズ「エッジ ツー エッジへの対応」で詳しく解説しておりますのでぜひご覧ください。

ジェスチャーに移行した理由

アプリ デベロッパーやパートナーの皆様にとっての Android の魅力の 1 つは、スマートフォンでまったく新しい革新的な手法を試すことができる点ではないでしょうか。

モバイル デバイスのジェスチャー機能は 2009 年には登場していましたが、ジェスチャー ナビゲーションのパターンが急激に増えたのはここ 3 年ほどのことです。

この流れをリードしたのが、たとえば Fluid NGXDA のような、独創的なアイデアに挑戦してきた革新的な Android パートナーや Android アプリです。

Google が調査したところ、ジェスチャーはユーザーにとってさまざまなメリットがあることがわかりました。

  1. ジェスチャーは、スマートフォンを操作する方法としてよりスピーディーで、自然で、人間工学的に優れている
  2. ジェスチャーはより意図的である(ソフトウェア ボタンは、スマートフォンを手に取るとき偶然タップしてしまうことがある)
  3. ジェスチャーを採用することで、アプリ コンテンツに上書き表示するシステム ナビゲーションを最小限に抑えることができ、より臨場感あふれるエクスペリエンスを実現できる(大画面化と狭額縁化が進む中、「ホーム」ボタン、「戻る」ボタン、ナビゲーション バーなどを画面に表示する必要がない)

しかし、良いことばかりではありません。ジェスチャー モードにはさまざまな問題もあります。

  1. ジェスチャーは、すべてのユーザーが快適に利用できるとは限らない
  2. ジェスチャーは、習得がより難しく、ある程度の調整も必要になる
  3. ジェスチャーは、アプリのナビゲーション パターンと競合する可能性がある

しかし、何よりも私たちが問題だと感じたのは、Android スマートフォンでもブランドや機種が違えばジェスチャーが異なるという「断片化」が生じており、特に Android デベロッパーの皆様がこの点に大きな懸念を抱かれていることでした。
そこで Google では、ここ 1 年ほどかけて Samsung、Xiaomi、HMD Global、OPPO、OnePlus、LG、Motorola などのパートナーと協力し、将来的にジェスチャー ナビゲーションを標準化していくことを決めました。一貫性のあるユーザー エクスペリエンスとデベロッパー エクスペリエンスを提供するため、Android Q 以降の新しいデバイスでは、Q のジェスチャーをデフォルトのジェスチャー ナビゲーションにします。
ただし、すべてのユーザーがジャスチャーを快適に利用できるとは限りません。ジェスチャーのような細かな動きが得意でない方々のために、すべての Android デバイスで引き続き 3 ボタン ナビゲーションをオプション機能として提供することにしています。

今回これらのジェスチャーを採用した理由

Google ではまず徹底的な調査を行いました。ユーザーはどういう形でスマートフォンを握っているか、指が届く範囲はどのあたりか、最もよく使うのはスマートフォンのどの部分か、などです。これらの調査結果をもとに、ジェスチャー モデルのプロトタイプを数多く作成し、望ましさ、使用速度、人間工学性などさまざまな側面にわたってテストを実施しました。最終的なデザインは、ユーザーがすぐに習得できるか、ユーザーが短期間で慣れるか、ユーザーがどう感じたかなどを基準に決定しました。
「戻る」ボタンは、Android の初期から引き継がれている特徴的なナビゲーション要素です。どのような操作方法が「正解か」という議論はあるものの、「戻る」ボタンのおかげで多くのユーザーが Android を、操作しやすい、習得しやすいと感じてくれたようです。実際のところ、「戻る」ボタンは非常によく利用されており、使用回数は「ホーム」ボタンより 50% も多くなっています。今回のデザインにあたっては、この「戻る」ボタンを人間工学性と信頼性に優れ直感的に行えるジェスチャーにすることを目標の 1 つとし、使用頻度がそれほど高くないナビゲーション(ドロワー、「最近」など)よりも優先することにしました。
また、最も重要な 2 つのジェスチャー(「戻る」と「ホーム」)は、下に示した到達範囲の図に基づいて、親指が最も快適に届く領域で操作できるようにデザインしました。


スマートフォン画面のヒートマップを見ると、ユーザーが片手でスマートフォンを持った状態で快適に行えるジェスチャーがわかります。
ジェスチャー モデルのプロトタイプを数多く作成したことはすでに述べましたが、これらを試してもらい、ユーザーの評価とジェスチャー操作にかかった時間を比較しました。以下は、最終的な Q モデルと他のナビゲーション モードを比較したテスト結果のグラフです。

各ナビゲーション モードの人間工学性と片手操作性についてのユーザー評価の比較(値が大きいほど良い)


各ナビゲーション モードでの「戻る」と「ホーム」の操作にかかった平均時間の比較(値が小さいほど良い)

各ナビゲーション モードでの「最近」操作にかかった平均時間の比較(値が小さいほど良い)

「ホーム」と「戻る」の操作にかかった平均時間は、Q モデルが他のどのモデルよりも短く、ボタンを使った操作よりも速いことがわかります。一方、「最近」の操作は他のモデルに比べ少し時間がかかっていますが、これは「最近」の使用頻度が「ホーム」の半分程度であるため優先度を下げたことによるものです。
定性的に見ると、ユーザーは Q モデルの片手操作性を高く評価していますが、人間工学性の面では依然としてボタンのほうが評価が高くなっています。

アプリドロワーとその他のアプリスワイプ

最終的には、操作性と使用頻度のバランスを考慮し、サイドスワイプを「戻る」ジェスチャーとして採用しました。しかし、特にジェスチャーがアプリに及ぼす影響を考えると、難しい決断を強いられる場面もありました。

たとえば、Google アプリによって異なりますが、アプリ ナビゲーション ドロワーをスワイプ操作で開いているユーザーは 3~7% 存在します(残りのユーザーは 3 本線のメニューをタップして開いています)。このドロワーのスワイプ ジェスチャーが「戻る」ジェスチャーに置き換えられたため、一部のユーザーは 3 本線のメニューを使った操作に慣れる必要があります。非常に難しい決断でしたが、「戻る」操作の使用頻度の高さを考慮し、ユーザーにとって最も便利になるように最適化したつもりです。

ユーザーの行動を変えずにすむよう、ドロワー ジェスチャーと「戻る」ジェスチャーをうまく識別できる方法がないか試行錯誤しました。しかし、どの方法を採用した場合でも、前の画面に戻ろうとしたユーザーが誤ってドロワーを引き出してしまうことがあり、「戻る」ジェスチャーの信頼性に疑念が生じてしまうと判断しました。

ドロワーに限らず、ジェスチャーは人々にとって大きな変更であり、慣れるまでに平均で 1~3 日かかりました。特に、カルーセルを左右にスワイプするのが苦手だったユーザーは、「戻る」ジェスチャーに慣れるのにも苦労したようです。

定性的な調査の結果によると、1~3 日で新しい操作に慣れたユーザーは、2 つのジェスチャーをしっかり区別し、スムーズに操作できるようになりました。3 ボタン ナビゲーションに戻すオプションも残されていますが、大部分のユーザーが戻したくないと回答しました。

他の調査では、ユーザーが新しいシステム ナビゲーションに切り替える際には、それに慣れるための明確な調整段階があることもわかりました。Q モデルの場合、最初の 1~3 日は「戻る」ジェスチャーの使用回数は少ないのですが、その後は 3 ボタン システムや Android P ナビゲーションと同じぐらいの頻度で利用されるようになりました。

デベロッパーの皆様にご対応いただきたいこと

Google としては、このようなジェスチャー ナビゲーションによって、Android でのユーザー エクスペリエンスの標準化を進めていきたいと考えています。今回採用したジェスチャー モデルはほとんどのユーザーにとって最適なものと考えていますが、これらが既存のアプリのジェスチャーと競合する場合は、デベロッパーの皆様にアプリの操作方法を調整していただく必要がございます。皆様のご負担を少しでも軽減できるよう、十分な情報提供を心掛けてまいります。

新しいジェスチャー ナビゲーションへの対応は、次に示す 3 つステップで進めることができます。

  1. エッジ ツー エッジに対応します。これにより、アプリのコンテンツを画面いっぱいに表示できるようになります。
  2. システム ユーザー インターフェース(ナビゲーション バーなど)との視覚的な重なりを処理します。
  3. システム ジェスチャーとの競合を解消します。

これらのステップについては、Medium の記事シリーズ「エッジ ツー エッジへの対応」で詳しく解説しています。シリーズ最後の記事では、これまでに多く見られたいくつかのシナリオを紹介し、アプリをエッジ ツー エッジ対応にするための最適な方法を提案します。
新しいジェスチャー ナビゲーションについて、ご意見、ご感想などございましたらぜひお寄せください。Android Q のジェスチャー ナビゲーションはもちろん、Android の日々の改善に役立てさせていただきます。

Posted by Yuichi Araki - Developer Relations Team


Google Cloud は、インターネットサービス業界で活躍するインフラエンジニア、サーバーアプリケーションエンジニア、テクニカルリーダーの皆様に向けて、"Google Cloud INSIDE Digital" を開催します。

業界をリードする方々や、深い専門知識をもつ Google 社員をスピーカーに迎え、注目インターネットサービスの開発の裏側や、Google Cloud Platform(GCP) を中心としたテクノロジーアップデートをお届けします。この Google Cloud INSIDE Digital をきっかけに、新しいサービスやプロダクトが生まれるような会へ、参加者の皆様と共に育てて行きたいと考えています。

今回のテーマは「ここでしか聞けない AI 、機械学習サービスの活用例」。様々なアプリケーション、サービスに AI が搭載されると言われる時代において、他企業の取り組みが気になる方も多いのではないでしょうか。今回は、GCP の AI、機械学習サービスの最新動向と、先進的な企業における AI 、機械学習の活用例についてご紹介します。


開催概要

  • 名 称 : Google Cloud INSIDE Digital
  • 日 時 : 2019 年 11 月 1 日(金) 19 : 00 - 22 : 00
  • 会 場 : グーグル・クラウド・ジャパン合同会社
〒106‐­6108 東京都港区六本木 6-11-10 六本木ヒルズ森タワー
  • プログラム




 
        







 





















18:30
受付開始


18:30 ~
開場


19:00 ~ 19:05
オープニング


19:05 ~ 19:25
Google Cloud と機械学習が切り拓く、IT 開発の新しい潮流
佐藤 一憲
Google デベロッパー アドボケイト


19:25 ~ 19:45
広告会社のクリエイター、エンジニア、Google AI でなにができるか? ”そっくりとりっぷ” 誕生ストーリー
林 智彦 氏 博報堂 グローバル統合ソリューション局 グローバル・インタラクティブ・ディレクター


19:45 ~ 19:55
休憩


19:55 ~ 20:15
AI 技術集団による GCP サービス化事例
山本 大祐 氏
株式会社オプティム 経営企画本部 ディレクター


20:15 ~ 20:35 
ショッピングサイトにおける商品画像への Could Vision API の活用
木村 慎太郎 氏


20:35 ~ 20:55
株式会社エニグモ サービスエンジニアリング本部 リードエンジニア
言葉を AI であつかうために
最首 英裕 氏
株式会社グルーヴノーツ 代表取締役社長


20:55 ~ 21:00
クロージング


21:00 ~ 22:00
懇親会

  • 主 催: グーグル・クラウド・ジャパン合同会社
  • 定 員:200 名
  • 参加費:無料 (事前登録制)

参加申し込み 

https://goo.gle/2lCQWGk

上記リンクからお申し込みください。




※ 競合他社様、パートナー企業様からのお申し込みはお断りさせていただくことがございます。
※ 報道関係者のご参加はお断りさせていただきます。
※ ビジネス向けのイベントとなっております。学生の方のご参加はご遠慮ください。
※ お申し込み多数の場合は抽選を行います。参加いただける方には、後日、ご登録されたメールアドレスに参加のご案内をお送りします。