2012年6月28日木曜日

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回-