Template Toolkit 社内勉強会のレポート

あちこち間違ってるという指摘を受けたのであちこち直しました><

にぽたんさんによる、Template Toolkit(TT)の社内勉強会がありました。 という訳でOpen & Share

アジェンダ

  • 変数展開について
    • オブジェクトからの呼び出し
  • 意外と知られてない事
  • 質問への回答

変数展開について

TTはPerlなので、Perlに準拠する。
Perlは$とか@(シギル)で変数の型がわかるけど、TTにはそういうのがない。 しかし、型自体は持っている。

実際は複雑で、スカラーのなかに配列とかなんか色々あるらしい。

スカラー

実は業務ではあんまり使われない。 単一の値しか持たない文字列。 または数値。

配列

一つの変数の中に複数の値を持つ値
ちなみにコード中に登場する "=" と "in" に違いはない。 全く同じ動作をする。
ちなみにFOREACH中に登場する "=" と "in" に違いはない。 全く同じ動作をする。

ハッシュ

keyとvalueのペアの組み合わせを持つ変数。 順番という概念がない。

オブジェクト

実際の業務では最も使う事が多い。
Perlソースコードでセットされる。
Perlのオブジェクトは、多くは高機能なハッシュ。 ハッシュに色んな機能を授けたものをオブジェクトと呼んでたり。 まあでも、必ずハッシュってわけじゃない。 ハッシュ的な使い方ができる別のもの、みたいな。

メソッド
[% IF article.is(hogehoge) %] ←こんな風に引数がある場合は確実にオブジェクト

一見するとハッシュぽいけど、実はDBからデータを引いてくるオブジェクト(メソッド)もある

[% article.id %] ←実はDBから引いてる
[% article.owner.nickname %] ←ここだけ見ても、メソッドなのかハッシュなのかは分からない
オブジェクトからの呼び出し

ハッシュ要素を持つオブジェクトは、同名のkey展開もメソッド呼び出しもできる場合がある。
例えば[% foo.bar %]で、bar が値とメソッドの両方で使われている場合(名前の重複)、メソッドが優先される。
意図的にハッシュを優先するには、item()メソッドを使う。

[% foo.bar #method %]
[% foo.item('bar') #hash %]
[% foo.item(3) #array %] ←配列形式でも呼び出せる

違う書き方にfoo.$num とかもあるけど、きもかったらitem()で。
あと、PGが設計ミスをして item っていうメソッドを定義しちゃってたら打つ手が無い。

意外と知られてない事

テンプレートを構成する要素

  • Directive
  • VMethod
  • Filter
Directive

大文字で書いてるやつ。 命令。

[% INCLUDES %]
[% IF hogehoge %]

ちなみにアパッチとかの命令も大文字。これもDirective.
TTは変数名を大文字にするとDirectiveと解釈する事があるので注意。

VMethod

Vはバーチャルの意味。 変数の後からドットで繋がれているメソッド。

[% IF array.size > 0 %]
[% hoge.item() %]
[% IF foo.match('-') %]

配列とかスカラーに必ず使えるメソッドをVMethodという

Filter

文字列に対してのフィルタリングを行う。 文字列の後からパイプで繋ぐ。
結構簡単に作れるので、案件ごとに作ってる物が存在する。
TT標準のフィルターもある。

[% hoge | html %]
[% hoge.truncate(10) %]

など。
uriフィルタはquery stringに変換してくれて便利。 だけど、TTのバージョンが2.16以降じゃないと使えない。

Directiveの紹介


DEFAULT
このDirectiveが登場した時点で、その変数の値が0または未定義だった場合に適用される

[% DEFAULT foo = '123' %]
[% foo %]

変数fooの中身が0かそもそも未定義だったら、fooに文字列123が代入されてそれを出力する。


UNLESS
IFの逆。ややこしいので、最初はUNLESSは無視して考えると良い。 最後に反転する。
UNLESSのorは絶対に通る。間違ってやっちゃわないように注意。


SWITCH / CASE
条件分岐が複雑な場合に使う。 ただしイコール判定しかできない。

[% SWITCH 'foo' %]
[% CASE foo %] ←fooなら
 hoge
[% CASE ['fooo', 'foooo'] %] ←foooかfoooo
 hogehoge
[% CASE %] ←どれにも適合しなければ
 orz
[% END %]

ちなみにIF ELSEとの使い分けは、書く人の好みだったり。


META

[% META
  title = 'foo'
  text = 'hoge'
 %]

みたいに定義すると、そのテンプレート内で使える。 使う際はtemplate変数で使う。

[% template.title %]

わざわざMETAとtemplate変数を使う理由
絶対に汚染されない変数だから。 予約されている。
予約されているのは他にもある。

  • template
  • compornent
  • loop
  • error
  • content

あと、Ver,2.19以前は tags が使えないバグがある。


loop
FOREACHとかWHILEの中で自動で設定される変数。 VMethod.

[% loop.last %]
[% loop.size %]
[% loop.count %]

など。


PROCESS
変数のスコープがグローバル。 全ての変数の値が上書きされる。
つまり、インクルードされるファイル側の変数がhtmlファイル側でも使える。


INCLUDE
変数のスコープがレキシカル。 参照はできるが、上書きはしない。
つまり、インクルードされるファイルの変数はhtmlファイル側では使えない
こっちのがまあ安全。


INSERT
そのまんま出す。 速度は一番速い。
TTの構文を解釈しない。

また、PROCESSやINCLUDEは、BLOCKの実行をする場合にも使う



Q&Aコーナー

Q viewの、とあるテンプレで使える変数を知るには、MとかC側のファイルを見るしかないですか?

A Yes.

Q 処理が重くなるテンプレート側の書き方ってありますか?

A 基本的にはシステム側のが影響が大きいけど、DBを引いてくるメソッドを何度も書くとロスはでる。 キャッシュ化すると良い。

Q テンプレートをさわる人に知っておいてほしいルールとかありますか?

A ユーザが入力できる内容を出力する変数にはhtmlフィルタを付ける事。 セキュリティホールになるので。

ディレクターのためのUNIX勉強会(第一回)

社内勉強会で、Clouder先生による「ディレクターのためのUNIX勉強会」がありました。 僕はディレクターじゃないけどしれっと参加してきました!
と言うわけでそのまとめです。

UNIXって何?

WinやMacと何が違うの?

OSが違う。

Linuxって何?

LinuxUNIXではなく、UNIXのようなもの。 UNIXみたいのをある人が作った。 それがLinux
本来はカーネルLinuxと呼ぶ。 カーネルはシステムの一番コアな部分。 本来はOSカーネルLinuxと呼ぶ。 が、最近はOS一群をLinuxと読んでいる。

ディストリビューションって何?

Linuxを一般の利用者が使えるようにまとめたもの(ほぼWikiペディアから引用)。 DebianRedhatがある。
UNIXの仲間はLinux以外にもあって、FreeBSDとかがそれ。 他にはOS10とかiPhoneOSなんかもそう。 ちなみにOS10のカーネルDarwinという。

ターミナルとかプロンプトって何?

ターミナル

CUIでコンピュータを操作するための端末、がそもそもの意味。 ここではその機能をもったアプリケーションの事。

プロンプト

ターミナルの窓の中でちかちかしてるやつの左側の部分。 ちかちかしてるやつはカーソル。
プロンプトはカスタムできるので、いい感じにするとよい。
「それ変えてどうするの?」という質問に対しては「キミも壁紙とか変えるでしょ?」との事。
試しに、.bashrcに
export PS1="$ \W\n "
っていうのを追加してみたら、結構見やすくなった。

ログインについて

UNIXはログインが必要。 Winも最近はログインが必要だったりするけど、UNIXは昔から。
電源を入れてそのまま使えると、セキュリティの観点で危険。 UNIXは昔から、ユーザーごとにログインできる。

シェルって何?

ログインした時に、操作をするためのベースのソフトウェア。 プロンプトは、正確にはシェルプロンプトと言う。
いろいろ種類があって、shとかbashとかcshとかzshとか。
このへんは宗教戦争もあって、「○○は小学生まで」とか、なんか色々あるらしい。 シェルが違うと、Tab補完が違ったりとか色々あるんだとか。

ディレクトリって何?

WinとかMacとかでいうフォルダの事。

感想とか

最初に「テクハラに負けないようになりましょう」みたいな言葉を賜ったのですが、見物に来ていたCTOをはじめエンジニアの人達の乱入が既にテクハラでした!
(乱入含め)勉強になったので次回も(乱入含め)とても楽しみです!

CSSを書くときとかに(俺が)便利っぽいAHK

;Arrow
$^h::
Send, {left}
return

$^j::
Send, {down}
return

$^k::
Send, {up}
return

$^l::
Send, {right}
return


;END HOME
$^+h::
Send, {Home}
return

$^+l::
Send, {End}
return


;Delete
$^+x::
Send, {Delete}
return


;ESC
vkF3sc029::
Send, {Esc}
return

vkF4sc029::
Send, {Esc}
return


;CSS
$^`;::
Send, {:}
Send, {Space}
Send, {`;}
Send, {left}
return

$^[::
Send, {{}
Send, {Enter}
Send, {Enter}
Send, {}}
Send, {up}
Send, {Tab}
return

ダウンロードしたい人なんていないと思うけど一応置いてみたり(注意:exe直)

http://www.hamashun.com/blogfile/200902/ahk_02/key_02.exe

説明

  • Ctlr + hjkl で矢印キー
  • Ctlr + Shift + h か l(エル) でHOME・ENDキー
  • Ctlr + Shift + x でDeleteキー
  • 半角キーを押すとESCキー(IME起動はIME側の設定で変換/無変換にしてます)
  • Ctlr + ; で": ;"
  • Ctlr + [ で"{\n\t\n}"

もともとは「RealForceホームポジションを保ったまま矢印キーを使いたい」という用途だった気がします。
多分もっとスマートに書けると思うんですけど、よくわからないのでこんなんになってます。


vimrcっておいしいですか!

LiveHTTPHeadersを使って今見ているサイトのMIMEタイプを調べようと思ったら、見かたが分からなかったので教えてもらったよ!メモ

メモです。


LiveHTTPHeadersの見かたが分からなかったのでid:hidedenさんに教えてもらいました。

  • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 とかは、ブラウザが対応してるMIMEの事
  • Accept〜っていうのが、ブラウザ側
  • Acceptを翻訳かけると、「受理」
  • */*ってのは、なんでもOK
  • 0.9とか0.8っていうのは、優先度。0.9 > 0.8 の順。 これはブラウザ(て言うかUAか)によって異なる
  • 見てるサイトのMIMEは、Content-Type: text/html; charset=utf-8 とかの方(下の方のやつ)
    • 変更されていません
    • 要求されたリソースは変更されていません
    • クライアントのキャッシュされたコピーが最新のものであることを示します。リソースの内容は転送されません
  • Contentを含まないからContent-Typeがない
  • ちなみに、リダイレクトの時もContent-Typeはないとの事

社内数学勉強会 第四回 剰余

剰余

剰余とは、割り算をした余りの値の事。
「余り」って、学校ではあんまり詳しく扱わなかったけど、この本では重要らしい。
確かに、ループの中で偶数と奇数でclassを割り振る時とか、割り算の余りが1ならodd、0ならeven、とかいう条件文があった。

100日後の曜日の計算

例えば今日が日曜だった場合、100日後は何曜日か。これは、割り算で計算する事ができる。

0 1 2 3 4 5 6
7 8 9 10 11 12 13



  1. 一週間は7日で繰り返すから、100を7で割る
  2. 結果は14余り2
  3. 14は、日曜が14回来たって事。余り2は、そこから二日進むという事
  4. 日曜から二日進むので、つまり100日目は火曜日

1234567の987654321乗の一の桁を求める

  1. 1234567の方は、結局は一の桁しか見ないので、7だけを意識する
  2. 7の0乗なので、1
  3. 7の1乗なので、7
  4. 7と7をかける 答えは49
  5. 49の一の桁と7をかける 答えは63
  6. 63の一の桁と7をかける 答えは21
  7. 21の一の桁と7をかける 答えは7
  8. 7と7をかける 答えは49
  9. 49の一の桁と7をかける 答えは63
  10. 63の一の桁と7をかける 答えは21

この流れをみると、一の桁が1,7,9,3で繰り返されている事がわかる このような法則を周期性という。
前項の曜日の場合なら、一週間は7日で繰り返す、というのが周期性。

周期性がわかれば、剰余を使って問題を解決する事ができる。
ただし、たまに1,7,9,3,1,7,9,3,5,1,7,9,3,1,7,9,3,5,というような、「1,7,9,3の周期性だと思ったら実は1,7,9,3,1,7,9,3,5,の周期性だった」という事があるので注意。

[数学][会社]*社内数学勉強会 第三回 ド・モルガンの法則

段々難しくなってきました><


ド・モルガンの法則とは

(¬A)∨(¬B)は、¬(A∧B)と置き換える事ができ、(¬A)∧(¬B)は¬(A∨B)と置き換える事ができる。この法則の事。

わけわかめ

訳が解らないので、自然言語に直してみる。

(¬A)∨(¬B)

Aで無い、または、Bで無い

¬(A∧B)

AかつB、で無い

(¬A)∧(¬B)

Aでない、かつ、Bでない

¬(A∨B)

AかつB、で無い

まだよくわからない

日本語にすると余計わからないかも><
多分、¬(A∧B)とかっこでひとまとめにしているのがポイントで、 雰囲気的にはこれも「AかBのどちらかが¬」て意味合いなんだと思う。

Tips ∨(または)と∧(かつ)の覚え方
  1. または、の方を覚えるよ!
  2. また→またと言えばコマネチ→V(ブイの字)→∨
  3. 残ったもう一つが∧(かつ)

「またはコマネチ」と覚えよう!やったね!もう覚えたね!


双対性

登場人物が

  • Aさん
  • Bさん
  • Cさん
  • Dさん
  • Eさん

だったとして、

AさんとBさんとCさんとDさんがいない時

という条件文を書こうとしたら、

Eさん以外がいない時

としても同じ意味になる。条件文が多くなるとIFじゃなくてUNLESSの方がいい、みたいな。


カルノー

ランプゲームで例える

青と黄色の二つのランプがあり、

  • 青が消えていて黄色が点いている時はスイッチを押す
  • 青が点いていて黄色が消えている時はスイッチを押す
  • 両方とも点いている時はスイッチを押す

というゲームがあったとします。

なお、以降はこのように略します。

  • 青× 黄○
  • 青○ 黄×
  • 青○ 黄○

これを論理式にすると、
(青→A 黄→B とする)

((¬A)∧B) ∨ (A∧(¬B)) ∨ (A∧B)

となります。
これをカルノー図という図で表します。○がある部分が、ゲームのスイッチを押す時です。

B B
F T
A F
A T

この○を、隣接している同士でグループ化(隣り合ってる同士を繋げる事)すると、Aのfalseの行と、Bのtrueの列にグループ化できます。
これを論理式にすると、
(¬A)∨B
となります。


ランプが3つになったら
  • 青× 黄× 赤×
  • 青▲ 黄× 赤○
  • 青× 黄○ 赤▲
  • 青○ 黄○ 赤○

(▲はどちらでもよいの意味)
青→A 黄→B 赤→C

これをカルノー図にすると

BC BC BC BC
FF FT TT TF
A F
A T

となります。
○がついてる部分をグループ化すると、Aのfalseの列と、Afalse Bfalse Ctrue、Afalse Btrue Ctrue、Atrue Bfalse Ctrue、Atrue Btrue Ctrueの四角になります(超解りづらい><)。
これを論理式に直すと、
(¬A)∧C
となります。

これらがプログラミングの何に役立つかと言うと、複雑な条件式を作る時に簡潔に書けるようになる。
ただ余りにも簡潔にしすぎると、一年後とかに見直したら時に自分でも「?」ってなるよね、との事。



3つめの値

これまではtrueとfalseだけだったけど、ここでもう一つの値が登場する。それが未定義値を意味するundefined.
未定義値っていうのは、真でも偽でもなく、「わからない」とかそんな感じの。プログラムだと言語によって微妙に扱いが違ったりする。
true、false、undefinedの3つの値を使った論理を3値論理という。

条件付論理積(かつ)

A&&B

*A *B *A&&B
T T T
T F F
T U U
F T F
F F F
F U F
U T U
U F U
U U U
  • Aがtrueなら、Bの値はA&&Bと同じになる
  • Aがfalseなら、Bは関係なくfalse
  • Aがundefinedなら、Bは関係なくundefined
  • B&&Aとは結果が異なる

条件付論理和(または)

*A *B *A||B
T T T
T F T
T U T
F T T
F F F
F U U
U T U
U F U
U U U
  • Aがtrueなら、Bは関係なくtrue
  • Aがfalseなら、Bの値がA||Bの値と同じ
  • Aがundefienedなら、Bは関係なくundefiened
  • B||Aとは結果が異なる

3値論理での否定(ノット)

*A *!A
T F
F T
U U
  • 未定義はひっくり返しても未定義なので、undefienedはundefienedになる。