パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください -11ページ目

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

こんばんは。ゆんぼうです。

今回は、Backbone.jsで、
複数要素(2つのボタン、プルダウン)を作成します。

今回使用する環境は下記の通りです。

Webブラウザ
・Mozilla Firefox (v34.05) https://www.mozilla.org/ja/firefox/new/
・FireBug (v2.0.7) https://addons.mozilla.org/ja/firefox/addon/firebug/

JavaScriptライブラリ
・Backbone.js (v1.1.2) http://backbonejs.org/
・Underscore.js (v1.7.0) http://underscorejs.org/
・jQuery (v2.1.1) http://jquery.com/



■2つのボタン (タグ文字列を追加)

【デモはこちら】
【ソースファイルはこちら】

main.js に下記の内容を記述します。


$(function() {

var SampleView = Backbone.View.extend({

events : {
'click #id_button_update' : 'onClickUpdate', // (1)
'click #id_button_delete' : 'onClickDelete', // (2)
},
render : function() { // (3)
this.$el.append('<input id="id_button_update" class="cls_button_update" type="button" value="更新"><input id="id_button_delete" class="cls_button_delete" type="button" value="削除">');
return this;
},
onClickUpdate : function() {
console.log('onClickUpdate');
},
onClickDelete : function() {
console.log('onClickDelete');
}
});

var sampleView = new SampleView();
$('body').append(sampleView.render().el);
});


(1)「id_button_update」のボタンをクリックしたときに、onClickUpdate関数が実行されます。
要素が複数ある場合は、IDまたは、スタイルのクラスを指定します。

IDを指定する場合は、ID名に「#」を付与します。
スタイルのクラスを指定する場合は、クラス名に「.」を付与します。下記の通りです。


events : {
'click .cls_button_update' : 'onClickUpdate',
'click .cls_button_delete' : 'onClickDelete',
},


(2)「id_button_delete」のボタンをクリックしたときに、onClickDelete関数が実行されます。
(3)Viewオブジェクトに2つ以上の要素を追加する場合は、
「this.$el.append()」で、自分のViewに対して、要素を追加します。

render関数は下記のように書くこともできます。
【デモはこちら】
【ソースファイルはこちら】


render : function() {
this.$el.append($('<input/>', {
'id' : 'id_button_update',
'type' : 'button',
'value' : '更新'
})).append($('<input/>', {
'id' : 'id_button_delete',
'type' : 'button',
'value' : '削除'
}));
return this;
},




■2つのボタン (テンプレートを追加)

【デモはこちら】
【ソースファイルはこちら】

自分のViewに対して、要素に追加する場合、
タグの文字列を指定しましたが、要素が複雑になると、
タグの文字列の内容を把握することが困難になります。

そこで、Underscore.js のテンプレートエンジンを使用します。

まずは、index.htmlのheadに以下の内容を追加します。
これが、Viewに追加する要素となるテンプレート用のHTMLになります。


<script type="text/template" id="template-buttons">
<input id="id_button_update" type="button" value="更新">
<input id="id_button_delete" type="button" value="削除">
</script>


次に、main.js に下記の内容を記載します。


$(function() {

var SampleView = Backbone.View.extend({

events : {
'click #id_button_update' : 'onClickUpdate',
'click #id_button_delete' : 'onClickDelete',
},
initialize : function() {
this.compiledTemplate = _.template($('#template-buttons').text()); // (1)
},
render : function() {
this.$el.append(this.compiledTemplate()); // (2)
return this;
},
onClickUpdate : function(event) {
console.log('onClickUpdate');
},
onClickDelete : function(event) {
console.log('onClickDelete');
}
});

var sampleView = new SampleView();
$('body').append(sampleView.render().el);
});


(1)initialize関数は、Backbone.Viewの予約されている関数です。
Viewオブジェクトをnewするときに呼ばれる関数です。
ここで、テンプレートのIDを指定して、Underscore.jsの_.template()を実行します。
コンパイルされたテンプレート関数が this.compiledTemplate に格納されます。

(2)render関数で、自分のViewに this.compiledTemplate を追加します。



■プルダウン

【デモはこちら】
【ソースファイルはこちら】

テンプレートを使用してプルダウンを作成します。
まず、index.htmlのheadに以下の内容を追加します。


<script type="text/template" id="template-programing">
<label for="language"><%= title %></label>
<select id="language">
<option value="<%= value.option1 %>"><%= label.option1 %></option>
<option value="<%= value.option2 %>"><%= label.option2 %></option>
<option value="<%= value.option3 %>"><%= label.option3 %></option>
<option value="<%= value.option4 %>"><%= label.option4 %></option>
<option value="<%= value.option5 %>"><%= label.option5 %></option>
</select>
</script>


次に、main.js に下記の内容を記載します。


$(function() {

var SampleView = Backbone.View.extend({

events : {
'change #language' : 'onChange'
},
initialize : function() {
this.compiledTemplate = _.template($('#template-programing').text());
},
render : function() {

var data = { // (1)
'title' : 'プログラミング言語を選択してください',
'label' : {
'option1' : 'JavaScript',
'option2' : 'Java',
'option3' : 'C言語',
'option4' : 'Ruby',
'option5' : 'Python'
},
'value' : {
'option1' : '1',
'option2' : '2',
'option3' : '3',
'option4' : '4',
'option5' : '5'
}
};
this.$el.append(this.compiledTemplate(data)); // (2)
return this;
},
onChange : function(event) {
console.log('onChange:' + event.target.value);
}
});

var sampleView = new SampleView();
$('body').append(sampleView.render().el);
});


Underscore.jsのテンプレートでは、
HTMLの中に、<%= title %> と指定すると、titleのプロパティ値が出力されます。

(1) テンプレートで出力するオブジェクトを設定します。
(2) this.compiledTemplate 関数の引数に(1)のオブジェクトを引数で渡します。

以上です。



□過去の記事

Backbone.js入門その1「Backbone.Viewで1つの要素を作る」
こんばんは。ゆんぼうです。

今回は、Backbone.jsで、
単一要素(ボタン、テキストボックス、リンク)を作成します。

Backbone.jsとは、JavaScriptライブラリの一つで、
クライアントサイドのMVCフレームワーク機能を提供します。
Backbone.js のMVCは下記の通りです。

Model
・Backbone.Model … データの保持、更新、Ajax通信など
・Backbone.Collection … Backbone.Modelのリスト化、追加、削除、並び替えなど

View
・Backbone.View … イベントハンドリング、DOM操作など

Controller
・Backbone.Router … URLの監視
・Backbone.History … Routerの履歴監視


Controller はシングルページアプリケーションで
有効な機能ですので、そうではないアプリケーション
例えば、HTMLファイルでページが分かれているような
アプリケーションでは必要ではありません。

今回読者の対象は下記の通りです。
・JavaScriptやjQueryを触ったことがある人
・シングルページアプリケーションに興味がある人



■準備

今回使用する環境は下記の通りです。

Webブラウザ
・Mozilla Firefox (v34.05) https://www.mozilla.org/ja/firefox/new/
・FireBug (v2.0.7) https://addons.mozilla.org/ja/firefox/addon/firebug/

JavaScriptライブラリ
・Backbone.js (v1.1.2) http://backbonejs.org/
・Underscore.js (v1.7.0) http://underscorejs.org/
・jQuery (v2.1.1) http://jquery.com/


それでは、Viewから作成します。
まずは、HTMLファイル(index.html)を作成します。


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Backbone.js sample</title>
<script src="../../lib/jquery-2.1.1.js"></script>
<script src="../../lib/underscore.js"></script>
<script src="../../lib/backbone.js"></script>
<script src="main.js"></script>
</head>
<body></body>
</html>


HTMLファイルのhead部分に、JavaScriptライブラリを読み込みます。
Backbone.js は、jQuery及び Underscore.jsを前提に動作しますので、
必ずこの順番で読み込みます。
最後に、main.js を読み込みます。今後はこのファイルを編集していきます。



■デフォルトView

【デモはこちら (※何も表示されません。FireBugのHTML解析で確認ください。)】
【ソースファイルはこちら】

main.js に下記の内容を記述します。


$(function() {

var SampleView = Backbone.View.extend({}); // (1)

var sampleView = new SampleView(); // (2)
$('body').append(sampleView.el); // (3)
});


(1)Backbone.jsのViewは、Backbone.View.extend()関数を使用します。
この関数の引数に、プロパティや関数を設定することでViewを定義します。
ここでは、何も設定していません。
(2)new することで、Viewのオブジェクトを生成します。
(3)bodyに対して、Viewオブジェクトのel要素を追加します。

FireBugでbodyの構成を見てみると、
divタグが追加されていることがわかります。


<div></div>




■カスタムView

【デモはこちら】
【ソースファイルはこちら】

次に、Viewにプロパティを設定します。


$(function() {

var SampleView = Backbone.View.extend({
tagName : 'input', // (1)
className : 'class_input', // (2)
id : 'id_input', // (3)
attributes : { // (4)
type : 'button',
value : '更新'
}
});

var sampleView = new SampleView();
$('body').append(sampleView.el);
});


(1)「tagName」には、タグ名を設定します。
(2)「className」には、スタイルシートのクラス名を設定します。
(3)「id」には、IDを設定します。
(4)「attributes」には、属性を設定します。
tagName、className、id、attributes は、Backbone.jsで予約されているプロパティ名です。

bodyには、inputタグが追加されています。


<input id="id_input" class="class_input" type="button" value="更新">




■Viewのイベント

【デモはこちら】
【ソースファイルはこちら】

ボタンをクリックしたときの処理を作成します。


$(function() {

var SampleView = Backbone.View.extend({
tagName : 'input',
className : 'class_input',
id : 'id_input',
attributes : {
type : 'button',
value : '更新'
},
events : {
'click' : 'onClick' // (1)
},
onClick : function(event) { // (2)
console.log('onClick');
}
});

var sampleView = new SampleView();
$('body').append(sampleView.el);
});


(1)「events」には、イベント名と関数名を記述することで、イベントを監視します。
(2)クリックしたときの関数を作成します。
eventsも、Backbone.jsで予約されているプロパティ名です。

クリックしたときに、onClick関数が実行されて
コンソールログが出力します。



■Viewのイベントの集約

【デモはこちら】
【ソースファイルはこちら】

eventsプロパティには、複数設定することができます。


$(function() {

var SampleView = Backbone.View.extend({
tagName : 'input',
className : 'class_input',
id : 'id_input',
attributes : {
type : 'button',
value : '更新する'
},
events : {
'click' : 'onClick',
'mouseover' : 'onMouseover', // (1)
'mouseleave' : 'onMouseleave' // (2)
},
onClick : function(event) {
console.log('onClick');
},
onMouseover : function(event) {
console.log('onMouseover');
},
onMouseleave : function(event) {
console.log('onMouseleave');
}
});

var sampleView = new SampleView();
$('body').append(sampleView.el);
});


(1)マウスオーバーしたときに、onMouseover 関数が実行されます。
(2)マウスが離れたときに、onMouseleave 関数が実行されます。



■テキストボックス

【デモはこちら】
【ソースファイルはこちら】


テキストボックスを作成します。


$(function() {

var SampleView = Backbone.View.extend({
tagName : 'input',
className : 'class_input',
id : 'id_input',
attributes : {
type : 'text'
},
events : {
'change' : 'onChange' // (1)
},
onChange : function(event) {
console.log('onChange');
}
});

var sampleView = new SampleView();
$('body').append(sampleView.el);
});


(1)フォーカスが外れたときに、onChange 関数が実行されます。



■リンク

【デモはこちら】
【ソースファイルはこちら】

リンクを作成します。


$(function() {

var SampleView = Backbone.View.extend({
tagName : 'a',
className : 'class_a',
id : 'id_a',
attributes : {
href : 'javascript:void(0)' // (1)
},
events : {
'click' : 'onClick' // (2)
},
render : function() {
this.$el.html('これは、リンクです'); // (3)
return this;
},
onClick : function(event) {
console.log('onClick');
}
});

var sampleView = new SampleView();
$('body').append(sampleView.render().el); // (4)
});


(1)href属性を「javascript:void(0)」に設定して、勝手にリンクが実行されることを抑制します。
(2)クリックすると、onClick関数が実行されます。
(3)render関数にて、リンクに表示する文字列を設定します。
(4)render関数を呼び出してからel要素をbodyに追加しています。

render関数は、Backbone.jsで予約されている関数ではありませんが、
jQuery関数のappend()やhtml()を使用する処理を render関数に実装します。
また、el要素をbodyに追加するときに、render関数も繋げれて呼び出せるように
「return this」を記述しています。
render関数は、Backbone.jsのデザインパターンの一つです。

以上です。

こんにちは。ゆんゆんです。

WebAPIを使用したサーバークライアントシステムの開発において、
APIの仕様が決まれば、通常は同時進行で、サーバーとクライアントの開発が行われます。
そのため、クライアント側は、サーバーが完成していない状態で開発を進めないといけません。
そこで、モックサーバーの出番です。
モックサーバーでは、特定のリクエストに対して、特定のレスポンスを返します。

モックサーバーを使用するメリットは以下の通りです。
・サーバー側の完成を待たずに、クライアント開発ができる。
・安定して動作確認ができる。

今回は、WebAPIモックサーバーを簡単に作成できる node-easymock を紹介します。



■node-easymock のインストール

今回の動作確認した環境は以下の通りです。

・Windows 7 SP1 64bit
・Node.js v0.12.9

node-easymock は、Node.js 上で動作します。
まず、Node.js をインストールします。
下記のサイトで、「node-v0.12.9-x86.msi」をダウンロードして、インストールしてください。
Node.js (v0.12.9)のダウンロード

インストール後、コマンドプロンプトを起動します。
以下のコマンドを実行して、Node.js がインストールされていることを確認します。

$ node -v
v0.12.9

$ npm -v
v2.14.9

以下のコマンドを実行して、node-easymock をインストールします。

$ npm install -g easymock



■node-easymock のリソースの作成

以下のコマンドを実行して、node-easymock が起動します。

$ easymock

起動したフォルダ以下に、レスポンス用のJSONファイルを作成します。
例えば、「GET /books」 リクエストした場合、books_get.json ファイルの内容を返却します。
[リソース名]_[HTTPメソッド].json 形式のファイルを作成するだけで良いのです。

GitHub にサンプルのJSONファイルを用意しました。
「api」フォルダを node-easymock 起動フォルダにコピーします。
【サンプルはこちら】



■node-easymock の動作確認

Chromeアプリの REST クライアントを使用すれば
簡単に動作確認ができます。
Advanced REST clientのダウンロード

REST クライアントで以下のURLにアクセスしてみましょう。

JSONファイル: /api/1.0/users_get.json
1. [URL]を入力する。: http://localhost:3000/api/1.0/users
2. [GET]選択して、[SEND]ボタン押下する。

JSONファイル: /api/1.0/users_post.json
1. [URL]を入力する。: http://localhost:3000/api/1.0/users
2. [POST]選択して、[SEND]ボタン押下する。

JSONファイル: /api/1.0/users/user-id-001_get.json
1. [URL]を入力する。: http://localhost:3000/api/1.0/users/user-id-001
2. [GET]選択して、[SEND]ボタン押下する。

JSONファイル: /api/1.0/users/user-id-001_put.json
1. [URL]を入力する。: http://localhost:3000/api/1.0/users/user-id-001
2. [PUT]選択して、[SEND]ボタン押下する。

JSONファイル: /api/1.0/users/user-id-001_delete.json
1. [URL]を入力する。: http://localhost:3000/api/1.0/users/user-id-001
2. [DELETE]選択して、[SEND]ボタン押下する。



■node-easymock の便利な機能

◆ポートの変更

デフォルトのポートは 3000 です。
起動時に、-p オプションで任意のポート番号を指定することができます。

$ easymock -p 3001


◆API一覧の表示

以下のURLで、API 一覧を確認することができます。
APIをクリックすると、レスポンスを確認することができます。

API Documentation
http://localhost:3000/_documentation/


◆アクセスログの表示

以下のURLで、アクセスログを確認することができます。

Access Logs
http://localhost:3000/_logs/


◆レスポンスヘッダーの追加

JSONファイルに 「< @header」を追加すると、レスポンスヘッダーを付与することができます。


< @header Location: http://www.pa-rk.co.jp/
{
"userId":"user-id-002",
"userName":"Toyotomi Hideyoshi",
"gender":"male",
"age":"62",
"birthDay":"1536/02/02",
"address":"Osaka",
"message":"try cry hototogisu"
}



◆HTTPステータスの変更

デフォルトのHTTPステータスは 200 です。
JSONファイルに 「< @status」を追加すると、HTTPステータスを変更することができます。


< @status 401
{
"error":{
"status":401,
"message":"Unauthorized"
}
}



◆設定ファイル

node-easymock の起動フォルダに、設定ファイル config.json を置くことができます。


◆応答待ち時間の設定

設定ファイルにおいて
「simulated-lag」で応答待ち時間を設定することができます。単位はミリ秒です。


{
"simulated-lag": 1000
}


特定のパスだけ、応答待ち時間を変更することもできます。


{
"simulated-lag": {
"default": 1000,
"paths": [
{
"match": "user-id-003",
"lag": 5000
}
]
}
}



◆クロスドメイン通信エラーの回避

CORS(Cross-Origin Resource Sharing) とは、
WebブラウザがHTMLを読み込んだ以外のサーバからデータを取得する仕組みです。
各ブラウザは、クロスドメイン通信をエラーとする仕組みがあるため、
このエラーを回避する設定ができます。


{
"cors": true
}


以上です。

スリープソートは 2011 年に考案された新進気鋭のソートアルゴリズムです。
そのあまりの斬新さに感動してしまったちかです
ということで自分でも実装してみました。

Go 言語と D 言語の比較記事ではありません。あしからず。
Go 言語や D 言語の解説記事でもありません。あしからず。

Go 言語

package main
 
import "time"
 
func sleepsort(values []uint) <-chan uint {
    sortedChannel := make(chan uint)
    for _, value := range values {
        go func(value uint) {
            time.Sleep(time.Duration(value) * time.Second)
            sortedChannel <- value
        }(value)
    }
    return sortedChannel
}
 
func main() {
    values := []uint{ 5, 2, 19, 11, 7, 13, 3, 17 }
    sortedChannel := sleepsort(values)
    for range values {
        println(<-sortedChannel)
    }
}

D 言語

import std.stdio;
import std.parallelism;
import core.thread;
 
unittest
{
    uint[] result;
    sleepsort!(x => result ~= x)([2, 1, 4, 0, 2]);
    assert(result == [0, 1, 2, 2, 4]);
}
void sleepsort(alias callback)(uint[] values)
{
    auto pool = new TaskPool(values.length);
    foreach (value; pool.parallel(values))
    {
        Thread.sleep(value.seconds);
        callback(value);
    }
    pool.finish(true);
}
 
void main()
{
    sleepsort!writeln([5, 2, 19, 11, 7, 13, 3, 17]);
}

アルゴリズム

スリープソートのアルゴリズムは非常にシンプルです。
「値に比例する時間だけスリープしたあと値を出力する」という処理を全要素で一斉に行います。

私は「その発想はなかった!」と感動したのですが、いかがでしょうか。

Go 言語の実装では、要素数分の goroutine (軽量スレッド) を立ち上げて、
各 goroutine で要素値 [秒] だけスリープしたあとチャネルに値を渡しています。

D 言語の実装では、要素数分のタスクプールを作って、
各タスクで要素値 [秒] だけスリープしたあとコールバック関数に値を渡しています。

参考


<<<第五回 まとめ>>>

  業務の中で端末構築を経験して苦労したのは、
   ・がちがちに端末の操作を固めてしまわないといけない
   ・認証に関連する動作確認
   ・プラットフォームを移植したアプリの検証
   ・動きがおかしいときの調査
   ・サーバに引きずられる仕様の確認
  といったようなものだった。
  MSに聞かないと分からないもの(広報されていないバグ的な動き)が幾つか発生した。
  MSに聞ける窓口を持たないと、構築時の不具合をきれいに解消することは難しいと感じた。
  Ex:starup関連など

 以上。