たくあんおいしいのブログ

たくあんを食べながらプログラミングとかしますよ

Railsのcontent_tagを読もう

railsバージョンは4.2.5

content_tagの使用例

http://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.htmlのExamplesには

content_tag(:p, "Hello world!")
 # => <p>Hello world!</p>
content_tag(:div, content_tag(:p, "Hello world!"), class: "strong")
 # => <div class="strong"><p>Hello world!</p></div>
content_tag(:div, "Hello world!", class: ["strong", "highlight"])
 # => <div class="strong highlight">Hello world!</div>
content_tag("select", options, multiple: true)
 # => <select multiple="multiple">...options...</select>

<%= content_tag :div, class: "strong" do -%>
  Hello world!
<% end -%>
 # => <div class="strong">Hello world!</div>

とある. 第4引数のescapeにfalseを指定するとどうなるのかこの例には載ってないが, 説明にはSet escape to false to disable attribute value escaping.とある.
試した例が以下.

content_tag :p, '<p>hoge</p>', {}, true
# => <p>&lt;p&gt;hoge&lt;/p&gt;</p>

content_tag :p, '<p>hoge</p>', {}, false
# => <p><p>hoge</p></p>

要素内のHTML特殊文字をエスケープするかどうかということらしい. 説明通りだね.

ソースコード

rails/tag_helper.rb at v4.2.5 · rails/rails · GitHubから抜粋

def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
  if block_given?
    options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
    content_tag_string(name, capture(&block), options, escape)
  else
    content_tag_string(name, content_or_options_with_block, options, escape)
  end
end

読もう

1行目

ブロックが渡った場合とそうでない場合で分岐する

2,3行目

ブロックが渡っている場合は, 第2引数が省略されたかのように呼び出されるため, 本来は第3引数optionsに渡されるはずのHashが第2引数に渡ってきてしまう.

# Exampleの'第2引数が省略されたかのように呼び出されている'コード
<%= content_tag :div, class: "strong" do -%>
  Hello world!
<% end -%>

ので, 改めて第3引数optionsに第2引数のHashを渡している. このとき, 第2引数content_or_options_with_blockがHashであるかどうかのチェックが挟まっている.

さらに, 3行目ではcontent_or_options_with_blockは使用されていないので, ブロックを渡してcontent_tagを呼び出した場合は, 第2引数が省略されたかのように呼び出そうが普通に第2引数渡そうが関係ないのだ. 第2引数が無視されるような挙動になる.

はじめcontent_or_options_with_blockという名前を見た時は「長すぎだろ」と思ったが, どうもこのへんの挙動から命名された引数名だったようだ.

あとこういう実装見るとJavaみたくメソッドオーバーロードさせてくれよと思う.

3行目

content_tag_string(name, capture(&block), options, escape)の返り値がcontent_tagの返り値になる.

content_tag_string is 何

コードは以下. rails/tag_helper.rb at v4.2.5 · rails/rails · GitHub より.

def content_tag_string(name, content, options, escape = true)
  tag_options = tag_options(options, escape) if options
  content     = ERB::Util.unwrapped_html_escape(content) if escape
  "<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{content}</#{name}>".html_safe
end

なんかもうめんどくさいので省略するが,

そしてcontent_tag_stringの返り値が

"<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{content}</#{name}>".html_safe

になる.

capture(&block) is 何

コードは以下. rails/capture_helper.rb at v4.2.5 · rails/rails · GitHub より.

def capture(*args)
  value = nil
  buffer = with_output_buffer { value = yield(*args) }
  if string = buffer.presence || value and string.is_a?(String)
    ERB::Util.html_escape string
  end
end

ブロックの内容を文字列にして返すメソッドということだけはわかった. 詳しくはまた今度読もう. (もう疲れたゾ)

5行目

ブロックが渡っていない場合はシンプル. 第2引数と第3引数の格納しなおしなんかもないので

content_tag_string(name, content_or_options_with_block, options, escape)

がcontent_tagの返り値になる.

読めた

今度はcaptureとかも読もう.

今年見た映画

今年も映画を見ました

Filmarks結構良いよ

今年の夏くらいからFilmarks(https://filmarks.com)というスマホアプリを使い始めました. Filmarksの機能は大体こんな感じ.

  • 見たい公開予定の映画をクリップしておくと公開日が来たら通知してくれる
  • 好きな俳優や監督を登録しておくとその人が出演している映画が追加されたときに通知してくれる
  • 映画に5点満点の点数と感想文のレビューを書き込める
  • 他人のレビューと平均点を見ることができる

他人のレビューとかあんま興味ないんでもっぱら「見たいと思ってた映画の公開日を忘れないようにする」ためと, 「今年どんな映画見たっけ?」という記録用途のために使ってます.
Filmarks見ながら映画振り返りするの結構楽しいのでおすすめ. この記事はFilamarksを見ながら書かれています.

ちなみにぼくはFilmarksの手先でもなんでもないです.

今年見た映画

こんだけの今年の映画を見ました. 順番は適当.

ちなみに「今年の映画」とは, 「日本公開日が2015年中」である映画のこととしています. じゃないと1月にインターステラーとかベイマックスとかを見てたのが今年見た映画にカウントされてしまう.

今年特に良かった映画

スター・ウォーズについて話しだすとキリがないのでここでは除外. 公開初日の六本木のお祭り騒ぎ楽しかった・・・

マッドマックス 怒りのデスロード

V8!!!!

マイ・インターン

ロバート・デ・ニーロ 👍

クリード チャンプを継ぐ男

ロッキー7だこれ

今年残念だった映画

1.project itoh

屍者の帝国はまあまあ良かった. だがハーモニーてめえはダメだ.
原作ファンだからかなり厳しめに見てしまっているのもあるが, ハーモニーの「なんだろう・・・・この・・・・コレジャナイ感・・・・」が最後まで続いてしまい非常に残念な感じ.
虐殺器官はまだ公開されてないが当初の公開予定日からまもなく2ヶ月を過ぎようとしており非常に不安. 逆にこれでめっちゃ良かったら拍手喝采である.

2.デジモンアドベンチャーtri. 第1章「再会」

俺の青春を返せ

3.邦題であんま原題改変しないでよ・・・

上のリストの中で気になったのは

  • クリード チャンプを継ぐ男(原題: Creed)
    • 後ろに余計なのつけちゃったパターン. あんま余計なの付けないでほしいなあ.
  • マッドマックス 怒りのデスロード(原題: Mad Max: Fury Road)
    • 直訳せずにきたパターン. これについてはあんまり文句はないんだけど, 劇中に「fury road」ってセリフ出てくることだし「マッドマックス フューリーロード」って表記で良いと思うんだけど.
  • ミケランジェロ・プロジェクト(原題: The Monuments Men)
    • 最悪. 完全改悪パターン. 何言ってんだお前ぶっ飛ばすぞ. 劇中でもモニュメンツメンってセリフあっただろ.

最近はTwitterで日本のポスターダサくね?みたいな話をよく見たりもするし

もうちょっとなんとかなりませんかね. 完全に個人の好みなんですけど.

今年いちばん主張したいこと

来年の映画

来年公開の期待している映画を並べてみました

来年も映画たくさん見ましょうね.

脱北後の生活について

これはFUN Advent Calendar 2015 - Adventarの12日目の記事です.
この記事は個人の感想です. 真に受けても良いですけど責任は負いかねます.

筆者紹介

たくあんおいしい(@Takuan_Oishii)さん | Twitter
26年度卒業のOB.
卒業後は東京の某社で某サービス開発中. 最近はRuby書き.
札幌出身.

本題

脱北とは

北海道から移住することです.

脱北後の生活とは

東京に出てきた道民が「あー東京は嫌なところだなあ」とブツブツ文句を言いながら過ごす日々のことです.

具体例

脱北後の家

函館の家の2倍の家賃で1/2の広さ. 寒い. 窓がめっちゃ結露する. 目の前が幹線道路なので夜もトラックなどの走行音がうるさい.

東京はつらい.

脱北後の電車

言うまでも無いが通勤ラッシュがすごい. いつまで経っても慣れないし憂鬱.

東京はつらい.

脱北後の気候

夏は暑いし冬は雨が嫌な感じ. 雪降ってくれれば濡れないぶんまだマシなのに.

東京はつらい.

脱北後の食事

店の数はいっぱいあるのでまあまあ楽しい. 安く済ませようと思えば済ませられたりもする.
ただどこにいってもなぜか魚がまずい.
そしてラッピが食いたくてしょうがない.

東京はつらい。

脱北後の映画

IMAXシアター多数で設備が良い映画館が多い. 東京は良い.

でも実際ユナイテッドシネマ札幌にだってIMAXはある. 東京である必要は無い.

脱北後の仕事

わりと楽しい. 通勤だけがつらい.

脱北後の勉強会

気軽に勉強会に行ける.
先日行ったElixir勉強会も良かった.

札幌の事情がわからないので比較できない.

学生へ

脱北して就職する人も多いと思う. 今のうちに北海道を満喫しておくといいと思う.

書き初めしたのでまとめ

f:id:takuan_oishii:20150101004514p:plain

2015年の書き初めに「あ,け,ま,し,て,お,め,で,と,う,ご,ざ,い,ま,す」の中からランダムに文字を抽出して「あけましておめでとうございます」が揃ったら停止するプログラムを書きました.
(酔っ払って計算を間違ってなければ)1回の試行で揃う確率はだいたい 4/43789389e+17 .
1秒間でだいたい10万回試行できそうなので,1分では60万回の試行できそう.
60万回ハズし続ける確率を計算すれば,1分以内に揃う確率がわかることになる. 1分間ハズし続ける確率は

f:id:takuan_oishii:20150101010756p:plain

1らしい.
揃わないってことだね.

1月5日追記
やっぱり酔っ払ってた.

「1秒間でだいたい10万回試行できそうなので,1分では60万回の試行できそう. 」
嘘です. 1秒間で10万回試行できるなら1分では600万回の試行です. 小学生でもわかります.

「1回の試行で揃う確率はだいたい 4/43789389e+17」
これも心配になったのでちゃんと考え直します.
”あけましておめでとうございます”が揃う確率は, 1文字目に15文字の中から”あ”が選ばれる確率×2文字目に15文字の中から”け”が選ばれる確率×3文字目に・・・を計算すれば求められる.
15文字の中から1文字選ぶってことは確率は1/15なので, ”あけましておめでとうございます”が揃う確率は(1/15)15になりそうな気もするが, 15文字中に”ま”が2回登場するので,3文字目に”ま”が選ばれる確率は2/15であり,14文字目に”ま”が選ばれる確率も2/15である.
ので,”あけましておめでとうございます”が揃う確率は(1/15)13 × (2/15)2 = 4 / 1515 となる.
で, 1515 っていうのがいったいいくらなのかというと4.3789389e+17なのでこれはあってたらしい.
ちなみにこれ, すごくざっくりと 1/1.0e+17 って感じに通分すると10京分の1だ. すごい.(これも数え間違いとかだったらすごい恥ずかしい. 今は酔ってない.)

1分間に600万回試行できることになってしまったので1分以内に揃う確率も再計算せねばなるまいが, 10京分の1とか言われちゃうと600万回とか屁みたいなもんなので結局1分以内に揃う確率もほぼ0だ.
じゃあ逆に何回やれば揃うんだよって話にしてみるが, n分の1の確率で起こることがn回試行以内に起きる確率はだいたい63%(nが大きければだいたい63%に近づくんだよね確か)なので, 10京回試行すれば結構揃ってくれそうな気もする.
で, 10京回試行するにはどのくらい時間がかかるかと言うと, 10京/600万 = 16666666666.7 で, 16666666667分くらいだ. 実に31709年である.
揃わないってことだね.

Git/GitHubを知らない人によく勧めるものリスト

今年はGit/GitHub知りませんって人に「じゃあちょっと軽く使えるくらいまで勉強しましょうか」って言う機会が多かった気がする.
ということでそういう時に初心者向けだしスゲーわかりやすい!と思ったものをまとめてみた. どうせ追加し忘れてるやつあるだろうし思い出したらその都度追加していきたい.

git branch -a で既に削除されているリモートブランチが表示されるのがウザい

git remote prune origin で削除済のリモートブランチが表示されなくなる.

何回も忘れてその度にググってるので戒めとしてここにメモる.

それにしてもなんでgit fetchとかで同じようなことしてくれないんだ. どういう理由でこんな仕様になってるんだ教えて偉い人.

参考:

Gitで使われていないリモートブランチの整理 - Qiita

映画BGMのある生活の提案

プログラミングしてる最中にはBGMは必要だと思う。しーんとした静かすぎるところでは集中できない。

日常にもBGMは必要だろう。 「ぼくがかんがえたさいきょうのにちじょう」を紹介したい。

  • 朝はロッキーのテーマで起きる。Gonna Fly Nowだ。Eye of the Tigerの方が好きだという人はそちらでもいいだろう。

  • 通勤/通学途中は特攻野郎Aチームのテーマに乗せて歩く。不可能を可能にし、巨大な仕事を粉砕する、俺たち、特攻野郎Aチーム

  • 職場/学校に到着したらパシフィック・リムのテーマと共に仕事の準備をする。できればヤンシーとローリー兄弟のように隣の席の人とCome on! let's go!!とか言って拳を合わせたい。

あとは好きなBGMを流しながら仕事/研究をして欲しいが、イベントがある際にもやはりそれ用にBGMが欲しい。

  • ちょっと怖いボスとのミーティング前には帝国のマーチ(スターウォーズ)。

  • git resetとか、過去と未来を見たり操作したりしてるときにはバック・トゥ・ザ・フューチャーのテーマ。

  • 未知のバグを発見して、これからデバッグしないと・・・という時にはゴーストバスターズを聴こう。

  • ある程度実装が終わったりして結合テストをしたり、サーバにデプロイしてみてシステムを動作させるという時にはアイアンマンのテーマをおすすめしたい。アイアンマンスーツ開発シーンとか、Mark3初装着シーンで流れてたアレだ。

  • スケジュールを作成してたり、今後の方針・作戦なんかを考えたりしてる時はエヴァンゲリオンのBGMが良い。ヤシマ作戦のBGMといえばわかるだろうか。

  • プレゼン前にはAC/DCの Shoot to Thrill を聴こう。可能ならアイアンマン2のオープニングのように飛行機からパラシュート無しで飛び降りるような感じでプレゼン会場へ入場しよう。

そして仕事が終わった帰り道では、黒装束に身を包んでダークナイト3部作のエンディングテーマを聞きながらバイクで夜道を疾走したい。警察に追われていれば完璧だ。

という感じの生活、実践してはいかがですか。 ちなみに僕は実践してません。