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次関数近似が限界だけど、微分の手法を覚えれば多変量、複雑関数でも何でも適用できる。