astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

BigQueryのINFORMATION_SCHEMA VIEWSを触ってみました

データエンジニアのaranです。
月日の流れは早いもので、今年の1月以来3回目の登場になります!

いきなりで、すみませんが
最近ハマっているテレビは、NHKの「みんなで筋肉体操」です。

パワーワードは「自分に甘えない!」です。

この言葉を自分に言い聞かせ、7月中旬から筋トレと1時間弱のウォーキングをしています。
2ヶ月継続したのですが、このブログを書いている時には、高校時の体重に戻りました。
次は体脂肪率も戻そうと頑張っています。

前書き

前回は、BERTについてお話しさせて頂きました。

今回は自然言語処理から離れ、データエンジニアらしく?
BigQueryのINFORMATION_SCHEMAについて調べましたので
そのお話しをさせて頂きます。

何でまた?

弊社では、特許情報を取り扱っており
ある特定の業界・分野の特許群を検索するのに、BigQueryを活用しています。

目的の特許群を検索するには、
いろいろな単語を組み合わるため、検索条件が複雑になり
トライ&エラーを繰り返すため
BigQueryの費用がかかりがちになります。

また、社員の増加によりBigQueryの利用頻度が増えるため
更なるBigQueryのコスト増が予測でき
コストの見える化、コスト削減策の早期実施が
より重要になってきます。

そこで、2020年8月にINFORMATION_SCHEMA VIEWSが一般提供したこともあり
メタデータを可視化することで、コスト削減箇所を炙り出せるのでは?
と、淡い期待を抱き、調査することにしました。

INFORMATION_SCHEMAについて

INFORMATION_SCHEMAとは
データセット、ジョブ、テーブル、ビュー等のメタデータへのアクセスを提供する一連のビューです。

INFORMATION_SCHEMAの詳細については、
BigQueryの公式ドキュメントで確認できます。

尚、INFORMATION_SCHEMAにアスセスする場合、料金が発生します。
制約等を含め、公式ドキュメントを確認の上、アクセスすることをおすすめします。

INFORMATION_SCHEMAのアクセス方法

INFORMATION_SCHEMAには
リージョン修飾子.INFORMATION_SCHEMA.ビュー
でアクセスできます。

例えば、データセットのメタデータにアクセスするには、以下のSQLを実行します

SELECT * FROM `region-us.INFORMATION_SCHEMA.SCHEMATA`;

また、テーブルに関しては、リージョン修飾子の部分をデータセットIDにすることで
指定したデータセットのテーブル メタデータを取得できます。

SELECT * FROM `dataset_id.INFORMATION_SCHEMA.TABLES`;

BigQueryのコストについて

先程、INFORMATION_SCHEMAにアスセスする場合、料金が発生すると説明しましたが
BigQueryの料金について軽く触れたいと思います。

詳細については、公式ドキュメントにおまかせすることにしますが
BigQueryの料金は大きく2つから構成され

  • ストレージ料金
  • クエリ料金

ストレージ料金は、データを保持する期間とデータ量で課金され
クエリ料金は、SQL実行時に読み込んだデータ量で課金されます。

BigQueryのコスト削減方法はいろいろあると思いますが
今回は以下の2つに絞って、話をすすめたいと思います。

  1. ストレージの削除:削除可能な不要なストレージ(データセット)を見つける
  2. 定額料金の利用:定額料金(スロット数)を見積もる

そこで、INFORMATION_SCHEMAのメタデータを使い
以下の3点を把握できるか調査しました。

  1. データセットのレコード総数とデータ総量の把握
  2. 90日以上アクセスがないデータセットの把握
  3. 定額スロット数の把握(概算見積もり)

データセットのレコード総数とデータ総量の把握

まずは、データセットのデータ総量とレコード総数を調べてみたいと思います。
こちらを把握できれば、毎月のストレージ料金の概算
並びに、レコード数の増加による料金増加率の見積りを期待できます。

データセットのデータ総量とレコード総数は
データセットID.__TABLES__より取得できました

-- データセットのレコード総数とデータ総量を取得
SELECT
  dataset_id,
  FORMAT("%'d", SUM(row_count)) AS row_count,
  ROUND(SUM(size_bytes) /(1024 * 1024 * 1024 * 1024), 2) AS size_tb
FROM
  -- データセットIDは、環境に合わせ適宜変更して下さい
  データセットID.__TABLES__
GROUP BY
  dataset_id
;

尚、今回の調査では、1つのSQLで全データセットを集計する方法は
わかりませんでしたので
データセット分のSQLをUNION ALLでつなげた形で取得しています。
(ご存知の方いらっしゃいましたら、ぜひお教え頂ければと)

一部抜粋した形になりますが、弊社環境で利用しているデータセット一覧は
以下のようになりました
(データセット名はマスキングしております)

f:id:astamuse:20200922235235p:plain f:id:astamuse:20200922235254p:plain

尚、今回の利用しているプロジェクトは特許関連情報を管理しており
アプリのアクセスログ等のように、データ件数はそこまで多くありません。

本SQLを実行することで、用途を把握できていないデータセットや
想定以上にデータ量が多いデータセットが存在していることも
恥ずかしながら、わかりました。。

90日以上アクセスがないデータセットを洗い出す

次に、各データセットへの最終アクセス日(最終クエリ実行日)を取得して
90日以上アクセスがないデータセット一覧を洗い出せるか
調べてみたいと思います。

こちらを把握できれば、長期保存に移行したデータセット有無
並びに、データセットの削除やCloud Storageへの移行等が検討できます。

こちらは、 INFORMATION_SCHEMA.JOBS_BY_*を利用することで
取得できました。

SELECT
  s.schema_name,
  j.latest_creation_time
FROM
  `region-us.INFORMATION_SCHEMA.SCHEMATA` AS s
LEFT JOIN (
  SELECT
    referenced_table.dataset_id AS dataset_id,
    MAX(creation_time) AS latest_creation_time
  FROM
    `region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT`,
    UNNEST(referenced_tables) AS referenced_table
  WHERE
    referenced_table.table_id != '__TABLES__'
  GROUP BY
    referenced_table.dataset_id ) AS j
ON
  j.dataset_id = s.schema_name
-- ジョブメタデータにアクセス履歴がない、または最終クエリ実行日より90日以上経過したデータセット
WHERE j.latest_creation_time IS NULL
  OR j.latest_creation_time < TIMESTAMP_SUB(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY), INTERVAL 90 DAY)
;

注意点として
データセットのレコード総数とデータ総量の把握で実行したSQLを対象外にするため
WHERE句に referenced_table.table_id != '__TABLES__' を追加しております。

尚、弊社環境で本SQLを実行したところ
90日以上アクセスがないデータセットが1つ
INFORMATION_SCHEMA.JOBS_BY_*にデータがない(180日以上アクセスがない)
データセットが17つありました。
(※ドキュメントでは、完了したジョブの過去 180 日間の履歴を表示との記述がありますが、弊社環境では100日程度の履歴でした)

定額スロット数の概算見積もり

最後に、定額スロット数の概算見積もりができないかを
調べてみたいと思います。

こちらを把握できれば、クエリ実行毎で課金されるオンデマンドより
定額料金への移行、並びにスロット購入数の見積りを期待できます。

スロットの詳細については、BigQueryの公式ドキュメントにおまかせします

スロット使用率については、 INFORMATION_SCHEMA.JOBS_BY_*を利用することで取得でき
公式ドキュメントのサンプルSQLを参考にし、月平均のスロット使用率を取得してみました。

SELECT
  DATE(TIMESTAMP_TRUNC(creation_time, MONTH), "Asia/Tokyo") AS month,
  COUNT(1),
  -- 月平均のスロット使用率
  SUM(total_slot_ms)
    / (1000*60*60*24* 
        -- 日付を抽出
        EXTRACT(DAY FROM 
          -- 月末日を取得
          DATE_SUB(
            -- 1ヶ月を加算
            DATE_ADD(
              -- 月初日付を取得
              DATE(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), MONTH), "Asia/Tokyo"),
              INTERVAL 1 MONTH
            ),
            INTERVAL 1 DAY
          )
        )) AS avg_slots
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
GROUP BY
  DATE(TIMESTAMP_TRUNC(creation_time, MONTH), "Asia/Tokyo")
;

尚、弊社環境で、本SQLを実行したところ
以下のようなになりました。
(棒グラフがクエリ実行数、線グラフがスロット使用率)

f:id:astamuse:20200922220642p:plain

6月は、他の月よりクエリ実行は少ないが
データ量が多いテーブルへのアクセスが多く
スロット使用率が多いことがわかりました。

最後に

INFORMATION_SCHEMAへの単純なSQLでも
メタデータの把握・可視化ができ、コスト削減できる箇所が
ある程度見えました。

今回は、単純な単位での集計でしたが
更に時間帯別やテーブル単位やユーザ別での集計・分析も
必要になります。

今後もINFORMATION_SCHEMAを使って
更なるメタデータの把握に努めたいと思います。
それ報告はまたの機会に。

アスタミューゼでは、エンジニア・デザイナーを募集中です。
ご興味のある方は遠慮なく採用サイトからご応募願います。是非、お待ちしています。

UIを選ぶとき考慮すべき4つのこと

f:id:astamuse:20200826100717j:plain こんにちは。デザイン部でフロントエンドエンジニアをしているkitoです。
今回は、アプリを作成する際、最適なUIを選定する4つの指針について書きたいと思います。

UIは、人間の心理や認知に深く関わり、アプリへの信頼性を左右する重大な要素ですが、我々がアプリを作成するとき、ほとんどの場合直感的にUIを選択しています。経験豊富なUIデザイナーなら、その直感は間違っていないことが多いでしょう。

ただ、そうはいってもUIはUIデザイナーだけで決定できるわけではないので、直感を言語化して共有することがプロジェクトを前進させる力になります。本文は、学術的な内容ではなく、数多くのUIを実装してきた「現場」からのひとつの私見として書きたいと思います。

UIって?

UIがユーザーインターフェイスの略であることは言うまでもないですが、そもそもUIがアプリで果たしている役割とは何でしょうか。

よくあるUIであるモーダルを例にして考えてみましょう。モーダル型のUIは、ユーザーがボタンをクリックすることで小さなウインドウが展開されて新しい情報が出現します。当たり前のことを言うようですが、UIには、このように隠されていた情報を出現させる役割があります。   

では、なぜ予め情報を隠すのでしょうか。
それは、あらゆる情報が整理されず一挙にユーザーに提供されれば、ユーザーの認知的負荷が上昇しアプリに対する信頼性を低下させるからです。アプリの信頼性が下がれば、自ずと利用率は下がるでしょうしコンバージョンも低下していくでしょう。 見方を変えるなら、UIを作成する作業は情報を整理して隠す作業であると言えます。

1.情報の量と質

UIを決定する主な要因は、情報の量と質です。

ツイッターなどで採用されているタイムライン型のUIを思い浮かべてください。
あのような情報が流れるタイプのUIが採用されているのは、ユーザーが接する情報が膨大でかつ個々の情報を見逃したとしてもクリティカルではないからです。

ツールチップは、少ない情報を付加する際に有効でしょうし、バリデーションのアラートは、情報としては少量ですが、質としては確実に視認させなければなりません。
ただし、情報の質と量が変わらなかったとしても、ユーザー環境の変化で、UIの流行り廃りはあります。

例えば、スマートフォンが普及したことで、Webサイトは縦型になり、スクロールさせるUIやトグル型のUIでコンテンツを折りたたむことが増えました。また、iPhoneでflashが動かないので、その代わりとして、パララックス型やカルーセル型のUIが流行しました。

2.優先度

情報の質のなかでも、その情報がどれぐらい優先度の高い情報であるのかもUIを決定する上で無視できません。優先度によって、情報を表示する場所やタイミングが決まってくるからです。
優先度の高い情報は、アクセス時に画面を専有させたUIで表示させたり、headerの直下など視認性の高い場所に表示します。

情報の優先度は、ビジネスサイドの判断が不可欠なことが多く、UIデザイナーやフロントエンドエンジニアだけで決められるわけではありません。 もっとも、問題になるのはビジネスサイドも情報の優先度を知っているとは限らない点です。

行政のサイトなどでよくある、注意喚起のメッセージが画面のほとんどを専有して、眉をひそめるようなファーストビューになっているサイトを見たことがあるかもしれませんが、これは情報の優先度の決定がうまく機能していないからです。注意喚起やalertメッセージを羅列しても、ユーザーの認知負荷が高まり離脱してしまえば、注意喚起は注意喚起として機能しません。

いらぬ詮索かもしれませんが、行政のサイトを運営している公務員の言い分を忖度するなら、彼らとしては、ある市民にとっては重要な情報であるけれどある市民にとっては重要でないという、多様なユーザーを相手にする行政組織の特殊性や、また公務員の人事評価が減点主義なので、注意喚起のメッセージを表示させないリスクの方が、情報を整理して埋もれてしまうリスクより大きいのかもしれません。
なんにしろ、UIがそれを運営している組織のロジックに影響されるのは、妙なことですがありえることです。

UIの優先度は、ビジネスサイドとのコミュニケーションで解決することが多いですが、解決しない場合は、コストはかかりますがA/Bテストを提案してUIをユーザーに決めてもらうのも一案です。
(なおA/Bテストの限界については、過去私が書いたこのエントリーが参考になるかもしれません)

3.学習済みUI

UIを選定するうえで、そのUIの使い方について想定しているユーザーが学習済みであるかどうかも考慮するポイントです。

ハンバーガーメニューは、一般的な学習済みのユーザーであるなら、メンタルモデルが出来上がっているのでサイトを回遊するためのメニューが隠されていると認知できます。
一方、ITに疎いユーザーにとっては、ハンバーガーメニューは三本線の謎の模様に過ぎず、何ができるのかすぐには把握できないでしょう。だからハンバガーメニューを使うべきではないと言いたいわけではなく、UIの選定に想定ユーザーのリテラシーを考慮すべきだと言いたいのです。
UIデザイナーやフロントエンドエンジニアは、なまじ自分がUIについてよく知っているだけに盲点になりがちです。

ITに疎いユーザーを対象にアプリを作成するなら、ハンバガーメニューを使うとしても下に文字で「メニュー」と情報を付加するような対応が考えられます。
ヤフーのiPhoneアプリでは、様々なユーザーが使うことを想定してか、画面下部のナビゲーションには、アイコンと文字が並べて表示されています。こういったことが参考になるでしょう。

また、優れたUIは新規につくるというより既にあるものなので、デバイスに標準的に備わっているUIかBootstrapのような広く使われているUIライブラリを優先的に使用したほうが、ユーザーの負荷だけではなく実装の負荷も低くなります。

4.考えさせない

ユーザーに考えさせないでという観点も重要です。

単にスムーズに使えて認知的負荷がかからないというだけではなく、人間が意識していない「無意識」にアプローチする手法です。
例えば、アプリの最上部と最下部は、コンテンツの両端にあるので人間の認知として注目しやすい場所です。無意識に目が行きやすい場所なので、コンバージョンポイントやナビゲーションが設置されることが多いはずです。UIの設置場所や目線の導線を適切に設計するなら、ユーザーの意識に顕在化させる前に意図した行動を促せるでしょう。

また、UIに没入させることを少し考えてみても良いかもしれません。ボタンをクリックしてスッと画面が切りかわり、それがなんとなく心地よいので気がつくと登録フォームを完了していたということがあります。
正直言って胸を張って言えることではないですが、ユーザーが熟慮の末、慎重にボタンを押さなければならないUIは良いUIではなく、(適切なマーケティングで集めた対象ユーザーを)軽率に登録させるUIの方が良いUIと言えます。

あるいは、バナーデザインでよくある、人間が美男美女を無意識に信頼してしまう傾向を利用し、美男美女の画像を掲載してサイトの信頼性と混同させる手法がありますが、UIデザインにおいてもこの手法が使えるでしょう。
例えば、信頼性の高いデータを心地よいUIで見せることで、サイトへの信頼性と混同させ・・・
人相が悪くなってきた気がするので、今日はこのあたりで終わりたいと思います。

アスタミューゼでは、エンジニア・デザイナー・PM・コンサルタントを募集中です。ご興味のある方は遠慮なく採用サイトからご応募ください。お待ちしています。

全員リモートでの開発ミーティングを振り返ってみる

立秋の候、残暑が続きますが暦の上ではもう秋ですね。 多分に漏れず、我々 ICP 開発チームも3月4月頃から在宅での仕事が行われているので開発での打ち合わせ/スクラムイベントを中心に工夫や変わったことなどを振り返ってみたいと思います。

同じように打ち合わせで工夫されている方、開発チームの様子に興味ある方に軽い気持ちで読んでいただければ幸いです。 (スクラムに関する用語説明などは省略しております、ご了承ください)

スクラムスタートの経緯などは @yukung がこちらの記事にしております。 スクラムに興味がある方はこちらもご参考にしていただければ! http://lab.astamuse.co.jp/entry/we-started-scrum

目次

  • デイリー・スクラム(通称 DS)
  • スプリント・プランニング(通称 プランニング)
  • スプリント・レビュー&振り返り(通称 レビュー/振り返り)
  • オフィス勤務との兼ね合い
  • ツールまとめ

デイリー・スクラム(通称 DS)

(基本は)毎朝定時に開催される DS から朝が始まります。

開始時間になると、Google Meets にメンバーは集合します。カレンダーに予定を入れておけば、自動でミーティング開催場所が準備されるので非常に便利です。開発のミーティングは殆どが Google Meets で行われます。突発的なものは slack で済ませることもあります。

さて、最近ではその日の司会が決まっているので司会の人が画面共有をしながら、取組中のストーリー/タスクを確認していきます。 かつてはオフィスに模造紙でスクラムボードを作っていたこともありましたが、編集の便利さや画面共有を簡単にしたいということから Jamboard でスクラムボードを運用しています。 模造紙→Jamboard への移行は、リモートをテストしてみようと言う話になった3月頭頃からスタートしていました。

f:id:astamuse:20200819105423p:plain

Jamboard 内の構成は模造紙の頃と大きく変わってはいないですが、必要に応じてお知らせ欄を追加したり、それぞれのアイコン画像を設定したりと工夫もしています。

アイコン画像は視認性が高いので良いですね。 注目して欲しいコメントは、みんな自然と文字を大きくしてアピールしています。

スプリント・プランニング(通称 プランニング)

一週間の計画をたてるプランニングも Meets で行っています。

こちらも司会を立てています。リモートでの司会業は試行錯誤と行った感じでしょうか。 PdMからの説明で話を振ってもらったり、発言が少ない人に話を促してみたりと、司会の仕事は瞬発力が求められる面もあるので少し大変です。 お休みの人がいても大丈夫なように当番を回す形になってきました。大変さをシェアするという意味合いも結果的に大きいです。

プロダクトバックログ・スプリントバックログは Asana で管理しています。

f:id:astamuse:20200819105443p:plain

Asana はリモート前から使っていましたが、最近はプランニングで話し合うことを事前に開発の Wiki 上でまとめるようにしました。

Asana 上にはカード説明を最新の状況にしておくのが望ましいと思うのですが、説明が長くなりすぎると読みづらく、すぐに一番話したいことがどこなのか伝わりづらかったので議事録の場を事前に設けて読んでもらうことにしました。

話す話題を明確にするということは、リモートに限らず大事だなと実感しています。

スプリント・レビュー&振り返り(通称 レビュー/振り返り)

作業の完了をデモを中心に見ていく場なので、Google Meets で適宜画面を切り替えてデモをしてもらっています。

デモはオフィスでもディスプレイに繋いだものを見ていたので、個人的には変わりはないですね。 レビューは質問をするメインが PdM だから、話の交錯が起きづらいのかもしれません。

一方で振り返りはほとんどが話し合いです。 チームで issue だと感じていることと、スプリント内での各自の困りごとなどをテンショングラフを中心に振り返っています。

f:id:astamuse:20200819105630p:plain

伝わりづらいかもしれませんが、各自のアイコンと日時コメントをつけています。

タスクとして忙しくなりがち/悩みがちなことを共有することも出来ていますし、制限時間内で雑談をする場としても機能しているかと思います。 直近覚えているものだと、一人4分以内で振り返っていました。

リモートで顔を合わせていないこともあり、重要性が以前より増しているかもしれません。

オフィス勤務との兼ね合い

全員リモートを前提として各種ミーティングを開催していますが、色々な事情で出社をする人もいます。

自分が出社の機会に感じたことは、やはりディスプレイの違いでしょうか。 打ち合わせとは関係なさそうですが、リモートの打ち合わせは共有される画面を写す必要があるので、やはりディスプレイが大きいに越したことはないですね。

幸い、在宅でも会社がディスプレイを送る手配をしてくださったので開始当初から助かりました。 最初の時期に総務の方などの負担があったと思いますが、確実に生産性の向上につながっていると思います。

椅子も在宅で座る時間が長いので影響は大きいですね。姿勢をサポートする座椅子を個人的に使っています。 とはいえ、椅子はさすがに家に送られてきても、、、少なくとも自分は困ります。。

ツールまとめ

リモートで積極的に導入された - Google Meets(カレンダーから自動でルーム生成) - Google Jamboard(Web のみ)

以前より - slack - G Suite - Asana - Crowi(社内で立てている Wiki に利用)

また、会議中での会話が重ならないように、画面上にチャットを表示しやすくするアプリケーションを試してくれているメンバーもいます。 今後も、柔軟に試行錯誤をして生産性を上げられればと思います!

いかがでしたでしょうか

少しでもリモートでの雰囲気が伝われば幸いです。 それと同時に振り返ることで改善点も話し合いをしやすくなるかと思うので、定期的に振り返る機会は大事ですね。

また、リファインメントとの向き合い方がスクラム自体を非常に改善させたと感じています。 それを振り返るには時間が足りないのでそれはまたの機会に。

暑さ厳しき折、どうか皆様お元気でお過ごしください。 勝手にブログにお盆休みを設けた gyopi でした。

こんな情勢ですが、お約束のご案内となります。

チームメンバーと議論を深め合いながら成長していきたいエンジニア、デザイナー、PM の方を絶賛大募集中です! ご興味のある方は下記バナーの採用サイトからご応募いただければ幸いです。

Copyright © astamuse company, ltd. all rights reserved.