ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2013年9月6日

Yeoman 1.0 がリリースされたので使ってみる

ついに Yeoman 1.0 がリリースされました!

Yeoman を使うことでアプリケーション開発を始めるときに設定ファイルやビルド定義ファイルを自動生成できるようになり、 各種ファイル置き場の共通化を図ることができます。

  • Gruntfile ってどう書くの?
  • JavaScript で使う HTML テンプレートファイルの管理ってどうやるの?
  • CoffeeScriptSass の導入って難しい?
  • 監視するファイルが多岐に渡ると LiveReload の設定が難しい ...
  • テストしてスクリプトを圧縮してパッケージに固めてサーバーに置くまでのコマンドが長い ...

こうした疑問や悩みを解決してくれるのが Yeoman の役割です。 Yeoman を使うことで Bower にも依存することになりますので、 jQuery のようなライブラリ/フレームワークを管理する方法も自然と身に付くでしょう。 また、JavaScript の MVC フレームワークを使う場合は、各レイヤーの定型ファイルを生成できます。

この記事では Backbone.js を使って Web アプリケーションのフロントエンドを作ってみます。 そもそも Yeoman って何? という場合は「 Yeomanについて 」というスライドが分かりやすいと思います。

2013年7月15日

東京の地価公示データを眺める

国土交通省はいくつかの数値情報を提供してくれていますが、 その中のひとつに「地価公示データ」があります。

全国のデータは2007年からの提供ですが、都道府県のデータは1983年から提供されていますので、 東京都の30年の地価のそれぞれを表現してみます。 なお、東京都全域だと広すぎるので、島嶼部は除きます。

作成したものは下記のページに置いてみました。

実装方法としては、こちらの記事のデータセットを変更したものになります。 GDAL のセットアップや d3.js を使った GeoJSON の描画については下記の記事やそのリンク先を参照してください。

2013年3月21日

Yeoman 1.0 Beta を使ってみる

じわじわと広がりを見せる Yeoman ですが、大きく役割を変えてバージョン 1.0 に進みそうです。 以前は GruntJSBower などを統合したツールでしたが、 今後はこれらと協調して動作するための「雛形を生成するツール」になるようです。

ホームページでの紹介文も変わっています。

Yeoman 1.0 is more than just a tool. It's a workflow; a collection of tools and best practices working in harmony to make developing for the web even better.

また、コマンドライン上で利用するコマンドも yeoman から yo になります。 bowergrunt をラップしていた部分がなくなり、 アプリケーションを書き始めるときの scaffolding のみを提供します。 ホームページに3つの画像が並んでいることがこれらを象徴しています。

この記事では、 backbone.js を読み込む部分までを追ってみましょう。

2013年3月12日

D3.js と GeoJSON でポリゴンを描く

こちらの記事を参考にして、東京都のポリゴンを描いてみます。

違いは2点です。

  • イギリスではなく「東京都」のポリゴンを使う
  • TopoJSON に変換せず GeoJSON を使う

作成したものは下記のページに置いてみました。

「23区」と「島しょ部除く」のデータはすんなり表示されると思いますが、 「全域」のデータは大きいのでかなり時間がかかります。 これは TopoJSON を使う動機付けになりそうです。

2012年10月24日

Yeoman を使ってみる

JavaScript の開発ツールとして Yeoman というものがリリースされていますので使ってみます。 GruntJSBower などを統合したツールで、モダンな構成で Web アプリケーションを開発できると思います。 ただ、使い始めるまでが大変かもしれませんので、万人にオススメできるものでもありません。 (OS などによりけり)

ホームページでの紹介 (英文)

Yeoman is a robust and opinionated set of tools, libraries, and a workflow that can help developers quickly build beautiful, compelling web apps.

注意:この記事は古いバージョンについて記載しています。 1.0 に向けた新しいバージョンでは仕組みもそもそもの役割も変わりました。 こちらの記事を参照してください。

2012年4月24日

Backbone.js を使ってみる

Backbone.js を使って、Solr のフロントエンドを実装してみました。 Solr は dotcloud に配置しています。

ドキュメントは自分が書いたものをいくつか登録しています。

2011年12月6日

HTML5 の File API を使ってみる

CSV を読み込んで JSON で出力できるようにします。 CSV の仕様は意外と難しいので、単純にカンマで区切られているテキストファイルだけを想定します。

File API の仕様などはこちら。 基本的にこれらのサンプルスクリプトをまとめたものが、上記のデモになります。

なお、イベント管理には jQuery を使います。

2011年11月20日

さよなら Google Buzz

Google Buzz に終了宣言が出されましたので、データをエクスポートしておきます。 API 設計がキレイだなぁとは思っていましたが、サービス自体の立ち位置が定まらなかった点が大きかったのでしょうか。 メールシステムとの統合は根深い問題もありそうです。

2011年9月15日

History API を使ってみる

History API を使ってみます。 正確には、History API をクロスブラウザ対応でラップしてある history.js を使ってみます。

history.jsjquery-history を再実装したもので、 jQuery のプラグインとしてしか使えなかったものを汎用的に再実装し、 各種ライブラリへのアダプタを用意したものです。 アダプタは YUI や Prototype などにも対応しているらしいので、 jQuery 以外の JavaScript ライブラリと組み合わせることもできます。

なお、ブラウザの履歴に関する操作は Mozilla のサイトで網羅的に解説されています。

2011年9月6日

Waf と YUI Compressor で静的ファイルを圧縮する

Waf を使って JavaScript と CSS を探し、YUI Compressor の引数に渡すことで 静的ファイルを圧縮します。

Apache Ant で YUI Compressor を使う方法は、次の英語の記事で網羅的に説明されています。

  • Building Web Applications With Apache Ant - Julien Lecomte's Blog
    • Apache Ant
    • Build types - 開発用、検証用、製品用に分けてビルドする
    • Concatenate your JavaScript and CSS files - 順番を意識してファイル内容を結合する
    • Preprocess your JavaScript files using CPP - C のプリプロセッサを使って条件付きビルドを実現する
    • Minify your JavaScript and CSS files - yuicompressor.jar を使って JavaScript と CSS を圧縮する
    • Work around caching issues - 変更のないファイルをキャッシュするためのテクニック
    • Deploy your application - サーバーにファイルを転送し、サービスを再起動する
    • Conclusion - みんながビルドプロセスを考慮すべき

この記事では yuicompressor.jar の使い方の部分だけを取り上げます。 なお、Python 関連では buildout も使えます。

2011年8月30日

2011年8月29日

JavaScriptMVC でパッケージング

JavaScriptMVC で作成したアプリケーションの配布パッケージを作成します。

一連の記事の最後になります。

2011年8月28日

JavaScriptMVC でドキュメントを生成

JavaScriptMVC で作成したアプリケーションの API ドキュメンテーションを生成します。

この記事の続きです。

2011年8月27日

JavaScriptMVC でテストを実行

実装を進める前にテストを動かしておきます。 あちこちと実装が散らかってくるとデグレードが多くなりますので、 出来るだけ手戻りがないように用意できることが望ましいと思います。

この記事の続きです。

2011年8月26日

2011年8月25日

JavaScriptMVC - 概要

JavaScriptMVCJupiter が開発/提供している JavaScript フレームワークです。 jQuery を中心に据えて、クライアントサイドの開発を助けてくれます。 JavaScriptMVC のメリットはこの辺でも触れています。

使い方をまとめて記事にしようとしたら大変だったので、 5回に分けて書く予定にします。

  1. 概要 (この記事)
  2. プロジェクトの作成
  3. テストと実装
  4. ドキュメンテーション
  5. パッケージング

Update: 一連の記事を書き終えたのでリンクにした。

2011年8月14日

Indexed Database API を使ってみる

たまには Web 系技術もキャッチアップした方が良いかな、と思っていたら、 Indexed Database API のサンプルがありましたので模写しました。

2011年2月16日

datajs を使って JavaScript で OData

OData を扱うための JavaScript ライブラリである datajs のアルファ版がリリースされました。 OData は Atom を拡張したもので、すでにいくつかの OData SDK がありましたが、 クライアントサイドのライブラリに新しく JavaScript が仲間入りした、という感じです。

ざっくりしたインターフェイスは New JavaScript library for OData and beyond (英語) および OData などに対応した軽量な JavaScript ライブラリ提供 (日本語) で紹介されている通りです。 これがどのブラウザでもサクッと動作してくれればそれでお終いなのですが、 残念ながらクロスドメインの制限がありますので、実際の動作を確認するためにはひと手間必要になります。 解決への選択肢は Cross-Domain Requests に記載されているものが挙げられます。

最初は (シリーズ化するつもりもないけど) 無難に localhost で全てのコンテンツをホストする方法で試してみます。 OData に沿った形式の XML ファイルを保存しておき、クライアントがそれを読み込んで、内容を表示することにします。

準備

まずは datajs が必要なので、プロジェクトのサイトからダウンロードします。 datajs.min.js として保存します。 次に、定番なので jQuery を使います。Google の CDN を使っても構いませんし、ローカルにダウンロードしてもどちらでも。 同様に、表示用に jQuery Template も使います。 簡単に導入できますし、JavaScript のコードも読みやすいと思いますので。

ということで、適当なディレクトリを作成し、これらを static ディレクトリに置きます (jQuery および jQuery Template の両方をダウンロードしたと仮定)。 ディレクトリの名前は odata-sample とでもしておきましょう。 さらに、適当な HTML と JavaScript のファイルを用意します。

$ tree odata-sample
odata-sample/
|-- odata-sample.html
|-- odata-sample.js
`-- static
    |-- datajs.min.js
    |-- jquery.min.js
    `-- jquery.tmpl.min.js

初期動作の確認

ベースとなる HTML ファイル (odata-sample.html) を記述します。 まずは先ほどのライブラリと、これから記述する JavaScript (odata-sample.js) を読み込みます。

<!DOCTYPE HTML>
<html lang="ja"><head>
<meta charset="utf-8">
<title>OData sample using datajs</title>
</head><body>
<div id="main">
<form method="get" action="#">
<input type="text" name="url" size="100" value="" placeholder="URL for your OData" />
<input type="submit" value="Load" />
</form>
<ul id="contents"></ul>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="/static/jquery.min.js"><\/script>')</script>
<script src="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>
<script>!jQuery.tmpl && document.write('<script src="/static/jquery.tmpl.min.js"><\/script>')</script>
<script src="/static/datajs.min.js"></script>
<script src="/odata-sample.js"></script>
</body></html>

ファイルの配置が間違っていないことを確認するために、JavaScript ファイルでは alert で何かを表示させます。

$(function() {
    alert($.template);
});

続いて、Python でHTTP サーバを起動させます (HTTP サーバは好みで)。 次のコマンドで、8080番ポートでカレントディレクトリのコンテンツを配信します。

$ cd odata-sample
$ python -m SimpleHTTPServer 8080

ブラウザで http://localhost:8080/odata-sample.html にアクセスすると、ダイアログが表示されるはずです。

OData でリクエスト

HTML に簡単な <form/> を用意しましたので、その submit イベントにハンドラを設定します。

JavaScript (odata-sample.js)

$(function() {
    $('form').submit(function() {
        try {
            var url = $(this).find('input[name=url]').val();
            OData.read(url, function (data, response) {
                console.log(data);
                console.log(response);
            });
        } catch (e) {
            console.log(e);
        }
        return false;
    });
});

実際に次のいずれかの URL を入力してフォームを送信すると、リクエストが発行されます。 しかし、クロスドメインの制限に引っかかりますので、そこでエラーになります。

これは嬉しくありませんので、取得先のコンテンツをダウンロードしておきます。 これなら先ほどの制限には引っかかりません。

$ wget -O odata-sample.atom http://odata.netflix.com/v1/Catalog/Genres

テキストボックスに /odata-sample.atom と入力してフォームを送信すると、開発者コンソールにログが出力されます。 Firebug などの開発ツールを有効にしていない場合には有効にしておきましょう。

OData を表示

開発者ツールを使って JSON の構造を見ていきます。

一見して分かるのは、レスポンスの data には results という配列が含まれることです。 Atom の <entry/> に当たります。 atom:entry<title/> を持ちますが、OData では Name になります。きっと。

つまり、

  1. data.results に対して繰り返し処理を適用し、
  2. その Name 属性を表示させると、
  3. 何かの一覧っぽく見える。

JavaScript で表現すると次のようになります。 リストアイテムを HTML っぽく記述するために jQuery Template を使っています。

$(function() {
    $.template('template', "<li>${Name}</li>");
    $('form').submit(function() {
        try {
            var url = $(this).find('input[name=url]').val();
            OData.read(url, function (data, response) {
                var dt = [];
                for (num in data.results) {
                    var entry = data.results[num];
                    dt.push({Name: entry.Name});
                }
                $.tmpl('template', dt).appendTo('#contents');
            });
        } catch (e) {
            console.log(e);
        }
        return false;
    });
});

ブラウザで実行してみると次のように音楽のジャンル一覧が表示されます。

つらつらと書いてきましたが、ここまでの内容では datajs を使う必要性はありません。 Atom もしくは Atom 拡張ならば XML ですので、普通に DOM 操作を続けていけば良いだけですね。。

__deferred

開発者コンソールの JSON をもう一度確認してみると、 Titles__deferred 属性があります。 これは OData Protocol JSON Format - Deferred Content に記述されているもので、 とても大事なものです。たぶん。

Atom にも <link/> 要素がありますので、どこかを示す、という意味ではそれで十分ですが、 関連するデータの遅延読み込みをうまく表現できません (頑張れば可能でしょうが、多くの人はそこを頑張りたくないはず)。 たとえば、あるアーティストのアルバム一覧を表現し、個別のアルバムを指定したらアルバムに含まれる曲の一覧を表現する場合などです (リソースとリソースのコレクションをドリルダウン)。 システムを実装する中では、関係データベースでの参照や外部キーなどが近しい関係とも言えます。 「今すぐはいらないけど後で必要になるかもしれないから、取得方法だけ教えて」というものですね。

さて、 __deferred 属性を見てみると url があります。 この URL のコンテンツをダウンロードしてみると、これもやはり OData 形式になっています。 つまり、 __deferred 属性を順番に辿っていくことで、ドリルダウンを続けることが可能になります。

とはいえ、そのまま読み込もうとすると、先ほどと同様にクロスドメインの制限に引っかかります。 これを解決しないと先に進めないのが難点ですが、関連するコレクションへのアクセス方法を簡単化する、という意味では datajs を使うことで 一歩前進できるのではないでしょうか。

終わりに

OData 用の JavaScript ライブラリである datajs を使ってみました。 クロスドメインの制限は大きな壁となりますが、解決方法が存在しないわけでもありませんので、何となく使えそうな気がします。 ここでは扱っていませんが、 OData.request() を使うとデータの送信もできます。

OData 自体が広く普及しているわけではありませんが、複数のサービスが共通のデータフォーマットを利用することで、 データ交換、データ統合などが進んでいくと思います。 それぞれのサービスが、自分のサービスが提供している機能を記述するサービスドキュメントも用意しないといけない気がしますが、 少しずつ前進しているのは間違いないはずです。

クラウドという雲をつかむような話が多くなってきましたが、データ構造とアルゴリズムを分離する、という前提は変わりません。 データ自体はどこかに預けておき、操作したいデータだけを手元に持ってくる、というアプローチは今後も加速していくでしょう。 その一助として OData がどれくらいの影響力を持つか。 Microsoft 次第である部分も大きいですが、たまには見ておくと良いのかな、と思いました。


NOTE:

2011年1月13日

JavaScriptMVC と一覧表示の性能

JavaScriptMVC and List Performance (jupiterjs.com) の日本語訳です。 よくある話ですが「一覧表示のパフォーマンスに気をつける」ことについて適度な粒度でまとまっていましたので、メモがてら日本語にしておきます。