ツール」カテゴリーアーカイブ

SQLコーディング規約と標準SQLについて考える

SQL表記の標準化を推進するには

最近、とあるプロジェクトにおいて、プロジェクト管理の1つとして「SQLコーディング規約」あるいは「SQLコーディングチェックリスト」などにより、SQL表記の標準化を図ろうという取り組みに関わることになった。

開発責任者にヒアリングすると、テキストエディタでSQL文を記述しているのでどうしても開発者によって記述のゆらぎが発生し、可読性の悪いSQL文が量産されるということが悩みのタネらしい。

このような場合、SQL Developer等のツールを活用するのが賢い方法であるが、「SQLフォーマッターFor WEB」という秀逸なWebツールがあるので紹介したい。

本ツールは2006年に初版が出たとあるが、現在でも頻繁にアップデートが繰り返されている。

SQLフォーマッターFor WEB

このツールは、以下のような非常にシンプルなインターフェースのツールで、テキストボックスに記述されたSQL文を、ラジオボタンによって選択されたフォーマット・ルールによって整形してくれるスグレモノである。

上のテキストボックスにSQL文を手入力あるいはコピー&ペーストで入力し、「整形する」ボタンをクリックすると、下のテキストボックスに整形されたSQL文が自動的に表示される。

さらに、右下の「copy」ボタンをクリックすると、クリップボードに整形されたSQL文がコピーされるので、開発で使用しているエディタ等にペーストすればよい。
次のSQL文をこのツールで実際に整形したところを以下に示す。

整形前

SELECT D.DEPARTMENT_NAME,
CASE WHEN E.FIRST_NAME IS NOT NULL THEN 
  SUBSTR(E.FIRST_NAME,1,1) || '. ' || E.LAST_NAME
ELSE NULL
END AS NAME
FROM DEPARTMENTS D
LEFT OUTER JOIN EMPLOYEES E
ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
ORDER BY D.DEPARTMENT_NAME ,
  E.LAST_NAME ;

整形後

select
  D.DEPARTMENT_NAME
  ,case
    when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
    else null
  end as NAME
from
  DEPARTMENTS D
  left outer join EMPLOYEES E
  on  D.DEPARTMENT_ID = E.DEPARTMENT_ID
order by
  D.DEPARTMENT_NAME
  ,E.LAST_NAME
;

ちなみに私は、SQL全文を貼り付ける前に大文字に一括変換し

    • カンマ整形:前
    • AND/OR/ON整形:前
    • インデント:スペース2
    • JOIN形式:パターンB
    • 予約語:小文字
    • 出力先:色付きエディタ

の設定した上で使用するのが好みだ。

もちろん、これはプロジェクトマネージャの考え方で適宜統一してよい。

オフラインでも使用できる

最近の開発環境は、セキュリティの観点からインターネットとは完全に隔絶されている要件が必須だ。

SQLフォーマッターFor WEB」はその名の通りWebツールなので基本的にインターネットに接続された状態で使う。

しかし、このツールはJava Scriptで記述されているので、「ファイル」メニューの「ページを別名で保存…」等で任意の場所にページを丸ごと保存(HTMLファイルとスクリプト等が含まれたフォルダ)したものを開発環境に移送し、HTMLファイルをダブルクリックすることでオフラインでも使用することができる。

この場合、色付きエディタが正常に機能しない可能性があるが、実用上は何ら問題ない。

標準SQLについて考える

SQLは元来、IBMの研究者であったエドガー・F・コッドが考案した関係データベースの実装である、関係データベース管理システム(RDBMS)の操作あるいは定義言語である。

しかし、UNIXあるいはLinuxにおいてOracle RDBMSがシェアを大きく獲得したため、IBMは標準化を主体的に策定することで巻き返しを図ってきたと、筆者は一人のOracle技術者として理解をしている。

一方、Oracle RDBMSも標準SQL(ANSI SQL)に積極的に準拠する戦略により対応している。(SQL言語リファレンスの「Oracleと標準SQL」参照)

標準SQLの内部結合

Oracle技術者にとって標準SQL記法に慣れることは、他RDBMSに移行する場合だけでなく可読性を高める目的でも有益である。

以下は、標準SQLによって記述された内部結合であるが、結合条件と検索条件を明確に区分して記述することができる。

標準SQLは結合条件と検索条件を明確に区別できる

標準SQLにより、開発者にとって可読性が向上し、例えばどのカラムにインデックスを作成するのが適切なのかがより容易になるのではないかと考える。

SQL> select
  2    D.DEPARTMENT_NAME
  3    ,case
  4      when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
  5      else null
  6    end as NAME
  7  from
  8    DEPARTMENTS D
  9    inner join EMPLOYEES E
 10    on  D.DEPARTMENT_ID = E.DEPARTMENT_ID  -- 結合条件
 11  where
 12    D.DEPARTMENT_NAME like 'IT%'  -- 検索条件
 13  order by
 14    D.DEPARTMENT_NAME
 15    ,E.LAST_NAME
 16  ;

DEPARTMENT_NAME           NAME
------------------------- -------------------------
IT                        D. Austin
IT                        B. Ernst
IT                        A. Hunold
IT                        D. Lorentz
IT                        V. Pataballa


実行計画
----------------------------------------------------------
Plan hash value: 4213409228

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |    29 |   986 |     7  (15)| 00:00:01 |
|   1 |  SORT ORDER BY      |             |    29 |   986 |     7  (15)| 00:00:01 |
|*  2 |   HASH JOIN         |             |    29 |   986 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL| DEPARTMENTS |     3 |    48 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| EMPLOYEES   |   107 |  1926 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID")
   3 - filter("D"."DEPARTMENT_NAME" LIKE 'IT%')


統計
----------------------------------------------------------
          4  recursive calls
          4  db block gets
         18  consistent gets
          0  physical reads
          0  redo size
        748  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          5  rows processed

ちなみに「inner」は省略が可能であるが、外部結合ではないことを明示するために省略しない方がよいのではないかと考える。

実行環境は

SQL> select BANNER from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE	12.2.0.1.0	Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

である。

Oracle SQL(注:標準SQLでないという意味)で記述した内部結合

Oracle SQLでは結合条件と検索条件がWHERE句に混在しているので、可読性が悪い。

SQL> select
  2    D.DEPARTMENT_NAME
  3    ,case
  4      when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
  5      else null
  6    end as NAME
  7  from
  8    DEPARTMENTS D
  9    ,EMPLOYEES E
 10  where
 11    D.DEPARTMENT_ID = E.DEPARTMENT_ID
 12  and D.DEPARTMENT_NAME like 'IT%'
 13  order by
 14    D.DEPARTMENT_NAME
 15    ,E.LAST_NAME
 16  ;

DEPARTMENT_NAME           NAME
------------------------- -------------------------
IT                        D. Austin
IT                        B. Ernst
IT                        A. Hunold
IT                        D. Lorentz
IT                        V. Pataballa


実行計画
----------------------------------------------------------
Plan hash value: 4213409228

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |    29 |   986 |     7  (15)| 00:00:01 |
|   1 |  SORT ORDER BY      |             |    29 |   986 |     7  (15)| 00:00:01 |
|*  2 |   HASH JOIN         |             |    29 |   986 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL| DEPARTMENTS |     3 |    48 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| EMPLOYEES   |   107 |  1926 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID")
   3 - filter("D"."DEPARTMENT_NAME" LIKE 'IT%')


統計
----------------------------------------------------------
          4  recursive calls
          4  db block gets
         18  consistent gets
          0  physical reads
          0  redo size
        748  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          5  rows processed

検索条件をON句に記述

標準SQLでは複合キーが結合条件となっている場合、ON句の中で「AND」を使用することで2番目以降の結合条件を記述することができるが、(少なくともOracleの場合)検索条件をON句の中に書くことができる。(「書くことができる」というのは構文エラーにならずに実行できるという意味)

SQL> select
  2    D.DEPARTMENT_NAME
  3    ,case
  4      when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
  5      else null
  6    end as NAME
  7  from
  8    DEPARTMENTS D
  9    inner join EMPLOYEES E
 10    on  D.DEPARTMENT_ID = E.DEPARTMENT_ID  -- 結合条件
 11    and D.DEPARTMENT_NAME like 'IT%'  -- 検索条件
 12  order by
 13    D.DEPARTMENT_NAME
 14    ,E.LAST_NAME
 15  ;

DEPARTMENT_NAME           NAME
------------------------- -------------------------
IT                        D. Austin
IT                        B. Ernst
IT                        A. Hunold
IT                        D. Lorentz
IT                        V. Pataballa


実行計画
----------------------------------------------------------
Plan hash value: 4213409228

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |    29 |   986 |     7  (15)| 00:00:01 |
|   1 |  SORT ORDER BY      |             |    29 |   986 |     7  (15)| 00:00:01 |
|*  2 |   HASH JOIN         |             |    29 |   986 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL| DEPARTMENTS |     3 |    48 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| EMPLOYEES   |   107 |  1926 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID")
   3 - filter("D"."DEPARTMENT_NAME" LIKE 'IT%')


統計
----------------------------------------------------------
          4  recursive calls
          4  db block gets
         18  consistent gets
          0  physical reads
          0  redo size
        748  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          5  rows processed

JOIN句はWHERE句よりも先に評価されるため、DEPARTMENTS表を絞り込んだ後に結合することを考えるとJOINに続くON句に記述することは理にかなっているようにも思えるが、実行計画上はWHERE句に書く場合と全く変わらないことがわかる。

標準SQLの左外部結合

次に、標準SQLでの左外部結合の例を紹介する。

この場合「LEFT JOIN」に先行する(左側にある)DEPARTMENTS表のうち絞り込み条件に合致する全行を表示し、結合キー(E.DEPARTMENT_ID)が存在しないEMPLOYEES表側はNullを表示する。

結合条件はON句において「D.DEPARTMENT_ID = E.DEPARTMENT_ID」を記述する。

「LEFT」を「RIGHT」に書き換えるだけで右外部結合を表現することができ、この例ではどの部署にも属さない従業員を含む従業員一覧となる。

SQL> select
  2    D.DEPARTMENT_NAME
  3    ,case
  4      when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
  5      else null
  6    end as NAME
  7  from
  8    DEPARTMENTS D
  9    left outer join EMPLOYEES E
 10    on  D.DEPARTMENT_ID = E.DEPARTMENT_ID
 11  where
 12    D.DEPARTMENT_NAME like 'IT%'
 13  order by
 14    D.DEPARTMENT_NAME
 15    ,E.LAST_NAME
 16  ;

DEPARTMENT_NAME           NAME
------------------------- -------------------------
IT                        D. Austin
IT                        B. Ernst
IT                        A. Hunold
IT                        D. Lorentz
IT                        V. Pataballa
IT Helpdesk               (null)
IT Support                (null)

7行が選択されました。

実行計画
----------------------------------------------------------
Plan hash value: 3871261979

-----------------------------------------------------------------------------------
| Id  | Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |             |    10 |   340 |     7  (15)| 00:00:01 |
|   1 |  SORT ORDER BY      |             |    10 |   340 |     7  (15)| 00:00:01 |
|*  2 |   HASH JOIN OUTER   |             |    10 |   340 |     6   (0)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL| DEPARTMENTS |     1 |    16 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| EMPLOYEES   |   107 |  1926 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID"(+))
   3 - filter("D"."DEPARTMENT_NAME" LIKE 'IT%')


統計
----------------------------------------------------------
          0  recursive calls
          4  db block gets
         15  consistent gets
          0  physical reads
          0  redo size
        782  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          7  rows processed

このように、部署名が「IT」で始まる「IT Helpdesk」や「IT Support」も表示対象となるが、あいにくどちらも従業員がアサインされていないのでNullが表示されている。

select
  D.DEPARTMENT_NAME
  ,case
    when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
    else null
  end as NAME
from
  DEPARTMENTS D
  ,EMPLOYEES E
where
  D.DEPARTMENT_ID = E.DEPARTMENT_ID(+)
and D.DEPARTMENT_NAME like 'IT%'
order by
  D.DEPARTMENT_NAME
  ,E.LAST_NAME
;

Oracle SQLで外部結合を記述するには、キーが存在しない行をNullで表示する方(この場合E.DEPARTMENT_ID側)に(+)を記述する。
(必然的に、左外部結合であれば右辺側、右外部結合の場合は左辺側に(+)を記述するのだが、可読性はかなり悪い。)

また、標準SQLで外部結合を記述したSQLの実行計画を見ると、Predicate Informationに
2 – access(“D”.”DEPARTMENT_ID”=”E”.”DEPARTMENT_ID”(+))
を確認することができる。(47行目)

つまり、Oracleの場合は標準SQLで記述してもいったんOracle SQLにリライトされた上でパーサ(Parser)に送られるのではないかと思われる。

検索条件をON句に記述した外部結合

それでは、内部結合と同様に検索条件をON句に記述した結果を確認してみよう。

SQL> select
 2    D.DEPARTMENT_NAME
 3    ,case
 4      when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
 5      else null
 6    end as NAME
 7  from
 8    DEPARTMENTS D
 9    left outer join EMPLOYEES E
10    on  D.DEPARTMENT_ID = E.DEPARTMENT_ID
11    and D.DEPARTMENT_NAME like 'IT%'
12  order by
13    D.DEPARTMENT_NAME
14    ,E.LAST_NAME
15  ;


DEPARTMENT_NAME           NAME
------------------------- -------------------------
Accounting                (null)
Administration            (null)
Benefits                  (null)
Construction              (null)
Contracting               (null)
Control And Credit        (null)
Corporate Tax             (null)
Executive                 (null)
Finance                   (null)
Government Sales          (null)
Human Resources           (null)
IT                        D. Austin
IT                        B. Ernst
IT                        A. Hunold
IT                        D. Lorentz
IT                        V. Pataballa
IT Helpdesk               (null)
IT Support                (null)
Manufacturing             (null)
Marketing                 (null)

DEPARTMENT_NAME           NAME
------------------------- -------------------------
NOC                       (null)
Operations                (null)
Payroll                   (null)
Public Relations          (null)
Purchasing                (null)
Recruiting                (null)
Retail Sales              (null)
Sales                     (null)
Shareholder Services      (null)
Shipping                  (null)
Treasury                  (null)

31行が選択されました。

実行計画
----------------------------------------------------------
Plan hash value: 3743165598

-----------------------------------------------------------------------------------------
| Id  | Operation             | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                 |   108 |  4536 |    85   (2)| 00:00:01 |
|   1 |  SORT ORDER BY        |                 |   108 |  4536 |    85   (2)| 00:00:01 |
|   2 |   NESTED LOOPS OUTER  |                 |   108 |  4536 |    84   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL  | DEPARTMENTS     |    27 |   432 |     3   (0)| 00:00:01 |
|   4 |    VIEW               | VW_LAT_718C084F |     4 |   104 |     3   (0)| 00:00:01 |
|*  5 |     FILTER            |                 |       |       |            |          |
|*  6 |      TABLE ACCESS FULL| EMPLOYEES       |     4 |    72 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

  5 - filter("D"."DEPARTMENT_NAME" LIKE 'IT%')
  6 - filter("D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID")

統計
----------------------------------------------------------
         0  recursive calls
         8  db block gets
        31  consistent gets
         0  physical reads
         0  redo size
      1524  bytes sent via SQL*Net to client
       630  bytes received via SQL*Net from client
         4  SQL*Net roundtrips to/from client
         1  sorts (memory)
         0  sorts (disk)
        31  rows processed

明らかに、意図するものと異なる結果となった。

少なくともOracleにおいては、外部結合で検索条件をON句に書いてしまうと間違った結果を導いてしまう恐れがあるので注意が必要である。

同様に、内部結合においても検索条件はWHERE句に書くことをおすすめする。(我々が心配しなくてもCBOは結合前に適切に検索条件で絞り込んでくれる。)

FULL OUTER JOINを試す

標準SQLの最も優れている点は、完全外部結合が簡単に表記できることである。

以下のように、「full outer join」により、従業員がアサインされていない部署とどの部署にもアサインされていない従業員をまとめて表示させることができる。
(特に最後の2行に注目)

SQL> select
  2    D.DEPARTMENT_NAME
  3    ,case
  4      when E.FIRST_NAME is not null then SUBSTR(E.FIRST_NAME, 1, 1) || '. ' || E.LAST_NAME
  5      else null
  6    end as NAME
  7  from
  8    DEPARTMENTS D
  9    full outer join EMPLOYEES E
 10    on  D.DEPARTMENT_ID = E.DEPARTMENT_ID
 11  order by
 12    D.DEPARTMENT_NAME
 13    ,E.LAST_NAME
 14  ;

DEPARTMENT_NAME           NAME
------------------------- -------------------------
Accounting                W. Gietz
Accounting                S. Higgins
Administration            J. Whalen
Benefits                  (null)
Construction              (null)
Contracting               (null)
Control And Credit        (null)
Corporate Tax             (null)
Executive                 L. De Haan
Executive                 S. King
Executive                 N. Kochhar
Finance                   J. Chen
Finance                   D. Faviet
Finance                   N. Greenberg
Finance                   L. Popp
Finance                   I. Sciarra
Finance                   J. Urman
Government Sales          (null)
Human Resources           S. Mavris
IT                        D. Austin
...................................................

DEPARTMENT_NAME           NAME
------------------------- -------------------------
Shipping                  M. Weiss
Treasury                  (null)
(null)                    K. Grant

123行が選択されました。

実行計画
----------------------------------------------------------
Plan hash value: 3058970667

--------------------------------------------------------------------------------------
| Id  | Operation              | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |             |   122 |  5246 |     7  (15)| 00:00:01 |
|   1 |  SORT ORDER BY         |             |   122 |  5246 |     7  (15)| 00:00:01 |
|   2 |   VIEW                 | VW_FOJ_0    |   122 |  5246 |     6   (0)| 00:00:01 |
|*  3 |    HASH JOIN FULL OUTER|             |   122 |  4148 |     6   (0)| 00:00:01 |
|   4 |     TABLE ACCESS FULL  | DEPARTMENTS |    27 |   432 |     3   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL  | EMPLOYEES   |   107 |  1926 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID")


統計
----------------------------------------------------------
          0  recursive calls
          4  db block gets
         15  consistent gets
          0  physical reads
          0  redo size
       4212  bytes sent via SQL*Net to client
        696  bytes received via SQL*Net from client
         10  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
        123  rows processed

実行計画を見ると「HASH JOIN FULL OUTER」というオペレーションを確認することができる。(Id=3)

開発の現場で完全外部結合が必要になった場面を見たことはないのだが、非常にシンプルな記述で複雑な処理を行うことができるのはまさに構造化言語であるSQLらしい記述と言えるかもしれない。

ただし、パーティション化された完全外部結合(FULL)は指定できない等の制約があるので、使用する際は注意が必要である。

Apple Watchを1ヶ月使ってみて

発売初日にポチッ!

今までApple製品、特にiPhone/iPadは発売されてしばらく様子を見てから買うことが多かったのですが、Apple Watchに関しては発売初日4月12日の早朝16時過ぎに購入手続きをしました。

Apple Watch注文

今まで使っていたCASIOの腕時計GB-5600AAもiPhoneにBluetoothでペアリングして、電話やメールの着信を腕時計で知ることができるという「優れモノ」だったのですが、iOSがバージョンアップされるたびにペアリングが不調になり、最近はほとんど単なる腕時計としてしか使っていませんでした。

買ってから3年経って、水銀電池の残量が少なくなっているという警告がしばしば出ていたのと、今回は娘がプレゼントしてくれるというので、発売初日に思い切って注文しました。

10日もフライングで到着

購入完了メールがすぐに送られてきましたが、到着予定日には目がテンになってしまいました。最悪で1ヶ月半後!ありえん!!と思いました。(結局これは中国製部品が不良だったことによる納期の遅れだったらしいですが。)

ところが嬉しい誤算もあるものです。4月29日に明日到着予定というメールが来て、翌日無事に現物が到着しました。

Apple Watch開封の儀

腕時計としてのApple Watch

2015053001
Apple Watchは写真の「ユーティリティ」と呼ばれる自由度が高いアナログタイプの標準デザインを始め、全部で10種類もの文字盤のバリエーションを自分の好みで自由に切り替えることができます。

「ユーティリティ」の場合、文字盤の時間・分表示や秒針の色を変えることができますが、私の場合秒針はにするのが一番自然に感じられました。(ちなみに秒針はカチッカチッとメカニカルな動きではなく連続的に動きます。)

Apple Watchは基本的にiPhoneと常にペアリングした状態で使うので(つまり、カバンの中でもよいのでiPhoneは常に近くにあることが原則です。)

iPhoneはネットワークで時刻補正が行われているので、Apple Watchには常に正確な時刻が表示されます。iPhoneの時刻補正は以前正しく機能しなくてかなりイライラしたのですが、今では正確性に関しては非常に信頼を置いています。

また、Apple Watchを使っていて非常に心地よいのは、「手首検出機能」で手首を上げた時だけ表示がONになるところです。一日中身につけていてしかもバッテリが小さいので充電なしでどれくらい持つのか非常に気になっていましたが、普段は表示がOFFになっているので、思ったほどバッテリは消費しません。寝る前に30%を切ることはこの1ヶ月間皆無でした。

情報量が多いモジュラー

2015053002

アナログ時計もいいですが、私が一番使うことが多いのは「モジュラー」と呼ばれるデジタル表示です。

何と言っても情報量が多いのがよいです。表示させる情報は自由にカスタマイズすることが可能ですが、私の場合、左上に「曜日・日」を、真ん中に「スケジュール」を、下段左から「気温」「タイマー」「アクティビティ」を表示させています。

これらの表示域をタップすると、それぞれに関係したアプリケーションが起動されます。

この1ヶ月間カスタマイズをいろいろ試行錯誤してきましたが、最近はこの表示に落ち着いています。

グランスにはあまり詰め込みすぎない

2015053003

文字盤を下から上にスワイプすると表示される、文字通り「ちらっと見る」という意味のグランス機能は頻繁に使うアプリケーションを登録するのに便利な機能です。

グランスで表示させたアプリケーション画面を、さらに左右にスワイプさせると別のアプリケーションに切り替えることができますが、あまり多くのアプリケーションをグランスに追加する(iPhoneアプリで緑+をタップする)と、欲しい情報にたどり着くのが大変になりますので、必要最小限のアプリに絞り込むことがコツだと思います。

それから、時計表示画面からとグランスからアプリを起動した場合は、デジタルクラウンを押すとアプリケーションが終了し、再び時計表示画面に戻ります。

ホーム画面の整理法

腕時計の竜頭に似た「デジタルクラウン」を1回押すと、ホーム画面と呼ばれる、アイコンが沢山並んだ画面が表示されます。

2015053004

時計表示からホーム画面を表示させると、時計アイコンを中心にしたホーム画面になります。

起動させたいアプリケーションのアイコンが中心になるように動かして、アイコンをタップするかデジタルクラウンを回すとアプリケーションが起動されます。

周辺のアイコンは小さくしか表示されませんし、画面をはみ出たアイコンは表示されませんので、起動する頻度の高いアプリケーションほど中央の時計アイコンに近い場所に配置した方が使いやすいです。

特に時計アイコンの周りの6つのポジションはiPhoneのドックに相当する大事な位置です。

ホーム画面が時計以外のアイコンが中央にある状態で、デジタルクラウンを1回押すと時計アイコンを中央にするように画面全体を動かします。

そしてもう一度、デジタルクラウンを押すと時計表示になります。

従って、どんな状態でも2回デジタルクラウンを押すと、時計表示に戻ることができます。

レイアウト変更はiPhoneアプリで

iPhone上でアイコンの位置を変更する要領でApple Watch上でもアイコンを長押しして変更モードにした後レイアウト変更を行うことは可能です。ただし、元々小さなApple Watch画面上で行うのはかなり大変です。(つい最近までそういう変更方法があることすら知りませんでした。)

従って、レイアウト変更はiPhoneのApple Watchアプリ上で行います。

2015053005-1

上で説明したように、中央の時計アイコンを中心とした位置が重要ですので、上の写真の赤枠で囲った範囲に頻繁に使うアイコンを配置します。特に時計アイコンの周りの6つのポジションはよく考えて配置します。

時計表示画面から直接起動できる、カレンダーやタイマー、天気アプリなどは赤枠の外に配置するようにします。

また、グランスに登録したアプリもなるべく外側に配置するようにします。(例外もありますが)

サイドボタンはほとんど使わない

2015053006

デジタルクラウンの隣(写真だと向かって左)にある「サイドボタン」はあらかじめ登録しておいた連絡先に素早くコミュニケーションを取るためのボタンです。

私だけかもしれませんが、このボタンを使ったことはほとんどありません。

なぜなら、電話をかけたりメッセージを送ったりするのはiPhoneから行う方が楽なので、このボタンを使う必要性を感じたことがないからです。(実はもっと賢い使い方があるのかもしれませんが)

サイドボタンを押しながらデジタルクラウンを押すと、画面のスナップショットが撮れるのでそれくらいしか使ったことはありません。

iPhone/iPadは、ソフトウェア・アップデートでボタンに割り当てられる機能が変更されたりしていろいろ進化しているので、Apple Watchもそのようになることを期待しています。

保護フィルムはあると安心

届いて2週間くらいは、素のままでApple Watchを使っていたのですが、このままだと絶対に表面を傷つけてしまいそうだったので、保護フィルムを貼ることにしました。

いろいろ探した結果 Wrapsol(ラプソル)擦れ傷・割れ防止 衝撃吸収フィルム Apple Watch対応【2枚入り】(42mm) A005-IWC42 というのをAmazonで買いました。

急いで貼ったので最初わずかに気泡が入ったりしましたが、タオルでこすったりいろいろしていたら次に日には気泡が抜けてぴったり貼れていました。

素のままに比べると若干柔らかい感触になりますが、動作が遅くなったりすることは全くないので、細かい擦り傷等を心配する必要がなくなる安心感は大きいです。

1ヶ月使った感想まとめ

単純に小さくて軽いデバイスであればiPod nanoとか今までもにもありましたが、これだけの多機能を腕時計に詰め込んでそれなりに使えるものに仕上がっているのはさすがAppleと思いました。でも、細かい部分ではまだまだ改善の余地があると思います。

例えばアプリケーションによっては、起動に時間がかかりすぎてイライラするものもあります。

iPhoneから同じアプリを起動してもあまりそのようなことを感じないので、やはり遅いのは気になります。

腕を上げてチラッと見る(グランス)間に期待したレスポンスがないと、腕を不自然に上げたままになっていたりして「俺何やってるんだろう」という気持ちになります。

近い将来Apple Watchアプリはネイティブ(Apple Watch向けに最適化される仕様)になるという話もありますので、今後の進歩に期待です。

iPhoneがなければほとんど何もできない高い時計、という点は特に家族の理解をまだ得られていない気がしますが、iPhoneの出先デバイスとしてiPhone自体をポケットやカバンに入れたままにしている時間が長くなったというのは、ちょっと驚きでした。こんなことだったらiPhone6じゃなくてiPhone6 Plusにしておけばよかったです。

混雑した駅とかでのいわゆる「歩きスマホ」が問題になっていますが、Apple Watchのようなウェアラブル・デバイスは持っていることを忘れてしまうくらいの自然な感覚が特にいいです。

アプリケーションをいっぱい詰め込んで何にでも使えるデバイスという考えは捨てるべきで、本当に使えるものだけに極力絞り込む使い方が正しいと思います。

今後も気づいたTipsがあれば積極的に紹介していきます。

今回はここまで

 

Dropbox Pro が1TBに拡張されたけど…

Dropbox の容量が増えた

Dropboxプロがいつの間にか容量1TBに拡張されて驚きました。

『Dropbox』がいつの間にか1テラになっててビックリ! 他社「ワシらの方がもっと凄いで!」

ただし、DropboxはローカルディスクのDropbox以下を同期するので、私の場合は現状40GB強しか使えていません。

ローカルディスク全体でも500GB程度しかないので1TBもらっても宝の持ち腐れになってしまいます。

Dropboxフォルダ

Macにはシンボリックリンクがある!

MacOSでは、外付HDDに保存したファイルのシンボリックリンクをDropboxフォルダ以下に作成すれば、それも同期対象としてくれます。

iTunesフォルダ

私は230GB以上もあるiTunesフォルダを内蔵から外付HDDに移動しているのですが、以下の手順によりこれもDropbox同期対象とすることができます。

$ cd /Users/kmihara/Dropbox
$ ln -s /Volumes/BACKUP/iTunes iTunes
$ ls -l iTunes
lrwxr-xr-x  1 kmihara  staff  22  8 31 08:46 iTunes -> /Volumes/BACKUP/iTunes

同期には時間がかかる

同期中

2日かけて100GB同期しましたが、やはりファイルサイズが小さいものから同期しているようです。

残りファイル数はかなり少なくなりましたが、大きなファイルが残っているのでまだまだ時間はかかりそうです。

OracleマニュアルはEvernoteに取り込んで使おう

HTMLだったら何でも取り込める

またしても、Evernoteネタです。

それぐらいEvernoteは仕事の必需品です。

以前、iPadでOracleマニュアルを持ち出す という記事を書いたことがあります。Oracleマニュアルは私にとって商売道具であり愛読書でもあります。

今では紙でのOracleマニュアルを見ることはなくなりましたが、PDF、HTML、最近ではePub形式のマニュアルを無料で入手できるということは、紙マニュアルの時代を知るものとして隔世の感があります。

いろいろなフォーマットの中で知りたい場所がある程度わかっているものはやはりHTML形式に軍配が上がるのではないかと思いますが、Evernote はHTMLとの相性が抜群です。

Evernote Web Clipper

私は主にGoogle Chromeをメインのブラウザとして使っているのですが、ChromeにしろFierfoxにしろ「Evernote Web Clipper」という拡張機能(エクステンション)が提供されています。(インストール方法に関してはリンク先を参照して下さい。)

Evernote Web Clipper

Evernote Web Clipperをインストールするとブラウザに象のアイコンが表示されます。

拡張機能

クリップの仕方

クリップの実際

 

私はマニュアルのクリップを以下の要領で行っています。

  1. 取り込みたいマニュアルを表示させます。この場合ローカルディスクに保存したHTMLファイルではなくOTNサイトのマニュアルをインターネット経由で表示させます。(例は、Oracle Databaseリファレンス 11gR2 の V$SEGSTAT_NAMEの箇所です。)
  2. 取り込みたい箇所をドラッグして選択状態にします。
  3. Evernote Web Clipperのアイコンをクリックすると、上の写真のように「選択範囲」にマークがついた状態でダイアログが開きます。そのまま緑の「保存」ボタンをクリックするとEvernoteの新しいノートが作成されます。ノートのタイトルはTitleタグに記述されたものが自動的に指定されます。保存先はデフォルトノートブックですが、このタイミングで任意のノートブックを指定することも可能です。
  4. 作成されたノートは下の写真のようになります。保存先ノートブックを変更したり、必要なタグ付けをします。例では「Oracle:リファレンス」と「V$ビュー」というタグを付けています。
  5. マニュアルの記述だけではわかりにくい場合は、実際のSQL文を実行した結果を貼り付けたり、字の色を変えたりして自分だけの情報としてまとめます。

ノート

Evernoteにまとめておくと(Evernote Web Clipperがインストールしてあれば)、普通にGoogle検索をすると右側に自分のEvernote内の検索結果も同時に表示してくれます。まさに「自分だけのGoogle」です!

膨大なマニュアルの中から必要な部分を抜き出し、自分だけのコメントを付けて保存しておくと、記憶が定着するのに非常に有効です。

必要な情報をサッと取り出せる、こういうインフラを日頃から整えておけば仕事にきっと役立ちます。お試し下さい!

Google検索

ポスト・イットケースとポスト・イットとEvernote

私はふせんを持ち歩く

先日Amazonでなかなかおしゃれなポスト・イットケースを買いました。

シヤチハタ オピニ 持ち歩きふせんカバー ホワイト OPI-FC-1

開封前

開封後

四角いポスト・イットってすぐに失くしたり、糊が剥がれてバラバラになったり、角が折れてしまったりと裸で持つと何かと不便なのでちょうどいいのを探していたら見つかりました。

ポスト・イットは糊の部分を下にして

以下は使用中の写真ですが、矢印は糊の部分です。こちらを下向きにして書いて重ねていくのが最近知ったTipsです。(ポストイットは逆貼りでアウトラインプロセッサになる。

 

使用中

Evernoteにポスト・イット・ノートを作成

そして最後はEvernoteに取り込みです。iPhone でEvernote を起動してカメラでポスト・イットを撮ると、自動的にトリミングしてくれて(影も消えてる)新規ノートとして取り込んでくれます。(写真と実際が違うのは悪しからず)カメラで取り込み

かなり鮮明に読めます。手書き文字でもOCRが使えるそうです。

PostIt Evernote

Evernoteでブルーレイ・ディスクを管理する

メディアの管理はいつも大変

好きなテレビ番組を録画してあとで観るというライフスタイルはビデオレコーダーのおかげです。

VHSテープの時代は120分テープの中にいかにきっちり録画するかが大変でした。たまに120分以上の番組を録画しなければならないような場合は、3倍モードで画質を落としたりして苦労したものです。

やがてハードディスク・レコーダーが普及し、保存しておきたい番組はDVD-R、DVD-RAM、そして今ではハイビジョン映像をブルーレイ・ディスクにダビングして保存するのが当たり前の時代になっています。

VHSテープでもブルーレイ・ディスクでもそのままにしておくと中に何を録画したかわからなくなってしまうようなことはないでしょうか?これらのメディアはとにかく数が多くなることが悩みの種です。

ラベルで管理する

VHSテープでは背中にラベルを貼って手書きでタイトルを書いたりしたものですが、私は字が下手なのでパソコンでラベルを印刷したりしてました。思い通りにきれいに印刷するのは意外と面倒で「たかが」ラベルのために休日何時間もかかってしまったこともあります。

DVD 、ブルーレイ・ディスクでも同じです。高速回転するディスク面はさすがにラベルを貼ることは難しいので、サインペン等で記入するのですが、やっぱり字が下手なのは変わらないので、プリンタを買ったらついてきた印刷専用のアプリでメディアに直接印刷したりしました。

BlueRayDisk印刷

写真は2010年頃に録画したブルーレイ・ディスクですが、これ1枚印刷するだけでかなり面倒なので休日などにまとめてするのが普通でした。

そうだEvernoteがあるじゃないか!

きれいにレベルを印刷するのがだんだん面倒になってきたのと、どうせ自分や家族しか見ないのだからこんなことに時間を費やすのがもったいなく思えてきました。

Evernoteは2009年から使っていたのですが、仕事だけでなく家庭や個人的なことにもどんどん使うようになった2011年頃からメディアの管理をEvernoteでやってみようと思いつきました。

1メディア1ノートで管理する

それまでもメディアには、ブルーレイ・ディスクであれば「BD-xxx」、DVDは「DV-xxx」というルールで通し番号を振っていましたので、これをそのまま適用して管理することにしました。

Evernoteビデオ管理

今まできれいに印刷していたメディアをEvernoteの「ビデオ管理」ノートブックにどんどんノートを作って登録していきました。メディア1枚で1ノートです。

番組名などでタグを付けておくと後で例えば「カンブリア宮殿」のディスクだけを抽出することができます。

新規は番号だけを手書きで

新規に登録するメディアには手書きで通し番号のみを記入します。他には何も書かないのでとてもシンプルです。

BlueRayDisk手書き

メディアの方は単に識別ができればよいのでこれだけでよいのです。

一方、Evernoteには以下のように情報をまとめておきます。(初期の頃と比べると若干の工夫が見られます。)

最新ビデオ管理

番組情報もEvernoteで管理

Evernoteのいいところはこれだけではなくて、別のノートへのリンクを貼り付けられることです。

例えば、2014.8.14回のカンブリア宮殿のリンクをクリックすると番組ホームページから取り込んだ以下のノートが表示されます。

番組情報

DVD、ブルーレイ・ディスクを今まで170枚くらい管理していますが、キーワードやタグで見たいディスクをすぐに検索できる仕組みができたので、ストレスのないビデオライフが確立できたと思います。

Fitbit Zipはなかなかイイぞ!

Fitbit Zipとは

Fitbit Zip

今まで使っていた歩数計を洗濯機で洗って壊してしまったので、2週間前に前から気になっていたFitbit Zipをビックカメラで買いました。

Fitbitではさらに高機能(例えば階段で登った段数がわかる、睡眠記録等)のFitbit Oneという製品があるのですが、Oneが充電式であるのに対しZipは水銀電池式で管理が楽なこと、追加機能は特に必要がないと思ったので、Zipにしました。

歩数計の場合、出かける際ズボンの左のポケットにクリップでとめてから外出し、帰ってきたら外すような使い方をしていました。ところが帰ってきてズボンをすぐに洗濯機に入れるような場合、うっかり外し忘れるとそのまま一緒に洗ってしまうことが多々ありました。(過去何台も壊してしまいました。)

つい最近まで使っていたオムロンの歩数計は防水機能がけっこうしっかりしていて、うっかり洗濯しても平気でしたが、ある日ついに水漏れで全く表示がされなくなってしまいました。

それから、オムロンのはいったん本体のボタンを長押しすることでデータ転送モードにしMacにUSB接続した専用読み取り機の上に置くことでデータ転送をしてくれたのですが、これが意外と面倒なので何日もデータを取り込まずに放置しているようなことがよくありました。

Fitbit Zipの良い所

今日でZipを使い始めてちょうど2週間ですが、今まで使ってきた歩数計とはかなり違った製品で非常に気に入っています。

気軽に付けられる

まず、「これから身につけるぞ!」という意識を持たなくてもよい気軽さです。最初はいろいろ試行錯誤しましたがトランクス(パンツ)のゴムの部分にクリップで固定するようにしています。重さ約16g、大きさは長さ約5cm×幅約3cm×厚さ約2cm弱くらいですのでつけているのを忘れてしまうほどです。

毎晩風呂に入る際にトランクスから外し、新しいトランクスに履き替えたらゴムの部分にはさみます。裏側のクリップ部分はゴムでコーティングされているのですが、液晶面を外側にするとクリップが肌に接するようになり上から圧迫されると少し痛いのです。なので液晶面を内側にして(クリップを外側に)装着するようにしています。液晶面はやや丸みを帯びているのでそれほど痛くありません。

生活防水機能なので、運動して汗をかいたくらいでは全く問題はありません。

寝るときもこのままなので、ほぼ24時間装着していることになります。以前は朝急いでいて歩数計を持って出るのを忘れると1日損した気分になったものですが、Fitbit Zipにしてからはそういうことがなくなったのでそれだけでもとても得した気になっています。

同期が楽

歩数計はデータを後で振り返えられることに意義があります。簡単な歩数計の場合、PC等にデータを転送する機能がないのでメモリ機能で過去の歩数を確認するしかありませんが、メモリ容量も限りがあるので古いデータからどんどん消えていってしまいます。

PC等にデータを転送する歩数計では、データを転送した後に歩数計自身の保存データが削除されるので、データで溢れてしまうようなことはないのですが、同期自体は手動で行うものがほとんどですので、それを忘れると意味がありません。

Fitbitの場合、iPhoneに専用アプリをインストールしてあれば、Bluetoothでほぼリアルタイムにデータを同期してくれます。バックグラウンドで常に同期するのではなく、液晶面を爪で軽く弾くような操作をすると同期が始まります。歩数系本体の液晶画面を見なくてもiPhoneアプリで今までの歩数を簡単に確認できますのでとても便利です。

アプリ画面

Mac(PC)のUSBポートにハードウェアキーと呼ばれる小さい部品を挿しておけば、Mac(PC)への同期も簡単です。(Wifi経由)

レポートが充実

iPhoneアプリやクラウドサービスのFitbitダッシュボード画面で1日単位の実績を確認してもよいのですが、毎週以下のようなレポートがメールで送られてきます。今週のアクティビティ

英語圏や中国語圏では、カロリー入力のためのクラウド上の食事データが充実しているので食事記録は比較的楽につけられるのですが、日本語ではデータベースがまだ準備されていないようで食事記録を手動で入力することになります。(私は食事記録は特に入力していません。)

それから、ある目標をクリアするとバッジをもらえる仕組みになっていてモチベーションを保つ工夫がしてあります。

おわりに

気軽さとサービスの充実でこの2週間は意識して歩くようにしています。外出しないで1万歩に到底届きそうにないような日には、マンションのフィットネスルームで走ることにしています。6〜7000歩は軽く稼ぐことができるので、運動する意識と機会は確実に増えていてモチベーションが上手に維持されているような感じです。

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

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

ライフログのススメ(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

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

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

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

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

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

astah* professional

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

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

ライフログのススメ(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ライフログ   無料 カテゴリ: 仕事効率化, ライフスタイル