Apache2.4.4をソースから導入するときのメモ

Apache2.4.4をソースから入れる機会があって色々と躓いたのでメモ。

作業の大まかな流れとしては

という感じでおこなった。

まずは以下の場所からソースコードをダウンロードし展開する。

wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.4.tar.gz
tar xfvz httpd-2.4.4.tar.gz

次にMAKEFILEを生成するために

./configure

としたところ

apache2 apr not found

というエラーが出た。
そこで

cd httpd-2.4.4/srclib
wget http://ftp.riken.jp/net/apache//apr/apr-util-1.5.2.tar.gz
wget http://ftp.riken.jp/net/apache//apr/apr-1.4.6.tar.gz

としてダウンロード。

tar xfvz apr-1.4.6.tar.gz
tar xfvz apr-util-1.5.2.tar.gz 
mv apr-1.4.6 apr
mv apr-util-1.5.2 apr-util

としてそれを展開してそれぞれaprとapr-utilとリネーム。
その後ふたたびapacheのディレクトリに戻り

./configure

これでうまくいくかとおもいきや今度は

pcre-config for libpcre not found

というエラーが出るので

wget "http://sourceforge.jp/frs/g_redir.php?m=jaist&f=%2Fpcre%2Fpcre%2F8.32%2Fpcre-8.32.tar.gz"
tar xvzf pcre-8.32.tar.gz
cd pcre-8.32
./configure
make
make install

としてPCREを導入した。
ここで気をつけなくてはいけないのは""で囲むこと。そうじゃないとうまくDLされない...

その後apacheのディレクトリにはいり再び

./configure

とすると
うまく通ったので

make
make install

Apacheをインストールした。

次にapacheを起動するため

/usr/local/apache2/bin/apachectl start

すると

AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using fe80::1155:696f:bc0c:6ebd. Set the 'ServerName' directive globally to suppress this message

というエラーがでたので

vi /usr/local/apache2/conf/httpd.conf

ServerName <サーバのIPAdress>:80

という行を追加。
これでエラーはでなくなったが、リモートのブラウザからはアクセスできない。
そこできちんと動いているか確認するためサーバ側で

wget http://<サーバのIPAdress>

とするとindex.htmlが正常にダウンロードされる。
ここでしばらくなやんが、
色々と調べた結果80番のポートが開放されていないようなので

/etc/sysconfig/iptables

を見てみるとたしかに80番のポートが開放されていない。(逆に最初から開放されていても怖いが、いままでクライアントとして使ってなかったので全然意識してなかった)
そこで

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

という行を追記し、

/etc/init.d/iptables restart
/usr/local/apache2/bin/apachectl restart

によって再起動をかけてクライアントのブラウザからアクセスすると「It Works!」という表示が見ることができた。

Oauth認証で非常につまらないところで躓いた話(Oauthとタイムスタンプ)

昨日からふと思いたちPythonのtweepyを使ってtwitterで色々と遊んでる。そのときStreamingAPI使うと常に401が帰ってきてしまった。どうやら認証で弾かれているらしいということなのだが...tweepyのソース読んだり、色々と調べてみたが解決しない。いっそのこと自分で実装するか?とか考え始めた時ふとPCの時計に目をやると時刻がずれている...もしや?と思い直して試してみるとすんなり動いてしまった。こんなくだらないことだったとは...とはいえ私みたいに躓いて悩む人がいるかもしれないので一応メモとして残しておく。
 ちなみにしらべてみるとOauthで送られる情報には時刻(タイムスタンプ)が含まれていて一定以上のずれがあるとはじかれる模様。ライブラリ使うとしても完全にブラックボックスで使うのは良くないですね。

TideSDKをdebianに導入してみた

PythonGUIを手軽に扱えるものないかな?と探していてTideSDK(前Titanium Desktop)を見つけました。wxPythonとかPyQtとかも考えたんですが、なんかなーってのがあり。TideSDKはhtml5+css+jsとあとPython,PHP,Rubyあたりを組み合わせてマルチプラットフォームなDesktopアプリケーションが作れるみたいです。これならわりと書きやすそうだなと思い導入してみることにしました。

まずはここ(www.tidesdk.org/)からSDKと開発ツールをDLします。SDKのほうはユーザのhomeディレクトリに.tidesdkという隠しフォルダを作りそこにSDKを展開して出てきたフォルダを突っ込みます。
次に開発ツール。こちらも展開して出てきたTideSDK Developerを実行すればいいだけ...のはずだったのですが、debian(wheezy)だといくつかの依存関係を満たせていないようで途中でエラーが出てしましました。
まず、libcurl.so.4がないと怒られます。
そこで
sudo aptitude install libcurl3-dev
をいれると進む。
が、こんどはlibjpeg62がないと怒られました。
sudo aptitude install libjpeg62-dev
としていれてあげるとうまく動きました。

死んだPCからThunderbirdのメールデータを救出する

3月のはじめあたりからPCがしんでまして。大体のデータはバックアップとっていたのでそんなに問題なく生活できているのですが、今日大事なメールが死んだPCないにあることが判明...しかもサーバから消す設定にしてしまっていたのでそこにしかない状態という...
弟のPCをかりThunderbirdを入れて設定してみるとどうやらデフォルトでは「Documents and Settings\<ユーザ>\Application Data\Thunderbird\Profiles\」にある英数字.defaltというフォルダがメールフォルダにあたるよう。そこでとりあえず死んだPCのHDDつなぎフォルダごとコピー。なんか名前が違いますが、中身は共通してそうなので中身をコピーしたらうまくメールがみれました。めでたし。めでたし。

サイトで数式を書くのにMathJaxが便利

前から書く書く言っていた物理数学のサイトを書き始めた。
その時に当然数式を書くわけだが、いいツールがないか探していた
ときに見つけたのがMathJaX。特にサーバにcgiおいてということもなくjsファイルを読み込むだけで使える。
また、完全にTeXの書き方でhtml内に数式を入れられるので便利。
しかもわりと綺麗に出力される。
サイトの数式どうしようか困っている方は導入してみては?
http://www.mathjax.org/

C++での継承とオーバーロードの名前解決の問題

以下の様なプログラムを書いたのだがなぜかオーバーロードがうまくいかない...

#include<iostream>

class Hoge{
public:
	void func(){
		std::cout <<"パラメータなし"<<std::endl;
	}

};

class Foo : public Hoge{
public:
	void func(int a){
		std::cout <<"パラメータあり 値:"<< a <<std::endl;
	}


};


int main(){

	Foo obj;
	obj.func();//エラー


}

ちょっと悩んでしまった。そういえばと思いだしExceptional C++を引っ張りだしてみるとあった。どうやらpublic継承でも隠蔽されてしまいオーバーローされないっぽい。どうしてもこれをしたい場合解決方法としてはusingとして関数を持ち込んでやる、つまり

class Foo : public Hoge{
public:
        //これを入れる
	using Hoge::func;

	void func(int a){
		std::cout <<"パラメータあり 値:"<< a <<std::endl;
	}


};

としてやることでうまくオーバーロードがなされる。

一見あれな仕様だが、

#include<iostream>
#include<string>

class Hoge{
public:
	void func(const char*){
		std::cout <<"継承元のメソッド"<<std::endl;
	}

};

class Foo : public Hoge{
public:

	void func(std::string){
		std::cout << "呼びたいメソッド" <<std::endl;
	}


};


int main(){

	Foo obj;
	obj.func("hoge");


}

この実行結果は「呼びたいメソッド」と出力される。
一方using宣言を用い継承元のほうにあってもオーバーロードされるようにしてしまうと

#include<iostream>
#include<string>

class Hoge{
public:
	void func(const char*){
		std::cout <<"継承元のメソッド"<<std::endl;
	}

};

class Foo : public Hoge{
public:

	using Hoge::func;

	void func(std::string){
		std::cout << "呼びたいメソッド" <<std::endl;
	}


};


int main(){

	Foo obj;
	obj.func("hoge");


}

実行すると「継承元のメソッド」と出力される。これはたぶん予期しない動作だろう。この例の場合一階層しかないのでいいが、これが言語仕様で保証されてるとするとかなり深い継承関係(そんなことはするべきでないという話はおいておいて)完全に一致する呼びたくないメソッドが呼ばれてしまい混乱してしまうだろう(たぶんそしてコンパイルエラーはでない)それなら、オーバーロードされず呼び出せないとコンパイルエラーを吐いてくれたほうが嬉しい気がする。

まだまだC++について全然理解してない...こういう細かい所でハマるのは無くしたい

Pythonでの代入について(変更不可能なTupleに代入できる?)

以下のコードでなにが出力されるだろうか?

a = (1, 2)
a = (3, 4)
print a

そもそもTupleは変更できないのでエラーを吐くのでは?とかおもってしまうが、ちゃんと代入できるし(3, 4)のほうが出力される。一方

a = (1, 2)
a[1] = 3
print a

のようなコードを書くとエラーが出る。この違いは一体なんだろうか?
Pythonの代入はオブジェクト(値)を変数に入れるというのではなくオブジェクトの参照を変数に入れている。だから、最初の例では参照先を取り替えただけでTupleの実体には一切触っていないので合法というわけ。図にしてみると
f:id:ikaro1192:20130226193001p:plain
のように参照を点線から実線に変更しても参照先の値はどこも変わってないから、Tupleは変更された事にはならず、aに束縛されているものだけが変更されるというわけだ。

参照だと勝手にインタプリタ側でされてしまってイメージがわきにくいと思う(のは私だけ?)のでC++でポインタを使って同じようなことを再現しようとすると以下のようになる。

const Tuple* a;

これでいくと

const Tuple* a = obj1;
a = &obj2;

とするのは合法だが、

const Tuple* a = &obj1;
//a[1]と同値
*(a+1) = 3;

みたいにするとエラーとなるのがわかりやすいと思う。

ちなみにTupleもオブジェクトの参照を持っていてその参照が変更できないということなので、Tupleの要素としてリストをもたせることもできそれは変更できる。

a = ([1,2], 2)
a[0][0] = 3 
print a