SlideShare a Scribd company logo
1 of 47
Download to read offline
お手軽
AJAXアプリケーション
の作り方
株式会社FLECT
小西俊司
この文書の目的






画面遷移のない1画面で色々なことを行うアプリ
ケーションをなんとなく作れるようになる
JavaScriptをオブジェクト指向的に使えるように
なる
ついでに読みやすいコードとはどういうものかを
ちょっと考える
題材 – Herokuのログ解析ツール



http://flect-papertrail.herokuapp.com
https://github.com/shunjikonishi/papertr
ail-log-analyze
Ajaxで行っている機能





カレンダーをクリックするとその日のログをグリッドに表示
グリッドで行選択するとその行をグラフ化(ボタンでグラフ切り替え)
設定画面
ログダウンロード





ログの解析処理自体はJavaのライブラリなので対象外
サーバーサイドはScalaで書いているが別に言語はなんでも良い




この文書のテーマは全体としてAjaxアプリケーションをどのように組み立てる
か?という部分にあるので個別機能は特に説明しない

サーバーサイドのソースは読まなくてもこの文書の内容はわかるはず

スクリプトのソース


https://github.com/shunjikonishi/papertrail-loganalyze/blob/master/public/javascripts/loganalyzer.js
説明の前に質問


プログラムを書く上で一番重要だと思うこと、また
は一番気をつけていることはなんですか?
小西の回答


同じレイヤの用語で主語と述語が整合しているこ
と
 ここでいうレイヤとは「アプリケーション」とか「ライブラ

リ」といったプログラムの粒度のこと
 レイヤは「コンテキスト」と言い換えても良い
 コンテキスト=文脈

 主語=クラス、述語=メソッドと考えて問題ない

とりあえず頭の片隅にこれをおいて聞いてください。
全体構成編
画面構成を決める


まず全体の画面構成を大まかに決める
 適当にdivを配置してCSSで位置決め
 Divの中身は空で良い





Bootstrapなど画面上部にメニューを配置するラ
イブラリを使うとなんとなくアプリっぽくなる
Splitterを使って2ペインまたは3ペインのリサイ
ズ可能な領域を作るとそれだけでもちょっといい
感じに見える
JavaScriptのインクルード


UIの部品となるJavaScriptライブラリは山ほどある
ので適当に使うものを拾ってくる
ライブラリは個別にフォルダを作ってCSSやLICENSEファ
イルなども含めて一つのフォルダ内にぶち込む
 ファイル名にバージョン番号が入っている場合はけずる
 こうすることでバージョンアップが容易になる(原則ライブ
ラリは常に最新版を使う)




JQuery, JQueryUIなどCDNがあるものは出来るだ
けCDNのものを使う


この場合バージョン番号をけずれないので、共通ヘッダ部
分でインクルードするなどして1カ所にまとめる
HTML内に書くJavaScript




どんなアプリを作る場合でもワンパターン
グローバル変数として「app」を宣言
ドキュメントReadyで


アプリの引数の宣言(サーバーサイドでジェねる)






ログインのあるアプリの場合はユーザー名やユーザーIDがここでの引数になる
数が多い場合はハッシュにする

アプリのインスタンスの作成

アプリ本体の定義は別のjsファイルにする

HTML内にはこれ以外

<script>
のコードは書かない
var app;
(多くの場合HTMLは
$(document).ready(function() {
テンプレートで生成するので
var name = "loganalyzer",
行番号が合わずデバッグが面倒)
passRequired = true,
offset = 9;
app = new flect.app.loganalyzer.LogAnalyzer(name, passRequired, offset);
});
</script>
Jsファイルの構成


最初に名前空間を形成するハッシュを生成





定義本体は無名関数の中で行う




Javaのパッケージみたいなもの
別になくても良いが毎回行うように習慣づける
出来るだけGlobal名前空間を汚さない

アプリケーションクラスを定義

if (typeof(flect) == "undefined") flect = {};
if (typeof(flect.app) == "undefined") flect.app = {};
if (typeof(flect.app.loganalyzer) == "undefined") flect.app.loganalyzer = {};
(function ($) {
…
flect.app.loganalyzer.LogAnalyzer = function(name, passRequired, timeOffset) {
…
}
})(jQuery);
無名関数内の構成


無名関数内の定義もほぼワンパターンで以下のよう
になる


順不同


JavaScriptは同一ブロック内で定義した変数・関数は定義順に
関わらず参照できるので

(function ($) {
部品となるクラスの定義
 列挙型の定義
 アプリケーション本体の定義


})(jQuery);
アプリケーションクラス



いわゆるコントローラ
コンストラクタ内でやること
 ボタンとfunctionのバインド

 Calendar等のUIオブジェクトの生成
 部品クラスの生成
 公開メソッドの定義($.extend(this,


{…}))

公開メソッドはどこで使用するか?(後述)
 部品クラス
 インラインフレーム内のスクリプトから実行
列挙型



JavaScriptに列挙型はないが擬似的に定義することは可能
列挙型テンプレート







列挙型を使用するべき場合






https://gist.github.com/shunjikonishi/5493754
任意のハッシュの配列をとって列挙型を形成
コード、名前、テキストから列挙値を返却する関数が定義されている
(fromXXXX)
列挙型はHTML内でSELECT要素にバインドされることが多いのでそ
のためのヘルパー関数がある(bindSelect)
DB上に値がコードで格納されている
プログラム上では名前で扱いたい
表示に使用する値が名前とは異なる

今回の例ではコードやテキストは必要なかったのでfromCode,
fromTextなどの不要関数はけずっている
列挙型の生成




コンストラクタの引数はハッシュの配列
ハッシュにはname属性が必須
あとは任意に必要な情報をハッシュに含めてよい

//Enums
var CacheStatus = new Enum([
{ "name" : "Unprocessed"},
{ "name" : "Ready"},
{ "name" : "Found"},
{ "name" : "NotFound"},
{ "name" : "Error"}
]);
var GridKind = new Enum([
{ "name" : "Count", "path" : "/logcount"},
{ "name" : "Time", "path" : "/responsetime", "drawOnLoad" : "log-2"},
]);

//使用例
var status = CacheStatus.fromName($(“#selStatus”).val());
if (status == CacheStatus.Unprocessed) {
…
}
部品クラス


コンストラクタの引数はアプリケーションクラスとラップ
する要素(jQueryオブジェクト)とすることが多い
要素のセレクタ参照は1回のみとしあとは使い回す
 必要に応じて引数は増える


中身は以下のような感じ
function Calendar(app, div) {


変数宣言
 クロージャ関数定義
 $.extend(this, {…})で関数を公開


}



ここで公開されない関数はprivateとなる
$.extendによるメソッド公開
function Chart(app, elementId) {
var currentData = currentKind = null,
lineCol = "ms";

← 最初に変数宣言

function lineName() {
← 内部で使用する関数定義がずらずらと続く
...
}
function lineColor() {
...
}
function axis2Name() {
...
}
function draw(kind, data) {
...
}
function changeLine() {
...
}
$.extend(this, {
← 外部に公開する関数の定義
"draw" : draw,
"changeLine" : changeLine
});

クロージャを公開する
ことでクラスのように扱
えるようにしているので
クロージャスタイルと
呼んでいる

}
JavaScriptにおけるクラス


Prototypeを使うんじゃないの?




クロージャスタイルの利点





ローカル変数をprivate変数として使用できる
thisキーワードを使用する機会が減る

Prototypeの場合は。。。






一般的にはそうです

変数/関数の参照にいちいちthisキーワードが必要
Private変数が使用できない
同じクラスのインスタンスを何回も作成する場合はprototypeの方が
効率が良いはず(クロージャはインスタンス毎に作成されるため)

たくさんのインスタンスを生成するクラスでない限りクロージャスタ
イルで十分


スクリプトファイルを複数に分割するような大規模アプリの場合も
prototypeを使用することが多い
Appをコンストラクタの引数にすること
の是非


実はあんまりよろしくない





疎結合にしようとするとイベントをfireするコードを書く羽目になる
のでめんどくさい




ので、小物アプリの場合はあまり密結合は気にしない

あるクラスのコンストラクタ内で使用するメソッドは、それ以前に実
行可能な状態になっていなければならない。





密結合になる
コンストラクタ実行時にAppが完全に生成されていない

このためApplicationクラスでは$.extendが変数宣言(クラスの生
成)よりも前にある
場合によってはクラス生成の順序も関係してくる

イマイチ気に入る代替方法がないので問題があることを承知で
使っている。
JavaScriptでのgetter/setter


jQueryスタイルに統一




jQueryスタイルとは





何故ならjQueryは必ず使うので自分のコードとjQueryでスタ
イルが違うのが気持ち悪い

GetterとSetterが同じメソッド名で引数の有無で処理を分岐
Setterはthisを返す

アプリ内でスタイルが統一されていれば何でも良いと思う。
var current;
function currentDate(d) {
if (d !== undefined) {
current = d;
return this;
} else {
return current;
}
}
Ajax編
Httpメソッドとして何を使うか?


Ajaxでしか使わないならPOSTを使用する
 リソースの更新の有無とかはあまり考えなくて良い
HttpStatusコードは何にするか?




原則エラーが発生した場合でもステータスコードは200で
返し、ボディ内の情報にエラー情報を含めるようにする
例外









サーバーサイドのバグ – 500
DB、ネットワーク等の障害 – 500 or 503
引数の不正などクライアントサイドの不適切なリクエスト – 400
GETでかつリソースアイデンティティがURLの一部となっている
場合のNotFound – 404
例) 商品詳細画面 - /product/1

自前のスクリプトからは200以外のコードが返ることを想
定したリクエストは発行しない


逆に言えば200以外のステータスがかえってきた場合はバグ
がある可能性が高い
レスポンスとして何を返すか?


だいたい以下の3パターン
 JSON(content-type=application/json)
 テキスト(content-type=text/plain)

 HTML(content-type=text/html)


コンテントタイプは必ず適切に設定する
 たいていはフレームワークがやってくれるはず

 JSONを自前でStringとして組み立てるとほとんどの

場合デフォルトで「text/plain」となるので注意が必
要
JSON




基本はJSONを返してそれをクライアント側で加工
一番このバターンが多い
応用範囲が広く色々なケースに適用可能
テキスト




手抜きパターン
でも割と良く使う
よくある例


「OK」が返ってきたら成功、それ以外はエラーメッセージと
して画面に表示する





Javaで言うところのvoidを返すメソッドのイメージ

列挙型の名前を返す

必要に迫られた時にJSONに変えれば良いので最初
から考えすぎずにテキストで十分な場合はテキストを
使う


経験上後から変更するケースはほとんどない
HTML


HTMLをそのまま返すパターン
Html要素やbody要素はつけずにコンテンツのみ
 jQuery.htmlで丸ごと差し込み






そこそこ凝った画面はスクリプトで生成するよりもサー
バーサイドで生成したHTMLをそのまま使用した方が
良い
よくある例
選択されたアイテムに対する詳細画面の表示
 設定画面等必ず使うとは限らない画面をダイアログ表示
する場合




jQueryUI-Dialogを使う場合は一つの要素を複数のダイアロ
グで内容を書き換えながら使い回すこともある
$.ajaxでのハンドリング


レスポンスに対する処理は「success」で行う





少なくとも開発時には「error」にエラー内容を通知する処理を書く






開発中の400系、500系はほとんどバグ
alertとかconsole.logで十分
$.ajaxSetupで共通処理としても良い。

運用時の「error」はアプリのポリシーで決める






「レスポンスとして何を返すか?」の項に書いた通り、エラーも含めて200で返
す方針としておけばシステムの想定内の処理はすべてここで行えるはず。
長い処理をここに直接書かない

500系のエラーはリソースの枯渇や障害の可能性がある
でも一番多いのは多分バグ
「予期しないエラーが。。。」みたいなメッセージを表示するとか、握りつぶすと
か。(--

「complete」はあまり使わない



と言っても例外はある。
例えばbeforeSendとセットで通信にかかった時間を計測したりとか
セキュリティ


メイン画面を表示する時にサーバー側でなんらかのセッション情報を保
存しておく






各ajaxリクエストで以下の二つをチェック
セッションがサーバー側の保存情報と整合すること




これにより呼び出し元が自アプリであることがわかる

といいつつサンプルアプリではやってなかったりして。。。(-



これにより同一ブラウザからの一連リクエストであることがわかる

httpヘッダ「referer」がメイン画面であること




セッションIDはCookieに保存(たいていのフレームワークは自動でやってくれ
るはず)
ログインを伴うアプリの場合はユーザー情報を保存

Play2でセッションIDがないのが未だに信じがたくどうしたものかと。。。

いずれにせよこれだけでセキュリティが担保される訳ではないのでIP制
限等アプリ毎に必要なセキュリティ要件は考える必要がある
ダウンロード/アップロード編
ダウンロード


GETを使う場合




Window.openを使う
「content-type=application/octet-stream」としておけば
ファイル保存ダイアログが表示される





他に適切なcontent-typeがあればそちらを使う

IEでは「referer」が付かない(IE10は未検証)

POSTを使う場合




<form target=“_blank” method=“POST”>を使う
パラメータをすべて「hidden」にしておけば画面からは見えな
い
画面から完全に隠したい場合は
「style=“position:absolute;top:0;left:-1000」のように負
の座標に絶対位置を指定する
アップロード - Form


こんな感じ



隠しフォームに必要なパラメータをhiddenで配置
Targetに非表示のiframeを指定

<form id="uploadForm" action="/xxxx"
method="post" enctype="multipart/form-data"
target="uploader”
style="position:absolute;top:0px;left:-1000px;">
<input type="hidden" id="upload_id" name="id"/>
<input type="file" id="upload_file" name="file” />
</form>
<iframe id="uploader" name="uploader" src=””
style="width:0px;height:0px;border:0px;"></iframe>
アップロード – Script


ボタンを押した時にアップロードを実行するならこんな感じ


ボタンのonClickでファイルパラメータにnullを設定してクリックイベントをfire




ファイル選択ダイアログが表示される

ファイルパラメータのonChangeでフォームをサブミット

$(“#btnUpload”).button().click(function() {
$("#upload_id").val(…);
$("#upload_file").val(null).click();
});
$("#upload_file").change(function() {
var filename = $(this).val();
if (filename) {
$("#uploadForm")[0].submit();
}
});
アップロード - Response


アップロードのレスポンスはこんな感じ




ScriptのみのHTML
自分に親frameがいることを確認し、親フレームにグローバル変数と
して「app」があることを確認し、そのメソッドを実行
実行する処理がここに直接記述されず、appのメソッドになっていると
ころが重要


ロジックを分散させない
<html><body>
<script>
var ret = {//サーバーサイドで生成};
if (window.parent && window.parent.app) {
window.parent.app.handleUpload(ret);
}
</script>
</body></html>
国際化編
言語ごとに別のJSをインクルード


太古の昔からワンパターン
 サーバーサイドでHTTPヘッダ「accept-language」

からブラウザの言語を判断
 Cookieに言語を持たせる場合もある

 言語ごとにインクルードするスクリプトを差し替える

<script src='/i18n/ja/messages.js'></script>
スクリプトの中身



ハッシュにひたすらメッセージを定義
Format用の関数を定義しておくと便利
if (typeof(flect) == "undefined") flect = {};
if (typeof(flect.app) == "undefined") flect.app = {};
if (typeof(flect.app.loganalyzer) == "undefined") flect.app.loganalyzer = {};

flect.app.loganalyzer.MSG = {
"name" : "名前",
…
"format" : function(fmt) {
for (i = 1; i < arguments.length; i++) {
var reg = new RegExp("¥¥{" + (i - 1) + "¥¥}", "g")
fmt = fmt.replace(reg,arguments[i]);
}
return fmt;
}
}
フレームワークで生成


サーバー側のフレームワークに国際化対応の枠組み
があるならそれを利用すると良い。
「ui.xxxx」のように「ui.」で始まるキーだけを収集して動
的にスクリプトを生成するなど
 一度作ってしまえば毎回同じものが使い回せる




Playframework1用のテンプレート




https://gist.github.com/shunjikonishi/5493795

Playframework2用のテンプレート


https://gist.github.com/shunjikonishi/5493788
おまけ
同じレイヤの用語で主語と述語が整合してい
るとはどういうことか?
(クライアントサイドの話に限りません)
たとえばCalendar
function highlight(d) {
calendar.find(".fc-state-highlight").removeClass("fc-state-highlight");
calendar.find("td[data-date=" + formatDate(d) + "]").addClass("fc-state-highlight");
}



上のコードはCalendar上で選択された日付をハイライトさせる処
理






以前の日付から色づけ用のクラスを取り除いて選択された日付にそ
のスタイルを付加
なんならワンライナーでも書ける
呼び出し箇所は一カ所だけ

しかしそれでも名前をつけてメソッド化するべき




何故ならアプリの要件は「カレンダーを、ハイライトする」ことだから
どうやって色付けするかはアプリレイヤの話ではない
アプリレイヤのコードを追っている時にそれ以外のコードが挟まると
思考が中断される
たとえばjqGrid



ものすごい高機能なグリッドライブラリでよく使う
メソッド名も比較的わかりやすい
 しかし全く覚えられないので毎回リファレンスを参照し

ながら使っている
 ↑アプリのことを考えている時にはこのへん全く関係
ない


jqGridのメソッドはあくまでjqGridの用語なので、
メソッドの中身が1行しかないとしてもアプリの用
語で何をしているのかを再定義して使用する
Chart







とりあえずFlotr2を使用しているが、チャートライブラ
リは数が多すぎて何を使うのが良いのかイマイチよく
わからない
しかもチャートはどれも使い方が独特
しかし、アプリの用語としては「グラフを、描く」だけで
完結することが多い
思考を中断させないためにチャートのコードは分離す
る


チャートライブラリの変更に対応しやすくする意図もある
が、それよりも思考のコンテキストスイッチが発生しない
目的の方が重要。
列挙型





いわずもがな
コードはアプリの用語ではない
名前はアプリの用語で定義する
サーバーサイドでは広く使用されているが、スクリ
プトでは直接コードを書いているケースの方が多
い気がする
どうすれば主述が整合するか?



特別なことは何もない
ある処理の仕様を日本語で説明した際に
主語と述語がなんであるか?
 その用語がどのレイヤの用語であるか?








を意識するだけ。
口頭ではほとんどの人が無意識にレイヤを適切に分
けて説明できているので、そのままコードに落とせば
よい
だがしかし。。。
実例 – 再認証チェック


ユーザーログインを伴うアプリで







ある処理を実行するためにはユーザーにパスワードの再入力を行わ
せる必要がある
ユーザーが再認証済みであるかどうかはキャッシュにオブジェクトが
あるかどうかで判断
再認証の有効期間は10分

最初のはアプリの話で、残りは実装の話
上に書いたとおりに作れば以下のようなコードになる


「ユーザー」が主語で「再認証済みか」が述語

Public class User {
private int userId;
…
public boolean isReauthenticated() {
return Cache.get(“reauth-” + this.userId) != null;
}
}
実例 ー 再認証チェック


しかし実際に書かれたのはこんな感じのコード


CacheKeyはキャッシュのキーを管理するクラス

…
if (Cache.get(CacheKey.getReauthenticationKey(user.getId())) != null) {
…
}








言葉で説明する時にはあった「再認証」という用語が省略されて直接
キャッシュを読みだしている
間違ってない。間違ってないし関係者は全員何がやりたいのかはわかる
んだけど。。。コードを読むのに脳内コンテキストスイッチが発生する
コンテキストスイッチはコストの高い処理なので処理内容を理解するまで
にかかる時間はわずかながら増大するし、疲れる
 処理内容を言葉で説明する際に「再認証」で済む所を毎回「キャッ
シュに再認証のキーがあったら」と言っていたらものすごいストレス
になるはず
要するにこれは最適化バグのようなもので、コンテキストスイッチをでき
る限り回避できるコードを書くことが重要
まとめ



アプリ開発は数学よりも国語力
名前重要
言葉で説明する時に存在した用語がコード上に存在しい
場合は最適化バグを疑う
 コードを日本語に変換しながら音読して違和感がある場
合はコンテキストが切り替わってないか検討する




主語、述語、コンテキスト等、説明に使っている言い
まわしは変わっているけど実は言ってることはオブ
ジェクト指向の教科書に載っていることと同じ


これが無意識にできるようになれば小規模アプリの開発
はほとんど作文みたいなもの

More Related Content

What's hot

Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
モテる JavaScript
モテる JavaScriptモテる JavaScript
モテる JavaScriptOsamu Monoe
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までMasahiro Wakame
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Akira Inoue
 
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介Yuki Fujisawa
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門spring_raining
 
JavaScript MVC入門
JavaScript MVC入門JavaScript MVC入門
JavaScript MVC入門大樹 小倉
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
Angular js or_backbonejs
Angular js or_backbonejsAngular js or_backbonejs
Angular js or_backbonejsOmasa Yusaku
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
Deep dive into instanceof
Deep dive into instanceofDeep dive into instanceof
Deep dive into instanceofHiroshi Saito
 

What's hot (20)

覚醒!JavaScript
覚醒!JavaScript覚醒!JavaScript
覚醒!JavaScript
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
モテる JavaScript
モテる JavaScriptモテる JavaScript
モテる JavaScript
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 
いまさらJavaScript
いまさらJavaScriptいまさらJavaScript
いまさらJavaScript
 
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
Nds#24 単体テスト
Nds#24 単体テストNds#24 単体テスト
Nds#24 単体テスト
 
JavaScript MVC入門
JavaScript MVC入門JavaScript MVC入門
JavaScript MVC入門
 
Backbone.js入門
Backbone.js入門Backbone.js入門
Backbone.js入門
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
前期講座08
前期講座08前期講座08
前期講座08
 
Angular js or_backbonejs
Angular js or_backbonejsAngular js or_backbonejs
Angular js or_backbonejs
 
JavaScript 研修
JavaScript 研修JavaScript 研修
JavaScript 研修
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
Deep dive into instanceof
Deep dive into instanceofDeep dive into instanceof
Deep dive into instanceof
 

Viewers also liked

2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」
2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」
2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」aitc_jp
 
AjaxとFlashのDWRサンドイッチ、Springを添えて
AjaxとFlashのDWRサンドイッチ、Springを添えてAjaxとFlashのDWRサンドイッチ、Springを添えて
AjaxとFlashのDWRサンドイッチ、Springを添えてkenstar
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツShunji Konishi
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境Masashi Shinbara
 
Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]Masashi Shinbara
 
Keypoints html5
Keypoints html5Keypoints html5
Keypoints html5dynamis
 
オブジェクト指向やめましょう
オブジェクト指向やめましょうオブジェクト指向やめましょう
オブジェクト指向やめましょうなおき きしだ
 
EcmaScript 仕様書を読もう
EcmaScript 仕様書を読もうEcmaScript 仕様書を読もう
EcmaScript 仕様書を読もう彰 村地
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
機械学習と深層学習の数理
機械学習と深層学習の数理機械学習と深層学習の数理
機械学習と深層学習の数理Ryo Nakamura
 
機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual TalksYuya Unno
 

Viewers also liked (15)

2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」
2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」
2015年7月期AITC女子会「Ajax/Comet/WebSocket/MQTT 概要紹介」
 
Ajax&pjax
Ajax&pjaxAjax&pjax
Ajax&pjax
 
AjaxとFlashのDWRサンドイッチ、Springを添えて
AjaxとFlashのDWRサンドイッチ、Springを添えてAjaxとFlashのDWRサンドイッチ、Springを添えて
AjaxとFlashのDWRサンドイッチ、Springを添えて
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツ
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
 
Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]
 
Keypoints html5
Keypoints html5Keypoints html5
Keypoints html5
 
Zabbix超入門
Zabbix超入門Zabbix超入門
Zabbix超入門
 
オブジェクト指向やめましょう
オブジェクト指向やめましょうオブジェクト指向やめましょう
オブジェクト指向やめましょう
 
TypeScript超入門
TypeScript超入門TypeScript超入門
TypeScript超入門
 
EcmaScript 仕様書を読もう
EcmaScript 仕様書を読もうEcmaScript 仕様書を読もう
EcmaScript 仕様書を読もう
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
機械学習と深層学習の数理
機械学習と深層学習の数理機械学習と深層学習の数理
機械学習と深層学習の数理
 
一般向けのDeep Learning
一般向けのDeep Learning一般向けのDeep Learning
一般向けのDeep Learning
 
機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks
 

Similar to お手軽Ajaxアプリケーションの作り方

JavaScriptと共に歩いて行く決意をした君へ
JavaScriptと共に歩いて行く決意をした君へJavaScriptと共に歩いて行く決意をした君へ
JavaScriptと共に歩いて行く決意をした君へMuyuu Fujita
 
Web制作勉強会 #2
Web制作勉強会 #2Web制作勉強会 #2
Web制作勉強会 #2Moto Yan
 
第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料Masanori Kobayashi
 
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...Yusuke Suzuki
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】Yasuhito Yabe
 
TypeScriptをオススメする理由
TypeScriptをオススメする理由TypeScriptをオススメする理由
TypeScriptをオススメする理由Yusuke Naka
 
JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)taskie
 
Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方一希 大田
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...Akira Inoue
 
メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門Atsushi Tadokoro
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれMasataka MIZUNO
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
LT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとかLT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとかKazuya Matsubara
 

Similar to お手軽Ajaxアプリケーションの作り方 (20)

JavaScriptと共に歩いて行く決意をした君へ
JavaScriptと共に歩いて行く決意をした君へJavaScriptと共に歩いて行く決意をした君へ
JavaScriptと共に歩いて行く決意をした君へ
 
Web制作勉強会 #2
Web制作勉強会 #2Web制作勉強会 #2
Web制作勉強会 #2
 
第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料
 
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
 
TypeScriptをオススメする理由
TypeScriptをオススメする理由TypeScriptをオススメする理由
TypeScriptをオススメする理由
 
JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)
 
Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
 
メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門
 
Adobe JSX入門
Adobe JSX入門Adobe JSX入門
Adobe JSX入門
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれ
 
G * magazine 0
G * magazine 0G * magazine 0
G * magazine 0
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
Groovyコンファレンス
GroovyコンファレンスGroovyコンファレンス
Groovyコンファレンス
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
LT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとかLT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとか
 

More from Shunji Konishi

Salesforceのハッカソンに参加した話
Salesforceのハッカソンに参加した話Salesforceのハッカソンに参加した話
Salesforceのハッカソンに参加した話Shunji Konishi
 
Salesforce連携のためのOData入門
Salesforce連携のためのOData入門Salesforce連携のためのOData入門
Salesforce連携のためのOData入門Shunji Konishi
 
プロキシーを使ってテストを楽にする
プロキシーを使ってテストを楽にするプロキシーを使ってテストを楽にする
プロキシーを使ってテストを楽にするShunji Konishi
 
MochaとChaiでやるJavaScriptテスト
MochaとChaiでやるJavaScriptテストMochaとChaiでやるJavaScriptテスト
MochaとChaiでやるJavaScriptテストShunji Konishi
 
SendGridサンプルの紹介
SendGridサンプルの紹介SendGridサンプルの紹介
SendGridサンプルの紹介Shunji Konishi
 
セキュリティの考え方
セキュリティの考え方セキュリティの考え方
セキュリティの考え方Shunji Konishi
 
一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方Shunji Konishi
 
WebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみたWebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみたShunji Konishi
 
Playframework1でSeleniumテスト
Playframework1でSeleniumテストPlayframework1でSeleniumテスト
Playframework1でSeleniumテストShunji Konishi
 
Heroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞いHeroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞いShunji Konishi
 
Dyno cycling behavior of Heroku
Dyno cycling behavior of HerokuDyno cycling behavior of Heroku
Dyno cycling behavior of HerokuShunji Konishi
 
Herokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツールHerokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツールShunji Konishi
 
Herokuのログ解析ツール
Herokuのログ解析ツールHerokuのログ解析ツール
Herokuのログ解析ツールShunji Konishi
 
文字コードのお話
文字コードのお話文字コードのお話
文字コードのお話Shunji Konishi
 
High traffic questionnaire site
High traffic questionnaire siteHigh traffic questionnaire site
High traffic questionnaire siteShunji Konishi
 

More from Shunji Konishi (19)

Salesforceのハッカソンに参加した話
Salesforceのハッカソンに参加した話Salesforceのハッカソンに参加した話
Salesforceのハッカソンに参加した話
 
Salesforce連携のためのOData入門
Salesforce連携のためのOData入門Salesforce連携のためのOData入門
Salesforce連携のためのOData入門
 
プロキシーを使ってテストを楽にする
プロキシーを使ってテストを楽にするプロキシーを使ってテストを楽にする
プロキシーを使ってテストを楽にする
 
MochaとChaiでやるJavaScriptテスト
MochaとChaiでやるJavaScriptテストMochaとChaiでやるJavaScriptテスト
MochaとChaiでやるJavaScriptテスト
 
SendGridサンプルの紹介
SendGridサンプルの紹介SendGridサンプルの紹介
SendGridサンプルの紹介
 
セキュリティの考え方
セキュリティの考え方セキュリティの考え方
セキュリティの考え方
 
一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方
 
WebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみたWebSocketでリアルタイムクイズアプリを作ってみた
WebSocketでリアルタイムクイズアプリを作ってみた
 
Heroku tips1
Heroku tips1Heroku tips1
Heroku tips1
 
Playframework1でSeleniumテスト
Playframework1でSeleniumテストPlayframework1でSeleniumテスト
Playframework1でSeleniumテスト
 
Heroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞いHeroku Dyno再起動時の振る舞い
Heroku Dyno再起動時の振る舞い
 
Dyno cycling behavior of Heroku
Dyno cycling behavior of HerokuDyno cycling behavior of Heroku
Dyno cycling behavior of Heroku
 
Herokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツールHerokuで使えるRDBMS管理者ツール
Herokuで使えるRDBMS管理者ツール
 
Play1 to Play2
Play1 to Play2Play1 to Play2
Play1 to Play2
 
Herokuのログ解析ツール
Herokuのログ解析ツールHerokuのログ解析ツール
Herokuのログ解析ツール
 
Excel2 canvas
Excel2 canvasExcel2 canvas
Excel2 canvas
 
特盛!Heroku
特盛!Heroku特盛!Heroku
特盛!Heroku
 
文字コードのお話
文字コードのお話文字コードのお話
文字コードのお話
 
High traffic questionnaire site
High traffic questionnaire siteHigh traffic questionnaire site
High traffic questionnaire site
 

お手軽Ajaxアプリケーションの作り方