未来永劫

メリーバッドエンドが好きです.

セキュリティ・キャンプ全国大会2015に合格しました.

受かりました.

応募用紙のテキストファイル名を
seccurityって間違えて提出しそうになった人です.
それくらいセキュリティ知識がガバガバの初心者です.(ウケる)
ツイッターです.Folow me!
しょぺたん (@ss_shopetan) | Twitter
(ツイートしてから1日足らずで50人フォロワーが増えました.ウケる)

About me

高専生です.やってたことは自然言語処理機械学習データマイニングなど.
(セキュリティの知識は本当に)無いです.

なんで参加しようとしたの

データマイニングをする上で,当然色々なデータを扱う事が多いのですが,
各種データのプライバシー保護とかってどうなってるのかなと思ったことがきっかけであり全てです.

マイニングする上で大事なことは,専門理論ではなく,品質の良いデータを収集する事であると考えているので,自主的にデータを収集出来るようなアプリケーションを作ったりしています.
でも,そうやって取得したデータのプライバシー保護が出来てなかったり,
アプリケーション自体がセキュリティ的な面でガバガバだったら「俺,何も出来ないじゃん」って思ったので参加しようと思いました.
セキュリティと機械学習とかデータマイニングって,本当はとても深い繋がりがあるんじゃないの? と思っているので,セキュリティと仲良くなれたら真理に近づけそう.
そんな事を考えて応募用紙を書きました.

応募用紙をザックリ晒す

以下長いので読む必要は皆無です.
当然答えがあるものではないので間違いも含まれます.ご注意を!

共通問題1

■ 共通問題1
セキュリティ・キャンプに応募した自分なりの理由とセキュリティ・キャンプで学んだことを何に役立てたいかを教えてください。

参加理由が全てです.正しい知識を身につけて自分の専門に活かしたいと書きました.

共通問題2

■ 共通問題2
セキュリティに関することで、過去に自分が経験したことや、ニュースなどで知ったことの中から、最も印象に残っていることを教えてください。また、その印象に残った理由も教えてください。

2chの「fusianasan」の機能について書きました.
リモートホストを表示して,本人を証明するための機能ですが,幼少期のぼくは可愛かったのでこれを素直に入力しちゃったんですね.
案の定なんかIP抜かれるとかすごい事()書かれてて,怖かったんです.
結局何が安全で何が危険なのか正しい理解が無いとダメだし,物作るときもおんなじだよねって事をつらつらと書きました.

共通問題3

■ 共通問題3
その他に自己アピールしたいことがあれば自由に書いてください。(たとえば、あなたが希望する講座を受講する上で、どのような技術力を持っているか、部活動、技術ブログ、GitHub、ソフトウェア開発、プログラミングコンテスト、勉強会での発表・運営などの実績や熱意があれば、あるだけ書いてください。)

やってた研究の話とか,出来る事とかをアレコレ沢山書きました.
書かないと何も伝わらないので,とにかく書きました.

選択問題5

■ 選択問題5 (左側の□について、回答した問題は■にしてください)
以下のようなC言語の関数functionがあるとします。

void function(int *array, int n) {
int i;
for(i = 0; i < n; i++) {
array[i] = i * n;
}
}

上記プログラムをコンパイルした結果の一例 (i386)は以下となりました。
00000000 :
0: 56 push %esi
1: 53 push %ebx
2: 8b 5c 24 0c mov 0xc(%esp),%ebx
6: 8b 4c 24 10 mov 0x10(%esp),%ecx
a: 85 c9 test %ecx,%ecx
c: 7e 18 jle 26
e: 89 ce mov %ecx,%esi
10: ba 00 00 00 00 mov $0x0,%edx
15: b8 00 00 00 00 mov $0x0,%eax
1a: 89 14 83 mov %edx,(%ebx,%eax,4)
1d: 83 c0 01 add $0x1,%eax
20: 01 f2 add %esi,%edx
22: 39 c8 cmp %ecx,%eax
24: 75 f4 jne 1a
26: 5b pop %ebx
27: 5e pop %esi
28: c3 ret

このとき以下の(1)~(5)の設問について、回答と好きなだけ深い考察を記述してください。知らない点は、調査したり自分で想像して書いてもらっても結構です。どうしてもわからない部分は、具体的にここがわかりませんと記述しても良いです。(1)~(2)の回答は必ず答えてください。(3)~(5)の回答は任意です。わかることを書いてください。CPU やコンパイラは特定の実装を例に説明しても良いですし、理想を自由に考えても良いです。

(1)【必須】上記の C 言語のプログラムはどのような動作をしますか。また、この関数を呼び出して利用する main 関数の例を作成してください。

【動作】
配列の各要素に,要素のi番目 * 配列の要素の最大値を掛け合わせるプログラム.

【main関数】

int main(int argc,char *argv[])
{
    int *array;
    int num;
    int i;

    if(argc != 2) {
        printf("pls input number \n");
        printf("$ %s [arraySize] \n",argv[0]);
        exit(EXIT_FAILURE);
    }

    num = atoi(argv[1]);
    array = (int *)malloc(num);
    function(array,num);

    /*debug array*/
    for(i = 0;i < num; i++) {
        printf("array[%d] = %d\n",i,array[i]);
    }

    return 0;
}

(2)【必須】上記のアセンブリコードを、いくつかのブロックに分割して、おおまかに何をしている部分かを説明してください。もし、上記のアセンブリが気に入らないのであれば、好きなアーキテクチャコンパイラアセンブル結果を載せて説明しても良いです。

クリティカルな回答があり,恥ずかしいので載せない.*1

(3)【任意】 コンパイラソースコードの関数を解釈して、ターゲットのアーキテクチャのバイナリを生成するまで、どのように内部で処理を行っていると思いますか。(キーワード: 構文解析、変数、引数、呼出規約、レジスタ、スタック、アセンブラ、命令セット)

はじめに字句解析を行う.これはソースプログラムから1文字ずつ読み出して,プログラムとして意味のある最小単位である字句を認識し,字句列に変換する.
次に構文解析を行い,字句列を受け取ることで文法的な規則を見つけ出す.
発見した文法規則から構文解析木として集約できる.
次のステップで中間コードを生成する.ここでよく用いられるのが3番地コードであり,これはメモリに置いたデータを基にして演算子,結果を再びメモリに戻すことを基本としている.
(中間コードを生成した段階で,中間コードの最適化を図ることがある.)
次の段階では,オブジェクトコードの生成を行う.これは端的に言い表すと,中間コードを機械語またはアセンブリ言語でかかれたプログラムに変換するものである.

これらのプロセスによって生成した機械語は命令セットアーキテクチャとも呼ばれ,バイナリデータ形式でコンピュータ上で動く.

(これ今見るとコンパイラの話ばっかり書いてるね)

(4)【任意】CPU の内部では、プログラムのバイナリはどのように解釈され実行されていると思いますか。(キーワード: フェッチ、デコード、オペコード、オペランド、命令パイプライン、回路)

命令が処理する対象となるデータはオペランドと呼ばれ,主記憶やCPU内部のレジスタに格納されている.
命令はオペコード部とオペランド部に分かれている.
このような命令は,命令パイプラインとして設計することで命令レベルの並列性を高める事ができる.
加算器などの組み合わせ論理回路においては,回路規模が大きくなるほど高速化が図れるが,パイプラインを用いる事で回路規模が小さいまま高速化できる.
RISCマシンでは,IF(命令フェッチ),ID(命令デコード),EX(実行),MEM(メモリアクセス),WB(レジスタライトバック)の5段階に分けている.
しかし,このような命令パイプラインも,各工程で処理に時間がかかる部分があると,後続の命令の実行にも影響を及ぼすため,並列化の良さは活かされない.
従って,適宜最適化をする必要がある.

(高専の頃にザックリ勉強した事をザックリ書いてるだけや…)

(5)【任意】現在の CPU やコンパイラの不満点があれば自由に記述してください。

【CPU】
・大規模データ処理を行う際にCPUボトルネックが起きること.(CPU自体の問題ではないが)
殆どのSQLが処理の並列化に対応していないので,自ら実装しないと手間なので不便.
逆に並列化した場合も今度はCPUの使用率を制御しないといけないので,自家用機でもより性能向上を…

・それに繋がる話として,不満とは違うが,集積回路ムーアの法則がほぼ限界な感じがあるので,
小型化して並列化してCPUの性能を向上するのは頭打ちになっている気がする.
(コア数は増えているが周波数は伸び悩んでいる…)

コンパイラ
・仕方ないことだが,コードサイズが大きくなるにつれてコンパイル時間がかかることは不満点.
ソースコードそのものをRAMディスクに置けば当然かなりの速度向上は見込めるが,リスクもあるのでオススメ出来ない.
ヘッダの依存を減らしたり,プリコンパイル済のヘッダを設定したりなど,細かい設定で速度の改善は見込めるが…
当然インタプリタ型と比較すれば,実行時間そのものの速度は早い.コンパイル中にエラーが出るので安心感はある.が,それを踏まえてもやはり遅い.
結局,原理的には,(3)で話したように,字句解析,構文解析… といったプロセスを踏まなければいけないのが問題.
DeepLearningなどは人間が行っていた特徴量抽出を自動化する事で性能の向上をしてきたので,
曖昧ではあるが,人間が考案したアルゴリズムそのものの部分を一部自動化すれば機械にとっての最適化はされるかもしれない.

コンパイルには時間がかかる,コンパイラの気持ちになったコードを書けば速度はある程度保てる,
しかしコンパイラライクなコードがヒューマンライクなコードに成り得ないという矛盾が最も不満.

選択問題8

■選択問題8 (左側の□について、回答した問題は■にしてください)
gccが持つ-fno-stack-protectorは、どのようなセキュリティ機能を無効にするオプションであるのか、またこの機能により、どういった脆弱性からソフトウェアを守れるのかをそれぞれ記述してください。

【用途】
SSP(Stack Smashing Protection)を無効にするオプション.
SSPとは,バッファオーバーフローを検出してそのような動作をしようとしたプログラムを終了させる.
従って,バッファオーバーフローを検出せずに,プログラムを続行させるものである.

【どのような脆弱性から守れるのか】
攻撃する者がスタック破壊などによってバッファオーバーフローを引き起こすことができると,
攻撃者が実行したいと考える悪意のあるコードでバッファーをオーバーランさせ,送りつけたその悪意のコードを指すように戻り値を書き換えることが可能.

つまり,バッファオーバーフローを引き金にした攻撃を防ぐのがSSPである.
プログラミング言語ではC,C++が自動でバッファオーバーフローを検出してくれないので,SSPを有効にしてコンパイルする必要がある.
(CやC++が検出しないのはメモリ確保(malloc())やポインタ操作などをプログラマ側が自由に出来る事を許しているという背景があるからでは,と考える.)

選択問題11

■選択問題11 (左側の□について、回答した問題は■にしてください)
下記バイナリを解析し、判明した情報を自由に記述してください

D4 C3 B2 A1 02 00 04 00 00 00 00 00 00 00 00 00
00 00 04 00 01 00 00 00 88 EB 40 54 A2 BE 09 00
52 00 00 00 52 00 00 00 22 22 22 22 22 22 11 11
11 11 11 11 08 00 45 00 00 44 1A BD 40 00 80 06
3A 24 C0 A8 92 01 C0 A8 92 80 10 26 01 BB 86 14
7E 80 08 B3 C8 21 50 18 00 FC 0D 0E 00 00 18 03
03 00 17 01 0E FB 06 F6 CD A3 69 DC CA 0B 99 FF
1D 26 09 E1 52 8F 71 77 45 FA

Wiresharkにぶっ込んだ.

【基本情報】
Source:192.168.146.1
Destination:192.168.146.128
Protocol:TLS v1.2
Length:82
Info:Heartbeat Request

【エラー箇所を抜粋】
payload length(invalid,using 4 to decode payload)
Expert info (Error/malformed) : invalid payload heartbeat length(3835)
severity level :error

【考察】
Heartbleedバグに関連する内容?
攻撃者が意図的に長いペイロード長を指定することで,メモリの内容を不正に覗き見することが可能.
rfc6520を参照すると,ペイロード長が長すぎる場合は破棄するように修正されているとのことで,
この場合は明らかにペイロード長が長く,適切なエラーが出ていると考えられる.

選択問題13

■選択問題13 (左側の□について、回答した問題は■にしてください)
これまでに起こったこと(データ)から、これまでにまだ起こっていないことを事前に予想する場合、どのような点に注意し、どのようなことを考慮すべきか熱烈にアピールしてください。

【事前に予測するために…】
最も重要と考えるのは,現在のデータの特性を読み取り,
機械にデータの中から問題を解くための規則性を見つけさせる.
これを目指すことで,ある程度次のデータがどのように遷移するのか予測することができる.
そのために…
・まずは十分な量のデータを集めることが望ましい.(機械学習でいうところの教師あり学習に似ている)
・TargetをFeatureの関数で書き表すことを目標にする.

【注意すること】
1.異常値検知は絶対にしなければならない.
例えば有名な手法にマハラノビス距離を用いたデータ同士の距離感から異常値を求めるものがある.
これはデータ間の距離がある閾値を超えたものを異常値として認識し,排他していく手法である.
実データから未来を予測するためには,どういった特性があり,その中でどういったものが異常値であるのか認識する必要がある.
閾値によって,異常値が多い傾向にあるとデータを解釈出来た場合は,未来のデータもどの程度が異常値になるのか推測ができる.
2.推定には様々な手法があるが,使うアルゴリズムではなく,使うデータが重要である.
アルゴリズムは様々存在しているが,もっとも重要なのは扱うデータの質である.
どれだけ優秀なアルゴリズムであってもデータ量が足りなかったり,使うデータがバラバラであっては意味が無い.

【考慮すべきこと】
1.異常値のないデータは存在しないというスタンスでいること.
2.どのようなデータであっても完璧なデータは存在しないし,完璧なアルゴリズムも同様に存在しない.
3.推定した結果が必ず正しいと思わない.

他の合格者さんのBlog記事

pazzle1230.hatenablog.com
olambdasawa.hatenablog.com
nanuyokakinu.hatenablog.jp
katc.hateblo.jp
clariroid.hatenablog.com
[技術|SEC] セキュリティ・キャンプ 2015 全国大会 個人的なWriteupのようなもの | 話譚でいいと思うよ

*1:すでに出題者の方が掲載してくださっています. /var/log/hktechno: セキュリティ・キャンプ 2015 応募用紙 選択問題5 のまとめ

Mac OSX Mavericks + SublimeText2でSASSをビルドする際に躓いたこと

中々ビルドが通らずにエラー頻発していたのでメモ

環境

Mac OSX Mavericks
ruby 2.1
Homebrew & rbenvインストール済
SublimeText2 sass buildインストール済

エラー内容

sublimetext内で,sassのビルドをすると,

[error] No such file or directory

と叩かれる. なんでやSublime

Mac で SublimeTextのsassをbuildする手順

手順1

$rvm use system

で最初にrvmを設定する.(不要かもしれません)

次に,

$gem install sass

でsassをインストール

手順2

$ which sass

でインストールしたsassの場所を確認

自分の場合pathはこんなかんじ
/Users/[user_name]/.rbenv/shims/sass

手順3

$ ln -s /Users/[user_name]/.rbenv/shims/sass /usr/local/bin/sass

でsassのリンクを貼ってあげるとうまくいきました.

参考

stackoverflow.com

リーダブルコード勉強会に参加してきました.

 今年の夏はOSS開発で最高の夏にしような

ということでチョットデキルメンターさんの皆様に囲まれてSEゼミさん主催のリーダブルコード勉強会に参加してきました.

目的は人のリーダブルなコードを盗むということ.

 

私は,研究でタスクの評価に関する研究をしていたので,他人のコードを評価するという企画に惹かれて参加しました.

 

しかし,実態は

×コードを評価(レビュー)する

◯ コードのリーダブルなところを発見する

 

技術や早さを競うのではなく,

また,コードの間違いなどを指摘するというわけでもありません.

いかに読む人にとって読みやすいコードを書くかという点が重要視されていました.

(そしてどれだけ書けるかとかも求められていません.最低限文法が理解できて,自分で調べることができれば大丈夫だと思いました. デバッグもメンターさんが新しい視点を提供してくれたのでなるほどと思うことが多かったです.)

 

実際に体験してみて 

意識して人のリーダブルなコードを発見するという作業,意識して自分がリーダブルだと考えて記述した事を主張するというのは非常に新鮮でした.

自分が日常的に当たり前だと思ってやっていることが他人にとってはリーダブルであったり,普段書かないような記法で書いてあるコードが私にとってはリーダブルであると感じることが出来ました.

また,(ちょっとどころか現役の超優秀エンジニアの)メンターさんに直接レビューして頂けました!

意識して書いたコードに気づいて頂けたことはやはり嬉しかった!

 

本で書かれている「可読性の高いコード」は綺麗にわかりやすく加工されたものですが,それ以外(OSSや野生のリーダブルなコード)を実践的に学ぶ機会は中々ないですよね.

私にとっては,良い意味で期待を裏切られた形になりました.サイコー!

 

その後の懇親会では

また,自分は機械学習系に興味があったので,その筋に強い方とコンタクトをとってお話することができました.

非常に有意義! やっぱり与えられた機会は逃さず参加するもんですね. 
 
 

勉強したことを箇条書きにメモ

一番はじめに実装したいことをコメントで箇条書きにし,その箇条書きの通りに実装していく.

最初に「やりたい!」と考えた事が伝わるほうがいいよね.その機能が実装できる度にコミットすれば他の機能追加が無いから,コミット内容も美しくなるよね.
 
コメントアウトしたコードはコミット時には消す.
(読む側にとっては)冗長なだけなので不要.前述したやり方をしてたら,機能毎のデバッグも難しくないはず.
 
(困ったときに)グーグル先生に頼るのも良いが,実際にGitHubで公開されているコードから学ぶ
OSSを読む力がつく.同じ内容でも,より良い方法で実装しているかもしれない(しかもmergeされている以上は,ある程度動く保証がある).
また,一度読んだことはちゃんとに自分の中のDBに格納される.
 
(OSS)を読む練習をするなら,GitHub Awardなどで上位のユーザを参照すると良い.
実際に評価されている人なのでコードを見ると間違いなく勉強になる.
 

広告

 6月20日にはGitHub勉強会,27日にはOSSに関する勉強会,7月11,12日には本番のOSS開発が行われるので,興味がある方は是非一緒に行きましょう.
http://www.seplus.jp/sezemi/

Heroku + Rails4.2 + Devise + Bootstrap3系列で本番環境でログアウト(Sign_out)ができない問題

環境

Heroku
Rails 4.2
devise 3.5.1
Bootstrap3.1.1

起きたこと

rails4.2 + Deviseで,本番環境のみで発生するエラーです.

$git push heroku master

でHerokuにデプロイし,

$heroku open

でアプリケーションを立ち上げる.

Deviseの機能を用いて正常にログインはできていたのだが,ここでサインアウトを選択すると

The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
If you are the application owner check the logs for more information.

という内容のエラーが出る.

$rails s

でローカルで立ち上げた場合は正常にサインアウトができていた. 何だこれ?

解決策

JavaScriptが正常に読み込まれていないのが原因であった.
ローカルにpublic/assetsディレクトリが存在している場合は容赦なく

$rm -rf public/assets

を用いて削除する.

ここで再び,

$git add .
$git commit -m "[コミット内容]"
$git push heroku master

の手順でherokuにデプロイし,

$heroku open

で立ち上げる.

再び同じエラーが起きたが,今度はWebインスペクタを参照すると,

[Error] bootstrap-datetimepicker requires jQuery to be loaded first (undefined, line 0) 

という内容のエラーが出ていた.
jQueryをbootstrapより先にロードしてね」と言われているようなので,
app/assets/javascript/application.js 内で

//= require jquery 
//= require jquery_ujs 

の2行を他のリクエストよりも優先的(先頭)に記述し直した.

再び,

$git add .
$git commit -m "[コミット内容]"
$git push heroku master

の手順でherokuにデプロイし,

$heroku open

で立ち上げると,今度は無事に成功!

scaffoldのdeleteが正常に行われない時や,
Railsで意図しない挙動を示している場合にはWebインスペクタの確認と,Javascript関連を当たってみると良いかもしれない.

(今回の場合で)やっちゃダメなこと

$git push heroku master

を行うと,自動的に
assets precompileしたのと同じになるらしい.
従って,あまり安易に

rake assets:precompile

するのは控えた方が良いかもしれない.

GitHubで芝生が何故かContributionsに反映されない時

僕はこれに気づかずに半年間芝生が生えませんでした!!!
芝生被害者の会を作りましょう.

起きた事と問題

共同開発などでpull requestを送ったり,mergeされたりした時にはContributionsに芝生が反映されるのに,
自前で開発しているアプリケーションをcommitした時にはなぜかContributionsに反映されないという問題にブチ当たっていました.
githubの仕様が変わったのかなと考えていましたが,そんなこともなく,悩んでいたところ解決方法が見つかったので備忘録としてアウトプットしておきます.

解決方法

GitHubページのEmailアドレスを確認する.

どうやら自前の開発環境とGitHubで登録しているメールアドレスが一致していない場合,正しくContributionsが反映されないようです.

Settings -> Public email から 登録されているEmailアドレスを確認

次に,自分の開発環境で

$ git config user.email

で表示されるアドレスを確認して下さい.
もし,このEmailアドレスが一致していない場合は,

$ git config user.email [example@exampl.com]

として自分の登録されているEmailアドレスを付与することで,変更する事ができます.

で,ここからが注意ですが,
自分のローカルのリポジトリ単位でこの設定を行ってください
逐一確認しないと,せっかく設定しなおしたのに芝生が反映されてない…なんてことが起こります.
自分がハマっていたのはこれだったのでご注意を!

追記 2015 10/15

$ git config --global user.email [example@exampl.com]

ここでglobalオプションを明示的に指定することで,おそらく以降の設定が不要になります.
確認したところ,草が反映されていない以前のリポジトリにはやはり逐一指定する必要がありそうです.

参考
Why are my contributions not showing up on my profile? - User Documentation
GitHubのYour Contributionsが反映されない - Qiita
GitHub Contributions 色つかない(草生えない) - Ryusuke Fuda's Tech Blog

Mac OSX で gem install twitter できなかった話

環境

Mac OSX Mavericks

ruby -v 

で念のため rubyのver確認

ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-darwin13.0]

エラー内容

$ gem install twitter

したら

Building native extensions.  This could take a while...
ERROR:  Error installing twitter:
	ERROR: Failed to build gem native extension.

    /Users/[user_name]/.rvm/rubies/ruby-2.1.4/bin/ruby -r ./siteconf20150521-83034-htbchk.rb extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling ruby_http_parser.c
gcc: error: unrecognized command line option '-Wshorten-64-to-32'
gcc: error: unrecognized command line option '-Wdivision-by-zero'
gcc: error: unrecognized command line option '-Wextra-tokens'
make: *** [ruby_http_parser.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/[user_name]/.rvm/gems/ruby-2.1.4/gems/http_parser.rb-0.6.0 for inspection.
Results logged to /Users/[uesr_name]/.rvm/gems/ruby-2.1.4/extensions/x86_64-darwin-13/2.1.0/http_parser.rb-0.6.0/gem_make.out

解決方法

gccのエラーを吐いてるのでggって見るがこれといって解決に繋がるものはなかった.

$gcc --version

でversion確認すると,

gcc (GCC) 4.9.0 20130929 (experimental)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

と,gcc 4.9.0になっていたので,gccのversionの問題かと思ってgcc 4.2.Xに戻してみたがそれも上手く行かず.

困ったので,

$ sudo rm /usr/local/bin/gcc
$ sudo rm /usr/local/bin/g++
$ sudo ln -s /usr/bin/gcc /usr/local/bin/gcc
$ sudo ln -s /usr/bin/g++ /usr/local/bin/g++

この手順で gcc -> LLVMに戻してみた.

$gcc --version

を再び実行すると,

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

となり,戻っていることが確認出来た.

この状態で

$ gem install twitter

を行うと無事にインストールできた.


これで今日からrubyで楽しいtwitterライフを送れます.
(インスコしておいてあれだけどやっぱりpythonに帰ります.)

Mac OSX Mavericks で Apache環境構築 + 任意のディレクトリからCGIプログラムの実行まで行う.

環境

Mac OSX Mavericks(このご時世にいつまで使うのやら)

Server version: Apache/2.2.26 (Unix)

Server built: Dec 10 2013 22:09:38

Apacheの設定

verの確認

ApacheはMac OSX Mavericksでは標準でインストールされているはずです.
従って,今回はそれを利用します(homebrewでぶっ込んで試したけど挫折した).

$ httpd -v 

でまずはver確認から.

標準では

Server version: Apache/2.2.26 (Unix)
Server built:   Dec 10 2013 22:09:38

と出力されるはずです.

Apacheの起動確認

$ sudo apachectl start

で起動できます.

終了は

$ sudo apachectl stop

でOK.

設定ファイルを弄った後は

$ sudo apachectl restart

をして再起動してください.

http://localhost/
を参照すると起動が出来ているか確認できると思います.

設定ファイルの変更

標準では設定ファイルが /etc/apache2/配下に置かれているはずです.
今回はエディタのEmacsで編集を行うので

$ sudo emacs /etc/apache2/httpd.conf

で編集を行います.

変更箇所

1カ所目
ユーザディレクトリを許可するモジュールをアンコメントアウト

LoadModule userdir_module libexec/apache2/mod_userdir.so

デフォルトではコメントアウトされているので外します.

2カ所目

 #User home directories                                                           
 Include /private/etc/apache2/extra/httpd-userdir.conf

同様にこのInclude文もコメントアウトされているので外します.

3カ所目

#                                                                             
# AddHandler allows you to map certain file extensions to "handlers":         
# actions unrelated to filetype. These can be either built into the server    
# or added with the Action directive (see below)                              
#                                                                             
# To use CGI scripts outside of ScriptAliased directories:                    
# (You will also need to add "ExecCGI" to the "Options" directive.)           
# 
AddHandler cgi-script .cgi

この最後の文も標準ではコメントアウトされているので外します.

ここで,rubyperlなどをcgiプログラムで活用したい場合は

AddHandler cgi-script .cgi .rb .pl

のようにして追記すると良いでしょう.

任意のディレクトリを参照できるように設定

次にユーザディレクトリを設定します.
設定するためには

$ sudo emacs /etc/apache2/users/[user_name].conf

を行って作成する必要があります.

自分のuser_nameは

$ whoami

で確認することが出来るので,各自確認の上[user_name]部分を変更してください.

設定は以下のコードを入力してください.

<Directory "/Users/[user_name]/Sites/">
  AllowOverride All
  Options Indexes FollowSymLinks MultiViews +ExecCGI
  AddHandler cgi-script .cgi
  Order allow,deny
  Allow from all
</Directory>
Options Indexes FollowSymLinks MultiViews +ExecCGI

この+ExecCGIと,

AddHandler cgi-script .cgi

この一文がCGIプログラムを任意のディレクトリで実行するために重要になります.

任意のディレクトリを設定するには

<Directory "任意のディレクトリ">
</Directory>

とすれば任意のディレクトリを設定することができる(はず)です.

CGIプログラムを動かすための準備

ここまで設定が完了したら,実際に動かすために準備を行います.

$ cd 
$ mkdir ~/Sites

としてSitesというディレクトリを作成します.

続いてディレクトリのパーミッション(アクセス権限)の設定を行います.

$ sudo chmod 755 ~/Sites

としてアクセス権限を変更します.

$chmod 755 とは

  • 所有者:読み出し,書き込み,実行が全て可
  • グループ:読み出し,実行が可
  • その他ユーザ:読み出し,実行が可

という状態に変更する事を指します.

CGIプログラムを動かす

いよいよCGIプログラムを動かすためのプログラムを書きます.

$ cd ~/Sites
$ emacs test.cgi

として~/Sites 配下にtest.cgiというファイルを作成します.
内容は以下のような簡単なものに.

#!/usr/local/bin/ruby                                                             
print "Content-Type: text/html\n\n"
str = "Hello World"
print str
print "\n"

作成後は先ほどと同様にパーミッションを設定します.

$ cd 
$ sudo chmod 755 ~/Sites/test.cgi

ここまで完了したら,

$ sudo apachectl restart

として再起動をかけてください.

http://localhost/~[user_name]/
を入力して何か表示されていれば成功.

http://localhost/~[user_name]/test.cgi
を叩いて
f:id:shopetan:20150515033642p:plain
が表示されればOkay!

エラーが出る場合は

これはmacの場合に限るかと思いますが…

$ tail -f /private/var/log/apache2/error_log 

これで適宜エラーログを確認することが出来ます.便利!

おつかれさまでした.
何か間違い等ありましたらコメントお願いします. 適宜修正いたします.