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勉強会」がありました。 僕はディレクターじゃないけどしれっと参加してきました!
と言うわけでそのまとめです。
Linuxって何?
LinuxはUNIXではなく、UNIXのようなもの。 UNIXみたいのをある人が作った。 それがLinux
本来はカーネルをLinuxと呼ぶ。 カーネルはシステムの一番コアな部分。 本来はOSカーネルをLinuxと呼ぶ。 が、最近はOS一群をLinuxと読んでいる。
ディストリビューションって何?
Linuxを一般の利用者が使えるようにまとめたもの(ほぼWikiペディアから引用)。 Debian や Redhatがある。
UNIXの仲間はLinux以外にもあって、FreeBSDとかがそれ。 他にはOS10とかiPhoneOSなんかもそう。 ちなみにOS10のカーネルはDarwinという。
ターミナルとかプロンプトって何?
ターミナル
CUIでコンピュータを操作するための端末、がそもそもの意味。 ここではその機能をもったアプリケーションの事。
プロンプト
ターミナルの窓の中でちかちかしてるやつの左側の部分。 ちかちかしてるやつはカーソル。
プロンプトはカスタムできるので、いい感じにするとよい。
「それ変えてどうするの?」という質問に対しては「キミも壁紙とか変えるでしょ?」との事。
試しに、.bashrcに
export PS1="$ \W\n "
っていうのを追加してみたら、結構見やすくなった。
ログインについて
UNIXはログインが必要。 Winも最近はログインが必要だったりするけど、UNIXは昔から。
電源を入れてそのまま使えると、セキュリティの観点で危険。 UNIXは昔から、ユーザーごとにログインできる。
シェルって何?
ログインした時に、操作をするためのベースのソフトウェア。 プロンプトは、正確にはシェルプロンプトと言う。
いろいろ種類があって、shとかbashとかcshとかzshとか。
このへんは宗教戦争もあって、「○○は小学生まで」とか、なんか色々あるらしい。 シェルが違うと、Tab補完が違ったりとか色々あるんだとか。
感想とか
最初に「テクハラに負けないようになりましょう」みたいな言葉を賜ったのですが、見物に来ていた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直)
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 とかの方(下の方のやつ)
- 下の方がHTTP/1.x 304 Not Modifiedってなってたら、それはキャッシュ
- http://homepage1.nifty.com/yito/anhttpd/statuscode.html で304を見ると以下のようになってる
- 変更されていません
- 要求されたリソースは変更されていません
- クライアントのキャッシュされたコピーが最新のものであることを示します。リソースの内容は転送されません
- 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 |
・
・
・
- 一週間は7日で繰り返すから、100を7で割る
- 結果は14余り2
- 14は、日曜が14回来たって事。余り2は、そこから二日進むという事
- 日曜から二日進むので、つまり100日目は火曜日
1234567の987654321乗の一の桁を求める
- 1234567の方は、結局は一の桁しか見ないので、7だけを意識する
- 7の0乗なので、1
- 7の1乗なので、7
- 7と7をかける 答えは49
- 49の一の桁と7をかける 答えは63
- 63の一の桁と7をかける 答えは21
- 21の一の桁と7をかける 答えは7
- 7と7をかける 答えは49
- 49の一の桁と7をかける 答えは63
- 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 ∨(または)と∧(かつ)の覚え方
- または、の方を覚えるよ!
- また→またと言えばコマネチ→V(ブイの字)→∨
- 残ったもう一つが∧(かつ)
「またはコマネチ」と覚えよう!やったね!もう覚えたね!
双対性
登場人物が
- 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になる。