5月 2013
35件の投稿
1 タグ
Backbone.js: イベントハンドラを指定する
Backbone.js においてイベントハンドラは events プロパティで指定する。イベントの観測対象となる要素のセレクターは el プロパティもしくはイベントのあとに記述する。 <div id="result"> <button id="mybutton">クリックしてください</button> </div> <script type="text/javascript"> var AppView = Backbone.View.extend({ el: "#result", events: { "click #mybutton": "clicked" }, clicked: function() { console.log("クリックされました"); ...
5月 14
1 リアクション
1 タグ
Backbone.js: モデルとビューの連携について
Q&A によるとモデルとビューのあいだの参照方法は複数存在する。直接のポインターを使い、ビューとモデルが一対一で対応させる(model.view と view.model)。ビューの生成と組織化を調整する中間的な「コントローラー」オブジェクトを用意する方法もある。イベントによるアプローチを好む人もおり、メソッドを直接呼び出す代わりに常にイベントを発動させる。
5月 14
1 リアクション
1 タグ
Backbone.js: モデルのデフォルトを指定する
defaults プロパティを使って、プロパティのデフォルトを指定することができる。デフォルトの値はインスタンス生成の際に指定されなかったプロパティに対して使われる。 var Meal = Backbone.Model.extend({ defaults: { "main": "焼き肉定食", "dessert": "アイスクリーム" } }); var order = new Meal; var order2 = new Meal({'main': 'カレーライス'}); // 焼き肉定食 console.log(order.get('main')); // カレーライス console.log(order2.get('main'));
5月 14
2 リアクション
1 タグ
Backbone.js: テンプレートを使う
Underscore.js に template メソッドが用意されているので、さっそく使ってみよう。ビューに template メソッドを用意しておけば、テンプレートを別のものに切り替えたときに、修正する箇所を減らすことができる。 var AppView = Backbone.View.extend({ el: '#result', initialize: function() { this.render(); }, template: _.template("Hello <%= name %>"), render: function(){ this.$el.html(this.template({ name:'masaki' })); return this; } }); var App = new...
5月 14
2 リアクション
1 タグ
Backbone.js: Hello World
Backbone.js で Hello World を行う。最小限必要なことは Backbone.View の extend メソッドを使って initialize メソッドと render メソッドを定義することおよび、ビューのインスタンスを生成することである。 initialize メソッドはビューのインスタンスを生成する際に実行されるメソッドである。今回は render メソッドの実行を指定した。el プロパティはビューのなかにおける DOM 要素(element)の表現である。$el は jQuery によって処理済みの DOM 要素である。jQuery が使えるので、el にはセレクターを指定することができる。 <script...
5月 13
1 リアクション
1 タグ
Underscore.js: テンプレートにおいてリストを生成する
each メソッドを使う。リストの項目は1つのプロパティに配列として渡す。 var list = "<% _.each(menu, function(item) { %> <li><%= item %></li> <% }); %>"; console.log( _.template(list, { menu : ['塩ラーメン', 'とんこつラーメン', '醤油ラーメン']}) );
5月 13
1 リアクション
1 タグ
Underscore.js: テンプレートを利用する
Underscore.js には template メソッドが用意されている。Backbone.js は Underscore.js に依存するので、 このメソッドをそのままテンプレートのために使うことができる。変数識別のための区切り文字は ERB と同じものが採用されているが、 _.templateSettingsを使って変更することもできる。イコール(=)記号の代わりにマイナス(-)記号を使えば変数に escape メソッドが適用される。 ただし、マイナス記号は見わけずらいので、escape メソッドを直接呼び出したほうがわかりやすいだろう。 var compiled = _.template("Hello "); var compiled2 = _.template("Hello "); console.log( // Hello Masaki compiled({...
5月 13
1 リアクション
1 タグ
Underscore.js: 関数であるプロパティから値を得る
プロパティが関数の場合、値を得るには関数を実行する必要があるが、_.defaults メソッドを使えば、あたかも通常のプロパティのように値を得ることができる。 var order = { main: 'カレーライス', dessert: function(){ return 'アイスクリーム'; }}; // アイスクリーム console.log( order.dessert(), order.dessert.apply(), _.result(order, 'dessert') );
5月 13
1 リアクション
2 タグ
Underscore.js: プロパティのデフォルトを指定する
変数のデフォルトを指定するには三項演算子が便利であるが、オブジェクトの複数のプロパティのデフォルトを指定するには Underscore.js の defaults メソッドが便利である。defaults メソッドの第1引数はオブジェクトで、第2引数はデフォルトのオブジェクトである。 var defaults = { main: "カレーライス", dessert: "アイスクリーム" }; // { main: 'カレーライス', dessert: 'アイスクリーム' } _.defaults({}, defaults)); // { main: 'オムライス', dessert: 'アイスクリーム' } _.defaults({ main: "オムライス" }, defaults);
5月 13
1 タグ
JavaScript: assert と assertEqual のコードスニペットを用意する
「ステートフル JavaScript」は assert および assertEqual メソッドを自前で定義してサンプルコードのさまざまな箇所で使っている。自前で定義すれば、テストフレームワークを使わなくてすむので、サンプルコードを試しやすくなる。 var assert = function(val, msg) { if (!val) { throw(msg || (val + "は真ではありません")); } } var assertEqual = function(val1, val2, msg) { if (val1 !== val2) { throw(msg || (val1 + "と" + val2 + "は等しくありません")); } }
5月 13
1 リアクション
1 タグ
教育目標を明確に説明できないだろうか?
プログラミングの学習に関して、技能の比重が大きいので、読書によって何を得られるのか期待できることをもっと明確に説明できないだろうか。 書籍全般に言えることであるが、それぞれの本がどのような教育目標を掲げ、どのような効果が得られるのかを明記したものはほとんど見られない。 逆にきちんと示すことができれば、書籍の売り上げにも役立つのではないだろうか。 近年、研修効果測定に関する書籍が相次いで出版されている。amazon で検索すると「はじめての教育効果測定」(2007)、「教育効果測定の実践」(2012年)「研修効果測定の基本」(2013年)といった書籍が見つかる。 教育学の分野ではより効果的な教授方法の研究が日夜続いている。 ...
5月 11
1 タグ
演繹よりも帰納のほうがわかりやすい
数学や物理のようにプログラミング言語の教科書において、一般的なルールや考え方を説明してから、そのルールを具体的な問題に適用するというやりかたは 広く行われている。しかし、よくある問題は準備段階の説明が長すぎることだ。初心者の段階では、記憶できる情報はかぎられているので、 具体的な練習に取り組むころには忘れてしまう。それよりも身近でよく見かける問題を示した上で、それを解くために必要最小限の知識を確認し、問題を解いてみせる。より高度な問題に取り組むための一般的な考え方を述べるほうが記憶に残りやすいのではないだろうか。数学や物理学の大学受験の教科書では典型的な書き方であるが、大学以降の教科書になるととたんにそのやりかたが忘れ去られてしまうのは何とも不思議なことである。
5月 10
5 リアクション
1 タグ
説明に不要なコード、コピペして動かないコードはなるべく教科書に使うべきではない
プログラミング言語の教科書において、不満なことは、現実的であるということを示すためなのか、ある機能の説明において、不要なコードが記載されていることが多い。しかし、説明に不要なコードは初心者の集中力をそらしてしまうので、掲載すべきではないし、またかぎられた誌面の空間をムダづかいしていることになる。 フレームワークやライブラリ解説書でないかぎり、言語の標準ではないライブラリやフレームワークを使わない動かないコードも避けるべきである。読者が確認する手間が増えるので、検証されない可能性が高くなるし、教科書のテストコードの量も増やすことになる。 ...
5月 10
4 リアクション
1 タグ
情報のフィルタリング、基本学習をこまめにやる、複数の概念を同時並行に操作する練習を心がける
初心者の段階では何が必要な情報なのか判断できず、どうでもよい情報を過剰に集めてしまう。またスキルが向上して、情報の処理能力が向上すると、要求水準をどんどん高くしてしまうことがある。 初心者の段階では、最初から効率よく情報を集めるというスタイルをやろうとすると、上達の妨げになるので、たいていのことはムダになることを承知の上でいろいろ試してみる。 わからないことはこまめに調べ、Twitter などに投稿してみる。基本的な説明やかんたんなコードをコピペして記録を続けてゆくと、そのうち、断片的な知識の貼り合わせから、一定の文章やコードが書けるようになる。それまで他人のやりかたをそのまままねてみる。 ...
5月 10
2 リアクション
1 タグ
Backbone.js: jQuery 関連の変更について
0.9.0: ビューに新しいプロパティが追加されました。$el はビュー要素へのキャッシュ済みの jQuery (もしくは Zepto) 参照です。setElement はビューの el を手動で設定する代わりに使うべきです。このメソッドは view.el と view.$el の両方を正しく設定し、新しい DOM 要素にイベントを再度デリゲートを行います。 0.9.9: $.ajax のデフォルト利用をオーバーライドするために Backbone.ajax フックが追加された。AJAX の機能が時代遅れであるなら、サーバーとのコミュニケーションのために望ましいメソッドをセットします。 Backbone が使う DOM 操作と Ajax 呼び出しを設定するには、setDomLibrary の代わりに Backbone.$ = … を使います。
5月 10
2 リアクション
1 タグ
Backbone.js: イベントの変更について
手元の書籍のコードとはだいぶ変わってしまっていたので、チェンジログから抜粋することにした。抜粋した内容はすべてではないことに注意。 0.5.2 で bind メソッドはコールバック関数の this を第3引数で指定できるようになった。 0.5.3 でビューの events プロパティを関数、オブジェクトリテラルで定義できるようになった。これによってプログラミングによるイベントの定義や継承がかんたんになる。 0.9.0 で model.on(“change:name change:age”, …) のように複数のイベントを指定して発動させることができるようになった。 bind と unbind メソッドは jQuery に on と off に改名された。 コレクションの add と remove...
5月 10
1 リアクション
3 タグ
教科書の設計について
自分が学んだことを今後どのようにまとめてゆけばよいのかについて、PHP の教科書を例に考える。 概念を学んでから最終的にアプリケーションをつくるのではなく、最初につくるべきアプリケーションの要件や機能を示した上で、概念を学んでゆく。 個別の課題はできるだけ最終成果のアプリケーションにつながるようにすべきである。重要であるがアプリケーションをつくる上で必須ではない項目は書かないか、最後の補足としてまとめる。 アプリケーションをつくる際にはマイクロフレームワークを使う。素の PHP を書いた上でマイクロフレームワークを使ったコードのリファクタリングしてもよいだろう。マイクロフレームワークを導入する前にテンプレートエンジンの導入を示したほうがわかりやすいだろう。テンプレートエンジンに最小限のロジックしか求めないので、Mustache...
5月 8
1 リアクション
3 タグ
配列関数の分類について
CRUD(Create、Read、Update、Delete)、一階関数か高階関数かどうか、デフォルトとカスタマイズ方法の3つの分類を挙げることができる。
5月 8
1 リアクション
1 タグ
script タグの src 属性で相対 URL を指定することについて
cndjs.com のサイトにおいてライブラリの URL の記述において HTTP プロトコルが省略されていたので、正しい書き方なのか stackoverflow を調べたら、RFC 3986 において相対的な URL として認められているとのことであった。ただし、Mac OSX において HTTP サーバーを立ち上げずに、ファイルシステムから HTML ファイルをブラウザーで表示させるとファイル内の相対パスとして解釈されてしまうので、ローカル環境での開発を考慮すると、省略はしないほうがよいだろう。
5月 7
1 タグ
JavaScript: 配列から空の要素を削除する
JavaScript の配列から空の要素(falsy な値)を削除するには filter メソッドを使う。これは PHP の array_filter と似たようなふるまいである。stackoverflow の「Remove empty elements from an array in Javascript」を参考にした。falsy と truthy に関しては以前記事を書いた。 var array = [, 0, false, null, NaN, undefined, '']; console.log(array.filter(Boolean)); console.log(array.filter(function(elem) { return elem; }));
5月 7
1 リアクション
2 タグ
array_filter を使って空の値を削除する
empty 関数によって空であると見なされる値 (falsy) に関して、配列以外であれば array_filter を使って削除することができる。 // $var は未定義の変数 var_dump(array_filter( ["", 0, 0.0, "0", null, false. [], $var] )); 上記のコードを実行すると、配列が Array という文字列に変換される。 array(1) { [5]=> string(5) "Array" } 解決方法の1つは空の配列を false など空の値として判定される値に変換してから array_filter を適用する。 var_dump( array_filter( array_map( function($elem)...
5月 6
2 リアクション
2 タグ
array_map、array_walk、array_walk_recursive、array_fil...
array_map だけコールバックが第1引数になっており、ほかの関数はコールバックを第2引数にとる。 array array_map ( callable $callback , array $arr1 [, array $... ] ) bool array_walk ( array &$array , callable $funcname [, mixed $userdata = NULL ] ) bool array_walk_recursive ( array &$input , callable $funcname [, mixed $userdata = NULL ] ) array array_filter ( array $input [, callable $callback = "" ] ) mixed array_reduce ( array...
5月 6
1 リアクション
1 タグ
Bower を使う
Bower は JavaScript のパッケージマネージャであり、Twitter が開発している。 node.js のパッケージマネージャである npm を使って Bower をインストールすることができる。 npm install -g bower jQuery をインストールする。 bower install jquery#2.0 backbone.js もインストールしよう。 bower install backbone インストールされたパッケージの一覧は bower ls コマンドで調べることができる。 bower ls bower discover Please wait while newer package versions are being discovered ├── backbone#1.0.0 └──...
5月 6
2 リアクション
1 タグ
Plan 9 失敗の教訓
Wikipedia の記事によると Unix にとって代わることを目的とした Plan 9 は Unix ほどの人気を得ることはなく、研究用ツールから抜け出すことはなかった。 エリック・レイモンドは The Art of Unix Programming のなかで次の考察を示した。 Plan 9が失敗したのは単に、Unix がそれ以前のシステムを凌駕したほどPlan 9は注目に値する改良ではなかったからである。Plan 9に比べると Unix はガタピシ言って錆付いたところもあるが、与えられた仕事はちゃんとやっており、現在の位置に留まるだけの資格がある。野心的なシステムアーキテクトへの教訓がここにある。よりよいソリューションにとって最も危険な敵は、すでに存在する十分うまく動作するコードベースである。
5月 6
1 タグ
個人の Facebook ページをつくる
以前、学習記録のために Facebook ページを用意することを検討したときに、Facebook ページの名前をどうしようか悩んでいたのだが、個人の名前にすることに傾いている。 理由としては、長期的には、興味関心のある分野が大きく変わってゆく可能性が高いことと、個人の Facebook のアカウントではログインをしていないと、自分のつぶやきが表示されない問題があるからだ。 もう1つ積極的にやる価値としては、電子書籍プラットフォームの普及による電子書籍の著者の増加、ネット選挙解禁やスマートフォン増加による政治家のニーズなど、個人の Facebook ページを運用するニーズは今後も増えてゆくと見られるので、自分が Facebook ページを実際に運用すれば、運用ノウハウを貯めることができるし、アドバイスするときに説得力があるだろう。
5月 5
1 タグ
Wikipedia で使われるプログラミング言語の事例
Wikipedia(MediaWiki) において PHP が使われることはよく知られているが、ほかの言語は以外と知られていないようなので、書いておく。 Special:VersionにアクセスすればWikipedia に導入されている PHP および Lua のバージョンを調べることができる。 PHP - サイト全般 (MediaWiki として配布) Lua - コンテンツレイヤーにおけるテンプレート言語 Ocaml - 数式画像の生成 Python - pdf の生成、多言語間リンクのためのボット Java - Apache Lucene による検索
5月 5
4 リアクション
2 タグ
C 言語で書かれた PHP フレームワークについて
Phalcon が示すように、C 言語による PHP フレームワークのメリットは圧倒的なパフォーマンスである。2010年代に入り、ウェブサイトの制作において、早く書けることからパフォーマンスが注目を集めるようになってきている。エクステンションの課題は C 言語および Zend API を学習する必要があるので、ソースコードのメンテナンスをできる人が大幅に絞られてしまう。 エコシステムの可能性としては、C 言語の実装レベルでさまざまな競合が出現するのか、それとも PSR のように Phalcon の API をほかのフレームワークが採用するのか。 後者に関して、PSR はロガーを採用することに至っただけなので、現状では考えずらい。 現時点で前者を選ぶよりも、ほかの言語に切り替えるほうが有望であろう。Rails から Go...
5月 4
1 リアクション
1 タグ
Android 陣営の断片化と勝ち負けの明暗
Android の開発において各社の機種の互換性がないことがアプリ開発者の負担になっていることが問題になり、Android 4.2 SDK から使用許諾が変更され、断片化につながるような行為を禁止する事項が盛り込まれた。 一方で Android 陣営の勝ち負けも明確になり、サムスンとアマゾンが大きなシェアをもつようになった。Google がサムスンのシェアに懸念を示すようになり、タブレット市場において Kindle Fire が存在感を示すようになった。勝ち組のハードウェアに絞り込めば、検証のコストを抑えることができる。Android,フラグメンテーションの良い点・悪い点の記事では Kindle Fire に特化することを勧めるアメリカのスタートアップの意見が紹介されている。 また、Android および iOS...
5月 4
3 リアクション
2 タグ
GitHub が普及した時代におけるライブラリプロジェクトのありかた
PHP のライブラリプロジェクトの先行事例として、PEAR や Horde、PHP Classes といったプロジェクトが存在する。 PHP 5.0 から 5.2 の時代は Zend Framework、 PHP 5.3 の時代は Symfony、PHP 5.4 の時代に Aura for PHP が参入した。 GitHub が普及した時代において、ライブラリプロジェクトのありかたが変わり、関連の少ないライブラリやコンポーネントを1つのプロジェクトで抱える必然性がなくなった。これは PHP だけでなくほかの言語 この点で、Zend Framework はどのように変わるのか見守る必要がある。Zend Lucene...
5月 4
1 タグ
自分が後で検索して見直す可能性のある情報を Twitter につぶやく
この Tumblr にも言えることですが、Twitter の便利な点は Google などでちょっとした調べものを記録して後で見直せることです。 文章にまとめずらい新しい分野の情報や断片的な情報を書き留めて、Twilog のようなログ記録サービスを利用すれば、後で見直して、ブログにまとめれば、何が問題なのか、はっきりしてきます。自分のためのちょっとした情報システムを構築しているようなものです。 以前、「納得した表現を得るためには同じことを何度も繰り返して書く」 という記事を書きましたが、自分のうっすらとした問題認識をきちんと文章にまとめられるようになるまでには、コピペなどでもよいので、こまめに記録してゆく必要があります。
5月 3
4 リアクション
2 タグ
マイクロフレームワークの課題
2000年代末期からフレームワークの巨大化とともに学習コストが大きくなったことから、マイクロフレームワークが注目を集めるようになった。PHP は HTTP を意識せず、またライブラリを導入しなくても標準関数およびサーバーに導入された拡張モジュールが提供する関数を使って手軽に Web アプリケーションをつくれることから人気を博したので、原点に戻ったとも言える。巨大なコミュニティが生まれる一方で、小規模なサイトのニーズは これからもなくなることは考えられないので、ニーズの持続性に関しては問題はない。 マイクロフレームワークの課題を挙げる。 ...
5月 3
1 タグ
「マイケル・ポーター教授のものづくり競争戦略」の記事から競争と戦略に関する誤解やまちがいを要約
2008年12月に東京・六本木アカデミーヒルズで開催されたポーター氏の講演の記事から競争と戦略に関する記述を抜粋した。 最高の競争力は存在しない。顧客のニーズは多様なので、競争に勝つための方法がたった1つだけに限られることはなく、たくさんあるからである。 どの企業も同じ商品、同じサービスを提供するのであれば、顧客に選択の余地がなくなり、どれを選ぶかの判断は価格しかなくなる。企業間の競争は お互いをすり減らすばかりで、勝利することが困難になる。 顧客のすべてのニーズを満たす、最高のものを提供することを考えるのではなく、特定の顧客に価値を提供するに当たり、他社とはどのように異なるやり方を創造できるか、どのようにしたら顧客にとってユニークな利得を生み出せるか考えるべきである。 戦略を、特定の行動、目標、ビジョンと混同するケースがよく見られる。 ...
5月 3
2 タグ
Linux ディストリビューションが古い PHP のバージョンを採択する傾向にある問題
Linux ディストリビューションは古い PHP のバージョンを採用する傾向にあるため、開発者は自前でビルドするか、 そのディストリビューションのためのパッケージを提供するリポジトリサービスを利用する必要がある。 開発環境においても、PHP の最新のバージョン導入を支援する phpenv のようなツールが台頭してきている。 Debian のように慢性的にパッケージ作成やテストのボランティアが不足していることが挙げられる。
5月 2
2 リアクション
2 タグ
PHP のバージョン選択についての追記
今の時点での分析では PHP 5.4、5.5 をプロジェクトの最小要件とするようになる場合、 機能の観点からは弱いので、PHP 5.4、5.5 のシェアが一定規模を超えたときが考えられる。 PHP のバージョンをできるかぎり、低く抑える傾向にある CMS は WordPress のように既存のユーザーをたくさん抱えているプロジェクトが挙げられる。 PHP 5.4 のトレイトに関して追記が必要である。Python の多重継承、Ruby のモジュール、Scala のトレイトが先行しており、PHP のトレイトと同等の機能を必須と考えるのであれば、既存の PHP ユーザーはそれらの言語に移行している可能性が高い。 よって PHP 5.4 がリリースされてから新しいユーザーが参入してくるかどうかを考える必要がある。
5月 2
1 タグ
オープンソースの普及活動を10代の教育や非営利組織の支援に結びつけられないか調査中
今後、オープンソースの普及活動と10代のための教育活動、および非営利組織の ICT の面での支援を結びつけることができないか模索しており、そのために NPO 設立も視野に入れて、調査しております。 NPO の設立から運用まで学ぶのにどの本を探せばよいのかは日本NPO学会賞が参考になります。 2010年に初代 iPad が発売されてから3年が立ち、義務教育においてタブレットの活用が広まろうとしています。東京都内では荒川区が2014年度に区内の全小中学生に授業用のタブレット(多機能携帯端末)を配布することになっています。総務省が、小中校および特別支援校を対象としたICT利活用推進のためのガイドラインを配布しています。 ...
5月 1
1 リアクション
4月 2013
62件の投稿
1 タグ
非営利組織と教育の問題
非営利組織のための IT 活用の支援、子どものためのプログラミング教育の支援といった活動を考えている。 何の問題に取り組めばよいのか考えるために、非営利組織に関わりのある教育の問題を見ることにする。 ICT の活用。保育園、幼稚園でタブレットを活用するところもある。小中校における実践例は総務省「フューチャースクール推進事業」文部科学省「学びのイノベーション事業」で見ることができる。 理系の大学においても専任の教員がいないために。じゅうぶんな教育が提供できていないところも存在するだろう。 ...
4月 30
1 リアクション
1 タグ
学習記録のために Facebook ページを用意することを検討
以前、プログラミングのコード練習のためにもう1つの Tumblr を用意したことがあったが、それほど使わなかったことやこのブログとの二重管理になってしまうことから廃棄することになった。 一方で、今後自分に必要なのは非営利組織の勉強。ただ、このブログとは内容が異なるので、いろいろ書き出すことには引け目を感じている。 オープンソース活動の延長にあるので、教育関連を中心に考えている。子どものためのプログラミング教育も近年注目を集めるようになってきている。海外においては IT 技術による非営利組織を支援する団体が存在する。ウェブ利用のための広報やマーケティングの知識も必要であるし、組織の継続性を考えると、組織戦略や政策提言も学ぶ必要がある。近年、官民協働が言われるようになり、協働のためのフレームワークを示す書籍が行政関連や交渉学の分野で出版されている。 ...
4月 30
1 リアクション
1 タグ
Scala: 部分適用
引数の一部に値を渡して新しい関数をつくるとき、この新しい関数を部分適用された関数と呼ぶ。関数作成の際に値を渡さない引数にはアンダースコアを使う。 > def sum(a:Int, b:Int, c:Int) = a + b + c sum: (a: Int, b: Int, c: Int)Int > sum(1,2,3) res29: Int = 6 > val sum2 = sum(1, _:Int, 3) sum2: Int => Int = > sum2(2) res30: Int = 6 > sum2.apply(2) res31: Int = 6
4月 29
1 リアクション
1 タグ
Scala: 関数の合成
Scala には関数の合成を簡潔にあらわす手段として compose と andThen メソッドが用意されている。f compose g は f(g(x)) を意味し、f andThen g は g(f(x)) を意味する。合成関数に関して、交換法則は成り立たない。 > val f = (x: Int) => x*x + x + 1 f: Int => Int = > val g = (x: Int) => x + 1 g: Int => Int = > val h = f compose g h: Int => Int = > val h2 = f andThen g h2: Int => Int = > h(1) res25: Int = 7 > h2(1) res26: Int =...
4月 29
1 リアクション
1 タグ
Scala: for 式でフィルターを指定する
for 式はジェネレーターのあとにフィルターを指定することができる。1から10の整数の範囲をつくり、5より小さい数値でかつ2の倍数を絞り込む例は次のようになる。 > (for {n <- 1 to 10 if n < 5 if n % 2 == 0} yield(n)).map(_ * 2) res15: scala.collection.immutable.IndexedSeq[Int] = Vector(4, 8) for の代わりに WithFilter メソッドを使うと次のように書ける。フィルタリングのあとに別のメソッドが続く場合、withFilter は filter よりもパフォーマンスを改善できる。 > Range(1,10).withFilter(n => n < 5 && n % 2 ==...
4月 29
1 タグ
2013年前半における PHP の学習について
セキュリティ対応のためにさまざまなヘッダーが追加されたので、JavaScript 対策と合わせて整理したい。 PHP 5.5 でジェネレータが導入されたので、配列、イテレータ、オブジェクトとの比較学習を行う必要がある。 型変換、デフォルト値と Option クラスの導入の扱いの記事をまとめたい。 JavaScript と合わせてバリデーションについて知識を整理したい。 PHP 5.4 で導入されたトレイトによって GoF のデザインパターンがどのように変わるのかを Ruby のモジュール、Scala のトレイトの事例から調べたい。 一方で関数型言語のスタイルでは GoF のデザインパターンが別のイディオムや機能で解決されてしまうことと、関数型言語ならではのイディオムやパターンを学ぶ必要があり、それらを PHP...
4月 29
1 タグ
2013年前半における JavaScript の学習について
復習。JavaScript を学ぶ上で最初の障壁はイベント駆動をはじめとするクロージャを多用するプログラミングスタイル、DOM、Ajax の API のわかりずらさなので、CoffeeScript、jQuery を併用して作業に慣れることが必要だ。 プログラミング言語の初心者は CoffeeScript からはじめてよいのかもしれない。 jQuery に慣れてから改めて、JavaScript のイベント、DOM、Ajax を学んだほうがわかりやすい。 イベントに関して、jQuery はフューチャとプロミスを採用した。jQuery のイベントシステムのドキュメントも整備されたので、内部挙動を知るのに必要だ。FRP (関数型リアクティブプログラミング)を学ぶ必要がある。題材として Bacon.js を考えている。 ...
4月 28
3 リアクション
1 タグ
Scala: Unicode のコードポイントと文字の相互変換
数値から文字に変換するには toChar メソッドを使う。逆に文字を数値に変換するには toInt メソッドを使う。通常、println を使う場合、数値は10進法に表示されるので、16進法として表示させるには Scala 2.10 で導入されたString Interpolationを使う。 > List.range(0x61, 0x66).map(_.toChar).mkString res27: String = abcde > "abcde".map(_.toInt).toList res28: List[Int] = List(97, 98, 99, 100, 101) > "abcde".foreach(s => println(s.toInt)) 97 98 99 100 101 > "abcde".foreach(s =>...
4月 28
1 リアクション
1 タグ
Scala: 存在しない Map のキーが求められたときに返すデフォルト値を指定する
存在しない Map のキーを求められたときに返すデフォルトの値は withDefaultValue もしくは withDefault メソッドで指定する。withDefaultValue の引数は値で withDefault の引数は関数リテラルを指定する。 > val m = Map("one" -> 1, "two" -> 2).withDefaultValue("Not Found") m: scala.collection.immutable.Map[String,Any] = Map(one -> 1, two -> 2) > m("three") res11: Any = Not Found > m.apply("three") res12: Any = Not Found > val m = Map("one"...
4月 28
2 リアクション
1 タグ
Scala: Iterator で範囲をあらわす
List や Map などの記事と比べると Iterator の記事は少なくなるが、言語の基本的な機能なので学ぶ必要がある。 同じように 1 から 5 までの整数のリストをつくる。range メソッドを使うことができる。リストへの変換には toList メソッドを使う。 > Iterator(1,2,3,4,5).toList res94: List[Int] = List(1, 2, 3, 4, 5) > Iterator.range(1,6).toList res91: List[Int] = List(1, 2, 3, 4, 5) foreach と println を組み合わせて出力する際には次のようにかっこや引数を省略できる。 > Iterator.range(1,6) foreach println for...
4月 28
3 リアクション
1 タグ
Scala: List を使って数値の範囲をあらわす
前の記事では Range を使って範囲をあらわした。この記事では List を使って数値の範囲をあらわすことに取り組む。 まず、1 から 5 までの整数を並べてみよう。個別の要素を指定するやりかたは次のとおり。チュートリアルを書く場合、後述する関数の使い分けとして、まったく知識がない人を想定するかどうかが挙げられる。 > List(1,2,3,4,5) res47: List[Int] = List(1, 2, 3, 4, 5) コンス演算子を使ってリストを生成することができる。 > 1::2::3::4::5::Nil res55: List[Int] = List(1, 2, 3, 4, 5) 個別に指定せず、範囲で指定するには range メソッドを使う。 > List.range(1,6) res57:...
4月 28
2 リアクション
1 タグ
Scala: for 式は Option 型を配慮してくれる
for expressions versus foreach in Scala のなかでよいコードサンプルを見つけたので紹介。Scala の for 式は Option 型を配慮してくれるので、if 式を使って場合わけしなくてよい。 > val list = List(Some(1), None, Some(2)) list: List[Option[Int]] = List(Some(1), None, Some(2)) > for (Some(i) <- list) yield i res37: List[Int] = List(1, 2)
4月 28
2 リアクション
1 タグ
Scala: yield を使って for 式から新しいコレクションを生成する
yield を使って for 式から新しいコレクションを生成することができる。1から5までの整数を要素とする Vector を生成してみよう。 > for (i <- 1 to 5) yield i res35: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5) List に変換するには toList メソッドを使う。 > (for (i <- 1 to 5) yield i).toList res36: List[Int] = List(1, 2, 3, 4, 5) Vector を直接生成するには次のとおり。 > Vector(1,2,3,4,5) res52: scala.collection.immutable.Vector[Int]...
4月 28
4 リアクション
1 タグ
Scala: 範囲をあらわす Range を使う
Scala において等間隔の範囲をあらわすコレクションとして Range が用意されている。 1から5までの範囲をあらわす Range オブジェクトを求めてみよう。 コンストラクタから生成する方法をまずやってみよう。第1引数は下限、第2引数は上限、第3引数は数値の幅である。 > new Range(1,6,1) res10: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5) 次にto メソッドもしくは until メソッドを使って求めよう。to メソッドと until メソッドの違いは上限を含むか含まないかである。to メソッドが上限を含むのに対して、until メソッドは上限を含まない。 > 1 to 5 res23:...
4月 28
1 リアクション
1 タグ
Scala: 関数リテラルと部分適用された関数の省略表記
1 から 5までの整数を表示することを考える。関数リテラルをすべて記述するのであれば次のとおり。 > 1 to 5 foreach((x:Int) => println(x)) 型だけ省略することができる。 > 1 to 5 foreach(x => println(x)) プレースホルダー構文を利用すれば、関数リテラルのパラメーターを省略できる。 > 1 to 5 foreach(println(_)) かっこを省略し、関数とプレースホルダーのあいだにスペースを入れれば部分適用された関数に置き換わる。 > 1 to 5 foreach(println _) foreach に指定する関数はその場で関数呼び出しが必要と考えられるので、プレースホルダーを省略することができる。 > 1...
4月 28
3 リアクション