Home > テンプレート
テンプレート
新しいテンプレート表現「ラムダ式」
昨年(2015年)5・6 月に、Blogger テンプレートに新しい表現方法が相次いで登場したのを覚えているでしょうか。
Blogger テンプレート上で扱える構文が増えて、随分柔軟になった印象を受けたものですが、今回、さらにラムダ式が使えるようになりました。次のリンクが Blogger 公式のアナウンスです。
「ラムダ式とはなんぞや?」という人は、このサイトの説明がわかりやすいかと。
// 匿名メソッド
Calculate(1, 2, delegate(int x, int y) { return x + y; }); // 出力:3
// ラムダ式
Calculate(1, 2, (x, y) => x + y); // 出力:3
Calculate(1, 2, delegate(int x, int y) { return x + y; }); // 出力:3
// ラムダ式
Calculate(1, 2, (x, y) => x + y); // 出力:3
無名関数の定義と呼び出しが簡単に記述できる式というと…伝わるでしょうか。Blogger テンプレート上に記述する実際の例として挙げられているのが次のコードです。
<b:if cond='data:post.labels any (l => l.name == "Flower")'>
<img src=’/img/flower.jpg’ />
<b:if/>
<img src=’/img/flower.jpg’ />
<b:if/>
その投稿に「Flower」ラベルがついていれば、花の画像を表示するというコードです。これまで b:loop タグを使わないと書けなかったものが、確かに随分簡単になっていますね。
Blogger で使えるラムダ式の仕様
Blogger で実際に使えるラムダ式ってどんなもの?と思って調べてみると、ヘルプフォーラムで解説を発見。
例えば
data:posts count (p => p.numComments > 0)
というコードは、少なくとも 1 コメントついている投稿の数を示すためのもの。
細かく見ていくと、赤字部分は対象となるデータ(アイテムセット:今回は投稿情報)を、青字部分は行う処理の種類(ラムダオペレータ:今回はその数)を、緑部分は実際のチェック内容(ラムダエクスプレッション:今回はコメントの数 0 より多いかどうか)を指定しています。
ラムダエクスプレッションは、さらに
=> 前後で分けられて、左辺に変数名(今回は data:posts セット内の各アイテム post を p と名付けている)を、右辺にその変数を使った表現を記述することになっています。うーん、使い慣れると便利なのかもしれませんが、使い方をマスターするのになかなか時間がかかりそうですね。ちなみに、ラムダオペレータに使えるキーワードは次の通り。
| any | ... ラムダエクスプレッションを満たすアイテムがセット内に 1 つでもあれば true を返す。 |
|---|---|
| all | ... セット内のアイテムすべてがラムダエクスプレッションを満たせば true を返す。 |
| none | ... ラムダエクスプレッションを満たすアイテムがセット内に 1 つもなければ true を返す。 |
| count | ... セット内でラムダエクスプレッションを満たすアイテムの個数を返す。 |
| filter | ... セット内でラムダエクスプレッションを満たすアイテムだけを集めたセットを返す。 |
| map | ... ラムダエクスプレッションで記述された結果を集めたセットを返す。 |
| first | ... セット内でラムダエクスプレッションを満たす最初のアイテムを返す。 |
filter や map が自在に使えるようになれば、Blogger テンプレートでもかなり複雑な指示が出せそうですね。われこそは!と思う人は、ぜひチャレンジしてみてください。
前回、Blogger テンプレートのウィジェットタグに新しい表現方法が登場 という記事を書きましたが、すぐにまた新しいウィジェットタグが追加されています。
何が追加されたかというと、以下のとおりです。
- b:elseif
- b:switch
- b:eval
- b:with
elseif
これまで、条件分岐では
b:if (条件に合う場合)と b:else (合わない場合)というのがあったんですが、条件に合わない場合に別の条件を追加する b:elseif が新しく登場しています。下に掲載したのは、ページの種類によって表示する内容を切り替えるコード例です。<b:if cond='data:blog.pageType == "static_page"'>
静的ページに表示する内容
<b:elseif cond='data:blog.pageType == "item"'>
個別投稿ページに表示する内容
<b:else/>
それ以外のページに表示する内容
</b:if>
静的ページに表示する内容
<b:elseif cond='data:blog.pageType == "item"'>
個別投稿ページに表示する内容
<b:else/>
それ以外のページに表示する内容
</b:if>
switch
複数の条件分岐で参照するデータが同じ場合、
b:switch というタグを使うこともできます。b:switch に参照するデータ名を、b:case に等しいかチェックする値を入れます。すると、該当した b:case の後に記述した内容が表示されます。b:default の後に記述した内容は、b:case で等しい物がなかった場合に表示されます。上のコードと同じ内容を b:switch で書き直したのが、下の例です。他のプログラム言語の switch でよく見られる break は要りません。「トップページの場合は」、「アーカイブページの場合は」などと、条件をどんどん付けくわえたい場合に便利です。
<b:switch var='data:blog.pageType'>
<b:case value="static_page" />
静的ページに表示する内容
<b:case value="item" />
個別投稿ページに表示する内容
<b:default />
それ以外のページに表示する内容
</b:switch>
<b:case value="static_page" />
静的ページに表示する内容
<b:case value="item" />
個別投稿ページに表示する内容
<b:default />
それ以外のページに表示する内容
</b:switch>
eval
b:eval は、文字列を式として実行するための文です。ちょっとした計算や文字列の連結をして、内容を表示するのに適しています。
例 1: 画像などに適用するスタイルシートに、画像の縦横の比率そのままで拡大・縮小させた値を記述する例です。
min-height: <b:eval expr="data:newWidth * data:height / data:width" />px;
(「新しい幅 × 高さ ÷ 幅」を計算して、「新しい高さ」を表示。)たとえば元の幅 width が 200 で、高さ height が 150、新しい幅 newWidth が 400 の場合には、(400 * 150 / 200) ということで、実際に以下の内容を表示します。
min-height: 300px;
例 2: 配列構造になったデータを直接表示する例。
<b:eval expr="data:post.labels[0].url" />
(投稿の一つ目のラベルのラベルページの URL を表示。)データを直接記述する
<data:post.labels[0].url/> という書き方でもいいんじゃないかと試してみたんですが、これだとテンプレートを保存することができませんでした。従来、配列のような構造になっているデータについては b:loop を使わないといけなかったのが、b:eval でも直接記述できるようになったということのようです。例 3: 三項演算子の結果を書き出す例。三項演算子は、前回追加された表現でしたね。
<b:eval expr='data:post.allowComments ? "Comment" : "Comments Disabled" />
(投稿にコメント可能な場合「Comment」と表示、不可の場合は「Comments Disabled」と表示。)with
b:with を使うと、計算式の値などを一時的に格納する変数を作ることができます。
<b:with var='myComputedValue' value='50 + 40' >
<data:myComputedValue/>px;
</b:with>
(「50 + 40」の計算結果を「myComputedValue」に格納。その後、「px;」を付加して書き出し。)<data:myComputedValue/>px;
</b:with>
変数を書き出すのは、
<data:myComputedValue/> と <b:eval expr='data:myComputedValue' /> のどちらを使ってもOKです。属性値としてなら expr:width='data:myComputedValue' のように使います。なお、b:with で囲んだエリア内でしか変数は使えないので、注意が必要です。あとがき
今回のテンプレートタグの仕様変更で、実際には内容を書き出さずに、変数を指定したり、計算をしたりできるようになりました。Blogger テンプレートでできることが、格段に広がった印象です。新しいテンプレートタグを駆使して、自分だけのテンプレートづくりに挑戦してみるのもいいかもしれません。テンプレートタグのこういう組み合わせで、こんなことができるよというアイデアがもしあれば、教えてくださいね。
関連: 参考:
Blogger のテンプレートには、ウィジェットタグという、一定の条件ごとに出力する HTML コードを変化させるための特別なタグが存在します。今回、このウィジェットタグに新しい表現方法が加わったと、Blogger Buzz が伝えています。
これまで、ウィジェットタグの中では
+で値を連結したり-で値を差し引いたり==や!=で値が等しいか等しくないかをチェックしたり<や>、<=、>=で値を比較したり
NOT 演算子
! や not を使って、「何かが true(真)ではないとき」という条件を表現する。<b:if cond='!data:post.allowComments'>...
(コメントが可能でなければ…)これまでは、
<b:else/> を使って表現していたヤツですね。三項演算子
? と : を使った三項演算子。? の前の条件が true(真)の場合は : の前のもの、false(偽)の場合は : の後ろのものを表示します。<a expr:class='data:post.allowComments ? "comments" : "no-comments"' ...
(コメント可能な場合、a 要素の class 属性に comments を指定し、不可能な場合は no-comments を指定する。)これまた、
<b:if cond='...'> と <b:else/> を組み合わせて、表現していたものです。メンバシップ演算子
これは、ある値が集合の要素の 1 つであるかどうかをチェックするためのもの。
in と contains とが使えます。<b:if cond='data:blog.pageType in {"index", "archive"}'>...
(ページタイプがトップページかアーカイブページのときに…)<b:if cond='{"item", "static_page"} contains data:blog.pageType'>
(ページタイプが個別ページか静的ページのときに…)in と contains で、チェック対象の値と集合(もしくは配列)の記述順が逆になるので要注意。とはいえ、複数の <b:if cond='...'> を併記する必要がないのは、便利です。AND 演算子
and や && を使って、複数の条件をともに満たす場合について、記述可能に。<b:if cond='data:blog.pageType == "index" and data:post.allowComments'>...
(ページタイプがトップページで、かつコメント可能なとき…)以前は、
<b:if cond='...'> をネスト(入れ子に)して実現していたもの。OR 演算子
or や || を使って、複数の条件のうち、1 つでも満たす場合について、記述可能に。<b:if cond='data:blog.pageType == "index" or data:post.allowComments'>...
(ページタイプがトップページか、またはコメント可能なとき…)in、contains と同様、これからは <b:if cond='...'> を何回も書かなくて済みます。括弧
( ) を使って、演算の順序を指定する。<div expr:style='"max-width: " + (data:width + 10) + "px;"'>...
(div 要素 style 属性の最大幅に、現在の横幅プラス 10 ピクセルした値を指定する。)これらの新しい演算子や表現を使うと、これまで Blogger テンプレートで条件分岐を記述していた、煩雑な作業が随分と楽になりそうですね。本格的に Blogger テンプレートをいじってみたい!という人は、ぜひ参考にしてください。
参考:
(cc) THOR2013 年 4 月に、Blogger ブログに、通常のコメント欄と入れ替える形で Google+ のコメント欄が設置できるようになりました(参考)。複数のブログについたコメントや他人のブログにつけたコメントが Google+ で一元的に閲覧できるので非常に便利なんですが、その一方で通常のコメント欄と比べ不便なところもいくつか指摘されています。
- Google+ ユーザーしかコメントできない。
通常のコメント欄なら Google ユーザー、OpenID ユーザーに加え、「匿名」も選べます。 - 公開範囲が分かりにくい。
Google+ のサークルが適用されるため、誰にどのコメントが見えているのか把握しにくいかと。 - ブログのドメインを変えられない。
Google+ 上でのコメントは、リンクの URL で Blogger ブログと関連付けられているため、ドメインを変更してしまうと、ブログから以前のコメントが見れなくなってしまいます。 - 記事ごとのコメント表示・非表示、新規受け付けの可否設定ができない。
Blogger の投稿エディタのオプション指定が効きません。 - コメントの「オーナー承認後公開」ができない。
ブログにコメントがつくというより、Google+ での言及をブログに表示できる、というのが本質なので、しょうがないといえばしょうがないんですが。 - ブログについたコメント一覧が確認できない。
通常のコメントだと、ダッシュボードやコメントフィードで確認できますね。
ということで、従来のコメント欄も Google+ のコメント欄も両方ブログに載せてしまおうと思ったわけです。参考にしたのはこちらのブログ。
導入してみた様子が、次の画像です。

導入方法
1.Blogger の管理画面「Google+」から「このブログで Google+ のコメントを使う」のチェックを外します。元々 Blogger ブログを Google+ プロフィールと関連付けていない人は、そのままで。
2.Blogger 管理画面「テンプレート > HTML の編集」から
<div id='backlinks-container'>
<div expr:id='data:widget.instanceId + "_backlinks-container"'>
<b:if cond='data:post.showBacklinks'>
<b:include data='post' name='backlinks'/>
</b:if>
</div>
</div>
<div expr:id='data:widget.instanceId + "_backlinks-container"'>
<b:if cond='data:post.showBacklinks'>
<b:include data='post' name='backlinks'/>
</b:if>
</div>
</div>
というコードを見つけます。「Ctrl + f」キーからエディタの検索機能を使うと便利です。
3.2のコードのすぐ後に
<div id='g-comments-container'>
<h4 id='g-comments-label'>Comments on Google+:</h4>
<div class='g-comments' data-first_party_property='BLOGGER' data-view_type='FILTERED_POSTMOD' data-width='600' expr:data-href='data:blog.canonicalUrl'/>
</div>
<h4 id='g-comments-label'>Comments on Google+:</h4>
<div class='g-comments' data-first_party_property='BLOGGER' data-view_type='FILTERED_POSTMOD' data-width='600' expr:data-href='data:blog.canonicalUrl'/>
</div>
というコードを挿入して「テンプレートを保存」ボタンを押します。赤字部分は Google+ コメント欄の最大幅です。通常のコメント欄の幅に合わせて調整するのがいいと思います。
青字の部分は、Google+ コメント欄の上部に表示されるメッセージで、自由に書き換えることができます。閲覧者がどちらにコメントすればいいのか迷わないように、何か説明を書いてもいいかもしれませんね。
なお、
<div id='backlinks-container'> は 2 箇所あるので、両方のコードの後に同じコードを貼り付けてください。ということで、「Google+ のコメント欄を置きたいけど、前についたコメントも表示しときたいんだよな…」という人も、「Blogger アカウントと Google+ アカウントをまだ関連付けていないんだけど…」という人も、ぜひお試しください。
ちなみに
テンプレートによっては、Blogger のコメント欄が 425px 幅で固定になっているものがあります。これは、Blogger 公式の外部 CSS ファイルで指定されているもので、Blogger 管理画面「テンプレート > HTML の編集」から、テンプレートの CSS 部分
/* Comments
----------------------------------------------- */
----------------------------------------------- */
のすぐ後にでも、
.comment-form{max-width:600px;}
と挿入することで、テキストエリアの幅の上書きが可能です。Google+ のコメント欄と幅を合わせたいというときに思い出してください。
Google AdSense の非同期広告コード
Google AdSense の広告コードで、「非同期」タイプを選ぶことができるようになりました。

これまでの「同期」タイプと比べて、ページの読み込み時間が改善されるということです。
非同期広告コードとは、完全非同期バージョンの AdSense 用広告コードのことで、ウェブページの読み込み時間を改善し、サイトを訪れたユーザーの利便性を高めます。非同期コードには、ウェブページの他の部分の読み込みを妨げないというメリットがあるため、広告の読み込みに問題があるページでも、コンテンツの読み込みは問題なくできるようになります。モバイル ユーザーの場合は特に、ウェブページの読み込み時間の短縮を実感できるでしょう。
これまでは AdSense 広告が読み込まれるまで残りのページ要素が表示されなかったんですが、このコードを使うと AdSense 広告が読み込まれようと読み込まれまいと、ページの残りをどんどん表示していくことができるというわけです。
このコードの取得は、AdSense サイト から「広告の設定」タブを押し、各広告の「コードを取得」リンクをクリック、「コードタイプ」のプルダウンから「非同期」を選ぶだけ。表示される「広告コード」をコピーして好きな場所に貼り付ければ、非同期バージョンの広告を簡単に設置することができます。
Blogger テンプレートに貼り付ける場合の注意点
この非同期広告コード、Blogger の投稿本文や HTML/JavaScritp ガジェットに貼り付ける分には問題がないんですが、テンプレートに直接貼り付ける場合には注意が必要です。実際に AdSense の非同期コードを Blogger のテンプレートに貼り付けると、このような警告が出ました。
XML の解析中にエラーが発生しました。行 ***、列 ***: Attribute name "async" associated with an element type "script" must be followed by the '=' charactor.
「
script 要素の async 属性に = がついてないよ」という内容です。新しいコードが Blogger のテンプレートエディタの XHTML 構文解析に引っかかっているんですが、これは async を async='async' とすることで回避することができます。このことを知らせてくれたのが鷹野 凌さん。いつもありがとうございます!
【メモ】Bloggerのテンプレートに貼る場合、<script async='async' ~ と記述しないとダメ。|Inside Adsense - 日本語: 新しい広告コードによってユーザーの利便性が高まります http://t.co/MqSGFRNSJk
— 鷹野 凌 (@ryou_takano) July 16, 2013
AdSense も Blogger も同じ Google なんだから、もうちょっと融通をきかせてくれてもよさそうなものですが…。ともかく、テンプレートに貼り付けている AdSense コードを非同期に書き換えたい!という時には、ご注意ください。
今やブログは PC だけでなく、スマートフォンやタブレットでも見られるようになってきています。そこで、最近広がってきたのが「レスポンシブ Web デザイン」と呼ばれる、あらゆるデバイスに対応させるウェブデザインの手法です。ウィンドウの幅が狭まったときに、自動的にサイドバーが省略されたり、画像が縮小されたりするアレですね。
Blogger ブログ用にもいろいろなところでレスポンシブデザインのテンプレートが公開されているので、今回まとめてみることにしました。
「デモ」ボタンでテンプレートが適用されたブログを閲覧できるので、ウィンドウ幅を変更したり、別の端末で開いてみたりして、どんな表示になるのか実際に確認してみるといいと思います。
なお、ご自身のブログへのテンプレートの適用は自己責任で。必ずテンプレートのバックアップを取ってから変更するようにしてください。
参考:
- 17 Best Responsive Blogger Templates to Download for your Blog
- 13 Best Responsive Blogger Templates 2013
- Top awesome and stylish responsive Blogger templates 2013 updated
- Best 10 Free Responsive Blogger Templates for 2013 Collections
Adsosive
Align
Aware
Bresponsive
Chronicl
CopyBlogger v2
DarkRed
Elite Minima
Exelencia
ExtraNews
Helicon
Incipient
JPSTATION
Labnol
Main Photo
Max Mag
Minimum Theme
Pinfinity
Portfolio
RBSimple
Responsival
Responsive
Sensational
TheStyle
Top Blogging Ideas
…ということで、25 個一気に紹介しましたが、気になるテンプレートはあったでしょうか。これを機会に、Blogger テンプレートも衣替えしてみるといいかもしれませんね。




























