[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今までイントラばかりで、レンタルサーバーのColdFusionなんて使ったことありませんでした。
環境が違うとそれなりにクセがあるなぁ と気がついたことを書いておきます。
hetemlのコールドフュージョンはCFMX7.02 データーベースはMySQL 4.0.25のようです。
コールドフュージョンを使うときに、できるだけ文字化け問題に遭遇しないためには、UTF-8を使うのが一番です。
でも、MySQLはeuc-jp(ja-euc)が文字化けトラブルが一番少ないそうです。
トラブル少ない同士の組み合わせで進めていますが、やっぱり文字化けに遭遇してしまいました。
"-" 横棒です。
こいつをフォームからデーターベースにinsertすると、"?"に化けちゃいます。
オラクルでよく化けるのが "~" にょろ ですが、にょろは大丈夫でした。
フォームを受けて表示するだけなら化けずに表示されるのですが、MySQLにinsertするときに化けるようです。
対策は、
という感じでreplaceしてから、re_discriptionをinsertすればOKです。
ちょっと古いドキュメントですが、
ColdFusion MXにて日本語の一部の文字が化けてしまうことについて
これが参考になりますね。
Core2Duoを積んだマシンをゲットした。
(T_T) うれしい・・・・
さて、
ColdFusionを使って、お気楽にディレクトリをweb公開する例のその2。
前回はcfdirectoryで一覧を取るところまででした。
<cfdirectory directory="/var/www/html/fuho" action="list" name="spf" filter="*.pdf" sort="name DESC"/>
今回は表示部分です。
<cfoutput>
<cfloop query="spf">
<div class="items">
<cfif (IsNumeric(ListGetAt(name,1,'.')) is false) or (Len(ListGetAt(name,1,'.')) neq 8)>
[#name#]←ファイル名がyyyymmdd.pdfでは無いようです....
<cfelse>
<h3><a href="./kyu/sambaweb/newspaper/#name#" target="_PDF">#left(name,4)#年 #mid(name,5,2)#月 #mid(name,7,2)#日</a> (#NumberFormat(size/1024/1024,'__._')#MB)</h3>
</cfif>
</div>
</cfloop>
</cfoutput>
いろいろ関数を使っています。
公開するルールとして、yyyymmdd.pdf形式でファイルをアップする事にしたので、そのルールに合っているかどうか一応チェックしています。相手はオツボネーゼだったりするので、何をしでかすかわかりませんから。
チェックは2種類。
ひとつは、拡張子を除いたファイル名が数字かどうかを、
IsNumeric(ListGetAt(name,1,'.'))
これでチェックしています。
IsNumeric(文字列)関数で、文字列が数字ならtrue、数字でなければFlaseが返ります。
で、拡張子.pdfを除くために、ListGetAt関数(→LiveDocs)を使っています。
left関数などを使って、「ファイル名の左から8文字とる」でも良さそうですが、そこはオツボネーゼ。何文字のファイル名になるのかわかりません。拡張子もアヤシイかもしれません。
なので、ListGetAtを使っています。
ColdFusionで言う「リスト」とは、
"1,3,5,7,11" とか "赤;青;黄色;紫" とか、決まった区切り文字を含んだ文字列です。
こいつの3番目を取り出すといった事ができます。
ListGetAt(リスト文字列 , 何番目を取るか , リストセパレータ ) という決まりなので、3つ目を取り出すにはそれぞれ、
ListGetAt("1,3,5,7,11" , 3 , ",") とすれば '5' を、 ListGetAt("赤;青;黄色;紫" , 3 , ';') とすれば '黄色' を取り出すことができます。
ListGetAt( name , 1 , "." ) は、
name(←ファイル名) をピリオドで区切られたリストと見立てて、1番目を取る。 ってことになります。
で、これが数字かどうかを判断しています。
もう一つのチェックは、その数字が8ケタかどうかをLen(ListGetAt(name,1,'.')) で、チェックしています。
まぁ、こんなチェックをしても、オツボネーゼが 20101500.pdf とか入れちゃうのは阻止できませんが、この先エラーは出なくなりますし、いくらなんでも変な日付だと気がつくと思います。
年月日の表示部分はleft関数とかmid関数なので、どんな言語でも当たり前。
その先のファイルサイズの表示ですが、
NumberFormat(size/1024/1024,'__._')
と、NumberFormat関数(→LiveDocs)を使って、少数第一位までの表示に整えています。
こいつを<cfloop query=""> で廻してるわけです。
当然、ディレクトリ内に何百もファイルがあれば、全部表示されてしまうところが「お気楽」なところですねぇ。
その辺は増えたときに考えます。はい。
先日ギックリ腰になった上司はやはり翌日お休みでした。
さて、
MovabeType用のpingサーバーの作り方、その4です。
[その1] [その2] [その3]
1)pingが来たら、
2)postされたcontentの内容を読んで
3)XMLとして取り込み
4)URLを取り出したら
5)RSSを読みに行って
6)新着記事を入手し
7)データーベースに書く
の5) 6)について。
pingを送ってきたブログのURL(RSS)を既に入手しています。 #blogurl# という変数に入ってます。
5)
<cfhttp url="#blogurl#" method="GET" resolveurl="Yes" />
6)
<cfset xmlDoc = XmlParse(CFHTTP.FileContent)>
この2行でOK・・・・? だからColdFusionって好き。
解説します。
5)RSSを読みに行く
<cfhttp url="#blogurl#" method="GET" resolveurl="Yes" />
#blogurl#には、"http://kenw05/blog/yasmemo/index.rdf" という文字列が入っています。
MovableTypeが自動生成するRSSのアドレスです。
ちなみにこのブログの場合こんな感じ。(MovableTypeじゃないけどRSS1.0だからフォーマットは一緒)
CFHTTP(→LiveDocs) を使うと、ColdFusionでhttpのリクエストを発行し、結果を受け取ることが出来ます。
RSSが流行る前は、お気に入りのページをColdFusionに巡回させて、htmlファイルから新着情報を抜き出して表示させたりしていましたね。(カナリメンドクサ)
いろいろ奥が深いタグですが、method="GET"の場合CFHTTPの結果は、cfhttp. という接頭詞の変数で返ってきます。この中の、cfhttp.fileContent が入手したhtmlです(今回はindex.rdf)
名前 |
説明 |
---|---|
cfhttp.charSet |
レスポンスの Content-Type ヘッダで指定されたレスポンス文字セット (文字エンコード) です。 |
cfhttp.errorDetail |
HTTP サーバーへの接続が失敗した場合に、失敗の詳細を記録します (例 : "Unknown host: my.co.com")。それ以外の場合は、空の文字列になります。エラー状態について、他の変数を確認する前にこの変数を確認することをお勧めします。 |
cfhttp.fileContent |
レスポンス本文です。たとえば、GET オペレーションによって取得された HTML ページのコンテンツなどです。レスポンスをファイルに保管した場合は空になります。 |
cfhttp.header |
すべてのヘッダ情報を 1 つの文字列に格納した生のレスポンスヘッダです。 |
cfhttp.mimeType |
レスポンスの Content-Type ヘッダで指定されている MIME タイプです (例 : text/html)。 |
cfhttp.responseHeader |
構造体の形式にされたレスポンスヘッダです。要素キーは、Content-Type や Status_Code などのヘッダ名です。あるヘッダタイプのインスタンスが複数ある場合は、そのタイプの値が配列に格納されます。 よく使用されるテクニックは、 |
cfhttp.statusCode |
HTTP Explanation ヘッダ値の後に続く HTTP status_code ヘッダ値です (例 : "200 OK")。 |
cfhttp.text |
ブール値。レスポンス本文のコンテンツタイプがテキストである場合は true になります。ColdFusion は、次の場合にレスポンス本文をテキストとして認識します。
|
cfhttp.fileContent は、ただの文字列です。
<cfdump ver="#CFHTTP.FileContent#">すると、こんな感じ。
もしこのページが普通のhtmlだとしたら、その中から必要な情報を探すには骨が折れます。文字列の中からパターンを見つけて正規表現で抽出・・・・という手順が必要になります。
RSSはXMLなので、その辺がとても扱いやすいわけです。
で、6)<cfset xmlDoc = XmlParse(CFHTTP.FileContent)>
とすると、Xmlを解析してとても扱いやすく変換してくれます。
<cfdump var="#xmlDoc#">すると
こんな感じ。ColdFuionの構造体変数に変換され、階層が整理されて表示されます。
最新記事のタイトルは、
#xmlDoc["rdf:RDF"].item[1].title.XmlText#
更新日時は
#xmlDoc["rdf:RDF"].item[1]["dc:date"].XmlText#
という感じで参照できます。
構造体のキー名に”:”コロンが入っていると、そのままドットシンタックスで繋げないので注意が必要です。
あとはこれをDBにinsertするわけです。
アンパンマンの世界は食糧が全て。
喜びも、悲しみも、怒りも、欲望も、全て食い物が発端。
さて、
MovableTypeのpingサーバーの作り方。
1)pingが来たら、
2)postされたcontentの内容を読んで
3)XMLとして取り込み
4)URLを取り出したら
5)RSSを読みに行って
6)新着記事を入手し
7)データーベースに書く
の2)からです。
<cfset ping =XMLParse(x.content)>・・・・2) 3)
<cfset blogurl = "#ping.methodCall.params.param[2].value.xmltext#index.rdf">・・・・4)
解説すると、まず変数 x (構造体になってる)はHTTPのPOSTリクエストとして入手済。
x.content がxmlのテキストとしてポストされています。
なので、XMLParse関数(→LiveDocs)を使ってx.content を pingという変数に取り込みます。2)3)
取り込んだものを視覚的に見るとこんな感じ。<cfcump var="#ping#">
ここから、最後にある「http://kenw05/blog/yasmemo/」という文字列を取り出します。
そのためには、ColdFusionの構造体のドットシンタックスを理解している必要がありますが、試行錯誤すれば結構もやっとした知識でたどり着けます。コツはやっぱり<cfdump>して、まずは見ることですね。
基本的に上からドットで階層をたどっていけばたどり着けます。ドットを「の中の」と読み替えると、感覚的に理解できるかもしれません。
ping . methodCall . params . param[2] . value . xmltext
ping の中の methodCall の中の params の中の ・・・・上の図を見ると、次は同じ名前のparam が2つ並んでいます。こういうときは、カギ括弧で上から何番目かを指定します。 param[2] の中の value の中の xmltext でブログのURLにたどり着きました。
<cfset blogurl = "#ping.methodCall.params.param[2].value.xmltext#index.rdf">・・・・4)
こうすると、blogurl という変数に、http://kenw05/blog/yasmemo/index.rdf という文字列がセットされます。
最後につけているindex.rdfはMovableTypeが生成している、そのブログのRSSです。
次はこのRSSを読んで、更新内容を入手することになります。
テクノラティジャパンはどうしようもないが、http://www.technorati.com はまともかな?
さて、
pingサーバーの作り方のつづき。
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 |
MovableTypeが送るpingの内容がこれ↑です。
まず、一番大事そうなところは、content の内容ですね。
XMLのようです。
このpingを送ったブログのタイトルは「MovableTypeってどうよ?」です。
なんか文字化けしてますな・・・・
あと、URLが含まれています。
headers.User-Agent を見るとブログの種類がわかるようですが、イントラでMovableType決め打ちなので使う必要はありません。
結局、pingで送られる情報はブログのタイトルとURLのみのようです。
ということで、だいたい見えました。
1)pingが来たら、
2)contentの内容を読んで
3)XMLとして取り込み
4)URLを取り出したら
5)RSSを読みに行って
6)新着記事を入手し
7)データーベースに書く
こんな感じでしょうか。
まず最初の1)pingが来たら ですが、こいつはmethodを見て判断しようと思います。
method が POST ならpingと判断します。
GETならブラウジングということで、データーベースから新着の一覧を表示させようかな?
するとまずはこうなります
========= ping.cfm ============
<cfprocessingdirective pageencoding="utf-8">
<cfset x = GetHttpRequestData()><!---httpリクエストを取る--->
<cfif x.method is "POST">
2)
3)
4)
5)
6)
7)
<cfelse>
<html><body>一覧表示</body></html>
</cfif>
==============================
てな感じで、POSTかGETかで分岐させます。
つづく
情報通信を生業としない企業の、システム系でもない普通の社員なので、 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 |