2009年11月3日火曜日

Action Script 3.0 初心者勉強会

に行ってきました。
その時のメモを残します。

1.インストール


とりあえずflash developのインストール。
何か起こられる場合は.Net Frameworksのバージョン2.0以上をインストール。
それでも駄目なときはjavaのランタイムをインストール。

無事にflash developのインストールができたら、flex SDKをインストール。
インストールと言ってもダウンロードファイルを展開して適切なフォルダにおいてあげればよし。

2.開発まで


①flash developを開く。

②新しいプロジェクトを作る
Project -> New Project -> AS3 Project
その際、Create directoryにチェックを入れるとよし。

③Flex SDKへの関連付けを設定する。
Tools -> Program Settings AS3Context -> Flex SDK Locationにflexの展開フォルダを指定

④動かしてみる。
再生ボタン( > ←こんなの)をクリック -> 白い画面が出てくる

④画面サイズを変えてみる
Project -> Propaties -> サイズを300x300に

3.開発してみよう


プロジェクトを新しく生成するとある程度ソースが出来上がるので、それを少々修正しながら作成。

①画面に文字を出す。
以下の例だと、画面上に'init'と表示されます。

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
this.init_status_field();
}
private var status_field:TextField = new TextField;
private function init_status_field():void
{
this.status_field.text = 'init';
addChild(this.status_field);
}

②フォーマットを変える。
先ほどのコードに以下のコードを追加すると、文字のフォーマットを変更できます。下の例だと文字の大きさを変えています。

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
this.init_status_field();
this.init_status_format();
}
private function init_status_format():void
{
var format:TextFormat = new TextFormat;

format.size = 18;
this.status_field.defaultTextFormat = format;
// this.status_field.setTextFormat( format );
}

③クリックに対応する。
いよいよ双方向のアクションの取り入れに。addEventListenerというメソッドによりアクションがあった時の行動を指定することができます。
下の例だとマウスアクションがあった時の動作を指定しています。
具体的にはマウスクリックすると、文字が'CLICKED'に置き換わります。

private function init_status_field():void
{
this.status_field.text = 'init';
this.status_field.addEventListener( MouseEvent.CLICK, status_clicked );
addChild(this.status_field);
}
private function status_clicked( e:MouseEvent ):void
{
this.status( 'CLICKED' );
}
private function status( str:String ):void
{
setChildIndex(this.status_field, numChildren -1);
this.status_field.text = str;
}

④画像を表示する。
画像も一つのクラスとして定義し、定義した画像クラスのオブジェクトを貼り付けてあげれば画像も表示させることができる。
ちょっと特殊な書き方をしますが、下のように書いてあげると大丈夫。

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
this.init_status_field();
this.init_status_format();
this.init_bitmap();
}
[Embed(source = "../sample.gif")] private static const SAMPLE:Class;
private function init_bitmap():void
{
var bitmap:Bitmap = new SAMPLE as Bitmap;
addChild(bitmap);
bitmap.x = 100;
bitmap.y = 100;
}


2時間弱の勉強会だったのでここまでしかいかなかったのが残念。
もっと動きをつけれるようなところまで行きたかったけど2時間だとここまでが限界かもね。
でも一人でやってたらすごく時間がかかったであろう設定をすぐに完了できたのは勉強会に参加したからだと思う。その意味でも参加した価値は十分。

あと、やっててすごく便利だと思ったのが、ソースを書いていくにつれ必要なパッケージが自動的にインポートされていくってこと。
すごく便利よ。

2009年10月25日日曜日

配列操作のちょっと不思議な挙動~配列は参照型?~

配列操作で直感的に違和感を感じた。


> a = [1,2,3]
> b = a
> a[0] = 0
=> b = [0,2,3]


bにaを代入して、aの中身を書き変えたらbの値まで書き変わってしまうらしい。
感覚的にはbはコピーしたもので全く別ものだから内容は書き変わってほしくないものだけど。

ちょっとググってみたらpythonで似た様な現象について紹介されてたから、rubyでもちょっと試してみた。
参考: http://weblog.imaginaryworld.org/2008/05/blog-post_08.html


> a = [1,2,3]
> b = Array.new a
> a[0] = 0
=> b = [1,2,3]


うん。できた。
新しいオブジェクトを作ってあげてそれを代入すれば問題なし。

さて、じゃ、ここでこちらにもあるディープコピー問題はどうするんだろ?って思って試してみた。


> a = [1,2,3]
> b = [a, 1]
> c = Array.new b
=> c = [[1,2,3], 1]
> a[0] = 0
=> b = [[0,2,3], 1]
=> c = [[0,2,3], 1]


うん。
cは新しいオブジェクトを作って代入したにも関わらずaの変更が反映されている。
bのオブジェクトのコピーがaを参照しているからダメらしい。

対処として、cloneやdepなんかの配列のコピーが大丈夫か?と思ってやってみたけど、駄目だった。cloneやdupは浅いコピーであり、オブジェクト自身を複製するだけで、オブジェクトの指している先を複製するわけではないとのこと。そりゃ新しく配列オブジェクトを作成したさっきと同様の結果になる。

どうすればいいんだろ?ってことでさらにググってみたら以下の方法でディープコピーができるらしい。


> a = [1,2,3]
> b = [a, 1]
> c = Marshal.load(Marshal.dump(b))
=> c = [[1,2,3], 1]
> a[0] = 0
=> b = [[0,2,3], 1]
=> c = [[1,2,3], 1]


うん、できた。
ファイルに書き出してそれをまた配列に戻す。

なんという力技。

2009年10月18日日曜日

Map Reduce ~ クラウド勉強 in ruby business commons

クラウドの技術要素としての並列分散処理システムMap Reduceについて勉強してきました。

内容としてはざっとこんな感じだったと思う↓
http://d.hatena.ne.jp/naoya/20080511/1210506301
rubyで書いてあげれば結構シンプルに書けるのだとか。

基本的には技術屋さん向けの勉強会というわけではなかったにせよ内容をその場ですべて理解することはできませんでした。


今やっていることのバッチ処理が2~4時間くらいかかっています。
それもまだ完全ではなくて、本来やりたいことまでやろうとすると数十倍の処理能力が欲しかったりする。

しょっぽいパソコンたくさん集めてMap Reduceの並列分散処理を組みこんであげればやりたいことの実現ができるんじゃないかなぁなんて。

そんな妄想を感じている今日この頃。

2009年10月12日月曜日

早速iPhoneアプリ開発~Hello World!~

macで早速iPhoneアプリの開発をやってみた。

プログラミングのはじめといえば"Hello World!"

参考資料はこちら
若干グロテスクなデザインですが、こういうちょっと砕けた本のがわかりやすい。

言語構造とかデータや関数の関連とかまだまだよくわかってないけど1時間弱くらいでHello Worldとタップして何かしらのアクションがとれるアプリの作成が完成。
(一番時間がかかったのはmacの使い勝手がわからなかった当たりかもw)

プログラムの背景は今後理解してけばいい。


基本的にはアプリ開発方法としてはプログラミング的開発方法と、GUI的開発方法の2種類があるらしい。
開発スピード的にもGUI的開発の方がよさげと思われ。

また、アプリは下位互換性が保証されているので基本的に下位OS用のSDKで作成したアプリは上位のOSでも動く。が、逆は偽なり。当たり前か。
上位OS用のAPIを使いたい場合は対象ユーザの動向を見てからですね。

mac book air導入&Snow Leopardでのemobile設定

mac book airデビューしました!

うっすいPC欲しくてさ。
iPhoneアプリ開発とかちょっと興味あってさ。

ついに導入していしまいました。
新卒半年でためたお金が完全パァですよ、全くもう。


とはいえ導入したのは1週間前。
ネット環境としてemobileを使おうと思ってたんだけど、Snow Leopardはemobileの設定上の不具合があるみたいでなかなか導入できていませんでした。

とはいえ導入がそんなに難しかったわけじゃなくてその時間が取れてなかっただけなんですけどね。
以下の通りにやれば何のその。

http://www.kbuild0231.org/2009/08/29/snowleopard_d02hw_clearinstall/


これで電車の中でもカフェでも。
自分の好きなところがオフィスになるわけだね。

楽しみ♪

2009年10月11日日曜日

集合知プログラミング勉強中。

集合知プログラミングについて勉強中です 参考:集合知プログラミング
集合知プログラミングとは、多数のデータが存在する中から有益な情報を得るための手法の一つで、簡単にいえばみんなが好きなものは僕も好き。似たような人が好きbなものは僕も好き。みたいなそんなプログラミング(若干語弊あるか?)。

以下は使えそうかなと思われるな技術についていくつかまとめてみました。

①クラスタリング


あるデータ群があった時に自動的に分類を行うための技術。
データ群が何かしらの属性を持ち、その属性を数値化できるとき、この手法を適用することができる。
クラスタリングを行う手法としては、k平均法や階層型クラスタリングが主流。
k平均法に比べ、階層的クラスタイリングのほうが汎用的で使い勝手がよさそう。
教師なし学習の1つ。

②ベイジアン分類器


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、ベイジアン分類器が有力。
基本的には教師となるデータ群があり、それらデータ群を元に分類器のパラメータ調整を行うことで分類器が完成する。
分類器完成後は未学習のデータであっても分類を行うことができる。これを汎化という。教師あり学習の1種。

③ニューラルネットワーク


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、分類器を作るための手法の一つ。
つまり、ベイジアン分類器とできることとしては同じ。
ニューラルネットワークはその名の通り、ニューラル、すなわち神経細胞のネットワークを模倣した数学モデルにて構築される。

ベイジアン分類器との違いは、ベイジアン分類器がデータ群を線形に切り分けるのに対して、ニューラルネットワークはより一般化した形の任意の関数にて切り分けることができること。すなわちより複雑なデータ分類器を構築することが可能。

一方、ベイジアン分類器に対する弱みも複数存在する。

ネットワークの規模を決める定量的指標が存在しない。
ある一定の経験則に基づく中間層や入力層の決め方は存在するが、データセットの統計上の特徴に左右される。

また、ベイジアン分類器はトレーニングの速度と、巨大データセットに対する問い合わせ速度に強みを持つ。高速演算が必要な局面にて効果を発揮する。
また、分類のされ方がニューラルネットワークではわかりにくいのに対して、ベイジアン分類器は統計情報に基づくためわかりやすい。

③決定木分類


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、分類器を作るための手法の一つ。
これもベイジアン分類器やニューラルネットと同様のデータセット群を分類するために用いられる。

最終的な学習結果が、決定木と呼ばれるツリー構造になるのが特徴。
データセット群を学習させると、最終的にはYes/Noゲームを自動的に生成するようなイメージ。
学習済みモデルの解釈が最も直観的にわかりやすい。
学習済みモデルの解釈が非常にわかりやすい。
また、非常に重要な要素がツリーのトップに出てくることが他の分類木に対する強みといえる。

2009年8月7日金曜日

railsでdebugが楽にできるようになりました ~ruby-debug

ruby-debugが便利。

今までは、デバッグを行うときに、流れるログを見ながら

p "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


なんてものを目印にエラーがどこで出ているか、
また、関連個所に変数の値が正しいかどうかを表示させながらデバッグをしていたわけなんですけれども、ruby-debugを使うと便利。
止めたいところで止めてくれるから。
そこでいろんな変数を見ることができるから。

以下設定手順。

1.gem install ruby-debug
2.処理を途中で止めたい部分で、「debugger」と記述。viewの場合は「<% debugger %>」を記述。
3.実行
4.debuggerと書いたところで一時停止するので、そこでデバッグ用のコマンドを叩く。

以上。

デバッグ用のコマンドは以下のものを使うと便利そう。
list: ソースの表示
var: local ローカル変数一覧表示
pp: 変数名 変数の表示
frame: コールスタック表示
step: ステップイン実行
next: ステップオーバー実行
cont: 実行再開

WISH2009がおもしろそう。

前々から気になってたTokurikiさんのWISH2009の一般参加申し込みが始ってるようです。
http://blog.tokuriki.com/2009/08/wish2009_2.html


WISHの略は
Web
Innovation
SHare

知名度が低いけれども可能性のあるサービスや端末が飛躍するきっかけを与えようというのが目的。

NikkeiBPNet、ITmedia、TechCrunch、CNETなど、非常にメジャーどころのメディアさんたちがメディアスポンサーになってるあたり、かなり注目度も高いんじゃないかと思ってます。

日本からこういうサービスが出るようになるといいなと思いますし、
こういう場で堂々と発表できるサービスを自分で立ち上げていけるといいですな。

WISH2009

2009年7月10日金曜日

Web立ち上げのリアルな声を聞くのはおもしろい。

Web立ち上げ勉強会というものに参加してきた。

いかにして新規のWebサービスを立ち上げるか、そしてそれを広めていくかということに対して、参加者のWeb立ち上げ経験者が意見交換を行うというもの。

リアル体験談は非常に興味深し。


・仮説を立てたらしっかりと検証を行うこと。
・初期ユーザの獲得には人脈力が大きくすること。
・初期ユーザの獲得はひたすらプッシュ!
・プッシュするにしても効果の高いプッシュをすべき
・リアルな情報が信頼感を向上させる
・初期の流行ってる感が重要
・初期の流行ってる感はスタープレイヤーを置くことで対処
・スタープレイヤー以外の一般プレイヤーは見せないくらいでいい。
・コミュニティ系サイトは炎上する
・炎上した際に炎上したままにするか炎上を削除するかは両者ともに意義がある
・その際、提供したい価値を考え、軸をブラさないようにすることが重要
・プレスリリースは効果が大きい。
・プレスリリースの際にも方法論はある。
・異業種交流会でライターさんと知り合いになっておく
・月曜の朝一にプレスのお願いを出すといい、など。

などなど。
備忘録的に書きました。


グループワークでtwitterの新しいサービスを考えるということで
taxtter
というものを発表してきました。

反応はいまいち。。

2009年7月1日水曜日

[Rails]findメソッドとfind_by_idメソッドの微妙な違い

モデルが参照するテーブルのレコードで、存在しないidものにアクセスしようとすると、その戻り値がfindとfind_by_idで違うことについて。

dataテーブルのidカラムが1~9まで埋まっているものとしよう。
このとき、id = 5のものにアクセスしようとすると、

Data.find(5) # => datasテーブルの5番目のDataモデルインスタンス
Data.find_by_id(5) # => datasテーブルの5番目のDataモデルインスタンス
Data.find(5) == Data.find_by_id(5) # => true


同じものが返ってきます。
一方、id = 10のデータにアクセスしようとすると、そんなインスタンスはなく、

Data.find(10) # => # ActiveRecordNotFound
Data.find_by_id(10) # => nil


返ってくるものが違うんですね!

2009年6月30日火曜日

Googleと知恵袋とVBAがすっごい便利だと思う

完全にルーチンワークな作業が舞い込んできたときにこの3つのツールは本当に便利。


要はたくさんのExcelファイルから情報を読み込んで1つのシートにまとめるっていう作業がありまして。
そこまでファイル数も大きくないしなー
マクロ組むほどでもないか―
とか思いながら1個1個データを移してたら。。。


意外と時間がかかる!
てか、あとのフォルダの情報量半端ねえ!!

ってことでネット検索♪
先人たちの遺産はネット上にごろごろ転がってるわけですよ。

検索に特化したgoogleさん。
人が質問するワードに近い検索が容易な知恵袋系サービス。
そして一瞬にして問題解決を行ってくれるマクロ♪

おそらく1時間くらいかかりそうな作業が検索・ダウンロード5分。理解10分。実行&生成で10分くらいで完了しました♪


以下今回使ったソース。
フォーマットの決まったExcelファイルを一括で読み込んでその情報を1つのExcelシートにまとめる。
今回のケースはA1, A2, A3セルに情報が入ってるものとする。


Sub summary()
Sheets.Add
Set nSH = ActiveSheet
rL = 1

Set mySh = CreateObject("Shell.Application")
Set myPath = mySh.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, 0)
If myPath Is Nothing Then Exit Sub
If myPath.Items Is Nothing Then Exit Sub
If myPath.Items.Item Is Nothing Then Exit Sub
フォルダ = myPath.Items.Item.Path
Set mySh = Nothing: Set myPath = Nothing

Set myFS = CreateObject("Scripting.FileSystemObject")
For Each myCSV In myFS.GetFolder(フォルダ).Files
If LCase(myFS.GetExtensionName(myCSV)) = "xls" Then
Workbooks.Open myCSV
'For Each rSH In Sheets

For Each myCC In Range("A1, A2, A3") ' ここに取得したいセルを羅列
rC = rC + 1
nSH.Cells(rL, rC).Value = myCC.Value
Next
rC = rC + 1
nSH.Cells(rL, rC).Value = ActiveWorkbook.Name
rC = rC + 1
nSH.Cells(rL, rC).Value = ActiveSheet.Name

rL = rL + 1
rC = 0
'Next
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
End If
Next
Set myFS = Nothing: Set nSH = Nothing
MsgBox "完了"
End Sub


読めばわかるけどまだVBA慣れてない。。
これも要勉強ですね。

2009年6月28日日曜日

Windows上でUbuntuを動かしてみた。

ここのサイト参考にしてWindowsにUbuntu入れてみた。
すっげー簡単なのね。

http://www.ubuntulinux.jp/products/JA-Localized/vmware


イメージとしてはこんな感じ。
最初からOpen Officeも入ってるんですねー。




ただ、セットアップ中に

「この仮想マシンで VMware Tools パワーオンスクリプトが正常に実行されませんでした。仮想マシンにカスタムされたパワーオンスクリプトが構成されている場合は、スクリプトにエラーがないか確認してください。それ以外の場合は、サポートにご連絡してください。」

というエラーが出たのが気になる。。
問題なく動いてるからいいけど、何なんだろ?

それからもう一点。
VMwareを使ってUbuntu立ち上げるとだいぶメモリを食います。
タスクマネージャで確認したところ、およそ500MBのメモリ消費量。。

2009年6月27日土曜日

[書籍]世界で一番簡単なUnixのe本

そろそろちゃんとUnixとかサーバとか勉強しようと思ったのでタイトルに釣られて本書購入。




世界で一番簡単なというように、
非常にわかりよいイラストと解説・章ごとクイズ・まとめと解説等があって好印象。

内容としては、
そもそも情報処理とは何かとか、Unixとは何かといったことから始まり、
Unixのコマンドの紹介があったり、
WindowsでUnixを使ってみましょうという話があったり。

何よりも、こういう知識は理解しただけじゃ意味がないのでMy windowsパソコンにVM Wareあたりをインストールして使ってみようと思います。

2009年6月23日火曜日

脆弱性とは何か?-ウェブアプリに関する脆弱性のまとめ

脆弱性ってなんなん?って思ったのでちょっとまとめた。

簡単に言うと、
脆弱性とは、コンピュータやネットワークなどの情報システムにおいて、第三者が保安上の脅威となる行為(システムの乗っ取りや機密情報の漏洩など)に利用できる可能性のあるシステム上の欠陥や仕様上の問題点。

以下のサイトが詳しい。
http://www.ipa.go.jp/security/vuln/20050623_websecurity.html

で対策としては、

1. アプリと
2. サーバと
3. ネットワークを

守れと。
監視しろと。
無駄なものは省けと。

そんな感じ。



で、今回ちょっとウェブアプリに関する脆弱性についてまとめてみる。

◆ SQL インジェクション

何か:SQLコマンドを用いた攻撃

対策:SQL文の組み立てにバインド機構を使用
   利用できない場合、SQL文の変数に対しエスケープ処理
   パラメータにSQL文を直接指定しない
   エラーメッセージをブラウザに表示しない
   データベースアカウントに適切な権限を与える

◆ OS コマンド・インジェクション

何か:OSコマンドを用いた攻撃

対策:シェルを起動できる言語機能の利用を避ける
   利用する場合は、引数を構成する全ての変数に対してチェック

◆ パス名パラメータの未チェック/ディレクトリ・トラバーサル

何か:外部にwebサーバないのフォルダ構成がばれることによる攻撃

対策:外部からのパラメータにファイル名を指定しない
   固定のディレクトリを指定しディレクトリ名がばれないようにする
   ウェブサーバ内のファイルへのアクセス権限を設定
   ファイル名のチェック

◆ セッション管理の不備

何か:このセッションID の発行や管理に不備がある場合悪意のある人にロ
グイン中の利用者のセッションID を不正に取得される

対策:セッションIDを推測が困難なものにする
   セッションIDをURLパラメータに格納しないようにする
   HTTPS通信で利用するCookieにはsecure属性を加える
   ログイン成功後に、新しくセッションを開始するようにする
   ログイン成功後に、既存のセッションIDとは別に秘密情報を発行。ページの遷移毎にその値を確認
   セッションIDを固定値にしない
   セッションIDをCookieにセットする場合、有効期限の設定に注意する
 
◆ クロスサイト・スクリプティング

何か:入力値を用いて出力値を出すウェブアプリにおいて、出力値にスクリプトを埋め込まれる

解決:ウェブページに出力する全ての要素に対して、エスケープ処理
   出力は「http://」「https://」に限定
    要素の内容を動的に生成しない
   スタイルシートを外部サイトから取り込めるようにしない
   入力値の内容チェックを行う
   入力されたHTMLテキストから構文解析木を作成し、スクリプト排除
   入力されたHTMLテキストから、スクリプトに該当する文字列を排除
   HTTPレスポンスヘッダのContent-Typeフィールドに文字コード(charset)指定
   Cookie情報の漏えい対策として、TRACEメソッドを無効化し、発行するCookieにHttpOnly属性を加える
   
◆ CSRF(クロスサイト・リクエスト・フォージェリ)

何か:Webサイトにスクリプトや自動転送を仕込むことにより閲覧者に意図せず別のWebサイト上で何らかの操作を行なわせる攻撃

解決:処理を実行するページを POST メソッドでアクセス
   「hidden パラメータ」に秘密情報が挿入されるよう前のページを自動生成。
   処理実行直前のページで再度パスワードの入力を求める
   入力されたパスワードが正しい場合のみ処理を実行
   Refererが正しいリンク元かを確認し、正しい場合のみ処理を実行
   重要な操作後、ユーザーの登録済みメールアドレスに結果を自動送信
   
◆ HTTP ヘッダ・インジェクション

何か:HTTPヘッダに、任意の情報を挿入することで攻撃を行う手法

解決:ヘッダの出力を直接行わない
   ウェブアプリケーションの実行環境や言語に用意されているヘッダ出力用APIを使用
   改行コードを適切に処理するヘッダ出力用APIを利用できない場合、改行を許可しない
   外部からの入力の全てについて、改行コードを削除する
   
◆ メールの第三者中継

何か:全く関係のない第三者のメールサーバを踏み台にして送信元を偽造

解決:外部からのパラメータをメールヘッダの内容に指定しない
   外部からのパラメータをメールヘッダに指定する場合は、危険な文字を排除

2009年6月21日日曜日

クラウド勉強中③AWSをより安く使うには

Amazon EC2は同じ機能を使うにしても、料金が変わってくる。
サービス自体が従量課金であるため、ちょっとの差でも大きく変わってくる。
注意したいところ。

1. WindowsよりもLinux

AmazonEC2においてではスペックにより値段が変わる。
それは当然だとしても、同じスペックでOSの種類によって値段が変わる。
例えば、Standard Instance Smallの場合、
Windows: 0.125ドル/1h
Linux: 0.1ドル/1h

ほんの0.025ドルの差だが、これが1000hになった時には25ドル、1年間では219ドルの差になってくる。
同じスペックなのにこの値段の差。できればLinuxを使いたい。
(僕はまだLinuxは不慣れです。。)

2. ヨーロッパよりもアメリカ

Amazon S3ではデータの保存容量に対して課金がされる。
使用するサーバがどこにあるかによって料金が変わってくる。
例えば、Amazon S3の合計保存容量が50TB未満の場合、
アメリカ: 0.15ドル/1month・1GB
ヨーロッパ: 0.18ドル/1month・1GB
アメリカの方が断然安い。

Amazon Cloud Frontではアメリカに設置されてるサーバが最も安く、
0.17ドル/1month・1GB
日本に設置されてるサーバが最も高く、
0.22ドル/1month・1GB

AWSを使うときにはこの辺もしっかりと考慮しなきゃですね。

クラウド勉強中②Amazon Web Serviceで何ができるか

インフラ型のクラウド技術としてAmazon Web Serviceが有名。

AWSは何ができるかを簡単にまとめ。


1. Amazon Elastic Compute Cloud(Amazon EC2)

仮想サーバを構築できるサービス。
The New York Timesが使用。セカンドライフも使ってる。

1-1. Amazon Elastic Block Store

Amazon EC2が使用するディスクスペースを提供するサービス。外部ハードディスクのようなもの。

1-2. Elastic IP Address

Amazon EC2はIPアドレスが動的に変化するが、Amazon EC2にて固定IPを利用するためのサービス。

2. Amazon Simple Storage Service

ディスクストレージサービス。
drop boxはこのサービスを利用。twitterのプロフィール画像もここに保存。

3. Amazon SimpleDB

Webアプリケーションのデータベースサービス。

4. Amazon Simple Queue Servise(Amazon SQS)

メッセージキューイングサービス。
アプリケーション間での送信データ一時的に保管することで、処理待ち時間を減らせる。

5. Amazon CloudFront

コンテンツ配信サービス。
Amazon S3に保存されているコンテンツを高いデータ転送速度にて配信可能。
日本にもサーバがあるため転送速度が速い。


※その他オプションで気になったもの

EC2 on Rails


Amazon EC2でRailsアプリケーションを利用するためのツール。
Railsが簡単に使えるみたいですな。

2009/06/28
EC2 on Railsに関することをまとめてくれてる記事発見。

http://fromnorth.blogspot.com/2008/06/amazon-ec2s33-ec2onrails.html

クラウド勉強中①クラウドコンピューティングは何からできているか

クラウドコンピューティングについて勉強中。
以下クラウドを構成する要素についてまとめ。

グリッドコンピューティング

各地に点在するコンピュータをまとめあげてひとつのコンピュータとみなすこと。
1つ1つは小さな、スペックの小さなコンピュータではあるけれども、まとめあげることで大きな1つのコンピュータとみなすことができる。
名前の由来は電力網(Power Grid)。
うちの大学に一時期アジア最速のスパコンがありました(現在は地球シミュレータに負けましたかね?)が、それはグリッドコンピューティングにより構成されていました。

仮想化

コンピューティングリソースの抽象化を表す言葉。
1台のマシンの中に複数のOSを同時に立ち上げたり、複数のマシンで1つのOSを立ち上げたりする技術。
リソース余ってるよーていうコンピュータに処理を分けてあげたり、リソース足りないよーていうコンピュータと他のコンピュータを足してあげたりできる。

ユーティリティコンピューティング

CPUやストレージなどのコンピューティングパワーを電気やガスと同じように使った分だけ課金される仕組み。
AmazonのS3/EC2などは普通のサーバと異なり、サーバーという大きな塊を買うのではなく、サーバーを使った容量、転送量、起動したサーバーの時間数によって課金される。
初期コストが低くて済むのがポイント。家を買う金はないけどアパートには住める。そんなイメージ。

シンクライアント

ユーザが使うコンピュータには必要最低限の機能しか持たせず、処理のほとんどをサーバ側で行う形態。
gmailとかgoogle documentとかが特にいい例。
ユーザはwebブラウザを持っていればよく、ネットにつなげばメール、ドキュメント編集ができる。

2009年6月19日金曜日

railsのfind_by_sqlでselect * ... join ... ってやるときちょっと注意

sql文を使ってデータベースからデータを取得するときに、

samples = Sample.find_by_sql(["select * from samples inner join others on samples.id = others.sample_id ...])

ってやると、joinする側とされる側に同じ名前のカラムがあると、うまくデータが取れないことがあるみたいです。
例えば2つのテーブルのカラムにidというカラムが含まれている場合、どっちのidなの?ってことで分からないみたいですね。
ちゃんと、samplesテーブルのデータですよということを明記して

select samples.* from samples inner join others ...

と取得するテーブル名を明記するようにしましょう。

バグ修正において気をつけなくてはいけないこと。

バグが報告され、それを修正するときに気をつけなくてはいけないこと。


1.可能な限り同じ条件でバグが再現することを確認する

2.バグが発生した原因を特定する

3.バグフィックス

4.最初に行った条件と同じ条件でバグが再現しないことを確認する


バグが報告される現場は、自分の開発環境と基本的には異なる。
よって、バグが報告された環境と全く同じ環境にてバグを確認することはできない。
できないなりにもできるだけ同じ環境でやった方がいい。

ユーザーのいるシステムである場合にはそのユーザー権限にて確認するくらいの方がいい。
すぐに2.や3.から始めがちだったり、違う条件でバグの確認をしがちなので注意。


最後に本当にバグは治ったの?
という問いにこたえられなくなる。

2009年6月12日金曜日

デバッグにおいて注意すべきことのまとめ

ほんの些細なことで丸1日つぶれた。
そんなことにならないためにも体系的なデバッグの仕方を定着させておいた方がいい。

ということで、今回学んだデバッグにおいて注意すべき点のまとめ。

1. エラーの場所を特定する。
基本中の基本ですね。特定しないことには何も始りません。
ただ、特定する場合も、action名を特定するだけではなく、より具体的に場所を特定しましょう。

2. パラメータを追っていく
基本的にはrailsのプログラムなどはステートレスにパラメータを渡したりしています。そのため、あっちへ行った入りこっちへ行ったり。
その途中で変な値が入る可能性があるので注意しましょう。

3. フィルタを見る
アクション、コントローラには、フィルタがあります。
特定のアクションが実行される前に実行されるアクションです。
見落としの内容にしっかり確認しましょう。

4. ログを見る
これが基本という方もいるみたいですが、重要です。
パラメータを追っていくよりログを見て実際にどのような動きをしていたのかを確認しましょう。

5. 同じ環境・同じデータで確認する
これも基本です。
不具合が報告された場合には同じ環境・同じデータで確認をしましょう。

6. 違う環境・違うデータで確認する
これはイレギュラーなケースかもしれませんが、ひょっとすると特定のデータ・特定の環境が悪いのかもしれません。
その可能性も否定できないので別の環境でも試してみましょう。



それにしても、HTTPのGETリクエストで

?ids[]="12345"

となるパラメータを渡したとき、

ローカル環境のrails君は{:ids => ["12345"]}と解釈したのに対して、
テスト環境のrails君は{:ids[] => "12345"}と解釈したのだろう?

誰か原因がわかる方いらっしゃいましたら教えてくださいm(_ _)m

泣いて喜びます。