2012-11-15

g++でコンパイル

C++のソースをコンパイルしてみた。
で、通らなかった (p_q、) なんかなぁ。バージョンは常に新しくしたいから結構あげちゃうんだけど、その度洗礼を受ける感じ?
今回の洗礼は、この2個。

で、環境はAWSのEC2で。
なんでかなぁ。とおもっていても仕方ないので、やっつける (`・ω・´+) キリッ
-------------

warning: enumeration value ‘***’ not handled in switch [-Wswitch]

-Wswitch というオプションによって、列挙型の項目すべてが指定されていない為にでる警告。


例えば、enum hoge {1, 2, 3}; とし、switch 文で case 1:... case 3:... のみで case 2:... を書いていない場合、この警告がでる。
default: を使ってしまうと、(書くのを忘れてしまった) case 2: の場合が当てはまり、警告は出ない。
用途によっては意図したものにならない可能性もあるので default を書かずおけば、パターンが確認できたりする。

warning: suggest parentheses around arithmetic in operand of ‘|’ [-Wparentheses]

-Wparentheses というオプションによって、括弧が省略されているため(優先順位がわからない)にでる警告。

例えば、 これだと警告が出ちゃいます。なので・・・・ とすると警告が出なくなります。
0x80 | ((0xFC&snd)>>2) これを評価した後で、+0x10 なのかあやふやだからだと思われます。


コンパイルオプションに付いてはこちらを参照
http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Warning-Options.html
http://www.geocities.jp/woodwood77777/gcc_gnu.htm

-Wall をつけているので、いろいろ警告が出た模様。。。。
headerファイルも変わったみたい。。。
http://gcc.gnu.org/gcc-4.3/porting_to.html
いろいろ大変ですね。おしまい (´・ω・`)

2012-11-06

AmazonEC2でEBS

AmazonEC2で使うストレージにEBSというのがあります。
ここではEBSを使えるようにする二つの方法を _φ(。_。*)メモメモします。
EBSとは Amazon Elastic Block Store の略で、私はイー・ビー・エスっていいます。

二つの方法
  • 新規にVolumeをAttachする場合
  • snapshotからVolumeを作成しAttachする場合

★共通の注意事項
インスタンスに Attach にできる Volume は同じ availability zone 内に限られるので、作成時に確認する。
パンくず:services > Compute & Networking > EC2
アマゾン ウェブ サービス にアクセス。

新規にVolumeをAttachする場合


主に、メインのストレージは既にあってログやバックアップを別のストレージに分ける場合に使用しています。
一般的なWebサービスを提供するインスタンスを作る場合、Root Partition(ルートパーティション)<OSが入っている部分>は、32GiBくらいにしておけば十分だと思っているからです。
一概には言えないですけどね (´・ω・`)

  1. 新規Volume(ヴォリューム)作成
    パンくず(左メニュー):ELASTIC BLOCK STORE > Volumes
    1. 右上メニュー:Create Volume
    2. 入力項目:
      Size: *** GiB ( GiB / TiB )
      Availability Zone: ap-northeast-1a
      ap-northeast-1b / ap-northeast-1b / ap-northeast-1b )

      Snapshot: --- No Snapshot ---
      Volume Type: Standard
    3. 『Yes, Create』
    4. 作ったVolumeが何か分かるように名前を付けておく。
      できたVolumeを選択すると下段に以下のタブとともに情報が表示される。
      [Details] , [Status Checks] , [Monitoring] , [Tags]
      パンくず:Tags > Add/Edit Tags
      Key=Name , Value=任意の名前 --> Save Tags
  2. インスタンスにAttach(アタッチ)する
    1. 右上メニュー:Attach Volume
    2. 入力項目:
      Volume: vol-******* in <availability zone>
      Instances: [Select Instance] in <availability zone>
      Device: /dev/sd*
    3. 『Yes, Attach』
  3. Volumeを使えるようにする
    1. 使えるファイルシステムにフォーマット
    2. マウント
    3. インスタンスを再起動しても自動的にマウントさせる

これで、ディスクが追加されたように使えます ( ̄ー+ ̄)
ちなみに、RootPartitionではないのでインスタンスをSTOPしなくても追加されます
つぎは、snapshotからEBSをつくりRootPartitionにする方法を _φ(。_。*)メモメモします。

snapshotからVolumeを作成しAttachする場合

2012-10-17

CのApache-module::subprocess_env構造体

r->subprocess_env構造体には何が入っているか調べてみました。
概要
Apacheにはリクエスト毎の情報をもつ request_rec 構造体があります。 subprocess_env構造体は、環境変数の配列です。

include/httpd.h にて、下記のように定義されています。

この subprocess_env構造体は、apr_table_t 型なので、r->headers_in 等と同じように取り出し可能です。
と、いわれましても。。。って思いませんか?

subprocess_env構造体の全容というか、いったい何が入っているのか気になる!

お決まりのようにググってみましたけども、ちっとも出てきません。
そこで全部の中身をだしちゃうコードを書く事にしました。

あとは、きっと環境が変われば中身も変わる物だから、こんなんですよーってのが無いんだと固く信じてます (*´∀`*)
(英語力が他かければドキュメントが見つかるのだろうか?むかしなら「Doxygen」のマニュアルが沢山出てきたんだけどなぁ。。。)

では、早速コードを。 さて、何がでてくるかな?
QUERY_STRINGを取って見ているので、適当に ?hoge=bar なんてつけてみる。

■出力結果↓ Σ(゜∀゜ノ)ノマジか!
【NULL】 じゃん。。。なんで?
その辺のサンプルコードってよく書いてあるよね?何が違うんだろう。。。と、思っています?

なんと、これにはちゃんとした訳があります。現時点では当然の振る舞いです。
subprocess_env構造体 の値を取得する前に、とある処理を入れてあげないと、KEY=VALの形でデータがsubprocess_env構造体に入ってこないのです。
その処理が。。。【ap_add_cgi_vars関数】です。

では、早速コードに追記して実行してみます。 さて、何がでてくるかな?
QUERY_STRINGを取って見ているので、適当に ?hoge=bar なんてつけてみる。
ついでに、REMOTE_ADDRも取ってみましょう (*´∀`*)
■出力結果↓ やった ヾ(@⌒▽⌒@)ノとれました。
この ap_add_cgi_vars関数は下記のように定義されています。
void ap_add_cgi_vars (request_rec *  r  ) 
Add CGI environment variables required by HTTP/1.1 to the request's environment table
Parameters:
r the current request 

さて、QUERY_STRINGを取得したい場合は、これだけでOKですが、、、、REMOTE_ADDRを取得したい人はどうしましょう?【NULL】 じゃん。。。なんで?
取れない??

なんて事はありません (*´∀`*)ちゃんと取得できるようになっています。
その処理が。。。【ap_add_common_vars関数】です。

さてさて、コードに追記して実行してみます。 さて、取れるでしょうか?
QUERY_STRINGを取って見ているので、適当に ?hoge=bar なんてつけてみる。
ついでに、REMOTE_ADDRも取ってみましょう (*´∀`*)
■出力結果↓ やった ヾ(@⌒▽⌒@)ノ完璧。
この ap_add_common_vars関数は下記のように定義されています。
void ap_add_common_vars (request_rec *  r  ) 
Add common CGI environment variables to the requests environment table
Parameters:
r the current request 

これで必要な情報を取る事ができますね〜 (*´∀`*)
おしまい。