2008/10/04

[life hack]読み書きそろばんの重要性

とても重要なことだと思ったので、一つの記事として書きました。

小野さんのブログプログラマーにとっての読み書きそろばんという記事を読みました。

プログラムにも読み書きそろばんに相当するものがあることが書かれていたのですが、その中で、

ある程度習熟したプログラマーであれば、どんな人が書いたコードでも
相手に合わせて読むことができるし、
どんな複雑なフレームワークから構成されるソースコード群でも、
すらすらと読んで理解してしまうものである。

逆に、そう簡単には人のコードを悪く言わない人が
「これは使い物にならない」という時の重みには、相当のものがある。

via:1. 読み

と書かれていて、普段、他の人が作ったソースを読んだ時に、すぐに「気持ち悪い」とか、「使い物にならない」とか、言わない性分なのですが(というか、言う余裕もないほど、てんぱっているため、まさに、ブログのタイトル通り)、一つのシステムだけ、「うわ、ぐしゃぐしゃだ」と言ってしまったことがあります。

その時、プログラムを作った先輩社員も「確かにぐちゃぐちゃだよ」と言って、納得したのですが、今回のエントリーを読んでみて、安易に言ってはいけないのだと思いました。

できるプログラマーになるためには、ソース内容も相手に合わせる形でないと。

さらに注意したいのが、この部分、

ある程度習熟したプログラマーであれば、どんな人が書いたコードでも
プログラミングにおける「そろばん」には、二つの種類があると思う。

一つは、論理的思考能力である。
たまに、「とりあえず動いたのでこの方法で行きます」とか、
「よくわからないけどこの箇所をコメントアウトすると動きます」
というような発言をする人がいるのだが、
このような対応は、一時的に問題を回避できたように見えて、
後でその何十倍もの重要な問題を引き起こす可能性が高い。

via:3. そろばん

とかくめんどくさがりなので、とりあえず頭の中で、「ここら辺を直せばいけるじゃーねー」的なことを考え、実際に、修正を行い、動作確認をある程度おこなった後、「やっぱりなおった」と言ってしまうことがあります。

これもよくないのかなーと。

小野さんのブログにも書かれていましたが、きちんと、「どうして、ここを修正すればいいのか?」というように、論理立て説明できるようにしておかないと、成長がストップしてしまうのではないかと思いました。

2008/10/03

[設計書]目次とフレーム

忘れないうちに書いておかないと。。。

ちょっと前から短期で派遣の方にきていただいたのが、設計書に関していくつかアイデアをもらいました。

1:目次を追加
2:フレームを追加

1は設計書内に追加します。
目次があることで、最初にある程度の概要をつかめるようになるとのこと。

確かに、一般的に売られている書籍を考えるとタイトルに次に目次がくるのが当たり前で(前書き等の例外を除きますが)それに気づきもしなかったのがやばいことなのかと。
2は一般的に左側になると思うのですが、パワポとかでプレゼン資料を作る時に、左側に目次見たいのが、ずらずらーと並ぶのですが、それをクリックすると該当するページに飛ぶことができるんですよね。
これがあると長い設計書のときに便利なのではないかと言っていました。

ちょっと調べてみると、word 2003から縮小表示と呼ばれる機能もあるので、これを使ってみるのもいいかもしれません。
参考サイト:見出しマップにサムネイル表示をするには-Word2003・2007(インストラクターのネタ帳より)

▼操作方法:縮小表示を行う

※Word 2003の場合
メニュー[表示]
 -[縮小表示]をクリックしてチェックマークをつける

※Word 2007の場合
[表示]タブ
 -[表示/非表示]グループ-[縮小表示]チェックボックスをOnにする

via:見出しマップにサムネイル表示をするには-Word2003・2007

リバースエンジニアリングをして、ろくに設計書を読まずに、いきなりプログラムを見るのが常になってくると、ドキュメントに対するおもてなしが抜け落ちてしまうので、意識して作成したいと思いました。

2008/10/02

[思い出]元同期とラーメン会

かれこれもう1ヶ月ぐらい前になってしまいましたが、元同期のT.sato君と池袋の無敵家と東方見聞録で飲み会(2人ですが)を開催しました。

久しぶりに友達と飲んだのでものすごーく楽しかったです。
(また飲みにいきたいっすね)

色々な話をしましたが、一番、痛感したのは、Javaの重要性。

普段、業務で使わないので、ここら辺できちんと勉強したほうがいいのではないかと。

に加えてエクリプスを使って開発を行う重要性。

テキスト編集ソフトで直打ちでしか、Javaのプログラムを組んだことがないので、IDEを使った開発の重要性を聞いた気がします。

残りの半分以上は、し~もね~た~だったような気がしますが。。。(味の話が強烈だった)

2008/10/01

[coldfusion]本を出版したい

総決算として、これさえあればCFマスター、みたいな本を書きたい。
あわよくば英語版も書きたい。

そろそろ違う言語もやらないとまずいかなと

2008/09/30

[coldfusion]ここがダメだよ、coldfusion その3

<cfscript>内で、変数宣言をする際に、varを使ってエラーなる場合と、ならない場合がある。

下の場合は、エラーになる。


<cfscript>
var hoge = "";
</cfscript>


だけど、これはエラーにならない

<cffunction name="foo">
<cfscript>
var hoge = "";
</cfscript>
</cffunction>

つまり、cffunction内でcfscriptを使う場合は、varを使ってもオッケーなんですね。

しかも、cffunction内では、varを使わなくても変数宣言を行うことができるんですよ。

この中途半端さどうにかしてほしい。
せめて、一個目の例でも、varを宣言できるようにしてほしいかなと思います。

2008/09/29

[思い出]新婚旅行終了

先ほど、家に到着!!

超おもしろかったな~♪

次、どこに行こうかと妻と話あっています。

本当に海外って楽しいですね

2008/09/21

[思い出]明日から新婚旅行

に行ってきます。

プラハ→ウィーン→ブラペスト

に行ってきます。

パソをもっていかないので、一週間ほど、ブログの更新ができないので、よろしくお願いします。

2008/09/20

[coldfusion]ここがダメだよ、coldfusion その2

CPANのような盛り上がったコミュニティがない

2008/09/19

[coldfusion]ここがダメだよ、coldfusion その1

ちょっと前に放送されていた「ここが変だよ日本人」にあやかって。

まずは、ずーといいたかったのがこれ

ラムダがない

2008/09/18

[思い出][カメラ]カメラ購入、Nikon CoolPix s52

前々からずーとほしかった、カメラを購入。

ずばり、ニコンのCool Pix!!


だいぶ前に、サイバーバズのイベントでS50を貸していただいて、その時、超感銘を受けたシリーズです。

このカメラで便利なのは、なんと言っても、撮影の際に、連射しながら、その中で、一番いい写真をセレクトしてくれるBSS(ベストショットセレクター)機能があること。

撮影するときに、手振れしまくる自分としては、一番いい写真を自動でセレクトしてくれるので、すっげー便利だし、写りもいい。

おととし、借りといてよかったー♪
借りてたとき、人生で初めてデジカメで撮影してよかったなぁーと思っていたもんなー。
なんど、「ちょーだい」と交渉したことだか。

ヨドバシの店員さんいわく、新たらしいエンジンを積んでいるため、s50よりもいいはずと言っていました。

しかも、価格が20000円代と、超手ごろ。
元々、35000円ぐらいだったのが、値崩れを起こしたらしい。

あと、撮るとき、毎回、毎回、ケースから取り出すのは、メンドイので、首から下げられるストラップも勢いで購入


これで、わずらわしくなく撮影できるぞ。
上は、黄色ですが、紫色を買いました(妻セレクト)。

紫派手だと思うんだけど、カメラの色(ゴールド)を考えると、合っているとのこと。

最近、妻に自分の着る服を選んでもらっている状況なので、いいのかなと思ったりもするのだが、それにしてもやっぱ派手だと思います。(今、寝ている妻に突っ込み)

さらに、SDメモリーカードも購入。

色々なメーカーがあったのですが、日本製がいいかなと思い、パナソニックにしました。

店員さんは、読み取りの早さを売りにしていましたが、早さよりも、確実性をとりたかったので、あえて遅いほうにしました。

いくら早くてもバグったらたまんないし。

あと、毎回、毎回、気になるのですが、デジカメとか、デジタルビデオに付属しているCD。

媒体から直接パソコンに繋げるときに、絶対にインストールしなくてはいけなくて、インストールする度に、パソコンに容量も食うし、手間もかかるから、メモリーカードから直接、パソコンに繋げられるものはないかなーと思ったら、やっぱあった。

digioのカードリーダーなのですが、ロアスのCRW-SD38を購入。

USB経由で直接、メモリのやり取りができるので、CDをインストールする必要がないのかなと。
(やはりUSBであった。)

しかも、windows OSのみならず、mac osにも対応しているところが素晴らしい。
絶対使わないと思うのだが、一応、妻に色を選んばせたら、ピンクになってしまった。
一人で持ち運ぶにはちょっとした勇気が必要かもしれない。

あと、5年間保障もつけたので、1000円ちょっと追加で払いました。

ここまで買っても、30000円を余裕できる程度で済んでしまう。
ホント安いよなー。
ちょっと前まで、デジカメ激高のイメージがあったんだけど。

便利な世の中になったものです。

2008/09/17

[tabetter]このアイデアは既に存在していた

前回、[Tabetter]マッシュアップサイトTabetterを作りましたで、tabetterを作ったことを書きました。

ですが、ちょ、ちょ、すっげーびっくりしました。
ブクマから、表示するのが、メンドイので、ぐぐってページをオープンしようと思ったら、驚愕の事実が、

自分のステータス(いま何をしている?)を投稿しているので、それも必然だと思うのですが、

だったら「Tabetter(食べったー)」があってもいいはず!

via:食べたものを投稿する「Tabetter」

え!!ひょっとして、もう既にそんなサービスがあったの??
と驚きつつも悲しくもなりつつ、先を読んでいくと、

追記:これはネタでございます。


via:食べたものを投稿する「Tabetter」



ネタだったのか~。

今度から、webサービスを作る場合は、既に存在しているかどうか、ぐぐって調べてみないとダメだな。

ちなみに、今回のtabetterは、名前をぱくっていません。
いくら言っても後の祭りかもしれないけど。。。

一ついえるのは、目の付け所はよかったのかなーと。
すでに一年以上の前の記事ですが、いまだ、そのようなサイトが存在せず、構築することができたのだから。

あと、正確にnetafullさんの意図しているサービスではないかもしれません。

でも、それはそれで、どうすれば実現できるのか?とか、よりよくするにはどうすれば?と考えれば建設的になれるはず。

今回、作ってよかったなーと思いました。
(でも、本当に驚きました。ネタでよかった)

2008/09/16

[scheme]nilのバグ解消!!

やっとこさ、マッシュアップアワードが終了したので、schemeに取り掛かることに。

前回、[scheme]nilでバグが発生で、Takahiroさんから、fix方法を教えていただいたので、バグをfixしました。

Photobucket

上のように、「nil」の代わりに、「'()」と空文字を使いました。

実行結果は、下になりました。

Photobucket

確かに、実行できました。

さらに、変数として「nil」を定義する方法も教えていただきました。

Photobucket

プリミティブなプロシージャ(この場合、nilをプロシージャを解釈)自体、上書きしてしまうのは、schemeならわでなのかなと。(Javaでプリミティブなクラスを上書きしたりしますが、オブジェクト指向言語ということで、別ものとして解釈)

この場合も、実行した結果、
Photobucket

を得ました。

一人で考えるのも重要なのですが、こうしてブログに書くことで、より多くの人の意見を聞くことができるので、ものすごく貴重です。

2008/09/15

[Tabetter]作品応募完了

なんとかマッシュアップアワードに締め切りに間に合うことができました。

結果、どうなるんだろうー。。。

せっかちなので、早く知りたくなるなぁ。

今年は、運がいいので、ミラクルがおきればいいなと。

[Mashup Awards]いよいよ明日

締め切りは、明日ダー。。。

うーん、間に合うかー???

2008/09/14

[oracle]ORA-06508について

プロシージャーやファンクションを実行の際に、内部で、ストアドを使っている場合、コール先がinvalidだとORA-06508が発生する可能性がある。

2008/09/13

[OpenID]いい記事~♪

ぐぐったらたまたま見つけました。

OpenID認証2.0~概論

いい記事なので、OpenIDを勉強したい方にお勧め!!

後、ここのpdfファイルもよかったです。

2008/09/12

[JavaScript]文字数カウントの修正

前回、[javascript]文字数カウント like twitterで、T.Sato君からいろいろ教えてもらったので、処理を追加してみることに。

<div id="test">150</div>
<textarea type="text"
style="height:50px;overflow-y:auto;"
id="hoge"
onKeyUp="lf_ValueCount();"
onClick="lf_ValueCount();"
onChange="lf_ValueCount();"
cols="40"></textarea>
<script type="text/javascript">
function $(aId){return document.getElementById(aId);}

function lf_ValueCount(){
if(150 - $("hoge").value.length < 0){
return $("test").innerHTML="文字数オーバー";
}
return $("test").innerHTML = 150 - $("hoge").value.length;
}

</script>

onClickは、全角で入力した後、マウスをクリックしたときに、計算されない不具合で追加と、onChangeはコピペ対応

これでどうだ!!
文字数:
150




やはりブログで書くとこうして指摘してくれるので大変ありがたい。

一人でやっても必ず抜けが発生する(納期が短いとなおさら)と考えているので、そういった意味でブログの力はすごいなと改めて実感。

2008/09/11

[Tabetter]マッシュアップサイトTabetterを作りました

今、自分がやっていることを一言で語るミニブログサービスTwitterというサイトがあります。

これにあやかって「どこのレストラン・飲み屋で過ごした」ということを一言で、表現するTabetterを作成しました。

マッシュアップコンテストの作品として、今回作ったのですが、Yahoo OpenIDとぐるなびAPIを採用しました。

細かい使い方は、後のエントリーで書けたらと思いますが、とにかく使いやすさ、わかりやすさを心がけて作成。

一番の便利な点は、サイトにログインするのに、パスワードとログイン名を登録しないこと。

従来、サイト毎に、パスワードやらIDとかを登録しなくてはいけなかったのですが、OpenIDを採用したので、Yahooにログインすれば、Tabetter側で一切登録をしなくてすみます。
(サイト内で使う、ニックネームを登録する必要はあるのですが。。。)

InternetExploerer6で動作確認済みで、YahooのIDをお持ちの方は、どなたでも遊ぶことができます。

もちろん無料でぇーす♪

お時間のある時に、是非、お試しください。

2009年9月17日追記
NETAFULLさんのブログに、食べたものを投稿する「Tabetter」というエントリーで、似たようなサービスがネタで掲載されていました。

ぱくってないっすよ。

2008/09/10

[思い出]狩野 英孝を生で見る

この前の日曜。池袋のサンシャインで狩野 英孝がイベントをやっていました。

ものすごくおもしろかったです。

生のイベントでも自分に向けて写真を撮っていました。

ラーメン、つけ麺、ぼくいけめ~~~ん♪

2008/09/09

[javascript]文字数カウント like twitter

マッシュアップの作品で、twitterのような文字カウントを実装したいなと思ってぐぐったら鷹の島さん入力文字数の制限を可視化する JavaScriptという記事に実装方法が書かれていました。

が、しかし、確かに、実装方法は書いてありましたが、prototype.jsを使うらしく、使い方を完璧に把握してないので、自作できないものかと考えてみました。

<div id="test">150</div>
<textarea type="text"
style="height:50px;overflow-y:auto;"
id="hoge"
onKeyUp="lf_ValueCount();"
cols="40"></textarea>
<script type="text/javascript">
function $(aId){return document.getElementById(aId);}

function lf_ValueCount(){
if(150 - $("hoge").value.length < 0){
return $("test").innerHTML="文字数オーバー";
}
return $("test").innerHTML = 150 - $("hoge").value.length;
}

</script>

リンク先のソースよりも単純になったと思うのですが、逆に不安になってしまう。
一応動作確認を行って問題なさそうだったんだけど。。。

もし見つかったらコメントいただけたらと思います。
文字数:
150


2008/09/08

[mysql] limit like oracle 's rownum

今、マッシュアップコンテストに備えて猛烈な勢いでアプリを開発中!!
しかも、今回、現場で使っているoracleではなく、mysqlなので、全然慣れずに悪戦苦闘しています。

hetemlでDBのブラウザーを用意してくれているので、それを使ってデータをselectしているのですが、その際に、sql文も一緒にでてくるのですが、select文で


select ・・・・ limit・・・


ん??

limit

limitって何ぞや??
と思ったので、リファレンスで調べることに。

おそらくoracleでいうところの、rownumにあたるのではないのかなーと思ったら、案の定ビンゴ!!

でも、正確にいうと同じではないので、≒ぐらいかなと。

LIMIT 節を使用すると、SELECT ステートメントで返されるレコード数を制限することができる。LIMIT は 1 つまたは 2 つの数値引数を取る。これらの引数は整数定数でなければならない。

引数が 1 つの場合、その値は、戻り値として返す、結果セットの冒頭からのレコード数を表す。 引数が 2 つの場合、最初の引数は戻り値として返す最初のレコードまでのオフセットを表し、2 つ目の引数は戻り値として返す最大レコード数を表す。最初のレコードのオフセット値は 0(1 ではない)。

PostgreSQL との互換性を確保するため、MySQL では LIMIT row_count OFFSET offset 構文もサポートしている。

mysql> SELECT * FROM table LIMIT 5,10; # Retrieve rows 6-15
特定のオフセット位置から結果セットの終わりまでのすべてのレコードを取り出すには、2 つ目のパラメータに大きな数値を指定できる。

mysql> SELECT * FROM table LIMIT 95,18446744073709551615; # Retrieve rows 96-last.
引数が 1 つの場合、その値は戻り値として返す最大レコード数を表す。

mysql> SELECT * FROM table LIMIT 5; # Retrieve first 5 rows
つまり、LIMIT n は LIMIT 0,n と指定するのと同じである。

via:6.4.1. SELECT 構文

2008/09/07

[html]imgタグで画像の変更する場合

imgタグを使って画像を表示するときに、そのまま表示するのではなく、大きさを変更させたい場合、どうするのかなーと思い、とほほのimgタグを調べたら、widthとheight属性で変更できたのね。

2008/09/06

[ColdFusion]クッキー変数の削除

クッキー変数を、ページ内で削除したかったので調べました。

< cfcookie name="hoge" value="" expires="now" >

でいけるはず!!

2008/09/05

[coldfusion]リファラーチェック

リンク元を参照したい場合、cgi構造体から取得することができます。

cgi.HTTP_REFERER

上の変数で注意したいのは、直接アドレスを指定して、表示した場合、cgi.HTTP_REFERER = ""となってしまうところ。

なので、cfif IsDefined("cgi.HTTP_REFERER") eq falseで先の処理を書いたとした場合、直接アドレス指定の場合、変数自体は宣言されているので、IsDefined()がtrueを返し処理が実行されません。

<!--- 直接アドレス指定の時だけ、処理したい(実際は、処理されることはない) --->
< cfif IsDefined("cgi.HTTP_REFERER") eq false >

< cfelse >

< /cfif >

この場合、cfif IsDefined("cgi.HTTP_REFERER") eq "" とすることによって、直接アドレスを指定された場合の、処理を書くことができます。
<!--- 直接アドレス指定の時だけ、処理したい(実際に、処理される) --->
< cfif IsDefined("cgi.HTTP_REFERER") eq "" >

< cfelse >

< /cfif >

2008/09/04

[coldfusion]ブラウザ判定 その2

前回、ブラウザの表示方法について書きました。

今日は、それに基づいて、リクエストをしているブラウザの判定方法について書きたいと思います。

基本的には下でいけると思います。

<!-------------------------------------------
001:IE6
002:IE7
003:FireFox
999:others
--------------------------------------------->
<cfif Find("MSIE 6",cgi.HTTP_USER_AGENT) gt 0>
<cfreturn "001">
<cfelseif Find("MSIE 7",cgi.HTTP_USER_AGENT) gt 0>
<cfreturn "002">
<cfelseif Find("Firefox",cgi.HTTP_USER_AGENT) gt 0>
<cfreturn "003">
<cfelse>
<cfreturn "999">
</cfif>

対応しているブラウザが少ない気がしますが、当面、これで困らないと思うので、ここまでにしました。

あと、前回と違って、cgi構造体を使いました。

おそらくMacやケータイからでは999を返してしまい、役に立たない気がしますが、対応については、また今度、考えたいと思います。

[coldfusion]Session変数を削除する

リファレンスによるとこれでいけるはず!!

< cfset hoge = StructDelete(session,"foo") >

2008/09/03

[coldfusion]ブラウザの情報を画面表示

一般に、ColdFusionでデバック機能をonにしているときに、ブラウザ情報が表示されます。

Photobucket
そこで、サーバーサイドで、ブラウザの情報を取得できないかと調べました。

CF7ですが、リファレンスをみると、user_agent変数で表示することができそうです。

<cfoutput>#user_agent#</cfoutput>

実行すると、以下の情報が表示されました。

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; i-NavFourF; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

これを元にどのブラウザからコールされているのか判断の材料となりそうです。

[mysql]文字列結合

oracleで、文字列結合を表現するとき、

'hoge'||'foo'

と書くのですが、my sqlで文字列結合できないかなぁーと思って調べたらあった!!

・文字列結合は concat() を使用する。

select concat(123456, 789012);

+------------------------+
| concat(123456, 789012) |
+------------------------+
| 123456789012 |
+------------------------+

select concat('123456', 789012);

+--------------------------+
| concat('123456', 789012) |
+--------------------------+
| 123456789012 |
+--------------------------+

select concat('123456', '789012');

+----------------------------+
| concat('123456', '789012') |
+----------------------------+
| 123456789012 |
+----------------------------+

select concat(key1, data1) from testm;

+---------------------+
| concat(key1, data1) |
+---------------------+
| a0011 |
| a0111 |
| b00210 |
| c003100 |
+---------------------+

via:MySQL 編14 - 文字関数、連結、空白削除、置換、切出、検索、長さ、数値

というわけで、基本、concat(カラム名,カラム名)で結合してくれるみたいです。
カラム名が3つ以上になった場合、どうするんだろう??

===2008.09.05追記===
MySQLのリファレンスにないかなーと思って少し調べたら発見!!
6.3.2. 文字列関数

・CONCAT(str1,str2,...)
引数を連結した結果の文字列を返す。いずれかの引数が NULL のときは NULL を返す。3 つ以上の引数の指定が可能。 数値型の引数は同等の文字列形式に変換される。

mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'

via:・CONCAT(str1,str2,...)

2008/09/02

[javascript]半角英数字チェック

ちょっと必要になったので、調べてみました。

正規表現を使った方が楽では?
function StrCheck(strSrc)
{
return /^[a-zA-Z0-9]+$/.test(strSrc);
}

via:JavaScriptで半角英数字チェック

上のチェック方法でもよかったのですが、いまいち納得ができなかったので、下を参考にしました。

/* 半角英文字チェック */
function AlphabetCheck() {
var str = document.iform.EnglishText.value;
if( str.match( /[^A-Za-z\s.-]+/ ) ){
alert("英語名は、半角英文字のみで入力して下さい。");
return 1;
}
return 0;
}
/* 半角数字チェック */
function NumberCheck() {
var str = document.iform.AgeText.value;
if( str.match( /[^0-9]+/ ) ){
alert("年齢は、半角数字のみで入力して下さい。");
return 1;
}
return 0;
}

via:タイトルを入力

で、これだと関数が別になっているので、少し変更しました。

function gf_Hankaku(aVal){
if(aVal.match(/[^0-9A-Za-z]+/) == null){
return true;
}else{
return false;
}
}

上のファンクションは、引数が半角英数字の場合、trueを返し、それ以外が入力された場合、falseを返します。

同サイトによると[0-9]は、0~9の文字で、[a-z]は、小文字のa~z、[A-Z]は、大文字のA~Zまでのことを表現するみたいです。

さらに、[^]は後ろに続く文字以外を表現するそうなので、[^0-9A-Za-z]と書くことができて、「+」の記号ですが、ここのサイトを参考にすると、直前の文字が最低一個ないといけないということです。

なんとかかんとか、作成することができました。

正  規  表  現|おー+い
----------------------------------------------------
検索できる文字列の例|おーい おーーい おーーーーい

via:サルにもわかる正規表現入門

2008/09/01

[oracle]10gのJ2SEのバージョンは、1.4

前回、oracle9iは、JDKのバージョンが1.3.1と書いたのですが、10gは、ここの「Oracle Database 10gにおけるJava DB、JDBCおよびDatabase Web Servicesの新機能」を参考にすると、J2SEのバージョン1.4をサポートしていると書かれていたので、J2SDKもバージョン1.4がoracleにインストールされているのかもしれません。

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を使ってどうやって作ればいいのだろうか??