無料ブログ「rentafree.net」の管理人ブログ

ScribeFireのバグに対応しました

ScribeFireから投稿してみたら、
mt.setPostCategories
が正常に行えなかったので対応しました。

これは、カテゴリIDが「0」のときに、
ScribeFireが「0」ではなく空要素を送ってくるみたいなんでカテゴリIDの取得ができずにエラーになってました。
どう考えてもScribeFire側のバグですが、対応しておきました。


この投稿はScribeFireからの投稿です。

アクセス解析実装できそう

ユーザーページのアクセス解析の実装を考えて、
ユーザーサイトのログ記録システム作った。

ってわけで、次の機能追加はアクセス解析機能になりそうな感じです。
たぶん1日1万件を上限にすると思います。

でも、先にテストサーバー用意しないとダメな感じ。

記事の書き方

記事編集のエディタ説明です。

右上にある「ソース」ってのクリックすると通常の<textarea>モードとなります。
「ソース」だった部分が「プレビュー」に変わりますんで、それクリックすると通常モードに戻ります。
<textarea>モードだとHTMLタグなどが有効になります。(ただし、モード切り替え時に変換処理があるのでモード切り替えすると内容変わっちゃうこともあります。)
通常モードだとタグなどの特殊文字はエスケープされます。

上部の<B>ってのクリックすると、選択範囲の文字列が太字になります。
上部の<I>ってのクリックすると、選択範囲の文字列が斜体になります。
上部の<S>ってのクリックすると、選択範囲の文字列が打ち消し線になります。
上部の<U>ってのクリックすると、選択範囲の文字列が下線つきになります。
これらは、選択範囲にタグが含まれると、そのタグは消えます。

<B><I><S><U>
で修飾した文章にマウスカーソルを合わせて右クリックすると、
「<タグ>解除」って項目がでます。
選択するとタグが解除されます。

複数行選択して、
<UL>ってのクリックすると、選択範囲がリスト(番号なし)になります。
<OL>ってのクリックすると、選択範囲がリスト(番号あり)になります。
これらは、選択範囲にタグが含まれると、場合によっては機能しません。
選択範囲+1行がリストになることが多いと思いますが、
文字を入力せずに改行すると消えると思います。

<SPAN>は、
主に文字に色をつけたい場合に使います。
クリックすると選択範囲が、「<span>選択範囲</span>」の様になりますが、
この時点では見た目に変化はありません。
適用した範囲で右クリックすると設定画面がでますので、CSS設定とかできます。
選択範囲にタグが含まれている場合はタグは消えます。

<DIV>は、
主に枠をつけたりするのに使います。
クリックすると選択範囲が、「<div>選択範囲</div>」になります。
こちらもこの時点ではあまり変化がありませんが、
適用範囲を右クリックで設定画面をだしてCSS設定できます。
選択範囲にタグが含まれていると、場合によっては変換できません。

<A>は、リンクです。
クリックすると設定画面が開きます。
文章を選択している状態でクリックだと文字列挿入状態となります。
選択範囲が置換されます。
なにも選択指定ない状態だと文章の末尾に追加となります。
画像を選択した状態でクリックすると、画像をリンクにできます。
リンク設定済みの位置で右クリックすると変更できます。

<IMG>は、選択位置(又は末尾)に画像を埋め込みます。
クリックすると設定画面がでます。
設置済みの画像右クリックで変更できます。

<TABLE>は表組みを作成します。
選択位置又は末尾。
初期状態で2x2で枠線つきの設定となっています。
設置済みの表を右クリックで変更できます。


右クリックメニューから、又はCtrl+Z、Ctrl+Shift+Zでアンドゥ、リドゥできますが、
独自実装なので、ブラウザ実装の<textarea>モードのアンドゥ、リドゥと内容が違うので注意です。


テンプレートの作り方

個人テンプレートのみ編集が可能です。
共有テンプレートに登録すると編集不可になりますので、
未完成のテンプレートは共有登録しないように。

「テンプレート設定」の一覧に表示されるテンプレートから「複製」すると、
まったく同じ内容の個人テンプレートができあがります。
複製で個人テンプレートを作成し、個人テンプレートを編集して新しいテンプレートを作ります。

編集画面では、
「テンプレート名」「HTML」「CSS」「テンプレート説明」
の4項目が編集できます。
テンプレート名はわかりやすい名前で適当につけてください。重複不可です。
テンプレートの説明は共有テンプレートにしない場合はどうでもいいと思います。255byteまで。

CSSとHTMLは広めの<textarea>ですが、
全部コピーしてクライアントのテキストエディタで編集して貼り付けた方が楽だと思います。

CSSは通常のCSSです。

HTMLの方は、基本はHTMLですが、
「&$変数名;」
「&&特殊構文名; 処理内容 &/特殊構文名;」
といった感じで、変数と特殊構文が有効になり、
ブログの内容が埋め込まれます。

テンプレート構文はテンプレート以外にフリーエリアプラグインでも有効です。

公式テンプレートがXHTML仕様のブログサービスなどもありますが、
ブログの記事を自作でないブログエディターで記事を編集する場合は、XHTML準拠の記事が生成されるとは限りませんので、
XHTMLやXMLテンプレートはおすすめしません。HTMLテンプレートを推薦します。


トラックバックループ

&&TrackbackLoop;
&/TrackbackLoop;
の間の部分に、記事ループ中のその記事に対するトラックバックが繰り返し埋め込まれます。
&&EntryLoop;
&/EntryLoop;
の間で使います。


以下の変数が有効です。
&$TrackbackLoopCount;
トラックバックループのループカウント。0から。
&$TrackbackLoopId;
トラックバックID。
&$TrackbackLoopBlogName;
トラックバック送信元のブログ名。
&$TrackbackLoopUrl;
トラックバックURL。
&$TrackbackLoopExcerpt;
トラックバック要約。
&$TrackbackLoopTitle;
トラックバックのタイトル
&$TrackbackLoopDateSecond;
秒。
&$TrackbackLoopDateMinute;
分。
&$TrackbackLoopDateHour;
時。
&$TrackbackLoopDateDay;
日。
&$TrackbackLoopDateMonth;
月。
&$TrackbackLoopDateYear;
年。

コメントループ

&&CommentLoop;
&/CommentLoop;
の間の部分に、記事ループ中のその記事に対するコメントを繰り返し埋め込まれます。
&&EntryLoop;
&/EntryLoop;
の間で使います。


以下の変数が有効です。
&$CommentLoopCount;
コメントループ中のループカウント。0から。
&$CommentLoopId;
コメントループ中のそのコメントのコメントID。
&$CommentLoopName;
コメントループ中のそのコメントの投稿者名。
&$CommentLoopUrl;
コメントループ中のそのコメントのURL。
&$CommentLoopBody;
コメントループ中のそのコメントの本文。
&$CommentLoopDateSecond;
秒。
&$CommentLoopDateMinute;
分。
&$CommentLoopDateHour;
時。
&$CommentLoopDateDay;
日。
&$CommentLoopDateMonth;
月。
&$CommentLoopDateYear;
年。


記事ループ

&&EntryLoop;
&/EntryLoop;
の間の部分が、
そのページに表示すべき記事の数だけ繰り返し埋め込まれます。


ループ内では以下の変数が有効です。
&$EntryLoopCount;
記事ループ中のループカウント。0から。
&$EntryLoopId;
記事ループ中の記事ID。記事ページのアドレスは「http://ドメイン/entry/記事ID」です。
&$EntryLoopTitle;
記事ループ中のその記事のタイトル。
&$EntryLoopBody;
記事ループ中のその記事の本文。
&$EntryLoopMore;
記事ループ中のその記事の追記。
&$EntryLoopTrackbackUrl;
記事ループ中のその記事へのトラックバック送信先アドレス。
&$EntryLoopTrackbackCount;
記事ループ中のその記事のトラックバック数。
&$EntryLoopCommentCount;
記事ループ中のその記事のコメント数。
&$EntryLoopCategoryId;
記事ループ中のその記事のカテゴリID。
&$EntryLoopCategoryName;
記事ループ中のその記事のカテゴリ名。
&$EntryLoopDateYear;
記事ループ中のその記事の年。
&$EntryLoopDateMonth;
記事ループ中のその記事の月。
&$EntryLoopDateDay;
記事ループ中のその記事の日。
&$EntryLoopDateHour;
記事ループ中のその記事の時。
&$EntryLoopDateMinute;
記事ループ中のその記事の分。
&$EntryLoopDateSecond;
記事ループ中のその記事の秒。
&$EntryLoopEntryUrl;
記事ループ中のその記事の記事ページURL。
&$EntryLoopCategoryUrl;記事ループ中のその記事のカテゴリページURL。

プラグイン出力を埋め込む

&&PluginLoop1:1;
  &&if:PluginLoopTitle;<div class="PluginTitle" id="PluginTitle_&$SidebarId;_&$PluginLoopCount;">&$PluginLoopTitle;</div>&/if;
   <div class="PluginBody" id="PluginBody_&$SidebarId;_&$PluginLoopCount;">&$PluginLoopBody;</div>
&/PluginLoop1:1;
標準テンプレートはこんな感じになってます。

&&PluginLoop1:1;
から
&/PluginLoop1:1;
までの間をループ処理します。
左の数値がサイドバーIDです。
右の数値は特殊構文用のIDですが、
プラグインをネストするようなことは無いでしょうから、
&&PluginLoop1;

&/PluginLoop1;
でもいいかも。

サイドバーIDは、ブログのプラグイン設定の「位置」って項目の値です。
同じIDで設定されているプラグインが順番にループします。

サイドバーIDには0から255までの数値が有効ですが、
他のテンプレートとの互換性を考えて、以下のルールで配置することが好ましいです。

0=<head>
1=左サイドバー(2カラムで左がない場合は右)
2=右サイドバー(2カラムで右がない場合は左)
3=中央上部
4=記事下(追記とフッタの間。一番目の記事のみ)
5=記事下(追記とフッタの間。すべての記事)
6=中央下部
7=右上
8=左下
9=記事上(記事タイトル下)


&&if:PluginLoopTitle;<div class="PluginTitle" id="PluginTitle_&$SidebarId;_&$PluginLoopCount;">&$PluginLoopTitle;</div>&/if;
プラグイン見出し部分の出力ですが、
「if」構文で囲まれていますので、
見出しが空文字の場合はこの部分は出力されないようにできています。
id属性にはプラグイン固有の値を入れて重複しないようにしています。
&$PluginLoopTitle;
の部分に見出しが出力されます。


<div class="PluginBody" id="PluginBody_&$SidebarId;_&$PluginLoopCount;">&$PluginLoopBody;</div>
こっちはプラグイン本文。
&$PluginLoopBody;
の部分に埋め込まれます。
本文が空のプラグインはプラグインループが出力されないので常に値ありです。

テンプレート変数

&$変数名;
で変数の値を出力します。
変数名
説明
&$OHP;
サービストップページへのリンクを出力します。必須。
&$AD;テキスト広告を出力します。必須。
&$Contact;
公式サイトの問い合わせフォームへ誘導する、連絡方法を記載したページのURLを出力します。
&$HEAD;
公式JavaScriptを埋め込みます。必須ではありませんが、<head>内に設置してください。詳細機能はこちらを確認してください。
&$CSS;
そのテンプレートのCSSファイルアドレス。
&$BlogTop;ブログトップページのアドレス。(スマートフォン用アドレス接続時はスマートフォン用トップ)
&$Canonical;
ページの正しいアドレス。(スマートフォン用アドレス接続時もPC用アドレスが返ります)
&$FeedAtom;
Atomのアドレス
&$FeedRss1;RSS1.0のアドレス
&$FeedRss2;RSS2.0のアドレス
&$SmartPhone;スマートフォン用アドレス接続時は1。それ以外は空。
&$PageType;現在のページのタイプが取得できます。0=トップページ又は通常リスト、1=記事ページ、2=日別ページ、3=月別ページ、4=カテゴリページ、5=検索結果、6=掲示板
&$PageNumber;リストのページ番号が取得できます。1ページ目は0か空で2ページ目が1です。記事ページの場合は記事IDです。
&$PageMax;
ページ番号の最大値が取得できます。
&$PageLinks;
現在のページ前後の最大10ページのページリンクを出力します。ページ番号は0からですが、表示は1からとなります。
&$EntryCount;
ブログの総記事数。
&$BbsType;
掲示板ページのみ有効。0=ノーマル掲示板、2=スレッド掲示板
&$Day;日別ページの場合「YYYYMMDD」。日別ページアドレスは「http://ドメイン/day/YYYYMMDD」か「http://ドメイン/day/YYYYMMDD/ページ番号」です。
&$DayFirst;
記事ループ中に同一日付の記事が複数ある場合、その日付の最初の記事のみ1でそうでない場合は空。
&$DayLast;
記事ループ中に同一日付の記事が複数ある場合、その日付の最後の記事のみ1でそうでない場合は空。
&$Month;月別ページの場合「YYYYMM」。月別ページアドレスは「http://ドメイン/month/YYYYMM」か「http://ドメイン/month/YYYYMM/ページ番号」です。
&$CategoryId;カテゴリID。カテゴリページのアドレスは「http://ドメイン/category/カテゴリID」か「http://ドメイン/category/カテゴリID/ページ番号」です。
&$CategoryName;
カテゴリ名。カテゴリページのみ。
&$EntryPage;記事ページなら1。それ以外のページだと空。
&$EntryTitle;
記事タイトル。記事ページのみ。
&$TopPage;トップページなら1。それ以外のページだと空。
&$SearchString;検索文字列。
&$SearchResults;
検索結果ページの検索結果リストの件数。
&$StartNumber;
ページの最初の記事のリスト中の位置。(記事ページは空)
&$LastNumber;
ページの最後の記事のリスト中の位置。(記事ページは空)
&$BlogName;ブログ名。
&$Description;ブログの説明。
&$Keywords;キーワード。
&$TopEntry;トップページで、トップ記事が設定されている場合は記事番号。それ以外は空。
&$NextUrl;次のページのアドレス。次のページが古い記事です。
&$NextName;次のページの記事名。記事ページのみ。
&$PrevUrl;前のページのアドレス。前のページが新しい記事です。
&$PrevName;前のページの記事名。記事ページのみ。
&$BlogId;ブログID。コメントやトラックバックのCGIへのパラメータを設定する場合に使う。
&$SidebarId;サイドバーID。特殊構文「&&PluginLoop1;」の1の部分。
&$PluginLoopId;プラグインID。プラグイン出力結果にid属性をつけたい場合に重複しないようにする場合に使う。
同一プラグインが2回呼び出された場合(同一サイドバーの複数設置時)は重複します。
&$PluginLoopCount;プラグインの呼び出し毎に+1される1からの連番。同一プラグインの複数回呼び出しでも加算されるので確実に重複しません。
&$PluginLoopTitle;
プラグインの出力する見出し。
&$PluginLoopBody;プラグインの出力する本文。
&$FirstEntry;記事ループ中の1番目の記事の場合1。それ以外は空。
&$EntryLoopCount;記事ループ中のループカウント。0から。
&$EntryLoopId;記事ループ中の記事ID。記事ページのアドレスは「http://ドメイン/entry/記事ID」です。
&$EntryLoopTitle;記事ループ中のその記事のタイトル。
&$EntryLoopBody;記事ループ中のその記事の本文。
&$EntryLoopMore;記事ループ中のその記事の追記。
&$EntryLoopSummary;
記事ループ中のその記事の要約(最大255byteで切り詰められた本文テキスト)。
&$EntryLoopTrackbackUrl;記事ループ中のその記事へのトラックバック送信先アドレス。アンパサンドを含むURLですが、文字参照での出力となります。
&$EntryLoopTrackbackCount;記事ループ中のその記事のトラックバック数。
&$EntryLoopTrackbackReceive;
トラックバック受信可能なら1、不可なら空。
&$EntryLoopCommentCount;記事ループ中のその記事のコメント数。
&$EntryLoopCommentReceive;
コメント受信可能なら1、不可なら空。
&$EntryLoopCategoryId;記事ループ中のその記事のカテゴリID。
&$EntryLoopCategoryName;記事ループ中のその記事のカテゴリ名。
&$EntryLoopDateYear;記事ループ中のその記事の年。
&$EntryLoopDateMonth;記事ループ中のその記事の月。
&$EntryLoopDateDay;記事ループ中のその記事の日。
&$EntryLoopDateHour;記事ループ中のその記事の時。
&$EntryLoopDateMinute;記事ループ中のその記事の分。
&$EntryLoopDateSecond;記事ループ中のその記事の秒。
&$EntryLoopDateWday1;曜日(Sun,Mon,Tue,Wed,Thu,Fri,Sat)
&$EntryLoopDateWday2;曜日(日,月,火,水,木,金,土)
&$EntryLoopEntryUrl;記事ループ中のその記事の記事ページURL。
&$EntryLoopCategoryUrl;記事ループ中のその記事のカテゴリページURL。
&$EntryLoopTag;
記事ループ中のその記事に設定されているタグ。(分割されていない文字列)
&$EntryLoopAuthor;
記事ループ中のその記事に設定されている著者名。
&$TagLoopName;
タグループ中の個別タグ名
&$TagLoopUrl;
タグループ中の個別タグのタグページURL
&$CommentLoopCount;コメントループ中のループカウント。0から。
&$CommentLoopId;コメントループ中のそのコメントのコメントID。
&$CommentLoopName;コメントループ中のそのコメントの投稿者名。
&$CommentLoopUrl;コメントループ中のそのコメントのURL。
&$CommentLoopBody;コメントループ中のそのコメントの本文。
&$CommentLoopDateSecond;秒。
&$CommentLoopDateMinute;分。
&$CommentLoopDateHour;時。
&$CommentLoopDateDay;日。
&$CommentLoopDateMonth;月。
&$CommentLoopDateYear;年。
&$CommentLoopDateWday1;曜日(Sun,Mon,Tue,Wed,Thu,Fri,Sat)
&$CommentLoopDateWday2;曜日(日,月,火,水,木,金,土)
&$TrackbackLoopCount;トラックバックループのループカウント。0から。
&$TrackbackLoopId;トラックバックID。
&$TrackbackLoopBlogName;トラックバック送信元のブログ名。
&$TrackbackLoopUrl;トラックバックURL。
&$TrackbackLoopExcerpt;トラックバック要約。
&$TrackbackLoopTitle;トラックバックのタイトル
&$TrackbackLoopDateSecond;秒。
&$TrackbackLoopDateMinute;分。
&$TrackbackLoopDateHour;時。
&$TrackbackLoopDateDay;日。
&$TrackbackLoopDateMonth;月。
&$TrackbackLoopDateYear;年。
&$TrackbackLoopDateWday1;曜日(Sun,Mon,Tue,Wed,Thu,Fri,Sat)
&$TrackbackLoopDateWday2;曜日(日,月,火,水,木,金,土)


テンプレート特殊構文

どの構文も、不要なスペースは入れられません。


if構文
&&if:条件;
間の文章。
&/if;
if文もどきです。
条件には変数名を入れて値の有無を判別するか、
「変数名=文字列」で変数と文字列の一致を判別できます。
変数の値の有無の判別は、完全な値なしかその他の判別です。数値の0は値ありとなります。
演算子は使えません。



&&if:NextUrl;
「次のページがあります!」
&/if;

変数の値が空の場合は表示されません。


AND
&&if:NextUrl&PrevUrl;
「次のページがあります。前のページもあります!」
&/if;

&で区切ると左辺が不一致なら不一致、左辺が一致なら右辺を確認します。


OR
&&if:NextUrl|PrevUrl;
「次のページ又は前のページがあります!」
&/if;

|で区切ると左辺が一致なら一致、左辺が不一致なら右辺を確認します。

ANDとORは複数連結できます。
その際はANDとORに優先順位はありません。
左から処理していきます。


NOT
&&if:NextUrl&!PrevUrl;
「次のページがあります。前のページはありません!」
&/if;

頭に!つけると逆になります。


文字列比較
&&if:EntryLoopCount=1;
「2番目の記事です!」
&/if;

変数名=文字列
で、一致が条件となります。
文字列には、「:」「;」「&」「|」は使えません。


&&if:!EntryLoopCount=1;
と式の前に「!」を付ければ結果は反転します。


if構文の条件式は最大200byteです。
日本語は基本的に1文字3byteです。


set構文
&&set:ユーザー変数=値;
ユーザー定義の変数に値を代入できます。
set構文は開始構文のみで終了構文は不要です。
ユーザー変数は、_(半角アンダーバー)から始まる半角英数字で、合計2文字から11文字までの文字列限定です。
値として代入できるのは正の整数のみで、
数値以外が代入されようとした場合は0が代入されます。
0から始まる数値が代入されようとした場合は数値として不要な0は省かれます。

そのページに表示する記事のいずれかにユーザー変数で使用可能な文字列のタグが設定されている場合、
テンプレート処理前にユーザー変数が設定されます。(値=1)


&&set:_var=1;
ユーザー変数の値は&$_var;です。

&&set:ユーザー変数=演算式;
+ 加算
- 減算
* 乗算
/ 除算(少数切り捨て)
% 剰余算
の演算が可能です。

演算子に優先順位はなく、
演算子が複数の式の場合は全て左から演算されます。

=に数値が続く場合はまずユーザー変数にその値が代入され初期化されます。
=に変数名が続く場合はユーザー変数の初期値はその変数になります。(変数が数値以外の場合は0)
=に演算子が続く場合はユーザー変数は初期化されずに演算されます。(ユーザー変数が存在しない場合は0)

以降、
演算子+値
の組み合わせでユーザー変数に対して左から順に演算が行われていきます。
算数的には、
[ユーザー変数]=[ユーザー変数][演算子][値]
の様な感じで処理されます。
(=は算数的には等価ですが、等価ではなく代入です。)

値には変数名が利用できます。
値には正の整数しか使えません。

*数値以外の変数で演算しようとした場合。
*9999を超える値で演算しようとした場合。
*ユーザー変数が9999を超えた場合。
*ユーザー変数が0未満の場合。
*ゼロで割ろうとした場合。
は、その時点で演算は終了します。

割り算の結果、少数が発生する場合は切り捨てられます。

簡単な例
&&set:_var=1+1*3;
ユーザー変数の値は&$_var;です。
この場合、
=に続く1でユーザー変数の初期値が1となり、
続く+1でユーザー変数に1が加算され、
続く*3でユーザー変数が3倍されます。
ですので、答えは「6」です。
演算子に優先順位がなく、常に左からなので注意です。

実用例
記事ループにおいてループ偶数回目と奇数回目を判別したい場合に、
&&set:_var=EntryLoopCount%2;
&&if:_var=0;奇数&/if;
&&if:_var=1;偶数&/if;
とすれば、
奇数,偶数,奇数,偶数,奇数,偶数....
となります。
(EntryLoopCountは1回目が0です。)

常にユーザー変数に対して演算が行われ、変数の初期化も省略できるので、
&&set:_var=+1;
のようにすると加算代入のようなこともできます。
(一般的な加算代入とは演算子が逆になるので注意)
足し算以外もできます。


set構文の式は最大200byteです。


EntryLoop構文
&&EntryLoop;
間の文章。
&/EntryLoop;
そのページに表示すべき記事の分だけループします。

EntryLoop構文のネストは無効です。


CommentLoop構文
&&CommentLoop;
間の文章。
&/CommentLoop;
EntryLoop中で使います。
EntryLoop中の現在の記事へのコメントの分だけループします。

この構文は、同じ記事に対しては一度しか実行されません。


TrackbackLoop構文
&&TrackbackLoop;
間の文章。
&/TrackbackLoop;
EntryLoop中で使います。
EntryLoop中の現在の記事へのトラックバックの分だけループします。

この構文は、同じ記事に対しては一度しか実行されません。


TagLoop構文
&&TagLoop;
間の文章。
&/TagLoop;
EntryLoop中で使います。
EntryLoop中の現在の記事に設定されているタグの分だけループします。

set構文でユーザー変数として使用できる文字列のタグ(アンダースコアから始まる2から11文字の半角英数字)はスキップされます。

TagLoop構文のネストは無効です。


PluginLoop構文
&&PluginLoop数字;
間の文章。
&/PluginLoop数字;
数字で指定されたIDのサイドバーに設定されたプラグインの分だけループします。

PluginLoop構文のネストは無効です。


特殊構文のネスト
&&if:条件;
  &&if:条件;
    間の文章。
  &/if;
&/if;
こんな感じはできません。

&&if:数値:条件;
  &&if:条件;
    間の文章。
  &/if;
&/if:数値;
こんな感じで:を一個はさんで数値を入れると、
構文IDを設定できます。
IDなし又は違うIDの終了文では終了しません。


&&if:1:NextUrl;
  「次のページがあります!」
  &&if:PrevUrl;
    「前のページもあります!」
  &/if;
&/if:1;

使い道はないと思いますが、if以外の構文でも指定できます。