ロジックレス・テンプレート Mustache マニュアル

githubにあったロジックレス・テンプレート Mustacheのマニュアルを翻訳しました。


mustache(5)

  1. mustache(5)
  2. Mustache Manual
  3. mustache(5)

NAME

mustache — ロジックレステンプレート.

SYNOPSIS

一般的な Mustache のテンプレート:

Hello {{name}}
You have just won ${{value}}!
{{#in_ca}}
Well, ${{taxed_value}}, after taxes.
{{/in_ca}}

以下のハッシュを与えると:

{
  "name": "Chris",
  "value": 10000,
  "taxed_value": 10000 - (10000 * 0.4),
  "in_ca": true
}

次のような文字列を生成します:

Hello Chris
You have just won $10000!
Well, $6000.0, after taxes.

DESCRIPTION

MustacheはHTMLや設定ファイル、ソースコード等どのようなものに使用することができます。Mustacheはハッシュかオブジェクトの中で提供される値を使用して、テンプレート中のタグを拡張することにより作動します。

if,elseやforループの構文を持たないので私たちはこれを”logic-less”と呼びます。
その代わりとしてタグだけがあります。
いくつかのタグは値や空値その他の一連の値に置き換えられます。
このドキュメントはMustacheの異なるタイプのタグについてを説明します。

TAG TYPES

タグは2重の中括弧で表します。{{person}}はタグです。{{#person}} もタグです。
どちらの例においても、personをキーまたはタグ・キーと呼びます。
異なるタイプのタグについて話しましょう。

Variables

最も基本的なタグタイプは変数です。基本的なテンプレートにおける{{name}}タグはコンテキスト中からnameキーを探そうとします。
もしnameキーがなければ何も表示されません。

全ての変数はデフォルトでHTMLエスケープが行われます。
もしエスケープしていないHTMLを返したい場合は3重の中括弧を使用します。例) {{{name}}}.

エスケープ回避に&を使うこともできます。例){{& name}}.
こちらはデリミタを変更している場合に便利でしょう。 (後述の “Set Delimiter” を参照).

デフォルトでは一致する変数が存在しない場合に空文字を返します。
この動作について通常はMustacheライブラリで設定することができます。
Ruby版のMustacheはこのような場合に例外の送出をサポートしています。

Template:

* {{name}}
* {{age}}
* {{company}}
* {{{company}}}

Hash:

{
  "name": "Chris",
  "company": "<b>GitHub</b>"
}

Output:

* Chris
*
* &lt;b&gt;GitHub&lt;/b&gt;
* <b>GitHub</b>

Sections

セクションはコンテキスト中のキーがもつ値によってテキストブロックを1回または複数回表示します。

セクションは#で始まりスラッシュの付いた閉じタグで終わります。
すなわち、{{#person}}はpersonセクションを始めます。そして{{/person}}はそれを終了しています。

セクションの振る舞いはキーに設定された値によって決定されます。

False または 空のリスト

もしpersonキーがFalse または 空のリストを値としてもっていれば、タグの開始から終了までのHTMLは表示されません。

Template:

Shown.
{{#nothin}}
  Never shown!
{{/nothin}}

Hash:

{
  "person": true,
}

Output:

Shown.

空ではないリスト

もしpersonキーが空ではないリストを値としてもっていた場合、そのテキストブロックは1回またはリストが持つアイテムの数だけ表示されます。

ブロックのコンテキストリストのeachイテレーションに対してカレントのアイテムをセットします。
この方法でコレクションをループ処理することができます。

Template:

{{#repo}}
  <b>{{name}}</b>
{{/repo}}

Hash:

{
  "repo": [
    { "name": "resque" },
    { "name": "hub" },
    { "name": "rip" },
  ]
}

Output:

<b>resque</b>
<b>hub</b>
<b>rip</b>

ラムダ

値が関数やラムダ式のような呼び出し可能なオブジェクトの場合は、オブジェクトはinvokeされ、そしてテキストブロックを渡します。
渡されたテキストは表示されないリテラルブロックです。
{{tags}}は拡張しません。ラムダはそれ自体を拡張するべきです。
この方法でフィルタやキャッシュを実装できます。

Template:

{{#wrapped}}
  {{name}} is awesome.
{{/wrapped}}

Hash:

{
  "name": "Willy",
  "wrapped": function() {
    return function(text) {
      return "<b>" + render(text) + "</b>"
    }
  }
}

Output:

<b>Willy is awesome.</b>

Falseでない値

値がFalseでなく、且つリストでもない場合、それはブロックを1回表示するコンテキストとして使用されます。

Template:

{{#person?}}
  Hi {{name}}!
{{/person?}}

Hash:

{
  "person?": { "name": "Jon" }
}

Output:

Hi Jon!

Inverted Sections

負のセクションはキャレット(^)で始まり、スラッシュで終わります。
つまり{{^person}} は”person”負のセクションを開始し、{{/person}}はそれを終了します。

セクションがキーの値によってテキストを1回または複数回表示するのに使用されるのに対して、負のセクションはキーの値の逆値によってテキストを1回表示します。
すなわちキーが存在しない、またはFalseであるか空のリストの場合に表示されます。

Template:

{{#repo}}
  <b>{{name}}</b>
{{/repo}}
{{^repo}}
  No repos :(
{{/repo}}

Hash:

{
  "repo": []
}

Output:

No repos :(

Comments

コメントは!で始まり、表示上は無視されます。以下のテンプレートは

<h1>Today{{! ignore me }}.</h1>

次のように表示されます:

<h1>Today.</h1>

コメントは改行を含むことが出来ます。

Partials

Partialsは>記号で始まります。{{> box}}のように書きます。

Partialsは(コンパイルタイムの対義語としての)ランタイムで表示されます。
すなわち、再起的Partialsは可能です。ただ、無限ループは回避してください。

Partialsはコンテキストの呼び出しを継承できます。ERBでこうであるものが:

<%= partial :next_more, :start => start, :size => size %>

Mustache では単にこう書きます:

{{> next_more}}

なぜか?それはnext_more.mustacheファイルがそのsizeを継承し、コンテキストからstartメソッドを呼び出すからです。

あなたはそれが文字通りでなくともPartialsをincludeやテンプレート拡張のように考えたいと思うかもしれません。

例えば、次のテンプレートとpartialsです:

base.mustache:
<h2>Names</h2>
{{#names}}
  {{> user}}
{{/names}}

user.mustache:
<strong>{{name}}</strong>

これらを1つのものと見なすしてテンプレートを拡張できました:

<h2>Names</h2>
{{#names}}
  <strong>{{name}}</strong>
{{/names}}

Set Delimiter

Set Delimiterタグは=記号で始まり、タグのデリミタを{{ と }} で囲まれる任意の文字列に変更します。

以下の不自然な例で考えてみましょう。

* {{default_tags}}
{{=<% %>=}}
* <% erb_style_tags %>
<%={{ }}=%>
* {{ default_tags_again }}

ここに3つのアイテムを持つ1つのリストがあります。
最初のアイテムはデフォルトのタグスタイルを使用します。
2つ目はSet Delimiteタグによって定義されたERBスタイルのデリミタを使います。
そして3つ目はまた別のSet Delimite定義によってデフォルトのスタイルを使用します。

ctemplatesによれば、「これはTeXのような言語に役立つ。そこでは、テキストに2重の中括弧が生じるかもしれず、markupに使用するのには不向きである」とされています。

カスタムデリミタはスペースや=記号を含むことができません。

COPYRIGHT

Mustache is Copyright (C) 2009 Chris Wanstrath

Original CTemplate by Google

SEE ALSO

mustache(1), mustache(7),
http://mustache.github.com/

linux : wget で 接続先を指定する

hostsを切り替えるには/etc/hostsを編集すればよい。
しかし、wgetのコマンド中だけhostsを切り替えたい場合は、以下のように–headerオプションに”Host:”を指定する。

wget -O - --header "Host: example.com" http://127.0.0.1/

これでexample.comというドメインを指定してhttp://127.0.0.1/を見に行くことができる。
※hostsを編集する必要は無い
–headerのパラメタをシングルクォートで囲むとなぜか上手くいかないことがあるのでダブルクォート推奨。

ついでに wget の結果を標準出力にだすには`wget -O`

wget -O - http://example.com/

php : なるべく正確なIPアドレスを取得する

何回も書いている気がするのでメモしておく。
phpでforwardなどを考慮したなるべく正確なリモートアドレスを取得するメソッド。

function client_ip(){
   $ipaddress = $_SERVER['REMOTE_ADDR'];
   if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
      $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
   }elseif(isset($_SERVER['HTTP_X_REAL_IP'])){
      $ipaddress = $_SERVER['HTTP_X_REAL_IP'];
   }
   return $ipaddress;
}

Ubuntu:コードチェッカーpfffをインストールする

phpのコードチェッカーfacebook/pfffをUbuntuにインストールする手順。

注意:Ubuntuのバージョンは11.04以上にすること。

ライブラリ

必要なライブラリをインストールする。

sudo apt-get install libpcre3-dev libgtk2.0-dev libcairo2-dev libpango1.0-dev
sudo apt-get install binutils-gold
sudo apt-get install libmysqlclient-dev 
sudo sudo apt-get install libdb4.8-dev

pfff

pfffのソースをダウンロードする。

git clone https://github.com/facebook/pfff.git

ビルド

全部の機能を有効にするには以下のオプションでconfigureしてビルドする。

cd pfff
./configure --with-all
make depend
sudo make

コマンド

コードをチェックする際は以下のコマンドを実行する。

scheck /path/to/file

emacs

emacsからpfffのコードチェッカーを使えるようすると便利。

C-cplでphp-lint,C-cpsでpfffのscheckコマンドを実行する設定。
init.el

(add-hook 'php-mode-hook
  '(lambda ()
  ;; 構文チェック用のショートカット
    (local-set-key "\C-cpl" 'php-lint)
    (local-set-key "\C-cps" 'pfff-scheck)
  )
)
(defun php-lint ()
  "Performs a PHP lint-check on the current file."
  (save-buffer)
  (interactive)
  (shell-command (concat "php -l " (buffer-file-name))))
(defun pfff-scheck ()
  "Performs a pfff's scheck on the current file."
  (save-buffer)
  (interactive)
  (shell-command (concat "scheck " (buffer-file-name)))
)

pfffの概要とmacOSへのインストール方法はこちら
http://ymotongpoo.hatenablog.com/entry/20110220/1298217871

WindowsにHaxe環境をインストール

HaxeをWindowsにインストールする方法を適当に翻訳しました。
※動作確認は「手動インストール」しかしていません。


自動インストール

必要なコンポーネントを全てインストールするにはHaxeのWindows用インストーラが最も簡単な方法です。
インストーラは以前にインストールされていたHazeとNekoのアップデートも行います。

注意:インストーラはインターネットアクセスを必要とします。プロキシ環境にインストールする場合は手動インストールを行なってください。

必要環境

OS: Windows 98 以降
ネットワーク: インターネットアクセスできること

インストール手順

1.実行ファイルをダウンロード
HaxeのダウンロードページからWindows用のインストーラをダウンロードします。

2.インストーラを実行
ダウンロードした実行ファイルをダブルクリックして実行します。いくつかのウィンドウが表示されます。
コマンドプロンプトのウィンドウは無視して構いません。それらは既存のHaxeとNekoをチェックしています。
「Haxe Installer」という数行のテキストが表示されているウィンドウが現在のインストール状況を示しています。
インストーラの指示に従ってインストールを進めます。最後にインストールが成功したか、あるいはエラーメッセージがが表示されます。
インストーラを終了して、インストールの確認を行います。


手動インストール

手動インストールは自動インストールより技術的な作業を含みますが、ユーザがより細かに開発環境を整えることを可能にします。
しかし、手動インストールは自動インストールのようにシングルクリックで最新のHaxeにアップデートする機能を持ちません。

必要環境

無し

インストール手順

1.Haxeをダウンロード

HaxeのダウンロードページからWindowsの手動インストール用バイナリをダウンロードします。

2.Haxeを解凍
Hazeのzipファイルを展開します。

3.Nekoをダウンロード
KekoVMのWindows用バイナリをNekoVMのウェブサイトからダウンロードします。

4.NekoVMを解答
NekoVMのzipファイルを展開します。

5.NekoとHaxeのパスを追加します。


インストールの確認

1.コマンドプロンプトを開きます。

2.haxeとタイプしてコマンドUsageが表示されればインストールは成功しています。

C:\Users\hoge>haxe
Haxe Compiler 2.10 – (c)2005-2012 Motion-Twin
Usage : haxe.exe -main [-swf|-js|-neko|-php|-cpp|-cs|-java|-as3] [options]
Options :
-cp : add a directory to find source files
-js : compile code to JavaScript file
-swf : compile code to Flash SWF file
-as3 : generate AS3 code into target directory
-neko : compile code to Neko Binary
-php : generate PHP code into target directory
-cpp : generate C++ code into target directory
-cs : generate C# code into target directory
-java : generate Java code into target directory
-xml : generate XML types description
-main : select startup class
-lib : use a haxelib library
-D : define a conditional compilation flag
-v : turn on verbose mode
-debug : add debug informations to the compiled code
-help Display this list of options
–help Display this list of options

以下のメッセージが表示される場合は、haxeのパスを追加してください。

'haxe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

3.nekoとタイプしてコマンドUsageが表示されればインストールは成功しています。

C:\Users\hoge>neko
NekoVM 1.8.2 (c)2005-2011 Motion-Twin
  Usage : neko 

以下のメッセージが表示される場合は、nekoのパスを追加してください。

'neko' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

Arduino環境をMacOSにセットアップする

Arduino環境をMacにセットアップします。
ボードはARDUINO Unoを使用しています。

Getting Started w/ Arduino on Mac OS X ここに書いてある通りですが手順を箇条書きにします。

1.ArduinoボードとUBSケーブルを用意する
ボードは各種あります。USBはABプラグです。

2.Arduino environmentをダウンロードする
 ダウンロードページ:http://arduino.cc/en/Main/Software
 Mac用のArduino environmtを選択します。

3.ダウンロードしたファイルを解答してできる、Arduino.appを/Applicationにコピーする

  cp -R Arduino.app /Application

4.USBケーブルでMacとArduinoボードを接続します。

5.Arduino.appを起動する

6.メニューから File > Examples > 1.Basics > Blink.を選択します

7.メニューから Tools > Board でボードを選択します

8.メニューから Tools > Serial Port で /dev/tty.usbmodem を選択します

9.アップロードを実行します。
アップロード中はTX/RXのLEDが明滅します。
アップロードが終わるとLのLEDが明滅します。

これで環境のセットアップはおしまい。

ボードの設計図を見るためにCADソフトEAGLEはここからダウンロードする。
http://www.cadsoftusa.com/download-eagle/?language=en

設計書はPDF版もあるので、必須ではない。

7つの言語 7つの世界:Ruby 1日目

セルフスタディ
探してみよう

・Ruby API
http://www.ruby-doc.org/core-1.9.3/

・Programing Ruby: The Progmatic Programmer’s Guide[TFH08]のオンライン版
http://www.ruby-doc.org/docs/ProgrammingRuby/

・文字列の一分を置換するメソッド
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-replace

・Rubyの正規表現に関する情報
http://www.ruby-doc.org/core-1.9.3/Regexp.html

試してみよう
・文字列”Hello,world”を出力する

irb(main):001:0> puts 'Hello, world'
Hello, world
=> nil

・文字列”Hello,Ruby”の中の”Ruby”という単語のインデックスを検索する

irb(main):002:0> puts 'Hello, world'.index('world')
7
=> nil

・自分の名前を10回出力する

irb(main):003:0> puts 'nakyau ' * 10
nakyau nakyau nakyau nakyau nakyau nakyau nakyau nakyau nakyau nakyau 
=> nil

・文字列”This is sentence number 1″ の 1を10までカウントアップしながら10回出力する

irb(main):004:0> 1.upto(10) { |i| puts "This is sentence number #{i}" }
This is sentence number 1
This is sentence number 2
This is sentence number 3
This is sentence number 4
This is sentence number 5
This is sentence number 6
This is sentence number 7
This is sentence number 8
This is sentence number 9
This is sentence number 10
=> 1

・ファイルに格納されているRubyを実行する

$ ruby test.rb 

第1回 関数型言語勉強会 大阪に参加しました

第1回 関数型言語勉強会 大阪に参加しました。

@s_kozake さん 関数型言語入門

CPUのマルチコア化
副作用が無い関数型は平行処理と相性がいい
これまで以上に並行処理が重要になる
内部DSLを作成しやすい(ホスト言語?)
関数型言語の特徴である、リスト内包表記/ラムダ/高階関数をHaskell,Scala,Javaでそれぞれの事例についての説明。

リスト内包表記はHaskellが格好いいと思った。

@kuchitama さん Clodure

ClojureはLISPのJVM実装
ClojureのビルドツールLeiningen
Clodure学習サイト 4Clojure

書籍「7つの言語 7つの世界」
最近、括弧が大好きなのでLISPもClojureもやってみたい。

@kitora_naoki さん 関数型って?

・第1級関数を扱えること
 →第1級関数を第1級オブジェクトとして扱えること。
 →第1級関数とはプログラミング実行時に生成され、関数自体を引数にしたり戻り値として使用することが出来る。
・参照透過性が常に保たれること=純粋関数型言語
 →変数への破壊的代入をしない → 漸化式
 →副作用を担当するのがモナド

@posaunehm(ぽざうね) さん 初心者がF#を触ってみた

F#はC#のLinqに似ている
VisualStudioはインテリセンスが優秀

写経をGithubにコミットする手法は勉強の成果が形に残るのでよさそう。
写経対象のライセンスによっては非公開にしておいたほうがいいかも。

@uskz さん プログラムを計算する話

数学的モデルの利点を利用する→問題が複雑すぎるときに数学モデル化すれば、定義の範囲を超えて複雑になることはない。
関数の代数として圏を使う。データ型に依存しない型判定
計算を使って関数を合成する例
Fokkingaの相互再帰定理?(よくわからない、ググる)
関数から2項関係に一般化することの利点
→関係から逆関係を利用できる、関係の合併も関係として扱える。
 関係の代数はAllegoryと呼ばれる特殊な圏論を使う。
リチャード・バード氏の本を読むと良い

ナップサック問題,val,digitsの例は解りそうなので、自分でもやってみたい。
val,digitsは逆関係と評価できるのだろうか?

@its_out_of_tune さん 関数型脳になろう!(仮)

Javaで副作用なしのプログラミングをした話。
ループ・破壊的代入なしでもJavaでBrainF*ckが実装できる。
ラムダの説明。

@ikegami__ さん 速習・関数型言語

読んでみたい本がたくさんあった。
プログラミング言語の基礎概念 (ライブラリ情報学コア・テキスト)
」と「プログラミングの基礎 (Computer Science Library)
」をポチっ。

@quassia88 さん Inverse FizzBuzz を解いてみよう

Inverse FizzBuzzの問題日本語訳
http://d.hatena.ne.jp/matarillo/20120515/p1
解法のヒント
→FizzBuzzの並びは循環するので、循環するFizzBuzzのリストを作成する
→問題を分割して指定値より大きいFizzやBuzzを返す関数を作る。
注意事項:最短になっているか?解のない問題に対してくラッシュしないか。空リストに対しても解を返すか?長いFizzBuzz列に対しての回答できるか?

ソースはgitHubに上がる予定。

@kyon_mm さん OCamlの多相ヴァリアントの紹介

多相Valiantは型安全なEnumみたいなもの?
Ocamlの多相Valiantは3つある。固定、開いている、閉じている。

@syamino 代数的データ型をラムダ計算の中で表現する方法

代数的データとパターンマッチについて。ラムダ計算でパターンマッチする例。
→スコットエンコーディング・・・(Yコンビネータでググる)
→チャーチエンコーディング・・・haskellのfoldr
チャーチ数はチャーチエンコーディングされた自然数

パターンマッチをラムダでする2つの方法について。
後半よく解らなくなってしまった。
パターンマッチをラムダで書く場合2つの選択があることが解った。
それぞれにメリット・デメリットがあるとのことだが、foldrと同等の処理ならチャーチエンコーディングで良いのかもしれない。

@keita44_f4 スタートSML#!

SML#は日本生まれのML言語。CやSQL言語との連携
Cをインポートすれば何でも出来るじゃないか。

@irof さん

Haskellのテスト Cabal,HUnitについて
brew install ghc
brew install cabal-insall
brew install hspec

セッションは関数型言語やその周辺技術についての概念の説明が多かった。
私は実務で関数型言語を使っていないので、実装に寄った話になるともっと解らなかったかもしれない。
カリー化等を実装ベースで「こう書いたらこれができる」とあやふやに理解しているので、言語ごとに違う実装例をみると、理解が激しく揺らぐ。

懇親会でおすすめの本等を聞かせたいただいた。数学ガールは読んでみようと思う。
懇親会でお話を聞かせていただいた方々の中には、関数型言語や関数型言語のフレームワークを用いて業務を効率化したいという意識を持っている人が複数いらっしゃった。
私は仕事では職場環境に合わせて開発し、趣味として仕事で使わないような言語や環境を触るのが好きですが、この取り組み方だと「仕事で使えるレベルまで到達しよう」という意識は生まれにくいので、もっとハードルを上げて技術の習得に臨むべきかもしれないと感じました。

PHPカンファレンス関西2012に参加しました

PHPカンファレンス関西2012に参加してきました。
今回は20分のお時間をいただきKohanaのセッションも担当させていただきました。

とりわけ、今回はPHP5.4のフィーチャーや個性的なフレームワークについてのセッションが印象に残りました。

懇親会では翻訳やユーザコミュニティについてたくさんのご意見を頂くことが出来ました。ありがとうございます。

今回の発表のスライドを公開しています。
PHPフレームワークKohana