2008/09/01

安西先生、お金が欲しいです。 [ 書籍 ]

はい、久しぶりですが技術とは無関係の話です。

先週末、maitoさんと池袋でラーメンを食らった後に
軽く酒を飲みながら下らない話に花を咲かせていたのですが、
その時話にあげた本をこちらで紹介しておきます。

お金は銀行に預けるな

なかなかタイトルからしてショッキングな感じですね。
俺めっちゃ預けてますが。
簡単に内容を紹介すると、ただ預けて寝かせっぱなしにしている
お金があるなら、銀行に預けるんじゃなくて効率的に投資・運用
していきましょう・・・みたいな内容です。初心者向けに最初は
こういう感じでやってみては? ってのも紹介されてます。

うーん……今まで経済とかぜんぜん興味なかったからなぁ。
そろそろ軽くお金突っ込んで強制的に興味を持たせるべきですかねー?

2008/08/08

JSTLのfmtタグの不思議 [ Java, JSTL ]

うっへー。滅茶苦茶あいだが空いてしまいました。
プロジェクトいそがしめとはいえわれながらものぐさです。
maitoさんを見習いたいですね。勿論性的な意味で。

さて、今日は題名のJSTLのfmtタグについて。
fmtタグはフォーマットタグ(そのまんま)でして、数字や
日付等のフォーマットをしてレンダリングしてくれるのですが……
現プロジェクトで問題が発生しました。具体的には

<fmt:formatdate value="${[日付の値]}" pattern="yyyy/MM/dd" />

このように使うのですが、なぜかこれがDoCoMo端末だけ動かない。
動かないというか表記が

Tue Jul 15 18:03:41 GMT+09:00 2008

こんな感じになりやがります。なぜDoCoMoだけ?!
で、色々調べてみた所どうやらロケール情報が正しく設定されていないと
ダメらしい。通常はロケール情報はリクエストのヘッダにあるのでこれを
見に行っているようなのですが、携帯等の場合でこれがないと……
今回のようになるようです。

で、対応策。同じくfmtタグのsetLocaleタグを使って明示的に
ロケールをセッティングします。


<fmt:setlocale value="ja-JP" />

こんな感じです。ただベタ書きでja-JPって書くのは怖いんでここは
よきに計らってくださいといった感じ。

しかし携帯って怖いですわーこりゃ・・・。

2008/06/20

ミリオン目指す炎の狐 [ FireFox ]

うー、仕事がだいぶ忙しかったのを言い訳に
相当サボってました。という訳で久しぶりのトピック……

ですが今日は今ホットな話題、FireFox3について。
なにやら24時間でのDL数でギネス申請するとか。
ふぉく助(きつね)もかわいらしいので是非頑張って欲しいです。

さて、僕は我が家でも職場でもFireFox使ってるんですが
二つの理由でFireFox3の導入を迷ってました。

1.FireFoxの要、プラグインが非対応の物が多い
これはそのまんま。リリースしたばかりなので便利なプラグイン
があまり対応してない・・・・・・
確かにFireFox3はとても早いのでAjaxバリバリなページ(Gmailとか
RememberTheMilkとか?)では便利なのですがやはり物足りない。

2.クロスブラウザ的な不安
これは職場限定なのですが、ブラウザのVersionUpにより挙動が
変わられると色々困る。

上記二点の理由から、
『そうだ、両方いれればいいじゃん』
という風に思いつくのは至極当然……という訳で今日はFireFox2&3の
共存方法について。

まず手順だけ書いておくと、

1.FireFox3(以下3)をダウンロードし、FireFox2(以下2)を終了します。
2.2のショートカットを作成し、プロパティを開きます。
3.プロパティの"リンク元"の末尾に、半角スペース+'-p default -no-remote'と
 入力し、OKをクリックします。
4.スタートメニューより、ファイル名を指定して実行をクリックします
5.'firefox -createprofile firefox3(ここは任意の名称で可)'と入力しエンターを押します。
 何も処理が行われていないように見えますが、ここはこれでOKです。
6.3をインストールします。インストール方法はカスタムを選び、2のパスとかぶらないように。
 また「FireFoxを既定のブラウザに~(略)」のチェックは外します。
7.ショートカットを作成の画面では全部チェックを外しておきます。
8.インストールを行い、終了後の「今すぐFireFoxを起動」のチェックを外し完了します。
9.3をインストールしたフォルダを開き、3のfirefox.exeのショートカットを適当な所に作ります。
10.9で作成したショートカットのプロパティを開きます。
11.プロパティの"リンク元"の末尾に、半角スペース+'-p firefox3(5で設定した任意の名称)
  -no-remote'と入力しエンターを押します。

以上の操作により、作成したショートカットからFireFox2とFireFox3を共存して起動できます。

次に、かいつまんでどういう事をやっているかの説明を。
(といっても、上記操作はWEBで調べた結果なので、自分なりの解釈になるんですが)

おおまかには、FireFox2用とFireFox3用のプロファイルを作成し、ショートカットで
起動オプションを設定してそれぞれのプロファイルを指定、また別個に起動できるように
指定する事で共存できるようにしているようです。

起動オプションに関しては、

-p:このオプションでプロファイルマネージャを起動するらしい。(我が家は上手くいかなかった)
  また、上で書いたように、 -p "プロファイル名" って書く事でプロファイルを指定して
  起動する。default指定するとデフォルトで設定されているプロファイルを読みに行く訳ですね。
-createprofile:読んで字の如く、プロファイルを作成します。使い方は上のほうで書いたように
          -createprofile "プロファイル名" という風に使います。
-no-remote:これは初めて知ったんですが、なにやらアプリを複数起動する為のオプションらしい。
        これのおかげでFireFox2とFireFox3が同時に起動できる…と。

これを全部使って、
FireFox2をデフォルトのプロファイルを指定して、同時起動可能とする

FireFox3用に新しくプロファイルを作成しておく

FireFox3をインストールする

FireFox3を、事前に作ったプロファイルを指定して、同時起動可能とする

こんな流れみたいです。そんな訳で早速使ってみたFireFox3はマジで爆速でした。
でもセキュリティホール見つかったって本当??

2008/05/19

Mapを拡張forループでぶんまわす [ Java ]

ものすごい更新が空いてしまった……
基本的にものぐさなんでよくない傾向です。
そして左肩が痛い。もう四十肩ですかね?
一応25歳なんですけど……まぁいいや。

今日は先日紹介した拡張forループ文を使ってMapをループ
する方法です。

基本的にMapを作る時ってKey値を指定してValueを取得する事が
多いと思うんですが、場合によってはMapの値を全てを取得したい
って事もあると思います。そんな時は下記のように拡張forループを使います。

Map classMate = new LinkedHashMap();

classMate.add("01", "佐藤");
classMate.add("02", "田中");
classMate.add("03", "高橋");
classMate.add("04", "鈴木");

for(Map.Entry person : classMate.entrySet()){
System.out.println(person.getKey());
System.out.println(person.getValue());
}

上記のように書く事で、01佐藤02田中03高橋04鈴木 のように出力されます。
簡単ですね。ポイントは

(マップ名).entrySet()

とする事でエントリのSet(Collectionを継承している)を取得する所。
もう一つのポイントは

Map.Entry<(型名), (型名)> とする事でエントリの型を指定する所かな?

知らないでも特に不自由しないけど、知ってると何かで役立つような情報でした。

2008/05/07

拡張forループ~素晴らしきJDK5~ [ Java, JDK5 ]

GWがあったので更新が長らく止まってました。
さて、今日はJDK5から新しく追加された機能、
拡張forループです。

今までJavaでfor文を使う場合、以下のように
コードを書いていたと思われます。

1.配列のループ

int[] array=new int[100];
for ( int i = 0; i < array.length; i++ ) {
  // 何らかの処理
}
2 .コレクションのループ(Iteratorの使用)

List persons;

for (Iterator it = persons.iterator(); it.hasNext(); ) {
 Person person = (Person)it.next();
// 何らかの処理
}

こんな感じでしょうか?相変わらず実際にコンパイルしてないので通るか不安……
さて、ここでJDK5で新登場した拡張forループの使い方です!!

3.拡張forループ
int[] array=new int[100];
for(int i : array){
 //何らかの処理
}

これだけ。なんとまー楽になった事か。具体的に説明するとこうなります。

for([変数の型] [ループ内で使う変数名] : [配列、又はコレクションの変数名]){
 //処理
}

例えば、stringListという名前の、String型のListが存在したとします。その場合

for(String str : stringList){
 System.out.println(str);
}

こんな感じになります。
とりあえず覚えておくと(JDK5を使うなら)何かと便利(というか作業効率が上がる)
なので是非是非。

2008/04/25

Mapの実装クラスについて [ Java ]

昨日のエントリでMapについて書いた訳ですが、JavaのMapは
インターフェースなので使う時は実装クラスを使わないといけません。

これが結構色々種類があって、それを全部説明する僕が面倒です
ので幾つかピックアップして解説してみようと思います。
という訳で選手入場です!


1.HashMap
はい、トップバッターは一番使われてるのでは? と僕が思っている
ハッシュマップから。これはほんとごくごく普通の連想配列です。
あえて突っ込むとしたらば、同期化はされてない事とnullが許容
されているって事ぐらいでしょうか。あ、後このクラスはMapの
順序が保証されません。
順番とかどうでも良い、本当にハッシュテーブルが欲しい時は
これで事足りますね。

2.LinkedHashMap
さぁ二番手に行ってみましょう。今度のMapは1番のHashMapと
ほぼ同じです。相違点は挿入した順序を保持する事。
つい最近仕事で使ったので記憶に新しい……

3.TreeMap
今日はこれで最後、TreeMapです。これはMapがソートされた
状態で保持されます。何でソートされるかというと勿論Key値です。
ハッシュでソートされるという事ですね。で、これってどういう風に
ソートされるの? 昇順? 降順? という疑問が沸くと思うのですが
デフォルトは昇順です。正確に言うとComparableインターフェースの
compareToメソッドによってソートされます。
その為、TreeMapを使って自分の思うようにMapをソートしたい場合は
Comparatorオブジェクトを生成し、それをTreeMapのコンストラクタへ
セットすれば出来るはずです。

なんではず、なのかって? 試してないからです。

今度はここらへんを実際のコードを混ぜて書きたいですねー。

2008/04/24

Mapって知ってますか? [ Java ]

タイトルを見てこう思った人がいるかもしれない。

はい! 地図の事です!







お前は俺か。


はい、という訳で今日はまずJavaのMapという物の概念から
考えていきましょー。まぁJavaに限らずほとんどの言語に
ある話なんで多分みなさん知ってると思うんですが。

さて、Mapというのはキーとそれに対応する値がセットになった
エントリの集合体のような物です。
はい、何を言っているか分かりませんね。
例えば、学校のクラスの出席番号を考えてみましょう。

 No 名前
 1  山田
 2  畠中
 3  川畑
 4  立神

こんな出席番号のクラスがあったとしましょう。
さてここで質問です。出席番号2番の生徒の名前は?

答えは当然"畠中"君ですね。(畠中さん、かもしれないですが)
このように、キー値(出席番号)と、それに対応する値(名前)が
セットになったエントリ(No:名前)が複数ある物がMapです。

さて、ここでさっきのデータにエントリを増やしてみます。

 No 名前
 1  山田
 2  畠中
 3  川畑
 4  立神
 2  計羅

上記データはMapとして……いや、出席番号として正しく機能するでしょうか?
勿論、答えはNo!!! です。何故ならこのクラス、出席番号2番の人! と先生が
点呼をすると

畠中「はい!」
計羅「ういす!!」

二人返事しちゃいますね。これじゃ出席番号としては機能してません。
これと同じように、Mapにおいてはキー値は重複しないという約束が
あります。特に難しい事は無いですね。

じゃ、これを実際にJavaのコードにしてみたものを以下に。

Map classMap = new HashMap();

classMap.put(1, "山田");
classMap.put(2, "畠中");
classMap.put(3, "川畑");
classMap.put(4, "立神");


こんな感じでしょうか?(コンパイル通してないからあってるか不安……)
上記コードのclassMapというマップが上の方で作ったデータと
全く同じ事を示している状態になります。

ここでは例としてMapの実装クラスはHashMapを使いましたが、他の
物を使った時との違いを今度書きたいと思います。

2008/04/23

Javaで配列のソートがしたい時どうする? [ Java ]

仕事がちょっと忙しくて昨日、一昨日と二日間サボってました。

さて、今日はタイトルの通りJavaで配列のソートをする時
どうする? というお話です。

昨日は仕事で画面上の表示するデータをとある項目の数値で
ソートしたかったのですが、普段だったらSQLにORDER BY句を
付け足して終了! とする所がhibernateを使ってDBアクセスを
行っている為にそれが出来なかったのです。

その為既に取得したデータ郡をJavaでソートしよう! という
事になった訳ですが……意外に簡単でした。やり方はこう。

ex)配列のsort
String[] orgStringArray = {
"3", "4", "2", "1", "9", "8"
}

Arrays.sort(orgStringArray);

これだけ。これでorgStringArrayというStringの配列が昇順で
ソートされます。(Arraysクラスはjava.utilパッケージにあります)


ここまで読んだ人は、『じゃ降順はどうするんだ?』とか
『実際にはこんな単純なオブジェクトじゃない事が多いんだけど』とか
『配列じゃなくてコレクションのsortをしたいんだけど!』とか ←僕です
色々思う所があると思いますが、それはまた後日。

2008/04/18

オブジェクトのクラス、そして全てのメンバへ…… [ Java ]

今日は原点に帰ってJavaについて。

とあるオブジェクトがあったとして、そのクラスを
取得したい場合。例えば

String foo = "foo";

ここでfooからクラス情報を取得したい場合は

foo.getClass();

これでclass情報を取得できます。
さて、ここまでは誰でも知ってるような事だと思いますが、
今日はクラス情報からそのクラスが持つメンバ一覧を
どのように取得するかを紹介したいと思います。
……といっても

foo.getClass().getDeclaredFields()

これだけ。ちなみに返される値はFieldオブジェクトの配列です。
なので実際には上記コードは

Field[] fields = foo.getClass().getDeclaredFields();

こんな感じになりますね。
ここからリフレクション等を使うと色々便利な事ができそうな予感……!!

2008/04/17

たまには振り返ろうか [ マネジメント ]

今日は普段とは違った趣向のエントリを書こうと思います。
決してネタ切れな訳ではありません。
や、書きたい事はあるけど時間かかりそうでめんどくさ(略


さて、このBlogは一応技術Blogなんで今までコンピュータと
関係がある技術的な事を書きつづけてきました。

しかし、一歩そこから離れて物を見てみると技術ばかりが
大切なのかというと勿論そんな事は無い訳で。
(一応、突っ込んでおくと技術者たる者、優秀な技術
 を持っていないとダメなのは勿論ですよ??)

という訳で今日はプロジェクトにおけるふりかえり手法の一つ、
KPTという物について触れようと思います。

これはアジャイル開発の振り返りで多用されているよう(なの?)
ですが、別に一人でも使えますし何もプロジェクトに限らずに
様々な場面で使える手法の一つだと思います。

やり方は単純。まず大きな紙、またはホワイトボードを用意しそれを
三つの領域に分けます。







Keep





Try








Problem






こんな感じ。そして各項目に、振り返るべき事柄(プロジェクト等)に
関する事を以下のように分類して記入していきます。

Keep:やって良かった事。今後も続ける事。
Problem:現在抱えている問題点。まずかったアプローチ等。
Try:今後やって行こうと思う事。

これだけです。多分、初めにこれをやるとKは殆ど出ずに逆に
Pが大量に出てくる事になると思います。でもこのKPTは
本来振り返りを行う為にやっているのでPがいっぱい出てくるのは
最初は問題ありません。
逆に最初っからPが殆ど出ない場合、実際には問題が少ない訳では
なく危機感が足りない場合やしっかりと考えられていない場合が
多いです。

さて、Pを出し終えたら後はTry……対策、やってみたい事等を出して
いきましょう。スペース的にもここはKやPの倍あるのでここは一杯
出していきたい所です。

2008/04/16

安全(safe)と冪等(idempotent)なメソッド [ http, REST ]

さて、今日は安全と冪等という概念について書こうと思います。

安全、safe、セーフ。
冪等、idempotent、なんて読むんだよコレ。


……まぁ、いいや。

さて、早速各メソッドの意味について。

安全:サーバに影響を与えない。
冪等:何度実行しても同じ値が帰ってくる。


これに関してこちらで分かりやすい例がありました。


算数でかくと、以下のとおり。

操作初期値1回目2回目3回目
x1  4  4  4  4 安全
x0  4  0  0  0 冪等
+1  4  5  6  7 安全でも冪等でもない

安全であれば必ず冪等であるが、冪等であるからといって安全だということではない。


ちなみに、httpにおける各メソッドは安全であるべき、冪等であるべきなどちゃんと
定義されています。
例えば、GETは安全かつ冪等です。(安全な時点で冪等である訳ですけどね。)

2008/04/15

GETメソッドの素晴らしさ [ http, REST ]

昨日は研修に借り出されていて書けなかった……

さて、前のトピックでリソースに対してメソッド(GETやPOSTとか)を
適用する事を体感してみた所でRESTの話に戻ろうかと思います。

皆さんがもしネット上で何か面白い記事を見つけたとします。
これをいち早く友達に教えたい! こんな時あなたはどうするでしょうか。

多分、アドレスをコピーして友達に送りつけますよね。
中には奇特な人がいて、その記事を表示している画面のスクリーンショットを
ファイルで送りつけたり記事の内容をメモ帳に落として送ったりとかそういう
人がいるかもしれません。……きっとそういう人たちは脳が弱いhttpに
おけるGETメソッドの素晴らしさを知らないのでしょう。そういう事にします。

さて、GETメソッドの素晴らしさとは何か……実は既に上述してしまっているのですが
同じアドレス(URI)に対してGETを適用する事によって、必ず同じリソースを取得できる
事です。これが約束されていない場合、ブックマークなんて使い物になりません。

正確には必ず同じリソース、という表現には語弊があります。実際にはGETメソッドを
適用した時点でのリソースの状態が返されます。これは前に書いたトピックを見れば
理解しやすいと思いますが、リソースの実体は変化しても意味は不変という事です。

既にインターネットに慣れ親しんだ人からすると、はぁ?何当たり前の事言ってんだコイツ?
と思うかもしれませんが、これって結構冷静に考えると凄い事じゃありません?
ウェブ上に星の数程ある様々なリソースに対して、特定のURIに対してGETを適用すると
必ず同じ物が返ってくる訳です。(逆にこれがないとWEBサーフィンできないなぁ)

……ちょっとPCに詳しい人なら

『ちょっと待った!GET使っても毎回表示結果が変わるようなページもありえる!』

って思う人がいるかもしれません。
……が、ちょっとそれは置いといてとりあえず今日はこの辺で終了。


今日のまとめ:
・GETは偉大

2008/04/10

httpを体感してみる [ http ]

最近はhttp周りの話が多いんですが、意外にWEB上に存在している
リソースを閲覧する時、一体どうやってリソースにアクセスしてどのように
データを取得しているかを知らない人って多いと思います。

例えば、Yahooを見たいと思った!その時どうする!
恐らくみなさん、こうするでしょう。






ぽちっとな。

アドレス欄にYahooのアドレスを入力して、華麗にエンターキーを叩く!
(実際にはブックマークを使う事が多いとは思いますが、同じ事ですね)


そうすると見事ブラウザにはYahooのトップページが表示される訳ですが……
果たして、この時裏で何が行われているのでしょう??

……というあたりを、今日はWindows付属のコマンドプロンプトを使って
試してみようと思います。

※:以下のような検証は自分が管理するサーバ以外には行わないで下さい。
後で何か起きても当Blogは責任を取れません。

さて、まずはコマンドプロンプトを起動します。
スタート→ファイル名を指定して実行 から"cmd"と入力すればいけますね。

ここでコマンドプロンプトに"telnet"と入力してEnterを押します。
(※:本来確かリモートの為に使われてたプロトコルだったはず。
   暗号化とかしてないから今は使ってない気がするんだけど……)
するとコマンドラインが Microsoft Telnet> のように変化します。
これでTelnetを使う準備は完了です。

さて、ここでTelnetのコンソールは一度置いておいて、ブラウザに戻ります。
そして
http://gp400.no-ip.info/~D400/test/http_test.html
上記アドレスにアクセスしてみましょう。









こんな感じでごくごく簡単なhtmlが表示されたと思います。
さ、ここでさきほどのTelnetのコンソールに戻って、今htmlを
表示した事を再現してみたいと思います。まずは

set localecho
と入力してエンター。(Windows2000だとlocal_echoかも)
これで入力している文字が見えるようになります。
さて、ここからが本番、まずはアクセス先のサイトへの接続を確保します。

open gp400.no-ip.info 80

上記のように入力してエンター。これで gp400.no-ip.info というドメインを
オープンしてくれ! という命令を出している事になります。
エラーも出なかったら、続けて以下のように入力します。

GET /~D400/test/http_test.html HTTP/1.1
Host: gp400.no-ip.info

↑ここのミソは、Hostを入力し終わった後にもう一度Enterを押す所です。
すると、このような画面が返ってきます。


















ここで返ってきた文字列は、まさにさっきブラウザで開いたhtmlのソースと
同じ物です。これがリソースに対してGETメソッドを実行した事になる訳です。


はい、という訳で今日はサーバに対してhttpヘッダをブラウザの代わりに
自分で作成して(正確にはブラウザは今回書いた以上の情報を自動で
補完してhttpヘッダに付加しますが)リソースに対してGETメソッドを
実行してみました。

今までなんとなくリクエストリクエスト言ってたような人は少しブラウザが
何をやっているか体感できたんじゃないでしょか?同じようにパラメータを
POSTするのもこういった感じで逐一検証する事が可能です。
昨日のエントリと合わせて色々試してみたいところですね~~。

2008/04/09

httpのヘッダ情報が見たいです [ FireFox, http, PlugIn ]

今日はFireFoxのプラグインの紹介だよ!
といってもまだ自分のFireFoxにインストールすらしてないけどね!

……さて、みなさんWEBアプリを作ってるとリクエストやレスポンスの
httpヘッダとか、POSTされている値とかを確認したくなる時って
ありません??
プログラムが上手く動かない!パラメータがどう飛んでるか分からんよ!
ってなって髪をかきむしる事幾数度……(あぁ禿が近づく)

http://livehttpheaders.mozdev.org/

↑こんなFireFox用のPlulgIn見つけました。その名も
"LiveHttpHeaders"
……なんてそのままな名前なんだ……

このプラグインを使うとどうやらhttpのヘッダ情報とかが見れるらしい。
見るだけじゃなく、保存したヘッダ情報を加工してリクエスト送信とか
そういう事もできるらしい。

な、なんだかオラワクワクしてきたぞ……!

という訳で早速明日は会社のPCを人柱にこれをインストールして
使ってみようかね!(というか会社の方がこれ使いたいしな)

2008/04/08

リソースとは何ぞや [ REST ]

ここの所REST周り続きの毎日。
他にネタが無いんだからしょうがない。

さて、題名通り今日はRESTにおいて大事な概念のリソースについて。

ここでリソースというのは情報の事を指します。
例えば……

・今まさに公開しているこのBlog
・オライリージャパンのRESTfulWebサービス本の紹介
・いつも巡回しているエロサイト
・WikipediaのREST解説
・今月のオリコンランキングTOP10

etc,etc…… 例をあげはじめたらキリが無いですね。
さて、ここで問題になるのは、例えば上にあげた例のうちの
「公開しているこのBlog」は、昨日表示した時と来週した時では
画面に表示されるトピックは違う物になっているでしょう。(更新してれば)
「今月のオリコンランキングTOP10」は、4月に表示するか5月に表示するかで
全く内容が変わっている事でしょう。

しかし、どちらも「公開しているこのBlog」、「今月のオリコンランキングTOP10」で
ある事に変わりはありません。リソースを考える上で大事なのは、
「そのリソースの意味」が大事になります。

例えば今公開しているこのBlogであれば

http://gp400fb.blogspot.com/

このアドレスにアクセスする事で、直近N件の佐藤さんが書いたトピックが
表示されるリソースになる訳です。同じくオリコンランキングであれば、

『その月の月別ランキングTOP10』

という意味になりますね。リソースの実体はその時々変化するかもしれませんが、
リソースの意味は不変の物である、という事らしいです。

例えば、GoogleのTOPを開いたら、今までは簡単な検索用テキストボックス
だったのに最近は下に"お勧め"等が表示されるようになりました。
表示される実体は変わりましたがこれは"Googleのトップページ"という情報に変わりはありません。
しかし、これがある日GoogleのトップページにアクセスしたらYahooのページになっていた。
そんな事はありえない……そういう事ですね、きっと。


さて、上記のように"リソース"という概念を踏まえた上で、先ほどの例を見てみます。


・今まさに公開しているこのBlog
・オライリージャパンのRESTfulWebサービス本の紹介
・いつも巡回しているエロサイト
・WikipediaのREST解説
・今月のオリコンランキングTOP10

これらは全てWEB上に存在するものです。上から順に

http://gp400fb.blogspot.com/
http://www.oreilly.co.jp/books/9784873113531/
プライバシー保護の為お見せできません
http://ja.wikipedia.org/wiki/REST
http://www.oricon.co.jp/rank/js/m/

上記のURIで各リソースを参照する事が出来ます。一文字でも違えば当然
これらのリソースにアクセスする事はかないません。

このように、WEB上のリソースはURIという識別子を持つ事は皆さん
ご存知だと思います。
さて、ここで重ねてリソースという概念の復習になりますが同じURIにアクセスしても
必ず同じデータが返ってくる保証はありません。
さっきも言ったように、http://gp400fb.blogspot.com/というURIにアクセスするのが
今日か、それとも一年後かで表示されるデータは全く別のものになっているでしょう。
しかし両者とも僕の書いているBlogという定義は変わりません
このように、一つの識別子では別の内容が返ってくる事があります。
(勿論、毎度毎度同じ内容が返ってくる事もあります)
しかしその識別子の持つ意味は不変なのです。



という事で今日のリソースという概念のまとめ。

・RESTにおける情報は全てリソース
・リソースの内容は変わる事があるが、その意味(定義)は不変
・リソースはURIという識別子を持つ



このリソースという概念がRESTでは非常に重要らしいです。
何故らしい、なのかというとまだ先を調べてないからです!
という訳でまた纏まりの無いまま終わる。

2008/04/07

まず、アーキテクチャって何だろう? [ アーキテクチャ ]

さて、今日のお題はアーキテクチャ。
良くアーキテクチャって言いますけどアーキテクチャって何でしょう?
結構何となくこの単語使ってる人が多いんじゃないかと思います。

というか僕が何となく使ってる人ですので。

まず、ここで言うアーキテクチャっていうのは勿論
ソフトウェアアーキテクチャの事です。
そこで早速今度もWikipedia大先生に聞いてみた所

ソフトウェアアーキテクチャとは、抽象化と問題の分割によって
複雑性を減らすことを主に念頭に置いたものである。

との事。まぁこの後に続けて書いてあるんですが、万人が納得いくような
ちゃんとした定義がある訳でもないようです。単語として意味が広すぎるのかな。

さて、ここで更に突っ込んでアーキテクチャアーキテクチャスタイルの違いについて。
(単語の解釈の話ばっかりでツマランのだが)こういう単語の意味でちゃんと解釈
しておかないと後でどんどん大きな勘違いとかに繋がっていきそうなのが怖いんで
色々調べてみたいと思います。

さて、アーキテクチャとアーキテクチャスタイルは当たり前ですが別の意味ですよね?

アーキテクチャというのは実際に自分達が作るシステムが持っている物。
アーキテクチャスタイルというのはシステムにおけるアーキテクチャを設計する時に
参考にするもの。

こんな違いのようです。簡単な例だとMVCモデルとかが挙げられると思います。

例えばあなたがStruts等のMVCモデルのフレームワークを使ってシステムを
構築したとしましょう。

この場合、これはMVCモデルというアーキテクチャスタイルの
Strutsというアーキテクチャでシステムを構築した…… という感じです。

……以上が自分なりのアーキテクチャ等の解釈になります……
という訳でようやくRESTというアーキテクチャスタイルについて次から
調べていこうかな……うーん纏まらずに終わる。

2008/04/04

RESTって何? 休むの? つーか会社休みてーよ。 [ http, REST ]

今日、職場での一コマ。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
俺『~~~♪』 ← 今日も元気に仕事をサボってウェブサーフィン中。

チームリーダー(以下R)『あ~、佐藤君。ちょっといい?』

俺『(びくっ!)あ、は、はい! なんでしょうか!』←あわててブラウザ閉じる。

R『突然ですが……ウェブをサービスしてみませんか?』

俺『What???』
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

要約するとよく分からないですが職場でのWebサービス担当大臣を
(今後精進して)やらない? って話です。つーてもこの現場って確か7月末
までしかいないから4月中ぐらいにはマスターしないと使い道がないよな。
まぁそん時はJSONやらAjaxやら色々と出てきたのですが、リーダーがその時
持ってた本がコレでした。

という訳で今日は(というか今後もになると思うが)RESTful……つーかRESTって何?
というトピックを書いていこうと思います。
また、色々WEBで調べてみた所RESTといっても厳密な定義がある訳でもなく、色々な
意味を持っていたりもするようです。という訳でじっくりと自分なりのRESTの解釈を
ここでウダウダと語っていくと思うのでお付き合い下さい。
また、間違ってる所や意見などがありましたら御教授、ご鞭撻頂ければ幸いです。

つーか絶対間違ってる事書きそうで怖いんだよな。

さて……とりあえずググってみた所RESTって

Representational State Transfer

の略なようです。これをスペースアルク様で和訳してみましょう。

Representational:再現、具象、描写
State:状態
Transfer:転送

……えー、具象状態の転送?

和訳作戦……失敗!!
なんだよこれ意味わかんねーよ。ばーかばーかつーか英語苦手なんだよ!

という訳で諦めてWikipediaでも見よう。そうしよう。文明って素晴らしい。
Wikipedia大先生によりますと、RESTっていうのは……

ウェブのような分散ハイパーメディアシステムのための
ソフトウェアアーキテクチャのスタイルのひとつである。


はい!先生!困った事にこの ソフトウェアアーキテクチャ ってのが既に
何を言っているか分かりません。
アホな上に知識の乏しい僕のような下民はこういう時は人に頼るか、わからない事を
ひたすら追って調べていくしかない訳ですが……
折角の技術Blogなんでここは自力で追っていってみたいと思います。

でも今日は疲れたんでこのトピックは終了。

……結局、RESTについては何の略か以外は分からず終わってしまった……
先は長いようです。(仕事は待ってくれないようです・゚・(ノД`)・゚・)

2008/04/03

変数について~初期値って……~ [ Java ]

三日連続変数について。こりゃ書く方も読む方も
飽きるの必至だわー……といっても特に書く事も無いので昨日の続き。

さて、Javaにおいて変数が宣言された時ってその変数はどうなるんでしょうか?
まず、クラス型変数の場合

Integer height = new Integer(168);

こんな風にコンストラクタを使って初期値を設定したりします。
この場合は当たり前ですが、heightというInteger型のインスタンスが
中にint型の168という値を持ったメンバ変数を持つ……となりますね。(あってるよね?)
さて、こっからが問題なのですが

Integer height;

このように宣言のみを行った場合、この"height"という変数はどうなるのでしょうか?
昨日の日記へのコメントでmaitoさんから エラーになる! というコメントを頂きましたが
実際にはコンパイルエラー等にはなりません。

正解はnull値を持つ、です。

何度も何度も言っていますが、クラス型変数というのはオブジェクトな為インスタンス化を
行わなければいけません。その為、変数を宣言しただけではそこに値は存在しない……
つまりnullになります。

じゃあここで逆に、プリミティブ型の変数はどうなるのでしょう?
プリミティブ型の変数はオブジェクトではない為、宣言と同時に既に値は存在するはずです。
実際、下記のようなコードを書いてみれば検証はたやすいでしょう。

int height;
System.out.println(height);

上記コードを実行すると、結果は0になります。
プリミティブ型の変数は宣言と同時に初期化が行われるのです。
参考までに、プリミティブ型変数の初期値を以下に列挙しておきます。

  • byte→0
  • short→0
  • int→0
  • long→0
  • float→0
  • double→0
  • char→"\u0000"(つまり空文字、"")
  • boolean→false
こんな感じです。ほとんどゼロが入ってますね。



さて、これにてひとまずJavaにおける変数の話は終了ですかねー。
ただ自分で書いておきながらなんなんだけど、オブジェクト指向における
クラス、オブジェクト、インスタンスという概念とJavaにおける同単語の扱いが
だんだんと分からなくなってきた……
オブジェクト==インスタンス だと思っていたけどもそうでもないようで。
ここらへんは正直な所まだまだ未踏の世界なのでいずれしっかり理解
できたらここに書いていこうと思います。 何年後。

2008/04/02

変数について~クラス型変数とな?~ [ Java ]

昨日の続き、今度はJavaにおけるクラス型変数って奴について。
まぁ実は書いてる僕がそろそろ意味不明になってきてるんですが
気にせずスタートするとします。

さてではクラス型変数とは何かというと、クラス型変数はプリミティブ型
とは違い、オブジェクトです
その為、昨日の例のように使用する前にインスタンス化をしなければいけません。

プリミティブ型の場合は int i = 1; のように直接値を書き込める所、クラス型の
場合はオブジェクトを生成した後に値をセットしないといけません。
また、クラス型の場合は当然といえば当然ですがメソッドを持ちます。
例えば、

long l = integer.longValue();

こんな感じ。上記の例だと変数integer(クラス型変数)が中にint型(プリミティブ型)の
変数をlongValue()というメソッドでlong型にキャストして値を返しています。


こんな感じです。つまりクラス型変数って、事前にJavaで用意されているクラスを
使ってるだけなのかなぁ?勿論無いと不便なんですけど・・・・・・
とりあえずここで一旦クラス型変数のまとめ。

・クラス型変数はオブジェクトである
・クラス型変数はオブジェクトなので、インスタンス化の後に値をセットする必要がある
 (↑大体コンストラクタでセットするのかな)


さて、ここで話は終了……と思ってたのですが、↑の文章を良く読むとクラス型変数の
場合オブジェクトを宣言はしてもインスタンス化しない、つまり

Integer height;

こんな所で終了するとこれってどうなるんでしょう?
これまた飽きてきたのでまた別トピックで書くとします。

2008/04/01

変数について~プリミティブ型って何さ~ [ Java ]

みなさんこんばんわ。
今日をもって私も遂に社会人三年目と相成りました。
あんま実感無いなー。3年目っつーと……

自分がN社に入社した時のI田さんと同じっつー事?
確かあの時点でK崎先輩が4年目で……

とまぁあっという間に先輩たちと同じ年次になっていく今日この頃。
いつまでも昔と同じレベルで居る訳にはいかないですよね!
先輩社員の面子を保つ為にも!(未だ下に後輩社員がついた事ないが)



という訳で今日はプログラムを少し触った事がある人ならもう問題無く
使っているであろう"変数"って奴の、Javaでの扱いについて。

Javaは型付けが厳しい言語なので変数宣言時には型も宣言しないと
いけません。その為良くこんな感じのコードを見る事があると思います。

int height = 165;

整数型の"height"って変数を宣言して、初期値として165を代入してますね。
この int と同じように、Javaでは下記のような8つの型が定義されています。
  • byte
  • short
  • int
  • long
  • float
  • double
  • char
  • boolean

この8つの型をプリミティブ型と言います。
このプリミティブ型って奴は値としてしか扱うことが出来ません。
値としてしか扱う事が出来ない、というのはどういう事かというと
オブジェクトとして扱う事ができないという事です。

オブジェクトではない為、プリミティブ型の変数は直接値を代入する事が出来ます。
先の例のように、int height = 165;  こんな感じに直接値を代入できます。

これがプリミティブ型じゃない場合はどうでしょう?
例として、同じように整数型を扱うIntegerクラスを使って同じ事をしてみると……

Integer height = new Integer(165);

こうなりますよね。上のIntegerの場合が何をやっているかというと、一旦
Integerクラスのheightという名前のインスタンスを生成し、そこにコンストラクタで
165っていう値を設定してます。このようにプリミティブ型じゃない変数は必ず
クラス型のオブジェクトを生成した後、オブジェクトに対して値をセットしなければいけません。


……あれ?今自分で口に出した、"プリミティブ型じゃない変数"って何なんでしょう?
これに関しては長くなるので別トピックで書こうと思います。
とりあえずプリミティブ型変数のまとめ。

・Javaで定義された8種類の型の事
・プリミティブ型変数はオブジェクトではない
・プリミティブ型変数はオブジェクトではない為、直接値を代入できる。

さぁ、次はクラス型変数についてだ!

2008/03/31

Javaをやってると…… [ UML ]

たまにUMLとか登場するんですよね。
オライリー的に言うと確かオラウータンかなんか。(分かり辛いなコレ)

でも、UMLって何と聞かれると……

も、モデリング言語・・・?

とか中身も知らずに(しかも疑問符付きで)答えるしかない俺。
ちゅー事でちょこちょこと使ったりしたUMLを書き留めていこうかね。
では早速、クラス図から。

Car
speed:int
getSpeed():int
setSpeed(int)

こんな感じかな?(見てくれ悪いのは面倒だから。ユルシテー)
Javaをちょっと触った事がある人なら別にこんなのUML使わなくても、
Carってクラスがメンバ変数speed(int型)を持ってて、それの
getter/setterがありますねーってそれだけかよ!

って感じなんですが。とりあえずUMLを用いる事によって、
必要とする情報をしっかりと伝える事ができる。
・・・と信じてます。正直こんな単純な例だとなぁ……

一応このクラス図の表現内容を説明すると。

Car
 →クラスの名前。一番上に書く。
speed:int
 →クラスのメンバ変数を記述。コロンで区切って型を記入しておく。
getSpeed():int
setSpeed(int)
 →クラスのメソッド。メソッドの名前と引数が記述され、戻り値がある場合は
  コロンの後に記述する。


こういう決まりに従って書くことで初見の人でも一目でクラスの全体像が
把握しやすくなる……そういう事のために存在するようです。

正直、このレベルだと習うより慣れろって感じがするので、今後何かで自分が
クラスを表現する時にはとりあえずUMLを使ってみようかな、と思った。

2008/03/28

あれ? プラグインが無いよ? [ Eclipse ]

今日あった事じゃないんだけど、まだEclipseを使いはじめた
ばかりの頃にショボーンと凹んだ経験があるので書き留めておく。

Eclipseといえば誰もが知ってる便利ツールで、更に世の中には
非常に便利なプラグインがごろごろ転がっている……訳ですが。

いざプラグインを追加してEclipseを再起動!!


・・・ってあれ? 追加したプラグイン無くね?


そんな感じで作業が止まった俺涙目。
こんな時はどうすればいいかというと、コマンドラインから
cleanオプションを指定してEclipseを起動すれば良いらしい。
具体的に、例えばEclipseがインストールされているフォルダが

C:\Eclipse3.2.2\eclipse.exe

こんな感じだったとしたら、まずはコマンドプロンプトを起動。
(ファイル名を指定して実行、でcmdって打てば起動する。)
で、該当のディレクトリに移動する。上記の例の場合は

cd C:\Eclipse3.2.2\

でいけますね。そこでEclipseを起動するんですが、その時に

eclipse.exe -clean

って入力すればOK。これでちゃんとプラグインを認識しなおします。
初回起動時は自動でcleanオプション付で起動してるとかいう噂も。