SlideShare a Scribd company logo
1 of 102
Download to read offline
Functional JavaScript
with Lo-Dash.js
Frontrend Vol.5
泉水翔吾 / @1000ch
CyberAgent, Inc.
About me
@1000ch
WebDeveloper@CyberAgent
1年前までProgrammer
Output
! http://1000ch.net
" @1000ch
# http://github.com/1000ch
# http://github.com/enja-oss
Agenda
! Object-Oriented & Functional
! Underscore.js & Lo-Dash.js
! Conclusion!
Object-Oriented
AND
Functional
Functional ???
Functional Programming
! 『数学的な関数の評価を行い、状態やデータの変
更を行わないプログラミングパラダイム』

via Wikipedia
! 関数型と言われてもイメージしにくい…。
押し寄せるFunctional
! HaskellとかClojureとか。
! TwitterはScalaを採用。
! JavaScriptもFunctional?
哲学的な話をする気は
ございません!
Functionalなアプローチもしてみてねっていう話
Object-Oriented ???
Object-Oriented
Programming
! 『オブジェクト同士の相互作用として、システム
の振る舞いを捉える考え方』 via Wikipedia
! つまり『プログラムで実現したいモデルを抽象化
したもの』である。
OOPの例えば…
猫をOOPで表現する
var Animal = function(word) {
this.word = word;
};
Animal.prototype.cry = function() {
console.log(this.word);
};
!
var Cat = function() {
Animal.call(this, "Nya-");
};
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Animal;
!
new Cat().cry();
//=>Nya-
jQueryもOOP?
var $headline = $(".headline");
$headline.css({
"font-size": "24px"
});
var $paragraph = $("p");
$paragraph.css({
"background": "#000",
"color": "#fff"
}).addClass("breakAll");
!
var $button = $("button");
$button.on("click", function() {
console.log("button is clicked!");
});
オブジェクト指向の問題点
! オブジェクト同士の関係が密になりがち
! 役割が大きくなりすぎてクラスが複雑になりがち
! 継承されすぎて変更できなくなりがち
OOPが抱えがちな問題
œš‘“›⁸コードの役割分担が複雑で、コードの
役割が密接な関係を持っていると
テストを行うことが難しくなる。’”⁹
- @cssradar

at Frontrend Vol.4
https://speakerdeck.com/studiomohawk/testable-javascript
つまるところ、
保守性を維持しにくい。
jQueryの保守しろって
言われても、できません。
Functionalなアプローチが
解決してくれる!
(かもしれない!)
Funtional Function
! 引数が同じであれば出力も同じである
! 果たす役割が簡潔で分割されていること
Funtional Function
! 引数が同じであれば出力も同じである
! 果たす役割が簡潔で分割されていること
This is bad...
var sortedString = function(array) {
array.sort();

!
return array.join();
};
!
var array1 = [1, 6, 8, 4, 9, 0, 3, 5, 2, 7];

!
console.log(sortedString(array1));

//=>0,1,2,3,4,5,6,7,8,9

!
console.log(array1);

//=>[0,1,2,3,4,5,6,7,8,9]
//引数が変更されてしまっている…。

This is better !!!
var sortedString = function(array) {
var buffer = array.slice();
buffer.sort();
return buffer.join();
};
!
var array1 = [1, 6, 8, 4, 9, 0, 3, 5, 2, 7];
!
console.log(sortedString(array1));

//=>0,1,2,3,4,5,6,7,8,9

!
console.log(array1);

//=>[1,6,8,4,9,0,3,5,2,7]
//OK!

Funtional Function
! 引数が同じであれば出力も同じである
! 果たす役割が簡潔で分割されていること
This is bad...
var setElement = function() {
$(".hoge").addClass("decorationClass").animate({...});
};
var initMainPage = function() {
window.scrollTo(1, 0);
setElement();
};
window.onload = function() {
initMainPage();
};


This is better !!!
var setElement = function(element) {
$(element).addClass("decorationClass").animate({...});
};
var hideAddressBar = function() {
window.scrollTo(1, 0);
};
window.onload = function() {
hideAddressBar();
setElement(document.getElementsByClassName(".hoge"));
};


Functionalなアプローチを
試してみる。
jQueryっぽいサンプル実装
var $ = function(selector) {
return {
list: document.querySelectorAll(selector),
each: function(callback) {
for(var i = 0, l = this.list.length;i < l;i++) {
callback(this.list[i]);
}
return this;
},
addClass: function(className) {
return this.each(function(element) {
element.classList.add(className);
});
}
};
};
使い方イメージ
//$コンストラクタにCSSセレクタを渡し、要素にクラスを追加。
$(".parentClass .childClass").addClass("hoge");
この実装の問題点
! each()もaddClass()もコンストラクタの
querySelectorAllに依存している。
! 再利用出来ない。
! クラスを拡張するたびにテストの見直し。
Functionalに書き直す
var _ = {};
!
_.qsa = function(selector) {
return document.querySelectorAll(selector);
};
!
_.each = function(targetObject, callback) {
for(var i = 0, len = targetObject.length;i < len;i++) {
callback(targetObject[i]);
}
};
!
_.addClass = function(targetElementList, className) {
_.each(targetElementList, function(element) {
element.classList.add(className);
});
};
使い方イメージ
//CSSセレクタを渡し、要素を選択する。
var elementList = _.qsa(".parentClass .childClass");
!
!


//取得した要素にクラスを追加する。
_.addClass(elementList, "hoge");
解決された点
! _.qsa()も、_.addClass()も互いに依存していない
ので、再利用できる。
! テストケースの見直しが発生しにくい。
Functionalなアプローチが
もたらすメリット
Simplicity
メソッド間の依存性が疎になることで、

コードがシンプルになる。
Testablity
関数の役割が簡潔になることで、
テストが書きやすくなる。
Maintainablity
SimplicityとTestablityによって、

保守性の向上が期待できる。
Underscore.js
AND
Lo-Dash.js
Functionalなアプローチの
メリットはわかった!
ユーティリティをつくったり
保守するコストが…。
優秀なライブラリがあります。
使いましょう。
(※もちろん自作でもOKです)
http://lodash.com/
Lo-Dash.js
! Underscore.jsとAPIの互換性のあるライブラリ
! each()やfirst()など、便利なユーティリティを備
えている
あれ?
じゃあUnderscore.jsは?
http://underscorejs.org/
Underscore.jsでもOK
! Lo-Dash.jsよりファイルサイズが軽量
! コードがとても綺麗なのでコードリーディングに
向いてる
なぜ
Lo-Dash.jsを選ぶのか?
- John-David Dalton

at StackOverflow
œš‘“›⁸better overall performance and
optimizations for large arrays/object
iteration, and more flexibility with
custom builds and template pre-
compilation utilities.’”⁹
http://stackoverflow.com/questions/13789618/differences-between-
lodash-and-underscore
『大きな配列やオブジェクトの列挙に最適化されてお
り、全体的にパフォーマンスが改善されている。また、
カスタムビルドやテンプレートのプリコンパイルなど、
より柔軟な作りになっている。』
! 実行パフォーマンスが良い
! 問題が色々解決されています
! カスタムビルドできます
! Underscore.jsに互換性あります
Performance of Lo-Dash.js
Compare Performance(1)
Underscore#forEach
Native#forEach
Lo-Dash#forEach with bind
Lo-Dash#forEach
Native#for
0 1250000 2500000 3750000 5000000
うーん、やっぱり
for文が1番高速…。
それでもLo-Dash.jsを
使う価値がある。
_.each()
via Underscore.js
_.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) ===
breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key,
obj) === breaker) return;
}
}
}
};
_.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) ===
breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key,
obj) === breaker) return;
}
}
}
};
_.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) ===
breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key,
obj) === breaker) return;
}
}
}
};
ネイティブのforEachが使える場
合はそれを実行している
_.each()
via Lo-Dash.js
function forEach(collection, callback, thisArg) {
var index = -1,
length = collection ? collection.length : 0;
callback = callback && typeof thisArg == 'undefined' ?
callback : lodash.createCallback(callback, thisArg);
if (typeof length == 'number') {
while (++index < length) {
if (callback(collection[index], index,
collection) === false) {
break;
}
}
} else {
forOwn(collection, callback);
}
return collection;
}
function forEach(collection, callback, thisArg) {
var index = -1,
length = collection ? collection.length : 0;
callback = callback && typeof thisArg == 'undefined' ?
callback : lodash.createCallback(callback, thisArg);
if (typeof length == 'number') {
while (++index < length) {
if (callback(collection[index], index,
collection) === false) {
break;
}
}
} else {
forOwn(collection, callback);
}
return collection;
}
function forEach(collection, callback, thisArg) {
var index = -1,
length = collection ? collection.length : 0;
callback = callback && typeof thisArg == 'undefined' ?
callback : lodash.createCallback(callback, thisArg);
if (typeof length == 'number') {
while (++index < length) {
if (callback(collection[index], index,
collection) === false) {
break;
}
}
} else {
forOwn(collection, callback);
}
return collection;
}
基本的にwhile文を使っている
Compare Performance(2)
Underscore#forEach Array
Underscore#forEach Object
Lo-Dash#forEach Object
Lo-Dash#forEach Array
0 550000 1100000 1650000 2200000
Compare Performance(2)
Underscore#forEach Array
Underscore#forEach Object
Lo-Dash#forEach Object
Lo-Dash#forEach Array
0 550000 1100000 1650000 2200000
for文とArray.forEachの

差が出てる
Compare Performance(2)
Underscore#forEach Array
Underscore#forEach Object
Lo-Dash#forEach Object
Lo-Dash#forEach Array
0 550000 1100000 1650000 2200000
while文なのでほとんど

差が出ていない
カスタムビルドと
Underscore.js互換
Modern build モダンブラウザ向けのビルド。
Legacy build レガシーブラウザ対応がなされている。
Mobile build 関数のコンパイルがされていない
Strict build
読み取り専用プロパティを上書きしよう
としたときにエラーを投げる。
Underscore build Underscore.jsにAPIを合わせてある。
Backbone build Backbone.jsに必要なAPIのみ備える。
Modern build モダンブラウザ向けのビルド。
Legacy build レガシーブラウザ対応がなされている。
Mobile build 関数のコンパイルがされていない
Strict build
読み取り専用プロパティを上書きしよう
としたときにエラーを投げる。
Underscore build Underscore.jsにAPIを合わせてある。
Backbone build Backbone.jsに必要なAPIのみ備える。
Compare File Size
lodash.min.js
lodash.underscore.min.js
underscore.min.js
0 5500 11000 16500 22000
compressed gzipped
Compare File Size
lodash.min.js
lodash.underscore.min.js
underscore.min.js
0 5500 11000 16500 22000
compressed gzipped
gzipすればさほど変わらな
い!(7,701bytes)
色々考慮すると現時点では
Lo-Dash.jsが良さそう…。
しかしUnderscore.jsの
美しい実装は
非常に参考になる。
_.pluck()
via Underscore.js
var stooges = [

{name : 'moe', age : 40}, 

{name : 'larry', age : 50}, 

{name : 'curly', age : 60}

];

!
_.pluck(stooges, 'name');
//=> ["moe", "larry", "curly"]
_.pluck = function(obj, key) {
return _.map(obj, function(value){

return value[key];

});
};
…美しい。
_.compose = function(/*, funs */) {
var functions = arguments;
return function() {
var args = arguments;
for (var i = functions.length - 1; i >= 0; i--) {
args = [functions[i].apply(this, args)];
}
return args[0];
};
};
var plusFive = function(num) {
return num + 5;
};
var multiplyThree = function(num) {
return num * 3;
};
var plus5_multiply3 = _.compose(multiplyThree, plusFive);
plus5_multiply3(4);
//=>27
よりFunctionalに書くために
プラグインがあります。
https://github.com/documentcloud/underscore-contrib
_.pipeline = function(/*, funs */){


var functions = arguments;

!
return function(seed) {
return _.reduce(functions, function(l, r) {
return r(l);
}, seed);
};
};
var plusFive = function(num) {
return num + 5;
};
var multiplyThree = function(num) {
return num * 3;
};
var multiply3_plus5 = _.pipeline(multiplyThree, plusFive);
multiply3_plus5(4);
//=>17
http://dtao.github.io/lazy.js/
function square(x) {

return x * x;

}
function inc(x) {

return x + 1;

}
function isEven(x) {

return x % 2 === 0;

}
!
var result = _.chain(array)

.map(square).map(inc)

.filter(isEven).take(5).value();

!
var result = Lazy(array)

.map(square).map(inc)

.filter(isEven).take(5);
http://functionaljs.org/
http://moutjs.com/
どれもDOMを操作する実装は
含んでいない。
※あくまで、JavaScriptのUtilityであるため。
DOM操作のAPIを
提供する拡張を作ってみた。
※参考程度にどうぞ。
https://github.com/1000ch/_.domextend
特徴
! 要素選択API
! イベントのバインドAPI
! CSSクラスの付け外しAPI
! 軽い(minifiedで3KBくらい)
Conclusion !
OBJECT-ORIENTED
TO
FUNCTIONAL
OBJECT-ORIENTED
TO
FUNCTIONAL
OBJECT-ORIENTED
WITH
FUNCTIONAL
物事の抽象化はオブジェクト
指向でしかできない。
USE LO-DASH.jS
WATCH UNDERSCORE.JS
Underscore.jsとかMOUTあた
りが綺麗なので参考に!
Thank you !
by@1000ch
http://www.flickr.com/photos/vicpowles/7229138156/
http://www.flickr.com/photos/49875617@N06/8770578796/
http://www.flickr.com/photos/vicpowles/7229138156/
http://www.flickr.com/photos/scalamax/8764370935/
http://www.flickr.com/photos/jody_art/8758073909/
http://www.flickr.com/photos/liza-photography/6272074016/
http://www.flickr.com/photos/51710089@N08/8758089618/
Photo Credits
http://fontawesome.io/
http://font.ubuntu.com/
https://github.com/adobe/Source-Code-Pro
http://www.fontsquirrel.com/fonts/bebas-neue
Font Credits

More Related Content

What's hot

15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテストYoichiro Sakurai
 
BDD勉強会 第6回
BDD勉強会 第6回BDD勉強会 第6回
BDD勉強会 第6回zakihaya
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
第3回BDD勉強会
第3回BDD勉強会第3回BDD勉強会
第3回BDD勉強会zakihaya
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallなおき きしだ
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」tech-arts
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和schoowebcampus
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよkoji lin
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 

What's hot (20)

15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 
BDD勉強会 第6回
BDD勉強会 第6回BDD勉強会 第6回
BDD勉強会 第6回
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
第3回BDD勉強会
第3回BDD勉強会第3回BDD勉強会
第3回BDD勉強会
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
Spectron
SpectronSpectron
Spectron
 
「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 

Similar to Functional JavaScript with Lo-Dash.js

Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介fukuoka.ex
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門spring_raining
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころAyumi Goto
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版ありますElixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版ありますfukuoka.ex
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数Altech Takeno
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」fukuoka.ex
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 
第19回html5とか勉強会 pjax
第19回html5とか勉強会 pjax第19回html5とか勉強会 pjax
第19回html5とか勉強会 pjaxKensaku Komatsu
 

Similar to Functional JavaScript with Lo-Dash.js (20)

ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころ
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版ありますElixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
APIKit
APIKitAPIKit
APIKit
 
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 
第19回html5とか勉強会 pjax
第19回html5とか勉強会 pjax第19回html5とか勉強会 pjax
第19回html5とか勉強会 pjax
 
MlnagoyaRx
MlnagoyaRxMlnagoyaRx
MlnagoyaRx
 

More from Shogo Sensui

Web Standards Interop 2022
Web Standards Interop 2022Web Standards Interop 2022
Web Standards Interop 2022Shogo Sensui
 
Introduction to Performance APIs
Introduction to Performance APIsIntroduction to Performance APIs
Introduction to Performance APIsShogo Sensui
 
Web Standards 2018
Web Standards 2018Web Standards 2018
Web Standards 2018Shogo Sensui
 
The State of Web Components
The State of Web ComponentsThe State of Web Components
The State of Web ComponentsShogo Sensui
 
Component of Web Frontend
Component of Web FrontendComponent of Web Frontend
Component of Web FrontendShogo Sensui
 
Web フロントエンドの変遷とこれから
Web フロントエンドの変遷とこれからWeb フロントエンドの変遷とこれから
Web フロントエンドの変遷とこれからShogo Sensui
 
Introduction to Resource Hints
Introduction to Resource HintsIntroduction to Resource Hints
Introduction to Resource HintsShogo Sensui
 
Web Components 2016 & Polymer v2
Web Components 2016 & Polymer v2Web Components 2016 & Polymer v2
Web Components 2016 & Polymer v2Shogo Sensui
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話Shogo Sensui
 
初心者のためのWeb標準技術
初心者のためのWeb標準技術初心者のためのWeb標準技術
初心者のためのWeb標準技術Shogo Sensui
 
Introduction to Service Worker
Introduction to Service WorkerIntroduction to Service Worker
Introduction to Service WorkerShogo Sensui
 
We should optimize images
We should optimize imagesWe should optimize images
We should optimize imagesShogo Sensui
 
Web Components changes Web Development
Web Components changes Web DevelopmentWeb Components changes Web Development
Web Components changes Web DevelopmentShogo Sensui
 
Re-think about Web Performance
Re-think about Web PerformanceRe-think about Web Performance
Re-think about Web PerformanceShogo Sensui
 
Browser Computing Structure
Browser Computing StructureBrowser Computing Structure
Browser Computing StructureShogo Sensui
 
Brush up your Coding! 2013 winter
Brush up your Coding! 2013 winterBrush up your Coding! 2013 winter
Brush up your Coding! 2013 winterShogo Sensui
 
Brush up your Coding!
Brush up your Coding!Brush up your Coding!
Brush up your Coding!Shogo Sensui
 

More from Shogo Sensui (17)

Web Standards Interop 2022
Web Standards Interop 2022Web Standards Interop 2022
Web Standards Interop 2022
 
Introduction to Performance APIs
Introduction to Performance APIsIntroduction to Performance APIs
Introduction to Performance APIs
 
Web Standards 2018
Web Standards 2018Web Standards 2018
Web Standards 2018
 
The State of Web Components
The State of Web ComponentsThe State of Web Components
The State of Web Components
 
Component of Web Frontend
Component of Web FrontendComponent of Web Frontend
Component of Web Frontend
 
Web フロントエンドの変遷とこれから
Web フロントエンドの変遷とこれからWeb フロントエンドの変遷とこれから
Web フロントエンドの変遷とこれから
 
Introduction to Resource Hints
Introduction to Resource HintsIntroduction to Resource Hints
Introduction to Resource Hints
 
Web Components 2016 & Polymer v2
Web Components 2016 & Polymer v2Web Components 2016 & Polymer v2
Web Components 2016 & Polymer v2
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話
 
初心者のためのWeb標準技術
初心者のためのWeb標準技術初心者のためのWeb標準技術
初心者のためのWeb標準技術
 
Introduction to Service Worker
Introduction to Service WorkerIntroduction to Service Worker
Introduction to Service Worker
 
We should optimize images
We should optimize imagesWe should optimize images
We should optimize images
 
Web Components changes Web Development
Web Components changes Web DevelopmentWeb Components changes Web Development
Web Components changes Web Development
 
Re-think about Web Performance
Re-think about Web PerformanceRe-think about Web Performance
Re-think about Web Performance
 
Browser Computing Structure
Browser Computing StructureBrowser Computing Structure
Browser Computing Structure
 
Brush up your Coding! 2013 winter
Brush up your Coding! 2013 winterBrush up your Coding! 2013 winter
Brush up your Coding! 2013 winter
 
Brush up your Coding!
Brush up your Coding!Brush up your Coding!
Brush up your Coding!
 

Recently uploaded

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

Functional JavaScript with Lo-Dash.js