tag:blogger.com,1999:blog-30513343521015296922024-03-14T00:13:38.222+09:00コードで一言Node, iOS, Android, HTML5, JavaScriptの話題。ときどきMacやLinux。Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.comBlogger165125tag:blogger.com,1999:blog-3051334352101529692.post-22887036581479492582013-12-15T12:43:00.001+09:002013-12-15T12:51:44.926+09:00Rails4 で気合を入れるプラグイン acts_as_kiai を作ってみた<p>Rails4でActivityRecordを拡張し、気合を入れてくれるプラグイン acts_as_kiai を開発したのでその時のメモです。</p>
<p>Github</p>
<p>
<a href="https://github.com/tomoyukiinoue/acts_as_kiai">https://github.com/tomoyukiinoue/acts_as_kiai</a>
</p>
<p>作り方をGistに記載しています。</p>
<p>
<a href="https://gist.github.com/tomoyukiinoue/7968556">https://gist.github.com/tomoyukiinoue/7968556</a>
</p>
<p>フォーマットがあれですが、Gistを埋め込んで表示しています。Gistの方が見やすいかも。</p>
<script src="https://gist.github.com/tomoyukiinoue/7968556.js"></script>
Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-44457117290386109362013-12-08T09:28:00.000+09:002013-12-08T09:28:02.849+09:00Mac OS X 10.9 のRails 4.0.0を4.0.2にアップデートしたときのメモ<script src="https://gist.github.com/tomoyukiinoue/7851789.js"></script>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-17007141094903981072013-07-01T22:34:00.003+09:002013-07-01T22:34:41.919+09:00Rails4.0とRuby2.0をMountain LionにインストールRuby-2.0.0p247でOpenSSLのコンパイルエラーがなくなったみたいです。Rails 4.0をGemでインストールする前にRdocをアップデートしておくと吉。
<script src="https://gist.github.com/tomoyukiinoue/5900766.js"></script>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-82960798251350588202013-01-11T13:35:00.000+09:002013-01-11T13:35:20.744+09:00Rails 3.2.11へのアップデート方法メモ(緊急)<script src="https://gist.github.com/4507960.js"></script>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-65953907173230183652012-12-18T21:16:00.002+09:002012-12-18T21:16:51.304+09:00Django 1.4の日本語ドキュメントをビルドするメモ<script src="https://gist.github.com/4305518.js"></script>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-77786750380469663552012-12-16T16:31:00.001+09:002012-12-16T16:31:30.854+09:00Mountain Lion に Django をインストールするメモ<script src="https://gist.github.com/4304007.js"></script>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWX09SnQnhJ-EFKSeP0XOFSuPST1ZdCg132_nl_mViVvjUiU4U6YMXeI7BTPttrTiNKeC4Ph09ygkcFeteJsXgiU-egpVJuES-36uKjJTyQrsPDptrwfFXLkcZL1G-6ard2fucCEQswcxs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-12-16+16.30.28.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="365" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWX09SnQnhJ-EFKSeP0XOFSuPST1ZdCg132_nl_mViVvjUiU4U6YMXeI7BTPttrTiNKeC4Ph09ygkcFeteJsXgiU-egpVJuES-36uKjJTyQrsPDptrwfFXLkcZL1G-6ard2fucCEQswcxs/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-12-16+16.30.28.png" /></a></div>
Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-48982298490280533052012-10-14T13:25:00.000+09:002012-10-14T13:25:14.931+09:00Mac OS X Mountain Lion (10.8.2) に Rails 3.2.8 をインストールする<p>約100日ぶりの更新です。<br />
RailsとiOS/Androidアプリとクラウド3点セットのお仕事が増えてきましたので、少しNode.jsから離れて、更新を続けようと思います。</p>
<p>Moutain LionにRailsをインストールしたときの作業のログです。<br />
Rubyのバージョン管理ツールにrbenvを使用しています。</p>
<h3>事前準備</h3>
<ul>
<li>AppStoreでXcode 4.5.1 をインストールしておく</li>
<li>Xcode 4.5.1の設定からCommand Line Tools をインストールしておく</li>
</ul>
<h3>Homebrewをインストールする</h3>
<script src="https://gist.github.com/3887261.js?file=01_install_homebrew"></script>
<h3>rbenvをインストールする</h3>
<script src="https://gist.github.com/3887261.js?file=02_install_rbenv"></script>
<p>.bash_profileを編集して以下の一行を追加します。</p>
$ vim ~/.bash_profile
<script src="https://gist.github.com/3887261.js?file=03_add_to_bash_profile"></script>
<p>再読込を忘れずに</p>
<script src="https://gist.github.com/3887261.js?file=04_reload_bash_profile"></script>
<h3>ruby-buildをインストール</h3>
<p>rbenv install -l でインストール可能なバージョンのリストが表示されればOKです。</p>
<script src="https://gist.github.com/3887261.js?file=05_install_ruby_build"></script>
<h3>Rubyをインストールする</h3>
<script src="https://gist.github.com/3887261.js?file=06_install_ruby"></script>
<p>使用しているrubyのバージョンが1.9.3-p194でパスが変更されていればOK。</p>
<h3>Railsをインストールする</h3>
<script src="https://gist.github.com/3887261.js?file=07_install_rails"></script>
<h3>Railsアプリを作成する</h3>
<script src="https://gist.github.com/3887261.js?file=08_create_new_app"></script>
<p>ブラウザから http://localhost:3000/ にアクセスして以下の画面が表示されたRailsのインストールは完了です。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHWh_HH8NmqYnox8GBWP3cPNH2_6-o_btYno0d_gEzrhVS_glgdlCr3l5hS0fWXDppXRcRUVoCtin4Nb9UQeBkGOHz7_dVri8kMx9Xc_h8VVu5cI9Qh5kPKN5U-7h3sEtC_oZIWFHc5ot7/s1600/helloworld_rails.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="291" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHWh_HH8NmqYnox8GBWP3cPNH2_6-o_btYno0d_gEzrhVS_glgdlCr3l5hS0fWXDppXRcRUVoCtin4Nb9UQeBkGOHz7_dVri8kMx9Xc_h8VVu5cI9Qh5kPKN5U-7h3sEtC_oZIWFHc5ot7/s400/helloworld_rails.png" /></a></div>
Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com1tag:blogger.com,1999:blog-3051334352101529692.post-49494465724504029722012-07-02T20:57:00.001+09:002012-07-02T20:57:07.143+09:00CoffeeScriptで学ぶ Underscore.js 15(Chain編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>CoffeeScriptで学ぶUnderscore.js(Chain編)。今回で15回目、ようやく最終回です。</p>
<hr />
<b>chain</b>
<p>_.chain(object)</p>
<p>chainは、underscoreのメソッドを次々と連結して実行できる便利なメソッドです。</p>
<pre class="brush:js">
_ = require 'underscore'
users = [
{name : 'curly', age : 25},
{name : 'moe', age : 21},
{name : 'larry', age : 23}
]
youngest =
_.chain(users)
.sortBy (user)->
user.age
.map (user)->
user.name + ' is ' + user.age
.first()
.value()
console.log youngest
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee chain.coffee
moe is 21
</pre>
<p>_.chain(users)でchainに配列を与えています。次にsortByでage順に並べます。次のmapで「◯◯ is 年齢」の出力を作成します。firstで最初の行を取得し、最後にvalueで値にしています。</p>
<p>Underscore.jsでは、</p>
<pre class="brush:js">
_.map [1,2,3], (n)->
n * 2
</pre>
<p>は、以下のようにも記述できます。</p>
<pre class="brush:js">
_([1,2,3]).map (n)->
n * 2
</pre>
<p>ですので、上記のchainの部分は以下のように分解できます。</p>
<pre class="brush:js">
sorted = _(users).sortBy (user)->
user.age
mapped = _(sorted).map (user)->
user.name + ' is ' + user.age
first = _(mapped).first()
value = _(first).value()
</pre>
<hr />
<b>value</b>
<p>_(obj).value()</p>
<p>valueは、objを展開します。chainの最後に負荷することで値として展開できます。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _([3,2,6]).value()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee value.coffee
[ 3, 2, 6 ]
</pre>
<hr />
<p>Underscore.jsは、JavaScriptを強力にサポートするパッケージです。是非とも使いこなしてみましょう。</p>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-28090096963499562772012-06-30T11:58:00.001+09:002012-06-30T11:58:47.590+09:00CoffeeScriptで学ぶ Underscore.js 14(Template編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>CoffeeScriptで学ぶ、Underscore.js。このエントリーで14回目です。今回はTemplate編。Underscore.jsが最も普及したのも、このtemplateがあったからのように思えます。templateは、公式サイトでも気合の入った説明がされています。</p>
<hr />
<b>template</b>
<p>_.template(templateString,[data],[settings])</p>
<p>templateは、JavaScriptテンプレートをコンパイルし、レンダリングします。JSONデータソースからHTMLの一部をレンダリングするのに使われています。Template関数では、変数を出力する場合は、<%= ... %>を使います。JavaScriptのコードを実行するには、<% ... %>を使います。HTMLエスケープしたい場合、<%- ... %>を使います。</p>
<pre class="brush:js">
_ = require 'underscore'
template = _.template "hello <%= name %>"
console.log template {name: 'miku'}
list = '''
<% _.each(people, function(name) { %>
<li><%= name %></li>
<% }); %>
'''
template = _.template list, {people:['MIKU', 'RIN', 'LEN']}
console.log template
template = _.template '<b><%- value %></b>'
console.log template {value: '<script>'}
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee template.coffee
hello miku
<li>MIKU</li>
<li>RIN</li>
<li>LEN</li>
<b>&lt;script&gt;</b>
</pre>
<p>templateSettings関数を使うと、テンプレートを書き換えることができます。テンプレートとしてメジャーなMustache.jsスタイルのテンプレートにするには以下のように指定します。</p>
<pre class="brush:js">
_ = require 'underscore'
_.templateSettings =
interpolate : /\{\{(.+?)\}\}/g
template = _.template "Hello {{ name }}!"
console.log template {name : "Mustache"}
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee templateSettings.coffee
Hello Mustache!
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-16607503820605665952012-06-27T22:17:00.000+09:002012-06-27T22:17:30.631+09:00CoffeeScriptで学ぶ Underscore.js 13(Utility編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>いよいよUtility編。大詰めです。</p>
<hr />
<b>noConflict</b>
<p>_.noConflict</p>
<p>noConflictは、変数である「_」(アンダースコア)を別の変数に置き換えることができます。Underscoreのオブジェクトを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
underscore = _.noConflict()
_ = 10
console.log _
console.log underscore
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee noConflict.coffee
10
{ [Function]
_: [Circular],
VERSION: '1.3.3',
forEach: [Function],
each: [Function],
collect: [Function],
map: [Function],
...
</pre>
<hr />
<b>identity</b>
<p>_.identity(value)</p>
<p>identityは、valueを与えたとき、返り値としてそのままvalueを返します。underscoreの初期のイテレータに利用されているそうな。</p>
<pre class="brush:js">
_ = require 'underscore'
moe = {name:'moe'}
console.log moe is _.identity moe
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee identity.coffee
true
</pre>
<hr />
<b>times</b>
<p>_.times(n, iterator)</p>
<p>timesは、iteratorをn回実行します。</p>
<pre class="brush:js">
_ = require 'underscore'
_.times 10, ()->
console.log 'hello'
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee times.coffee
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
</pre>
<hr />
<b>mixin</b>
<p>_.mixin(object)</p>
<p>mixinは、Underscoreにカスタマイズした関数を追加することができます。{関数名:関数} というオブジェクトを追加することで、Underscoreのオブジェクトとして定義できます。</p>
<pre class="brush:js">
_ = require 'underscore'
_.mixin {
capitalize:(string)->
string.charAt(0).toUpperCase() + string.substring(1).toLowerCase()
}
console.log _.capitalize "underscore"
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee mixin.coffee
Underscore
</pre>
<hr />
<b>uniqueId</b>
<p>_.uniqueId([prefix])</p>
<p>uniqueIdは、グローバル域で一意なIDを生成します。引数にプレフィックスを与えることができます。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.uniqueId()
console.log _.uniqueId()
console.log _.uniqueId()
console.log _.uniqueId()
console.log _.uniqueId('CB')
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee uniqueId.coffee
0
1
2
3
CODE4
</pre>
<hr />
<b>escape</b>
<p>_.escape(string)</p>
<p>escapeは、HTMLなどの&, <, >, &quat;, ', / をエスケープ処理して返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.escape '&,<,>,&quat;,\',/'
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee escape.coffee
&amp;,&lt;,&gt;,&quot;,&#x27;,&#x2F;
</pre>
<hr />
<b>result</b>
<p>_.result(object, property)</p>
<p>resultは、指定したobjectのプロパティを返します。プロパティが値の場合はそのまま値が、関数の場合、その関数を実行します。</p>
<pre class="brush:js">
_ = require 'underscore'
hoge =
foo: 'hello'
bar: ()->
'good morning'
console.log _.result hoge, 'foo'
console.log _.result hoge, 'bar'
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee result.coffee
hello
good morning
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-62769820814199258092012-06-25T20:50:00.000+09:002012-06-25T20:50:56.919+09:00CoffeeScriptで学ぶ Underscore.js 12(Object編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>12回目。Object編。今回はis判定です。16種類の判定があります。</p>
<hr />
<b>isEqual</b>
<p>_.isEqual(object, other)</p>
<p>isEqualは、2つのオブジェクトの最下層まで等しい場合trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
a = {name:'Taro', luckyNumbers:[12,67,42]}
b = {name:'Taro', luckyNumbers:[12,67,42]}
console.log a is b
console.log _.isEqual a,b
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isEqual.coffee
false
true
</pre>
<hr />
<b>isEmpty</b>
<p>_.isEmpty(object)</p>
<p>isEmptyは、objectが空の場合にtrueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
a = {}
b = {a}
console.log _.isEmpty a
console.log _.isEmpty b
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isEmpty.coffee
true
false
</pre>
<hr />
<b>isElement</b>
<p>_.isElement(object)</p>
<p>isElementは、オブジェクトがDOM要素である場合にtrueを返します。</p>
<pre class="brush:js">
alert _.isElement(jQuery('body')[0]);
</pre>
<b>実行結果</b>
<pre class="brush:bash">
true
</pre>
<p>ブラウザでjQueryを読み込んで、実行します。</p>
<hr />
<b>isArray</b>
<p>_.isArray(object)</p>
<p>isArrayは、objectが配列のときtrueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [1,2,3,4,5]
obj = {list}
console.log _.isArray list
console.log _.isArray obj
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isArray.coffee
true
false
</pre>
<hr />
<b>isObject</b>
<p>_.isObject(value)</p>
<p>isObjectは、objectがオブジェクトの場合、trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [1,2,3,4,5]
obj = {list}
console.log _.isObject list
console.log _.isObject obj
console.log _.isObject 100
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isObject.coffee
true
true
false
</pre>
<p>配列もtrueです。</p>
<hr />
<b>isArguments</b>
<p>_.isArguments(object)</p>
<p>isArgumentsは、objectが引数の場合、trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
func = ()->
_.isArguments arguments
console.log func(1,2,3)
console.log _.isArguments([1,2,3])
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isArguments.coffee
true
false
</pre>
<hr />
<b>isFunction</b>
<p>_.isFunction(object)</p>
<p>isFunctionは、objectが関数の場合trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isFunction _.isFunction
console.log _.isFunction 123
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isFunction.coffee
true
false
</pre>
<hr />
<b>isString</b>
<p>_.isString(object)</p>
<p>isStringは、objectが文字列の場合、trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isString 'AKB'
console.log _.isString 123
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isString.coffee
true
false
</pre>
<hr />
<b>isNumber</b>
<p>_.isNumber(object)</p>
<p>isNumberは、objectが数値の場合、trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isNumber 'AKB'
console.log _.isNumber 123
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isNumber.coffee
false
true
</pre>
<hr />
<b>isFinite</b>
<p>_.isFinite</p>
<p>isFiniteは、objectが有限の数値の場合trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isFinite -Infinity
console.log _.isFinite 123
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isFinite.coffee
false
true
</pre>
<hr />
<b>isBoolean</b>
<p>_.isBoolean(object)</p>
<p>isBooleanは、objectがtrueかfalseの場合にtrueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isBoolean null
console.log _.isBoolean true
console.log _.isBoolean false
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isBoolean.coffee
false
true
true
</pre>
<p>falseはBoolean型なのでtrueを返します。</p>
<hr />
<b>isDate</b>
<p>_.isDate(object)</p>
<p>isDateは、objectがDate型のときtrueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isDate new Date()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isDate.coffee
true
</pre>
<hr />
<b>isRegExp</b>
<p>_.isRegExp(object)</p>
<p>isRegExpは、objectが正規表現となっている場合trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isRegExp /abc/
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isRegExp.coffee
true
</pre>
<hr />
<b>isNaN</b>
<p>_.isNaN(object)</p>
<p>isNaNは、objectがNaN型の場合、trueを返します。undefinedの場合、ネイティブのisNaN ではtrueを返しますが、_.isNaNではfalseを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isNaN NaN
console.log _.isNaN undefined
console.log isNaN undefined
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isNaN.coffee
true
false
true
</pre>
<hr />
<b>isNull</b>
<p>_.isNull(object)</p>
<p>isNullは、objectがnullの場合、trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isNull null
console.log _.isNull undefined
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isNull.coffee
true
false
</pre>
<hr />
<b>isUndefined</b>
<p>_.isUndefined(object)</p>
<p>isUndefinedは、objectがundefinedの場合、trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.isUndefined null
console.log _.isUndefined undefined
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee isUndefined.coffee
false
true
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-62568184616484063192012-06-19T21:52:00.000+09:002012-06-19T21:52:16.457+09:00CoffeeScriptで学ぶ Underscore.js 11(Object編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>第11回。Object編に入りました。</p>
<hr />
<b>keys</b>
<p>_.keys(object)</p>
<p>keysは、オブジェクト内のすべてのキーを配列にして返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.keys {
hoge: 'hoge'
seven: 7
bool: true
}
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee keys.coffee
[ 'hoge', 'seven', 'bool' ]
</pre>
<hr />
<b>values</b>
<p>_.values(object)</p>
<p>valuesは、オブジェクト内のすべての値を配列にして返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.values {
hoge: 'hoge'
seven: 7
bool: true
}
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee values.coffee
[ 'hoge', 7, true ]
</pre>
<hr />
<b>functions</b>
<p>_.functions(object)</p>
<p>functionsは、object内に存在するすべての関数をソートして配列を返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.functions _
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee functions.coffee
[ '_',
'after',
'all',
'any',
'bind',
'bindAll',
'chain',
'clone',
'collect',
'compact',
'compose',
...
</pre>
<hr />
<b>extend</b>
<p>_.extend(destination, *sources)</p>
<p>extendは、sourcesに指定したオブジェクト内のすべてのプロパティをdestinationに統合します。destinationで既に指定済みのプロパティがあった場合、sourcesのプロパティで上書きされます。</p>
<pre class="brush:js">
_ = require 'underscore'
extended = _.extend {
hoge: 'extend hoge'
hello: (name)->
'Hello, ' + name
}, {
hoge: 'hoge'
bool: false
seven: 7
hello: ()->
'Hello'
}, {
bool: true
}
console.log 'hoge=' + extended.hoge
console.log 'seven=' + extended.seven
console.log 'bool=' + extended.bool
console.log 'hello=' + extended.hello('Moe!')
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee extend.coffee
hoge=hoge
seven=7
bool=true
hello=Hello
</pre>
<hr />
<b>pick</b>
<p>_.pick(object, *keys)</p>
<p>pickは、オブジェクトの中のうち、キーを指定するとプロパティをコピーしてオブジェクトを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
pickked = _.pick {
'name':'山田 太郎'
'yomi':'やまだ たろう'
'email':'taro@yamada.me'
}, 'name', 'email'
console.log pickked
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee pick.coffee
{ name: '山田 太郎', email: 'taro@yamada.me' }
</pre>
<hr />
<b>defaults</b>
<p>_.defaults object, *defualts</p>
<p>defaultsは、オブジェクトのデフォルト値を決める時に使います。</p>
<pre class="brush:js">
_ = require 'underscore'
defaults = {
'hp':20
'mp':5
'items':['やくそう']
'weapons':['こんぼう']
}
hero = _.defaults {'hp':100,'weapons':['銅の剣']}, defaults
console.log hero
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee defaults.coffee
{ hp: 100, weapons: [ '銅の剣' ], mp: 5, items: [ 'やくそう' ] }
</pre>
<hr />
<b>clone</b>
<p>_.clone(object)</p>
<p>cloneは、オブジェクトのシャドウコピーを作成して返します。ネストされたオブジェクトや配列は、参照がコピーされ複製はされません。</p>
<pre class="brush:js">
_ = require 'underscore'
hero = {'name':'moe', 'items':[{'name':'銅の剣', 'count':5}]}
clonedHero = _.clone hero
console.log clonedHero
# クローンのネストされたオブジェクトを変更すると、、、
clonedHero.items[0].name = 'こんぼう'
console.log hero
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee clone.coffee
{ name: 'moe', items: [ { name: '銅の剣', count: 5 } ] }
{ name: 'moe', items: [ { name: 'こんぼう', count: 5 } ] }
</pre>
<hr />
<b>tap</b>
<p>_.tap(object, interceptor)</p>
<p>tapは、オブジェクトに対して割り込み処理を実行します。このメソッドは、chainメソッドの中ですぐに結果を処理する場合に利用されるのを目的としています。</p>
<pre class="brush:js">
_ = require 'underscore'
results = _.chain [1,2,3,100]
.filter (num)->
(num % 2) is 0
.tap(console.log)
.map (num)->
num * num
.value()
console.log results
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee tap.coffee
[ 2, 100 ]
[ 4, 10000 ]
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-69913444849432048562012-06-18T22:15:00.000+09:002012-06-18T22:15:23.855+09:00CoffeeScriptで学ぶ Underscore.js 10(Function編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>Underscore.js、10回目。Function編です。</p>
<hr />
<b>throttle</b>
<p>_.throttle(function, wait)</p>
<p>throttleは、waitで指定したミリ秒に1回だけfunctionを実行します。</p>
<pre class="brush:js">
_ = require 'underscore'
hello = ()->
console.log 'Hello!'
throttled = _.throttle hello, 1000
for x in [1..100000]
do ()->
throttled()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee throttle.coffee
Hello!
Hello!
</pre>
<p>Hello!が1秒ごとに表示されます。</p>
<hr />
<b>debounce</b>
<p>_.debounce(function, wait, [immediate])</p>
<p>debounceは、waitで指定したミリ秒が経過するまでfunctionを繰り返し呼ばれないようにします。</p>
<pre class="brush:js">
_ = require 'underscore'
hello = ()->
console.log 'Hello!'
lazyFunc = _.debounce hello, 1000
lazyFunc()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee debounce.coffee
Hello!
</pre>
<hr />
<b>once</b>
<p>_.once(function)</p>
<p>onceは、関数を1回しか呼ばれないようにすることができます。</p>
<pre class="brush:js">
_ = require 'underscore'
createApplication = ()->
console.log 'Initialize!'
initialize = _.once createApplication
initialize()
initialize()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee once.coffee
Initialize!
</pre>
<hr />
<b>after</b>
<p>_.after(count, function)</p>
<p>afterは、countで指定された回数だけfunctionが呼ばれると初めて実行されます。</p>
<pre class="brush:js">
_ = require 'underscore'
hello = ()->
console.log 'Hello!'
after = _.after(5, hello);
after()
after()
after()
after()
after()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee after.coffee
Hello!
</pre>
<hr />
<b>wrap</b>
<p>_.wrap(function, wrapper)</p>
<p>wrapは、functionで指定した関数をwrapperの中で使うことができます。</p>
<pre class="brush:js">
_ = require 'underscore'
hello = (name)->
'Hello, ' + name
wrapped = _.wrap hello, (func)->
"before: " + func('World') + " : after"
console.log wrapped()</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee wrap.coffee
before: Hello, World : after
</pre>
<hr />
<b>compose</b>
<p>_.compose(*functions)</p>
<p>composeは、複数の関数を与えると合成関数として返します。f(), g(), h()を合成すると、f(g(h())) を返します。</p>
<pre class="brush:js">
_ = require 'underscore'
hello = (name)->
'Are you ' + name
question = (statement)->
statement + '?'
who = _.compose hello, question
console.log who('moe')
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee compose.coffee
Are you moe?
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-25810480815288543702012-06-18T00:32:00.005+09:002012-06-18T00:32:50.565+09:00CoffeeScriptで学ぶ Underscore.js 09(Function編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>ようやくFunction編です。Underscore.jsの要です。</p>
<hr />
<b>bind</b>
<p>_.bind(function, object, [*arguments])</p>
<p>bindは、関数をオブジェクトにバインドして返します。関数が呼ばれると、第2引数objectが関数の中のthisの値となります。必要に応じて予め引数を記述して関数にバインドします。これは関数型言語でいうところの部分適用(部分パラメータ化)として知られています。</p>
<pre class="brush:js">
_ = require 'underscore'
func = (greeting)->
greeting + ', ' + this.name
func = _.bind func, {name:'moe'}, 'hi'
console.log func()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee bind.coffee
hi, moe
</pre>
<hr />
<b>bindAll</b>
<p>_.bindAll(object, [*methodNames])</p>
<p>第1引数のobjectにある複数の関数をすべてバインドしてオブジェクトを返します。第2引数で、バインドする関数を絞ることもできます。よくイベントハンドラで使われています。コンポーネントを作りたいとき便利です。</p>
<pre class="brush:js">
_ = require 'underscore'
buttonView =
label: 'underscore'
onClick : ()->
console.log 'onClick: ' + this.label
onHover : ()->
console.log 'onHover: ' + this.label
_.bindAll(buttonView)
buttonView.onClick()
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee bindAll.coffee
onClick: underscore
</pre>
<hr />
<b>memoize</b>
<p>_.memoize(function, [hashFunction])</p>
<p>memoizeは、計算結果を得ることにより得られた関数を返します。よく計算が遅い場合に処理を高速化するのに利用されます。関数型言語の記述に似せています。</p>
<pre class="brush:js">
_ = require 'underscore'
fibonacci = _.memoize (n)->
return n if n < 2
return fibonacci(n-1) + fibonacci(n-2)
console.log fibonacci(10);
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee memoize.coffee
55
</pre>
<hr />
<b>delay</b>
<p>_.delay(function, wait, [*arguments]) </p>
<p>delayは、setTimeout関数によく似ています。waitで指定したミリ秒後に関数functionを実行します。</p>
<pre class="brush:js">
_ = require 'underscore'
log = _.bind console.log, console
_.delay log, 1000, '1秒後のログ'
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee delay.coffee
1秒後のログ
</pre>
<p>実行後、1秒後にログが表示されます。</p>
<hr />
<b>defer</b>
<p>_.defer(function, [*arguments])</p>
<p>deferは、現在のコールスタックが空になるまでに関数を実行します。UIスレッドをブロックしないで、重い処理を走らす場合などに使います。</p>
<pre class="brush:js">
_ = require 'underscore'
_.defer ()->
num for num in [0..1000]
console.log num
console.log 'こっちが先'
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee defer.coffee
こっちが先
1001
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-5823365894432134522012-06-14T23:18:00.000+09:002012-06-14T23:18:23.004+09:00CoffeeScriptで学ぶ Underscore.js 08(Array編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>今回で8回目。Underscore.jsのArray編ラストです。</p>
<hr />
<b>uniq</b>
<p>_.uniq(array, [isSorted], [iterator])</p>
<p>uniqは、指定した配列の重複を削除した配列を返します。配列がソートされている場合、isSortedをtrueにすると、より高速なアルゴリズムで重複を削除します。iteratorでは、重複とみなさない条件を指定できます。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [4,3,2,1,2,1,4,2,3]
console.log _.uniq list
list = [1,2,2,2,3,3,4,4]
console.log _.uniq list, true
list = ["a", "a", "b", "c", "d", "d"]
console.log _.uniq list, true, (item, index, arr)->
item is "b"
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee uniq.coffee
[ 4, 3, 2, 1 ]
[ 1, 2, 3, 4 ]
[ 'a', 'b', 'c' ]
</pre>
<hr />
<b>zip</b>
<p>_.zip(*arrays)</p>
<p>zipは、複数の配列の中の同じindexを1つの配列にまとめ(zip)、その集合を配列として返します。</p>
<pre class="brush:js">
_ = require 'underscore'
ids = [1,2,3,4]
names = ['折木奉太郎', '千反田える', '福部里志', '伊原摩耶花']
cvs = ['中村悠一', '佐藤聡美', '阪口大助', '茅野愛衣']
console.log _.zip ids, names, cvs
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee zip.coffee
[ [ 1, '折木奉太郎', '中村悠一' ],
[ 2, '千反田える', '佐藤聡美' ],
[ 3, '福部里志', '阪口大助' ],
[ 4, '伊原摩耶花', '茅野愛衣' ] ]
</pre>
<hr />
<b>indexOf</b>
<p>_.indexOf(array, value, [isSorted])</p>
<p>indexOfは、valueで指定した値が、arrayのどのindexに位置するか返します。isSortedは、配列がソートされている場合trueを指定すると、より高速なアルゴリズムで処理します。</p>
<pre class="brush:js">
names = ['折木奉太郎', '千反田える', '福部里志', '伊原摩耶花']
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee indexOf.coffee
1
</pre>
<hr />
<b>lastIndexOf</b>
<p>_.lastIndexOf(array, value)</p>
<p>lastIndexOfは、indexOfが配列の先頭からvalueを走査するのに対して、配列の末から操作します。</p>
<pre class="brush:js">
_ = require 'underscore'
values = ['気になります', 'エコ', '気になります', 'エコ', '気になります']
console.log _.lastIndexOf values, '気になります'</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee lastIndexOf.coffee
4
</pre>
<hr />
<b>range</b>
<p>_.range([start], stop, [step])</p>
<p>rangeは、startから(stop-1)までの整数値をstep毎の集合を配列で返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.range 10
console.log _.range 90, 100
console.log _.range 0x00, 0xff, 0x32
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee range.coffee
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
[ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 ]
[ 0, 50, 100, 150, 200, 250 ]
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-69845876288759142442012-06-13T22:59:00.000+09:002012-06-13T23:01:11.197+09:00CoffeeScriptで学ぶ Underscore.js 07(Array編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>CoffeeScriptで学ぶ Underscore.jsの7回目。Array編の中編です。</p>
<hr />
<b>flatten</b>
<p>_.flatten(array, [shallow])</p>
<p>flattenは、入れ子になっている配列を1次元配列にして返します。第2引数のshallowをtrueにすると、最初の階層に限定します。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [1, [2], [3, [[[4]]]]]
console.log _.flatten list
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee flatten.coffee
[ 1, 2, 3, 4 ]
</pre>
<hr />
<b>without</b>
<p>_.without(array, [*values]) </p>
<p>withoutは、第1引数で指定した配列から、第2引数以降に指定した値を除いた配列を返します。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [1, 3, 1, 6, 0, 9]
console.log _.without list, 1, 0
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee without.coffee
[ 3, 6, 9 ]
</pre>
<hr />
<b>union</b>
<p>_.union(*arrays) </p>
<p>unionは、指定した複数の配列(集合)の和を配列で返します。SQLのUNIONに似ています。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.union ["a", "b", "c"], ["c", "f", "x"], ["b", "y"]
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee union.coffee
[ 'a', 'b', 'c', 'f', 'x', 'y' ]
</pre>
<hr />
<b>intersection</b>
<p>_.intersection(*arrays) </p>
<p>intersectionは、指定した複数の配列(集合)の積を配列で返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.intersection [1,2,4],[4,100,1],[2,4,1,99]
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee intersection.coffee
[ 1, 4 ]
</pre>
<hr />
<b>difference</b>
<p>_.difference(array, *others)</p>
<p>differenceは、withoutに似ていますが、第2引数を配列で指定できる点が異なります。第1引数で指定した配列から第2引数以降で指定した配列の要素を除いた配列を返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.difference [10,12,14,18,22], [12,22,100]
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee difference.coffee
[ 10, 14, 18 ]
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-34837707403953419692012-06-12T21:33:00.000+09:002012-06-13T23:01:32.288+09:00CoffeeScriptで学ぶ Underscore.js 06(Array編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>今日からArray編です。コツコツやっていきます。</p>
<hr />
<b>first</b>
<p>_.first(array, [n]) </p>
<p>firstは、配列の最初の値を返します。第2引数の n はオプションですが、最初の要素から何個飛ばすかを指定します。</p>
<pre class="brush:js">
_ = require 'underscore'
ipaddrs = [
"192.168.0.10"
"192.168.0.20"
"192.168.2.1"
"192.168.0.122"
"192.168.3.6"
]
console.log _.first ipaddrs
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee first.coffee
192.168.0.10
</pre>
<hr />
<b>initial</b>
<p>_.initial(array, [n]) </p>
<p>initialは、最後の要素を削除した配列を返します。第2引数の n はオプションで、最後の要素から何個飛ばすかを指定します。</p>
<pre class="brush:js">
_ = require 'underscore'
ipaddrs = [
"192.168.0.10"
"192.168.0.20"
"192.168.2.1"
"192.168.0.122"
"192.168.3.6"
]
console.log _.initial ipaddrs
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee initial.coffee
[ '192.168.0.10', '192.168.0.20', '192.168.2.1', '192.168.0.122' ]
</pre>
<hr />
<b>last</b>
<p>_.last(array, [n])</p>
<p>lastは、配列の最後の要素を返します。第2引数 n はオプションで、最後の要素から何個飛ばすかを指定します。</p>
<pre class="brush:js">
_ = require 'underscore'
ipaddrs = [
"192.168.0.10"
"192.168.0.20"
"192.168.2.1"
"192.168.0.122"
"192.168.3.6"
]
console.log _.last ipaddrs
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee last.coffee
192.168.3.6
</pre>
<hr />
<b>rest</b>
<p>_.rest(array, [index])</p>
<p>restは、最初の要素を除くすべての配列を返します。第2引数indexはオプションで、最初の要素から何個飛ばすかを指定します。</p>
<pre class="brush:js">
_ = require 'underscore'
ipaddrs = [
"192.168.0.10"
"192.168.0.20"
"192.168.2.1"
"192.168.0.122"
"192.168.3.6"
]
console.log _.rest ipaddrs
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee rest.coffee
[ '192.168.0.20', '192.168.2.1', '192.168.0.122', '192.168.3.6' ]
</pre>
<hr />
<b>compact</b>
<p>_.compact(array) </p>
<p>compactは、配列の中、false, null, 0, 空文字, undefined, NaNがあったらそれらを削除してコンパクトな配列を返します。</p>
<pre class="brush:js">
_ = require 'underscore'
ipaddrs = [
"192.168.0.10"
null
""
"192.168.2.1"
NaN
undefined
false
"192.168.3.6"
]
console.log _.compact ipaddrs
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee compact.coffee
[ '192.168.0.10', '192.168.2.1', '192.168.3.6' ]
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-25932253141224176762012-06-11T21:09:00.000+09:002012-06-13T23:01:48.992+09:00CoffeeScriptで学ぶ Underscore.js 05(Collection編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>Underscore.js 5回目、Collection編のラストです。</p>
<hr />
<b>groupBy</b>
<p>_.groupBy(list, iterator) </p>
<p>groupByは、与えられたリストをグルーピングします。グルーピングの条件はイテレータで指定します。イテレータにはinvoke同様、関数を文字列で指定することも可能です。</p>
<pre class="brush:js">
_ = require 'underscore'
ipaddrs = [
"192.168.0.10"
"192.168.0.20"
"192.168.2.1"
"192.168.0.122"
"192.168.3.6"
"192.168.4.8"
"192.168.3.22"
"192.168.1.100"
"192.168.4.9"
"192.168.5.232"
]
result = _.groupBy ipaddrs, (ip)->
ip.split('.')[2]
console.log result
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee groupBy.coffee
{ '0': [ '192.168.0.10', '192.168.0.20', '192.168.0.122' ],
'1': [ '192.168.1.100' ],
'2': [ '192.168.2.1' ],
'3': [ '192.168.3.6', '192.168.3.22' ],
'4': [ '192.168.4.8', '192.168.4.9' ],
'5': [ '192.168.5.232' ] }
</pre>
<hr />
<b>sortedIndex</b>
<p>_.sortedIndex(list, value, [iterator]) </p>
<p>sortedIndexは、指定した値がリストのどのインデックスに入るべきかを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
index = _.sortedIndex [-10,10,20,40,50], 45
console.log index
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee sortedIndex.coffee
4
</pre>
<hr />
<b>shuffle</b>
<p>_.shuffle(list) </p>
<p>shuffleは、与えられたリストの要素をシャッフルします。シャッフルのアルゴリズムには、有名な<a href="http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle">Fisher–Yates shuffle </a>を採用しています。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.shuffle [1,2,3,4,5,6]
console.log _.shuffle [1,2,3,4,5,6]
console.log _.shuffle [1,2,3,4,5,6]
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee shuffle.coffee
[ 2, 1, 4, 5, 3, 6 ]
[ 3, 5, 4, 2, 1, 6 ]
[ 5, 4, 2, 1, 6, 3 ]
</pre>
<hr />
<b>toArray</b>
<p>_.toArray(list) </p>
<p>toArrayは、与えられた引数を配列にして返します。argumentsオブジェクトを変換するのによく使われるそうで。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log (()->
_.toArray arguments
)(1, 2, 3, "hello", true, {name:"hoge"})
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee toArray.coffee
[ 1, 2, 3, 'hello', true, { name: 'hoge' } ]
</pre>
<hr />
<b>size</b>
<p>_.size(list)</p>
<p>sizeは、配列の大きさを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.size ["hello",2,false,4,{name:"hoge"}]
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee size.coffee
5
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-49668309995975148032012-06-10T21:47:00.002+09:002012-06-13T23:02:03.443+09:00CoffeeScriptで学ぶ Underscore.js 04(Collection編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>前回に引き続き、第4回。Collection編です。</p>
<hr />
<b>invoke</b>
<p>_.invoke(list, methodName, [*arguments])</p>
<p>invokeは、リストの各要素に対して指定したメソッドを実行します。メソッドは文字列で指定できます。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [[3,4,2],[6,5,8]]
result = _.invoke list, 'sort'
console.log result
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee invoke.coffee
[ [ 2, 3, 4 ], [ 5, 6, 8 ] ]
</pre>
<p>指定した名前のメソッドが存在しない場合、例外が投げられます。</p>
<hr />
<b>pluck</b>
<p>_.pluck(list, propertyName)</p>
<p>pluckは、リストの各要素のプロパティの値を配列で返します。</p>
<pre class="brush:js">
_ = require 'underscore'
users = [
{name:'Hoge', email:'hoge@example.com'}
{name:'Foo', email:'foo@example.com'}
{name:'Bar', email:'bar@example.com'}
]
console.log _.pluck users, 'name'
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee pluck.coffee
[ 'Hoge', 'Foo', 'Bar' ]
</pre>
<hr />
<b>max</b>
<p>_.max(list, [iterator], [context]) </p>
<p>maxは、リストの各要素のうち最大の「モノ」を返します。どのプロパティを最大値と比較するかを、イテレータで返します。</p>
<pre class="brush:js">
_ = require 'underscore'
users = [
{name:'アーキテクチャ', salary:10000000}
{name:'プログラマ', salary:800000}
{name:'社長', salary:25000000}
]
console.log _.max users, (user)->
user.salary
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee max.coffee
{ name: '社長', salary: 25000000 }
</pre>
<hr />
<b>min</b>
<p>_.min(list, [iterator], [context]) </p>
<p>minは、maxの逆の機能です。リストの各要素のうち最小の「モノ」を返します。どのプロパティを最小と比較するかを、イテレータで返します。</p>
<pre class="brush:js">
_ = require 'underscore'
users = [
{name:'アーキテクチャ', salary:10000000}
{name:'プログラマ', salary:800000}
{name:'社長', salary:25000000}
]
console.log _.min users, (user)->
user.salary
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee min.coffee
{ name: 'プログラマ', salary: 800000 }
</pre>
<hr />
<b>sortBy</b>
<p>_.sortBy(list, iterator, [context])</p>
<p>sortByは、リストを条件に従ってソートし、配列を返します。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [45, 30, 90, 60, 15, 75]
result = _.sortBy list, (item)->
Math.cos(item/180 * Math.PI)
console.log result
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee sortBy.coffee
[ 90, 75, 60, 45, 30, 15 ]
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-15573571885702859632012-06-07T23:08:00.002+09:002012-06-13T23:02:21.044+09:00CoffeeScriptで学ぶ Underscore.js 03 (Collection編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p>前回に引き続き、第3回。Collection編です。</p>
<hr />
<b> include</b>
<p> includeは、リストの中に第2引数に一致した値がある場合、trueを返します。条件は === で比較されます。</p>
<pre class="brush:js">
_ = require 'underscore'
result = _.include [1,2,3], 2
console.log result
result = _.include [1,2,3,4,5], 6
console.log result
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee include.coffee
true
false
</pre>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-86776992058143361382012-06-06T20:40:00.003+09:002012-06-13T23:02:45.426+09:00CoffeeScriptで学ぶ Underscore.js 02(Collection編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">前回のエントリー</a>でUserscore.jsをインストールし、いくつかのメソッドを紹介しました。今回は第2回。Collection編です。</p>
<hr />
<b>find</b>
<p>findは、リストの中から条件に最初にマッチした値を1つだけ取得するメソッドです。条件にマッチしない場合、undefinedを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
even = _.find [1,2,3,4,5,6], (n)->
n % 2 == 0
console.log 'even is ' + even
empty = _.find [1,2,3,4,5,6], (n)->
n % 10 == 0
console.log 'empty is ' + empty
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee find.coffee
even is 2
empty is undefined
</pre>
<hr />
<b>filter</b>
<p>filterは、リストの中から条件にマッチした値を配列で返します。条件にマッチしない場合、空の配列を返します。</p>
<pre class="brush:js">
_ = require 'underscore'
evens = _.filter [1,2,3,4,5,6], (num)->
num % 2 == 0
console.log 'evens is ' + evens
empty = _.filter [1,2,3,4,5,6], (num)->
num % 10 == 0
console.log 'length of array is ' + empty.length
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee filter.coffee
evens is 2,4,6
length of array is 0
</pre>
<hr />
<b>reject</b>
<p>rejectは、条件にマッチしなかった値を配列で返します。filterの逆の条件で作用します。</p>
<pre class="brush:js">
_ = require 'underscore'
odds = _.reject [1,2,3,4,5,6], (num)->
num % 2 == 0
console.log 'odds is ' + odds
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee reject.coffee
odds is 1,3,5
</pre>
<hr />
<b>all</b>
<p>allは、リストの各要素が条件にすべてマッチした場合にtrueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.all [2,4,6,8,10], (num)->
num % 2 == 0
console.log _.all ["あ", "い", "う"], (char)->
char == "い"
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee all.coffee
true
false
</pre>
<hr />
<b>any</b>
<p>anyは、リストの要素の中、ひとつでも条件にマッチした場合にtrueを返します。条件(イテレータ)がない場合、ひとつでもtrueと成り得る要素があった場合、trueを返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.any [0, null, 'true', false]
console.log _.any [1, 3, 5, 7], (num)->
num % 2 == 0
console.log _.any [1, 3, 5, 8], (num)->
num % 2 == 0
</pre>
<b>実行結果</b>
<pre class="brush:bash">
$ coffee any.coffee
true
false
true
</pre>
<hr />
<p><b>関連ページ</b></p>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-01collection.html">CoffeeScriptで学ぶ Underscore.js 01(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-11676330037912824732012-06-05T23:36:00.000+09:002012-06-13T23:02:59.292+09:00CoffeeScriptで学ぶ Underscore.js 01(Collection編)<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p><a href="http://documentcloud.github.com/underscore/">Underscore.js</a> は、Node.jsで最も利用されているパッケージです。JavaScriptに60以上の機能を追加します。</p>
<p>大きく6つの機能に分類されます。</p>
<ul>
<li><b>Collections</b>: Map/Reduce、ソート、検索、最大値、最小値、グループ化など</li>
<li><b>Arrays</b>: 先頭、末尾の取得、結合、ユニークなど</li>
<li><b>Functions</b>: バインド、遅延処理、後処理など</li>
<li><b>Objects</b>: Key/Value、型判定など</li>
<li><b>Utility</b>: エスケープ処理、IDなど</li>
<li><b>Chaining</b>: チェイン処理</li>
</ul>
<p>数が多いのでその日の気分で少しづつ紹介します。サンプルはCoffeeScriptで記述します。</p>
<p>インストール方法はいつも通り。</p>
<pre class="brush:bash">
$ npm install underscore
</pre>
<hr />
<p><b>each</b></p>
<p>eachは、配列やオブジェクトを一つ一つ処理します(イテレータ)。配列の場合、コールバックに一つの引数を指定します。オブジェクトの場合、コールバックに引数を2つ、値/キーの順で指定します。</p>
<pre class="brush:js">
_ = require 'underscore'
_.each [1,2,3], (n)->
console.log n
_.each {one:1, two:2, three:3}, (value, key)->
console.log key + '=' + value
</pre>
<pre class="brush:bash">
$ coffee each.coffee
1
2
3
one=1
two=2
three=3
</pre>
<hr />
<p><b>map</b></p>
<p>mapは、eachに似ていますが、eachではコールバック内に処理を記述するのに対して、mapではコールバックで処理した結果を配列で返します。</p>
<pre class="brush:js">
_ = require 'underscore'
console.log _.map [1,2,3], (n)->
n * 3
console.log _.map {one:1, two:2, three:3}, (value, key)->
key + ' x 3 = ' + value * 3
</pre>
<pre class="brush:bash">
$ coffee map.coffee
[ 3, 6, 9 ]
[ 'one x 3 = 3', 'two x 3 = 6', 'three x 3 = 9' ]
</pre>
<hr />
<p><b>reduce</b></p>
<p>reduceは、与えられたリストをイテレータに従って処理し、一つの値を返します。この例で、nはリストのうち一つの値、memoは前の処理結果(n+memo)です。最後のmemoの10は初期値です。初期値10に対して、1を加算し11、その11に2を加算して13、さらに13に3を加算して16。</p>
<pre class="brush:js">
_ = require 'underscore'
result = _.reduce [1,2,3], (memo, n)->
n + memo
, 10
console.log result
</pre>
<pre class="brush:bash">
$ coffee reduce.coffee
16
</pre>
<hr />
<p><b>reduceRight</b></p>
<p>reduceRightは、reduceがリストを前から処理するのに対して、後ろから処理します。</p>
<pre class="brush:js">
_ = require 'underscore'
list = [[0, 1], [2, 3], [4, 5]]
result = _.reduceRight list, (memo, n)->
memo.concat(n)
, []
console.log result
</pre>
<pre class="brush:bash">
$ coffee reduceRight.coffee
[ 4, 5, 2, 3, 0, 1 ]
</pre>
<p>concatは、2つの配列を結合するJavaScriptの関数です。この例では、最初に n が [4, 5] となり、memo が初期値の空の配列 [] で結合されます。次に n は [2, 3]で、memoは [4, 5] になりますので、結果は [[4, 5], [2 ,3]] となります。</p>
<hr />
<p>関連ページ</p>
<hr />
<p><b>関連ページ</b></p>
<ul class="posts">
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-07array.html">CoffeeScriptで学ぶ Underscore.js 07(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-06array.html">CoffeeScriptで学ぶ Underscore.js 06(Array編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-05collection.html">CoffeeScriptで学ぶ Underscore.js 05(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-04collection.html">CoffeeScriptで学ぶ Underscore.js 04(Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-underscorejs-03-collection.html">CoffeeScriptで学ぶ Underscore.js 03 (Collection編)</a></li>
<li><a href="http://codedehitokoto.blogspot.jp/2012/06/coffeescript-undersorejs-02collection.html">CoffeeScriptで学ぶ Underscore.js 02(Collection編)</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-30854826910344414132012-06-04T23:03:00.000+09:002012-06-04T23:03:01.048+09:00HaskellとyesodをMac OS X Lionにインストールする<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJAJtKQCltQIhFEXGxjcc35yOLuTmlmLaZZnpAHucbh-cOu2tSF5Q-ohRIOV_d6b6IxGk4HVK3AvEiuqRn_Hj6unaAB4nEZAl1x9L5t5wEGN9uMKaL71UPevrsJpT0jkD9s5GgFraNzH2R/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-06-04+22.06.19.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="137" width="279" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJAJtKQCltQIhFEXGxjcc35yOLuTmlmLaZZnpAHucbh-cOu2tSF5Q-ohRIOV_d6b6IxGk4HVK3AvEiuqRn_Hj6unaAB4nEZAl1x9L5t5wEGN9uMKaL71UPevrsJpT0jkD9s5GgFraNzH2R/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-06-04+22.06.19.png" /></a>
<p>巷で話題のプログラミング本「すごいHaskell たのしく学ぼう!!」(略して すごいH本)を手に入れましたので、早速インストールしてみます。</p>
<p>Haskell Platformをインストールします。</p>
<b>Haskell Platform</b><br />
<a href="http://hackage.haskell.org/platform/">http://hackage.haskell.org/platform/</a>
<p>pkgファイルなので、インストーラに従ってインストール。</p>
<p>ターミナルを開いて「ghci」を実行すると、REPL (Real Eval Print Loop) が起動します。</p>
<pre class="brush:bash">
$ ghci
GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude>
</pre>
<p>適当にいじってみます。</p>
<pre class="brush:bash">
Prelude> 2+5
7
Prelude> "hello" == "hello"
True
Prelude> True \= False
<interactive>:1:6: Not in scope: `\='
Prelude> True /= False
True
Prelude> succ 99
100
Prelude> length [5,4,3,2,1]
5
Prelude> reverse [5,4,3,2,1]
[1,2,3,4,5]
Prelude> ['A'..'Z']
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Prelude> [x*2 | x <- [1..20]]
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40]
Prelude> zip [1..] ["apple", "orange", "cherry", "mango"]
[(1,"apple"),(2,"orange"),(3,"cherry"),(4,"mango")]
Prelude>
</pre>
<p>うむ。面白い。</p>
<p>Ctrl+Dで抜けます。</p>
<p>HaskellでできたWebアプリケーションのフレームワークがいくつかありますが、ドキュメントが豊富な<a href="http://www.yesodweb.com/">Yesod</a>をインストールしてみます。</p>
<p>インストールにはgccコンパイラが必要です。最新のXCodeではgccが入らず、LLVMになっとります。なので、↓からDLしてインストール。</p>
<p>github</p>
<b><a href="https://github.com/kennethreitz/osx-gcc-installer">kennethreitz / osx-gcc-installer</a></b>
<p>ターミナルからcabalコマンドを実行します。(結構時間がかかります)</p>
<pre class="brush:bash">
$ cabal update
Downloading the latest package list from hackage.haskell.org
$ cabal install yesod-platform
(ダウンロードとコンパイルとインストールログ)
Updating documentation index
/Users/inouetomoyuki/Library/Haskell/doc/index.html
$
</pre>
<p>bash_profileに以下を追加します。</p>
<pre class="brush:bash">
export PATH=$HOME/Library/Haskell/bin:$PATH
</pre>
<p>再読み込み。</p>
<pre class="brush:bash">
$ source ~/.bash_profile
</pre>
<p>最初のWebを作ってみます。yesod initコマンドでいくつかの質問に答えていきます。自分の名前、プロジェクト名、データベースの種類を決めます。</p>
<pre class="brush:bash">
$ mkdir Projects && cd !$
$ yesod init
Welcome to the Yesod scaffolder.
I'm going to be creating a skeleton Yesod project for you.
What is your name? We're going to put this in the cabal and LICENSE files.
Your name: Tomoyuki INOUE
Welcome Tomoyuki INOUE.
What do you want to call your project? We'll use this for the cabal name.
Project name: Sample
Yesod uses Persistent for its (you guessed it) persistence layer.
This tool will build in either SQLite or PostgreSQL or MongoDB support for you.
We recommend starting with SQLite: it has no dependencies.
s = sqlite
p = postgresql
mongo = mongodb
mysql = MySQL (experimental)
So, what'll it be? s
That's it! I'm creating your files now...
Generating deploy/Procfile
Generating config/sqlite.yml
(・・・)
Start your project:
cd Sample && cabal install && yesod devel
or if you use cabal-dev:
cd Sample && cabal-dev install && yesod --dev devel
</pre>
<p>書いてある通りコマンドを実行します。 </p>
<pre class="brush:bash">
$ cd Sample && cabal install && yesod devel
</pre>
<p>開発サーバを起動します。</p>
<pre class="brush:bash">
$ yesod devel
Yesod devel server. Press ENTER to quit
Resolving dependencies...
Configuring Sample-0.0.0...
Rebuilding application...
Preprocessing library Sample-0.0.0...
Preprocessing executables for Sample-0.0.0...
Preprocessing test suites for Sample-0.0.0...
Building Sample-0.0.0...
Registering Sample-0.0.0...
Starting development server: runghc -package-confdist/package.conf.inplace devel.hs
Starting devel application
Devel application launched: http://localhost:3000
</pre>
<p>http://localhost:3000/にアクセスします。</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDDCMEfImvmJ26YaIweHWYPF7HYKkpixqHcCAZ21PIW7nQ4FrPGdVpmAGF7rPu1o6tHcM1b4DFZR-ZCwJRx63XNHgvpc8JWSK4mVDCK6r43s8tixM2Hu3JjxZsEc5U5lqGyhTd0RlqxaLX/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-06-04+22.50.34.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="251" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDDCMEfImvmJ26YaIweHWYPF7HYKkpixqHcCAZ21PIW7nQ4FrPGdVpmAGF7rPu1o6tHcM1b4DFZR-ZCwJRx63XNHgvpc8JWSK4mVDCK6r43s8tixM2Hu3JjxZsEc5U5lqGyhTd0RlqxaLX/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-06-04+22.50.34.png" /></a>
<p>無事インストールできました。</p>
<p>yesodは、超高速なWebアプリケーションフレームワークです。</p>
<p>公式のチュートリアルから引用です。</p>
<a href="http://yannesposito.com/Scratch/img/blog/Yesod-tutorial-for-newbies/haskell-benchmark.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="714" width="570" src="http://yannesposito.com/Scratch/img/blog/Yesod-tutorial-for-newbies/haskell-benchmark.png" /></a>
<p>node.jsの約3.44倍高速だそうです。未来です。</p>
<p>スペックについては、こちらが詳しいです。</p>
<b>Haskell から見た node.js</b><br />
<a href="http://d.hatena.ne.jp/kazu-yamamoto/20110825/1314254885">http://d.hatena.ne.jp/kazu-yamamoto/20110825/1314254885</a>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com1tag:blogger.com,1999:blog-3051334352101529692.post-5565651558787083842012-05-29T23:36:00.002+09:002012-05-29T23:36:05.162+09:00[Node.js] sprintfが意外と使える件<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<p><a href="https://github.com/maritz/node-sprintf">sprintf</a>は、その名の通り書式を指定して文字列を生成するパッケージです。</p>
<p>sprintfは、<a href="http://www.diveintojavascript.com/projects/javascript-sprintf">JavaScriptのsprintfライブラリ</a>と同じ動作をします。オブジェクトや配列を出力できます。</p>
<pre class="brush:bash">
$ npm install sprintf
</pre>
<p>CoffeeScript</p>
<pre class="brush:js">
sprintf = require('sprintf').sprintf
vsprintf = require('sprintf').vsprintf
# %2$s で2番目の文字を出力します。
console.log sprintf '%2$sは%3$sが%1$sです!', '大好き', 'ニャル子', '真尋さん'
# vsprintfでは配列を出力します
console.log vsprintf '登場人物: %s, %s, %s, %s', ['真尋', 'ニャル子', 'フー子', 'ハス太']
# オブジェクトを出力します。%(プロパティ名)s で指定します。
user = {name:'ニャルラトホテプ', nickname:'ニャル子'}
console.log sprintf '%(name)sのニックネームは、%(nickname)sです', user
# オブジェクトの配列も出力可能
users = [
{name: '真尋'}
{name: 'ニャル子'}
{name: 'フー子'}
]
console.log sprintf '%(users[0].name)s, %(users[1].name)s %(users[2].name)s', {users: users}
</pre>
<p>結果</p>
<pre class="brush:bash">
$ coffee sample.coffee
ニャル子は真尋さんが大好きです!
登場人物: 真尋, ニャル子, フー子, ハス太
ニャルラトホテプのニックネームは、ニャル子です
真尋, ニャル子 フー子
</pre>
<p>地味ですが強力なパッケージです。もちろん%d, %f, %xなども使えます。</p>Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0tag:blogger.com,1999:blog-3051334352101529692.post-69113073542688386092012-05-28T22:18:00.001+09:002012-05-28T22:18:31.830+09:00hook.ioで「 (」・ω・)」うー!(/・ω・)/にゃー!」してみた<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link><link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript">
</script><script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxSa7DKUH1ZIzTYewP1iRfOc-Gw283G4cRvqn_I3pRxs03UD3UYUcTd9d1NtO6zNvzo0Mr6clDf4t9aV8VdauyWx_oA6KtLYwxmlMhmDcoqmStepk2RiIWqbxyNRJ-haVBJl4IhAfRA5dW/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-05-28+21.38.36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxSa7DKUH1ZIzTYewP1iRfOc-Gw283G4cRvqn_I3pRxs03UD3UYUcTd9d1NtO6zNvzo0Mr6clDf4t9aV8VdauyWx_oA6KtLYwxmlMhmDcoqmStepk2RiIWqbxyNRJ-haVBJl4IhAfRA5dW/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-05-28+21.38.36.png" width="400" /></a></div>
<a href="https://github.com/hookio/hook.io">hook.io</a>は、ソケット通信を利用してデータ通信を可能にするパッケージです。イベント名をドメインで管理することができます。<br />
<pre class="brush:bash">
$ npm install -g hook.io
</pre>
<p>uh.coffeeとnya.coffeeを用意します。</p>
<b>uh.coffee</b><br />
<pre class="brush:js">hookio = require 'hook.io'
hookA = hookio.createHook {name: "a"}
hookA.on "*::uh", (data)->
console.log data
setTimeout ()->
hookA.emit 'nya', '(/・ω・)/にゃー!'
, 1000
hookA.start()
</pre>
<p>createHookメソッドでフックの名前を指定しています。hookA.on の第1引数にイベント名を指定します。これは::で区切ったドメイン風に指定できます。*::uh であれば、最後のイベント名が uh であれば補足して、第2引数に指定した関数を実行します。第2引数のメソッドの引数dataには、飛んできたdataが入ってきます。console.logでdataの内容を出力して、1秒したら nyaイベントを発火(emit)します。</p>
<p>続いてnya.coffee。</p>
<b>nya.coffee</b><br />
<pre class="brush:js">hookio = require 'hook.io'
hookB = hookio.createHook {name: "b"}
hookB.on 'hook::ready', ()->
hookB.emit 'uh', '(」・ω・)」うー!'
hookB.on '*::nya', (data)->
console.log data
setTimeout ()->
hookB.emit 'uh', '(」・ω・)」うー!'
, 1000
hookB.start();
</pre>
<p>hook::redayで1回 uhイベントを発火します。hook::readyは hookが用意できた時にhook.ioから発火されるイベントです。もし nyaイベントが飛んできたら データを出力して1秒後に uhイベントを発火します。</p>
<p>イベントをドメインでフィルタできるのがいいところ、かと。</p>
実行結果<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='518' height='408' src='https://www.blogger.com/video.g?token=AD6v5dxnCVdVV220EBSKuJp3zPqDciprPq3bhjXNwkUAOTBUXG3lknT5yocGL0gfC1AcSqsvirHczD_tjOerCQqy-w' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<br />
<br />
レッツ\(・ω・)/にゃー!Anonymoushttp://www.blogger.com/profile/16262076568927963256noreply@blogger.com0