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

泣いて喜びます。

2009年6月3日水曜日

テスト駆動開発がちょっといいみたい。

開発を進めていて、あれやったっけ?これやったっけ?
あーわからん!バグが出た!

と、ならないためにもテスト駆動開発というものがいい気がする。
テストケースのスタックの場として
自分の思考プロセスのスタックの場として
非常にうまく機能すると思われる。


以下テスト駆動開発について自分の知識の定着としてまとめ。

◆テスト駆動開発の3つの手順
1. 失敗するテストを書く
2. できる限り早く、テストがパスするような最小限のコード本体を書く
3. リファクタリングをする

細かくテストを書いて細かく実装し、全体の整合性が取れないところは後で修正しろって話か。

◆テスト駆動開発の利点
1. Clean code that works.の実践。まず動く。あとできれいに。
2. 後戻りしない
3. テストコード自体が設計書となる
4. 欠陥やバグが少ない


◆テスト駆動が適用しにくいもの
※人の判断がはいるもの → 後戻り処理が入るため
グラフィカルユーザインターフェース (GUI) を扱うもの
 分散オブジェクト
 データベーススキーマ
 サードパーティコードや、外部ツールで自動生成されるコード
 BNFからコンパイラやインタプリタなどを製品レベルの品質で作ること


タスク的なプログラム処理にはもってこいだね。

【情処本勉強中】2分探索木

2分木については知っていたけど、どうやって探索するのかについては知らなかったのでメモ。

・2文探索木
[再編成処理]
2文探索木のノードが削除された場合の再編成処理
①削除されたノードから見て、左にある最大値を削除されたノードに入れる
②削除されたノードから見て、右にある最小値を削除されたノードに入れる

追加は左の子は右の子よりも大きな値を持つようにする。

[2分木探索]
①行きがけ順(先行順)深さ優先探索
逆ポーランドのなぞり方で先に探索する
②帰りがけ順(後行順)深さ優先探索
逆ポーランドのなぞり方で後に探索する
③通りがけ順(中間順)深さ優先探索
逆ポーランドのなぞり方でノードの中間を探索する
④幅優先探索
配列を先頭から順番に探索

2分木にヒープというものがある。
親要素が常に2つの子要素より大きくならない(またはその逆)構造になっている木。

そのヒープを用いたソート方法。
降順ヒープソートの手順
①親と子を比較。
②親よりも小さな子があれば交換。(ヒープの構成)
③最後のデータと根を交換。
④最後のデータをソート対象から外し、①に戻る。

入れ替えてはソート対象を外しヒープの構成を行う。これを繰り返す。

2009年6月2日火曜日

【情処本勉強中】待ち行列理論

基本モデルはM/M/1の待ち行列モデル。
特徴
①トランザクションの発生はポアソン分布・処理は指数分布。
②窓口数は1
③待ち行列の長さに制限なし

■用語と公式
平均到着率    どの程度・頻度で到着するか 
平均到着時間   どの程度の間隔で到着するか  1/平均到着率
平均サービス率  単位時間何件処理できるか 
平均サービス時間 1件処理するのにかかる時間   1/平均サービス率
利用率      窓口を占有している時間    平均到着率/平均サービス率
平均待ち時間   待ち行列の待ち時間      (利用率/(1-利用率))*平均サービス時間
平均応答時間   待って処理が終わるまでの時間 平均待ち時間+平均到着時間

う~ん、分かりにくい。すっきりこれで十分かと↓

■用語と公式
平均到着時間   どの程度の間隔で到着するか
平均サービス時間 1件処理するのにかかる時間
利用率      窓口を占有している時間    平均サービス時間/平均到着時間
平均待ち時間   待ち行列の待ち時間      平均サービス時間*(利用率/非利用率)
平均応答時間   待って処理が終わるまでの時間 平均待ち時間+平均到着時間

【情処本勉強中】回帰直線と相関係数

目下基本情報の勉強中。
使ってる参考書はこちら。


とりあえず第1章基礎理論終了。
だいぶ前に勉強したところで忘れてるところが結構あって勉強になった。
知らないところもあったので今後調べていこう。

今回は回帰直線と相関係数について。
統計情報を扱うには非常に重要な項目。意外と回帰直線の傾きと相関係数について見落としポイントがあったのでまとめ。

--
回帰直線は、散布図に描かれる各データと、回帰直線との差である偏差を最小にする直線。
相関係数とは2変数に密接な関連があるか否かを示す係数。-1~1の範囲をとる。
1に近ければ正の相関。-1に近ければ負の相関。0に近ければ無相関。

相関係数の値が異なっていても同一の回帰直線が求められることがある。

回帰分析は単回帰分析と重回帰分析に分けられる。
単回帰分析は1変量。重回帰分析は2変量以上。

単回帰分析はいわば体系化のための分析法。
構造化のための分析法にクラスタ分析(データを類似のグループに分割する)がある。
--


ちなみに。
回帰直線はサンプルデータの1次関数近似として表現できる。
この1次関数は、サンプルデータと1次関数の偏差の総和を1次関数のパラメータで微分してあげると簡単に求めることができる。
多変量の場合に難しいかと言われればそうでもなくて、1次関数が単に多変量になっただけで1変数の場合と同様に近似関数のパラメータで偏微分してあげるといい(微分とはチョイ違う)。

さらには1次関数だけでなく複雑な関数でサンプルデータを近似することができる。
ただ、微分がちょっとだけ面倒になることがネックかも。

この辺の話を公式として覚える際には1変量、1次関数近似が限界だけど、微分の手法を覚えれば多変量、複雑関数でも何でも適用できる。

2009年5月30日土曜日

情報感度を広げておくだけではいけない 一歩先へ

エンジニアとして大切なこととして一つ学んだのでメモ。

google リーダーはいつも見てます。
はてブのホットエントリーは欠かさずチェックしてます。
気になるワードはgoogle alertで確認しています。


これらはすごく重要だけれども、それだけではいけない。

これらの情報の中には一見、いいな!使ってみたいな!
と思える情報がたくさんあります。

ただし、それだけで終わるのではなく、ちゃんと考えることが重要。
特に、
「なぜ?だから何?」
「他には?」
という垂直型の志向プロセスと、水平型の志向プロセスを組んで考えた方がいい。

自社のサービスにとっていいと思える情報を見つけたとして、それがいいらしいということで終わるのではなく、
こういう理由でこの情報は有効であり、自社のサービスの中のこの問題を解決できる。という垂直思考。(ロジカルシンキング)

また、じゃあ、その問題に対して他に解決案はないのか、その情報を元にした取組を行う際に問題となる点はないか。という水平思考(ラテラルシンキング)

今後、意識して取り組んでいこう。

やるべきか、やらざるべきか ~KPT (keep, problem, try)~

事業計画について考えていて、現在考えている事業計画を実行するか否か、
KPTという観点で考えた方がいいというアドバイスを受けたので調べてみた。

K:keep=今後も続けること
P:problem=問題なので、やめること
T:try=今後、試してみたいこと

フレームワークとしては
tryが大枠としてあって、tryの項目をkeepやproblemに振り分けていくというもの。

アジャイル開発や反復型開発ではイテレーション(繰り返しの単位)ごとに作業の振り返りが推奨されるが、そのためのチーム反省会などでよく用いられるフォーマットである。

らしい。


個人的な仕事の振り返りにも使えるフレームワークであり、仕事の振り返りとして有効そうなPDCA(改善サイクル)、GTD(ストレスフリーな仕事術)よりもシンプルに仕事管理ができそうな気もした。

2009年5月28日木曜日

ヒアドキュメントを知らずにAptanaで苦労した

ヒアドキュメントでちょっと躓いたのでまとめ。
ヒアドキュメントとは

UNIXのシェル(csh、bashなど)が提供する、スクリプト用の機能の1つ。コマンドの標準入力に渡すデータをスクリプトファイル中に記述できる。これによって、スクリプトファイル中に比較的大量の定数テキストデータ(少量なら、echoコマンドで生成できる)を埋め込むことができ、管理が容易になる。ヒアドキュメントは、リダイレクト記号“<<"によって記述する。

by デジタル用語辞典

らしいですね。
要は長い文字列を扱うときに使いますよと。
Rubyでは例えばSQL文を直打ちするときに

sql = <<-SQL
  SELECT * FROM tables
WHERE ...
   ...
SQL

Model.find_by_sql( sql )

のように使う。別に

Model.find_by_sql("
SELECT * FROM tables
WHERE ...
   ...
")

でも同じ結果が出る。

と、思ってたけど文字列を指定する部分の中が長くなりすぎるとよくないみたい。
Aptanaで開発する場合には。

ヒアドキュメントを使わずにちょっと長めのSQL文を書いてAptana経由でリポジトリにコミットかけようとしたらエラー発生。。
長めの文字列を指定するときにはヒアドキュメントを使うようにしよう。

2009年5月18日月曜日

カーソルについてMindMapでまとめてみた

カーソルについてのマインドマップでのまとめ

ポイントは
非手続き型言語であるSQLに対して繰り返し処理ができるということ。

カーソルの指定の仕方は
①カーソルの宣言
②カーソルを開く
③1行ごとにデータを取り出す
④カーソルを閉じる



まとめてみたのはいいものの、どこで使えばいいのかの見当は立っておらず。。

RailsでSQLを直打ちする方法 ~使うメソッドの違いによる戻り値の違い~

RailsでSQLを直打ちする方法は2種類あるらしい。
でも、それぞれの戻り値のデータ型に違いがある。

①find_by_sqlを使う方法
②select_allを使う方法

find_by_sqlを使う方法だと、戻り値はActiveRecordオブジェクトの配列となり、select_allを使うとハッシュの配列となる。

なので、たとえばarticlesテーブルのモデルArticleに対して、このテーブルがdetailというカラムを持っているとしよう。このとき、

articles = Articles.find_by_sql("select * from articles")

とすると、articlesテーブルのある行のdetailカラムへのアクセスは、

articles[0].detail

となり、

articles = Articles.connection.select_all("select * from articles")

とすると、

articles[0][detail]

となる。
ちょっと注意ですね。

2009年5月16日土曜日

トランザクションについてMindMapでまとめてみた

トランザクションについてのマインドマップでのまとめ。

ポイントは以下の3点
①ACID特性
②コミットとロールバック
③排他制御

Ruby on Rails どうしてもエラーの原因がわからない時には

①文字コードがおかしなことになってませんか?
②予約語を使ってませんか?

あたりをチェックしてみるといい。



文字コードがおかしなことになってませんか?


Railsが処理する文字コードはUTF-8。

ウインドウズ環境で
ruby script/generate
によるファイル生成をにより生成されるファイルの文字コードはSHIFT-JIS。

エディタで編集して保存するときにはそのまま保存するのではなくutf-8で保存するという点に注意が必要。
AptanaやEclipseなどの統合開発環境で保存するときには勝手にやってくれるみたいなのであまり意識する必要はないけど、Eclipseから軽い秀丸エディタあたりに変えた時にはまりそうなので注意しとこう。


予約語を使ってませんか?


予約語は変数名やテーブルのカラム名に使うとエラーが出る。またそのエラーがわかりにくい。
rubyの予約語、railsの予約語、SQLの予約語についてまとめる。

①Ruby予約語
BEGIN class ensure nil self when
END def false not super while
alias defined? for or then yield
and do if redo true
begin else in rescue undef
break elsif module retry unless
case end next return until

クラス名、変数名などに用いることはできないみたい。接頭辞$, @、@@が先頭についたものは予約語とは見なされないので使うことが可能。また、def のあとやメソッド呼び出しのピリオドのあとなどメソッド名であるとはっきり分かる場所ではメソッド名として用いることができる。

参考:
http://www.ruby-lang.org/ja/man/html/_BBFAB6E7B9BDC2A4.html

②rails予約語
多すぎるので参考リンクのみ。
http://wiki.rubyonrails.org/rails/pages/
ReservedWords#reserved_words_you_can_t_use


Other Names Reported to Have Caused Trouble
"トラブルが報告された他の名前"

という語も使っちゃだめらしい。

③sqlの予約語
テーブル名・カラム名にこれらの言葉を使うのはやめましょう。
http://msdn.microsoft.com/ja-jp/library/ms173340.aspx

webサイト表示の体感速度を上げる方法 cssは先に、javascriptは後に

webサイトを構成する際、HTMLの中にcssとjavascriptのタグをインラインで組み込むことが多いと思う。
その際、cssは先に、javascriptはあとに書いた方がいいよというお話。

簡単に説明すると、
①ブラウザはダウンロードしてきたものから順次レンダリングしようとする
②cssはHTMLを表示するためのレイアウトを決定し、javascriptはHTML表示後の動きを決定する

ということがポイント。


HTMLが呼ばれた順番にブラウザ上ではページが表示されていく。よってページのレイアウトを決めるCSSが先に読み込まれていた方が表示は早い。再度レイアウトを変更する必要がないから。
また、javascriptはHTML構成後の動きを決定する部分で在るので、HTMLが完全に読み込まれた後でもいい。言ってみれば完全にブラウザ上でページが構成された後でもいい。


なので、cssは先に、javascriptはあとに書くことでHTMLの「体感速度」が向上するわけですね。


ちなみにcssとjavascriptをできるだけ外部コンポーネントとして構成してあげるとブラウザにページキャッシュとして保存されるのでより高速化するみたいですね。


ポイントは
①css、javascriptはできるだけ外部コンポーネント化
②どうしてもインラインに記述する場合はcssが先、javascriptが後。


参考:
http://www.onflow.jp/cyano/archives/143
http://www.inter-office.co.jp/contents/188/

2009年5月14日木曜日

zipファイルの展開後のディレクトリ構造について

たとえばimagesディレクトリのfile1.jpgとfile2.jpgをzip圧縮しようとするときの話。
linuxのコマンドで、


zip image.zip images/file1.jpg images/file2.jpg


と打ってzipファイルを生成すると、展開先のディレクトリにはimagesディレクトリの下にfile1.jpg、file2.jpgファイルが展開される。

展開先ディレクトリ直下に直接圧縮ファイルをおきたい場合は、一旦ディレクトリを移動したのち圧縮をかける必要がある。


cd images; zip image.zip file1.jpg file2.jpg; cd ..;

2009年5月13日水曜日

HTTPに関することをMindMapでまとめてみた

これから覚えよう。

参考
http://www.studyinghttp.net/
http://www.tohoho-web.com/ex/http.htm

2009年5月12日火曜日

blankとnil

blankの意味は空っぽ
nilの意味は存在しない

あるオブジェクトが
 nilならばblankは真
 blankならばnilは偽

  
nil.nil? => true
nil.blank? => true
[].blank? => true
[].nil? => false
[nil].blank? => false
[nil].nil? => false
[nil].first.blank? => true
[nil].first.nil? => true


オブジェクトが変数になってると意外と見落とすところ(特に最後)

ファイル転送

ファイル転送メソッドについて。

  
require 'net/ftp'

def self.upload(file, options)

  ftp = Net::FTP.new
  ftp.connect(options[:ftp_server])
  ftp.login(options[:user], options[:passwd])
  ftp.binary = true
  ftp.chdir(options[:dir]) if options[:dir] 
  ftp.put( file )
  ftp.quit

end

と書いてあげればファイルのFTPアップロードができる。
ちなみに引数は以下の通り。
  
files #転送したいファイルのファイル名を要素に持つ配列
options[:ftp_server] # サーバーのホスト名
options[:user] # ユーザ名
options[:passwd] # パスワード
options[:dir] # 転送先ディレクトリ

ruby リファレンスによると、
  
Net::FTP#put(localfile, remotefile = File.basename(localfile), blocksize = DEFAULT_BLOCKSIZE)
Net::FTP#put(localfile, remotefile = File.basename(localfile), blocksize = DEFAULT_BLOCKSIZE) { |data| .... }

binaryの値に従ってローカルファイル localfile を送信し、 remotefile をファイル名とするリモートファイルに保存します。 remotefileが省略されるとlocalfileのベースネームが仮定されます。 block_sizeが省略されるとDEFAULT_BLOCLSIZEが仮定されます。この値は binary が真であるときのみ有効です。
---

らしいので、転送先で指定したファイル名で転送先に保存したい場合はputの引数に保存するファイル名を指定してあげるとよい。

2009年5月11日月曜日

find関数のincludeオプションで気をつけること

大きな子関連を持つデータベースから情報を引っ張ってくるときにincludeオプションを使うと便利だけど、よくよく考えないといけないよというお話。

データベースから情報を引っ張ってきて、その内容をcsvに吐き出す処理書いているのだけれども、全部で1000件以上あるデータを処理しようとすると、

[FATAL] failed to allocate memory

ってエラーが出てきて処理が途中で止まってしまう。。


ファイル入出力が原因か?
ループの中で毎回配列のメモリを割り当ててるのが原因か?

と、いろいろ原因を探っていったのだけれども、結局大きな原因だったのがfindのincludeオプション。

find関数を使うときに単にincludeで関連テーブルを追加で引っ張ってくるだけだと必要でないデータも一緒に読み込むのでメモリに使用される情報が非常に大きくなる。

で、上記のエラーが出たと。

とりあえずconditionsオプションに必要な情報のみincludeで指定して実行してみたところ、
以前に比べて1/5くらいの速度で処理が進むようになり、上記エラーも出なくなりました。


現状だと一度に読み込む情報量は減った分、必要な時に毎回SQLのクエリを投げて情報を引っ張ってきてるのでまだまだ改善の余地はありますが。。

select句を使って必要な情報のみとってくればもっと早くなるらしいのですが、それについては今後検討したいと思います。。

2009年4月30日木曜日

文字の切り詰めメソッド 追記

先日投稿した文字の切り詰めメソッド、先輩社員さんに間違いを指摘されて編集。
すいませんでしたm(_ _)m

新しいソース上げました。

以下にためになったことを書きます。

日本語を分割するときは文字のエンコードを指定してsplit

文字の切り詰めを行うときに、改行コードを変換しながら切り詰めを行うので改行コードが入っていないかを確認しながら処理。
その際、文字コードを指定していないと日本語(2バイト文字)が1バイトずつ分割されるみたい。

なので、

# $KCODE = "NONE"
str = "あああ"
str.split(//)

=> ["\202", "\240", "\202", "\240", "\202", "\240"]

$KCODE = "SJIS"
str = "あああ"
str.split(//)

=> ["あ", "あ", "あ"]

文字コードをSJISに指定してあげると日本語をうまく識別して切り取ってくれます。

破壊的メソッドと破壊的でないメソッド

オブジェクトの内容を変えてしまうメソッドを破壊的メソッドという。
一般的に波形的メソッドはメソッド名の最後に!マークをつける。

str = "あああ\nあああ"
str.gsub(/\n/, "")
str

=> "あああ\nあああ"

str = "あああ\nあああ"
str.gsub!(/\n/, "")
str

=> "ああああああ"

ちなみに

str = "あああ\nあああ"
str.gsub(/\n/, "")

=> "ああああああ"

てっきりstrが置換されたかのように思えるけど戻り値が表示されてるだけなのね。

str = "あああ\nあああ"

のままなので注意。

正規表現は前から順番に

改行コードを\lt;br\gt;タグに変換する処理があります。その時の注意。

str = "一行目\r二行目\n三行目\r\nラスト"
str.gsub(/\r|\n/|\r\n,"<br>")

=> "一行目<br>二行目<br>三行目<br><br>ラスト"

str = "一行目\r二行目\n三行目\r\nラスト"

str.gsub(/\r\n|\r|\n/,"<br>")

=> "一行目<br>二行目<br>三行目<br>ラスト"

gsubの正規表現の条件で, "\r"と"\n"、"\r\n"がかぶっている部分があるので注意。
先に変換してほしい"\r\n"の条件を先に書かないと2重変換される。

問題解決の際には原因特定からやりましょう。

これが一番大事なことだとですね。
ある問題があった時に、原因と思われる個所を"予想して"解決するのは効率が悪い。
明確に原因と思われる個所を"特定して"そこを中心に原因を探る。

急いでいるときには特に"予想して"解決しようとする癖が強い。

急がば回れ。
あせらず急ぐ。

大事な考え方ですね。

2009年4月27日月曜日

文字の切り詰めメソッド

多くの情報が書かれている情報を文字を制限して表示するメソッドの実装。
たとえば1000バイト以上の文字列が格納されてる変数から上1000バイトだけを取り出して、最後に...をつけて返すメソッド。

意外と時間がかかったので記録。


# 文字の切り詰めメソッド
def truncate(str, limit, add='...')

  return "" if str.nil? || str.blank?
  # 制限バイト数から追加する文字列のバイト数マイナスする
  limit -= add.size

  # 制限バイト数まで一文字ずつ文字列を生成
  #(その際、改行コードを(<br />に変換)
  code = $KCODE
  $KCODE = "SJIS"
  result = ""
  str.tosjis.split(/(\r\n)|(\r)|(\n)|/).each do |e|
    e = e.gsub(/\r\n|\r|\n/,",< br />;")
    if (result + e).size <= limit
      result << e
    else
      # 途中で切る場合、追加する文字列を追加して戻り値とする
      result << add
      break
    end
  end
  $KCODE = code
  return result
end

正規表現は初めてやったんだけど、結構面白いね。


追記--
2009.4.30 先輩社員さんに間違いを指摘されて編集。
if分の使い方とか間違ってたし、正規表現も勉強になった。

あと、文字コードの指定によってsplitの切り方が変わってくるところも参考になった。
まだまだ勉強不足ですね。。

2009年4月24日金曜日

ページキャッシュのお話

他社様の勉強会に行ってきた。
先々週の続きでメモリ、ディスクの読み書きの処理速度に対するボトルネックの探し方について。

その中でも主にページキャッシュの話について。

一般に
ディスクへの読み書きは遅い。
メモリへの読み書きは早い。

なので、Linuxは

・何かディスクからデータを読み込んで
・ページキャッシュ上になく、メモリが空いていれば
・いつでも新しいキャッシュを構築する

らしい。

なので、時間がたてばたつほどディスクから読みだされたデータはメモリ上にキャッシュされ、
次回読み込み時に早くロードすることができる。

さらに、ここで注意しなければならないこととして、
メンテナンスでサーバーを再起動させた場合にメモリにキャッシュされていた情報はすべてフラッシュされる。
そうすると、次回はすべての読み出しがメモリからではなくディスクからとなり、ディスクI/Oを発生させる。

よって、一度必要なデータ全体に読み込みをかけてメモリ上にキャッシュを作ってからプロダクション環境に移すのがいいみたい。

2009年4月23日木曜日

食べログAPIの使い方

先日、イケてるRails勉強会で学んだこと。
すでにわかってること、聞いてもよくわからなかったこと、あったけれども、今の自分の知識量でかろうじて理解できて、へぇ!と思ったことの記録。

食べログAPIの情報を検索する部分。

class Restaurant < ActiveResource::Base
 self.site = "http://api.tabelog.com/"

 def self.find_restaurants(restautant_params = {})
  restautant_params[:Key] = "**********" # APIのキーは取得する
  Hash.from_xml(
   self.find(
    :one,
    :from => "/Ver2.1/RestaurantSearch/",
    :params => restautant_params
   ).to_xml
  )
 end
end

以下、ひとつひとつの項目について。

class Restaurant < ActiveResource::Base

ActiveResource とは、簡単にRESTfulなAPIを使えるようにする機能らしい。
簡単に言うと、ActiveRecord を使うのと同じような感覚でWebAPIが使用出来る。


self.site = "http://api.tabelog.com/"

APIのホスト名までを指定。
"http://api.tabelog.com/"という場所とRestaurantモデルをリンクさせてるという認識。


restautant_params[:Key] = "**********" # APIのキーは取得する

APIの登録キーを設定。
APIのサーバーにリクエストを投げるときにリクエストのパラメータとして投げられる。


  self.find(
   :one,
   :from => "/Ver2.1/RestaurantSearch/",
   :params => restautant_params
  ).to_xml

:from のパラメータは、APIのディレクトリを指す。
:params のパラメータは、restrant_paramsのパラメータをリクエストとして投げる。


要は、このようなクラス、メソッドを設定してやった時に、

  Restaurant.find_restaurants()["restaurant"]

を指定すると、APIサーバーに、

  http://http://api.tabelog.com/Ver2.1/RestaurantSearch/?Key=**********

というリクエストを投げて食べログからレストラン情報が返ってくる。
さらに、パラメータを指定して、

  Restaurant.find_restaurants({ :Prefecture => 'tokyo' })["restaurant"]

を指定すると、APIサーバーに、

    http://http://api.tabelog.com/Ver2.1/RestaurantSearch/?Key=**********&restaurant=tokyo

というリクエストを投げて、食べログから”東京の”レストラン情報が返ってくる。

2009年4月22日水曜日

クラスメソッドとインスタンスメソッド

バッチでモデルのコントローラをたたくという処理を行うにあたってクラスメソッドとインスタンスメソッドの違いについて聞いたのでメモ。

インスタンスメソッドとは、特定のインスタンスに対するメソッドで、インスタンスを指定してやらないと実行できない。
一方、クラスメソッドとは、特定のインスタンスを必要とせず、クラスそのものに直結しているメソッド。

クラスとはある概念、たとえば人間というものを表すものなので、人という概念に対する機能がクラスメソッド。
インスタンスとはある実体、たとえばAさんという人を表すものなので特定の人が実行する機能がインスタンスメソッド。

ということか?

Rubyにおいてはクラスメソッドは「self.」をつけるか「self」で囲むかで指定。

たとえばHumanクラスというものがあった時に以下のような使い分け。

class Human

 # クラスメソッド 書き方1
 def self.get_popularity
  # 略
 end

 # クラスメソッド 書き方2
 class << self
  def get_japanese
   # 略
  end
 end

 # インスタンスメソッド
 def go_school
  # 略
 end
end

# クラスメソッドを使ってみる
Human.get_popurarity # クラス.クラスメソッド
Human.get_japanese

# インスタンスメソッド使ってみる
masa = Human.new # まずはインスタンス生成
masa.go_school # 続いてインスタンス.インスタンスメソッド

こんなイメージですかね?
ちなみにnew関数はHumanクラスで実行させてるのにクラスメソッドではないらしい。。

2009年4月14日火曜日

スレッドとプロセス

他社勉強会に行ってきた。
勉強会のスタイルとしては、エンジニアたちが本を読んでいき、読んだ内容について要約してみたり、わからないところをその場でググったり、詳しい人に聞いたり。


学んだこととしてはスレッドとプロセス。

プロセスもスレッドもCPUから見るとおんなじ。
でもそれぞれに違いがあるらしい。

マルチプロセスってのは
・メモリをくう。
・ひとつのプロセスが壊れると他のプロセスに影響がない。

マルチスレッドってのは
・メモリ空間を共有できる。
・一つのスレッドが壊れると他のプロセスも巻き込んで壊れる。

たとえて言うならば、プロセスが島で、スレッドが人。
プロセスは規模が大きい。スレッドは規模が小さい。
島でひとが一人ウイルスに感染すると、島の人たちはウイルスに感染する。
が、島が離れていると、影響はない。



それから、ブラウザ。

google クロムはマルチプロセス。
だから、ひとつのタブがエラーになったところで、他のタブが影響をうけることはない。

一方、firefoxはマルチスレッド。
ひとつのタブが壊れると、firefox自体がシャットダウン。

なるほどねーって思った。

2009年4月13日月曜日

Ajax:リモートプロシージャコール

>> HTTP GETリクエストに対するメソッド
単なるレンダリングなら
link_to_remote

>> HTTP POSTリクエストに対するメソッド
idを渡したりするレンダリングならこちら
form_remote_tag

へぇ。

と、いいつつもGETとPOSTの違いについてそんなによくわかってるわけではない。
HTTPについてちょっと勉強してみる必要あり。

DRYとか。

~DRYの原則~
繰り返しのコードを書いていることに気がついたら、
いったん手をとめて「1つのテンプレートにロジックが入りすぎていないか」と自問してみる。
~~

はいはい。今日も勉強してて新しく知ったこと。

部分テンプレートをレンダリングするメソッドにはコレクションを渡すことができ、
そのメソッドはコレクション内の各項目に対して1回ずつ自動的にテンプレート
を呼び出すことができるらしい。

今まで部分テンプレートを使い、さらにイタレータで繰り返しを作っていたけど、そんな必要ない。

>> add_to_cart.rhtml
<%= render :partial => "cart_item", :collection => @cart.items %>

とすると、_cart_item.rhtml の部分テンプレートが@cart.itemの要素数回レンダリングされる。
さらに、_cart_item.rhtml内では、@cart_itemsのインスタンスがインスタンス名 cart_itemとして使うことができる。
これはCoCの原則ですね。

例:

>> _cart_item.rhtml
<%= cart_item.quantity %>

とすると、@cart_itemsの各インスタンスcart_itemのquantity属性が表示される。

動的scaffoldと静的scaffold

scaffoldには動的scaffoldと静的scaffoldがある。

動的scaffoldはrailsが勝手にviewとか作ってくれる。
しかし、カスタマイズ性は少ない。

一方、静的scaffoldはview構造を作ってくれ、それを自由にカスタマイズできる。

active_scaffoldは動的scaffoldに近い気がする。
カスタマイズ性が高くなると使ってみてもいいのかなと思う。

ただ、rails2系からは動的scaffoldはプラグインを入れないと使えないみたい。

また、静的scaffoldを行う場合も、rails2系からデーブルのカラムを指定しない
といけなくなったっぽいので注意が必要。

備忘録、はじめます。

新卒エンジニアMasaの備忘録、はじめます。
現在以下の内容勉強中&勉強する予定。

とりあえず、半年後には応用情報処理技術者の資格をとりたい。

朝1時間の時間を使って勉強&まとめ
RailsによるアジャイルWebアプリケーション開発

他社さんとの勉強会
サーバ/インフラを支える技術

データベース系連載を暇な時に読む。
techscore

勉強したことをアウトプットしていきます!