月別アーカイブ: 2014年7月

V$SQL_PLANでCRUD表モドキを作ってみる②

UPDATEとDELETE

UPDATE文とDELETE文の実行計画については以下の例のとおりです。

-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |        |     1 |     8 |     1   (0)| 00:00:01 |
|   1 |  UPDATE            | EMP    |       |       |            |          |
|*  2 |   INDEX UNIQUE SCAN| PK_EMP |     1 |     8 |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |        |     1 |    26 |     1   (0)| 00:00:01 |
|   1 |  DELETE            | EMP    |       |       |            |          |
|*  2 |   INDEX UNIQUE SCAN| PK_EMP |     1 |    26 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Operation=UPDATE or DELETE となる Name列が示すものが、対象のテーブル名です。

SELECTと同様にV$SQL_PLANから情報を取得するクエリーは以下のとおりです。

select distinct
 SQL_ID
,OBJECT_NAME
,decode(operation,'UPDATE',6
                 ,'DELETE',7) CRUD_TYPE_ID
from V$SQL_PLAN
where OPERATION in ('UPDATE','DELETE')
and   OBJECT_OWNER = 'xxxx'
order by
 OBJECT_NAME
,CRUD_TYPE_ID
,SQL_ID
;

SELECTも一緒に取得するように書きなおしたSQL文の実行例は以下のとおりです。

SQL> select distinct
   2   SQL_ID
   3  ,OBJECT_NAME
   4  ,decode(operation,'TABLE ACCESS',3
   5                   ,'UPDATE',6
   6                   ,'DELETE',7) CRUD_TYPE_ID
   7  ,OPTIONS
   8  from
   9   V$SQL_PLAN
  10  where OPERATION in ('TABLE ACCESS','UPDATE','DELETE')
  11  and   OBJECT_OWNER = 'SCOTT'
  12  order by
  13   OBJECT_NAME
  14  ,CRUD_TYPE_ID
  15  ,SQL_ID;

 SQL_ID        OBJECT_NAME  CRUD_TYPE_ID OPTIONS
 ------------- ------------ ------------ --------
 a2dk8bdn0ujx7 EMP                     3 FULL
 2r07krus3ums3 EMP                     6
 7hr1wxxb8hkqc EMP                     7 

INSERTは難しい

INSERT文も同じような要領で情報を取れると思ったのですが、なかなかやっかいです。

以下はINSERT文の実行計画です。

---------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |     1 |    38 |     1   (0)| 00:00:01 |
|   1 |  LOAD TABLE CONVENTIONAL | EMP  |       |       |            |          |
---------------------------------------------------------------------------------

Operation=”LOAD TABLE CONVENTIONAL” となるName列を持ってくればよさそうな気がします。
しかし、いろいろなINSERT文を見ていて次のような実行計画に出くわしました。

--------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name                      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |                           |       |       |       | 47068 (100)|          |
|   1 |  LOAD TABLE CONVENTIONAL |                           |       |       |       |            |          |
|*  2 |   HASH JOIN              |                           | 22794 |    44M|    44M| 47068   (1)| 00:09:25 |
|*  3 |    TABLE ACCESS FULL     | Txxxxxxxxxxxxxxxxxxxxxxxx | 22794 |    44M|       |  1922   (1)| 00:00:24 |
|   4 |    TABLE ACCESS FULL     | Mxxxxxxxxxxx              |  4861K|   148M|       | 32769   (1)| 00:06:34 |
--------------------------------------------------------------------------------------------------------------

これは実際の実行計画のテーブル名をマスクしたものですが、INSERT対象のテーブル名はどこにも出てきていないことがおわかりでしょうか?

つまり、実行計画からINSERT先のテーブルを特定することはできないのです。

正規表現を使う

そこでV$SQLAREAを使って情報を取得することにしました。SQL_TEXT列にSQLテキストの先頭1,000バイトが入っているので、そこから文字列操作でテーブル名を取り出す作戦です。

SUBSTR関数等いろいろ試してみたのですが、最終的に10g以降で使えるようになった正規表現機能で抜き出すことにしました。
以下が情報取得用のクエリーです。

select
 SQL_ID
,ltrim(
  replace(
   upper(
    substr(
     regexp_substr(SQL_TEXT,'INTO[[:space:]]+[^[:space:]\(]+',1,1,'i')
        ,6)
         )
    ,'"')
      ) OBJECT_NAME
,COMMAND_TYPE CRUD_TYPE_ID
,null OPTIONS
from V$SQLAREA
where COMMAND_TYPE = 2
order by
 SQL_ID
,OBJECT_NAME
;

解説:

  • 7行目がもっとも肝になる部分です。「INTO [テーブル名]」となる文字列をregexp_substr関数で抜き出します。
  • substr関数で抜き出した文字列の6バイト目以降をテーブル名として取り出します。(6行目)
  • upper関数でテーブル名を大文字に統一します。(5行目)
  • たまにテーブル名がダブルクォートで囲まれている場合があるのでreplace関数で取り除きます。これが最終的なOBJECT_NAMEとなります(4行目)

以下は実行例です。
V$SQLAREAにはテーブルの所有者を特定できる情報がないので、上記クエリーの結果とDBA_TABLESをジョインしてOWNER列で絞り込む条件を加えています。

SQL> select distinct
  2   SQL_ID
  3  ,OBJECT_NAME
  4  ,CRUD_TYPE_ID
  5  ,OPTIONS
  6  from
  7  (
  8  select
  9   SQL_ID
 10  ,ltrim(
 11    replace(
 12     upper(
 13      substr(
 14       regexp_substr(SQL_TEXT,'INTO[[:space:]]+[^[:space:]\(]+',1,1,'i')
 15          ,6)
 16           )
 17      ,'"')
 18        ) OBJECT_NAME
 19  ,COMMAND_TYPE CRUD_TYPE_ID
 20  ,null OPTIONS
 21  from
 22   V$SQLAREA
 23  where COMMAND_TYPE = 2
 24  ) I
 25  ,DBA_TABLES D
 26  where I.OBJECT_NAME = D.TABLE_NAME
 27  and   D.OWNER       = 'SCOTT'
 28  order by
 29   SQL_ID
 30  ,OBJECT_NAME
 31  ;

SQL_ID        OBJECT_NAME                    CRUD_TYPE_ID OPTIONS
------------- ------------------------------ ------------ --------
7071f28x901k7 EMP                                       2
gjvsdk24ufadk EMP                                       2

UNIONでまとめてみる

最後に、INSERT/SELECT/UPDATE/DELETE の結果をまとめてみましょう。24行目の「union all」に注目して下さい。

補足すると、CRUD_TYPE_IDをdecode関数で「C」「R」「U」「D」に変換しています。(4行目)
なぜ、このような面倒くさいことをやっているのかというと、最初から「C」「R」「U」「D」という文字列にすると、この順番にソートしてくれないのでCRUD_TYPE_IDという数値を使っているのです。(細かいですが私のこだわりです。)

それから、SQL*Plusコマンドを使って、CRUD別のSQL数も集計してみました。(1-2行目)

SQL> break on crud skip page
SQL> compute count of sql_id on crud
SQL> select
  2   decode(CRUD_TYPE_ID,2,'C'
  3                      ,3,'R'
  4                      ,6,'U'
  5                      ,7,'D') CRUD
  6  ,OBJECT_NAME
  7  ,SQL_ID
  8  ,OPTIONS
  9  from
 10  (
 11  select distinct
 12   SQL_ID
 13  ,OBJECT_NAME
 14  ,decode(operation,'TABLE ACCESS',3
 15                   ,'UPDATE',6
 16                   ,'DELETE',7) CRUD_TYPE_ID
 17  ,OPTIONS
 18  from
 19   V$SQL_PLAN
 20  where OPERATION in ('TABLE ACCESS','UPDATE','DELETE')
 21  and   OBJECT_OWNER = 'SCOTT'
 22  union all
 23  select
 24   SQL_ID
 25  ,ltrim(
 26    replace(
 27     upper(
 28      substr(
 29       regexp_substr(SQL_TEXT,'INTO[[:space:]]+[^[:space:]\(]+',1,1,'i')
 30          ,6)
 31           )
 32      ,'"')
 33        ) OBJECT_NAME
 34  ,COMMAND_TYPE CRUD_TYPE_ID
 35  ,null OPTIONS
 36  from
 37   V$SQLAREA
 38  where COMMAND_TYPE = 2
 39  ) I
 40  ,DBA_TABLES D
 41  where I.OBJECT_NAME = D.TABLE_NAME
 42  and   D.OWNER       = 'SCOTT'
 43  order by
 44   CRUD_TYPE_ID
 45  ,OBJECT_NAME
 46  ,SQL_ID
 47  ;

C OBJECT_NAME          SQL_ID        OPTIONS
- -------------------- ------------- ---------------
C EMP                  7071f28x901k7
  EMP                  gjvsdk24ufadk
*                      -------------
c                                  2

C OBJECT_NAME          SQL_ID        OPTIONS
- -------------------- ------------- ---------------
R EMP                  7071f28x901k7 BY INDEX ROWID
  EMP                  a2dk8bdn0ujx7 FULL
  EMP                  b84685tx0a4u0 BY INDEX ROWID
  EMP                  f93ucvwf6d1vh FULL
*                      -------------
c                                  4

C OBJECT_NAME          SQL_ID        OPTIONS
- -------------------- ------------- ---------------
U EMP                  2r07krus3ums3
*                      -------------
c                                  1

C OBJECT_NAME          SQL_ID        OPTIONS
- -------------------- ------------- ---------------
D EMP                  7hr1wxxb8hkqc
*                      -------------
c                                  1

どのテーブル(OBJECT_NAME)がどのSQL(SQL_ID)によってINSERT/SELECT/UPDATE/DELETEの対象になっているかが、この一覧からわかります。
(OPTIONSは単なるおまけですのでなくても構いません)

この例ではSCOTT.EMP表しか出てきていませんが、実際は非常に沢山の結果が返ってくるはずです。

次回は、MS Excelのピボットテーブルを使って CRUD表らしく加工してみます。

(続く)

V$SQL_PLANでCRUD表モドキを作ってみる①

パフォーマンス問題の犯人探し?

情報システムに問題(特にパフォーマンス問題)が発生した場合、運用を担っているインフラ・チームが真っ先にやり玉に挙げられることが多いようです。

そんな時のアプリ・チームの主張は

  • 自分たちはアプリケーションに一切手を加えていないので悪くない。悪いはずがない。
  • インフラ・チームが何かやらかしたのではないか?(過去に痛い経験があればなおさら)
  • 隠しパラメータみたいな秘密のスイッチがあるらしいから、それをうまく使って切り抜けてくれ!
  • インフラには高い金をつぎ込んでいるのだから何とかしろ!

というようなものが多いのではないでしょうか?

しかも、大抵の場合アプリ・チームの方が人数が多いので、多勢に無勢いつの間にか問題はインフラ・チームのせいになってしまっている、というようなことはよくあります。

最近は、新卒でインフラ・チームに配属されるというケースも多くなっていますが、ベテラン開発者から運用者に転向しているような技術者は総じてスキルのレベルが高いので(好意的に解釈して)重要な問題の解決を期待されているということの裏返しなのかもしれません。

ただし、インフラ・チームの名誉のために補足しますが、私はパフォーマンス問題の8〜9割近くはSQLつまりアプリケーションの問題のような印象を持っています。(なぜアプリケーションに手を加えていないのに問題が発生するのかは改めて触れたいと思います。)

DBAは問題解決の要

DBAは多くの場合インフラ・チームの一員として数えられていますが、データベースはミドルウェアと言いながらOSから見れば一種のアプリケーションであるので、DBAがアプリ・チームとの仲介役としてうまく機能できれば問題解決に対して非常に強い組織になります。

専任のDBAを置いている組織は少ないかもしれません。サーバ管理者が兼任していたりしてDBAの職務が曖昧になっている場合、インフラ・チームとアプリ・チームの溝が深くなってしまうことはよくあります。

DBA自らがアプリケーションを理解する

問題が発生してからアクションを起こすのでは遅すぎます。DBAは常日頃からアプリケーションに対して関心を持つ必要があります。理想的にはアプリ・チームの責任としてDBAが理解できるドキュメントを整備するのがベストですが、現実的にはなかなか難しいことが多いかと思います。

従って、DBA側から能動的に情報を収集することが必要です。DBAから見た最も身近なアプリケーションはSQL文です。Oracleでは実行されているSQL文に関するさまざまな情報をV$SQL*ビュー(Oracle11gR2であれば30種)から得ることができます。

V$SQL_PLAN

それではV$SQL_PLANを使用してSQL文とテーブルの相関表を作ってみましょう。あるSQL文がどのテーブルを使用しているか、あるいはあるテーブルはどのようなSQL文によって使用されているかを一覧にしたものです。これはDB設計におけるCRUD表に近いものですが、実際に動いているSQL文の情報を使って作るというのがポイントです。

 実行計画のおさらい(SELECT)

以下の簡単な実行計画の例で考えてみます。

-----------------------------------------------------------------------------------
| Id  | Operation                     |  Name        | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |              |     3 |   189 |    10  (10)|
|   1 |  NESTED LOOPS                 |              |     3 |   189 |    10  (10)|
|   2 |   NESTED LOOPS                |              |     3 |   141 |     7  (15)|
|*  3 |    TABLE ACCESS FULL          | EMPLOYEES    |     3 |    60 |     4  (25)|
|   4 |    TABLE ACCESS BY INDEX ROWID| JOBS         |    19 |   513 |     2  (50)|
|*  5 |     INDEX UNIQUE SCAN         | JOB_ID_PK    |     1 |       |            |
|   6 |   TABLE ACCESS BY INDEX ROWID | DEPARTMENTS  |    27 |   432 |     2  (50)|
|*  7 |    INDEX UNIQUE SCAN          | DEPT_ID_PK   |     1 |       |            |
-----------------------------------------------------------------------------------

まず中程の「Name」列は、その実行計画でアクセス(SELECT)されるテーブルあるいはインデックスとなります。テーブルなのかインデックスなのか名前から判断することもできますが確実なのは左隣りの「Operation」列が

  • TABLE ACCESS  で始まっているものが「テーブル」
  • INDEX で始まっているものが「インデックス」

です。

V$SQL_PLANからSELECT対象のテーブル一覧を取得する

V$SQL_PLANから情報を取得するクエリーを考えてみます。

select distinct
 SQL_ID
,OBJECT_NAME
,3 CRUD_TYPE_ID
,OPTIONS
from
 V$SQL_PLAN
where OPERATION like 'TABLE%'
and   OBJECT_OWNER = 'xxxx'
order by
 OBJECT_NAME
,CRUD_TYPE_ID
,SQL_ID;

8行目のWHERE条件でテーブルアクセスのオペレーションのみを取り出しています。
9行目ではテーブルの所有者で絞り込みをしています。

4行目で何をしているのかというと、V$SQL_PLANにはない V$SQL.COMMAND_TYPE に相当する情報をここで付加しています。
SELECTであれば「3」になります。この理由は追って説明します。

以下は実行例です。

SQL> select distinct
  2   SQL_ID
  3  ,OBJECT_NAME
  4  ,3 CRUD_TYPE_ID
  5  ,OPTIONS
  6  from
  7   V$SQL_PLAN
  8  where OPERATION like 'TABLE%'
  9  and   OBJECT_OWNER = 'SCOTT'
 10  order by
 11   OBJECT_NAME
 12  ,CRUD_TYPE_ID
 13  ,SQL_ID;

SQL_ID        OBJECT_NAME  CRUD_TYPE_ID OPTIONS
------------- ------------ ------------ --------
0cc0hqvr7kpgx BONUS                   3 FULL
30hdyzpfrzgbf BONUS                   3 FULL
3154rqzb8xudy DEPT                    3 FULL
678kpdu03jc8x DEPT                    3 FULL
1srhq04p4x0zz EMP                     3 FULL
a2dk8bdn0ujx7 EMP                     3 FULL
25tuw6725a9h7 SALGRADE                3 FULL
30p00zk91247c SALGRADE                3 FULL

8行が選択されました。

(続く)

自動ライフログを使ってみよう(僕の来た道編)

ライフログは記録するのが面倒

ライフログのススメ(iライフログ編)を紹介しましたが、何かをする度にアプリを起動して記録を開始(終了)するというのは意外と面倒なものです。iライフログでは自動ログという便利な機能があって、地点登録した場所から遠ざかったり再び近づいた場合にログ取得を自動的に開始/終了することができます。

IMG_5648

ログ取得を完全自動化するアプリ

今回紹介する「僕の来た道」というアプリは最初ちょっと名前に違和感がありましたが、使ってみると痒い所に手が届く実になかなかいいアプリです。
IMG_5660

一番下の「今日」アイコンをタップして表示された画面の右上に「Start」ボタンがあるので、タップして自動ログ取得をオンにします。これだけで勝手にログを取得し始めます。

1日の行動履歴を確認する

上の写真は履歴一覧画面ですが、日によって移動した距離が違うのがわかります。7/15分をタップしてみるとその日の詳細が表示されます。

IMG_5661

この中で青い丸で表示されている場所の情報がありますが、Twitterに投稿した情報を取り込んだものです。
私はForsquareでチェックインした際に自動的にTwitterに投稿するように設定しているので、僕の来た道でその情報を取り込んでいるわけです。
その他の場所情報はGPS情報から得られたものです。指定した時間以上ある地区に留まっていればオレンジ色の場所情報が表示されます。

タイムラインがすべて表示された状態で右上の「Evernote」ボタンをタップすると、1日分のログがEvernoteの指定したノートブック(私の場合 [aNote] 日記 というノートブック)に送信されます。
ちなみにノート名称のフォーマットは「yyyy/mm/ddの僕の来た道」となります。(これは変更できないようです。)

どの県を訪問したかもわかる

IMG_5662

「僕のまとめ」画面です。ここには記録を取り始めてから訪れた都道府県とその回数を集計してくれています。
例えば三重県には3回訪問したことがわかります。

IMG_5663

これは訪問した日を後から振り返る際地味に役に立つ機能です。

書籍紹介:UMLモデリング入門

UMLモデリング入門UMLモデリングを本質から学ぼうと思って買ったのがこの本です。 UMLモデリング入門(児玉公信著、日経BP)

入門と言いながら全編大学の講義を聞いているような記述が並びますが、そもそも「情報システムとは?」「概念とは?」などの本質に直球勝負で切り込んでいくスタイルはじっくり読みこなしていくと必ず腑に落ちます。

下図は「1-2 情報システムライフサイクル」において、著者が考える情報システム構築プロセスを表したものですが、本書の目的はこの中の「要求設計」で業務のあり方を記述する「概念モデル」であると明確に言い切っています。

つまり施主(情報システムによって利益を受ける人)の漠然とした期待をまとめた原要求に対して、ITによって機能だけでなくビジネス・組織・仕事についても設計し「要求(つまり概念モデル)」を作り上げるという設計者およびアーキテクトの役割を解説する本だという認識を持って読めば自ずと理解が深まるのではないかと思います。(この図をみればアーキテクトとはどのような人なのかがわかるでしょう。)

また、筆者はこの図を使って、アジャイルな開発プロセスとは「設計者=施工者」であり要求設計と同時にソフトウェアの仕様ができることであり、結果として現場の生産性を上げるものであると説明しています。つまり設計することなしの「現場合わせ」の繰り返しはアジャイルではないという言葉は非常に説得力があります。

情報システムライフサイクル.001

単なるUMLモデリングの解説本ではなく、モデリングの本質に踏み込んだ良書です。

astah professionalのライセンスを購入しました

ITアーキテクト養成講座に参加してからUMLを本格的に習得する必要を感じたので、何かいいツールがないかを探したのが6月の初旬。

株式会社チェンジビジョンから出ている「astah* professional」が面白そうなので早速試用してみました。(Mac OS版があるのも気に入った!)

試用期間が20日間であることをすっかり忘れてしまい、昨日延長試用ライセンスを取得しましたが、今後仕事で活用することを考えて思い切って今日1ユーザライセンスを購入しました。

astah* professional

セミナーで出てきたユースケース図も非常に簡単に描くことができます。なかなか筋のいいツールです。

今後このツールを使っていく中で見つけたTips等紹介していきたいと思います。

書籍紹介:DAMA-DMBOK Guide

品川区立大崎図書館で借りてきました

一昨日の記事 DOAって和製英語? でも触れましたが、データマネジメント知識体系ガイド 第一版 が、よく利用する品川区立大崎図書館にあったので早速借りてきました。

データマネジメント知識体系ガイド 第一版

DAMA-DMBOKとは、The Data Management Association Guide to The Data Management Body of Knowledge です。


章立て

章立ては以下のようになっています。(5章のみ詳細に紹介します。)

  1. イントロダクション
  2. データ管理概要
  3. データガバナンス
  4. データアーキテクチャ管理
  5. データ開発
    1. はじめに
    2. 概念と活動
      1. システム開発ライフサイクル(SDLC)
      2. データモデリングの表現方法
      3. データモデリング、分析、ソリューション設計
      4. 詳細データ設計
      5. データモデルと設計の品質管理
      6. データ実装
    3. まとめ
    4. 推奨文献
  6. データオペレーション管理
  7. データセキュリティ管理
  8. リファレンスデータとマスタデータ管理
  9. データウェアハウジング(DW)とビジネスインテリジェンス管理(BIM)
  10. ドキュメントとコンテンツ管理
  11. メタデータ管理
  12. データクオリティ管理(DQM )
  13. 専門家の養成
  14. おわりに

構成と目的

章立てを見ればわかるように、第2章でデータ管理の概要に触れ、第3〜12章でデータ管理における10の機能をそれぞれ説明しています。

このドキュメントの目的については「1.11 DAMA-DMBOK Guideが目指すゴール」に記述があるので紹介します。

  1. 一般的に適用可能なデータ管理機能の見識についてコンセンサスを構築すること。
  2. 一般的に使われているデータ管理機能、成果物、役割、その他用語について、標準となる定義を提示すること。
  3. データ管理の基本原則を明確にすること。
  4. 広く受け入れられている優良事例、幅広く採用されている手法や技法、重要な代替的アプローチを、特定のベンダーの技術や製品に言及することなく概観すること。
  5. 組織や文化にまつわる一般的な問題について簡単に説明すること。
  6. データ管理の対象範囲と境界を明確にすること。
  7. 理解をさらに深めるための追加資料を読者に紹介すること。

専門家の養成 〜データ管理を天職とする〜

イントロダクションにも記述がありますが、DMBOKはPMBOKを参考にまとめられているそうです。13章には1章を丸々あてて「専門家の養成」についてまとめてあります。

そこには、

  • データ管理はIT分野における正当な専門的職業である。
  • 専門的職業は、特殊な知識と技能を要する職業的使命(天職)、またはその天職に携わる人のあつまりとして定義される。
  • データ管理専門家は、資源としてのデータの重要性に関して、何らかの使命感や責任を感じている。
  • この使命感や責任が、データ管理を「単なる仕事」ではなく「天職」とするのである。
  • 専門的職業の特徴として知識体系という共通認識が公表されている

とあります。

特に欧米でなぜBOKが重要視されるのか、それが専門家としての証であるからかもしれません。

この記事を書いている時、テレビのニュースではベネッセコーポレーションで起きた個人情報漏えい事件を報じています。情報を持ちだしたエンジニアにとって仕事は「単なる仕事」に過ぎなかったのでしょう。

どの国においてもモラル・ハザードは起き得ますし、それを防ぐ仕組みを作ることは必要です。ただし、知識体系をまとめることで専門家へ使命感や責任を求める、この発想は素晴らしい!

我々日本人としてはBOKの翻訳をただ受け入れるのではなく(多くの場合本棚に眠っていることになりかねない)、エンジニアが自らの行動規範を作るための拠り所として活用すべきであると考えます。

P.S. 先日書いたDOAという言葉がDMBOKにあるかざっと探してみましたが見当たりませんでした。

 

ライフログのススメ(iライフログ編)

スマートフォンで何をするか?

スマートフォンのような、どこにでも持ち歩ける”手のひらコンピュータ”を持つと何が嬉しいのでしょうか? どこでもメールが受け取れる、出せる。写真が取れる。スケジュールがわかる。… これは10年以上前から携帯電話でもできていたことです。

自分の行動ログ(ライフログ)を記録してみる。

iPhone Top画面

ところで上の写真は、現在の私のiPhoneのトップ画面の下の部分を撮ったものですが、ドックと呼ばれる一番下の4つのアイコンがあるグレーの部分は、どの画面であっても操作ができるのでもっとも使う頻度が高いアプリを配置するのが使いこなしのコツです。

この中でも一番右に配置している「iライフログ」というアプリは私の中でかなり重要な位置づけです。 これは、1日の生活の中で何にどれくらいの時間をかけているかという記録(ライフログ)を簡単に取れるアプリケーションで、例えば私の7/3の行動は下の写真のようになります。(食事の時間が異様に短いのが気になりますが。。。)

1日の行動を振り返る

IMG_5614

この日はお客様先に直行して、作業のため昼食を挟んで15時前まで訪問し、16時からのセミナーに参加しました。約2時間のセミナー終了後に直帰し、この日は朝家を出てから帰るまで約11時間外出していたことがわかります。

詳細を確認する

各行動をタップすれば詳細が表示されます。この日の昼食は途中で買っていったコンビニ弁当を16分間で食べています。

私は出来る限り食事の写真を毎回記録するようにしていますので(下のカメラアイコンをタップすれば、撮影画面になります。)あとからこの日は何を食べたのかということを思い出すことができます。

IMG_5616

行動を記録するには?

iライフログで行動を記録するのには2つの方法があります。

  1. 手動ログ
  2. 場所(ジオフェンス)による自動ログ

IMG_5607

手動ログ

上の写真はログを取得しているところですが、例えばオフィスに着いたらログ開始画面を開き「オフィス」アイコンをタップすると手動ログが開始されます。仮にその前に「交通機関移動」ログが取得中であれば、「オフィス」ログが開始されたと同時に「交通機関移動」ログが終了します。(1ログモード)

場所(ジオフェンス)による自動ログ

さらに、私は自宅の位置を登録していますので、GPS電波を受けて自宅の位置を中心とした半径約100メートルの円(ジオフェンス)を内側から出た時に「自宅以外(外出)」ログが自動的に開始され、帰宅時ジオフェンスに入った時にログが自動的に終了するような設定をしています。(理想的にはジオフェンスを90°の角度で横切った方がよいのですが、浅い角度だと自動ログが開始された直後に終了してしまうこともあります。また、GPS電波には誤差があるのでジオフェンスの大きさは日によって若干異なることがあります。)

私の設定画面

以下は設定画面です。1ログモードであっても「自動ログを除外する」がオンになっていれば、手動/自動ログを同時に取得することができます。

IMG_5608 IMG_5609

他サービスとの連携

設定画面を見ればわかるのですが、このアプリの一番うれしいところは1日分のログをEvernoteに自動送信してくれることです。しかも保存先ノートブックを指定することができます。(私は [aNote] 日記 というノートブックを指定しています。)

他にもGoogle Calendarにもログを送信してくれますので、非常に気に入ってます。

スクリーンショット 2014-07-15 22.40.55

ライフログを習慣にしよう!

このブログを書くために過去のライフログを見返してみましたが、2012年4月10日から1日も欠かさずに記録しています。

まさに習慣として私の生活の一部になっています。

iPhoneを買ってみたけど使いこなせていない、あるいはEvernoteを使っているけど何を記録してよいのかわからないという人には絶対おすすめのアプリです!

iライフログ   無料 カテゴリ: 仕事効率化, ライフスタイル

DOAって和製英語?

先日のITアーキテクト養成講座で講師のNRI石田さんと話していて初めて知ったのですが、「DOA:Data Oriented Approach(データ指向(あるいは中心)アプローチ)」という言葉は欧米のアーキテクトには通じないそうです。

データベース設計を少しでもかじった経験のある人ならば、このDOAという言葉はどこかで聞いたことがあるのではないでしょうか?
手元にある本を見ても プロとしてのデータモデリング入門(P.2)、楽々ERDレッスン(P.86)、業務システムのための上流工程入門(P.61)にはいずれも数ページをさいてDOAについて解説してあります。

確かに「xOA」という3文字略語はIT業界ではしばしば目にしますが、SOAにせよOOAにせよ「A」は「Architecture」あるいは「Analysis」であって、「Approach」というのはあまり聞きません。むしろ和製英語の香りがプンプンします。

ここでこんな話を持ちだしたのは、和製英語だからダサいとか、米国発の情報がいつも正しいということを言いたいのではなく、むしろ今までいろいろな開発プロジェクトを見てきて、データを中心に考えているそれらは非常にうまく行っているケースが多いという事実を再認識したいのです。

欧米ではBOK:Body Of Knowledgeと呼ばれる特定領域の知識体系を定義する概念なりドキュメントが充実しています。IT業界に関係するBOKとしては以下のようなものがあります。

  • BABOK(ビジネス・アナリスト向け知識体系)
  • PMBOK(プロジェクト・マネジメントの知識体系)
  • SWEBOK(ソフトウェア・エンジニアリングの知識体系)

各領域の最適化がBOKによって担保されたとしても、最終的にシステムとしての全体整合性の責任は誰が持つのでしょうか?それこそがITアーキテクトなのではないかというのがITアーキテクト養成講座の目指すところであるとの説明を聞き大いに納得した次第です。となるとITアーキテクトという考え方自体が「和をもって尊しとなす」日本発の概念なのではないかとも思いました。

P.S. 実はデータ管理にも「DMBOK:Data Management Body of Knowledge」なるものがあります。こんな本も出ているようです。データマネジメント知識体系ガイド 第一版 (データ総研監訳)手元にないので今度探してみたいと思います。

Evernote Days Tokyo 2014

7月11、12日 東京お台場にある日本科学未来館で開催された、Evernote Days Tokyo 2014 に参加してきました。

evernotedays2014

私が参加したセッションは


7/11(金)

  1. 基調講演 投資家が語る記憶の未来 “Memory is Money?”
        レオス・キャピタルワークス株式会社 取締役・最高投資責任者(CIO) 藤野 英人 氏
  2. シリコンバレーで大人気!!「お~いお茶」とIT企業が作る未来
        株式会社伊藤園 角野 賢一 氏
  3. 事例で学ぶ!Evernote と ScanSnap でビジネスを効率化するドキュメント管理とは!?
        株式会社PFU 山口 篤 氏
        堀江織物株式会社 堀江 賢司 氏
        株式会社NTTドコモ 源河 浩一 氏
  4. 紙と Evernote について考える
        コクヨ株式会社 山崎 篤 氏
        Evernote アンバサダー 五藤 隆介 氏
        rakko entertainment 若林 大悟 氏
        株式会社NTTドコモ 源河 浩一 氏
  5. 信頼できるクラウドサービスの条件
        Evernote 佐藤 真治 氏
        アイレット株式会社 後藤 和貴 氏
        Evernote 井上 健 氏
  6. 編集長会議 ー 記録と記憶。メディアが僕たちの暮らしに残せるもの by ライフハッカー
        ライフハッカー[日本版]編集長 米田 智彦 氏
        ハフィントンポスト日本版 編集長 松浦 茂樹 氏
        WIRED 編集長 若林 恵 氏
        Evernote 上野 美香 氏

7/12(土)

  1. 基調講演 未来記憶
        MITメディアラボ副所長 石井 裕 氏
  2. 特別講演「脳とイノベーション」
        脳科学者 茂木 健一郎 氏
  3. 連携アプリをもっと知ろう
        FastEver 開発者 若林 大悟 氏
        Punksteady 主宰 五十畑 雅史 氏
        Evernote 佐藤 真治 氏
  4. 東大寺1200年の記憶
        東大寺塔頭清凉院 住職 森本 公穣 氏

基調講演、特別講演は「記憶」「記録」「イノベーション」のようなキーワードで、特にEvernoteに関連した内容ではありませんでしたかが、スピーカーは皆Evernoteの(ヘビー)ユーザーということで、いずれも非常に面白い話でした。

この他にも、営業、学生、共働きや子育て中の人たち向けセッションとかもあって、普通のIT系のセミナーではお目にかかることがないような主婦の人たちが沢山参加しているも非常に興味深かったです。

Evernoteユーザは5月に累計で1億人を突破したということもあり、本当に沢山のそしていろいろな人々に使われているツールだということを実感できる2日間でした。

いろいろヒントをもらったので、実践していきたいと思います。

ITアーキテクト養成講座

ITアーキテクト養成講座
6月9,16,23,30日の計4日間、日経SYSTEMS主催の「ITアーキテクト養成講座」(場所:東京神田)に参加してきました。

本年(2014年)で5回目の人気講座だそうで、1月22日には システム設計の先導者 ITアーキテクトの教科書 というタイトルで書籍化もされています。講座の中で使用される図表等はほぼそのまま書籍にも使用されていますので、講座内容を事前に知るには書籍を一読すればよいと思います。(ちなみに講習参加者には2日目に書籍がプレゼントされました。)

講師の石田裕三氏は野村総合研究所でITアーキテクトとして活躍されていて、米カーネギーメロン大学で経営学、ソフトウェア工学を学ばれた経験もあるので、特に海外におけるIT事情の話は参考になりました。

参加者は約5名の6つのグループに分けられ、毎回シャッフルされます。(人数の関係で2回同じ人と同じグループになることもあります。)グループ単位でホワイトボードの前で課題を考え、その結果を全体で発表しあうスタイルで進めていきます。議論が進まなかったり発散しそうな状況になった場合は、講師やNRIのアシスタントの方々が適宜各グループを周り適切なアドバイスを与えてくれることもあります。

SIerのアプリケーション・エンジニア、インフラの運用担当者、ユーザ企業で業務要件を検討する人等、参加者のバックグラウンドは千差万別で、東京近辺だけでなく大阪や札幌等遠方からも多数参加しているのには驚きました。(もっともほとんどの人は講習費、交通費は会社持ちなので、私のように自腹で参加している人は接した限りでは見当たりませんでした。その点に関しては羨ましい限りです。)

グループ討議のよい点は、バックグラウンドが異なる人が集まると思いもかけないアイデアに出会えたり、違った視点から物事を観ることができることです。「自分はこのことについてあまり詳しくないんだけど、こういうことなんでしょうかね?」という意見に思わずなるほどと膝を打つようなことが多々有りました。

講座の内容は

  1. 要件定義
  2. 基本設計
  3. 詳細設計
  4. 実装
  5. テスト
  6. 保守

という一連のいわゆる開発(運用)のV字モデルにおいて、ITアーキテクトと呼ばれる人が何をすべきかということを体系的に学ぶことができるものです。

具体的にはPostgreSQLをベースにした高可用性システムの設計という感じで、特にインフラの経験が少ない人にはやや高度な内容に映ったようです。私もアプリケーション開発しか経験していなかった頃にこの講座を受けても消化不良になっていたかもしれません。

ただし、自分ができる領域をもっと広げて行きたいと考える”やる気”のある経験の浅いエンジニアにとってはよいきっかけになる講座だと感じました。

実際、私も昔少しかじったUMLをもう一度根本から勉強し直そうと思ったので、そういう意味でも投資した甲斐はあったと思います。