2016年3月1日火曜日

JQueryのDataTablesプラグインを使って、データをテーブル形式で画面に表示してみる【Ajax連携①】

こんにちは、井下です。

いよいよ花粉が飛び交う季節になり、去年買った花粉用の眼鏡を使ってますが、効果あるんですかねコレ…?
結局目が痛いような痒いような感じになってます。


前回はJQueryのDataTablesプラグインについて紹介しました。
今回はAjax連携について、その手順を紹介していきます。

Ajax連携

DataTablesプラグインは元々Ajaxの利用が想定されているので、単純にファイル内のjson形式データを読み込むくらいであれば、簡単に実装できます。

例として、次のようなHTMLファイルを作成後、ブラウザで開いてみてください。
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/s/dt/dt-1.10.10/datatables.min.css"/>
      <script src="http://code.jquery.com/jquery-2.2.0.min.js"></script>
      <script type="text/javascript" src="https://cdn.datatables.net/s/dt/dt-1.10.10/datatables.min.js"></script>
  </head>
  <body>
    <table id="books_table">
      <thead>
        <tr>
          <th>Title</th>
          <th>Author</th>
          <th>Genre</th>
          <th>Page</th>
          <th>Publication</th>
        </tr>
      </thead>
      <tbody>
      </tbody>
    </table>
  </body>
  <script>
    $(document).ready(function() {
      $('#books_table').DataTable({
        "ajax": {
          url: "data.json",
        }
      });
    });
  </script>
</html>


こんな感じの画面が開きました。


テーブルのデータ部分が"Loading..."となっているはずです。

上記のHTMLでは、DataTablesプラグインがAjax連携で利用している設定を黄色字にしています。
そのなかで「url: "data.json"」と書かれていますが、これは「"data.json"内のデータをAjax通信により取得して表示する」ことを示します。
まだ"data.json"を作成していないので、当然読み込みには失敗します。

では、HTMLファイルと同じディレクトリに"data.json"ファイルを作成してみます。
{
  "data": [
    [
      "異類婚姻譚",
      "本谷 有希子",
      "小説",
      168,
      "2016-01-21"
    ],
    [
      "パーフェクト Ruby on Rails",
      "すがわらまさ のり,前島真一,近藤宇智朗,橋立友宏",
      "技術書",
      432,
      "2014-06-06"
    ],
    [
      " すごい家事 人生の「掃除の時間」をグッ と縮める",
      "松橋 周太呂",
      "生活",
      207,
      "2015-12-04"
    ],
    [
      "おやすみ、ロジャー 魔法のぐっすり絵本",
      "カール=ヨ ハン・エリーン",
      "絵本",
      32,
      "2015-11-12"
    ],
    [
      "死んでいない者",
      "滝口 悠生",
      "小説",
      152,
      "2016-01-28"
    ],
    [
      "マネジメント 基本と原則",
      "P.F.ドラッカー",
      "経済・ビジネス",
      320,
      "2001-12-14"
    ]
  ]
}

作成後、ブラウザを更新してみると、"data.json"のデータがテーブル形式で表示されているはずです。




表示されていない場合、次のようなケースが考えられます。

  • "data.json"を作成しても、テーブルが"Loading..."のまま
    多くの場合、データの読み込み失敗が原因です。これまでの流れで起こりやすいのは、以下の2点かと思います。

    1."data.json"がHTMLファイルと同ディレクトリに存在しない
     読み込み対象を相対パスで指定しているので、"data.json"がHTMLファイルと同じディレクトリに存在しなければ、読み込みエラーとなります。

    2.ブラウザによるローカルリソースへのアクセス禁止
     一部のブラウザ(Chrome等)では、ローカルリソースへのアクセスを禁止しているようで、"data.json"がローカル環境にある場合、ブラウザが"data.json"の読み込みを阻害している可能性があります。ブラウザごとにアクセス禁止を緩和する設定がありますが、ブラウザにこだわりがなければ、別のブラウザで表示を確認してみましょう。(FireFoxは表示できました)
  • テーブルにデータは表示されたが、文字化けしている
    jsonはデフォルトでUTF-8でエンコードされているので、"data.json"ファイルの文字コードを"UTF-8"にしておけば、文字化けは解消するはずです。

2016年2月15日月曜日

JQueryのDataTablesプラグインを使って、データをテーブル形式で画面に表示してみる

こんにちは、井下です。


今回はDataTablesというプラグインを使い、データをテーブル形式で画面に表示してみます。
ちなみにデータを画面に表示するためにRailsを利用していますが、Rails自体の説明は省略しますので、あしからず。

DataTablesとは

DataTablesはjQueryのプラグインとして提供されるオープンソースで、画面上でデータをテーブルの形式として表示するものです。
Ajaxで動的にデータを取得することもでき、テーブル表示実装の手間を大いに軽減してくれます。

公式URL : https://www.datatables.net/




Railsでの一覧(indexアクション)の初期表示

Railsで表示するデータと画面を作成します。
今回は例として"library"アプリケーションを作成し、scaffoldジェネレータで"Books"モデルおよびコントローラ、ビュー等を自動生成しました。

※ Booksモデル作成時に、以下のカラムを設定しました。
カラム名 概要
title 本のタイトル string
author 本の著者 string
genre 本のジャンル string
page 本のページ数 integer
publication 本の発効日 date


その後画面を介して本の情報を入力した一覧画面(indexアクション)はこんな感じになります。



自動生成される画面なので、データが並べてあるだけの状態です。
この画面をDataTablesを使い、きちんとしたテーブル形式でデータを表示していきます。


2016年1月27日水曜日

AWSの触れ初めに手間取ったこと・疑問に感じたことのまとめ

こんにちは、井下です。

ここ最近の冷えとともに空気が乾燥してきたのか、ほぼ1日1回静電気にやられております。ドアノブに触れるのが怖いです…。

今回はAWSについてのお話になります。

ただし、堅牢なセキュリティ設計や、厳密な運用計画のように難しい話ではなく、私がAWSに触れ始めた頃に、手間取ったことや、疑問に感じたことについてのお話です。

なかでも特に手間取ったこと、疑問に感じたことを以下の4つに絞って説明していきます。

  • 「無料利用枠」ってあるけど、本当に無料で使えるの?
  • とりあえずAWSで仮想サーバを立てたいけど、サービスがたくさんあってどれを使えばいいのか分からない
  • 作った覚えがないリソースが作成されている
  • ファイアウォールの設定が効かない

「無料利用枠」ってあるけど、本当に無料で使えるの?


まずAWSの利用前に、料金はどれくらいか調べるうちに、「無料利用枠」があることに行き着く人は多いと思います。

このサービスがここまでの利用なら無料になりますよ、と提示してくれているのですが、AWSで提供しているサービス内の構成が分かっていない段階だと、理解することがかなり難しいです。

利用目的がとりあえず仮想サーバ欲しい! くらいであれば、気をつけるのは以下の点でしょう。
  • 固定IP(Elastic IP アドレス)を割り当てている仮想サーバが停止していると、停止している時間に応じて課金される
    ※ 固定IPを解放すれば課金されなくなりますが、一度解放した固定IPと同じIPアドレスを取得できるとは限りません
  • 稼動させるストレージの総容量が一定以上だと、容量に応じて課金される

利用目的によって、課金されるところが変わってくるので、分かる人がいればまず相談してみるのが一番良いです。

業務利用で予算がそこまでガチガチに定まっていないのであれば、まずは使ってみてからどれくらいかかったかを見てみるのも一つの手ではあります。
AWSではどのリソースのどこで課金されているのかが見えるようになっているので、コストを抑えるための判断材料は提供されています。





2016年1月13日水曜日

Embulkの設定ファイルをLiquidに対応させて、環境変数を参照させる

1月も中旬に入り、少し遅くなりましたが、明けましておめでとうございます。
私個人は新年早々、生もので当たるハメになりましたが、A-AUTO 50は元気ですので、今年もよろしくお願いいたします。


2016年の1回目は、前年末から引き続きEmbulkの話になります。
ただし、以前とは少し毛色が違い、特定のプラグインではなく、設定ファイル自体について書いていきます。

Embulkに限らず、システムを利用・運用するうえで、"環境の違い"という問題に遭遇することは少なくないと思います。
OSやアーキテクチャのように決められているものから、意図して設定している環境設定など、その種類はさまざまですが、多くの場合、問題が発生するたび、その環境に対応させるためにシステムの設定を変更することになります。

Embulkの場合も、読み込むデータの場所や、データの形式、またデータによってはアクセスの情報などを設定ファイル内に記載するため、基本的に環境が変われば、その都度設定ファイルの情報を更新することになります。

この問題の解決方法の1つとして、Embulkのバージョン0.7から設定ファイルに"Liquid"が使えるようになりました。
今回、"Liquid"の詳細は記載しませんが、重要なのは"環境変数が設定ファイル内で参照できる"ことです。


なお、今回も基となるデータはexampleコマンド⇒guessコマンドによって生成されるデータ(sample_01.csv.gz)・ymlファイル(confing.yml)です。

使用データ
id,account,time,purchase,comment
1,32864,2015-01-27 19:23:49,20150127,embulk
2,14824,2015-01-27 19:01:23,20150127,embulk jruby
3,27559,2015-01-28 02:20:02,20150128,"Embulk ""csv"" parser plugin"
4,11270,2015-01-29 11:54:36,20150129,NULL


設定ファイル内で環境変数を使うための手順


①設定ファイルの拡張子を".yml"から".yml.liquid"に変更する
まず、設定ファイルの拡張子を変更します。拡張子を変更に伴って、設定ファイル内を編集する必要はないので、単純に設定ファイルをリネーム or コピーすればいいだけです。

previewコマンド実行結果(拡張子変更前)
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

拡張子変更(コピー)
[ec2-user@ip-172-31-9-9 lib]$ cp config.yml config.yml.liquid

previewコマンド実行結果(拡張子変更後)
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

念のため、previewコマンドで実行結果を確認しましたが、特に問題なく、同じ結果となりました。


②環境変数を使いたい箇所を書き換える
ここで設定ファイル内を書き換えて、環境変数を参照するように設定します。
例として、読み込むデータを指定する"path_prefix"の値を、環境変数"embulk_source_path"を参照させてみます。

まずは環境変数"embulk_source_path"に元々"path_prefix"で設定されている値と同じ値で設定します。

環境変数設定&確認
[ec2-user@ip-172-31-9-9 lib]$ export embulk_source_path=/opt/embulk/lib/try1/csv/sample_
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_source_path

/opt/embulk/lib/try1/csv/sample_


後は設定ファイル内で"{{ env.環境変数名 }}"と指定すれば、設定されている環境変数を参照するようになります。
"embulk_source_path"を設定したので、"path_prefix"の値を"{{ env.embulk_source_path }}"と指定します。

config.yml.liquid(緑字を変更)
in:
  type: file
  path_prefix: {{ env.embulk_source_path }}
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}
out: {type: stdout}

previewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


環境変数を参照するようになりましたが、読み込むデータ自体は以前と変わらないので、実行結果も以前と変わりません。

では、今度は環境変数を書き換えて、違うデータを読み込むように設定してみます。

[ec2-user@ip-172-31-9-9 lib]$ export embulk_source_path=/opt/embulk/lib/sample_
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_source_path

/opt/embulk/lib/sample_

読み込むデータ(/opt/embulk/lib/sample_01.csv.gz)
id,account,time,purchase,comment
11,11111,2015-01-01 19:23:49,20150101,embulk
12,22222,2015-01-02 19:01:23,20150102,embulk jruby
13,33333,2015-01-03 02:20:02,20150103,"Embulk ""csv"" parser plugin"
14,44444,2015-01-04 11:54:36,20150104,NULL

previewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|      11 |       11,111 | 2015-01-01 19:23:49 UTC | 2015-01-01 00:00:00 UTC |                     embulk |
|      12 |       22,222 | 2015-01-02 19:01:23 UTC | 2015-01-02 00:00:00 UTC |               embulk jruby |
|      13 |       33,333 | 2015-01-03 02:20:02 UTC | 2015-01-03 00:00:00 UTC | Embulk "csv" parser plugin |
|      14 |       44,444 | 2015-01-04 11:54:36 UTC | 2015-01-04 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


以前の実行結果とは異なり、書き換えた環境変数のファイルを読み込んでいます。

これで環境ごとに必要な環境変数を設定するだけで、読み込むデータを指定できるようにできました。


プラグインで環境変数を参照させる

基本設定の"path_prefix"で環境変数を参照させられましたが、同様にプラグインにおいても環境変数を参照させることができます。

例として前回ご紹介した"embulk-filter-insert"プラグインを利用して、環境変数の値を新しいカラムとして追加してみます。

まずは環境変数"embulk_insert_env"に固定文字列"env"を設定します。

環境変数設定&確認
[ec2-user@ip-172-31-9-9 lib]$ export embulk_insert_env=env
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_insert_env

env


後は"path_prefix"を環境変数で参照させたときと同様に、追加するカラムの値に"{{ env.embulk_insert_env }}"と指定します。

config.yml.liquid(緑字を変更)
in:
  type: file
  path_prefix: /opt/embulk/lib/try1/csv/sample_
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}
filters:
  - { type: insert, column: { env: {{ env.embulk_insert_env }} }, at: top }
out: {type: stdout}

previewコマンド実行結果
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|        env |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|        env |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|        env |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|        env |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+

しっかり環境変数で設定した後が、新しいカラムとして追加されています。


なお、embulkコマンドをsudoで実行している場合、通常のsudoでは環境変数は引き継がないため、オプションにより環境変数を引き継いで実行する必要があります。

previewコマンドを例にすると、次のようになります。

通常のsudo(環境変数を引き継がない)
[ec2-user@ip-172-31-9-9 lib]$ sudo embulk preview 設定ファイル

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|            |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|            |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|            |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|            |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+

-Eオプション付きsudo(環境変数を引き継ぐ)
[ec2-user@ip-172-31-9-9 lib]$ sudo -E embulk preview 設定ファイル

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|        env |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|        env |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|        env |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|        env |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+


このように環境変数を上手く利用することで、異なる環境においても設定ファイルを直接更新せずに実行させられようになり、Embulkの汎用性を高めることができます。