にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2016/09/10. 12:57:56.

RSS/Atomフィード生成ソフトに大穴がっ

RSS自動生成ソフト「Fumy RSS & Atom Maker」私が製作して公開しているRSS・Atomフィード自動生成ソフト「Fumy RSS & Atom Maker」について、ユーザさんからバグ報告が届きました。

このソフトでは、フィードの中に本文を含めることができるのですが、その際、含める最大文字数を指定できるようになっています。指定できる数値には特に制限はないのですが、ユーザさんの報告によると

「最大文字数」を214以下に設定すると正しく反映されるが、215に設定すると途端に全文が最後まで収録されてしまう

とのことでした。

RSS/Atomフィードに含めるContentの最大文字数設定

そんな中途半端な値で字数制限処理が行われなくなるとは、さっぱり原因が想像できません……。255文字目と256文字目とか、65535文字目と65536文字目とかが境になっているなら分からないでもないですが。(^_^;;;
でも、現実に問題は発生しているようなので、何らかの原因があるはずです。

というわけで、ソースコードを覗いてみました。
なんだか、C++言語のソースコードを見たのはずーいぶん久しぶりのような気が。^^;

で、字数制限処理を行っている箇所を探してみていきなり驚愕!
たしかに、ある条件下では字数制限処理をすっ飛ばしてしまう記述になっていました。ただ、境界は214文字というわけではありません。ユーザさんの検証で214文字目が境だったのは、たまたまそういうHTMLファイルを対象にしたからです。

その原因は、以下のようにプログラムを書いていたからでした。

  1. 指定された文字数目が『2バイト文字の後半1バイト』であれば、その直後でカットする。
  2. 指定された文字数目が『2バイト文字の前半1バイト』であれば、その1バイト先でカットする。

これは、本文中に日本語などの2バイト文字が使われている場合、2バイト文字の真ん中でぶった切ってしまうと文字化けが発生するので、それを避けることを考慮した処理です。

ユーザの設定が「300文字目」だったとして、文字列の先頭から300バイト目がたまたま2バイト文字の前半1バイトだった場合、そこで切るわけにはいきません。文字化けを避けるためには、さらに1バイト進めて、301バイト目までを含めて切らなければなりません。
そんな処理をするための記述です。

がー。

重大な処理が欠損していました!

それは、
指定された文字数目が1バイト文字(半角英数字・記号)だった場合の処理がない!
ということ。(爆)

つまり、以下のような処理になっていたわけです。

  • ユーザが指定した文字数目に2バイト文字があれば、指定文字数(またはその1バイト先)でカット処理が行われるので問題はない。
  • ユーザが指定した文字数目が1バイト文字であれば、カット処理を行わずに全文を収録!

……とんでもねえな!(爆)
我ながら驚きましたですよ。こんな大穴のあるコードを書いていたとは!(^_^;;;

つまり、バグ報告をして下さったユーザさんが検証に使ったHTMLは、(ソフトウェアが抽出した文字列の)先頭から214バイト目は2バイト文字(の後半1バイト)で、215バイト目は1バイト文字だったのでしょう。(^_^;;;

ぬおーう。
不覚すぎるっっっ!

早速その辺を修正して、Ver 0.972β として公開しました。
昨年10月からだから、なんと8ヶ月ぶりのバージョンアップです。
そんなに間が空いてたのか……。

RSS自動作成ソフト - Fumy RSS&Atom Maker

コメント

どうしたら動画がみれますか・

投稿者 Anonymous : 2010年02月25日 09:19

はじめして
古い記事ですが、内容がタイムリーだったので。
実は私も昨日自分の偽ブログHPにRSSを付けました。
delphiで書きましたが、私はより簡単な行数制限にしました。2byte文字の処理は苦手ですね。自分専用のソフトでも2byte文字の処理がありますが、時々半角誤動作しています。
関係ない話ですが、
k-meleonのRSSリーダーで、こちらのRSSのリンクが開きません。
www.nishishi.com/rss/mix.xml
直接保存するとなぜか"nishishi.xml"で保存されます。
書かれている記事のリンクは無いようです?

投稿者 H.Matsui : 2013年05月06日 20:06

H.Matsuiさん、こんにちは。
2バイト文字の処理は面倒ですよね……。しかも、Unicodeになると3バイト以上の文字もありますし……。^^;;;

うちのサイト内で提供しているRSSフィードは、ほとんどをFeedBurnerにリダイレクトしているのが原因でしょうかね……。
今確認したところ、たしかに mix.xml は、最新の情報に更新されていませんね……。複数のRSSフィードを結合した上でFeedBurnerに読ませているのが何か不具合を引き起こしているのかな……。

事実上、最近の更新はブログが大半なので、もしチェック頂けるならブログだけのフィードの方が良いかもしれません。(^_^;;;
http://www.nishishi.com/rss/blogindex.xml

投稿者 にしし : 2013年05月06日 23:30

にししさん、おはよう御座います。
現在Delphi5なのでUnicodeは、無視しています。(^^)
C++ Builderも持っていますが、Ver.4です。
新しいdelphiが欲しいですが、旅行時はXPのネットブックでもdelphiを使うので買うのを躊躇しています。

RSSはその後ブログの方に変更して拝見させて頂いています。
RSSではなぜか画像は表示されてないですね?でもamazonにはリンクはされています。
RSSは最近知り使い始めました便利ですね。今まで自分には関係ない難しい何かだと思っていました。(^^)

関係ないですが、このページ上にあるディレクトリ階層のようなリンクをHPで真似させて頂きました。
CGIでは無く、HTMLの全ファイル変更ですけど。

投稿者 H.Matsui : 2013年05月07日 07:45

C++ Builderは、Ver.1から使っているのですが、最も使い勝手が良いと感じて気に入っているのは、Ver.6です。^^;
途中で、ブランドがBorlandからInprizeになったり、Borlandに戻ったり、そして現在はエンバカデロになっていたり変化が激しいですが。^^;;;

RSSに画像が含まれないのは、おそらくimg要素のsrc属性値をサーバ内のパスで記述しているからだと思います。httpから書けば、たぶん表示してくれるのではないかと思うのですが、後々のメンテナンスのしやすさを考えて、そうはしていません。(^_^;)

ディレクトリ階層のようなリンクは、「パンくずリスト」のことですかね?
ウェブサイトのナビゲーションとしては、とても分かりやすくてよく使われる方法なので、ぜひご活用下さい。^^;

投稿者 にしし : 2013年05月08日 10:27

コメント数: 5件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---