2011年10月31日月曜日

データクラスタリングツールbayon

bayonとclutoって2つを見つけた。
どうやら、clutoは商用利用に制限がある模様。


とりあえず、bayon。

bayonのチュートリアル

bayonを使った記録


1、インストール
# wget http://bayon.googlecode.com/files/bayon-0.1.0.tar.gz
# tar -xvzf bayon-0.1.0.tar.gz
# cd bayon-0.1.0
# ./configure
# make
# make install


2、インプットの準備
$ cat data.tsv
ドキュメントID1 (タブ) フレーズ (タブ) 値  (タブ) フレーズ (タブ) 値 ・・・
ドキュメントID2 (タブ) フレーズ (タブ) 値  (タブ) フレーズ (タブ) 値 ・・・
ドキュメントID3 (タブ) フレーズ (タブ) 値  (タブ) フレーズ (タブ) 値 ・・・
ドキュメントID4 (タブ) フレーズ (タブ) 値  (タブ) フレーズ (タブ) 値 ・・・
ドキュメントID5 (タブ) フレーズ (タブ) 値  (タブ) フレーズ (タブ) 値 ・・・


3、実行
$ bayon -n 3 -p data.tsv

3クラスタに分類する。

※ PHPから利用する事はできないですかね?。

Repeated bisection 法とk平均法

bayonで使えるデータクラスタリング手法
1、Repeated bisection 法
2、k平均法




1、Repeated bisection 法
誰かの論文

抽出した特徴語を用いて情報を分類する.Repeated bisection はクラスタリングツールCLUTO で使用されているクラスタリング手法であり,情報を 2 分割していくことでクラスタリングを実行する.このクラスタリング手法はソートアルゴリズムの中でも高速かつ軽量なクイックソートアルゴリズムに類似している部分があり,大量の情報を高速に扱うことができる.Repeated bisection の概要を図 4.7 に示す.まず,情報集合の中からランダムに 2つ要素を選択し,それぞれを格納する情報集合を作成する.元の情報集合の全ての要素に対して,ランダムに選択した 2 つの要素との類似度を比較し,高い情報集合に格納する.さらに情報集合の中で類似度をそれぞれ比較し直し,情報の移動を行う.これらの一連の動作を
規定数繰り返すことによって,情報を分類する.




2、k平均法
k平均法
  1. 各点にランダムにクラスタを割り当てる
  2. クラスタの重心を計算する。
  3. 点のクラスタを、一番近い重心のクラスタに変更する
  4. 変化がなければ終了。変化がある限りは 2. に戻る。

新着質問を取得する。

はてなや、yahoo知恵袋から、質問をかき集めてくる。
必要な情報としては、

「タイトル」、「質問内容」、「回答に必要な情報」



① はてな取得先API(はてなウェブサービス
はてな : http://q.hatena.ne.jp/list/computer?mode=rss
URIに接続すれば、xml形式で返却してくれる。


② yahoo知恵袋(yahoo ディベロッパーネットワーク
yahoo知恵袋 : http://chiebukuro.yahooapis.jp/Chiebukuro/V1/getNewQuestionList
yahooのIDを作成しなければならない。
その後、アプリケーションIDを作成する。


③ facebook



※ PHPで取得する。
$r = new HttpRequest('http://q.hatena.ne.jp/list/computer?mode=rss',HttpRequest::METH_GET);

 
try{
   $r->send();
   if ($r->getResponseCode()==200) {
      $str = $r->getResponseBody();
      echo $str;
   }else {
      echo "error";
   }
}catch(HttpException $ex){
   echo $ex;
}



【メモ】
1、はてなウェブサービス( Hatena Developer Center )
2、yahoo ディベロッパーネットワーク
3、facebook
4、mixi
5、okwave
6、アメーバ

2011年10月29日土曜日

php でパケットキャプチャを行う2

今更ながら、pcaplibを使った方が、
うまくいくパケットキャプチャできるのでは?


libpcap - 私的メモ

libpcapリファレンス

tcpdumpにおけるlibpcapの使われ方


※1、コンパイルオプションに、「-lpcap」を加える必要がある。


典型的なlibpcap利用の流れ。
(細かい引数とかは、リファレンスを参考にする)

1,deviceをプロミスキャスモードでオープンする。


   // get device
   if (argc != 2) {
      dev = pcap_lookupdev(errbuf);
      if (dev == NULL) {
              fprintf(stderr, "no device\n",errbuf);
              exit(1);
      }
   }else if(argc == 2){
      dev = argv[1];
   }
   printf("dev: %s\n",dev);

   // open device
   handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
   if (handle == NULL) {
           fprintf(stderr, "cannot open device\n",errbuf);
           exit(1);
   }else {
           printf("open device : %s\n",dev);
   }


2,フィルタをコンパイルしてセットする。


   // compile filter
   if(pcap_compile(handle, &fp, filter_exp, 0, net)==-1){
           fprintf(stderr, "cannot compile filter\n",errbuf);
           exit(1);
   }else{
           printf("compile filer success\n");
   }

   // setting filter
   if (pcap_setfilter(handle, &fp) == -1) {
           fprintf(stderr, "cannot set filter\n",errbuf);
           exit(1);
   }


※ filter_expにセットする文字列は、tcpdumpのオプションと一致する。たぶん。

3,パケットを取得する。
方法1 : pcap_next
パケットを1個取得して、返却する。


   packet = pcap_next(handle, &header);
   if(packet == NULL){    
      return;
   }
   // read packet
   pkt = packet_read(NULL,handle,packet);

※ packet_readは、方法2のコールバック関数をちょっと修正したもの。
基本やることは同じ。



方法2 : pcap_loop
パケットを受け取ったらコールバック関数を実行する。

   cnt = 1;
   //if (pcap_loop(handle, cnt, printer, NULL) < 0) {
   if (pcap_loop(handle, cnt, got_packet, NULL) < 0) {
           fprintf(stderr, "pcap_loop error: %s\n",pcap_geterr(handle));
           exit(1);
   }



【現在の問題点メモ】

1,srcipとdstipが同じになってしまう。
inet_ntoaの落とし穴で対応する。

2,HTTPヘッダ情報からうまく欲しい情報を抽出できていない。
PHP側で対処可能だとおもう。

3,長時間実行すると(多くのパケットを取ると)落ちる。
たぶんメモリを開放してないとかそういうのだと思う。

4,パケットの量が多いと取りこぼす。
コールバックの形をトラずPHPに送っているから仕方ないのか。
PHPから使うとき、filterの設定をしっかりして、
対象範囲を限定すればなんとかなるか。






php extensionを作成する ~クラスの書き方~

この記事を読むと・・・、

$obj = new Mypcap();
echo $obj->interface();
echo $obj->filter();


$pkt = $obj->get_packet();

echo $pkt->srcip
echo $pkt->dstip
echo $pkt->protocol
echo $pkt->sport
echo $pkt->dport
echo $pkt->http_request


見たいなコードを書けるようになる。


PHP拡張でクラス実装がよくわからん

DSAS開発者の部屋 PHPextension 第3回

※ helloworldくらいは作っておく。


1,クラスの作成

① php_mypcap.h に追記
static zend_class_entry *mypcap_ce;

② mypcap.c の PHP_MINIT_FUNCTION(mypcap) に追記
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "Mypcap", mypcap_functions);
mypcap_ce = zend_register_internal_class(&ce TSRMLS_CC);

zend_declare_property_string(mypcap_ce, "interface", strlen("interface"), "eth2", ZEND_ACC_PUBLIC)

zend_declare_property_string(mypcap_ce, "filter", strlen("filter"), "tcp", ZEND_ACC_PUBLIC)


return SUCCESS;

これでクラスのインスタンスを生成できるようになる。
このクラスには、interfaceとfilterというプロパティ(メンバ変数)がある。


2,メソッドの作成

① php_mypcap.h にメッソド名を宣言
PHP_METHOD(mypcap, get_packet);

② mypcap.c の mypcap_functions にメッソド名を追記する。
PHP_ME(mypcap, get_packet, NULL, 0);


③ mypcap.c の最後の方に関数を実装する。
PHP_METHOD(mypcap , get_packet){
  printf("get");
  return
}

※1 メソッド内で、メンバ変数を読み込む方法。
zval *interf;
obj = getThis();
interf = zend_read_property(Z_OBJCE_P(obj),obj, "interface",strlen("interface"), 1 TSRMLS_CC);
printf("%s\n", interf->value.str.val);


※2 メソッド内で、引数を取得する方法。
char *arg;
int arg_len;
if(zend_parse_parameters(ZEND_NUMARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE)
{return;}
printf("%s\n",arg);


※3 メソッドで、インスタンスを返り値とする方法。
zval *pkt;

// オブジェクト生成
MAKE_STD_ZVAL(pkt);
if(object_init(pkt) != SUCCESS){}
add_property_stringl(pkt, "srcip","",strlen(""),1);
add_property_stringl(pkt, "dstip","",strlen(""),1);
add_property_stringl(pkt, "protocol","",strlen(""),1);
add_property_longl(pkt, "sport",0);
add_property_longl(pkt, "dport",0);
add_property_stringl(pkt, "http_requ","",strlen(""),1);

// オブジェクト返却
*return_value = *pkt;
zval_copy_ctor(return_value);

return;

PHP: Zend API: PHPのコアをハックする。
ここを参考にした。

PHPエクステンションから戻り値を~
ここも参考にした。

2011年10月25日火曜日

cakephp、URL接続後の流れ

http://paymo.j-payment.co.jp/payform/101071に接続した後の
流れを追って見る。


1、URL接続 → ドキュメントルートを参照
apacheに設定されているドキュメントルートを参照する。
この場合、
/home/httpd/www/paymo/payform/101071
を参照する。



2、トップで、mod_rewirteによる参照先を書き換え
cakephpのトップには、「.htaccess」が置かれている。
この中には、mod_rewriteの設定が書かれている。
RewriteEngine on
RewriteRule    ^$    app/webroot/      [L]
RewriteRule    (.*) app/webroot/$1    [L]

これは、RewriteRule (正規表現) (文字列)
(正規表現)に一致した部分を、(文字列)に書き換えるということ

^$ : 先頭から末尾まで何もない。
(.*) : 何でもいい一文字(.)の繰り返し(*)。

つまり、
引数なしの場合 → app/webroot/
引数ありの場合 → app/webroot/引数

今回の場合、

/home/httpd/www/paymo/payform/101071

/home/httpd/www/paymo/app/webroot/payform/101071

を参照することになる。




3,webrootで、mod_rewirteによる参照先を書き換え

webrootに飛ばされたあと、更にrewriteされる。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME}  !-d
RewriteCond %{REQUEST_FILENAME}  !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

RewriteCondは、RewriteRuleを適用する条件を設定する。
RewriteCondについて
 
RewriteCond (対象) (条件)
REQUEST_FILENAME : 接続先のファイル名
!-d : 存在するディレクトリ名にはルールを適用しない。
!-f : 存在するファイル名にはルールを適用しない。

※ 「存在する」を確認する範囲は?

この条件に一致する場合、RewriteRuleを適用する。
この場合、
/home/httpd/www/paymo/app/webroot/payform/101071

./index.php?url=/home/httpd/www/paymo/app/webroot/payform/101071

となり、app/webroot/index.phpがよびだされる。



4,app/webroot/index.phpの中では。
いろんな定数の定義が行われる。主にパス。
ROOT, APP_DIR, CAKE_CORE_INCLUDE_PATH, WEBROOT_DIR等を、
app/webroot/index.phpからさかのぼって設定している。

パスの設定が終わったら、
CORE_PATH/cake/bootstrap.php
(/home/httpd/www/paymo/cake/bootstrap.php)をincludeする。

bootstrap.phpの中では、更に
「/cake/basics.php」、
「/cake/config/paths.php」、
「/cake/libs/のなかみ幾つか」が読み込まれている。
また、「Configure::getInstance()」で、Appインスタンスを生成している。

$_GET['url ']が入っていることを確認して、
$Dispatcher = new Dispatcher();
$Dispatcher->dispatch();
を呼び出す。


5、Dispatcherでやること。
 Dispatcherは、「cake/dispatcher.php」で定義されており、
bootstrap.phpの中で、読み込まれている。

function dispatchのコメントを読む限り、
この関数で、URLを読み、該当するコントローラを参照し、
表示までしているとのこと。

「paramsの設定」や「dataの設定」もここでやっている模様。


とりあえずここまで。
もうちょっと追わないと、
formからdataを受け取れる仕組みはわからないかも。。






正規表現

便利なサイト

php でパケットキャプチャを行う

方法としては以下の2通り

① phpのソケットapiを利用する。
作業量は少なくなりそうだが、
パケットキャプチャに関する参考資料が少ない。

phpのソケットapiリファレンス
phpのソケットapiでサーバを作る

また、パケットキャプチャに必要な、
ソケットのドメインAF_PACKET(PF_PACKET)が
使えないかもしれない。。


② Cで書いて、phpエクステンションにする。
パケットキャプチャの資料は多そうだが、
phpエクステンションのハローワールドから
はじめる必要がある。


Cでパケットキャプチャ1
Cでパケットキャプチャ2
phpエクステンションの作り方


②の方法で行く事にする。

1、スケルトン作成
# cd /usr/local/share/php-5.3.8/ext/
# ./ext_skel --extname=pcap
# cd pcap

config.m4を修正
dnl PHP_ARG_ENABLE(エクステンション名, whether to enable エクステンション名 support,
dnl Make sure that the comment is aligned:
dnl [ --enable-エクステンション名 Enable エクステンション名 support])
この3行のdnlを消して保存する。

KLabのブログに書いてあった場所とは異なる。
ここの意味は何なのか?


2、コンパイル
# phpize
# ./configure
# make

3、ソース修正
php_pcap.h
pcap.c
をそれぞれ修正して、再度コンパイル


4、シンボリックリンク作成
# cd /usr/lib64/20090626/
# sudo ln -s /usr/local/share/php-5.3.8/ext/pcap/modules/pcap.so ./pcap.so

php.iniにパスを通す。


5、ソースを書く。
[1] PHP extensionとして作っているところ
[2] こCのパケットキャプチャを作っているところ
書いてみて共通しているところ、ちがうを探してみた。

① socketのタイプ
[1]では、ドメイン:AF_PACKET、タイプ:SOCK_RAWを使っていたが、
[2]では、ドメイン:PF_PACKET、タイプ:SOCK_DGRAMを使っていた。


う~ん。
pcap使ったほうがいいのかも

2011年10月24日月曜日

phpでhttprequestを使用する

ほぼここの通り

1,peclインストール

2、httprequestインストール
# pecl install pecl_http

3,php.iniに追記
extension=http.so

4、使う。
使用例

2011年10月23日日曜日

php extensionを作成する

php extensionを作成する


1、スケルトンを作成する
# cd /usr/local/share/php-5.3.8/ext/
# ./ext_skel --extname=helloworld

2、./helloworld/config.m4を修正

 PHP_ARG_WITH(helloworld, for helloworld support,
 Make sure that the comment is aligned:
 [  --with-helloworld             Include helloworld support])



3、コンパイル
# phpize
# ./configure
# make


4、dlの有効化(dlの有効化方法
でふぉではdl()関数は使用できない。
php.iniを修正
enable_dl=On


5、シンボリックリンクを作成
dl()関数は、extension_dir以下のものしか指定できないらしい。

# cd /usr/lib64/20090626
# ln -s /usr/local/share/php-5.3.8/ext/helloworld/modules/helloworld.so ./helloworld.so


6、実行
dl('helloworld.so');
helloworld();


7、引数と戻り値
① 引数を渡す

if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &value) == FAILURE)
return;

引数1 : 引数の数
引数2 : 取得する順番(long, char, long → lcl)
引数3 : 受け取る変数のアドレス(&value)


l  long 整数型
d  double 浮動小数点数型
s  string 文字列型
b  boolean 論理値型
r  resource リソース型
a  array 配列型
o  any object オブジェクト型
z  zval zval型


zend_parse_parameters



② 戻り値を取得する

RETURN_RESOURCE(l)
RETURN_BOOL(b)
RETURN_NULL()
RETURN_LONG(l)
RETURN_DOUBLE(d)
RETURN_STRING(s, dup)
RETURN_STRINGL(s, l, dup)
RETURN_EMPTY_STRING()
RETURN_FALSE
RETURN_TRUE



8、

phpでmecabを使う

phpでmecabをつかう


1、mecabのインストール

# wget http://sourceforge.net/projects/mecab/files/mecab/0.98/mecab-0.98.tar.gz/download
# tar -xvzf mecab-0.98.tar.gz
# ./configure --prefix=/usr/local --with-charset=utf8 --enable-utf8-only --enable-mutex
# make
# make install


2、辞書のインストール


# sudo wget http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz/download
# tar -xvzf mecab-
# ./configure --prefix=/usr/local --with-charset=utf8
# make
# make install

3、php extensionのインストール

# wget http://www.opendogs.org/pub/php_mecab-0.3.0.tgz
# phpize
# ./configure --with-php-config=/usr/bin/php-config --with-mecab=/usr/local/bin/mecab-config
# make
# make install

※ make実行時にコンパイルエラー
mecab.cの335近くにある、
「static ZEND_BEGIN_ARG_INFO(arginfo_ ## name, pass_rest_by_reference)」
「static ZEND_BEGIN_ARG_INFO_EX(arginfo_ ## name, pass_rest_by_reference, return_reference, required_num_args)」
の「static」をはずしたら、とりあえずコンパイルは通った。。
いいのか?。

※ 河野くんに聴いたら、普通にバージョン古かっただけ。
1: sudo pear channel-discover pecl.opendogs.org
2: sudo pear remote-list -c opendogs
3: sudo pear install opendogs/mecab-beta
 - /usr/local/bin/mecab-config


4、php.iniを設定
/etc/php.d/mecab.ini

5、確認
$ php -i | grep -i "mecab"

6、使ってみる。



こんな使い道がある。

socket api の引数について

1、ソケットドメイン
AF_INET : インターネットIPv4で使われるドメイン
AF_INET6 : インターネットIPv4で使われるドメイン 
AF_UNIX : UNIX上の通信で使われるドメイン
AF_PCAKET : データリンク層に直接アクセスするためのドメイン

※AF_PACKETは、データリンク層まで、どれを使うか確定する。
それ以外は、トランスポート層までどれを使うか確定する。


2、ソケットタイプ
SOCK_STREAM : TCPに使われるソケットタイプ
SOCK_DGRAM : UCPに使われるソケットタイプ
SOCK_RAW : トランスポート層



※SOCK_RAWは、ネットワーク層までどれを使うか確定する。


ソケットドメインとソケットタイプが少しわかりやすい。





unite.vimのインストール&使い方

unite.vimのインストール方法をまとめる。

下準備


1、pathogen.vimのインストール
.vim/bundle/以下を、.vim/以下と同じように読んでくれるプラグイン。
他のプラグイン管理を楽にできる。

$ git clone git://github.com/tpope/vim-pathogen.git
$ cp vim-pathogen/autoload/pathogen.vim ~/.vim/autoload/

2、vimprocのインストール
vimscriptからシェルのコマンドたたくときとかに使う。

$ cd ~/.vim/bundle
$ git clone git://github.com/Shougo/vimproc.git
$ cd ~/.vim/bundle/vimproc
$ make -f make_gcc.mak

unite.vimのインストール


1、unite.vimをインストール

① インストール
$ cd ~/.vim/bundle/
$ git clone git://github.com/Shougo/unite.vim.git

② vimrcにキーバインドを設定
以下をvimrcに書き込む。
" insert modeで開始
let g:unite_enable_start_insert=1

" buffer 一覧
noremap  :Unite buffer -direction=botright 

" file 一覧
noremap   :UniteWithBufferDir -buffer-name=files file -direction=botright 

その他、ソースのインストール


1、unite-grepをインストール
grepした結果をuniteで表示する。
$ cd ~/.vim/bundle/
$ git clone git://github.com/Sixeight/unite-grep.git

2、自作ソースのインストール
結構簡単にソースを作って使う事ができる。
function抽出のためのuniteソース
mysql接続先変更のためのuniteソース
bazaar操作のためのuniteソース

2011年10月22日土曜日

php 5.3.8のインストール

もう何度も挑戦して、失敗している気がするが、
もう一度挑戦してみる。

1、ソースをダウンロード
# pwd
/usr/local/share
# wget http://jp.php.net/get/php-5.3.8.tar.gz/from/this/mirror
# tar -xvzf php-5.3.8.tar.gz


2、必要っぽいものをインストール
# yum install pcre pcre-devel
# yum install gcc
# yum install libxml2-devel
# yum install openssl-devel
# yum install sqlite-devel
# yum install bzip2-devel
# yum install curl-devel

# yum install gdbm-devel
# yum install 
# yum install 
# yum install 
# yum install 
# yum install 
# yum install 
# yum install 
# yum install 




※ gcc をインストールせずに、configureをやろうとすると、
「no acceptable cc found in $PATH」といわれる。
cc = C Compiler。略さないでほしい。

※ libxml2-develをインストールしてないと、configureで
「xml2-config not found」といわれる。

※ openssl-devel
「 Cannot find OpenSSL's 」といわれる。

※ pcre-devel

「Could not find pcre.h in /usr」といわれる。

※ sqlite-devel
「Please reinstall the sqlite distribution from http://www.sqlite.org」

※ bzip2-devel
「 Please reinstall the BZip2 distribution」

※ curl-devel
「 Please reinstall the libcurl distribution -
    easy.h should be in /include/curl/」

※ gdbm-devel、db4-devel
「Could not find necessary header file(s).」

※ enchant enchant-devel
「 Cannot find enchant」

※ libjpeg libjpeg-devel
「jpeglib.h not found」


※ libpng libpng-devel
「png.h not found」

※ libXpm libXpm-devel
「libXpm.(a|so) not found.」

※ freetype freetype-devel
「freetype.h not found.」

※ gmp gmp-devel
「Unable to locate gmp.h」

※ php-imap libc-client libc-client-devel
「 utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.」
config.log : 「mail.h: No such file or directory」

※ libicu libicu-devel
「 Unable to detect ICU prefix or /usr/bin/icu-config failed. Please verify ICU install prefix and make sure icu-config works.」

※ gcc-c++
「 installation or configuration problem: C++ compiler cannot create executables.」


※ openldap-devel
「Cannot find ldap.h」

※ mysql-devel 
「 Cannot find MySQL header files under /usr.
Note that the MySQL client library is not bundled anymore!」


※ unixODBC-devel
「 ODBC header file '/usr/include/sqlext.h' not found!」

※ postgresql postgresql-devel
「 Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path」

※ php-pspell aspell aspell-devel
「Cannot find pspell」


※ libedit libedit-devel
「 Please reinstall libedit - I cannot find readline.h」


※ recode recode-devel
「 Can not find recode.h anywhere under /usr /usr/local /usr /opt.」




※ net-snmp net-snmp-devel
「 SNMP sanity check failed. Please check config.log for more information.」



※ libtidy libtidy-devel
「 Cannot find libtidy」



※ libxslt libxslt-devel
「 xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution」



※ cyrus-imapd cyrus-imapd-devel ,
「 recode extension can not be configured together with: imap」

config.log
「cannot find -lmysqlclient」

① パスの変更 → ×
# export LDFLAGS="-L/usr/lib64/mysql"

② シンボリックリンク → ×
# ln -s /usr/lib64/mysql /usr/lib/mysql

③ rootになってconfigureを実行する → ×
「/usr/local/share/php-5.3.8/configure:104253: undefined reference to `hash_insert'」

# yum install cyrus*

④ lib64/mysql/libmysqlclient.soのシンボリックリンク、
lib64/libmysqlclient.soを作成する → △

「undefined reference to `hash_insert'」

⑤ mysqlに関わるものをすべて入れる → ×
# yum install mysql*

⑥ imapに関わるオプションをなくす。→ ○
'--with-imap=shared' '--with-imap-ssl'
これらをなくす。

3、configure
yum でphpをインストールしたときに使われているオプションを、
phpinfoからパクって使った。

# sudo './configure'  '--build=x86_64-unknown-linux-gnu' '--host=x86_64-unknown-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--cache-file=../config.cache' '--with-libdir=lib64' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d' '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' '--with-bz2' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--with-xpm-dir=/usr' '--enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr' '--with-openssl' '--with-pcre-regex=/usr' '--with-zlib' '--with-layout=GNU' '--enable-exif' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--with-kerberos' '--enable-ucd-snmp-hack' '--enable-shmop' '--enable-calendar' '--without-sqlite' '--with-libxml-dir=/usr' '--enable-xml' '--with-system-tzdata' '--enable-force-cgi-redirect' '--enable-pcntl'  '--enable-mbstring=shared' '--enable-mbregex' '--with-gd=shared' '--enable-bcmath=shared' '--enable-dba=shared' '--with-db4=/usr' '--with-xmlrpc=shared' '--with-ldap=shared' '--with-ldap-sasl' '--with-mysql=shared,/usr' '--with-mysqli=shared,/usr/bin/mysql_config' '--enable-dom=shared' '--with-pgsql=shared' '--enable-wddx=shared' '--with-snmp=shared,/usr' '--enable-soap=shared' '--with-xsl=shared,/usr' '--enable-xmlreader=shared' '--enable-xmlwriter=shared' '--with-curl=shared,/usr' '--enable-fastcgi' '--enable-pdo=shared' '--with-pdo-odbc=shared,unixODBC,/usr' '--with-pdo-mysql=shared,/usr' '--with-pdo-pgsql=shared,/usr' '--with-pdo-sqlite=shared,/usr' '--with-sqlite3=shared,/usr' '--enable-json=shared' '--enable-zip=shared' '--without-readline' '--with-libedit' '--with-pspell=shared' '--enable-phar=shared' '--with-tidy=shared,/usr' '--enable-sysvmsg=shared' '--enable-sysvshm=shared' '--enable-sysvsem=shared' '--enable-posix=shared' '--with-unixODBC=shared,/usr' '--enable-fileinfo=shared' '--enable-intl=shared' '--with-icu-dir=/usr' '--with-enchant=shared,/usr' '--with-recode=shared,/usr'


4、sudo make
いけたっぽい。

5、sudo make test

6、sudo make install


$ sudo make install
Installing PHP SAPI module:       cgi
Installing PHP CGI binary: /usr/bin/
Installing PHP CLI binary:        /usr/bin/
Installing PHP CLI man page:      /usr/share/man/man1/
Installing shared extensions:     /usr/lib64/20090626/
Installing build environment:     /usr/lib64/build/
Installing header files:          /usr/include/php/
Installing helper programs:       /usr/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/share/man/man1/
  page: phpize.1
  page: php-config.1
/usr/local/share/php-5.3.8/build/shtool install -c ext/phar/phar.phar /usr/bin
ln -s -f /usr/bin/phar.phar /usr/bin/phar
Installing PDO headers:          /usr/include/php/ext/pdo/



7、extension_dirの変更
php.iniに以下を書き込み

extension_dir="/usr/lib64/20090626/"


8、バージョン確認
$ php -v

PHP 5.3.8 (cli) (built: Oct 23 2011 01:39:12)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies


※ imap.soがないってエラーが出ていた。
使わないと思ったので、php-imapを消した。
sudo yum install php-imap

2011年10月21日金曜日

phpのセッション

PHPのセッションは、ブラウザ毎に振り分けられるものらしい。

    session_start();
   if($_GET['input'] == 1){
      echo "input";
      $_SESSION['test'] = $_GET['test'];
   }else if($_GET['input'] == 0){
      echo $_SESSION['test'];
   }
?>

このソースに対して、
1、「http://paymo.j-payment.co.jp/www/index.php?input=1&test=karino」でセッション格納
2,別タブを開いて、「http://paymo.j-payment.co.jp/www/index.php?input=0」 でセッションを読み込んでみると、karinoと表示された。

apache リバースプロキシ

80番と81番でapacheをListenさせ、
80番から入ってきて、URIが「/www*」のものを、
81番に転送する。

りばーすぷろきし


Listen 80
NameVirtualHost *:80

    ServerName paymo.j-payment.co.jp
   DocumentRoot "/home/httpd/www/paymo"


ProxyRequests offProxyPreserveHost on

    Order deny,allow
    Allow from all


ProxyPass /www http://localhost:81
ProxyPassReverse /www http://localhost:81




Listen 81
NameVirtualHost *:81

    ServerName paymo.j-payment.co.jp
   DocumentRoot "/home/httpd/www"


sshfsを習った

1、インストール
# yum install sshfs
# modprobe fuse

2、使用方法
$ sshfs karino@192.168.11.4: /home/karino/114/


※ Permission denyと言われた。
ここが役に立った

以上。

検索文字列キャプチャ

【全体概要】
1、tcpdumpでパケット抽出
host : google
protocol : http
Request URI : /search を含む

※ どこから検索しても同じホスト名か?

2、パケットから文字列抽出
Source IP : 192.168.11.*
Request URI : q="検索文字列"を抽出

3、変換
192.168.11.* → 社員名
検索文字列 → URLデコード

4、保存

【実装】

1、tcpdumpでパケット抽出
host : www.google.co.jp(74.125.31.147)
protocol : http
Request URI : /search を含む

下記で抽出可能
sudo tcpdump -X dst 74.125.31.147 and port http | grep /search

grepを使っている


goole検索をlinuxコマンドライン上からやる。
あんま使えないけどここ。
curl -e http://www.my-ajax-site.com 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton'


この後・・・。
tcpdumpからテキスト読み込んで抽出するってのが、
あまりスマートでない気がしたので、
pcapライブラリ使って、
パケットキャプチャするPHP extensionを作る方向に走る。

PHPでパケットキャプチャする



2011年10月15日土曜日

ThinkPadを買った

1、windows 7 Home premiumを professionalにアップデート

2、いろいろやる
・ キーボード配置変更
・ ショートカット設定
・ ソフトを入れる

3、virtual pc インストール

4、VPCにCentOSをインストール

2011年10月13日木曜日

vim

「vimテクニックバイブル」を買った。
やってみたことや、新しく学んだことを書く。

vimテクニックバイブルを使ってみて。


1、


2、QuickFix


3、QFixGrep
① ランタイムぱすの通し方
http://sites.google.com/site/fudist/Home/vim-nihongo-ban/-vimrc-sample
②  QFixGrepのインストール
http://sites.google.com/site/fudist/Home/grep/install

③ 使い方
【コマンドライン】
Grep karino *

【キーマップ】
ノーマルモードで、「g」、「,」、「e」



2、マークをエディた上で表示してジャンプする先を見やすくする。


3,unite.vim



psコマンドを見やすくする。

プロセスのメモリとヘッダを出力できるように、
bashrcに以下を書き込み。

alias ps="ps axl |head -1 && ps alx"

メモリ

2011年10月10日月曜日

socket API を使ってみる

ここを参考にした。というか、まんま書いた。


1、TCP_SERVERを書く。


2、TCP_Clinetを書く。


3、プログラムを実行
・ 192.168.11.3でサーバを実行。
・ 192.168.11.4でクライアントを実行。


4、tcpdumpを取る。
サーバ側でtcpdumpを実行してパケットを取得した。


5,netstatを確認する。
 サーバ側でnetstat -lanputを確認すると、
 tcp        0      0 0.0.0.0:12345               0.0.0.0:*                   LISTEN      32738/tcp_server   

サーバ側プログラムで、tcpコネクションを閉じる前にsleep(10)するように、
変更。クライントを複数立ち上げて、サーバ側でnetstat -lanputを確認すると、
tcp        0      0 0.0.0.0:12345               0.0.0.0:*                   LISTEN      32738/tcp_server   
tcp        0      0 192.168.11.3:12345          192.168.11.4:43978          ESTABLISHED -                  
tcp        1      0 192.168.11.3:12345          192.168.11.4:43977          CLOSE_WAIT  32738/tcp_server



最初に立ち上げたクライントは、「CLOSE_WAIT」、
2番目に立ち上げたクライアントは、「ESTABLISHED」という状態になり、
サーバからの出力は受信できていなかった。
これは、サーバ側プログラムのプロセスが1つしか無いからか?。
apacheとかなら、接続毎にプロセスを複製するから、
複数のクライアントがいても、同時に対処できるのか?

TCPの状態は、ここも参考になった。



2011年10月9日日曜日

openflow tutorial

openflow tutorial(英語)

やっている人がいた

英語のやつそのままやってみよう。


Set up Virtual Machine

Virtualマシンをインストールして、
ホストマシンのターミナルから接続するまで。

① 以下をDLする。
・VirtualBox VM image (viretualBoxでできるじゃん!)
・Virtualization software (午前中に入れました)
・X Server Xming (vnc viewer的な?)
・Terminal Putty (ポデロサじゃダメなのかな?)

② ソフトのインストール
・xming
これ入れたら、Puttyも一緒に入ったっぽい。
xmingの使い方
使ってみた。これ、ポデロサだけで十分じゃん。

③ VMのインストール
isoファイルからLinuxをインストールしたら、以下のフォルダに入る。
C:\Documents and Settings\karino\VirtualBox VMs\OpenFlowTutorial
単純にここにコピーしたが、「オープンに失敗しました」的なエラーが出た。
vdiはvirtualboxのコマンドでコピーしないといけないらしい
C:\Program Files\Oracle\VirtualBox\VBoxManage clonehd [コピー元の.vmdk] [コピー先の.vmdk]
まったく。
そして長い。

④ NICの設定
ネットワークのアダプタ2を
ホストオンリーアダプタとして有効化。

⑤ VM起動
ログインは、以下のIDPW。
user : openflow
pw : openflow

⑥ キーボードの設定
ここで気がついた。
キーボードの配置がおかしい。
「:」が出ない。vimからしたら致命傷。

/etc/default/console-setupを変更。
sudo /etc/init.d/keyboard-setup startでリスタート。

$ sudo loadkeys jpだけでOK?
電源落とすと、元に戻っていた。調べなきゃ。

⑦ ネットワークの設定
$ ifconfig
eth0 : 10.0.2.15
eth1 : 192.168.56.101
が、わり当たっていた。

$ dhclient
でアドレスを再取得しても、
同じ。

~ ちょっと脱線 ~ 

なぜ、このIPがわり当たるのかな?。
割り振っているDHCP鯖はどこにいるのか?。

プロセスを見てみる。
$ ps -ax | grep dhcp
518 ? Ss 0:00 dhclient3 -e IF_METRIC=100 -pf /var/run/dhclient.eth1.pid -lf /var/lib/dhcp3/dhclient.eth1.leases eth1
538 ? Ss 0:00 dhclient3 -e IF_METRIC=100 -pf /var/run/dhclient.eth0.pid -lf /var/lib/dhcp3/dhclient.eth0.leases eth0
1650 pts/0 S+ 0:00 grep --color=auto dhcp

う~ん。
/var/lib/dhcp3/dhclient.eth1.leasesを見てみると、
192.168.56.101と書いてある。
書きなおして、dhclientやっても変わらんかった。


⑧ ホストマシンから接続
IP:192.168.56.101
ID:openflow
PW:openflow
接続できた。


Learn Development Tools

① 用語まとめ
OpenFlow Controller:コントローラ。
OpenFlow Switch :スイッチ。
dpctl :openflowにメッセージを送るとか・・・。
Wireshark :言わずと知れたwireshark
iperf :TCP connectionの速度を計るコマンド
Mininet :ネットワークエミュレーター
cbench :flow のテスト・・。

使ってみれば、分かるはず!w。


② miniネットワークを開始
$ sudo mn --topo single,3 --mac --switch ovsk --controller remote
間違えるかもしれないからコピペしろって、
書いてあったけど、あえて打とう。


③ mininetの使い方。
起動すると、mininetのプロンプトが開く。

mininet> nodes
mininetで起動しているホスト、スイッチ、コントローラを表示する。

mininet> help
ヘルプの表示

mininet> h2 ifconfig
対象のホスト上でコマンドを実行する方法。
ls, cd, ifconfigを試してみた。

mininet> xterm h2 h3
xtermが開くはずだが、開かない・・・。

mininetを停止するには、
Ctrl + D

mininetをリセットするには、
$ sudo mn -C


xtermが開かない原因を調べる。
Warning: This program is an suid-root program or is being run by the root user.
The full text of the error or warning message cannot be safely formatted
in this environment. You may get a more descriptive message by running the
program as a non-root user or by removing the suid bit on the executable.
xterm Xt error: Can't open display: %s
xterm: DISPLAY is not set
と出ている。

分かりやすそうなこいつ「DISPLAY is not set」を調べてみると、
これが出てきた。
微妙。。後日再挑戦。


④ dpctlの使い方
$ dpctl show tcp:127.0.0.1:6634
openflowスイッチの、状態を確認

$ dpctl dump-flows tcp:127.0.0.1:6634
openflowスイッチの、ルーティングテーブルの表示?


⑤ ping test
まず、flow tableにルールを書きこまなければならない。
$ dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
$ dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1
$ dpctl dump-flows tcp:127.0.0.1:6634

その後、下記で通る。
mininet> h2 ping -c3 h3

※ しばらくして、もう一度dpctl dump-flowsで
見てみるとルールが消えていた。。
予想:このコマンドはスイッチに直接ルールを書き込むもので、
本来はスイッチにパケットが来た時点で
コントローラに問合せ、ルールを取得するのかな。

Start Wireshark
wiresharkをGUIから使うにあたり、
やはりRealVNCとかで接続したくなる。

① xwindowのインストール(鯖側)
VINEだけど似たようなもの
$ sudo apt-get update
$ sudo apt-get install xinit
$ startx
VirtualBoxの画面からstartxすれば、
普通にwireshark使えた。
ま、VNC入れてみよう。

② vncserverのインストール(鯖側)
こんな雰囲気でVNC-SERVERをインストール・設定
$ sudo apt-get install vnc4server
$ vnc4server
(パスワードを打ち込む)

③ realVNCを入れて接続(こっち側)
IP:192.168.56.101:1
パスワード適当にいれる。
つながる。

④ ターミナルでwiresharkを起動
$ sudo wireshark &
プロミスキャスモードで使う為,sudo?

⑤ openflowのパケットを取得するには、
interfaceを「lo」にして、
filterに「of」と入れればいいらしい。


Start Controller and view Startup messages in Wireshark
コントローラを起動して、
openflowのパケットを見てみる。
$ controller ptcp:

①取得したぱけっとを見てみる。
1,127.0.0.1同士、異なるポートでTCPコネクションだとか、
OpenFlowProtocolだとかがやり取りされている。
コントローラとスイッチの通信。NATみたいな感じか。

2,mininetでpingを飛ばすと、
wireshark上に表示された(時々表示された・・)
プロトコル名は、「OFP+ICMP」
パケット内を見ると、OFPの中に更にイーサネットフレームがあり、
その中にICMPが入っている。
これが、いわいるIPトンネリングというやつか。

3,「OFP+ICMP」の他にも「OFP+ARP」,「OFP」があった。

4,「OFP」には以下の7種類が確認できた。
「Hello」,「Features Request」,「Features Reply」,「Set Config」
「Echo Request」,「Echo Reply」,「Flow Mod」,「Packet Out」
「Echo Request」,「Echo Reply」はコントローラからスイッチの死活監視?
「Flow Mod」,「Packet Out」はどちらも、「OFP+ICMP」の前後に見られるが、
なんだろう。。

※ wiresharkのファイルをローカルに持ってきて開いてみたが、
OpenFlowプロトコルを認識できていなかった。
(全部タダのTCPにデータくっついてる感じ)
OpenFlowプロトコルを認識するにはそれなりに準備が必要と。


View OpenFlow Messages for Ping
1, wiresharkのfilterに以下を入力
of && (of.type != 3) && (of.type != 2)
of : openflowプロトコル
of.type != 3 : どういう意味だろう?
of.type != 2 : どういう意味だろう?

2, pingを打ってみる。
mininet> h2 ping -c1 h3

3, 確認できたパケットは、
Packet In、Flow Mod。
Packet OutとFlow Expireが見つからない。

これらのパケットは、スイッチとコントローラ間の
やり取りを示すもの。
mininet再起動してやったらちゃんと見えた。
おそらく、スイッチにルールが割り当てられていたのだろう。

h2からh3にpingを飛ばしたときに、
まず、switchとcontroller間でルールのやり取りが行われる。
(packet in, packet out,flow mod)
その後、h3にpingが届けられ、h3からh2にecho replyが送信される。


Benchmark Controller w/iperf

1,iperfでベンチマークを取る。
mininet> iperf
で2点間の速度が取れる。

2,異なるネットワークを構築し、iperfしてみる。
$ sudo mn --topo single,3 --mac --controller remote --switch ovsk (今まで)
$ sudo mn --topo single,3 --mac --controller remote --switch user(これから)

switch が「ovsk」「user」の違い。
ovsk : kernel-space switch
user : user-space switch

※ iperfしてもエラーが出る用になってしまった。。
1,2つmininetを立ち上げていたから?
2,controllerを起動していなかったから?
なんにせよ、チュートリアル通り、一度exitしてから、
やったらできた。

結果
ovsk : 1.73 Gbits/sec
user : 295 Mbits/sec
チュートリアルでは、ovskはカーネル内で完結するのに対して、
userではカーネルスペースからユーザスペースへの移動が発生するために
これほど速度差が出てくる的なことが書いてあった。
まだ、十分な理解ではない。


Create Learning Switch 

Controller Choice A: NOX w/Python

Pythonでやる場合とJAVAでやる場合があるのか?

ここではネットワークアプリケーションとして、
L2 learning switchを作成する。

1、controllerが動いていることを確認
ps -a | grep controller

2、controllerとswitch間にコネクションがあるか確認
netstat -lanput
tcp        0      0 0.0.0.0:6633            0.0.0.0:*               LISTEN      1125/controller
tcp        0      0 127.0.0.1:6633          127.0.0.1:59210         ESTABLISHED 1125/controller
tcp        0      0 127.0.0.1:59210         127.0.0.1:6633          ESTABLISHED -

mininetからexitすれば、ESTABLISHEDになっているやつは消え、
mn -c を実行すれば、LISTENになっているやつも消える。

3、mininetを起動
sudo mn --topo single,3 --mac --switch ovsk --controller remote
 
4、openflowコントローラをデバッグモードで開始する
$ cd nox/build/src
$ ./nox_core -v -i ptcp: pytutorial 
※ このとき、ポート6633を使うので、
controllerが起動していてはだめ。

5、mininetからpingが通るか確認する
mininet> xterm h3
mininet> h3 ping h2

# tcpdump -XX -n -i h3-eth0

※ xtermを開くには、VNCで接続していないとできなかった。
そのうち、X11フォワーディングつかって、
ぽでろさのみで完結できるようにしたい。

6、もっと確認
mininet> pingall
 *** Ping: testing ping reachability
h2 -> h3 h4
h3 -> h2 h4
h4 -> h2 h3
*** Results: 0% dropped (0/6 lost)

mininet> iperf
*** Iperf: testing TCP bandwidth between h2 and h4
*** Results: ['27.0 Mbits/sec', '27.0 Mbits/sec']

前iperfで確認したときと比べて、
めっちゃ低い。。

7、Pythonのコードを修正して、Learning switchを作成する。





つづく。。。

X11 フォワーディング

Openflowのチュートリアルで、
リモート側のwiresharkや、xtermでの接続が必要になるが、
VNCで接続するのめんどくさい。

昔研究室の人がやってた、
xが必要になるときだけ、それが立ち上がるやつを
使ってみたい。
 
poderosaを使ったSSHフォワーディングのやり方

X11フォワーディングのやり方


やり方としては、xサーバをローカルに立ち上げておき、
xが必要になるサービスをリモート側で実行した際、
リモート側からローカル側へSSHフォワーディングするように設定するらしい。

poderosaのポートフォワーディングがまだよく理解できていないため、
また今度やるか。
どうしてもやらないとチュートリアル進まないって状態になったら。。

2011年10月6日木曜日

remiレポジトリの追加

誰かが更新が速いと言っていたremiレポジトリを追加する。


remiレポジトリEPELレポジトリ

1、まず、EPELレポジトリを入れる。
$ wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
$ sudo rpm -ivh epel-release-5-4.noarch.rpm

2、次に、remiレポジトリを入れる。
$ wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
$ sudo rpm -Uvh remi-release-5.rpm


見てみたが、
apacheは、2-2-15だった。


checkinstallのビルドとインストール

ここを参照。


1、gitでソースを落とす。

$ git clone http://checkinstall.izto.org/checkinstall.git
 
2、ビルドしてインストール。
# cd checkinstall
# make
# make install 
 
3、checkinstallのrpm作成
同ディレクトリでcheckinstall実行
# /usr/local/sbin/checkinstall 


/root/rpmbuild/に作成される。

4、checkinstallをrpmでインストール
rpm -ivh checkinstall-20111006-1.x86_64.rpm

5、rpmを作ってみる。
distcacheのrpmを作ってみると。
installwatch.soがないっていエラーが出た。
対処はここに書いてあった。


2011年10月5日水曜日

apache 2.2.21のインストール

テスト環境でapacheをバージョンアップする。

apache 2.2.21のRPMを作ってみた。
ほぼ、ここの通り。

1,最新版のtar.gzをダウンロード
# wget http://archive.apache.org/dist/httpd/httpd-2.2.21.tar.gz

2,SPECファイルを移動。
SPECファイル : /usr/src/redhat/SPECS/ に移動。
tar.gzファイル : /usr/src/redhat/SOURCES/ に移動。

3,必要なパッケージのアップデート
# yum -y install apr-devel apr-util-devel openldap-devel db4-devel \
expat-devel pcre-devel openssl-devel rpm-build distcache-devel libtool

4,SPECファイルの編集
arpやarp-util等のバージョンをインストールされている
バージョンに書き換える。
# rpm -qa | grep apr
apr : 1.3.12
apr-util : 1.3.9
apr-devel : 1.3.12
apr-util : 1.3.9

sedコマンド


5,rpmbuildの実行
rpmbuild -bb /usr/src/redhat/SPECS/httpd.spec

※rootでやったら,/root/rpm/~ってとこ見に行ったので、
パンピーでやった。
そしたら、BUILDとRPMSに書き込み権限が無いって言われたので、
chmod 777をやってしまった。

6,rpmのインストール
# sudo rpm -e mod_ssl
# sudo rpm -Uvh httpd-2.2.21-1.i386.rpm httpd-devel-2.2.21-1.i386.rpm httpd-manual-2.2.21-1.i386.rpm mod_ssl-2.2.21-1.i386.rpm

したら、「エラー:依存性の欠如:/usr/local/bin/perl は httpd-devel-2.2.21-1.i386に必要とされています」と出た。
/usr/local/bin/perl はあるけど。。
--nodeps(依存関係を無視して)をつけてインストール。いいのか?
rpmの使い方

7,バージョン確認
# httpd -v
上がってたw。

8,起動確認
# /etc/init.d/httpd start
失敗・・・。
※ モジュールが読み込めない。とりあえずコメントアウト。
mod_cache.so
mod_disk_cache.so
mod_file_cache.so
mod_mem_cache.so

# /etc/init.d/httpd start
失敗・・・。
※ 
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName

[Sat Oct 01 03:36:45 2011] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.11.3 (check DNS) -- or specify an explicit ServerName

[Sat Oct 01 03:36:45 2011] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.11.3 (check DNS) -- or specify an explicit ServerName

[Sat Oct 01 03:36:45 2011] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.11.3 (check DNS) -- or specify an explicit ServerName

(98)Address already in use: make_sock: could not bind to address [::]:80

(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

no listening sockets available, shutting down
Unable to open logs


192.168.11.3が逆引き出来ないって言ってるのかな。。
192.168.11.3て成っている所を試しに、localhostに変えてみた。
これなら、/etc/hostsに記載されているが。。今度はこちら。。

[Sat Oct 01 03:44:54 2011] [error] VirtualHost localhost:0 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results

いや。そこじゃない。
(98)Address already in use: make_sock: could not bind to address [::]:80

(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

no listening sockets available, shutting down
Unable to open logs
ここだ。

# netstat -lanput

確かに,ポート80番がListenしたままに成っている。。
httpd止めずにやったのが悪かったのかな。

ポート80番を使っているプロセスを特定
ここ
# fuser -n tcp 80
80/tcp: 5392 5393 5394 5395 5396 5397 5398 5399 14883

全部殺してみた。
なんかすぐ復活するんだけど。。
root 14883 0.0 1.8 31020 13936 ? Ss Sep19 0:00 /usr/sbin/httpd
先にこいつを殺したら全員消せた。
親プロセスが子を復活させてたのか。

改めて、httpd start.
いけた!

※ その後、なぜかhttpd stopが失敗する現象を確認。
親プロセス殺したらいいんだけど。。
なんで、httpdから殺せないんだろう。


本番環境でapacheをバージョンアップする。

更に本番環境でやろうとしたら、
arpのバージョンが異なるようで、
面倒だけど、本番でrpmを作りなおすことにした。
その際、distcacheが無い的なことを言われた。
yumにもない。。
ここにも書いてある。

configureしたら、
「configure: error: C++ preprocessor "/lib/cpp" fails sanity check
See `config.log' for more details.」って言われた。

調べたら、こんなのあった。
みんなこういうの、どうやって気がつくんだろう。。

さらに、configureはうまく言ったが、makeがうまくいかない。
「proto_fd.c:162: error: 'LONG_MIN' undeclared (first use in this function)
proto_fd.c:162: error: (Each undeclared identifier is reported only once
proto_fd.c:162: error: for each function it appears in.)
proto_fd.c:162: error: 'LONG_MAX' undeclared (first use in this function)」
って言われた。

ここにある
だから、なんでこんな事が分かるんだ?。make通った。
chkinstallでrpm作成。
distcacheをインストール。
# rpm -ivh distcache-1.5.1-1.x86_64
したら、
「installing package distcache-1.5.1-1.x86_64 needs 4KB on the /selinux filesystem」って出た。。

/selinux に4KB以上の容量必要。
ないの?
# du -h /selinux
ゼロ!!

selinux無効にしてるからかな。
# setenforce 1
# getenforce
 Enforcing
でやってみたけどだめだった。
戻す。
# setenforce 0

調べてみるとどうやら、checkinstallrcに以下を追加する。
EXCLUDE="/selinux" もしくはオプションをつける「--exclude=/selinux」 と
できるようになるらしい。

ここ、とかこことか。
特に2つ目の人は、ちゃんと自分で内容を理解しようと勤めている。

distcacheをインストールできた!


やっと、httpのインストール。
# rpm -Uvh httpd-2.2.21-1.x86_64.rpm httpd-devel-2.2.21-1.x86_64.rpm httpd-manual-2.2.21-1.x86_64.rpm mod_ssl-2.2.21-1.x86_64.rpm



ファイル /usr/share/man/man1/htdbm.1.gz (パッケージ httpd-2.2.21-1.x86_64 から) は、パッケージ httpd-tools-2.2.15-5.el6.centos.x86_64 からのファイルと競合しています。
ファイル /usr/share/man/man1/htdigest.1.gz (パッケージ httpd-2.2.21-1.x86_64 から) は、パッケージ httpd-tools-2.2.15-5.el6.centos.x86_64 からのファイルと競合しています。
ファイル /usr/share/man/man1/htpasswd.1.gz (パッケージ httpd-2.2.21-1.x86_64 から) は、パッケージ httpd-tools-2.2.15-5.el6.centos.x86_64 からのファイルと競合しています。

ふぅ。やになってきた。

manのページが、2-2-15では、httpd-tools-2.2.15からきているが、
2-2-21では(自分で入れたやり方では)、httpd-2.2.21-1.x85_64からきている模様。
manだしな。

httpd-tools-2.2.15を削除・・・。
いや、toolsにman以外も含まれているだろう。
探したらhttpd-tools-2.2.15のrpmあった。。
http-tools

# wget http://centos.alt.ru/repository/centos/6/x86_64/httpd-tools-2.2.21-2.el6.x86_64.rpm
# rpm -Uvh
   httpd-2.2.21-1.x86_64.rpm
   httpd-devel-2.2.21-1.x86_64.rpm
   httpd-manual-2.2.21-1.x86_64.rpm
   httpd-tools-2.2.21-2.el6.x86_64.rpm
   mod_ssl-2.2.21-1.x86_64.rpm



ファイル /usr/share/man/man1/htdbm.1.gz は httpd-tools-2.2.21-2.el6.x86_64 と httpd-2.2.21-1.x86_64 のインストールで競合しています。
ファイル /usr/share/man/man1/htdigest.1.gz は httpd-tools-2.2.21-2.el6.x86_64 と httpd-2.2.21-1.x86_64 のインストールで競合しています。
ファイル /usr/share/man/man1/htpasswd.1.gz は httpd-tools-2.2.21-2.el6.x86_64 と httpd-2.2.21-1.x86_64 のインストールで競合しています。

まぁそうでしょうね。
どうしますかね。。

依存関係を無視してインストール

# rpm -Uvh -–force -–nodepes (パッケージ)

やってみた。
--nodepesなんかしらないって言われた。

--forceだけでやってみた。
できた。

# httpd -v
Server version: Apache/2.2.21 (Unix)
Server built:   Oct  6 2011 18:06:22

お。

# /etc/init.d/httpd start
httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
                                                           [  OK  ]
おお。

Paymoで接続・・・、できた。

2011年10月2日日曜日

iframeでリファラが飛ばないようにする。

iframeを使った際、接続先にリファラが飛ばないようにする。
FireFoxやChromeではできたが、
IEではまだできてない。

iframeでsrc=http://to.com/index.htmlを参照したhtmlファイルを
読み込んだ場合。
1,htmlファイルが読み込まれ、ブラウザ上に配置される。
(他の画像やiframe内はまだ参照されない。)
2,途中にscriptタグが挿入されていた場合、
そのscriptを実行する。
3,htmlファイルが全て読み込まれたら、
他の画像やiframe内のURIを参照する。
4,window.onloadは、それらすべてが読み込まれ終わったら、
実行される。

この時、3番でhttp://to.com/index.htmlを参照しに行く時、
HTTPパケットにはRefererが付いている。
これを無くしたい。。


基本、ここのやり方でやった。
ここでやっているのは、
別のhtmlから改めてRiderectさせること。

違う部分は、
1、urlの取得、hrefの書き換えを、a.srcから行う。
2、window.onloadではなく、scriptタグで実行する。

window.onloadで実行すると、一度Refererつきで
http://to.com/index.htmlが参照された後、
もう一度Refererなしで参照される。
javascriptが実行されるタイミングの問題。
ここより。

どうやったらIEでもできるだろう。。