BigQueryまずは使ってみよう[2/3](データ挿入編)

 先日の続きです。
空のテーブルはできましたが、データの入れ方がわかりません。RDBならINSERT文ですよね、ということでお試しでINSERT文を書いてみました。

何と、エラーが出ました。「VALUES」のリストかクエリが想定されているんだけど、違いますよ~、と、言われていますね。完全に当てずっぽうで書いてみたのですけど、行けましたねぇ。続きを書いてみます。文字列の表現はシングルクォーテーションでいいのか、日付はどうやって表現するのか分からないけど、とりあえずの形で「INSERT INTO BOOKS VALUES (1, ‘CASEツール ‘, 1989-11-01, 1999-11-01);」を書いてみたところ、やはりエラーが。。。「Table name “BOOKS” cannot be resolved: dataset name is missing.」ということで、データセットの名前が必要ということですね。。。いやいや、これはいつ終わるかわからないパターンですよ。
 と、いうことでまじめにやりましょう。こういう時はマニュアルを参照します。右上の方にアイコンがありましたよ!

ヘルプをクリックしたら、「人気の記事」一覧が表示されましたので、その中の「BigQuery」を選んでみました。すると、いろいろ書いてありますが、、、「よく参照されるトピック」の中に、「BigQueryへのデータの読み込み」がありました。ポチリと押してみましたら、書いてありましたねぇ。データは次の方法で読み込むことができます、、、

  • Cloud Storage から
  • Google アド マネージャーや Google 広告などの他の Google サービスから
  • 読み取り可能なデータソース(ローカルマシンなど)から
  • ストリーミング挿入を使用してレコードを個別に挿入する
  • DML ステートメントを使用して一括挿入を行う
  • Cloud Dataflow パイプラインの BigQuery I/O 変換を使用して BigQuery にデータを書き込む

ということで、今回は5番目のDMLステートメントでチャレンジしている、ということですね。で、マニュアルをよく読んでみると、INSERT文はカラムを指定する必要があるということで、気を取り直して実行してみますが、、、今度は、「Syntax error: Unexpected keyword NO at [1:26]」というエラーメッセージ。どうやら、カラム名に「No」を使っていたのがいけないのでしょうか。イライラしますねぇ♪
 はい、気を取り直して、No→BookNoに変更してテーブルを作り直します。今度は前回の経験をもとに、スキーマをテキストとして編集で作成してみました。カンマ区切りか、JSON形式で作成できるようです。

さあ、気を取り直してINSERT文作成の続きです。日付の指定方法が分かりませんでしたが、文字列としておけば問題なさそうです。なんとか成功しそうです!どやっ!?

成功しました!

「テーブルに移動」して「プレビュー」を選択すると、データが入っていました。数行でも並列で投入されるのでしょうか、順番はバラバラになっていました。

 それにしても、項目に予約語は使えないなら、作るときに教えてくれればいいのにねぇ。日本語の項目が作れないのも不親切な教え方でしたけど、テーブル作成上の注意点はこのあたりでしょうか。データ作成時の注意点は項目の指定は省略できないという点でした。で、やっと最初に話したかった話題の準備ができましたが、ちょっと長くなってきたので、次のエントリーとします。

BigQueryまずは使ってみよう[1/3](テーブル作成編)

 BigQueryを、こんな風に使うことってできるのかなぁ、という状態からなかなか抜け出せず、心を入れ替えることにしました。これまではとにかく勉強すればいいかと思っていたのですけど、ぼくが間違っていました。いったん内容を想定して、まずは使ってみることにします。

 と、いうことで先日勉強会で話題になった、リソースの利用開始日、終了日について、かつてこんなことを話題にしたなぁ、という内容を説明するために以下のテーブルを作ってみます。データは、佐藤正美先生の著作一覧です。発売開始日は奥付の第1刷の発行日、終了日は、本が売られていないものは10年後の日付、売られているものはいったん9999年12月31日とします。

No商品名発売開始日終了日
CASEツール 1989-11-011999-11-01
2リポジトリ入門解説 1991-10-012001-10-01
3クライアント/サーバ データベース設計テクニック1993-11-012003-11-01
4RADによるデータベース構築技法1995-11-252005-11-25
5T字形ER データベース設計技法(黒本)1998-10-252008-10-25
6論理データベース論考2000-03-259999-12-31
7ITコンサルタントのスキル2003-04-159999-12-31
8データベース設計論-T字形ER(赤本)2005-09-252015-09-25
9SEのためのモデルへのいざない2009-02-119999-12-31

まずは、今回のお試し用にプロジェクト「BigQuery Challenge 2019」を作成。
そして、Navigationメニューからビッグデータの「BigQuery」を選択します。

中央の右寄りにある「データセットを作成」をクリックします。すると、以下のような「データセットを作成」のダイアログ(?)が現れますので、データセットIDを「BOOKS」として「データセットを作成」をクリックしてみます。ロケーションと、デフォルトのテーブルの有効期限が設定できるのですね。

キャプチャは取れませんでしたが「BOOKSが作成されました。」とポップアップして消滅しました。確かに、今までなかった三角形が左側に表示されるようになりました。

そして、開いてみたところ、、、どうやらぼくはテーブルを作ったと思っていたのですけど、できたのは「データセット」というものらしい。ああ、確かに「データセットを作成」でしたね。気を取り直して「テーブルを作成」してみましょう。

そして、今度こそテーブルの作成ですが、、、ソースとして「テーブルの作成元」を選択できるようですね。今は「空のテーブル」となっていますけど、選択肢は他に、「Google Cloud Storage」「アップロード」「ドライブ」「Google Cloud Bigtable」ですね。確か、CSVを指定すれば、100件でデータ型を自動判別してフィールドもつくってくれる、と、Google OnAirで、聞いたような気がします。

今回は、デフォルトに従って、「空のテーブル」で進めてみます。テーブル名を今度こそ「BOOKS」にして、おお、「スキーマ」の定義ですね。「テキストとして編集」もできるし、「+フィールドを追加」をクリックして、項目を追加していくこともできるのですね。テキストの編集方法がわからないので、ここは「+フィールドを追加」で地道に増やしていきます。今回は「No」「書籍名」「開始日」「終了日」にしてみますので、一気に4つ追加してみます。なるほどねぇ、こんな風になるのですね。

では、「名前」を入れて、型を選択します。型は「STRING」「BYTES」「INTEGER」「FLOAT」「NUMERIC」「BOOLEAN」「TIMESTAMP」「DATE」「TIME」「DATETIME」「GEOGRAPHY」「RECORD」がありました。前半は一般的なデータベースにも登場してきますので問題ありませんね。でも、GEOGRAPHYは地図情報でしょうか。あと、RECORDは不思議なワードですね。ネストして行データを格納できるのでしょうか。
モードは基本的にNOT NULLにするのがお好みなのですけど、選択肢は「NULLABLE」「REQUIRED」「REPEATED」でした。REPEATED、謎です。(笑)
順番に入れていこうとしたところ、いきなりエラーです。日本語、使えないのですね。「フィールド名の先頭は文字またはアンダースコアにしてください。含めることができるのは、文字、数字、アンダースコアのみです。」だって。むー、マジか~、今時マルチバイトが使えないとは、、、ざんねん。英語の苦手なユーザーに提供できなさそうですねぇ。あとで別名を付けたり、って、できないかなぁ。。。
 【追記:2019/05/04】
 最後の画像にある、「説明」項目は、「スキーマを編集」ボタンから編集可能で、そちらは日本語を記載することができました。

と、いうことでまたしても心を入れ替えて、英数字とアンダースコアのみで作成することにします。

次は、パーティションとクラスタの設定ですが、今回は少量データでちょっと作ってみるだけなので、パーティションは「パーティショニングなし」のままです。ほかの選択肢は「取り込み時間により分割」「Partition by field」「StartDate」「EndDate」ですね。なるほど、日付項目を作るとパーティションの候補に出てくるのですね。クラスタリングはパーティショニングを利用しないと選べないようです。いずれにせよ、パフォーマンス目的で必要になってくる設定ですので、今回はとりあえず放置、パフォーマンスが必要な時に検討する余地がある、ということですね。詳細オプションは暗号化の話でしたので、そのままにしておきます。さあ、「テーブルを作成」をポチリとしてみます。

またしてもキャプチャは取れませんでした。。。「BOOKSを作成しました。」というポップアップがでていましたが、、、確かにできていました!

ええと、テーブルができましたが、データはどうやって入れればいいのでしょうか。。。それらしいボタンやメニューはありません。クエリーを使うのかな?
長くなったので、いったんこれにて終了します。続きはまた次のエントリーとします。

Google Cloud Platform(GCP)の始め方

 GCPの始め方は、GMailのアカウントを持っていればとっても簡単。持っていない場合は作りましょう。

  1. Chromeにてログインした状態で「https://cloud.google.com」へアクセス。
  2. 「無料トライアルを試す」をクリック
  3. 必要事項を入力すれば、新規プロジェクトが作成されて使える状態になります。

1.https://cloud.google.comへアクセスします。

2.「無料トライアル」をクリックすると必要事項を入力する画面へ遷移します。
 利用規約(英文)を読んで、内容確認して、「同意して続行」をクリック。次の画面でも必要な情報を入力して「無料トライアルを開始」ボタンをクリックすれば、自動的に最初のプロジェクトが作成された状態で「ようこそ」の画面が表示されます。あ、無料トライアルの2/2画面はスクリーンショットを取り忘れました。すみません。

3.「ようこそ」画面。

これで、Google Cloud Platformが使える状態になりました。

そして、みなさんはこのあとGCPを何に使う予定でしょうか。
 ぼくは、このあとMarketplaceからWordPress(Google Click oo Deploy)を探し出してデプロイしました。MarketplaceとはGoogleのテクノロジーパートナーが提供している有料のソリューションサービスを検索することができて、すぐにデプロイ(展開)して利用できるサービスです。ちょうどこのページはそのサービスが利用されています。月々およそ3000円ほどかかっていますがその他は今のところ無料です。WordPressは最新版に更新するのも簡単で、セキュリティ面も安心です。
 GCPが提供しているクラウドサービスの中でも、WordPress用の仮想マシン(VM)をクラウド上に作るという、一番イメージしやすい使い方ではないでしょうか。

 そして、GCPについては、ただいまQwicklabsにて学習中です。先日GCP入門編トレーニングセミナーに参加したら、1か月分のサブスクリプションを提供していただけました。あ、Qwicklabsというのはオンラインのハンズオントレーニングサービスです。つまり1か月は、タダでWeb上のトレーニングサービスを自由に使えるということです。Googleさま、さすが太っ腹です。あと、Cloud OnAirという木曜日の18時から放送されるGoogleの新製品の機能説明番組があって、それを見て勉強しています。そちらも視聴してしばらくしたらQwicklabsのサブスクリプションをプレゼントしてくれました。
 今のところ、ひとりでもくもくと勉強しておりますが、新しい概念を自分のものにするのはなかなか難しいものですね。誰か一緒に勉強してくれる人、いませんかねぇ♪

不審物か?!

 何の前ぶれもなく、Panasonic Storeから小包が送られてまいりました。

 会社を始めるにあたり、開発の会社なんだから、やっぱりパソコンはサイコーのやつが欲しいよね、ということでLet’s noteの2019年春モデルが発売されるのを少しだけ待って、カスタマイズモデルでスペックが一番よいのをチョイスして購入しました。しばらく使っているうちに、以前使っていたSurfaceにはスタイラスペンがついていたのに、Let’s noteにはついていなかった、ということに気づきました。それで、Panasonic Storeをウロウロして付属品を見つけて、付属品と書いてあるのに別売りなのかよ~、とブツブツ言いながら買い物かごに入れておいた記憶があったのです。なので、荷物が届いたときに思ったのが、まさかスタイラスペンが届いたのか?ということです。でも、まだ一円も利益を出していない会社に、使ってみたいだけのスタイラスペンは無駄遣いだよね、と、注文ボタンは押さなかったはずなんだけど、と、自分を疑ってから、勝手に注文されて送られてきたのか、と、Panasonic Storeを疑いました。

 で、疑うのはそこそこにして、箱を開けてみました。中にはなにやら小さな箱が。

 そう、レッツノートオリジナル名刺ケースが送られてきたのでした。
中に入っていた紙には『「カスタマイズレッツノート2019春モデルご購入特典」プレゼント発送のご案内(中略)今後とも、パナソニック ストアをご愛顧賜りますよう心よりお願い申し上げます。』と書かれてありました。はい、心よりご愛顧、しちゃってますよね~。そして、、、スタイラスペンじゃなかった!
 そして、肝心の名刺ケース、ちょっとぐっときましたよ。(笑)

ローマ字変換ファンクション

 お仕事でひらがなをローマ字に変換するプログラムが必要になったのですが、ちょっと調べてみて、うまく利用できそうなやつが意外となかったのでデータベースOracle用として作ってみました。
 ご利用は自己責任でどうぞ。

CREATE OR REPLACE FUNCTION HIRA2ROMAN (HIRA IN VARCHAR2)
  RETURN VARCHAR2
IS
  TYPE tMapping IS RECORD (
    hira varchar2(10), roman varchar2(10)
  );
  TYPE tTable IS TABLE OF tMapping INDEX BY BINARY_INTEGER;
  vTable tTable;
  REP VARCHAR2(4000);
-- http://www.mext.go.jp/b_menu/hakusho/nc/k19541209001/k19541209001.html
-- 第二表があるものはそちらを優先して、変換対象のひらがなが長い順にならべる
  PROCEDURE INIT IS
    i NUMBER;
  BEGIN
    i := 1;
    vTable(i).hira := 'きゃ'; vTable(i).roman := 'kya'; i := i + 1; -- 第一表
    vTable(i).hira := 'きゅ'; vTable(i).roman := 'kyu'; i := i + 1; -- 第一表
    vTable(i).hira := 'きょ'; vTable(i).roman := 'kyo'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぎゃ'; vTable(i).roman := 'gya'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぎゅ'; vTable(i).roman := 'gyu'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぎょ'; vTable(i).roman := 'gyo'; i := i + 1; -- 第一表
    vTable(i).hira := 'くぁ'; vTable(i).roman := 'kwa'; i := i + 1; -- 第二表
    vTable(i).hira := 'ぐぁ'; vTable(i).roman := 'gwa'; i := i + 1; -- 第二表
    vTable(i).hira := 'しゃ'; vTable(i).roman := 'sha'; i := i + 1; -- 第二表
    vTable(i).hira := 'しゅ'; vTable(i).roman := 'shu'; i := i + 1; -- 第二表
    vTable(i).hira := 'しょ'; vTable(i).roman := 'sho'; i := i + 1; -- 第二表
    vTable(i).hira := 'じゃ'; vTable(i).roman := 'ja'; i := i + 1; -- 第二表
    vTable(i).hira := 'じゅ'; vTable(i).roman := 'ju'; i := i + 1; -- 第二表
    vTable(i).hira := 'じょ'; vTable(i).roman := 'jo'; i := i + 1; -- 第二表
    vTable(i).hira := 'ちゃ'; vTable(i).roman := 'cha'; i := i + 1; -- 第二表
    vTable(i).hira := 'ちゅ'; vTable(i).roman := 'chu'; i := i + 1; -- 第二表
    vTable(i).hira := 'ちょ'; vTable(i).roman := 'cho'; i := i + 1; -- 第二表
    vTable(i).hira := 'ぢゃ'; vTable(i).roman := 'dya'; i := i + 1; -- 第二表
    vTable(i).hira := 'ぢゅ'; vTable(i).roman := 'dyu'; i := i + 1; -- 第二表
    vTable(i).hira := 'ぢょ'; vTable(i).roman := 'dyo'; i := i + 1; -- 第二表
    vTable(i).hira := 'にゃ'; vTable(i).roman := 'nya'; i := i + 1; -- 第一表
    vTable(i).hira := 'にゅ'; vTable(i).roman := 'nyu'; i := i + 1; -- 第一表
    vTable(i).hira := 'にょ'; vTable(i).roman := 'nyo'; i := i + 1; -- 第一表
    vTable(i).hira := 'ひゃ'; vTable(i).roman := 'hya'; i := i + 1; -- 第一表
    vTable(i).hira := 'ひゅ'; vTable(i).roman := 'hyu'; i := i + 1; -- 第一表
    vTable(i).hira := 'ひょ'; vTable(i).roman := 'hyo'; i := i + 1; -- 第一表
    vTable(i).hira := 'びゃ'; vTable(i).roman := 'bya'; i := i + 1; -- 第一表
    vTable(i).hira := 'びゅ'; vTable(i).roman := 'byu'; i := i + 1; -- 第一表
    vTable(i).hira := 'びょ'; vTable(i).roman := 'byo'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぴゃ'; vTable(i).roman := 'pya'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぴゅ'; vTable(i).roman := 'pyu'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぴょ'; vTable(i).roman := 'pyo'; i := i + 1; -- 第一表
    vTable(i).hira := 'みゃ'; vTable(i).roman := 'mya'; i := i + 1; -- 第一表
    vTable(i).hira := 'みゅ'; vTable(i).roman := 'myu'; i := i + 1; -- 第一表
    vTable(i).hira := 'みょ'; vTable(i).roman := 'myo'; i := i + 1; -- 第一表
    vTable(i).hira := 'りゃ'; vTable(i).roman := 'rya'; i := i + 1; -- 第一表
    vTable(i).hira := 'りゅ'; vTable(i).roman := 'ryu'; i := i + 1; -- 第一表
    vTable(i).hira := 'りょ'; vTable(i).roman := 'ryo'; i := i + 1; -- 第一表
    vTable(i).hira := 'あ'; vTable(i).roman := 'a'; i := i + 1; -- 第一表
    vTable(i).hira := 'い'; vTable(i).roman := 'i'; i := i + 1; -- 第一表
    vTable(i).hira := 'う'; vTable(i).roman := 'u'; i := i + 1; -- 第一表
    vTable(i).hira := 'え'; vTable(i).roman := 'e'; i := i + 1; -- 第一表
    vTable(i).hira := 'お'; vTable(i).roman := 'o'; i := i + 1; -- 第一表
    vTable(i).hira := 'か'; vTable(i).roman := 'ka'; i := i + 1; -- 第一表
    vTable(i).hira := 'が'; vTable(i).roman := 'ga'; i := i + 1; -- 第一表
    vTable(i).hira := 'き'; vTable(i).roman := 'ki'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぎ'; vTable(i).roman := 'gi'; i := i + 1; -- 第一表
    vTable(i).hira := 'く'; vTable(i).roman := 'ku'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぐ'; vTable(i).roman := 'gu'; i := i + 1; -- 第一表
    vTable(i).hira := 'け'; vTable(i).roman := 'ke'; i := i + 1; -- 第一表
    vTable(i).hira := 'げ'; vTable(i).roman := 'ge'; i := i + 1; -- 第一表
    vTable(i).hira := 'こ'; vTable(i).roman := 'ko'; i := i + 1; -- 第一表
    vTable(i).hira := 'ご'; vTable(i).roman := 'go'; i := i + 1; -- 第一表
    vTable(i).hira := 'さ'; vTable(i).roman := 'sa'; i := i + 1; -- 第一表
    vTable(i).hira := 'ざ'; vTable(i).roman := 'za'; i := i + 1; -- 第一表
    vTable(i).hira := 'し'; vTable(i).roman := 'shi'; i := i + 1; -- 第二表
    vTable(i).hira := 'じ'; vTable(i).roman := 'ji'; i := i + 1; -- 第二表
    vTable(i).hira := 'す'; vTable(i).roman := 'su'; i := i + 1; -- 第一表
    vTable(i).hira := 'ず'; vTable(i).roman := 'zu'; i := i + 1; -- 第一表
    vTable(i).hira := 'せ'; vTable(i).roman := 'se'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぜ'; vTable(i).roman := 'ze'; i := i + 1; -- 第一表
    vTable(i).hira := 'そ'; vTable(i).roman := 'so'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぞ'; vTable(i).roman := 'zo'; i := i + 1; -- 第一表
    vTable(i).hira := 'た'; vTable(i).roman := 'ta'; i := i + 1; -- 第一表
    vTable(i).hira := 'だ'; vTable(i).roman := 'da'; i := i + 1; -- 第一表
    vTable(i).hira := 'ち'; vTable(i).roman := 'chi'; i := i + 1; -- 第二表
    vTable(i).hira := 'ぢ'; vTable(i).roman := 'di'; i := i + 1; -- 第二表
    vTable(i).hira := 'つ'; vTable(i).roman := 'tsu'; i := i + 1; -- 第二表
    vTable(i).hira := 'づ'; vTable(i).roman := 'du'; i := i + 1; -- 第二表
    vTable(i).hira := 'て'; vTable(i).roman := 'te'; i := i + 1; -- 第一表
    vTable(i).hira := 'で'; vTable(i).roman := 'de'; i := i + 1; -- 第一表
    vTable(i).hira := 'と'; vTable(i).roman := 'to'; i := i + 1; -- 第一表
    vTable(i).hira := 'ど'; vTable(i).roman := 'do'; i := i + 1; -- 第一表
    vTable(i).hira := 'な'; vTable(i).roman := 'na'; i := i + 1; -- 第一表
    vTable(i).hira := 'に'; vTable(i).roman := 'ni'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぬ'; vTable(i).roman := 'nu'; i := i + 1; -- 第一表
    vTable(i).hira := 'ね'; vTable(i).roman := 'ne'; i := i + 1; -- 第一表
    vTable(i).hira := 'の'; vTable(i).roman := 'no'; i := i + 1; -- 第一表
    vTable(i).hira := 'は'; vTable(i).roman := 'ha'; i := i + 1; -- 第一表
    vTable(i).hira := 'ば'; vTable(i).roman := 'ba'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぱ'; vTable(i).roman := 'pa'; i := i + 1; -- 第一表
    vTable(i).hira := 'ひ'; vTable(i).roman := 'hi'; i := i + 1; -- 第一表
    vTable(i).hira := 'び'; vTable(i).roman := 'bi'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぴ'; vTable(i).roman := 'pi'; i := i + 1; -- 第一表
    vTable(i).hira := 'ふ'; vTable(i).roman := 'fu'; i := i + 1; -- 第二表
    vTable(i).hira := 'ぶ'; vTable(i).roman := 'bu'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぷ'; vTable(i).roman := 'pu'; i := i + 1; -- 第一表
    vTable(i).hira := 'へ'; vTable(i).roman := 'he'; i := i + 1; -- 第一表
    vTable(i).hira := 'べ'; vTable(i).roman := 'be'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぺ'; vTable(i).roman := 'pe'; i := i + 1; -- 第一表
    vTable(i).hira := 'ほ'; vTable(i).roman := 'ho'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぼ'; vTable(i).roman := 'bo'; i := i + 1; -- 第一表
    vTable(i).hira := 'ぽ'; vTable(i).roman := 'po'; i := i + 1; -- 第一表
    vTable(i).hira := 'ま'; vTable(i).roman := 'ma'; i := i + 1; -- 第一表
    vTable(i).hira := 'み'; vTable(i).roman := 'mi'; i := i + 1; -- 第一表
    vTable(i).hira := 'む'; vTable(i).roman := 'mu'; i := i + 1; -- 第一表
    vTable(i).hira := 'め'; vTable(i).roman := 'me'; i := i + 1; -- 第一表
    vTable(i).hira := 'も'; vTable(i).roman := 'mo'; i := i + 1; -- 第一表
    vTable(i).hira := 'や'; vTable(i).roman := 'ya'; i := i + 1; -- 第一表
    vTable(i).hira := 'ゆ'; vTable(i).roman := 'yu'; i := i + 1; -- 第一表
    vTable(i).hira := 'よ'; vTable(i).roman := 'yo'; i := i + 1; -- 第一表
    vTable(i).hira := 'ら'; vTable(i).roman := 'ra'; i := i + 1; -- 第一表
    vTable(i).hira := 'り'; vTable(i).roman := 'ri'; i := i + 1; -- 第一表
    vTable(i).hira := 'る'; vTable(i).roman := 'ru'; i := i + 1; -- 第一表
    vTable(i).hira := 'れ'; vTable(i).roman := 're'; i := i + 1; -- 第一表
    vTable(i).hira := 'ろ'; vTable(i).roman := 'ro'; i := i + 1; -- 第一表
    vTable(i).hira := 'わ'; vTable(i).roman := 'wa'; i := i + 1; -- 第一表
    vTable(i).hira := 'を'; vTable(i).roman := 'wo'; i := i + 1; -- 第二表
  END;
BEGIN
  INIT;
  REP := HIRA;
  FOR i in vTable.FIRST .. vTable.LAST LOOP
    REP := REPLACE(REP, vTable(i).hira, vTable(i).roman);
  END LOOP;

  -- その他の変換ルール
  -- yと母音(aeiou)が続く「ん」は、「n'」と続くyまたは母音(aeiou)に変換
  REP := REGEXP_REPLACE(REP,'ん([yaeiou])','n''\1');
  -- その他の「ん」は「n」に変換
  REP := REPLACE(REP,'ん','n');
  -- 「っ」は、続く子音の文字を重ねるよう変換
  REP := REGEXP_REPLACE(REP,'っ(.)','\1\1');
  RETURN REP;
END;
/

DMBOK2概説セミナー

 現在ぼくは、データマネージメント協会日本支部(DAMA Japan Chapter(略称 DAMA-J))という組織の会員です。そちらから「DMBOK2 概説セミナー」のお知らせが送られてまいりましたので、聞いてきました。ちなみにDAMA-Jというのは、国際データマネージメント協会(Data Management Association International(略称 DAMA-I)) の日本支部で、データ管理を実践する国際的な非営利団体で、データマネージメントを普及するために活動しています。

 ここでDMBOK2といっているのは、データマネージメント知識体系ガイド 第二版(DATA MANAGEMENT BODY OF KNOWLEDGE SECOND EDITION)のことで、DAMA-Iから出版された書籍の日本語訳本のことです。2018年12月にDAMA-J会員有志の方々によって翻訳されました。ぼくは会員になって日が浅くて、翻訳にも参加していないし、内容も軽くしか理解していません。会員の方の会話についていくのがやっと、という状況なので、今回のセミナーは、ぼくのような書籍の内容が難しくてよく分かりません、という人たちはとってもありがたいものでした。
 セミナーは、

  • データマネジメント概説(15分)
  • DMBOK2概説(45分)
  • DMBOK2第1章概説(45分)

という構成になっていて、終了後にフリーディスカッション(懇親会)という感じでした。すべてをここに記載するわけにはいかないので、現時点で受け取れた、ぼくなりのデータマネージメントのまとめを記載しておきます。

データマネジメントのまとめ

  • データとは
    • 日常業務を記録する
    • 企業にとって重要な資産(ただし、積極的に管理している組織はほとんどない)
    • データが集まることで(データ→インフォメーション→ナレッジ→ウィズダム)
      • 意思決定の基になる
      • 知恵を創出する基になる
  • データマネジメントについて
     データマネジメントは、データを資産として考え、その価値を高めるために実施されます。それぞれのデータに存在するライフサイクルについて維持管理するための計画や手順を決めることや、それらを実施することもデータマネジメントに含まれます。より詳細な内容は書籍にゆだねるとして、キーワードとしては以下のようなものがありました。
    • データの資産価値を高めるために行う
      • 正確さ、完全性、新しさ、整合性、アクセスしやすさ、セキュアなど
      • 信頼性の高い高品質なデータにより → 優れた意思決定が可能になる
    • ITの発展により、その重要性が増してきている
      • IT活用範囲とデータ活用範囲は異なっている
    • データの価値
      • 物理的なものではなく、金銭的価値を与えるのが困難
      • 評価基準がなく価値を定めるのが難しい
      • 品質の低いデータは処理コストがかかり、ビジネス戦略に悪影響を及ぼす
    • より高品質なデータを目指す
      • 計画
      • アーキテクチャ
      • モデリング
      • 戦略的なアプローチ
    • メタデータ、データライフサイクル
      • 業務スキル
      • 高度なITスキル
      • 組織横断的で全社的な視点

 DMBOK2は、データマネージメントに関する知識について、ITのツールだけでなく、人や組織、プロセス面からも検討された導入書になっています。もし興味を持たれた方は、ぜひ一緒にDAMA-Jで学びましょう。

Googleさまからお電話が!

Google Cloud Platformを始めてちょうど2か月ほど経ったところ、Google Cloudさまからお電話をいただきました。ぼくはちょうど不在だったということで、「 【GCP無料トライアル】ご登録ありがとうございました 」というタイトルでメールをいただきました。クレジットカードによる決済方法も登録してあったので、無料トライアル中だとは思っていなかったのですけど、そうなのですね。

その後、電話がつながったので、「こんなところに問題があって、こんな風に利用したいと思っています。」と、お伝えしたところ、提案させてほしい、ということに。ま、営業活動でやっていることでしょうから、当然の流れですよね。本来はGCPを学んで検証の終わったぼくが、こんな風に構築したいと思っています、と、お客様に提案しようと思っていたので、これからどんな流れで仕事が進むのか、ちょっと不安な気持ちになりました。でも、いろいろとより早く、より便利になるならそこには目をつぶりましょう。

ぼくは競合に負けないように、GCPの使い方についていろいろと検証しないといけませんね。ということで、先日入門トレーニングで教えてもらった、QWIKLABSのクエストにチャレンジしてみます。QWIKLABSはGCPを学べるオンライン学習プラットフォームです。最初のクエストはなぜか英語ですが「GCP Essentials」です。
さあ、がんばるぞ~!

Google Cloud Platform 入門編トレーニングに参加してまいりました!

 先日、行ってまいります、と言っていたGoogle Cloud Platform入門編トレーニングに行ってまいりました。ただ、トレーニングとは言っていましたが、実際の練習はありませんでした。ま、時間の都合だったようです。トレーニングするのだからと、そんなに大人数がいることは想定していなかったのですけど、すごい人でした!
 休憩中に一番後ろから写真撮ってみました。休憩中なので空席が見えますが、これがほぼ満席状態でした!

Google Cloud Platform 入門編トレーニング会場 休憩中の様子
2019年2月20日 Google Cloud Platform 入門編トレーニング

 書店に置いてあったGoogle Cloud Platform関連書籍の数から、まだそんなに認知されていないと思っていたのですけど、これはスゴイですね。圧倒されました。

 さて、肝心のセミナー内容ですが、概要がバッチリ理解できました。概ね書籍に書いてあったことではあったのですけど、実際にデモンストレーションを見せてもらい、事例紹介してもらうことで、より理解が深まりました。
 もともとのGCPのコンセプトは、Googleのソフトウエアエンジニアが使っている開発環境を一般のデベロッパーにもパブリッククラウドとして利用できるように、というものだそうです。とにかく何十億人ものユーザーが利用できるサービスを提供しているので、自動的にスケールする、ということがとても魅力的ですね。ちなみに冒頭のあいさつにあった、残念ながらトイレはスケールしないのでお早めに、というGCPジョーク、会場は静まり返っておりましたが、ぼくはこっそりニヤリとしていましたよ。
 それで前々からそうじゃないかと思っていたけど今回明らかになったことは、GCPを利用すれば何もしなくても何でもかんでも自動的にスケールしてくれるんじゃないかという期待は、半分くらいはあっていたのだけれど、このページを提供しているCompute Engineでは勝手にはスケールしないということですね。必要ならLoad BalancingとKubertenes Engineを組み合わせればいいということでしたが、このページがバズって見れなくなることはきっとないでしょうから、ま、この構成で充分ですね。

 ぼくにとって今回の説明で特に印象的だったのは、BigQueryの説明で、これはデータウエアハウスのサービスなのですけど、実際にサンプルデータを使ってSQLを実行する画面を見せてもらいました。こういう環境があるなら、データをとにかく放り込んで、あとから分析する、ということも簡単にできそうだな、と思いました。あと、時間の都合で説明は割愛されたのですけど、DataflowというETLツールのようなものがあり、それを使うと入力データを分析しやすい形に変えることができる。そして、Data Portalというのを使ってデータの可視化ができそうだ、ということがわかったので、これらの組み合わせで現状のデータウェアハウスの代わりとして利用できそうだ、ということが分かりました。そこが特に今回の大きな収穫でした。
 Googleさん、そして、今回のスポンサー企業だった、トレノケートさん、NECマネジメントパートナーさん、トップゲートさん、クラウドエースさん、ありがとう!

SQLの学び方

 先日、職場の方から「石川さんは、どうやってSQL勉強したんですか?」と質問をいただきました。言われてあとから気づいたのですが、ちゃんとしたSQLの教育を受けたことって、ありませんでした。では、どうやって学んだのでしょうか。
 結論から言うと、Oracleのマニュアルです。Oracleのマニュアルは、膨大な量があって、どれを読んだらいいのか、本当に迷います。その中で、SQLを勉強しようとする方のためには、「SQLリファレンスマニュアル」これだけですね。今でもOracleさんのホームページで提供されていますので、本気で学びたい方は検索してみてください。最初は、この中の「SELECT」についての記述を読んでは試し、読んでは試し、してみてください。そのうちに何となくわかってくると思います。「SELECT」に慣れて余裕が出てきたころに、マニュアルの他の記載を見るのがよいでしょう。そこには、リテラルや値の種類、関数の種類などが書かれてあって、読めばより理解が深まって、SQLをもっと便利に使えるようになると思います。
 もし、もっと深く理解していきたいと思った人は、SQLが作られる元となった知識として「関係モデル」の「関係代数」を学ぶのがよいと思います。関係とはおおよそ表のようなものを表す概念のことで、関係代数は、それらの演算について述べられたものです。詳しくは、C.J.Dateさんによる「データベースシステム概論」を参照してください。関係代数の和、交わり、差、直積などについて詳しく記載されていて、関係というか、表というか、セットというか、そういう概念の演算について深く理解できるようになります。

 ぼくがSQLを初めて使ったのは、おそらくOracle6の時代で、とても衝撃的だったのを覚えています。当時はデータベースというものの存在も知らず、データはすべてファイルに書かれているのが当たり前で、システムごとプログラムごとにファイル定義を作り、そのルールに従ってファイルオープンし、読み書きして利用するのが当たり前だと思っていたからです。当時はSQLでデータを取得する仕組みが全く理解できず、とにかくこうやればデータが取れる、という利用方法でした。データベースが現在のように利用されるようになるとは夢にも思っていませんでした。
 Oracle7になって、本格的にOracleを使うようになったのですが、当時はまだインターネットもそんなに普及しておらず、すべて紙のマニュアルだよりでしたね。わからないことはすべて、マニュアルを読んで試してみる、ということしかできなかった、というわけです。
 当時のOracleを使っている人たちの間では、今よりももっとたくさん色々なパフォーマンス上の問題があって、ぼくにはそういう問題を解決する機会も多かったように思います(今でもそういう問題って起きているのかな?)。そうそう、SQLをすんなりと書けるようになったら、次に、パフォーマンスの問題が待っていました。そんな書き方したら、Oracleちゃんは、うまく動いてくれないよ~、というヤツですね。チューニングに関するSQLについては、また、別の機会に書きたいと思います。

Google Cloud Platform 入門編トレーニング

SHOEISHA iD News号外で案内が送られてきたので、 2019年2月20日(水)に、Google Cloud Platform入門編トレーニングに参加することにしました。

会社を始めることが決まったときに、以前からやろうと思っていたけどできていなかった情報発信をしていこうと思い、そのためのインフラとして、WordPressを使うことを決めました。
さらに、会社としてできそうなことを何か始めようと思って、Google Cloud Platform(GCP)を利用していくことに決めました(ずいぶんと今更だよねぇ )。
当然、このサイトもGCPであっという間(?)に作りました。

これまでデータベースを中心にした業務アプリケーション開発にかかわることが多かったので、業務分析やデータモデリング、アプリケーション開発、パフォーマンスチューニングなどは、申し分なく得意分野だと言い切れるまでになりました。
しかし、業務において発生する問題について、その解決策として何が提供できるの、となったときにすぐに提供できるものがない、ということがこれまではすごくジレンマでした。
インフラまわりが弱くて、業務サービスを単体で提供することができなかったのです。

そんなこともあり、これからはGCPがその助けになると信じて取り組むことにしたのでした。作りたいものさえ分かっていれば、かなりの短期間でサービス提供できるようになるという可能性はとても魅力的です。

そして、ちょうど勉強を始めたタイミングで入門編の案内がきたので、「これだ!」と即申し込みました。

現状のデータをいろいろと分析するために、データウエアハウスの代わりとしてGCPを利用することができそうだ、というところまではたどり着いていたのですけど、実際にどんな手段をつかって実現していくのか、そのストーリーがなかなか見えてこないので、今回のセミナーで確認してみたいと思っています。

Google Cloud Platformエンタープライズ設計ガイド