まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:view

IBM Cloudant(Apache CouchDB) の MapReduce ビューを使って、特定フィールドの値ごとの文書数を返す API を作ってみました。

なお以下の内容は IBM Cloudant でも Apache CouchDB でも同様に有効だと思っていますが、スクリーンショットなどは IBM Cloudant のものを使って説明しています。ご了承ください。


まず、前提として現状 Cloudant DB 内に以下のような JSON 文書が複数格納されているとします:
{
  "_id": "(id値)",
  "name": "(名前)",
  "date": "(日付)"
}

"name" フィールドに名前、"date" フィールドに日付文字列が格納されます。同じ "name" の値でも "date" の値は異なっていたり、同じ "date" の値でも "name" は異なっていたりするとします:
2020021401


この DB の状態から
 名前(name)ごとにグルーピングして、文書数がいくつずつあるか?
を調べる、というのが今回やりたいことです。

例えば上記例の場合であれば、"name" = "K.Kimura" の文書数は 5 、"name" = "K.Hashimoto" の文書数は 3 、"name" = "M.Matsuoka" の文書数は 2 、といった結果を導き出すための方法です。SQL の使える RDB であれば count() 関数と group by 句を使えば簡単そうですが、NoSQL 型である Cloudant でいちいち全件検索してから "name" の値ごとにカウントして・・・という REST API を作らずに調べるにはどうすればいいでしょうか?

その答が本ブログエントリのテーマでもある MapReduce ビューを作って、Cloudant REST API でこのビューを呼び出すことで実現できます。以下、その手順を紹介します。


まず DB 内に MapReduce ビューを定義するデザイン文書を作成します。画面左のメニュー "Design Documents" の+部分をクリックし、"New Doc" を選択します:
2020021402


新規にデザイン文書を追加する編集画面になるので、以下の内容を入力して "Create Document" ボタンをクリックします:
2020021401

{
  "_id": "_design/myindex",
  "language": "query",
  "views": {
    "count_by_name": {
      "map": {
        "fields": {
          "name": "asc"
        },
        "partial_filter_selector": {}
      },
      "reduce": "_count",
      "options": {
        "def": {
          "fields": [
            "name"
          ]
        }
      }
    }
  }
}

JSON の中身を一応解説すると、"myindex" という名前のデザイン文書を作り、その中で "count_by_name" という名前のビューを定義しています。このビューではまず "name" の値ごとにソート(map)し、その結果を _count 関数でカウント(reduce)した結果を値として持つよう定義しています。

正しく操作できていると Design Documents の中に定義した文書が追加されているはずです。これで MapReduce ビューが定義できました。
2020021404


後は Cloudant REST API でこのビューを呼ぶだけで結果を得ることができます。IBM Cloudant のホストURL (https://xxxx.cloudant.com)に続けて、DB 名(mapreduce)、デザイン文書名(myindex)とビュー名(count_by_name)を指定し、以下の URL にウェブブラウザでアクセスします:
https://xxxx.cloudant.com/mapreduce/_design/myindex/_view/count_by_name?group=true


すると以下のような結果が得られ、期待通りの結果を参照することができました:
2020021405
{
  "rows": [
    { "key" : [ "K.Hashimoto" ], "value" : 3 },
    { "key" : [ "K.Kimura" ], "value" : 5 },
    { "key" : [ "M.Matsuoka" ], "value" : 2 }
  ]
}

これで「DB 内にどんな名前の文書が存在しているか」や「各名前ごとの文書数」を簡単に調べることができるようになりました。

後はこのような処理を行う必要があるぶんだけビューを追加で定義しておけば、それぞれのビューごとに(フィールドとその値ごとに)文書数を調べたり、特定フィールド値の合計値を求めることができるようになります。


比較的パワーポイントを多く使うエンジニアであると自負しています。プレゼンするためだけではなく、資料作成ツールとしての利用も多いと思っています。個人的にはブランクテンプレートを使って、フリーハンドでの資料作りが便利で使いやすいツールであると思っています。

パワーポイント 2013 以降では「発表者ツール」という機能が付きました(厳密にはもっと前のバージョンから存在していたようですが、2013 から標準で発表者ツールが有効になったようです)。HDMI などのケーブルを外部出力端子に指した状態で F5 を押してプレゼンを再生すると、自動的に発表者ツールに切り替わり、発表者がプレゼンテーションをしやすいように次のスライドやアニメーションを確認できたり、スピーカーノートを確認したり、画面は発表状態のまま次に表示するスライドを手元で切り替えたりすることができるようになりました:
2019061201


たしかにこれはこれで便利だと思います・・・が、実は自分はこの発表者ツールが苦手だったりします。というのも、自分のプレゼンはデモを併用することが多いのですが、パワポのプレゼンテーションからデモアプリケーション(ウェブブラウザとか、テキストエディタとか、コンソール画面とか)への画面切り替えにこれまでは ALT+Tab や Windows+Tab などのショートカットを使っていたのですが、発表者ツールのままだとこの方法では画面が別アプリに切り替わらないのです(PC 内の画面は切り替わるが、外部出力先ではプレゼンが表示されたままになる)。発表者ツールを使ってプレゼンしている状態から別のアプリケーション画面に切り替えて表示するには、一度パワポのプレゼンを ESC キーなどで終了し、その後でアプリケーションを切り替えて表示する必要があります。そして(デモが終わるなどして)再度パワポのプレゼンに戻るには、改めてパワポに戻り、直前まで表示していたページを開いて続きを再生(SHIFT + F5)する必要があります。要するに面倒なのです。


これを回避するため、発表者ツールでプレゼンするのではなく、従来の方法でプレゼンしたいのですが、ではそのためにはどうすればよいか? というのが今回のブログエントリです。PC の機種によってはハードウェア的にプレゼン方法を固定する方法もあったりするようですが(自分は以前、その方法で回避できていたのですが)、今回紹介するのはソフトウェアでの設定方法です(なので機種に関係なくできると思います)。

その方法として、一時的に発表者ツールを無効にする、というだけであれば発表者ツール画面内のオプション設定で発表者ツールを一時的に利用しないという選択肢があります。これで一時的に発表者ツールではなくなりますが、この方法の場合はまた再びプレゼンを再開した後に発表者ツールが有効になってしまいます。なので私自身が望む設定ではありません:
2019061202


恒常的に発表者ツールを無効にする場合はパワポの「スライドショー」メニューから「発表者ツールを使用する」のチェックを外す必要があります。この方法であればプレゼンをいったん停止し、また再開しても発表者ツールに戻ることはありません:
2019061203
(英語だと "Slide Show" メニューの "Use Presenter View" のチェックを外す)


これで(個人的に)扱いにくい発表者ツールを使わずにプレゼンし、必要に応じてアプリを切り替えてデモを行い、またパワポのプレゼンに戻る、、といった操作が可能になりました。めでたし、めでたし。

#他にいい方法があったら教えてください。
 

このページのトップヘ