忍者ブログ
全くIT系ではない製造業の社員がイントラ上でColdFusionと格闘。システム構築を外部委託するとき「できればColdFusionでお願いします」と頼むのだが・・・・
[1] [2]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

今、レンタルサーバーのhetemlでちょっとしたサイトを作っています。

今までイントラばかりで、レンタルサーバーのColdFusionなんて使ったことありませんでした。
環境が違うとそれなりにクセがあるなぁ と気がついたことを書いておきます。

hetemlのコールドフュージョンはCFMX7.02 データーベースはMySQL 4.0.25のようです。

コールドフュージョンを使うときに、できるだけ文字化け問題に遭遇しないためには、UTF-8を使うのが一番です。
でも、MySQLはeuc-jp(ja-euc)が文字化けトラブルが一番少ないそうです。

トラブル少ない同士の組み合わせで進めていますが、やっぱり文字化けに遭遇してしまいました。


"-" 横棒です。
こいつをフォームからデーターベースにinsertすると、"?"に化けちゃいます。
オラクルでよく化けるのが "~" にょろ ですが、にょろは大丈夫でした。

フォームを受けて表示するだけなら化けずに表示されるのですが、MySQLにinsertするときに化けるようです。


対策は、
<cfset re_discription = replace(form.discription, "#chr(inputbasen('ff0d',16))#", "#chr(inputbasen('2212',16))#" , "all") >

という感じでreplaceしてから、re_discriptionをinsertすればOKです。


ちょっと古いドキュメントですが、
ColdFusion MXにて日本語の一部の文字が化けてしまうことについて
これが参考になりますね。
PR

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.responseHeader 変数と同じ情報を含みます。

cfhttp.mimeType

レスポンスの Content-Type ヘッダで指定されている MIME タイプです (例 : text/html)。

cfhttp.responseHeader

構造体の形式にされたレスポンスヘッダです。要素キーは、Content-Type や Status_Code などのヘッダ名です。あるヘッダタイプのインスタンスが複数ある場合は、そのタイプの値が配列に格納されます。

よく使用されるテクニックは、#cfhttp.resonseHeader[fieldVariable]# のように、cfhttp.responseHeader 構造体をダイナミック配列としてダイナミックにアクセスすることです。

cfhttp.statusCode

HTTP Explanation ヘッダ値の後に続く HTTP status_code ヘッダ値です (例 : "200 OK")。

cfhttp.text

ブール値。レスポンス本文のコンテンツタイプがテキストである場合は true になります。ColdFusion は、次の場合にレスポンス本文をテキストとして認識します。

  • ヘッダにコンテンツタイプが指定されていない場合
  • コンテンツタイプが "text" で始まっている場合
  • コンテンツタイプが "message" で始まっている場合
  • コンテンツタイプが "application/octet-stream" である場合

cfhttp.fileContent は、ただの文字列です。
<cfdump ver="#CFHTTP.FileContent#">すると、こんな感じ。
テキストファイル
もしこのページが普通のhtmlだとしたら、その中から必要な情報を探すには骨が折れます。文字列の中からパターンを見つけて正規表現で抽出・・・・という手順が必要になります。
RSSはXMLなので、その辺がとても扱いやすいわけです。

で、6)<cfset xmlDoc = XmlParse(CFHTTP.FileContent)>

とすると、Xmlを解析してとても扱いやすく変換してくれます。
<cfdump var="#xmlDoc#">すると
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.contentpingという変数に取り込みます。2)3)

取り込んだものを視覚的に見るとこんな感じ。<cfcump var="#ping#">
pingのdump結果

 ここから、最後にある「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
struct
Connection close
Content-Length 250
Content-Type text/xml
Host kenw01
Range bytes=0-99999
User-Agent MovableType/3.2-ja-2
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かで分岐させます。

つづく

ブログ内検索
プロフィール
HN:
CFIF
性別:
男性
自己紹介:
もっと日本でもColdFusionが広まって欲しいです。

情報通信を生業としない企業の、システム系でもない普通の社員なので、 ColdFusionは独学。参考書が少ないのがツライです・・・・なんだかんだ、ColdFusion4.xのシリウス時代から7年くらいのおつきあい?リンコムNextのソースが教科書かも。

外注するときはよく「できればColdFusionで・・・・」とお願いするのですが、ほとんどの場合「えっ!?」と驚かれてしまい、「SEのアサインが・・・」などと営業さんが困ってしまうことが多くて悲しいです。
ちょっとしたものなら自分でシステム構築しちゃいますが、一人でやるには時間が足りませんね・・・

FlashRemotingとかもやりますが、Flexには手を出してません。
と、最初の頃書きましたが、ついにFlexに手を出しました。Flex1.5はイマイチわかりませんでしたが、Flex2は別物ですね。これで6万円でイインデスカ?
そしてFlex2とColdFusionの組み合わせなら無敵な気がしますよ。ほんとに。
最新トラックバック
カレンダー
03 2024/04 05
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 29 30
なかのひと
忍者ブログ [PR]