[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今月のSkypeギフトデーは1日・・・・
逃しました。
さて、
イントラブログを立ち上げたりすると、更新通知のために社内にもpingサーバーが欲しくなりますね。
それじゃぁ、ってことでColdFusionでpingサーバーを作ってみました。
対象とするブログをMovableTypeと決め打ちできて、お気楽にはじめられるのはイントラならではですね。
そもそもブログのpingのしくみさえよく知らなかったわけですが、基本的にはMovableTypeで更新があったとき、指定されたアドレスに対してMovableTypeが何かしてるわけです。
ってことで、まずはどんなリクエストがMovableTypeから送られているかを調べてみます。
#GetHttpRequestData( )# (→LiveDocs) この関数がキモです。
関数の説明には
「HTTP リクエストヘッダおよび本文を CFML ページで使用できるようにします。HTTP ヘッダ内で送信される SOAP リクエストデータを取り込む際に便利です。」
とあります。SORPはともかく、こいつでHTTPリクエストヘッダを調べれば、何がMovableTypeから送られているか解るはずです。
ところが・・・・・
MovalbeTypeが出したリクエストをどうやって「見る」かが問題です。
ブラウザにアドレスをping先のアドレスをぶち込んでも意味がありません。
で、ひらめきました。
内容をCFMAILしちゃうわけですよ。
こんな感じのソースで。
========= ping.cfm(←MovableTypeに指定するping先URL) ==========
<cfprocessingdirective pageencoding="utf-8">
<cfset x = GetHttpRequestData()>
<cfmail subject="pingの内容だよ" to="oreore@kaisha.com" from="pingserver">
<cfdump var="#x#">
</cfmail>
==============================================================
このアドレスにpingが送られると、GetHttpRequestData の内容がメールで見えるはずです。
きたきた。メールが来ましたよ。
さて、届いたメールの内容は・・・・・
struct | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
content | <?xml version="1.0"?> <methodCall> <methodName>weblogUpdates.ping</methodName> <params> <param><value>MovableTYPE縺」縺ヲ縺ゥ縺?繧茨シ。ゥ</value></param> <param><value>http://kenw05/blog/yasmemo/</value></param> </params> </methodCall> | ||||||||||||||
headers |
|
||||||||||||||
method | POST | ||||||||||||||
protocol | HTTP/1.1 |
こんなんでした。
つづく・・・・・
あとはどう見せるかという、プログラマが苦手なデザインセンス部分が問題になります。
とりあえず現状のままだと記事のhtmlタグもついてきてしまうので、タグを取らないことには画像なんかも入ってくるので厄介です。
ColdFusionにはタグストリップ関数みたいなのはありません。
で、どうするかというと、文字を置き換えてくれるReplace関数(→LiveDocs )というやつを使います。タグの部分を""に置き換えて取っちゃうわけですね。
普通のReplace関数だと、置き換えるテキストを完全一致で書かなければいけません。まさか全部のhtmlタグを書くことは出来ないので、
正規表現で置き換えてくれる、REReplace関数(→LiveDocs )を使います。
RE は正規表現(Regular Expression)のREだと思われます。
σ(・・*)ワタシ的には、正規表現、かなり苦手です。多分、正規表現をマスターする数学的な脳がちょっと足りないんだろうと思います。物理的脳はいいセンいってると思うんですがね・・・・
#REReplace(tag_tuki_Text , "<[^>]*>" , "" , "All")#
はい、これでタグストリップ完了です。
tag_tuki_Text はタグ付きテキストが入っている変数です。(そのまんまやん)
< [ ^ > ] * >
こいつが正規表現。顔文字じゃあない。こう書くと、「最初の < から 次の > まで」という意味になる。
それを "" で "All"全部 置き換えちゃってくれ! という事になる。
えーと、
"<[^>]*>" < が出てきて、
"<[^>]*>" > ではない文字が、
"<[^>]*>" 連続して、
"<[^>]*>" > が出てくるまで。
無理矢理訳すとこんな感じかな・・・
ってことで、次回仕上げます。
<cfhttp url="http://blog.toda.co.jp/suzuki/index.xml" result="suzuki" />
といった感じで構造体変数に取り込んだだけでは単なるテキストデータです。
正規表現の達人なら、このテキスト(#suzuki.filecontent#)の中から必要な所だけを抜き出すことができるかもしれませんが、σ(・・*)ワタシ的にはムリなので、ColdFusion様サマなわけです。
<cfset xmlDoc = XmlParse(suzuki.filecontent)>
XmlParse(→LiveDocs ) という関数で、xmlドキュメントオブジェクトに一発変換。
最終更新:#xmlDoc.rss.channel.lastBuildDate.XmlText#
タイトル:#xmlDoc.rss.channel.item[1].title.XmlText#
内容:#xmlDoc.rss.channel.item[1].description.XmlText#
変換すると、上のように構造体変数として参照することができるようになります。
で、このドット表記については、変換したxmlDocをcfdumpするとすぐわかります。このへんがColdFusionの好きなところ。(まぁ、他の言語でもできるんでしょうけど(´∀`)
<cfdump var="#xmlDoc#">
rss2.0の場合、 item が繰り返し出てきます。itemの中を参照するときは、item[1]、item[2]などと配列のように参照できます。
itemがいくつあるのかを知りたいときは、ArrayLen関数(→LiveDocs )で。
#ArrayLen(xmlDoc.rss.channel.item)#
これでitemの個数がわかるので、ループで廻すなりお好きにどうぞ。
ところで、#xmlDoc.rss.channel.item[1].description.XmlText# とすると、MovableTypeのRSSの場合、タグも全部付いてきます。それはそれでありがたかったりしますが、邪魔な場合も。
次回はそのhtmlタグを取る方法でも書きますか。
IISで動いているaspってほとんどShift_JIS環境。
イントラのトップページがそうなのですが、そこに半年ほど前RSSを置きました。新着をDBからゴリゴリとxmlファイルにする感じで、そこにはColdFusionが載っていないので苦手なASPで作りました。
コードはShift_JIS。
UTF-8ベースのColdFusion側でそのxmlを読むときは、
<cfhttp method = "Get" url="http://hon/top/top_r.xml" charset="Shift_JIS" result="XMLFileText"/>
といった感じで、キャラセットを指定してあげればOKで、特別問題なかったのですが、先日「RSSをUTF-8にしてほしい」との要望が。
ASPでUTF-8のファイルってどうやって作るんだ? とすぐ思ったのですが、とりあえず「わかりました」と答えてしまったわけです。
あんまりASPの参考書は持っていないので、とりあえずいろいろググると、
Fsystem.CreateTextFile(File_name,true,true) とすればよさげ。
ふんふん♪とやってみたのですが、
UTF-8ではなく、ただのunicodeみたい♪~( ̄ε ̄;)←違いがわからない男
さらにググる。
おぉ、これか?http://makoto3.cocolog-nifty.com/makoto3/2006/03/asputf8_7348.html
<%@ LANGUAGE=JScript CodePage=65001 %>
なにやら、
<cfprocessingdirective pageencoding="UTF-8">
とおなじかほりが。
・・・・・しかしハズレ。
さらにググる。
( ̄~ ̄;)ウーン・・・・みんなゴリゴリ変換かけてる模様。ちょっとなぁ・・・・
ググるのはやめて、SI屋さんたちにSkypeで聴き回る。(といっても3人ほど)
みんな、「やったことないですねぇ・・・・」と、つれない返事。「ちょっとしらべてみますよ」などと社交辞令的な返事(いやいや、ご好意ですね)。
忘れかけていた頃、メールが一通。
=======================================================
先ほどご連絡あった件ですが、個人的興味からちょっと調べてみました。
ADODB.StreamがサーバでCreateObjectできる事が条件ですが、
こんな感じでいけそうな気がします。
' ADODB.Stream保持用
Dim stream As Object
Set stream = CreateObject("ADODB.Stream")
'ストリームを作成
stream.Open
stream.Type = 2 ' 2 = adTypeText
stream.Charset = "UTF-8"
'文字列を格納
stream.WriteText "こんにちは。小西です。"
' テスト的にファイル書き出し
' ※ 環境、用途によって変更して下さい。
stream.SaveToFile "C:\test.txt", 2 ' 2 = adTypeText
'ストリームの破棄
stream.Close
Set stream = Nothing
以上、独り言でした。
=====================================================
おぉ、コニちゃん。ありがとう。
小さくテストしてみたら、いけそうです。
ゴリゴリ、ゴリゴリ・・・・・
でけた!UTF-8でxmlファイルが書けました。
秀丸で読むと[UTF-8]ってなってます。
ところが、今度はColdFusion側で読んだとき・・・・・
<cfhttp method = "Get" url="http://honw01/top/top_r.xml" charset="UTF-8" result="XMLFileText"/>
<cfset honxmlDoc = XmlParse(XMLFileText.Filecontent)>
とすると、
The web site you are accessing has experienced an unexpected error.
Please contact the website administrator.
The following information is meant for the website developer for debugging purposes. | ||||
Error Occurred While Processing Request | ||||
|
(T▽T;)
いろいろ調べながら、エラーがでたり出なかったりするので変だなぁ・・・・と。
どうやら、できたxmlを秀丸で上書き保存するとエラーが出なくなる。
こういうときは、スリム化デバッグです。
怪しいところを残しながら、どんどん生成するxmlを小さくしてテスト。
極小のPDCAサイクルを廻すわけです。
日本語がよくない?改行コードがよくない?<item>なくしちゃえ!・・・・
結局、たった1行のxmlにまで縮小してもエラー・・・・
でも秀丸で上書き保存するだけでエラーが出なくなる。
1行まで小さくしたので、ここで気づきました。
上書き保存すると、ファイルサイズが 183バイト → 180バイト と3バイトだけ減ってることに。
この3バイトの差は何なんだ?ということで、今度はファイルダンプツールを物色。
ほどなく入手し、ダンプを見る。
すると、ダメな場合のxmlには、ファイルの最初に "EF BB BF"の3バイトがついている。
なんじゃこりゃ?
ダメ元で"EF BB BF"をググる。
ありゃりゃ、いっぱい出てくるね。なになに、ボム?BOM(ByteOrderMark)
http://sakaguch.com/utf1.html
この辺を参考に。
UTF-8(ボムあり) と UTF-8N(ボムなし) の2種類があるそうな。
どうやら、ColdFusionでXmlParseするときは、ボム無しじゃなきゃダメらしい。
さて、じゃぁどうやってボム無しにするか・・・・・asp側じゃわからんな。
(。-`ω´-)ンー・・・とColdFusionの文字列関数を眺める。
RemoveCharsかな?3文字切るんじゃダメだった。じゃ、1文字。
おぉ(゜ロ゜) できた!
<cfhttp method = "Get" url="http://hon/top/top_r.xml" charset="UTF-8" result="XMLFileText"/>
<cfset honxmlDoc = XmlParse(RemoveChars(XMLFileText.Filecontent,1,1))>
約6時間のハマリでした。
情報通信を生業としない企業の、システム系でもない普通の社員なので、 ColdFusionは独学。参考書が少ないのがツライです・・・・なんだかんだ、ColdFusion4.xのシリウス時代から7年くらいのおつきあい?リンコムNextのソースが教科書かも。
外注するときはよく「できればColdFusionで・・・・」とお願いするのですが、ほとんどの場合「えっ!?」と驚かれてしまい、「SEのアサインが・・・」などと営業さんが困ってしまうことが多くて悲しいです。
ちょっとしたものなら自分でシステム構築しちゃいますが、一人でやるには時間が足りませんね・・・
FlashRemotingとかもやりますが、Flexには手を出してません。
と、最初の頃書きましたが、ついにFlexに手を出しました。Flex1.5はイマイチわかりませんでしたが、Flex2は別物ですね。これで6万円でイインデスカ?
そしてFlex2とColdFusionの組み合わせなら無敵な気がしますよ。ほんとに。
01 | 2025/02 | 03 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |