goo blog サービス終了のお知らせ 

役立たずのプログラマーブログ

自分の得た知識や経験をブログに書くことで整理し、考えをまとめることが目標

mod_perlをfedora8にインストールしてみた

2008-01-22 12:30:04 | Perl
ちゃんとしたドキュメントも見ないまま、ネットの解説ページを頼りに
Fedora8にてmod_perlをつかってCGIを動くようにしてみたが、
テストスクリプトが動くまで詰まったことをメモしておく。

[インストール]
yumで簡単にできた。#yum install mod_perl

[その一]
apacheのhttpd.confにApache::Registryと書くように説明があった。
yumで探してもperlモジュールがないのでうっかりcpan2rpmでインストールしかけた。
ModPerl::RegistryとかModPerl::PerlRun
という名前で存在していた。

[その二]
httpd.confにはdirectoryの設定を追加するだけでイケた。
LoadModuleなんかはしなくてよかった。
(どこでモジュールを呼んでいるのだろうか?)

[その三]
ファイルの指定の仕方が相対ディレクトリではダメになってた。
とりあえず絶対パスで指定してやったらイケた。
(ただ、ドキュメントを読めばやり方くらいは書いていると思う)

[その四]
スクリプトの属性で700で動いていたものが、704にしてotherにread権限をつけないと
動いてくれなくなった。
(ていうか700で動いていた理由の方がよく分からない。Apacheの勉強もせねば)

うごくまで一時間くらいかかった。
一度やってみたかっただけなので、早くなったかとかメモリ量がどうか等はテストしていない。

TopcoderでPython

2008-01-20 23:40:44 | プログラム
問題を開いたら、言語の選択のところにグレーアウトされたPythonの項目が有った。
Pythonって反則じゃね?
俺は練習しかやってないからいいけど。


PerlのDecoretor

2008-01-18 23:58:19 | Perl
http://module.jp/works.htmlのデザインパターンに関する記事をよんでいたら、
PerlのDecoretorが載っていた。
なんか、C++のそれと全然違っていたのに驚いた。
C++とかは、
      Component
          │
    ┌─────┴─────────┐
Concrete         Decorator
Component           │
                    │
              ┌─────┴─────┐
           Concrete    Concrete
          Decorator1   Decorator2

しかし、PerlではAUTOLOADがあるから、
Componentにてインターフェイスを一致させる必要がないため、
ちょいとラップして委譲しただけみたいなかんじだった。

TopCoderのローカルテスト用スクリプト for linux C++ その2

2008-01-17 12:30:06 | プログラム
TopCoderの問題を練習に使っているんだけど、ものすごく詰まったときに、
サーバー上でやってるとなんか色々とムズムズする。
なのでだいぶ前にローカルでmakeしてテストするためのファイルを一式作るスクリプトを書いた。
んが、非常に使いにくい。なので修正した。

注意としては、autoconfやらautomakeやらcppunitのdevelとかが要ります。
あとlinuxかつC++でないとダメ。

-- 使い方 ---
以下のスクリプトをコピーしてmaketest.shとでもして保存。
topcoderのローカルファイルがあるディレクトリ内で、

$./maketest.sh filename.cpp

としてやると、filenameというディレクトリを作り、色々とファイルを作って、
automakeやらやって、./configureとmakeまでやります。
filename_test.cppにテストケースを書きます。

$cd filename;./filename_test

でテスト開始。

今度は↓をコピペして動くことを確認済(以前のはしてなかった!)
#!/bin/sh

if [ ! -e "$1" ]
then
    echo "ファイル$1が存在しません"
    echo "存在するファイル名を指定してください"
    exit 1
fi

filename=`basename $1`
filename=${filename%.cpp}
tmpconfig=configure.tmp


if [ ! -d "$filename" ]
then
    echo "$filename ディレクトリ作成"
    mkdir $filename
fi

cd $filename
touch NEWS
touch README
touch COPYING
touch AUTHORS
touch INSTALL
touch ChangeLog

testcpp=${filename}"_test.cpp"
testhead=${filename}"_test.h"

if [ ! -e "$testcpp" ]
then
echo "#include \"$testhead\"" > $testcpp
echo "#include <sys/time.h>" >> $testcpp
echo "void ${filename}_test::test_ex0()" >> $testcpp
echo "{" >> $testcpp
echo "	struct timeval t1;" >> $testcpp
echo "	gettimeofday(&t1, NULL);" >> $testcpp
echo "	struct timeval t2;" >> $testcpp
echo "" >> $testcpp
echo "	${filename} M;" >> $testcpp
echo "	// implement from here" >> $testcpp
echo "" >> $testcpp
echo "	gettimeofday(&t2, NULL);" >> $testcpp
echo "	double diff =   t2.tv_sec + (double)t2.tv_usec*1e-6" >> $testcpp
echo "			- ( t1.tv_sec + (double)t1.tv_usec*1e-6 );" >> $testcpp
echo "	cout << \"time=\" << diff << endl;" >> $testcpp
echo "//	CPPUNIT_ASSERT_EQUAL(,);" >> $testcpp
echo "//	CPPUNIT_ASSERT_THROW( ?=?, type);" >> $testcpp
echo "}" >> $testcpp
echo "" >> $testcpp
echo "int main(int argc, char* argv[])" >> $testcpp
echo "{" >> $testcpp
echo "	CppUnit::TestSuite *suite = ${filename}_test::suite();" >> $testcpp
echo "	CppUnit::TextUi::TestRunner runner;" >> $testcpp
echo "	runner.addTest(suite);" >> $testcpp
echo "	bool retcode = runner.run();" >> $testcpp
echo "	return retcode;" >> $testcpp
echo "}">> $testcpp
fi

if [ ! -e "$testhead" ]
then
cat > $testhead <<EOF
#ifndef `echo $filename | tr 'a-z' 'A-Z'`_H
#define `echo $filename | tr 'a-z' 'A-Z'`_H

#include "../${filename}.cpp"

#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/TestAssert.h>

/* テストクラスは TestCase を継承する。 */
class ${filename}_test:public CppUnit::TestFixture {
	CPPUNIT_TEST_SUITE( ${filename}_test );
	CPPUNIT_TEST( test_ex0 );
//	CPPUNIT_TEST( );
	CPPUNIT_TEST_SUITE_END();
public:
    ${filename}_test(){}
    /* テストは testXXX という名前にする。 */
    void test_ex0();
    void setUp(){}
    void tearDown(){}
};
#endif
EOF
fi

autoscan
if [ ! -e "configure.in" ]
then
    mv configure.scan configure.in
fi

#####################################
##  make.am
#####################################
cat > Makefile.am <<EOF
TESTS = ${filename}_test

INCLUDES = -I\$(top_srcdir) -I\$(includedir)
# bin_PROGRAMS = ${filename}_test
noinst_PROGRAMS = ${filename}_test

${filename}_test_SOURCES=\\
	${filename}_test.cpp\\
	${filename}_test.h
#	../${filename}.cpp\

${filename}_test_CPPFLAGS = -Wall -g
${filename}_test_LDFLAGS = -L\$(libdir) -g -Wall
${filename}_test_LDADD = -lcppunit -ldl
EOF

#####################################
##  add some line to Configure.in
#####################################
if grep "AM_INIT_AUTOMAKE" ./configure.in > /dev/null
then
    echo "既にconfigure.in書き換え済み"
else
    if [ -e $tmpconfig ] 
    then
	unlink $tmpconfig
    fi

    cat ./configure.in | 
    sed -e "s=\(AC_CONFIG_HEADER.*\)=\1\nAM_INIT_AUTOMAKE( ${filename}\.cpp, 0\.1 )\n=" |
    sed -e 's=\(AC_OUTPUT\)=AC_CONFIG_FILES([Makefile])\n\1=' > $tmpconfig

    mv $tmpconfig configure.in
fi

aclocal
autoheader
automake -a -c
autoconf
./configure
make clean all



大したことはしてないんだけども、なんか二時間ぐらいかかった。
手直ししたいところも有るけど、もうこれ以上は時間かけたくないので止め。

C++でsplit関数

2008-01-15 21:36:10 | プログラム
C++のsplit関数はデフォルトではないので、
作るか、boostのものを使うかってことになる。

SnapDragonさんのsplit関数。たしかこんなんだったと思う。
C++クックブックのものよりもずっとイカス。
typedef vector<string> VS;
VS split( string s, string c )
{
	VS ret;
	for( int i=0, n; i <= s.length(); i=n+1 ){
n = s.find_first_of( c, i ); if( n == string::npos ) n = s.length(); string tmp = s.substr( i, n-i ); ret.push_back(tmp); } return ret; }

boostを使うと
#include <boost/algorithm/string.hpp>
string str1("hello abc-*-ABC-*-aBc goodbye");
vector<string> SplitVec;
split( SplitVec, str1, is_any_of("-*") ); // SplitVec == { "hello abc","ABC","aBc goodbye" }

is_any_ofは関数テンプレート。引数が区切り文字ならtrueを返す。

ネットでググったら出てきたsplitのしかた。
スペース区切りのものならこれでいいかも。
string Str = "alex delia john";
std::istringstream iss( Str );
std::vector<string> vec( (std::istream_iterator<string>(iss)),
                          std::istream_iterator<string>() );

vector<string> vec( begin, end)ってことで一つ。

<>が消えていたので修正。

拡張子daa

2008-01-15 19:44:24 | Linux
拡張子daaは、powrIsoにてisoにconvertできる。
poweriso.comにて、powerIso for linuxを入手したら、解凍すると実行ファイルを得るので、
$poweriso convert /home/user/mydisc.daa -o /home/user/filename.iso -ot iso

Hibernate

2008-01-12 10:47:55 | Java
何ヶ月か前に、「軽快なJava」を流し読みしていたら、
J2EEを批判していてもっと軽くて開発者にやさしいSpringとかHibernateを使えと
いうようなことがかかれていた。
ちょっとそれを思い出したので、Hibernateで遊んでみることにした。
@ITの記事を読みながら試してみたがHibernateのバージョンが違うので、
そのままでは動かないものいくつかあったのでメモしておく。

・サードパーティライブラリのコピー
 公式サイトのDocumentとかfindを駆使してなんとかクリアした。結局この辺をコピーした。
antlr.jar
asm.jar
asm-attrs.jars
cglib.jar
commons-collections.jar
commons-logging.jar
dom4j.jar
hibernate3.jar
jta.jar
log4j.jar( propertiesは/hibernate_home/etc/にあった )
mysql-connector-java.jar

・接続定義ファイルのDTDバージョンを/hibernate-mapping-3.0にした
・importのクラス名をorg.hibernateにした
・mysqlのテーブル定義でEMPテーブルは主キーをEMPNOのみにした。(誤記かな?)
・session.find→createQuery("FROM WorkGroup").list();
・XMLファイル内のコメントは消す。改行もちゃんとしておく。
・hibernate.cfg.xmlにMemberとWorkGroupも忘れずに入れる。
・ラウンドトリップジェネレート(hbm2javaとか)はHibernate toolとして、
Eclipseプラグインにて操作可能。インストール後、
Run->Hibernate Code Generation->Open Hibernate Code Generation Dialog
でDialogが開くので、なんとか適当に操作してみる。

バージョンが2.0→3.0になった割にはスムーズに動いた。

バージョン管理システムArch

2008-01-11 22:34:17 | Linux
GNU Software.からソースの開発版を頂こうと思ったが、
そのソースではなんかArchっていうバージョン管理システムになっていて、
ちょっとビックリした。
とりあえずFedora8にインストールしようとしたが、
検索にたくさん引っかかりまくるしよく分からん状態になった。
結局「tla」で検索したらようやく出てきた。
忘れそうなのでメモしておく。

CVSとかsubversionではないのがあるんだと初めて知った。
GNU関係のツールやライブラリは本当に色々あるなぁ。
勉強しないと。

mdk-1.2.3でコンパイルエラー

2008-01-11 22:25:25 | Linux
linux入れ替え以来、やってなかったTAOCPをやろうと
$gmixvm
と叩くも、mixシミュレータが立ち上がらない。
確か、mdkはコンパイルしてインストールしたはずだったので、
不審に思いながら調べたところ、ライブラリが足りない場合、
GUI部分コンパイルしないようなので、DocumentをみながらGTK+-develとかをいれて再コンパイルした。
これでTAOCPができるな、と思っていたらなんかエラーが出た。
mixgtk_mixvm.c: In function ‘mixgtk_mixvm_init’:
mixgtk_mixvm.c:73: error: ‘tips_’ undeclared (first use in this function)
mixgtk_mixvm.c:73: error: (Each undeclared identifier is reported only once
mixgtk_mixvm.c:73: error: for each function it appears in.)
mixgtk_mixvm.c:73: 警告: implicit declaration of function ‘gtk_tooltips_new’
mixgtk_mixvm.c: In function ‘update_register_’:
mixgtk_mixvm.c:410: 警告: implicit declaration of function ‘gtk_tooltips_set_tip’
mixgtk_mixvm.c:410: error: ‘tips_’ undeclared (first use in this function)
m

調べてみるとGTK+が新しくなったので、tooltipの関数がなくなったらしい。
tooltipなんかいらないので、エラー行だけコメントアウトしたらコンパイルできた。
とりあえず実行もできたので、多分大丈夫だろう。

Xineはあきらめた

2008-01-10 19:08:04 | Linux
xineのフロントエンドのkaffeineを以前使っていたので、
fedora8もそうするつもりでインストールした。
しかし、dmixerが見つからないなどと表示されてmp3ファイルが再生できない。
dmix自体の意味も知らない上に、fedora8ではpulseAudioなるものが
導入されたとかいう情報もあって正直無理な気がしたが一応調べることにした。

dmixはどうやらAlsaのデフォルトでインストールされているプラグインで、
複数の音声入力ほまとめるとかなんとからしいけど、
どうにもよく分からない部分が多い。
色々調べたが、とりあえず見切りをつけて、xmmsに乗り換えることにした。

#yum --enablerepo=livna install xmms xmms-mp3

えらくあっさりと再生された。しかもかっこいい。うーむ。
まあ、dmixやpulseaudioについてはまた今度調べてみるようにしよう。

追記:なぜか再生できなくなったが、オプション->設定->出力プラグインをOSS ドライバにしたら、
再生できるようになった。Mplayerと同じだな。