BlogTop > Archives > 2009年6月 Archive

2009年6月 Archive

« 2009年5月 | 2009年6月 | 2009年7月 »

TwitterにPostするOperatorユーザスクリプト書いてみた

Firefoxのアドオン、「Operator」のユーザスクリプトを使って、Twitterにポストするものを書いてみました。

Operatorのユーザースクリプトの「hAtom.js」を利用しますため、あらかじめ、以下のページからコードを入手しておく必要があります。

hAtom.jsのセットの方法は、わかりにくいものでよければ以下のページに記載してあります。

Operator経由でTwitterにポストするためのコードは、以下となります。なお、コチラがユーザスクリプトの書き方をよく把握してないので、書き方があっているのかどうかは不明なのと、Microformatsが書かれていないと動作できないことから、テストしたページは少ないです。(自分のトコのページだけでは限界が。。)

実用性とかはギモンなのですが、参考程度と個人の覚書ということで晒しておきます。

セットのときは任意のファイル名で拡張子.jsとして保存しておき、Operatorのオプションメニューから登録します。登録のときに、Operatorのオプションメニューの「動作」のtabから、「Submit to Twitter」を追加します。

// Submit to Twitter
var submit_to_twitter = {
  description: "Submit to Twitter",
  shortDescription: "Submit twitter",
  scope: {
    semantic: {
      "hAtom-hFeed": "hAtom-hFeed",
      "hAtom-hEntry": "hAtom-hEntry",
      "hCard" : "url",
    }
  },
  doAction: function(semanticObject, semanticObjectType, propertyIndex) {
    if(semanticObjectType == "hAtom-hFeed"||semanticObjectType == "hAtom-hEntry"){
      var _url = window._content.document.location.href;
      var _title = window._content.document.title;
      return "http://twitter.com/home?status=" + encodeURIComponent(_title) + "%20" + encodeURIComponent(_url) ;
      }
    if(semanticObjectType == "hCard"){
      var _urlvcard;
      var property = this.scope.semantic[semanticObjectType];
      _urlvcard = semanticObject[property];
     return "http://twitter.com/home?status=" + _urlvcard;
      }
  }
};

SemanticActions.add("submit_to_twitter", submit_to_twitter);

ページで、hAtomが埋め込まれていたときは、そのページのタイトルとURI、hCardでURL情報があるときは、単にURLの情報だけをPOSTします。Operator経由であることを示す語句を添えれば、そのページがMicroformatsが埋め込まれているということを知らせることができるカモ(?)。

今月のいらんことしい(2009年6月)

今月(2009年6月)、サイトのテンプレート等をカスタマイズしたところをまとめた記事です。

今月は、Movable Typeのマイナーアップデートがありました。

このほかには、これといって目立ったところを弄っていないのですが、とりあえず記しておきます。

  • 4.25から4.261へアップグレードした
  • 各記事ページでコメンテーターのアンカーを付けた
  • アーカイブページにAjax検索の仕組みを採用した
  • Open Searchプラグインを導入
  • カテゴリアーカイブでパラメタ(page=)の付くページはNOINDEXとしてみた

4.26へのアップグレードは順調に問題なく進みましたが、不具合に遭遇。その後、早急に修正ヴァージョン4.261がリリースされました。

コメントされる方のリンクですが、コメントのテンプレートにはもともとIDがMTCommentIDが付与されてましたので、それを利用したというだけです。

アーカイブインデックスですが、詳細は以下にて記載してあります。

Open Searchプラグインについては、以下に記しておきました。

MTPaginateプラグインをカテゴリーインデックスページに採用していますが、 phpでパラメタの付いたページには、metaタグで、下記のような出力となるようにしてみました。

  • <meta name="robots" content="noindex" />

アーカイブインデックステンプレートでパラメタのないトップページにはコレがでないように振り分けしてあります。今現在その結果どうなるのか様子を見ているといった状況です。

今月のカスタマイズは以上です。2009年6月のアーカイブは以下から閲覧することができます。

メモ:trim toとencodeの組み合わせで気をつけること

  • Posted by: maRk
  • mt4
  • はてなブックマークに追加

Movable Typeのグローバル・モディファイアのtrim_toを使うとき、エンコードすべき文字の途中でトリムされる場合の検証と対処について

説明がわかりにくいと思うので、いきなりですが、やりたいことをテストテンプレートにて示します。

test template 1
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="11" /></data>

上に示したテンプレートでは、0から&(アンパサンド)までを指定して出力するものです。

このテンプレートをそのまま出力(XMLファイルとして)させてブラウザで見ると、パースエラーとなってるはずです。

では、trim_toの値を15にしてみるとどうでしょうか。これはエンコード後のアンパサンドの文字数を含める数値です。

test template 2
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="15" /></data>

今度は、モディファイアの順番をいれかえして、trim_toを先に記述してみます。

test template 3
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" trim_to="11" encode_xml="1" /></data>

この場合だと、問題なく表示されます。

日本語の場合でテストしてみます。下のテンプレートではどうでしょうか。

test template 4
<mt:setvars>data=あいうえお&かきくけこ</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="9" /></data>

まとめのようなもの

以上のテンプレートは故意にエスケープすべき場所を指定してトリムをおこなっていますが、普通に記述していて予期しない箇所でパースエラーを引き起こす原因になっていることがありうるかも。

回避の方法としては、先にtrim_toを記述してから、encodeをおこなう形にするか、それが具合悪いのであれば、setvar、getvarで変数に渡してから処理するとか、XMLならば当該箇所をCDATAにするか、でしょうか。

それと、グローバル・モディファイアの処理を先に書いたものが先に実行されるらしいというかそういう仕様っぽいです。

買い物はいつものスーパーで

  • Posted by: maRk
  • myown
  • はてなブックマークに追加

スーパーマーケットでお買い物のハナシ。安い品を求めてあれこれハシゴするより同じ店舗を通い続けるのがいいのかも

景気がよくないと、どうも経済観念がおこってきて、如何にして出費をおさえるかとかばかり考えるようになってしまいました。そのなかで、日々買い物をしていて、スーパーでの買い物は、同じ店に通い続けるのがいいのかな、と思うようになりました。

その主たる理由なのですけど、「そのほうが時間を有効に使えるかも知れないから」って全然経済とか関係ないような理由です。

自分とこは新聞購読してないので、チラシが入ってこない所為というのもあるけど、チラシが見れたらみれたで、Aスーパーは野菜が安くて、Bスーパーは魚が安い、とわかれば野菜はAスーパー、魚はBスーパーで買おう、のように決めることも可能ですよね。

で、敢えてそれをしないというのは、以下のようなことから......

  • 店舗移動の時間、清算の時間、あと移動にかかるコストを抑える
  • 同じ店に通えば品物がどこにあるかわかるので探す時間が節約できる
  • 複数の店舗で、ポイントを作るとポイントが分散してしまう

お店の移動に自動車を使えばその分のガソリンも消費します。まぁこれは仕事の帰り道にスーパーがあるとかいう場合もあるので、それほど重要ではないです。

買いたい品物がどこにあるのかがわかりやすいというのは、自分にとっては大きいメリットと思ってます。「聞くは一時の・・・・・・」というのがあるのですけれども、買うつもりのあるものは聞いたら済むのですが、そうではなく、買うかどうかは実物を見てから決める、というようなものは聞きづらいのですね。定員からみると買いもしないものをどこにあるか聞かれるのは迷惑なことですし。

それと、最近はよく「メモ用紙」片手に買い物をされるヒトをよく見かけます。ワタくシも真似して実践してるのですが、要は必要以上に買わないための知恵みたいなものと思うんですけど、コレ、品物がどこにあるかすぐにわかるとですね、結構買い物時間の短縮につながります。

ポイント制度は毎日のことなので活用できるのなら活用したいところです。どうせ貯めるのならば同じ店舗のほうがいい、ってだけです。ポイントによって、割引につながるとか何らかの還元があるのならば多少は他の店舗より高くてもそれほど気にしなくていいかなと。

いいたいことは以上なのですが、これはひとつの考えでしかありませんので。あと、ナニかの譬えとかで引き合いに出したワケでもないです(コチラがどう読み取レとかも言えないんですが)。コノゴロなんとなくそう感じたので。

ダッシュボードで最近のカスタムフィールドの内容を見れるウィジェット

Movable Typeのダッシュボードから最近の記事で使っているカスタムフィールドの内容を見ることができるようにウィジェットを作ってみました。

前にダッシュボードのウィジェットを作ったりしていたのですが(MT:ダッシュボードにブログパーツを表示させてみた)、その続きです。

まずはスクリーンショットを。

recent_cfieldwidget.gif

テンプレートファイルのソースはこのようなものです。

<mt:setvarblock name="html_head" prepend="1">
    <link rel="stylesheet" href="<mt:var name="static_uri">plugins/c_field_widget/css/styles.css" type="text/css" media="screen" />
</mt:setvarblock>

<mt:setvartemplate name="showCustomField">
<MTEntries days="30" sort_by="modified_on" limit="5">
<div id="cf_entry-<$MTEntryID$>" class="entry-<mt:if name="__odd__">odd<mt:else>even</mt:if>">
    <MTEntryCustomFields>
        <MTIfNonEmpty tag="EntryCustomFieldValue">
        <div class="entry-title cf_entryTitle"><MTEntryAuthorID setvar="entry_author_id"><MTSetVarBlock name="entry_title"><MTIfNonEmpty tag="MTEntryTitle"><$MTEntryTitle$><MTElse><__trans phrase="..."></MTIfNonEmpty></MTSetVarBlock>
             <h4><MTIf name="editable"><a href="<mt:var name="script_url">?__mode=view&amp;_type=<$MTEntryClass lower_case="1"$>&amp;blog_id=<MTEntryBlogID>&amp;id=<MTEntryID>"><$MTEntryTitle$></a><MTElse name="author_id" eq="$entry_author_id"><a href="<mt:var name="script_url">?__mode=view&amp;_type=<$MTEntryClass lower_case="1"$>&amp;blog_id=<MTEntryBlogID>&amp;id=<MTEntryID>"><$MTEntryTitle$></a><MTElse><$MTEntryTitle$></MTIf></h4>
        </div>
            <div class="entry-meta cf_fieldName"><$MTEntryCustomFieldName$><mt:if tag="EntryCustomFieldDescription">(<$MTEntryCustomFieldDescription$>)</mt:if></div>
            <div class="entry-content cf_fieldValue"><$MTEntryCustomFieldValue encode_html="1"$></div>
        </MTIfNonEmpty>
    </MTEntryCustomFields>
</div>
</MTEntries>
</mt:setvartemplate>
<mtapp:widget id="DashbordWidgetCalendar" class="widget" label="最近のカスタムフィールド" can_close="1">
    <mt:getvar name="showCustomField">
</mtapp:widget>

直近の記事のカスタムフィールドの内容を全て出力します。のexcludeモディファイアを使えば、除外するフィールドを指定して、特定のフィールドだけ出すこともできます。

pluginとしてセットしたものをここに置いておきます。mt-staticフォルダにCSSファイルが入ってますが、気に入らなかったら使わないとか好きに書き換えするとよろしいかと。

Download

Open SearchプラグインにAjax 検索を

Ajax JSON SearchをOpen Searchとして対応させておきました。

現在、Ajax JSON Searchではなく、Google カスタム検索を導入した検索用ページに移動するようになっています。

えっと、記事一覧ページをクリックするつもりが、新規エントリ作成になってしまい、まいいか、と思って下書き状態にしておいたのですが、勿体ぶっててもしょうがないと思い、記事を書いて(公開|後悔)することにしました。

そういえば、MTの管理ページには、「ブログを書く」という大きなタブがあるのに、今までずっと「新規作成」のメニューから記事を書いてました。orz

小言はこのくらいにして、密かに(謎)ですが、使ってもらえるというものでもなさそうなんだけど、このブログのトップページサイトのトップページ等にOpenSearchプラグインが自動検出されるように対応させておきました。今のところ、各記事ページには配置してません。サイトに来られて興味をもたれたかたが利用されたらいいかなと思ったので。検索のページは、Ajax検索を使ったページでmt-search.cgiに依存しないし、自分が過去ログからあれこれ探すというのにも都合がよかったりします。

OpenSearchについては以下のページにまとめられており、導入するまでにどこを参照したらいいのかがわかりやすくなっています。

追記:参照サイトのリンクを忘れていました。すみません。

というわけで、コチラが説明することはあまりないのですけど、自分が躓いてたとこのメモとして記しておきます。

FIrefoxの OpenSearchプラグインの書き方の説明ページ(Creating OpenSearch plugins for Firefox)のサンプルで、以下のようにあるのですが、

<Url type="text/html" method="method" template="searchURL">
  <Param name="paramName1" value="paramValue1"/>
  ...
  <Param name="paramNameN" value="paramValueN"/>
</Url>

この書き方だと、IE7で読み込んでくれないので、直にUrl要素のtemplateのところに書く必要があります。結局FirefoxでもIEでも動作できる書き方は以下となるようでした。

  • <Url type="text/html" method="GET" template="searchURL?query={searchTerms}" />

あと、moz:SearchForm要素ですが、試した限りでは、Firefoxの検索ボックスで何も検索語をいれずに検索を実行したときに、moz:SearchFormに記述したURIに移動するようです。なので、検索専用のページを指定すれば、そのページが表示されるというわけです。ちなみに、Ajax検索を使った検索ページでは、パラメタなしでアクセスしたときは検索が実行されないように作ってあります。

#半分ヤケクソで書いてるわりに長くなってしまいました。(汗;

MT:アーカイブインデックスにAjax検索を取り入れて改造した

Movable Typeのアーカイブインデックスを改修してみました。Ajax JSON Searchの検索用テキストを再利用することでアーカイブリストを表示します。

Ajax JSON Searchって何よ、というかたは以下のページをご覧ください。で、設置した上でのハナシとして以下進めさせていただきます。

この検索で利用するテキストデータ(search_data.txt)なのですが、実はやってることが全アーカイブリストの出力。コレが意味するのは、コアの部分はアーカイブインデックスとほぼ同一内容のリストを作っているようなもの、ということになるのでは。。

それと、Ajax検索で検索ボックスに何も検索語をいれずに実行すると、全エントリが出力されるようになってます。入力されていないことをアラートで警告することもできるのでしょうが、恐らく敢えてやっていないのだと思われます。

以上のことをふまえて、search_data.txtを使い回ししてアーカイブ全出力するテンプレートをおもいついたというわけです(#くだらないけど)。

まずは、その元となるテンプレートを作ってみました。ページを開いて、ボタンを押すとエントリの検索が実行されて全エントリのリストが表示されます。

しくみは簡単です。blog_ajax_json_search.jsは本来、検索することが目的ですので、検索に関わる出力部分を少し改造します。具体的には、「○件ヒット」とかを表示しないように、build_search_result_html関数のところを書き換えます。

あとは、blogAjaxJsonSearch関数の第二引数を「,''」にして検索語のない状態として実行するだけです。

余談で、show_all_backnumbersみたいなのがあるのですけど、多分全リストを表示させるようなものだと思うのですがコレ動くんですかね。試してないですが。

てすとページでは、ボタン押下でblogAjaxJsonSearchを実行してますが、body要素のonload属性を使って実行のようにもできます。あえてやっていないのは、ナヴィゲーションリンクとかから、現在見ているページに流し込みできるんじゃね、みたいなハナシがしたかったからとか(#...ブツブツ)。

実際のページは、テンプレートのグローバルナビの「Archives」より確認できます。あとおまけでタグ検索の検索窓もつけてみました。以上です。

MovableTypeのカスタムフィールドで特定キーワードを含む記事をリストアップするテンプレート

Movable Typeのカスタムフィールドに書いてある内容から、任意の「キーワード」で記事を絞り込んでリストアップするというテンプレートを書いてみました。

コチラが説明しづらい部分がありますので、先ずは人力検索はてなの質問をご覧ください。

要点をまとめると、このようなかんじでしょうか。

  1. 大阪一円のレストランに関する記事が作成されている
  2. 各記事には、「最寄り駅」という名のカスタムフィールドがある
  3. カスタムフィールドには最寄り駅から何分という情報が記載されている
  4. カスタムフィールドに書いてある最寄り駅の駅名から記事をリストアップしたい

MovableType.jpの「カスタムフィールドの値で並べ替えやフィルタリングする」に書かれている、「カスタムフィールドの値を利用したフィルタリング」を試してみたのですが、どうもfield:customfieldbasename=fooの中身が完全一致でないと期待の動作にならないようなのです。

そうなると、大阪一円の駅名の部分だけのフィールドを「ドロップダウンメニュー」や「ラジオボタン」タイプで別途設けておいてそのフィールドのほうで、評価してみるというような使い方でないと、カスタムフィールドの値でソートというのが実現されないように思います。それならば、一旦変数にフィールドの内容を格納してそこから評価してみるというのでどうでしょうか。

ということで、回答は閉め切られてますが、コチラがこの命題に答えた解答は以下のような感じです。あまりすっきりしない感じですが。

カスタムフィールドから特定キーワードを含む記事をリストアップするテンプレート

<mt:setvars>filterName=JR大阪駅</mt:setvars>
<mt:setvartemplate name="showMoyorieki">
<MTEntries><mt:setvarblock name="station"><mt:cf_MoyoriEki></mt:setvarblock><mt:if name="station" like="$filterName"><li><a href="<$MTEntryPermalink$>"><MTEntryTitle></a>:<mt:cf_Moyorieki></li>
</mt:if></MTEntries>
</mt:setvartemplate>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<$mt:PublishCharset$>" />
<title>test custom field filtering</title>
</head>
<body>
<div>
<h1>最寄り駅: <em><mt:var name="filterName" /></em>を含む記事</h1>
<ul>
<mt:getvar name="showMoyorieki" trim="1" />
</ul>
</div>
</body>
</html>

Note:

  • カスタムフィールドは記事用で作成し、テキストタイプ、カスタムフィールドを出力するタグ名は「mt:cf_MoyoriEki」とした
  • cf_MoyoriEkiを変数(station)に収め、任意のキーワードを含んでいる記事をリストアップさせた

参考までに、一連の動作の検証で使用したファイル群は以下。

Download:

Index of all entries

BlogTop > Archives > 2009年6月 Archive

Feeds
Elsewhere

Action Streams

logo

Comment powered by DISQUS

Return to page top