<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>msanolog</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/" />
<modified>2005-11-26T02:57:21Z</modified>
<tagline></tagline>
<id>tag:www.semblog.org,2006:/msano//4</id>
<generator url="http://www.movabletype.org/" version="3.01D-ja">Movable Type</generator>
<copyright>Copyright (c) 2005, msano</copyright>
<entry>
<title>[Ajax] If-Modified-Sinceヘッダを利用してWebページのキャッシュを行うXMLHttpRequestラッパー</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000407.html" />
<modified>2005-11-26T02:57:21Z</modified>
<issued>2005-11-19T07:55:34Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.407</id>
<created>2005-11-19T07:55:34Z</created>
<summary type="text/plain">以前書いたエントリ「[Ajax tips] XMLHttpRequest と I...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>javascript</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>以前書いたエントリ「<a href="http://www.semblog.org/msano/archives/000386.html">[Ajax tips] XMLHttpRequest と If-Modified-Since</a>」への一つの対応として、XMLHttpRequest にキャッシュ機能を付加するラッパーを作成してみた。</p>

<p>コード ： <a href="xmlhttprequestwithcache/xmlhttprequestwithcache.js">xmlhttprequestwithcache.js</a></p>

<p>各種ブラウザ側でWebリソースの更新確認のマネージメントをきちんとしてくれるようになれば、このライブラリは不要になるので、それまでの一時対応的な位置づけ。</p>

<p>■ 使い方<br />
　[<a href="http://prototype.conio.net/">prototype.js</a>を使用している場合]<br />
　HTML上で、<a href="http://prototype.conio.net/">prototype.js</a> を読み込んだあとに読み込むだけで、Ajax.Request() のGETリクエストがキャッシュつきになる。<br />
　--------------------------------------------------------<br />
　＜script type="text/javascript" src="/pathtoscript/prototype.js"＞＜/script＞<br />
　＜script type="text/javascript" src="/pathtoscript/xmlhttprequestwithcache.js"＞＜/script＞<br />
　--------------------------------------------------------</p>

<p>　[IEでXMLHTTPを使用している場合]<br />
　var req = new ActiveXObject('Msxml2.XMLHTTP');<br />
　var creq = new XMLHttpRequestWithCache(req);<br />
　// 以降、creq を、XMLHttpRequest と同様に使用する。</p>

<p>　[IE以外でXMLHttpRequestを使用している場合]<br />
　var req = new XMLHttpRequest();<br />
　var creq = new XMLHttpRequestWithCache(req);<br />
　// 以降、creq を、XMLHttpRequest と同様に使用する。</p>

<p>■サンプル<br />
<a href="xmlhttprequestwithcache/">こちら</a></p>

<p>■テストしたブラウザとprototype.js<br />
　Firefox 1.0.7<br />
　Internet Explorer 6 SP1<br />
　prototype 1.3.1</p>

<p>■ライセンス<br />
ライセンスはGPL。<br />
XMLHttpRequestのラッピング方法については、<br />
<a href="http://la.ma.la/blog/diary_200509031529.htm">最速インターフェース研究会の XMLHttpRequest for IE</a> を参考にさせていただいた（こちらもGPL）。</p>

<p>■ 特徴<br />
・XMLHttpRequest(あるいはMicrosoftのXMLHTTP) オブジェクトのラッパー。<br />
　XMLHttpRequestと同じプロパティ/メソッドを持つ。<br />
・一度GETしたWebコンテンツをキャッシュする。<br />
・再度GETする際には、If-Modified-Since ヘッダを付与する。<br />
　Webサーバ側から304 Not Modified が返る場合には、キャッシュしたデータをresponseText, responseXMLにセットする。<br />
・キャッシュのアルゴリズムはデフォルトでLRUを採用（FIFOも使用可能）<br />
・<a href="http://prototype.conio.net/">prototype.js</a> の後にインクルードするだけで、<a href="http://prototype.conio.net/">prototype.js</a>のAjax.Request()にキャッシュ機能が付加されるようになる。</p>

<p>■注意点 、Tipsなど<br />
<strong>(1) HTTPステータスコードについて</strong><br />
prototype.js では、HTTPステータスコード304はfail扱いになってしまう。そこで、XMLHttpRequestと同じ使い勝手にするため、XMLHttpRequestWithCacheではHTTPステータスコード改変を行っている。<br />
具体的には、実際のHTTPステータスコードが304であり、かつ、対象URLのデータがキャッシュ上に存在する場合、<strong>statusプロパティを200に、statusTextプロパティを'OK'に設定している</strong>。<br />
ただし、HTTPレスポンスヘッダーは改変しないので、この点については注意が必要。</p>

<p><b>(2) デフォルト If-Modified-Since</b><br />
初回のアクセス（キャッシュがない場合のアクセス）では、If-Modified-Sinceに「01 Jan 1970 00:00:00 GMT」がセットされる。<br />
ただし、If-Modified-Since は XMLHttpRequestWithCache呼出し側のプログラムにて、setRequestHeader()を用いて上書きできる。</p>

<p><b>(3) キャッシュの操作</b><br />
ブラウザのアドレスバーに以下のように入力することで、キャッシュを操作することが可能（もちろん、Javascriptコード内でも可能）<br />
　・キャッシュの中身を見る（注意：キャッシュに大量のデータが入っている時にはブラウザが不安定になるかもしれません。）<br />
　　javascript:alert(XMLHttpRequestWithCache.cache)</p>

<p>　・キャッシュのサイズの変更（デフォルトは100コンテンツ）<br />
　　javascript:alert(XMLHttpRequestWithCache.resizeCache(20))</p>

<p>　・キャッシュアルゴリズムをFIFOにする。<br />
　　javascript:alert(XMLHttpRequestWithCache.cacheAlgorithm('FIFO'))</p>]]>

</content>
</entry>
<entry>
<title>[RNA] windows+IISで不具合報告</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000393.html" />
<modified>2005-10-01T07:03:03Z</modified>
<issued>2005-10-01T06:45:22Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.393</id>
<created>2005-10-01T06:45:22Z</created>
<summary type="text/plain">掲示板にて、「IIS6.0でRNAが動かない」とのこと。
類似環境で稼動させてい...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p><a href="http://glucose.jp/Zch/">掲示板</a>にて、「IIS6.0でRNAが動かない」とのこと。<br />
類似環境で稼動させている方がいらっしゃったらアドバイスお願いしたいです。</p>

<p>【RNAバージョン】<br />
2.0b1</p>

<p>【環境】<br />
Windows2003server<br />
IIS 6.0<br />
ActivePerl 5.8.4.810 </p>

<p>【不具合内容】<br />
rna-load.cgi にアクセスすると、下記の内容が表示される。<br />
「The specified CGI application misbehaved by not returning a complete set of HTTP headers.」<br />
IISのログには、ステータスコード以外には、エラーらしきメッセージは無し。<br />
</p>]]>

</content>
</entry>
<entry>
<title>[RNA] HTTPコード301 によるRSS移転に対応</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000391.html" />
<modified>2005-09-18T15:05:32Z</modified>
<issued>2005-09-18T15:01:37Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.391</id>
<created>2005-09-18T15:01:37Z</created>
<summary type="text/plain">（かなり）久しぶりにRNA Nightly版をupdate。話題としては少し古い...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>（かなり）久しぶりに<a href="http://foaf.jp/~msano/rnanightly/">RNA Nightly版</a>をupdate。話題としては少し古いが、HTTPステータス「301 Moved Permanently」への対応。</p>

<p>【内容】<br />
SiteListに登録されたRSSをGETする際、レスポンスが「301 Moved Permanently」であった場合には、SiteListに登録されたURLを書き換えるようにした。</p>

<p>【効果】<br />
ブログなどのサイト運営者側がRSSの移転(＝URLの変更)を行う際に、「301」で新URLにリダイレクトしていれば、RNA側が自動的にSiteListを新URLに書き換える。これにより、ユーザーが意図することなくSiteListの更新が行われ、（RSS業界ではよく問題になる）無駄なトラフィックおよびWebサーバー負荷が抑えられ、旧環境を早期に撤去（ホスティング費や運営費の問題に貢献）することができる。</p>

<p>背景と実装方法について以下にメモ。</p>]]>
<![CDATA[<p>【背景】<br />
RSS移転時の措置についての議論より。<br />
・<a href="http://hail2u.net/blog/rss/bloglines_and_301_moved_permanently.html">「BloglinesのForumをタラタラと　・・・　フィードのURLを変更した時に301 Moved Permanently(301とは書いてないけど多分)でリダイレクトしてやると、自動的に新しいURLに変更される」</a><br />
・<a href="http://blog.bulknews.net/mt/archives/001608.html">「Bloglines では、301 の場合データベースの URL も変更。以降は新しい URL のみにアクセスします。302 の場合、データベースは更新せず、古いほうに継続してアクセスします」</a><br />
・<a href="http://www.hyuki.com/d/200506.html#i20050609170029">「301 Moved Permanentlyを出すようにすれば、一部のRSSリーダでは自動的に購読を切り替えてくれる」</a><br />
・<a href="http://www.otsune.com/diary/2005/06/09/6.html#200506096">「古いRSSへのアクセスに301を返しているのだけど、自動的に移転処理をしてくれないRSSリーダーが結構ある」<br />
</a></p>

<p>【実装方法】<br />
RNAでは、RSSの取得に<a href="http://homepage3.nifty.com/hippo2000/perltips/LWP/UserAgent.html">LWP::UserAgent</a>を使用している。LWP::UserAgentのrequest()では、「301」や「302」が返されると自動的にリダイレクトの処理をしてくれる。</p>

<p>LWP::UserAgent使用時に、「301」リダイレクト元を取得する方法としては次の２つが考えられる。<br />
a) リクエストには<a href="http://homepage3.nifty.com/hippo2000/perltips/LWP/UserAgent.html">simple_request()</a>を使用し、1回ずつレスポンスを見て適切な処理（リダイレクト処理、SiteList更新、その他）を行う。<br />
b) リクエストにはrequest()を使用する。得られたレスポンスから、HTTP::Responseモジュールのprevious()メソッドでレスポンスチェーンをさかのぼり、コードが「301」のレスポンスがある場合にSiteList更新を行う。</p>

<p>RNAでは、既存プログラムでrequest()を使用しているため、b)を採用。<br />
初回のレスポンスが301の場合に、連続した301レスポンスの最後のLocationヘッダに記述されたURLを、真のURLとしてSiteListに登録している。</p>

<p>request() や previous()の動きは以下のようなプログラムを用いて簡単に検証することが出来る。</p>

<p>===================================<br />
プログラムソース</p>

<p>[http://example/301_1.cgi]<br />
-----------------------------------------------<br />
#!/usr/bin/perl</p>

<p>print "Status: 301 Moved Permanently\n";<br />
print "Location: http://example/301_2.cgi\n\n";<br />
-----------------------------------------------</p>

<p>[http://example/301_2.cgi]<br />
-----------------------------------------------<br />
#!/usr/bin/perl</p>

<p>print "Status: 301 Moved Permanently\n";<br />
print "Location: http://example/302_1.cgi\n\n";<br />
-----------------------------------------------</p>

<p>[http://example/302_1.cgi] <br />
-----------------------------------------------<br />
#!/usr/bin/perl</p>

<p>print "Location: http://example/index.html\n\n";<br />
-----------------------------------------------</p>

<p>[301test.pl]<br />
-----------------------------------------------<br />
#!/usr/bin/perl</p>

<p>use LWP::UserAgent;</p>

<p>my $uri = 'http://example/301_1.cgi';</p>

<p>my $req = HTTP::Request->new(GET => $uri);<br />
my $ua = LWP::UserAgent->new;<br />
$ua->parse_head(0);<br />
my $res = $ua->request($req);</p>

<p>my @a = ();<br />
while ($res) {<br />
    unshift(@a, $res);<br />
    $res = $res->previous();<br />
}</p>

<p>print "Response chain:\n";<br />
foreach my $r (@a) {<br />
    print "$uri\n";</p>

<p>    if($r->code == 301) {<br />
        $uri = $r->header('Location');<br />
    }<br />
    else {<br />
        last;<br />
    }<br />
}</p>

<p>print "\nTrue Location: $uri\n";<br />
-----------------------------------------------</p>

<p>===================================<br />
実行例</p>

<p>$ perl ./301test.pl<br />
Response chain:<br />
http://example/301_1.cgi<br />
http://example/301_2.cgi<br />
http://example/302_1.cgi</p>

<p>True Location: http://example/302_1.cgi<br />
===================================</p>

<p><br />
【余談】<br />
<a href="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>では、Locationヘッダに記述されるのは absoluteURI とある。しかし、UserAgent.pmを見ると「Some servers erroneously return a relative URL for redirects」ということもあるらしい。<br />
</p>]]>
</content>
</entry>
<entry>
<title>[Ajax tips] XMLHttpRequest と If-Modified-Since</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000386.html" />
<modified>2005-11-21T17:06:48Z</modified>
<issued>2005-04-07T14:09:04Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.386</id>
<created>2005-04-07T14:09:04Z</created>
<summary type="text/plain">RSSリーダーについてさんざん言及されたように、Webコンテンツを取得するアプリ...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>javascript</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p><a href="http://www.google.co.jp/search?q=RSS%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC+If-Modified-Since&start=0&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ja-JP:official">RSSリーダーについてさんざん言及されたように</a>、Webコンテンツを取得するアプリケーションでは、 HTTPリクエストに <a href="http://www.studyinghttp.net/header#If-Modified-Since">If-Modified-Since ヘッダ</a> をつけるなどして対象コンテンツの更新時刻をチェックし、過剰なデータ取得を避けるのがマナーであるとされている。</p>

<p>同じことがAjaxについても当てはまると考える。Ajaxでは、ユーザーのアクションと非同期にHTTPリクエストを行うため、RSSリーダーと同様に人為操作を超えるトラフィックを発せさせる可能性があるからだ。</p>

<p>そこで、素朴な疑問。<br />
　・ブラウザは、ユーザーが意識しないでも更新時刻チェックをやってくれる。<br />
　・Ajaxの主なエンジンとなる Javascript は、ブラウザに組み込まれたものである。<br />
　・Javascript の XMLHttpRequestを使用すると、プログラマが明示的にコーディングしなくても、更新時刻チェックを実行してくれるのではないか。</p>

<p>というわけで、簡単な実験をしてみた。概要は次のとおり。<br />
　1) XMLHttpRequestで適当なWebページを数回GET<br />
　2) Webサーバのログをみて、更新時刻チェックしているかチェック<br />
なお、対象Webページは、「ブラウザで以前アクセスしたことがあるが、最終更新日時以降はアクセスしていない」状態である。<br />
また、テスト内容は完全なものではなく、あらゆる環境および状況で同様の結果が得られることを保証するものではないのであしからず。</p>

<p>以下、詳細と結果。<br />
まず、次のようなテスト用Webページを設置。<br />
index.htmlというHTMLファイル（なんでもいい）を、XMLHttpRequestでGETするだけのJavascriptスクリプトだ。<br />
------------------------------------------------------------------------------<br />
＜html＞<br />
＜head＞<br />
＜script type="text/javascript"＞<br />
function testfunc() {<br />
　var xmlhttp = false;<br />
　if (typeof XMLHttpRequest!='undefined')<br />
　　xmlhttp = new XMLHttpRequest();<br />
　else<br />
　　xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");</p>

<p>　xmlhttp.open("GET", 'index.html', false);<br />
　xmlhttp.send(null);</p>

<p>　document.getElementById("r").innerHTML=xmlhttp.getAllResponseHeaders();<br />
　document.getElementById("c").innerHTML=xmlhttp.responseText;<br />
}<br />
＜/script＞<br />
＜title＞ajax If-Modified-Since test＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜button onclick="testfunc()"＞click!＜/button＞<br />
＜hr /＞<br />
＜pre id="r"＞＜/pre＞<br />
＜hr /＞<br />
＜div id="c"＞＜/div＞<br />
＜/body＞<br />
＜/html＞<br />
------------------------------------------------------------------------------</p>

<p>このWebページのボタンを数回クリックして、Webサーバーのログを見たところ、次の結果となった。<br />
【結果１：If-Modified-Since未コーディング】<br />
・firefox1.0.2の場合<br />
　1回目のアクセス→ステータスコード200でGET<br />
　2回目以降のアクセス→ステータスコード200でGET<br />
・IE6 SP1の場合<br />
　1回目のアクセス→ロギングされない<br />
　2回目以降のアクセス→ロギングされない</p>

<p>firefoxでは、<strong>更新時刻チェックを行ってくれない</strong>ようだ。<br />
IEでは、なぜか<strong>Webサーバにアクセスしていない</strong>ようだ。しかし、XMLHttpRequest.responseTextには値が入っている。ブラウザのローカルキャッシュをそのまま入れているように見受けられる。ブラウザのローカルキャッシュ（インターネット一時ファイル）をいったん削除して、再度テストを行うと、1回目だけは200でGETしてくるが、2回目以降はやはりWebサーバにアクセスしない。ここまではいいが、Webページを編集して更新時刻を変更してから再度テストしても、<strong>Webサーバにアクセスせずにローカルのキャッシュを取得し続けてしまう</strong>。テストの仕方が悪いのだろうか。この動きはAjaxアプリケーション作成時にやっかいだ。</p>

<p>そこで、こんどは明示的にIf-Modified-Sinceによる更新時刻処理をコーディングしてみた。Webページのスクリプト部分を次のように変更して、再度テストを実施。<br />
（ロジックはきれいじゃないが。。。）<br />
------------------------------------------------------------------------------<br />
＜script type="text/javascript"＞<br />
var last_modified  = null;   /*← この行を追加*/<br />
var cached_content = '';   /*← この行を追加*/<br />
function testfunc() {<br />
　var xmlhttp = false;<br />
　if (typeof XMLHttpRequest!='undefined')<br />
　　xmlhttp = new XMLHttpRequest();<br />
　else<br />
　　xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");</p>

<p>　xmlhttp.open("GET", 'index.html', false);<br />
　if(last_modified)    /*← この行を追加*/<br />
　　xmlhttp.setRequestHeader("If-Modified-Since", last_modified);   /*← この行を追加*/<br />
　xmlhttp.send(null);</p>

<p>　document.getElementById("r").innerHTML=xmlhttp.getAllResponseHeaders();<br />
　document.getElementById("c").innerHTML=xmlhttp.responseText;<br />
　if(xmlhttp.getAllResponseHeaders().match("Last-Modified"))   /*← この行を追加*/<br />
　　last_modified = xmlhttp.getResponseHeader("Last-Modified");   /*← この行を追加*/<br />
　if(xmlhttp.responseText.length == 0)   /*← この行を追加*/<br />
　　document.getElementById("c").innerHTML = cached_content;   /*← この行を追加*/<br />
　else   /*← この行を追加*/<br />
　　cached_content = xmlhttp.responseText;   /*← この行を追加*/<br />
}<br />
＜/script＞<br />
------------------------------------------------------------------------------<br />
結果は、次のとおり。<br />
【結果２：If-Modified-Sinceチェックを明示的にコーディング】<br />
・firefox1.0.2の場合<br />
　1回目のアクセス→ステータスコード200でGET<br />
　2回目以降のアクセス→ステータスコード304でGET<br />
・IE6 SP1の場合<br />
　1回目のアクセス→ロギングされない<br />
　2回目のアクセス→ステータスコード200でGET<br />
　3回目以降のアクセス→ステータスコード304でGET</p>

<p>firefoxでは、それなりの動きになった。<br />
IEでは、firefoxよりワンテンポ遅れたような動きになっている。1回目のアクセスではやはりローカルキャッシュを見ているのだろう。<br />
結果１と結果２から総合すると、IE6SP1の動きは、「If-Modified-Sinceを付加しない場合、たとえWebページが更新されていても、何度アクセスしてもローカルキャッシュを見に行く。」ように見える。</p>

<p>最後に、スクリプトの「var last_modified  = null;」の部分を「var last_modified  = "Thu, 01 Jun 1970 00:00:00 GMT";」と変更して再度テストを試みた。<br />
結果は、次のとおり。<br />
【結果３：1回目からIf-Modified-Sinceをつける】<br />
・IE6 SP1の場合<br />
　1回目のアクセス→ステータスコード200でGET<br />
　2回目以降のアクセス→ステータスコード304でGET</p>

<p>上記のとおり、firefoxと同じ動きになった。</p>

<p><br />
結論としては、<br />
「ブラウザ（Javascript）に任せず、If-Modified-Sinceの処理は自分で明示的にコーディングすべし」<br />
となる（当たり前？）。</p>

<p>追記：<a href="http://www.semblog.org/msano/archives/000407.html">If-Modified-Sinceを使用してキャッシュを行うXMLHttpRequestラッパーを書いてみた。</a></p>

<p><br />
<u>補遺</u><br />
Ajaxアプリケーション作成の際、結果３の方法は十分ではない。それは、結果２においてfirefoxを「それなりの動き」と表現した理由でもある。<br />
上記のスクリプトでは、単純なHTTPリクエストのほかに次のことを実施している。<br />
　1) Last-Modified情報の保存（次にIf-Modified-Sinceに利用するため）<br />
　2) Webページの内容のキャッシュ<br />
これに加えて、本来は、<br />
　3) 1)と2)で保存した内容の永続化（ブラウザを再起動しても前回の内容が保存されている）<br />
が必要だ。<br />
上記のスクリプトでは、3) ができていないので、「ブラウザをリロードしたらJavascriptが再スタートし、保存しておいたLast-Modified情報がリセットされてしまう」問題を抱えている。この問題を解決するには、次の２つが必要だ。<br />
　i) Javascriptからブラウザのローカルキャッシュ情報（Last-Modifiedなど）にアクセスできること<br />
　ii) XMLHttpRequestでWebコンテンツを取得した場合でも、ブラウザのローカルキャッシュに追加されること<br />
この面については、IEの動きはある意味firefoxより優れている気がする。しかし、<strong>対象Webページが更新されていてもIf-Modified-Sinceをつけないかぎりローカルキャッシュを常に見る</strong>という動きはなんとかしてほしいところだ。</p>

<p>Ajaxアプリケーションが普及するためには、以上のような処理を、プログラマが意識することなくブラウザ（Javascriptインタプリタ）が調整してくれることが望ましい。何かやり方があるのだろうか。<br />
</p>]]>

</content>
</entry>
<entry>
<title>RSSにどこまで書くか</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000385.html" />
<modified>2005-04-05T16:29:17Z</modified>
<issued>2005-04-05T14:47:04Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.385</id>
<created>2005-04-05T14:47:04Z</created>
<summary type="text/plain">RSS(Atom)にサマリーのみ書くか全文まで書くかという議論はずっと昔からある...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>RSS(Atom)にサマリーのみ書くか全文まで書くかという議論はずっと昔からあるような気がする。</p>

<p>RSS(Atom)を利用する代表的な目的はWeb情報チェックの効率化だけど、それは次のように分解できる。<br />
　a) 「更新チェック」を効率化したい人<br />
　　　更新があったら対象Webページを直接見に行く人。<br />
　　　この人にとってはRSSはtitleとlinkとdateだけで事足りるのではないだろうか。<br />
　　　glucoseなど、Webサイトを直接ブラウズできるリーダーを使うとよい。<br />
　b) 「内容をチェックするどうかの判断」も効率化したい人<br />
　　　この人に必要なのはtitleとサマリー（＜description＞や＜summary＞）だ。<br />
　　　サマリーをざっとみてさらに詳しく見たければ直接Webページをブラウズする。<br />
　　　重要な点は、まともなサマリーがちゃんと書かれているかということ。<br />
　　　先頭n文字で切っているだけの＜description＞はサマリーとはいえないと思う（文章のうまい人は先頭n文字が要約になるような書き方をするのかもしれないけど）。　　　<br />
　c) 「内容チェック」までも効率化したい人<br />
　　　この人にとってはRSSに全文が含まれていることが望ましい。<br />
　　　サマリーでも代替になるだろうが、内容を取得元Webサイトに確認しにいく必要の無いほどの、秀逸なサマリーが常に配信されている必要がある。</p>

<p>RSSにどこまで書くかという話は、RSS利用者側が何を必要としているかという問題になる。同じ人でも、スポーツニュースはサマリーでよいが、政治ニュースは詳細を知りたいかもしれない。</p>

<p>たとえば、次のように詳細度の異なるRSS(Atom)フィードを3種類おいておく方法が考えられる。<br />
　1) title, link, date のみのフィード<br />
　2) 1) に加えて記事のサマリーが記載されているフィード<br />
　3) 2) に加えて記事の全文が記載されているフィード<br />
RSS利用者側が自分のライフスタイルに合わせて利用するフィードを選べば、帯域消費緩和にもつながるかもしれないし、RSS提供側も悩まなくてすむ。<br />
本当に3つファイルを作成したら今度はストレージの消費が問題になるというなら、実体のファイルは1つにしてWebサーバーのプラグインなどで複数バリエーションのフィード配信を実現すればよい。リーダーから見えるRSSが同じであれば使い勝手は変わらない。ただし、Webサーバーの負荷は逆に高まってしまうことになる。アプローチとしては、<a href="http://www.google.co.jp/search?q=VFZ&start=0&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ja-JP:official">VFZ</a>（今の<a href="http://www.google.co.jp/search?q=PixeLlive&start=0&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ja-JP:official">PixelLive</a>）に似ていると思う。VFZは、色深度という観点で画像データを分解して再結合した形式で、利用者のニーズに応じて特定の色深度レベルのデータのみ配信することができる。また、そのようなデータの再構成により、結果的に(おそらくbitmapと比較して)データサイズが小さくなっている。RSSなどのテキスト系メタデータの分野でもそのようなことができないだろうか。サイズが減るという現象は(gzipなどの圧縮の適用を除いて)考えにくいが、自然言語文章から意味の要約を抽出する優秀なアルゴリズムがあれば要約のためにストレージを消費する必要は無くなるかもしれない。</p>]]>

</content>
</entry>
<entry>
<title>RNA nightly build 050405</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000384.html" />
<modified>2005-04-05T14:33:04Z</modified>
<issued>2005-04-05T14:31:54Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.384</id>
<created>2005-04-05T14:31:54Z</created>
<summary type="text/plain">以下の条件で文字化けが発生するケースについて修正。

条件 : perl 5.8...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>以下の条件で文字化けが発生するケースについて修正。</p>

<p>条件 : perl 5.8.x 使用時<br />
対象 : UTF-8以外の文字コードを使用しているRSS<br />
修正方法：<br />
　<a href="http://foaf.jp/~msano/rnanightly/">nightly build</a>では修正済み。<br />
　ver2.0b1の場合の修正方法は次のとおり。<br />
　(1) lib/RNA.pm（522行目あたり）を次のように編集する。<br />
　　　[修正前]<br />
　　　$new_cache_data->{$uri} = {content=>\$str,</p>

<p>　　　[修正後（1行増えています）]<br />
　　　my $cachestr = $str;<br />
　　　$new_cache_data->{$uri} = {content=>\$cachestr,</p>

<p>　(2) cache/site/ ディレクトリの中のファイルをすべて消す。</p>

<p><br />
</p>]]>

</content>
</entry>
<entry>
<title>気づいたこと</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000382.html" />
<modified>2005-03-24T17:41:33Z</modified>
<issued>2005-03-24T17:37:27Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.382</id>
<created>2005-03-24T17:37:27Z</created>
<summary type="text/plain">「情報考学」のトップページにおいて、記事のpost date が全て 23:59...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>Life</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p><a href="http://www.ringolab.com/note/daiya/">「情報考学」のトップページ</a>において、記事のpost date が全て 23:59 であることに気づく。偶然？</p>]]>

</content>
</entry>
<entry>
<title>RNA: 想定未来の集約抑止</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000381.html" />
<modified>2005-03-24T17:25:35Z</modified>
<issued>2005-03-24T17:20:29Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.381</id>
<created>2005-03-24T17:20:29Z</created>
<summary type="text/plain">RNA nightly版をupdate。
RNAサポート掲示板に報告された、「未...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p><a href="http://foaf.jp/~msano/rnanightly/">RNA nightly版</a>をupdate。<br />
<a href="http://glucose.jp/Zch/index_html">RNAサポート掲示板</a>に報告された、「未来日投稿を載せない仕様になったrnanightly版でも、サイトリストの更新日では未来日が載ってしまう」という現象に対する機能追加。<br />
lib/RNA/Config.pm にて、「my $allow_future_entries = 0;」とすると、次の２つのことを行うようにした。<br />
  1) 未来日付を持つ<item>を削除する。（従来からある機能）<br />
  2) channel/dc:date が未来日付を持っている場合、1) で削除されずに残った<item>のうち、最新のitem/dc:date で channel/dc:date を上書きする。</p>

<p>「my $allow_future_entries = 0;」の設定はデフォルトにした方がよいかもしれない。</p>]]>

</content>
</entry>
<entry>
<title>XML-RPCのJavascript実装</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000380.html" />
<modified>2005-03-07T16:46:37Z</modified>
<issued>2005-03-07T16:13:13Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.380</id>
<created>2005-03-07T16:13:13Z</created>
<summary type="text/plain">最近ajaxというアーキテクチャがはやっている。
それはそれはやたらはやっている...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>javascript</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>最近<a href="http://www.google.co.jp/search?q=ajax&start=0&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ja-JP:official">ajax</a>というアーキテクチャがはやっている。<br />
それはそれはやたらはやっている。</p>

<p>ajaxの肝の一つに、クライアント（ブラウザ）とサーバーの非同期通信というのがある。そうなると、通信プロトコルをどうするか、といった話が盛り上がってもよさそうだ。（独自路線をつっぱしる人はそれはそれでよいと思う。なんせ、XMLHttpRequestオブジェクトは、ブラウザによっては<a href="http://www.google.co.jp/search?q=xmlhttprequest+%E7%B5%B6%E5%AF%BE&start=0&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ja-JP:official">自分自身のサーバーとしか通信できない</a>らしいから）。</p>

<p>で、ここ数年のblogの盛り上がりから、やっぱり、まず検討すべきは <a href="http://lowlife.jp/yasusii/stories/9.html">XML-RPC</a> だと考えている。<br />
そこで、誰かライブラリ（XML-RPCのjavascript実装）を作っていないか探してみた。<a href="http://www.google.co.jp/search?q=javascript+xml-rpc&start=0&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ja-JP:official">google://javascript+xml-rpc</a><br />
どうも、ぱっとしたのがない。？？<br />
ふと思い立って <a href="http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla%3Aja-JP%3Aofficial&q=javascript+xml-rpc&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=">worldwideでgoogle://javascript+xml-rpc</a><br />
してみたら、、、いろいろでてきた。日本はだいぶおくれているのか？私の探し方が悪いのか？</p>

<p>一通り機能がそろっていて使えそうなのは、次の２つ。<br />
1) <a href="http://www.vcdn.org/Public/XMLRPC/">vcXMLRPC</a><br />
　　ライセンス：GPL<br />
　　Copyright が2000-2002と古い。<br />
　　一つのファイルにまとめられていてコンパクト。<br />
　　IEとfirefoxは大丈夫そう。safariはどうだろう？<br />
　　　　<br />
2) <a href="http://jsolait.net/index.xhtml">JavaScript O Lait</a><br />
 　ライセンス：LGPL<br />
　　Copyrightは 2003-200４で、結構あたらしい<br />
　　８つのライブラリファイルに分かれている。（XML-RPCを使いたければ、xmlrpc.js, xml.js, urllib.js が必要。）<br />
　　中身をさらっと見た感じでは、どのブラウザでも使えるようにつくってある気はする。（実際につかってないので、なんともいえない。）</p>

<p>vcXMLRPC をちょっと加工して使ってみようかな。<br />
JavaScript O Lait は品質が高そうなんだけど、ちょっと大掛かりなので。</p>

<p>ところで、<a href="http://www.json-rpc.org/">JSON</a>ってなんなんだろう。。。</p>]]>

</content>
</entry>
<entry>
<title>RNA nightly への最近のupdate</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000377.html" />
<modified>2005-02-23T14:18:12Z</modified>
<issued>2005-02-23T13:51:54Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.377</id>
<created>2005-02-23T13:51:54Z</created>
<summary type="text/plain">RNA nightly 

 1) カテゴリごとのページを作成できるようにした。...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p><a href="http://foaf.jp/~msano/rnanightly/">RNA nightly</a> </p>

<p> 1) カテゴリごとのページを作成できるようにした。<br />
 2) del.icio.us にPost、del.icio.us からclipにimportできるようにした。</p>

<p>とくに、1) は、イントラblogでの利用に重要な意味を持つと思われる。<br />
blogにおけるカテゴリ運用の形態として、<br />
  a) blogは1つ。カテゴリは複数<br />
  b) カテゴリごとにblogを設置<br />
があると考えられる。2つを比べるとa) の方が面倒さが少なく柔軟といえる（ b) だとカテゴリが増えるたびにいろいろ作業が発生する）。<br />
a) の場合、一つのサイトに複数のトピックが並進することになる。あるトピックに着目すると、比較的近いキョリ（物理的な距離だけではない。同じチームに属するとか）にいる複数の人が同じトピック（カテゴリ）について語っているという状況が発生しうる。その場合、RNAは人に対して横断的に１つのカテゴリを追うための「ビュー」を提供することができる。<br />
個人的には結構おもしろいと思う。</p>

<p><br />
あとやりたいことは、<br />
  ・未読既読管理とRSS配布<br />
  ・autoClipモード</p>

<p>どちらも、チェックボックスなどで on/offを切り替えられるようにしたい。 onのときは、URLをクリックしただけでclipされるとか。ブラウザ側で（つまり、javascriptで）切り替えられるのが理想。<br />
</p>]]>

</content>
</entry>
<entry>
<title>RNA nightly 説明書</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000374.html" />
<modified>2005-02-23T13:50:30Z</modified>
<issued>2005-02-23T13:48:18Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.374</id>
<created>2005-02-23T13:48:18Z</created>
<summary type="text/plain">RNA説明書（nightly版）を作成した。
その名のとおり、RNAnightl...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p><a href="http://www.semblog.org/wiki/index.cgi?RNA%c0%e2%cc%c0%bd%f1%28nightly%c8%c7%29">RNA説明書（nightly版）</a>を作成した。<br />
その名のとおり、<a href="http://foaf.jp/~msano/rnanightly/">RNAnightly版</a>用の説明書。<br />
特に、要望の多かったテンプレートタグについての説明を追加。</p>]]>

</content>
</entry>
<entry>
<title>javascript の XMLHttpRequest</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000376.html" />
<modified>2005-02-23T13:41:22Z</modified>
<issued>2005-02-23T13:08:32Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.376</id>
<created>2005-02-23T13:08:32Z</created>
<summary type="text/plain">http://www.scss.com.au/family/andrew/web...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>javascript</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p><a href="http://www.scss.com.au/family/andrew/webdesign/xmlhttprequest/">http://www.scss.com.au/family/andrew/webdesign/xmlhttprequest/</a></p>

<p>javascript で、サーバーと通信できるプログラム。<br />
しかも、Cross-Browser。</p>

<p>これをRNAのテンプレートに入れていろいろやってみたいが、ライセンスが <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/">「帰属、非営利、同一条件許諾」</a>なので、デフォルトテンプレートに入れるにはちょっと制限がきつい気がする。 <br />
</p>]]>

</content>
</entry>
<entry>
<title>テスト</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000375.html" />
<modified>2005-02-20T13:13:30Z</modified>
<issued>2005-02-20T13:13:02Z</issued>
<id>tag:www.semblog.org,2005:/msano//4.375</id>
<created>2005-02-20T13:13:02Z</created>
<summary type="text/plain">msano復活の布石...</summary>
<author>
<name>i2k</name>
<url>http://www.semblog.org/</url>
<email>i2k@semblog.org</email>
</author>
<dc:subject>Life</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>msano復活の布石</p>]]>

</content>
</entry>
<entry>
<title>test</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000369.html" />
<modified>2004-11-04T16:13:25Z</modified>
<issued>2004-11-04T16:13:09Z</issued>
<id>tag:www.semblog.org,2004:/msano//4.369</id>
<created>2004-11-04T16:13:09Z</created>
<summary type="text/plain">test 書き込み...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>semblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>test 書き込み</p>]]>

</content>
</entry>
<entry>
<title>導入事例 - PIXUS 80i + Planex PLANEX GW-BH03U + 自作PC（WinXP SP1）</title>
<link rel="alternate" type="text/html" href="http://www.semblog.org/msano/archives/000293.html" />
<modified>2004-11-04T16:14:04Z</modified>
<issued>2004-03-19T16:56:35Z</issued>
<id>tag:www.semblog.org,2004:/msano//4.293</id>
<created>2004-03-19T16:56:35Z</created>
<summary type="text/plain">先週の日曜日に手に入れた PIXUS 80i  の Bluetooth 印刷用セ...</summary>
<author>
<name>msano</name>

<email>msano@semblog.org</email>
</author>
<dc:subject>etc</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.semblog.org/msano/">
<![CDATA[<p>先週の日曜日に手に入れた <a href="http://cweb.canon.jp/bj/lineup/80i/index.html">PIXUS 80i </a> の Bluetooth 印刷用セットアップをようやく終えた。</p>

<p>パンフレットを見ると、Bluetooth 印刷は<a href="http://cweb.canon.jp/e-support/qasearch/answer/bubblejetprinters/q035403458804.html">限られた機種</a> でしか使えないようなことが書かれてあった。<br />
Bluetooth は使ったことが無くてよくわからないが、どうしても使いたいし使えるだろうと思い、買ってみることに。でも根が軟弱なので、ビックカメラ（秋葉とかでないあたりも軟弱か）の店員さんに聞き込み。前提条件や考慮事項を聞いていると、３人目の方から「（Canonも私も保障しないけど、）普通のBluetoothアダプタとWindows XP の組み合わせならいける<b>はず</b>。」というありがたいお答えをいただく。安心は得たので、 PIXUS 80i と Bluetooth ユニットと、<a href="http://www.planex.co.jp/product/bwave/gwbh03u.shtml">PLANEX GW-BH03U</a> を購入。</p>

<p>予想通りうまくいった。</p>

<p>せっかくなので、導入事例として setup log を記しておく。</p>]]>
<![CDATA[<p>■ PCについて</p>

<p>自作PC<br />
Pentium4 1.6GHz<br />
SDRAM 512MB<br />
Windows XP SP1</p>

<p>CD-ROMドライブを「G:」とする</p>

<p><br />
■ 使用した機器</p>

<p>プリンタ  ：PIXUS 80i<br />
プリンタ側 Bluetoothユニット：BU-10<br />
PC側 Bluetoothデバイス：PLANEX GW-BH03U  </p>

<p><br />
■ PIXUS 80i の導入</p>

<p>・マニュアルにしたがって、インクなどを装着<br />
・付属CD-ROMのマニュアル<br />
  （G:\MANUAL\manual\Japanese\Windows\Bluetooth\1.0\top.htm）<br />
  にしたがって、Bluetooth ユニットを装着<br />
・電源を入れる<br />
・PCと PIXUS 80i を USBケーブル（BU-10に付属）で接続する<br />
・インストーラ（G:\MSETUP.EXE）を起動し、「電子マニュアル」「プリンタドライバ」「PIXUS 80i Setup Utility」をインストール（電子マニュアルは必須ではない）<br />
・テストページを印刷できることを確認する。</p>

<p><br />
■ PLANEX GW-BH03Uの導入</p>

<p>・GW-BH03U をPCのUSBポートに装着<br />
・GW-BH03Uのマニュアル通りに、ユーティリティとドライバを導入</p>

<p><br />
■ PIXUS 80i Bluetooth の設定</p>

<p>・USBケーブルを抜く<br />
・タスクトレイにあるBluetoothマークを右クリックして、<br />
  「My Bluetooth Place を展開」を選択<br />
・ウィンドウの左側にある、「範囲内のデバイスの検索」をクリック<br />
・しばらくすると、「Canon 80i．．．」といった名前のアイコンが出現するので、<br />
  ダブルクリック。<br />
  プリンタをインストールするかどうか聞かれるので、「O.K.」を選択<br />
・「Canon PIXUS 80i (Copy 2)」といったプリンタが追加されるので、「Canon PIXUS 80i (Bluetooth)」などのわかりやすい名前に変えておく<br />
・ここまでで、Bluetooth から印刷できるようになっているはず。</p>

<p><br />
■ アクセス制御（GW-BH03U）</p>

<p>・タスクトレイの「Bluetooth」アイコンを右クリック → 「詳細設定」→<br />
  「アクセス性」タブで、「ほかのBluetoothデバイスから・・・」のチェックをはずす</p>

<p>■ アクセス制御（PIXUS 80i）</p>

<p>・USBケーブルを装着し、<br />
  「スタート」メニューから 「PIXUS 80i Setup Utility」を起動<br />
・Bluetooth設定を「変更」<br />
・「アクセスを拒否する」にチェック<br />
   （これにより検索はできなくなるが、印刷はできる）<br />
</p>]]>
</content>
</entry>

</feed>