2008/08/31

[java]jarファイルの作成方法

classファイルをjarファイルでまとめるのですが、方法がわからなかったので、調べました。

JAR ファイルへの圧縮
ディレクトリ pack を pack.jar に圧縮するためには、次のコマンドを発行します。
>jar cvf pack.jar pack

via:JARファイル

これで、jarファイルの作成にこまらないぞと

2008/08/30

[java]javaコマンドを調べる

dosからjavaを起動する上で今まで、

javac hoge.java
java hoge

しか使ったことがなかったので、使い方がわからないかなと思ったら、こちらにヘルプの呼び出し方法が書いてありました。

●javaコマンドの使い方を表示する
“-?”または“-help”

via:Javaプログラミングの前提知識

というわけでさっそく試してみると、確かにヘルプが表示されました。

Photobucket

他にもコマンドが書かれているページないかなと思ったら、totonの日記さんにコマンドオプションの参照先が紹介されていました。

こんなところにあったとは。。。

2008/08/29

[java][SOAP]axis2のAPI集みぃ~け

ここにいたな~♪♪

[java][SOAP]DOSでクライアントのjavaバージョンの確認

axis2は、JDKのバージョンが1.4以上でないと動かないみたいです。

Java Development Kit (JDK)
1.4 or later

via:System Requirements

ということで、クライアントにインストールされているjavaのバージョンの確認方法を調べてみると、、、

コマンドラインを開いて、コマンド "java -version" を入力して Enter ボタンを押下してください。

via:Java 環境のセットアップ

と書いてありました。

さっそく試しました。

Photobucket
oh-、でたー♪

[java][SOAP]Axis2をゲット

クライアントでsoapができたらと思い、Axis2をダウンロードしました。

ダウンロード先は、ここでしました。

2008/08/28

[oracle][java]oracle9iのJDKのバージョンに注意

oracle8では、どうかわかりませんが、oracle9ではjavaをサポートしていて、DBからクラスファイルを実行することができます。

で、問題となるのは、JDKのバージョンが1.3.1なので、これ以上のバージョンではないと動かないクラスファイルを実行する際に注意が必要です。

詳しいバージョン情報に関しては、ここに書いてあります。

2008/08/27

[ColdFusion]セッション変数

マッシュアップアワードに作品を出展する際に、セッション変数がほしかったので、その設定方法について

<cfapplication name="test" sessionManagement="yes"
sessionTimeout="#CreateTimeSpan(0,0,1,0)#"
>

<cfif Not IsDefined("Session.hoge")>
<!--- セッション変数に値をセット --->
<cflock timeout="10" scope="session" type="Exclusive">
<cfset Session.hoge = "foo">
</cflock>
</cfif>

<cfoutput>
#Session.hoge#
</cfoutput>

まず、cfapplicationタグで、セッション変数を使えるようにします。

アプリケーションのタイトルと、セッション変数のタイムアウトを設定すれば使えるようになります。
sessionManagement属性をyesにする必要もあります。

設定後、cflockで、セッション変数にロックをかけた後、変数に値をセットします。

セットした後は、Session構造体で表示を行うことができます。

このとき注意なのは、cfapplicationタグよりも上でセッション変数をセットできないところ。

下のような場合、アプリケーションエラーが発生します。

<!--- セッション変数に値をセット --->
<cflock timeout="10" scope="session" type="Exclusive">
<cfset Session.hoge = "foo">
</cflock>


<cfapplication name="test" sessionManagement="yes"
sessionTimeout="#CreateTimeSpan(0,0,1,0)#"
>

<cfoutput>
#Session.hoge#
</cfoutput>

セッション変数を使いたいときに注意したいです。

2008/08/26

[ColdFusion]年齢計算

CFで年齢計算を行う処理について考えてみました。

<cfset a1ymd = "19821123">
<cfset a2ymd = "20080827">

<cfset age = Left(a2ymd,4) - Left(a1ymd,4)>
<cfif Right(a2ymd,4) lt Right(a1ymd,4)>
<cfset age = age -1>
</cfif>

a1ymdを生年月日とし、a2ymdを算出したい日としました。

「0808」と「0112」といった文字列同士の比較をすることができるので楽だなー。

2008/08/25

[java]メソッド、クラスの書き方に注意

開発をしているときに陥りがちなのですが、あるクラス、メソッドを使うときに、文字を正しくかかないとコンパイルエラーになってしまいます。

geoapを使ったプログラムの修正をしていたところ、CourseDistanceOfAdrToStationというメソッドを使う際に、最初の大文字の「C」を小文字「c」で書いてしまい、「シンボルを解決できません」というコンパイルエラーが起こしてしまったんですね。

最初、このエラーが発生したとき、「シンボルを解決できません。」といわれてしまい、何がなんだか全然わからなかったので、ぐぐってみると、
Javaの部屋

このエラーはこの指定方法で綴りを間違った場合に発生します。

via:シンボルを解決できません

と書かれていて、もしかしてと思って、よーくメソッドの綴りを見てみると、確かに綴りが違っていたので、そっこーで治してコンパイルエラーを取り除きました。

ColdFusionだったら絶対おきないエラー。

気をつけたいと思いました。

2008/08/24

[coldfusion][ぐるなび]お店情報の取得

ぐるなびのwebサービスを使った解説も最後かもしれない。

今回は、お店の情報を取得する方法について

<cfparam name="requrl"
default="http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=取得したAPIキー">
<cfparam name="hit_per_page" default=500>
<cfparam name="ret" default="">
<cfset store="和民">
<cfset requrl = requrl&"&hit_per_page="&hit_per_page>
<cfset requrl = requrl&"&name="&URLEncodedFormat(store,"utf-8")>

<cfhttp url="#requrl#" method="get"/>
<cfoutput>var data ="";</cfoutput>

<!--- xmlの解析 --->
<cfset ret = XmlParse(cfhttp.fileContent)>

<!--- 問合わせがエラーを返した場合 --->
<cfif XmlChildPos(ret,"gnavi",1) neq -1>

  <!--- コードの値を取得 --->
  <cfset retCode = ret.gnavi.error.code.xmlText>
  <cfoutput>
  <!--- コードが600の場合、呼び出し元に検索結果(0件)を返す --->
  <cfif retCode eq "600">
    data = {"error":null,"total":0};
  <!--- エラーコードを返す --->
  <cfelse>
    data = {"error":"#ret.gnavi.error.code.xmlText#"};
  </cfif>
  </cfoutput>

<!--- 問合わせ結果が、正常な場合 --->
<cfelse>
  <!--- 検索結果の合計数 --->
  <cfset TotalCnt = ret.response.total_hit_count.XmlText>
  
  <!--- responseタグまで取得 --->
  <cfset Response = ret.response>

  <!--- JSON形式でリターン --->
  <cfoutput>
    date = {
     "error":null
    <!--- 検索結果の合計数 --->
     , "total":#totalCnt#
    <cfloop index="i" from="1" to="#totalCnt#">
      <cfset Ret_rest = Response.rest[i]>
     , #i#:{
      <!--- 店舗ID --->
     "id":"#Ret_rest.id.XmlText#"
      <!--- 店舗名 --->
     , "name":"#Ret_rest.name.XmlText#"
      <!--- PCサイトURL --->
     , "url":"#Ret_rest.url.XmlText#"
      <!--- 店舗画像画像1がある場合 --->
      <cfif Ret_rest.image_url.shop_image1.XmlText neq "">
        <!--- 店舗画像画像1のURL --->
     , "shop_image1":"#Ret_rest.image_url.shop_image1.XmlText#"
      <!--- 店舗画像画像1がない場合 --->
      <cfelse>
     , "shop_image1":null
      </cfif>
      <!--- 店舗画像画像2がある場合 --->
      <cfif Ret_rest.image_url.shop_image2.XmlText neq "">
        <!--- 店舗画像画像2のURL --->
     , "shop_image2":"#Ret_rest.image_url.shop_image2.XmlText#"
      <!--- 店舗画像画像2がない場合 --->
      <cfelse>
     , "shop_image2":null
      </cfif>
      <!--- QRコード画像のURLがある場合 --->
      <cfif Ret_rest.image_url.qrcode.XmlText neq "">
        <!--- QRコード画像のURL --->
     , "qrcode":"#Ret_rest.image_url.qrcode.XmlText#"
      <!--- QRコード画像のURLがない場合 --->
      <cfelse>
     , "qrcode":null
      </cfif>
        <!--- 住所 --->
     , "address":"#Ret_rest.address.XmlText#"
        <!--- 電話番号 --->
     , "tel":"#Ret_rest.tel.XmlText#"
        <!--- 緯度(度分秒十進数) --->
     , "latitude":#Ret_rest.latitude.XmlText#
        <!--- 経度(度分秒十進数) --->
     , "longitude":#Ret_rest.longitude.XmlText#
     }
    </cfloop>
    };
  </cfoutput>
</cfif>

全部ではないのですが、JSON形式でお店の情報を返すようにしました。
返り値に、経度と緯度も追加しました。

evalをかけたあと、これを使ってgoogle mapで表示するのもいいかなと思い。

今回キーとなったのは、エラーがおきたときのタグの構成がちょい違うところ。
なので、でかいif文で、エラーかどうか確認しないといけないんですよねー。

とりあえず形になったと思います。

時間があったら、coldfusionを使ったJSON形式で返すプログラムを公開しよっかなー。

2008/08/23

[思い出]麻布十番のお祭り

ここまで、でかいお祭りは生まれて初めてかもしれない。

普通の屋台に加え、各県の名産物もあって、ものすごい人だかりができていました。

Photobucket
上は、秋田のきりたんぽ!!
めっちゃおいしかった。

Photobucket
上は、山梨の白ワインが入っていた樽。
ものすごく甘くてぶどうの味がしました。

名産物のみだけでなく、世界各地の食べ物を出している屋台もあって、ガーナのお豆の入ったビーフシチューと焼肉の入ったナンを食べて、まじ幸せでした。

食べるって本当にいいですね(故水野さんっぽく)

2008/08/22

やさしいJava 第3版

新入社員時に買った本



当時、右も左も知らなかったとき、かなりお世話になりました。

本通りにソースを入力して、実行すると感動したなぁー♪

2008/08/21

[coldfusion][ぐるなび]都道府県情報を取得

昨日に引き続き、今日もぐるなびのwebサービス

今回は、都道府県情報の取得をします。

<cfparam name="requrl_pref" default="http://api.gnavi.co.jp/ver1/PrefSearchAPI/?keyid=取得したAPIキー">

<cfhttp url="#requrl_pref#"/>

<!--- xmlの解析 --->
<cfset ret = XmlParse(cfhttp.fileContent)>

<!--- 問合わせがエラーを返した場合 --->
<cfif XmlChildPos(ret,"gnavi",1) neq -1>

 <!--- コードの値を取得 --->
 <cfset retCode = ret.gnavi.error.code.xmlText>

 <!--- エラーコードの表示 --->
 <cfoutput>#retCode#</cfoutput>

<!--- 問合わせ結果が、正常な場合 --->
<cfelse>
 
 <cfset response = ret.response>

 <cfoutput>
  <cfloop index="i" from="1" to="#ArrayLen(response.XmlChildren)#">
   <cfset res_pref = response.pref[i]>
   #res_pref.pref_code.XmlText#<br>
   #res_pref.pref_name.XmlText#<br>
   #res_pref.area_code.XmlText#
  </cfloop>
 </cfoutput>
</cfif>

昨日と同じように、これもxmlではなくて、jsonで返したほうが後々の処理が楽になっていいんじゃぁーないかなと。

2008/08/20

[coldfusion][ぐるなび]地域情報を取得

ぐるなびWebサービスを利用して、エリア情報を取得したいと思います。

<cfparam name="requrl" default="http://api.gnavi.co.jp/ver1/AreaSearchAPI/?keyid=取得したAPIキー">
<!--- httpリクエスト --->
<cfhttp url="#requrl#"/>

<!--- xmlの解析 --->
<cfset ret = XmlParse(cfhttp.fileContent)>

<!--- 問合わせがエラーを返した場合 --->
<cfif XmlChildPos(ret,"gnavi",1) neq -1>

 <!--- コードの値を取得 --->
 <cfset retCode = ret.gnavi.error.code.xmlText>

 <!--- エラーコードの表示 --->
 <cfoutput>#retCode#</cfoutput>

<!--- 問合わせ結果が、正常な場合 --->
<cfelse>
 <cfset response = ret.response>
 <cfoutput>
  <cfloop index="i" from="1" to="#ArrayLen(response.XmlChildren)#">
   <cfset res_area = response.area[i]>
   <!--- エリアコード --->
   #res_area.area_code.XmlText#<br>
   <!--- エリア名称 --->
   #res_area.area_name.XmlText#
  </cfloop>
 </cfoutput>
</cfif>

上は、純粋に、表示しているだけですが、JSON形式に変換することにより、javascriptからの呼び出しにも対応できるようになります。

といっても、すでに、javascriptから、httpリクエストを出して、情報を取得することができるのでが、形式がxmlのため取得後が大変になるかなと。

2008/08/19

[scheme]動いた!!

昨日の[scheme]なぜかバグるんだよなぁー。で、バグがでていたのですが、教科書とおりにやってみたら、できた!!

(define (element-of-set? x set)
(cond ((null? set) false)
((= x (car set)) true)
((< x (car set)) false)
(else (element-of-set? x (cdr set)))
)
)

でもおかしいな、「true」や「false」をつかったらバグったプログラムがあったんだよなー。

プログラムの仕様理解不足だな~。

2008/08/18

[scheme]なぜかバグるんだよなぁー。

どうして、これがバグちゃうんだろう~~~。

(define (element-of-set? x set)
(cond ( (null? set) '())
( (= x (car set)) #t)
( (< x (car set)) '())
(else (element-of-set? x (cdr set)))
)
)


まいったなぁー。。。 orz

2008/08/17

シンフォニー in ロイヤル・パーク・ホテル

東京タワーの帰りに、水天宮前駅にあるロイヤル・パーク・ホテルに宿泊しました。
(嫁のおごりです。)

晩御飯は、1Fのシンフォニーというところで、バイキング

Photobucket

今までいった中で、京王プラザホテルのバイキングが一番おいしいかなと思っていたのですが、ここも最高だった。

めっちゃうまくて、食べ過ぎて、夜中吐きそうになりました。

Photobucket

フォアグラも食べ放題で、上の写真は、シェフが焼いているところ。

Photobucket

デザートもたくさんありました。

甘党にも最高ぉ~~~。

2008/08/16

東京タワー、初の最上階、体験

今年、生誕20周年ということで、登りました。

Photobucket

下を覗くとものすごく怖かったです。

Photobucket

ちょうど、晴れていたので、ながめは最高でした。

Photobucket

Photobucket

ちょーど、今の妻と付き合うときに、東京タワーに行ったのですが、その時に最上階にはいかなかったので、懐かしいなーと思いつつ、最上階の景色を楽しみました。

夜景などうなんだろう??
やっぱキレイなのかな??

2008/08/15

さようなら、お台場冒険王

あ”-、今年で終わってしまうのかー、お台場冒険王

Photobucket

というわけで、今年もいきました♪”

今年は、めちゃいけプロデュースの海の家にいくこともできました。

最上階の展望台で、SPORTのアナウンサー体験をすることができました。

1500円で、DVDにしてくれるのですが、買っておけばよかったなーorz

あまりにも恥ずかしすぎて、買うのに躊躇しました。

コンバット2お台場冒険王スペシャルを見ました。

オバ芸最高



唯一の後悔は、ゲゲゲの鬼太郎のアトラクションにいけなかった。
朝早くから並んでおけばよかったのかも。

あと、ドラゴンアイスの量が少ないような気がします。
最初、小学生が持っているのを見て、めちゃめちゃ量があるように見えたのですが。。。

うーん、入場料、1500円は、相変わらず高いかも。

2008/08/14

the 適当!!適当教典 プロデュースBy 高田純次

だいぶ前に、妻が買った、本を読んでいます。



相談者の悩みに、高田純次が答えるという作品。

その回答が、本当に適当すぎて、お腹が痛くなってしまうほど笑いが止まりませんでした。

あまりにも適当すぎてあっという間に読み終わってしまいました。

目次
第1章 「肉・からだ」の巻
第2章 「マネー」の巻
第3章 「仕事」の巻
第4章 「家族」の巻
第5章 「青春」の巻
第6章 「哲学・社会」の巻

いくつかのテーマに沿った悩みに対して答えてくれます。

各章はつながっていないので、おもしろそうなところから読んでみるのもいいと思います。

こちらによると、発行部数が21万部突破しているという脅威の作品。

ギャグ漫画で笑うことはありますが、小説で笑わしてくれる作品はなかなかないかなと。

2008/08/13

[ColdFusion][OpenID]Association確立

今回は、Associationの確立方法について。

簡単に言ってしまうと、前々回に取得したOP EndPoint URLにhttpリクエスト(POST)を出せばオッケーなのですが、その際に、以下のパラメーターを送信する必要があります。

openid.ns
openid.mode
openid.assoc_type
openid.session_type
openid.dh_modulus
openid.dh_gen
openid.dh_consumer_public

リファレンスから、openid.nsは「http://specs.openid.net/auth/2.0」で、openid.modeは、「associate」というところまでは、わかったのですが、問題はここから。

次の、openid.assoc_typeは、特に推奨がなかったので、「HMAC-SHA1」をセット。

HMAC-SHA1を選択したので、openid.session_typeは「DH-SHA1」をセットしました。

ここからがやばかった。。。

openid.dh_modulusは、「base64(btwoc(g))」と書かれているのですが、これっていったい何??

base64の部分は、btwoc(g)で得た文字列か数字をbase64に変換すればいいので、CFのToBase64()を使えばいけそうな気がするのですが。。。

問題は、btwoc(g)の部分で、gの部分に付録Bの値をセットするところまではOKで、btwocは何をすればいいの??

4.2. 整数表現 (Integer Representations)の部分を読むと、

任意精度の整数は big-endian signed two's complement binary で符号化されなければならない (MUST)。従って、"btwoc" は任意精度の整数を引数としてとり、最小の big-endian two's complement representation として返す関数である。Diffie-Helman 鍵交換で使われる整数は全て正である。これは、the two's complement representation 最左ビットは常にゼロでなければならない (MUST) ことを意味する。

via:4.2. 整数表現 (Integer Representations)

と書かれていて、さらにわかりません。

ただ、説明の下にあった例を見ると、どうやら、以下のプロセスを経て数字が生成されていそうな気がしました。

1:10進数を16進数に変換
2:2桁ずつ区切り、それぞれの頭に「\x」を付ける
3:先頭の数字を2進数に変換してみて、1だった場合、一番先頭に「\x00」を追加する

リファレンスの例を元に考えてみます。

10進数:0 16進数:0 2進数:0→\x00
10進数:127 16進数:7F 2進数:0110 1111→\x7F
10進数:128 16進数:80 2進数:1000 0000→\x00\x80

と確かに、推測した文字列になってします。

この要領で、付録Bの値をbtwocに従ったアルゴリズムに変換しました。
<cfset KeyValue = "付録Bの値">
<cfparam name="tempKeyValue" default = "">
<cfparam name="KeyValueRest" default = "#KeyValue#">
<cfloop index="i" from="1" to="#Len(keyValue)/2#">
<!--- 左から2文字分を抜き出し、文字列結合する --->
<cfset tempKeyValue = tempKeyValue&"\x"&Left(KeyValueRest,2)>
<!--- テンポラリー文字列の長さが2文字よりも小さくなるまで行う --->
<cfif Len(KeyValueRest) gte 2>
<!--- 左から3番目以降の文字列を抜き出す --->
<cfset KeyValueRest = Mid(KeyValueRest,3,Len(KeyValueRest) - 2) >
</cfif>
</cfloop>
<!--- 頭に「\00」をつけ、Base64に変換を行う --->
<cfset dh_modulus = ToBase64("\x00"&tempKeyValue)>

最後に「\00」をつけている理由は、付録Bの先頭の値が、「C」なので、それを2進数変換とすると、「1100」となるので、追加しました。

この勢いで、デフォルトの2を使って「openid.dh_gen」の値をセットします。

で、最後のopenid.dh_consumer_publicですが、リファレンスでは「base64(btwoc(g ^ xa mod p))」と書かれていて、gとpは、すでに決まっているのですが、「xa」はどうするだろうか???

ここで、バカ正直に、xaを任意に設定し、「g ^ xa mod p」をやろうとすると、おそらくメモリーがもたないだろうと思いました。

というのも、pの値が、付録Bに記載されている値だったので、modすると、確実にやばいと思ったので、ここは、g ^ xa mod pの値自体を任意に設定することにしました。

任意の数字(x)を設定した後、base64(btwoc(x)とし、これですべてのパラメータがそろい、あとは、httpリクエスト(post)するだけ

<cfset KeyValue = "付録Bの値">
<cfparam name="tempKeyValue" default = "">
<cfparam name="KeyValueRest" default = "#KeyValue#">
<cfloop index="i" from="1" to="#Len(keyValue)/2#">
 <!--- 左から2文字分を抜き出し、文字列結合する --->
 <cfset tempKeyValue = tempKeyValue&"\x"&Left(KeyValueRest,2)>
 <!--- テンポラリー文字列の長さが2文字よりも小さくなるまで行う --->
 <cfif Len(KeyValueRest) gte 2>
  <!--- 左から3番目以降の文字列を抜き出す --->
  <cfset KeyValueRest = Mid(KeyValueRest,3,Len(KeyValueRest) - 2) >
 </cfif>
</cfloop>
<!--- 頭に「\00」をつけ、Base64に変換を行う --->
<cfset dh_modulus = ToBase64("\x00"&tempKeyValue)>
<cfset dh_gen = ToBase64("\x02")>

<cfset tempKeyValue = 0>
<cfset KeyValueRest = KeyValue>
<cfloop index="i" from="1" to="#Len(keyValue)#">
 <!--- 右から一文字抜き出して10進数変換を行う --->
 <cfset tempKeyValue = tempKeyValue + InputBaseN(Right(#KeyValueRest#,1),16) * (16^(#i#-1))>
 <cfif i lt Len(keyValue)>
  <cfset KeyValueRest = Mid(KeyValueRest,1,Len(KeyValueRest)-1)>
 </cfif>
</cfloop>
<cfset dh_consumer_public = ToBase64("任意の数字")>

<!--- httpリクエスト --->
<cfhttp url="#ReqUrl#" method="post" redirect="yes">
 <cfhttpparam type="formField" name="openid.ns" value="http://specs.openid.net/auth/2.0" >
 <cfhttpparam type="formField" name="openid.mode" value="associate">
 <cfhttpparam type="formField" name="openid.assoc_type" value="HMAC-SHA1">
 <cfhttpparam type="formField" name="openid.session_type" value="DH-SHA1">
 <cfhttpparam type="formField" name="openid.dh_modulus" value="#dh_modulus#">
 <cfhttpparam type="formField" name="openid.dh_gen" value="#dh_gen#">
 <cfhttpparam type="formField" name="openid.dh_consumer_public" value="#dh_consumer_public#">
</cfhttp>

2008/08/12

[思い出]雑誌に掲載されました

今はもう更新を行っていないのですが、このブログを始める前に、アメーバブログをやっていました。

日々、書く、えいが、おんがく、DTM。。。

で、画像のみですが、上のブログが雑誌に掲載されました。



マイクロソフトの社員に誘っていただいたイベントに参加したのですが、その時、模様が掲載されています。

セカンドライフに関することが書かれているので、興味ある方は、是非どうぞ!!

2008/08/11

[思い出]24シーズン7延期

そりゃーないよー。
すっげー楽しみにしていたのに。。。orz

このたび、20世紀フォックスTV米国本社より、「24SEASON Ⅶ・第1話」の制作が大幅に遅れ、8/31お台場映画王での上映に間に合わせることが不可能である旨の連絡がありました

via:24 SEASON Ⅶワールドプレミア について

先月、応募したのに、延期になってしまいました。

確かに去年、ストライキがあったからなー。
しょうがないのかもしれません。。。

今回は、CTUが解散してしまい、新しい組織ができるみたいで、しかも、トニーが犯人じゃーないのかと。

クロエや、ビルはどうなっているのだろうか??

まじ、すっげー気になる。

2008/08/10

[思い出]結婚式のDVD到着

もうかれこれ、2ヶ月前ほどに、結婚式をあげました。

[思い出]昨日は結婚式
[思い出]今日は、結婚式
[思い出]明日は、いよいよ結婚式

で、その時に、当日の模様を収めてくれるDVDを注文したのですが、ようやく到着しました。

さっそく、嫁のおばあちゃんと3人でみたのですが、すごくおもしろかったです♪

最高の思い出がまた一つできました!!

2008/08/09

[思い出]これがそのCMかぁー、エバ・メンデスがセクシー

そんな風に書かれたら、見るしかないじゃない!!

女優エバ・メンデス(34)がこのほど、米大手ファッションブランド、カルバン・クライン(CK)のランジェリーと香水の広告の顔になった。ところが、完成したばかりの同社の香水「シークレット・オブセッション」の新作CMが、あまりにセクシーすぎるという理由で、早くも全米で放送中止になり、物議をかもしている。

via:エバ・メンデスのエロすぎるカルバン・クラインCMが放送中止に!

確か、エバ・メンデスもめちゃくちゃ美人なんですよねー。

ウィル・スミス主演の「最後の恋のはじめ方」にヒロインで出演していたなー♪
なつかしいなー。
かれこれ、2年以上も前の話だ。

おそらく、youTubeにあるだろうなーと思ったら、案の定ありました。

本当にセクシーです





2008年9月16日追記
Gigazineさんのセクシー過ぎて放送禁止になったカルバン・クラインのCMとは?で、今回のコマーシャルの件が掲載されていました。

一ヶ月以上前に先に書いていたので、ちょっとうれしかった。

[openID]ログインまでの道のり

前に、[ColdFusion][OpenID]取得したXRDSについてで、OP EndPoint URLを取得するところまで書きました。

しかし、その後、もう何をどうやってよいのかわからず、google groupに相談しました。

そしたら、なんと、なんと、なんと、返信があったのです。(超感動)

ステップとしては、
1. OpenID入力
2. Discovery
3/4 Association確立
5. 認証要求をOPへ送信
6. RP Discovery
7.(クレデンシャル入力)
8. 認証結果をRPへ送信
9. 結果検証時のDiscovery
10/11. 署名の検証
12. ログイン完了

via:google group:Nat Sakimuraさんからの返信

おーなるほどー。これ通り行えばログインできるんだなー♪♪♪

「2. Discovery」まではできたので、「3/4 Association確立」に取り組みたいと思います。

話は変わりますが、Natさんから返信を頂いたのですが、実は、ものすごく有名な方なんだー。

OpenIDファウンデーション・ジャパンの発起人代表で、野村総研の情報技術本部 技術調査部 上級研究員である崎村夏彦氏

via:国内でOpenID推進団体が設立へ――4月に正式発足

すごいを通り越してびっくりしました。

まさか、まさか、OpenId Japanを作った方に、直接コメントをいただけるとは。

うれしいあまり感謝感激です。

この場を借りて、Nat Sakimuraさんに感謝の言葉を。

ありがとうございます。

普通に過ごしていたんじゃー決して出会うことのない方たちと出会い、コミュニケーションをとることで、色々な可能性が広がっていく感じがします。

インターネットってすごいですね。

2008/08/08

[asp][VBscript]入門:Function

Functionの構文は、下のようになっていようです。

Function hoge(args)
hoge = Return Value
End Function

ファンクション名に返したい値をセットするところがポイントです。

普段、JavaScriptやColdFusionでしか関数を使わないので、注意したいところ。

[asp][VBscript]入門:IF文

単純にIf文といえども、言語によって、書き方が、多少違うので、一応書こうかなと。

If 条件1 Then
・・・処理1・・・
ElseIf 条件2 Then
・・・処理2・・・
Else
・・・処理3・・・
End If

こうしてまとめておけば、IF文も怖くないぞと。

[asp][VBscript]入門:「""」の判定

前回に続いて、「""」の判定方法について。
一番、簡単なのは、Ifで判定するのがいいと思いました。

<%
Dim aTest
Dim aFlg

aTest = ""

If aTest = "" Then
aFlg = True
Else
aFlg = False
End IF

%>

<%= aFlg %>


確かにtrueを返します。
ある文字列が、「""」かどうか判定するのに便利かなと。

[asp][VBscript]入門:IsNull()

変数がnullかどうかを確認するIsNull()ですが、これもちょっと注意。
下のソースでは、falseを返します。

<%
Dim aTest
%>

<%= IsNull(aTest) %>

では、次は、どうでしょう??

<%
Dim aTest
aTest = ""
%>

<%= IsNull(aTest) %>

実は、これ、falseを返します。

VbScriptでは、「""」をnullとは違うものとわけているようで、どーすれば、trueを返すかというと、

<%
Dim aTest
aTest = Null
%>

<%= IsNull(aTest) %>

とブール値をセットすることで、trueを返します。

ってことは、「""」の場合の判定方法は??

それについては、次の日記に書きたいと思います。

2008/08/07

[asp][VBscript]入門:IsEmpty()

VBScript の変数の扱いを参考にすると、Dimで変数宣言を行っただけで、まだ値をセットしていない場合、変数の値は「Empty」という特殊な値になるようです。

で、Emptyかどうか確認するためには、IsEmpty(変数名)でtrueを返せば、まだ値がセットされていなくて、falseの場合は、セットされたことになります。

以上から

<%
Dim aTest
%>

<%= IsEmpty(aTest) %>

は、trueを表示します。

では、次は??

<%
Dim aTest
aTest = ""
%>

<%= IsEmpty(aTest) %>

一見、trueを返しそうですが、実は、falseを返します。

変数宣言した後に、""をセットしているので、変数には、空がセットされているとファンクションが認識するようです。

IsEmpty関数を使う時に注意です。

また、再度、Empty値に戻したい場合は、

aTest = Empty

でいけるみたいです。

[asp][VBscript]入門:変数宣言

まずは、タイトル通り、宣言方法から。
.aspファイル内において、asp言語を明記したい場合、
「<% ・・・処理・・・>」

そこで、変数宣言は、

<%
Dim hoge
hoge = "Hello World"
%>

と書き、これを出力したい場合、

<%= hoge %>

でいけるみたいです。

[asp][VBscript]そもそもapsって??

久しぶりにaspに触る機会があったので。
「そもそも、aspってなんだよ??」という疑問が生じたのでちょっとぐぐってみることに

動的にWebページを生成するWebサーバの拡張機能の一つ。
 通常はWebブラウザに渡されてから処理されるJavaScriptやVBScriptなどで記述されたスクリプトをサーバ側で処理し、処理結果のみをブラウザに送信する。
 Microsoft社のWebサーバであるIISで利用できる。ブラウザからデータを受け取ってファイルに記録したり、データベースと連携した動的なWebページを作成したりすることができる。

via:IT用語辞典:ASP

ということは、ColdFusionみたいにサーバーで処理してくれる言語なんですね!!

しかもブラウザで動くJavaScriptやVBscriptをサーバーで処理してくれるなんて。
便利じゃん!!

でもまたここで、新たな疑問が。。。

実は、Vbscriptって何かわからない。
正確には、言葉だけ知っているので、これを機会に勢いよく、ぐぐってみる。

Microsoft社によって開発されたスクリプト言語(簡易プログラミング言語)。同社のWebブラウザであるInternet Explorer上で動作する。同社のプログラミング言語Visual Basicのサブセット(簡易版)になっており、さまざまな制限が加えられている。

via:IT用語辞典:VBScript

JavaScriptのようにスクリプト言語であることはわかったぞ。
だけど、上の文章を読んで気になるところがあって、IE上で稼動するって、firefoxでは動かないのかな??
しかも、IISって。。。apache上では稼動しないってことになるのかな??

うーん、なぞ!?
でも、あまり気にならないけど。

wikipediaを読んだら、PHPの人気によって、サーバーサイド言語としては人気が落ちていく的なことが書いてあったんだけど。

確かに、今、PHPの人気すげぇーもんなー。

言葉の意味がわかったので、すっきりしましたヾ(=^▽^=)ノ

2008/08/06

[JavaScript]window.close()に関する挙動!!

完全に再現したわけではないのですが、下記のようなプログラムがありました。

<cfprocessingdirective pageEncoding="utf-8" />
<html>
<head>
<script type="text/javascript">
function lf_Run(){
var flg = 0;
<cfif IsDefined("Form.flg1")>
flg = 1;
</cfif>
if(flg == 0){
alert(flg + "です。");
}else if(flg == 1){
window.close();
}
alert("hoge");
document.Frm.submit();
}
</script>
</head>
<body>
<form name="Frm" action="" method="post">
<input type="button" value="Run" onclick="lf_Run()">
<input type="hidden" name="flg1" value="1">
<cfif IsDefined("Form.flg1")>
<input type="hidden" name="flg2" value="2">
</cfif>
</form>
<cfoutput>
<cfif IsDefined("Form.flg1")>#Form.flg1#</cfif>
<br>
<cfif IsDefined("Form.flg2")>#Form.flg2#</cfif>
</cfoutput>
</body>
</html>

おそらくこのプログラムを作った作者が考えた処理フローはこのような感じだと思います。

1回目のボタン押下時
a:アラートで「0です」が表示
b:アラートで「hoge」が表示
c:画面に1が表示される

2回目のボタン押下時
画面を閉じる
処理終了

ですが、いざ、実行してみると以下の処理となります(検証済み)

1回目のボタン押下時
a:アラートで「0です」が表示
b:画面に1が表示される

2回目のボタン押下時
a:「ウィンドウを閉じますか?」というメッセージが表示される
b:「はい」を選択した後、アラートで「hoge」が表示
c:画面に2が表示される

処理終了

と実際には、画面が閉じないんですね。

一見、window.close()で処理が終了しそうなのですが、returnをしているわけではないので、処理は進んでいきます。

したがって、上のプログラムは、このように書き換えるのがいいかなと思います。

function lf_Run(){
var flg = 0;
<cfif IsDefined("Form.flg1")>
flg = 1;
</cfif>
if(flg == 0){
alert(flg + "です。");
}else if(flg == 1){
window.close();
//returnを追加
return;
}
alert("hoge");
document.Frm.submit();
}

これだと確かに、2が表示されずに、画面が閉じます(検証済み)
処理を終了したい場合は、明示的にreturnを入れることを心がけたいです。

[思い出]デニーズのカツどんがおいしい

今、さっき、デニーズでカツどんを食べました。

子供の時から、ガストやバーミヤンなどによくつれて行ってくれて、がっつがつ、がっつがつ食べていたのですが、そんなファミレス史の中で、妻と付き合って一番、変わったのが、朝、デニーズで、ご飯を食べるようになったこと。

子供のときから、ファミレスで朝食をとることは、ものすごく贅沢なことだと思い込んでいた者としては、朝デニは、まさに夢のまた夢。

最初、朝デニをしたとき、ものすごく興奮しましたー♪

高いんじゃーないのかなーとメニューをおそるおそる拝んでみたら、夜や昼間よりも全然、安くて、今はどうかわかりませんが、少し前までドリンク飲み放題で胃がブカブカになるほど飲んでました。

で、タイトルと全然、違うことを書いちゃいましたが、デニーズのカツどん、おしいしいです♪

値段の割には、ものすごいボリューム感で、8割りぐらい食ったところで、ものすごくお腹がいっぱいになります。

朝デニを経験してから、夜や昼にデニーズに行くと、ご飯高いなーと思うようになって、敬遠しがちになってしまったのですが、そんな中、カツどんはやはり、いけると思う。

最初、今日こそは違うものと思いサンドイッチにしようかと悩みましたが、同じぐらいの値段ならと、いつもどおり頼んでしまった、カツどん。

あのボリューム感、そして、お味噌汁、う~~~最高のコンビネーション!!

2008/08/05

[ColdFusion][OpenID]取得したXRDSについて

おととい、Yadisプロトコルを利用して、XRDSを取得できたことを書きました。

今日は、その続きから、さっそくファイルを開いてみると

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
    xmlns:xrds="xri://$xrds"
    xmlns:openid="http://openid.net/xmlns/1.0"
    xmlns="xri://$xrd*($v*2.0)">
  <XRD>
    <Service priority="0">
      <Type>http://specs.openid.net/auth/2.0/server</Type>
      <URI>https://open.login.yahooapis.jp/openid/op/auth</URI>
    </Service>
  </XRD>
</xrds:XRDS>

となってました。URIタグの中にあるテキストが、OP Endpoint URLなんですけど、OP Endpoint URLとは

エンドユーザが指定した識別子(User-Supplied Identifier)に対し行った発見行為(Discovery)で得たOpenID認証プロトコルのメッセージを容認するURLを示す。
この値は必ず完全なHTTPかHTTPS URLでなくてはならない。

via:OpenID Authentication 2.0

とつまり、OpenIDを使ってエンドユーザーログインするページのことだと判断しました。

OP Endpoint URLを使って間接通信を行おうと思います。

あと、ColdFusionでXMLをパースして、タグの直下にあるテキストを取得したい場合、XRDSを例にとると、

<cfset RetXML = XmlParse(cfhttp.fileContent)>
<cfset ReqUrl = RetXML.xrds.XRD.Service.URI.XMLText>

と最後に、XMLTextを書くのがポイント。

これを忘れてしまうとタグまで取得してしまい、思わぬところで、ハマルところになります。
(というかハマリました)

なので、注意したいっすね。

2008/08/04

[思い出]クリスピー・クリーム・ドーナッツに行きました

ずーと、ずーと行きたかった、あのクリスピー・クリーム・ドーナッツに行ってきました。

超人気のあるドーナツ屋で、新宿で、2時間待ち、有楽町でも2時間待ちと、超混みこみの状態で、妻の情報で、渋谷店は、そんなに混んでないということを聞いて、これはいかなくちゃと勢いで行ってきました。

確かに、渋谷店は、土曜日に行ったのにもかかわらず、30分程度でゲットすることができました。

Photobucket

Photobucket
(写りが悪いのですが。。。)

超おいしそうな、ドーナッツがいっぱいあって、すっげー悩みました。

しかも、並んでいるときに、プレーンのドーナッツをタダでもらって、なんだか得した気分。

結局、ミスオのオールドファッションみたいなドーナッツと、ドーナッツの中にキューイとヨーグルトがジャムみたいになっているものを買いました。(今、調べたら、それぞれ、トラディショナル・ケーキとストライプ・キウイ・ヨーグルトって書いてありました)

ものすごくおいしかったですー♪

ドーナッツがおいしいだけでなく、コーヒーも結構、いけるんですよぉー。

今度、また、いきたいなー。

きっと、12個入りの箱で買うんだろうなー。
メタボ確実です。

2008/08/03

[OpenId]日本語訳あるじゃん

OpenID 2.0の仕様書の日本語版がありました。

これで苦労しなくてすみそー。

2008/08/02

[ColdFusion][OpenId]YadisプロトコルでXRDSを取得

今日は、何から書いていいのか。。。

ものすごく悩みまくって、ようやくここまでたどり着きました。

結論からいうと、ColdFusionを使って、Yahooが発行しているXRDSの位置を突き止める方法がわかったのです。

あまりにも悩みすぎて、どういう順序でここまできたのか、すべて思いだせないのですが、思いだせる範囲で書いていきます。

昨日の話とかぶりますが、yahooでゲットできるOpenIdを使って認証するログイン画面を、今、作ろうとしています。

で、ログイン方法は、OpenId 2.0に準拠した方法でログインできるところまで、書きました。

そこで、具体的にどうやってログイン方法を実装するか、色々と調べました。

ひたすらぐぐったのですが、全然、ColdFusionを使った実装方法が見つりませんでした。

唯一見つかったのはCFOpenIDにあるプログラムで、ダウンロードして使えばいけるのかなと思ったのですが、ダメでした。

というのも、このプログラムを使った認証方法は、OpenId 1.1に準拠した方法なので、ダメだったのです。

そこで、ColdFusionでぐぐってもラチがあかないなと思い、そもそも、「OpenIdとはなんぞや??」というところからスタートしたほうがいいかなと思い、@マークItのOpenIDの仕様と技術とgihyo.jpのいますぐ使えるOpenIdを読みました。

読んだのはいいのですが、肝心の実装方法が、それぞれ、PerlとRubyで書かれていたため、基本的な用語しか理解できず、最終的に、OpenId.netのOpenID Authentication 2.0 - Finalも合わせて読んでいきました。

と読んでいくうちに、どうやら、Yadisプロトコルを使ってEndpoint URLをゲットすればいいことがわかりました。

yahooのデベロッパーサイトにも、そのことについて書かれています。

ってことは、Yadisを使ってEndpoint URLをゲットすれば、とりあえず少しは前進できるのかなと思いました。

この段階で、Yadisプロトコルは、http通信を使えばおそらくできるのではないのかなーという推測がありました。

案の定、Yadisの仕様書(html版)を見てみると、Yadis IDにhttpリクエストをgetで送ると、XRDSをゲットできることがわかりました。

でも、Yadis IDってなんぞや??
そう思いながら、仕様書を読んでいくと、どうやらhttpかhttpsで始まるurlであることがわかりました。

urlであることはわかったのですが、果たして、どこのurlなのでしょうか?

この段階で、yahooのデベロッパーページを見てみると、特定のurlの記載がなかったので、おそらく「http://www.yahoo.co.jp」だろうなーと推測して、色々と調べてみたら、案の定、ビンゴでした。

id:lopnorさん(超感謝です)の OpenID2 つうか Yadis はじめましたの記事で、yahoo.comにhttpリクエストを送った結果が表に書かれていて、その中に、なんと、なんと、「X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
」という文字があったのです。

これで推測が正しいことが判明し、後は、cfhttpタグでyahoo.co.jpにhttpリクエストのgetメソッドで送ればいいんだなーということがわかりました。

というわけで、ここまでを総合して、以下、ソースです。

<cfprocessingdirective pageencoding="utf-8">
<cfhttp url="http://www.yahoo.co.jp"
method="get"
redirect="no"
/>
<cfoutput>
<cfset keyToArray = StructKeyArray(cfhttp.responseHeader)>
<table>
 <tr><td>responseHeader</td><td>value</td></tr>
 <cfloop index="i" from="1" to="#ArrayLen(keyToArray)#">
  <tr><td>#keyToArray[i]#</td><td>#cfhttp.responseHeader[Evaluate("keyToArray[i]")]#</td></tr>
 </cfloop>
</table>
</cfoutput>

で、返ってきた結果(レスポンス)の一部は、こちらです。
Photobucket
これで、Yadisプロトコルも怖くないぞと。

ゲットしたXRDSについては、今度、書きたいと思います。

2008/08/01

[Mashup Awards][OpenId]yahoo IDを使う

マッシュアップの一つに、yahoo IDを認証するサービスを利用しようかなと考えているのですが、yahoo IDは、OpenID 2.0に対応しているらしく、Open IDと同じ認証方法でログインページを作成できるみたいです。

果たして、ColdFusionを使ってどうやって作ればいいのだろうか??