2012年12月27日木曜日

Puttyを使って鍵認証を設定する

先日、さくらVPSを申し込み、Apache等のインストールを行っている。

ほとんど、ドットインストールのさくらVPSの基礎を参考に行っているw

そのうち、#06 鍵認証を設定しよう(1)#07 鍵認証を設定しよう (2)では、Macで鍵を作ってうんぬんとなっているが、Windowsで鍵認証をしたい場合があるので、Windowsで鍵を作ってうんぬんの話をここに残しておく。ここではPuttyを使用する。

ちなみに、さくらVPSに限った話ではないので、他のサーバ接続でも利用できる・・・はず

1. puttygen.exeを起動する。きっと、putty.exeと同じフォルダに入っているはず

2. 「生成」ボタンをクリックする。
3. 「乱数を生成するために空白のエリア上でマウスを動かしてください」とメッセージが出るので、その通りにやる。

4. 完了後、「公開鍵の保存」をクリックし、ひとまず、"id_rsa.pub"という名前で公開鍵ファイルを保存する。
5. 続けて、「秘密鍵の保存」をクリックし、ひとまず、"id_rsa.ppk"という名前で秘密鍵ファイルを保存する。
6. サーバに接続する。
7. ホームディレクトリで以下のコマンドを実行する
 $> mkdir ~/.ssh
8. パーミッション設定する
 $> chmod 700 .ssh
9. ローカルマシンに戻り、先ほど作製した公開鍵id_rsa.pubをWinSCPやPutty付属のpscp等を用いて、サーバの.sshディレクトリに転送する。
10. 再びサーバに行き、.sshディレクトリに cd する。
11. 以下のコマンドを実行する(OpenSSH用に変換作業を行う)
 $> ssh-keygen -i -f id_rsa.pub >> authorized_keys
12. authorized_keysファイルのパーミッション設定する
 $> chmod 600 authorized_keys
13. id_rsa.pubが不要になったので削除する。
 $> rm -f id_rsa.pub
14. ローカルマシンに戻り、Puttyを起動
15. 左のカテゴリから「セッション」をクリックし、「保存されたセッション」の欄に登録されている鍵認証をしたいサーバのセッションを選択し、「読込」をクリックする。セッションが無い場合は、「ホスト名(またはIPアドレス)」にサーバのホスト名またはIPアドレスを書いといて、「保存されたセッション」に任意のセッション名を入れて、一旦「保存」をクリックして保存しておこう。

16. 左のカテゴリから「接続」→「SSH」→「認証」をクリックする。
17. 「認証のためのプライベートキーファイル」の右側の「参照」をクリックして、先ほど作製した秘密鍵id_rsa.ppkを指定する。完了したら、再び「セッション」カテゴリに戻って「保存」をクリックしておく。

18. 保存したセッションを読み込んで、「開く」をクリックする。以下のように"Authenticationg with public key"のメッセージが出れば成功である。

※参考

2012年12月24日月曜日

クラスローダー経由でプロパティファイルを読み込む

備忘録です。

Javaでプロパティファイルを読み込む方法の一つに、クラスローダーを利用する方法がある。Javaプログラム実行時に、クラスパス上にあるファイルを読む込みたいときに有効である(プロパティファイルの在り処にクラスパスを通しておけば、ローダー経由で読み込めるということ)。

以下、log4jを使おうと思って、専用のプロパティファイル(log4j.properties)を用意して読み込む処理を書いた例。
        InputStream ins = null;
        ins = Main.class.getClassLoader().getResourceAsStream("log4j.properties");
        PropertyConfigurator.configure(ins);

2012年12月22日土曜日

Java系ライブラリのsources.jarを作る

忘れずにメモ。

よく、apache系のライブラリを使うのですが、ソースを(Eclipse上で)見たいことがよくあり、Eclipseでライブラリのパスを通すときに、ソースをパッケージングしたファイルへのパスも設定しておくと、より容易に見やすくなるんですよ。

今回はlog4jを使うので、log4jのソースをパッケージングしたファイルを作ることに。

・前提
 ・Apache Antがコマンドライン上で使えるようになっていること

1. log4j-x.y.z.zipをここからダウンロード(x.y.zはバージョン)
2. zipファイルを解凍
3. ターミナルあるいはコマンドプロンプトで、解凍してできたフォルダに移動
4. 以下のコマンドを実行
 > ant -f build.xml jar
5. すると、dist/libフォルダが作られ、その中にバイナリのjarとソースのjarが作られる。

※バイナリのjarは既に解凍してできたフォルダの直下にあるから別に不要なんだけど

ついでにEclipseでの設定もメモしておく。

1. log4jを使うプロジェクトを用意
 今回はLog4jSampleプロジェクトを作成
2. log4j-x.y.z.jarとlog4j-x.y.z-sources.jarをインポートする。
 僕の個人的なやり方だけど、libフォルダを作って、その中にjarを置いた。インポートはEclipseのインポート機能を使ってもいいし、単純にコピペでやってもいい
3. プロジェクト右クリック→プロパティ→「Javaのビルド・パス」をクリック→「ライブラリー」タブをクリック→「追加ボタン」をクリック→log4j-x.y.z.jarを選択。選択するとダイアログが以下のような感じになる。
4. 追加されたlog4j-x.y.z.jarをクリックすると、オプションメニューが展開されるので、そのうちの「ソース添付」をクリックし、右の「編集」をクリック。log4j-x.y.z-sources.jarを選択する。そうすると、ダイアログが以下のようになる。

設定関係はこれでおk。あとはJavaコードを書けばよい。試しにlog4jの実装を見てみる。やり方はいろいろあるが、オーソドックスなのは、「パッケージ・エクスプローラ」に出ている「参照ライブラリー」をクリック→log4j-x.y.z.jarをクリックすると、クラス一覧が現れるので、そこから見たいクラスをダブルクリックすればソースが見れるようになる。ちなみに、「ソース添付」の設定がしていないとくりっくしても「該当ソースが見つかりません」みたいなメッセージが出てたと思う。


他には、自分がlog4jのinfoメソッドを書いたときに「infoメソッドの実装を見てみたい」と思ったら、ctrlキーを押しながらマウスポインタをメソッドに持っていってそのままクリックするか、表示されたメニューの「宣言を開く」をクリックする。

すると、infoメソッドの宣言元が表示される。


※「後になって言うなよ」な話
今回sources.jarを作るにあたり、ダウンロードしzipファイルの中にたまたまビルドスクリプトがあり、sources.jarを作るための処理があったからいいものの、他のライブラリも同様にできるとは限らない。sources.jarも公開されているのでそれをダウンロードするだけでおkな場合もあるし、作るための処理を自作しないといけないこともあると思う。

あと、別にソースをパッケージングする必要は実は無い。「ソース添付」のところでソースのフォルダを選択してもいいので。ただ、パッケージングしたほうが仲間内で開発するときに渡しやすいかなっていうくらい。

2012年10月31日水曜日

jQuery DeferredとSafariとalert


※この記事は問題が発生したが原因が分からなかったため、知ってたら教えて欲しいという記事です。

"jQuery Deferred API"という非同期処理のためのオブジェクトがjQueryにあります。

「Deferredって何?」と思った方は検索欄に「jQuery Deferred」と入れて調べてくださいな。

そのDeferredのサンプルを書いていて気づいたのだが、Safariだけ動かした時だけおかしな挙動になるケースがあった。

それは以下のコード
var doAaa = function() {
    var dfd = $.Deferred();

    setTimeout(function() {
        $('#BList').append('<li>aaa</li>');
        dfd.resolve();
    }, 1000);

    return dfd.promise();
};

var doBbb = function() {
    alert('doBbb done');
};

var doSampleB = function() {
    // clear
    $('#BList').empty();

    doAaa().done(doBbb);
};


Deferredを用いて、doAaaの実行後にdoBbbを実行するというもの。doAaaは画面に"aaa"と表示させて、doBbbは単にalertを表示させている。HTMLではボタンを押すとdoSampleBが実行されるように作った。

なので、"aaa"と表示した後にalertが出るのが正しい、と思っている。

だが、safariだけ"aaa"と表示する前にalertが出てしまう(´・ω・`)

chromeの場合は想定どおり

safariの場合は先にalertが出る

先に出たalertを閉じるとaaaが表示される。

Firefox、IE、Operaでも試したが、こちらは想定どおり(chromeと同じ)だった。
OSをWindowsからMacに変えて試したが、こちらでもsafariだけ先にalertが出た。

ちなみに、"aaa"と表示するところをalertで出した場合は、どのブラウザでも正しい順序でalertが出た。
doBbb内でalert出すところをjQueryで"bbb"と表示するように変えたが、どのブラウザでも正しく"aaa"、"bbb"の順で表示された。

なので、描画とalert周りがブラウザによって何か制御が違うのかなという気がするが、それ以上のことはよく分からず(´・ω・`)
誰か知っている人がいたら教えてください。

2012年9月28日金曜日

「Javaプログラマであるかを見分ける10の質問」に答えてみた

以下のリンク先の質問に答えてみた。
http://d.hatena.ne.jp/shuji_w6e/20110305/1299288660
間違えている気がするのであまり参考にしないでください(´・ω・`)

1. インスタンスそのものが同一かどうかと、インスタンスの示す値が同一かどうか。
2. 前者は裏でStringBuilderが動くためコストが高い。連結前提なら初めから後者を使うのが良い。
3. 複数の型を混在させないことで、コレクションを扱いやすくする。
4. オブジェクトの参照がどの変数にも格納されていない状態になった時。
5. 前者はException継承クラスで、catchブロックが必要。後者はRuntimeException継承クラスで、catchする必要は無い。
6. カプセル化のため(意図しない値の読み込み、書き込みを防ぐため)。
7. 参照型変数がnullだったとき。
8. 前者は引数の異なる同名メソッドを定義すること。後者はサブクラスにてスーパークラスのメソッドを再定義すること。
9. インスタンスを生成すること。
10. クラスの仕様を予め決めておき、その通りに実装してもらう場合。

うーん、微妙な気がする(特に4)。50文字以内っていうのも難しいw
前回Javaプログラマ試験に合格したよって言ったけどまだまだだなw

2012年9月21日金曜日

川崎でよく食べに行くお店

川崎に住んでいて、よく周辺にあるお店で食事を済ましているのだが、最近川崎近くに越してきた人が「おススメの飲食店を教えて欲しい」と頼まれたのでここに書いておく(`・ω・´)
ちなみにリンクはそのお店の場所をGoogle Mapで表示します。

・・・ラーメンが多いかしら・・・


ラーメン二郎
名前の通り。京急川崎から京急大師線沿いに歩いて7,8分のところにある。二郎の中では初心者向けかしら

萬○屋
京急川崎駅から歩いて5分もしないところにある銀座街のラーメン屋。特別おいしいわけじゃないけど、夜遅くまでやってるからついつい寄っちゃう。

リンガーハット
長崎ちゃんぽん。銀座街にあるお店。

大戸屋
定食食べたかったらココ。銀座街にあるお店

モスバーガー
「川崎駅前東」交差点の近くにあるお店。マックとモスどちらが好きかといえばモス

ひもの屋
銀座街じゃなくて銀柳街にあるお店。お魚(特にひもの)が出る。昼は定食、夜は居酒屋。

おかしのまちおか
ひもの屋の隣にあるお店。飲食店じゃないけど、いろんなお菓子が売っている。

東京チカラめし
銀柳街にあるお店。松○より肉が分厚く、濃い味付け。

赤備
銀柳街にあるつけ麺屋

やよい軒
銀柳街からちょっと外れた所にある定食屋。大戸屋に飽きたらこちら?

屯ちん
川崎モアーズのレストラン街にある東京しょうゆ豚骨ラーメン屋。池袋にある本店には行列が出来ていたが、こちらはいつでも入れるw

かつや
かつどんのチェーン店。京急川崎駅から5分もしない。

とんかつ和幸
川崎アゼリアにあるとんかつやさん。とんかつ定食が食べたかったら、かつやよりこっち。

ペッパーランチ
川崎アゼリアにある低価格のステーキやさん

餃子の王将
名前の通り。けっこう行列できてる。

なんつっ亭
川崎BE地下1Fにある「ラーメンシンフォニー」あるお店の1つ。ラーメンシンフォニーの中では一番おいしいと個人的には思ってる。

麺家 徳
川崎BE地下1Fにある「ラーメンシンフォニー」あるお店の1つ。量も種類もいろいろある。


お店は他にもいろいろあるが、まだ行ったことのないお店が圧倒的に多いな(´・ω・`)


[受験報告]Javaプログラマ(OCJ-P)に合格しました


Oracle認定Javaプログラマ(OCJ-P(1Z0-851))合格しました。

本当はこの上位にあるWebコンポーネントディベロッパ(OCJ-WC(1Z0-858))を取得したいのだが、前提条件にOCJ-Pを取らないといけないという・・・


受験日             : 2012/09/21
合否                : 合格
受験科目          : 1Z0-851(旧310-065)
受験言語          : 日本語
試験時間          : 150分

問題数             : 60
合格点             : 61%
取得点             : 90%(60問中54問正解)
勉強期間          : 2週間

受験目的          : お勉強
勉強形態          : 独学
実務経験          : あり(4年)
何度目の挑戦か : 1回目


某サイト様のテンプレっぽく書きましたm(_ _)m
ちなみに、試験番号が2012/06/01から変わっているので注意

勉強
知ってる人は知っているんですが、病気で入院して、今は自宅療養中ということもあり、時間はありました。勉強期間は2週間ほどですが、1日あたり4~6時間取り組みました。仕事しながらの勉強だと期間は倍の4週間くらい見積もった方がいいかも。

問題集は徹底攻略Javaプログラマ問題集を使用。試験番号が古いままですが、問題に変わりはなさそうなのでこれでいけると思います。いずれ、新版が出ると思いますが(´・ω・`)

チケット
受験しようと思った日の2日前にIT試験ドットコム楽天支部で購入。ちなみに、NECインターナショナルで買うのが一番安いが、試験を予約するまでに2週間~4週間かかるっぽいので注意。

当日の様子
試験会場に30分ほど前に到着。身分証明書2種(僕の場合はパスポートと保険証)を提示して、開始まで問題集を読みながら待ち。時間になったら指定のPCの前に座り、マウスをカチカチ押しながら解く。全部解いた後に結果が表示され、受付でレポートをもらっておしまい(`・ω・´)

所感
実務でずっとJavaを触っているが、細かい知識はこの受験勉強で養った感じ。とはいえ、Java6に関することを広く出題されると思っていたが、Java5から導入されたアノテーションに関する問題が1問も出なかったのがちょっと気になる(たまたま出てない?)。他にも出題されてないものってあるかしら。試験代が高いので落ちたら(´;ω;`)ブワッってなってたかも。

細かいルールを知っているかを問われるが、「そもそも、細かいところまで書かれているJava本あったかな?」と思って本屋に行って探したら、わかりやすいJavaにけっこう書いてあった。これは初心者でもおススメかと。codezineのJava入門ブックガイド(入門編) よりよき入門書と出会うためにでも取り上げられてますね。

その他
実はJava7試験が発表されている。機会があればアップグレード試験を受けたいが、Java7の内容を含んだ本が今のところこれくらいしか無い気がする


参考
OCJ-P(旧SJC-P)を取りましょう
Oracle認定Javaプログラマ(OCJ-P(1Z0-851))合格しました

2012年9月4日火曜日

JavaScriptのslice()とsubstring()とsubstr()

JavaScriptには、部分文字列を取得するメソッドが3つある。slice()とsubstring()とsubstr()である。
なんで似ているメソッドが3つもあるのか不明だけど、整理する意味でちゃんと書いておく。

  • String.prototype.slice (start, end)
引数startから引数endまでの部分文字列を新しい文字列値で返す。
endは省略でき、その場合は末尾を指定したのと同様になる。
負数の場合は末尾からのインデックス値となる。
'0123456789'.slice(2, 8);       // 234567
'0123456789'.slice(2);          // 23456789
'0123456789'.slice(-5, -2);     // 567
  • String.prototype.substring (start, end)
引数startから引数endまでの部分文字列を新しい文字列値で返す。
endは省略できない。
負数の場合は0に置き換わる。
'0123456789'.substring(2, 8);       // 234567
'0123456789'.substring(-5, 2);      // 01
  • String.prototype.substr (start, length)
引数startからlength数の新しい文字列値を返す。
lengthは省略でき、その場合は元の文字列の末尾まで指定したのと同様になる。
startが負数の場合は0に置き換わる。lengthが負数の場合は・・・不明?
'0123456789'.substr(2, 8);       // 23456789
'0123456789'.substr(2);          // 23456789
'0123456789'.substr(-5, 2);      // 56

これら3メソッドはJavaScriptの仕様であるECMA262にちゃんと載っている。
  • 15.5.4.13 String.prototype.slice (start, end)
  • 15.5.4.15 String.prototype.substring (start, end)
  • B.2.3 String.prototype.substr (start, length)
substr()だけ付録のページに載っているのだが、サブ的な扱いなのかしら?

EGitとassemblaの相性が悪い気が・・・

gitホスティングサービスで有名なのがgithubだが、完全プライベートなリポジトリは使えないようなので、assemblaというサービスを利用している。

だが、このassemblaとEclipseのgitプラグインであるEGitとの相性が悪い(´・ω・`)

PC起動後、EGitでリモートリポジトリにアクセスしようとしても認証エラーでアクセスできない。
ただし、TortoiseGitなど別のGitクライアントでアクセスした後は、EGitでもアクセスできるようになる。

おそらく、認証周りがおかしいと思うのだが、原因よく分からず・・・誰か知っていたら教えてくださいm(_ _)m


assemblaじゃなくて、bitbucketに変えようかな・・・プライベートリポジトリ使えるみたいですしおすし

2012年8月16日木曜日

Git環境構築メモ(EGit)

前回に引き続き、Gitを使えるようになるまでの構築メモです。

今回はEclipseのGitプラグインであるEGitの設定です。EGitはおなじみPleiadesのEclipseなら最初から入っています。全部Eclipseだけで設定できるので、Windows、Mac、Linuxは問わないです(きっと)

では、その手順を。

1. (Windowsのみ)環境変数HOME設定
これを設定しないと、EGit関係の画面を表示したときに「設定されていません」ダイアログが出て煩わしいので設定する。環境変数の設定の仕方はここでは割愛。設定する値はとりあえず、C:\Users\ユーザ名 でいいかと

2. SSH設定
Eclipseで公開鍵、秘密鍵を生成し、公開鍵をホスティングサービス(assembla)に登録します。
 1. 「ウィンドウ」→「設定」→「一般」→「ネットワーク接続」→「SSH2」とクリックしていく。
 2. 「鍵管理」タブをクリックし、「RSA鍵の生成」ボタンをクリックして鍵生成を行う。
 3. ダイアログの真ん中に表示された公開鍵をコピーした後、ブラウザでホスティングサービス(assembla)にアクセスする。右上の自分の名前のところにマウスポインタを合わせると「Edit Profile」が表れるのでそれをクリック。左側のメニューの「Manage SSH Keys」をクリック。コピーした公開鍵をテキストボックスに貼り付けて、「Add Key」を押して登録する。
 4. Eclipseに戻り、先ほどのダイアログの下に「秘密鍵の保管」ボタンがあるのでそれを押して保管する。保管場所はお隣の「一般」タブの「SSH2 ホーム」である。
 5. (不要?)Eclipseを再起動する。

これでOKなはずです。後はリモートリポジトリからプルするか、新規にプロジェクト作ってコミットすればいいかと。

最初は認証エラーが出たのですが、キーを再作成&再登録したらできたっていう・・・原因よく分からずです。

Git環境構築メモ(assembla, msysgit, TortoiseGit)

今流行り?のGitを使えるようにするまでのメモを残します。

1. ホスティングサービス登録
1人&マシン1台でGitやるなら不要ですが、複数台のマシンを使用する予定なので、リモートリポジトリをサービスしているGitホスティングサービスを利用することに。人気はGitHubらしいですが、個人的に使用するのに公開リポジトリを作るのは抵抗があったので、assemblaを利用することに。アカウント作って、プロジェクト名(リポジトリ名)を入力すればOK

2. msysgitインストール
msysgitはWindows環境で動くGitソフトウェアです。コマンドラインベースの「Git Bash」とGUIベースの「Git GUI」の2つが入っています。GUIベースとしてはよりメジャーでリッチな?TorotoiseGitをこの後入れますが、その場合もmsysgitをインストールする必要があります。msysgit公式サイトに行き、インストーラをダウンロードしてインストールすればOKです。

3. msysgit動作確認
試しにローカルリポジトリにファイルをコミットするまでやってみます。手順は以下の通り
 1. 適当にフォルダを作る
 2. Git Bash(msysgit)をダブルクリックし、コマンドプロンプトを出す
 3. 1.で作ったフォルダに移動
 4. git init
 5. 適当にファイルを作る(touch test.txt 等)
 6. git add test.txt
 7. git commit -m"first commit"
エラー無くできれば問題無いかと。

4. TortoiseGitインストール
TortoiseGitはWindows環境で動くGUIベースのGitクライアントです。TortoiseGit公式サイトに行き、インストーラをダウンロードしてインストールすればOKです。完了後、日本語化パッチを同じサイトからダウンロードしましょう。左側のメニューにある「Downloads」の「Show all」をクリックし、表示されたインストーラの中から「TortoiseGit-LanguagePack-*.*.*.*-**bit-ja.msi」となっているものをダウンロードします。***はバージョンとかビット数です。

5. TortoiseGit動作確認
試しにローカルリポジトリにファイルをコミットするまでやってみます。手順は以下の通り
 1. 適当にフォルダを作る。
 2. 作ったフォルダを右クリックし、「Git ここにリポジトリを作成」をクリックする。
 3. チェックボックスにチェックを入れずにOKをクリックする。
 4. 作ったフォルダの中に行き、適当にファイルを作る。
 5. 作ったファイルを右クリックし、「TortoiseGit」→「追加」をクリックする。
 6. 作ったファイルを右クリックし、「Git コミット」をクリックする。
エラー無くできれば問題無いかと。

6. SSH設定
assemblaを利用する場合、SSHの設定をする必要があります。大きな流れは、
 1. Puttygenで鍵を作る。
 2. 公開鍵をassemblaに登録する。
 3. git initしたフォルダに対して右クリックしてTortoiseGitの設定画面を出し、秘密鍵を設定する
です。詳細はこのサイトが分かりやすいです。

7. SSH設定後の動作確認
assemblaにpushしてみます。Git Bash(msysgit)なら以下の通りにコマンドを打ちます。***はホスティングサービス登録時に入力したプロジェクト名です。
 1. cd [git initしたフォルダ]
 2. git remote add origin git@git.assembla.com:***.git
 3. git push origin master
この時点でassemblaのマイページに行くと、push
TortoiseGitの場合は右クリック→TortoiseGit→プッシュでいいかと思いますが、この時点でTortoiseGitでpushすると「no fast forward」と出てpushに失敗します。push前にpullしないとダメかな。

参考
msysGitでWindowsからGitを使う
実用レベルに達したWindows向けGitクライアント「TortoiseGit」でGitを始めよう

2012年8月2日木曜日

JavaScriptである値がパターンにマッチしたらtrueを返す処理

単純に、RegExpオブジェクトのtest()を使えばよい。
var value = "abcdef";
var result = (/abc/).test(value); // true
以下でもOK。こっちはStringオブジェクトのmatch()を使っている。
var value = "abcdef";
var result = !!value.match(/abc/); // true
match()はマッチした結果を配列で返し、全くマッチしない場合はnullを返す。なので、単にマッチしたかどうかの結果だけを知りたい場合は、!演算子を2回使えばよい。

  • value.match(/abc/) → abc
  • !value.match(/abc/) → !abc → false
  • !!value.match(/abc/) → !!abc → !false → true

上記の!abcがfalseになるのは、abcが型変換でブーリアン型(true)になるからである。
型変換でfalseになる値は以下の通りで、それ以外はtrueである。

  • 数値0
  • 数値NaN
  • null値
  • undefined値
  • 空文字

JavaScriptのとあるソースを呼んでて、!!value.match(/abc/)なるものがあって、何やってるのかよく分からなかったからメモを残しました。単純にRegExpのtest()を使うのとどっちがいいですかね?

2012年7月25日水曜日

jQueryのバージョンをコードで確認する方法

jQueryのバージョンをコードで確認する方法は簡単。
jQueryオブジェクトにはjQueryプロパティというバージョンを格納しているプロパティがあるので
それを参照すればおk

alert($().jquery); // 例えば、1.7.2と表示される

検索で「jQueryプロパティ」と入れても「jQueryのプロパティ」と解釈されてなかなか出てこないんだな...

2012年6月28日木曜日

JavaScriptのsetTimeout()で指定する関数の引数に値を渡したいとき

JavaScriptで定期的に処理を行わせたいときに、setTimeout()またはsetInterval()を使う事があります。
// 1秒間隔でdoSomething()を実行
setInterval(doSomething, 1000);
その第1引数には処理を定義した関数を与えるのですが、その関数の引数に値を渡したい時は以下のように呼びます。
setInterval(doSomething, 1000, value);
setInterval(doSomething, 1000, value1, value2, value3);
あるいは
setInterval("doSomething('" + value + "')", 1000);
文字列で渡すパターンは途中にシングルクォートを入れるのがミソらしいんだが、具体的な理由は不明(´・ω・`)
ちなみに、MOZILLA DEVELOPER NETWORKのwindow.setTimeoutwindow.setIntervalに関数の説明が書いてあります。ECMA262には書いていませんでした。ということは、ECMAで定めた関数じゃないんですかね。

その他参考サイト:
setTimeoutで引数が入った関数を呼ぶ

JavaScriptで小数の表示

暇つぶしにJavaScriptでストップウォッチを作っていたのだが、0.1秒とか11.5秒とかはそのまま表示されるのに、10.0秒みたく小数点以下が全部0だと、それらが切り捨てられて10と表示されてしまう。10.0と表示したい時は以下のメソッドを使えばおk

var val = 10;
val.toFixed(1);  // 10.0

toFixed()は小数点表示の文字列値に変換するメソッドです。引数は、小数点以下の桁数を表します。

ちなみに、JavaScriptの数値型(Numberオブジェクト)は64ビット浮動小数点数です。なので数値計算は(たとえ整数のつもりでも)内部では全て実数として扱われます。小数点以下が全て0のときに文字列にすると小数点以下が切り捨てられて、整数に見えるとのこと。ちなみに、ビット演算の時は内部では32ビット整数で計算されるみたい。

参考サイト:
javascript - には整数はない

2012年6月23日土曜日

JavaScriptのArgumentsオブジェクトを配列に変換

JavaScriptには、関数の引数情報を表すArugmentsオブジェクト、DOM APIのgetElementsByTagName()が返すNodeListオブジェクトのように、配列だけど配列でないオブジェクト(以下、配列風オブジェクトと呼ぶ)が存在する。

配列ではないので、単純に配列(Arrayオブジェクト)のメソッドをそのまま呼ぶ事はできない。call()やapply()を用いて呼べばOKなメソッドもあるが、場合によっては配列に変換しないとダメとか、むしろ変換しちゃったほうが何かと都合がいいとかあるだろう。

変換方法は以下のコードを1行実行するだけで良い。
var array = Array.prototype.slice.apply(arguments);

Arrayオブジェクトのslice(start, end)は、配列から指定したインデックスの要素を抜き出した新しい配列を返す(インデックスを指定しなかったら中身が全く同じの新しい配列を返す)メソッドで、このメソッドを使う事で配列風オブジェクトから配列が返ってくる。

そもそも、なんでこいつを使うと本物の配列が返るのかというと、配列風オブジェクトの特徴が

  • lengthを持つ
  • 数値プロパティを持つ(プロパティ名が数値なので、arguments[1]とやると値を取得できる)

であり、slice()が以下のような実装になっているからだと思う。
var slice = function(start, end) {
 var newArr = [];
 var i = start || 0;
 end = end || this.length;

 for (; i < end; i++) {
  newArr.push(this[i]);
 }

 return newArr;
}

↑だいぶざっくりと書いているので気をつけてください(startの値が負数だとか、endの値が配列の長さ以上だとか考慮してないっす)。メソッドになっていないのも勘弁してください。
ポイントはthis(apply(), call()で呼べばthisは配列風オブジェクト)とpush()のところで数値でプロパティ値を取得してるところかな。

2012年2月5日日曜日

EC2インスタンスにMySQLを入れてみる

前回から引き続き、AWS関連のネタです。前々回のEclipseに「AWS Toolkit for Eclipse」を入れてみる、前回のAWSのElastic Beanstalkを使ってみると続いて、AWS RDSもしくはAWS SimpleDBを使おうと思いましたが、一旦EC2インスタンス1個だけでもやっていけないかなと思って一旦保留。(そーいう意味では、MySQLと連携するアプリを作れば、第2弾のEC2インスタンスにTomcatを導入してみるでインストールしたTomcatが活きてくるwww)

ということで、今回はEC2インスタンス(Amazon Linux)にMySQLをインストール手順を説明します。基本的にはその他のLinuxと変わらないです。

1. インストール先のEC2インスタンスにSSH接続し、rootユーザになる。


2. MySQLインストール
yumでインストールします。下図はいろいろインストールするものを指定していますが、mysql-serverのみでおkです。(後で気づいたのですが、他は指定しても「利用可能なmysql-clientとmysql-sharedがありません」と出たので。。。)

コマンド打つと、下図のようにいろいろメッセージが出てきます。

いくつかメッセージが出て、1回だけYes/No聞かれたので、Yesと答えて・・・という感じでインストールが行われて最後に「Complete!」が表示されればおkです。コンソール見てると、ファイル名に"amzn"と入っているファイルがいくつか表示されているのでAmazon Linux用のMySQLが用意されているんですね。

3. MySQL設定
インストールしただけではまだ動いていないです。動かす前にMySQLの設定をします。デフォルトの設定ファイルは/etc/my.cnfです。これとは別に環境ごとの設定?がされているファイルが/usr/share/mysql以下にあります。

いくつかcnfファイルがありますが、それぞれの意味はAmazon EC2 (Amazon Linux) での MySQL インストールと設定に書いてあります。今回はmicroインスタンスなので、my-small.cnfを使うことにします。/etc/my.cnfをバックアップしておいて、my-small.cnfを/etc以下に(my.cnfにリネームした上で)置いておきます。

4. MySQL起動
それでは起動します。

下図のようにOKがでればいいです。


5. chkconfig設定
OSが再起動したら自動でMySQLも起動するようにしておきます。

6. MySQLのrootユーザのパスワード設定
MySQLの管理操作ができるユーザのパスワードを設定しておきます。2つのシングルクォートの間に任意のパスワードを入れて登録します。

7. 匿名ユーザとパスワード無しユーザ削除
不正なアクセスを防ぐため、匿名ユーザとパスワード無しユーザを削除します。まずは、rootユーザでMySQLにログインします。下図の*****部分は、6.で設定したパスワードを入れます。

ログインしたら、下図のように打ち込んでユーザをdeleteします。

quit; と打ち込んで終了です。
とりあえず、ここまでくればMySQLを使える状態になりました。

今回はここまでです。

参考サイト:
道はなくても進むのだ。 / Amazon EC2 (Amazon Linux) での MySQL インストールと設定
ken’s room ~技術探求のメモ~ / ■[AWS]Amazon EC2 にてAmazon Linux AMIにMySQLを入れる
Carpe Diem / MySQL の公式 RPM を使おう

2012年2月4日土曜日

AWSのElastic Beanstalkを使ってみる

前回のEclipseに「AWS Toolkit for Eclipse」を入れてみるに続き、第4弾は「Elastic Beanstalk」を使ってみようと思います。

Elastic Beanstalkとは、簡単に言えば、Webアプリの実行環境を構築・管理するPaaSです。大雑把ですが、以下のような特徴があります。

  • コンテナは、Tomcat6 と Tomcat7
    • つまりJavaアプリしか動かせない。いずれはRuby on Railsにも対応するそう。
  • ロードバランサー機能
  • オートスケーリング機能
  • Beanstalk自身の機能は無料で使用可能
    • それ以外のEC2インスタンス、S3などが通常のAWS同様に課金対象


で、今回はサンプルアプリを作って、Beanstalkにデプロイするまでの手順を説明します。前提としては、前回話したEclipseにAWS Toolkit for Eclipseをインストールしていることです。


1. Eclipse起動

2. X509設定
Eclipseのメニューにある「ウィンドウ」→「AWS Tooklit」とクリックします。表示された「AWS Toolkit Preferences」の真ん中のあたりに「Optional configuration」をクリックすると、新たに入力項目が3つ表れます。これらを埋めるためには、「Manage your AWS X.509 certificate」というクリックして取得します。

まず、「Account Number」については、クリックした先の一番下の「アカウント識別子」というのがありますので、それを入力します。

それ以外の部分については、クリックした先の上のほうにある「アクセス証明書」の「X.509証明書」をクリックします。「新しい証明書を作成する」をクリックすると、X509証明書と秘密鍵の2つが作成されます。その2ファイルをダウンロードします。


Eclipseに戻り、「証明書ファイル」には"cert-"から始まるファイルを指定し、「Private Key File」には"pk-"から始まるファイルを指定してください。その後、「適用」ボタンをクリックして完了です。

3. 領域(リージョン)設定
Elastic Beanstalkは、言い換えればWebアプリ実行環境を備えたEC2インスタンスなのですが、今はなぜか「US East(Virginia)」でしか動かせないので、あらかじめ指定しておきます。他の場所を指定しちゃうアプリデプロイができません。※クラウドなのになんで場所を意識しないといけないんだが(´・ω・`)
「US East(Virginia)」を選んだ後、「適用」をクリックし、「OK」をクリックして設定ダイアログを閉じます。

4. Webアプリ作成
Beanstalkにデプロイするアプリを作ります。まずは、下図のように「New AWS Java Web Projerct...」をクリックします。

プロジェクト作成ダイアログが表示されます。プロジェクト名はお任せします。「Start from」のところではシンプルなアプリ又はAWS提供サンプル(Travel Log)が選べます。とりあえずは、「Basic Java Web Application」にしておきます。
その後、「完了」をクリックしてダイアログを閉じます。すると、Eclipseのエクスプローラ上にプロジェクトが現れます。

5. Beanstalkにデプロイ
それではこのサンプルをさっそくデプロイします(「New AWS Java Web Project」で作ったプロジェクトは特に何もしなくてもそのままデプロイできます)。プロジェクトを右クリックし、「Amazon Web サービス」→「Deploy to AWS Elastic Beanstalk...」をクリックします。
クリックすると、「サーバーで実行」というダイアログが表示されます。「サーバーのタイプを選択」のところでは「Amazon Web サービス」に表示されている「Tomcat 6」か「Tomcat 7」をクリックします。どちらを使うかは要件によって当然異なりますが、今回はとりあえず「Tomcat 7」を選びました。


「次へ」をクリックすると、「Configure Application and Environment」というダイアログが表示されます。

ここでいうApplicationとは、EnvironmentとVersionを内包する空間を指し、デプロイするアプリのことではないので注意です。Elastic Beanstalkでは、Applicationという空間に、複数のEnvironmentとVersionがあり、いわゆるアプリはEnvironmentという場所にデプロイされます。この辺りの説明はAWS Elastic Beanstalk 詳細 -ほぼ週刊AWSマイスターシリーズ第9回-が詳しいです。

なので、ここでは、ApplicationとEnvironmentを新規定義する、ということになります。もちろん、一度作ったApplicationを利用することも可能です。今回は、新規定義なので適当な名前をつけて作ります。

「次へ」をクリックすると、「拡張構成」ダイアログになります。今回は特に何もしない(というか、ここでできることがわからないので無視する)ので、「完了」をクリックしてダイアログを閉じます。

「完了」をクリックすると、「バージョン入力」ダイアログが表示されます。自動で生成された値が入っていますが、自分で決めた値を入力することも出来ます。とりあえず、僕は、vyyyymmddaaaaの形式(yyyyは西暦、mmは月、dd日、aaaaはビルド番号(初回なのでとりあえず0001))にしました。

「OK」をクリックするとデプロイ作業が始まります。ApplicationとEnvironmentを新規定義したので裏ではそれの作成から始まります。ちなみに、「OK」クリック直後の「サーバー」ビューでは以下のように表示されます。

しばらく待つと、デプロイが完了し、Eclipseでは下図のように表示されます。

ちなみに、AWS Management Consoleではどうなっているかと言うと、下図のようになっています。行き方はAWS Management Consoleに行き、上部のメニューにある「AWS Elastic Beanstalk」をクリックすればよいです。

"SampleApp"という名のApplicationがあり、そのEnvironmentの1つである"SampleEnv"が動いている、ということになります。"SampleEnv"にあるURLをクリックするとデプロイしたアプリをブラウザから開けます。

今回はここまでです。

参考サイト:
@IT AWSの自由自在なPaaS「Elastic Beanstalk」とは
悪戦苦闘 Tech memo AWS Elastic BeanstalkでDeployのときのエラー
AWS Elastic Beanstalk 詳細 -ほぼ週刊AWSマイスターシリーズ第9回-

2012年1月26日木曜日

Eclipseに「AWS Toolkit for Eclipse」を入れてみる

前回のEC2インスタンスにTomcatを導入してみるに続き、第3弾として、開発環境(IDE)であるEclipseに「AWS Toolkit for Eclipse」というプラグインを入れてみようと思います。

AWS Toolkit for Eclipse というのは、以下のような機能があるそうです。

  • 仮想マシンの起動停止機能
  • SSHによるホストへの接続支援機能
  • EBS(Elastic Block Storage)機能
  • SimpleDBアクセス機能
  • Webプロジェクトのデプロイ機能
  • Java用AWS SDK(AWSインフラ上で動くJavaアプリ用のSDK)
  • AWS Explorerを用いたS3やSimpleDBの項目、属性の作成、表示、削除など
  • AWS Elastic Beanstalk(アプリデプロイ機能の強化版)

で、今回はローカル上でアプリを実装し、簡単に(EC2インスタンス上の)Tomcatにデプロイしたいためにこのプラグインを入れることにしました。

※2012/02/04追記:後々調べて分かったのですが、AWS Toolkit for Eclipseを用いてアプリデプロイできる対象は「AWS Elastic Beanstalk」のTomcatのみで、自前でインストールしたTomcatにデプロイできないです。すみません(´・ω・`) 自前でインストールしたTomcatにアプリをデプロイしたい場合は、Tomcatの管理コンソール上でデプロイするか、ローカルPC上で作ったwarファイルをEC2インスタンスに持って行き、/usr/local/tomcat/webappsの下に置かないといけない(はず)です。


以下、導入手順です。

※一応、前提
・(今更こんなことを言うのはあれだが)EC2インスタンス所持済み
・ローカルPCのOSがWindows7
・Puttyインストール済み

1. Eclipse起動
まずはEclipseを起動しましょう。今回使用するEclipseのバージョンは3.7(Indigo)です。AWS Toolkit for Eclipseの公式サイトでも3.7を使用することが推奨されています。

2. プラグインのロケーションURL追加
Eclipse起動後、「ヘルプ」→「新規ソフトウェアのインストール」とクリックして、「インストール」ダイアログを出します。ダイアログの右側にある「追加」ボタンをクリックします。そうすると、「リポジトリーの追加」ダイアログが現れます。「名前」欄には、任意の名前(今回は分かりやすいように「AWS Toolkit for Eclipse」)を入れ、「ロケーション」欄には、「http://aws.amazon.com/eclipse/」と入れます。

「OK」をクリックすれば、追加完了です。

3. インストール開始
上記で「OK」をクリックして、「インストール」ダイアログに戻ると、プラグインがインストールできる状態になっています。ひとまず、「AWS Toolkit for Eclipse」の横にチェックを入れて、関連プラグインを全てインストールすることにします。

チェック入れた後は、「次へ」をクリックします。その後、何回か「次へ」とか「完了」とかをクリックするとインストールが始まります。途中で再起動がかかりますが、再起動後にインストール完了の状態になります。下図の赤丸のところにAWS関係のドロップボックスが表れていればOKかと思います。


4. 各種設定
プラグインをインストールしたEclipseからEC2インスタンスに接続するための設定をしていきます。「設定」→「AWS Toolkit」と辿るとツールの設定画面になります。そこでは、「アカウント名」と「Access Key ID」と「Secret Access Key」を入力します。アカウント名はEC2インスタンスを登録したときのアカウント名(のはず)で、残りの2つに関しては、「find your existing AWS security credential」のリンク(下図の赤丸)をクリックしてセキュリティ証明書のページにアクセスし、赤丸部分をコピペして入力すればOKです。

入力後、「適用」ボタンをクリックし、「OK」ボタンをクリックして設定画面を閉じます。

5. 接続確認
AWS用のパースペクティブに切り替えます。「ウィンドウ」→「パースペクティブを開く」と辿り、「Amazon EC2 Management」を選択して、「OK」をクリックします。


クリックすると、下図のような画面になります。

設定画面で入力した値が正しければ、EC2インスタンスにアクセスし、インスタンスの状態を上図のように表示してくれます。ちなみに、「AWS Management」というパースペクティブで見ても、同じ情報が見れます。

このパースペクティブだと、左側に「AWS Explorer」というビューが表れるんですね。

今回はここまでです。

参考サイト:
http://aws.amazon.com/jp/eclipse/
http://www.atmarkit.co.jp/fjava/rensai4/devtool12/devtool12_2.html