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

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

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

エンジニアのための時間管理術を読んだ。

2008-07-06 00:30:34 | プログラム
 もう一年半以上まえに出た本だけど、
オライリーのエンジニアのための時間管理術を買って読んだ。

 夜の三時ぐらいまで、漫画とかライトノベルを読んで
八時二十分に起床して、風呂に入って出社というのを一週間ほど続けたときに
やたら眠い上に、朝日がまぶしくて非常につらかったので、
これはいい加減にしなければと思い、仕事終わりに本屋に行った。

 プログラム書のコーナーのあたりで、生活を立て直す本を探したが
役立ちそうな本があまりなく、唯一これが近い気がしたので購入した。
 ちょっと探すべきコーナーがよくなかった気がするが、
俺はプログラマーなので仕方が無い。とにかくそういった経緯で購入した。

 原書タイトルはTime Management for System Administratorsとなっていて、
著者はシステム管理者向けで、プログラマ向けじゃないとわざわざ書いていてくれた。
 ありがとう。
 元々都合の悪い内容だったら無視する気でいたし、と過去を無理矢理改ざんして、
どーせ俺にはかんけーねーんだろーとひねくれながらも全部読んだ。

 とりあえず一部とりいれて、作業リストを作って「仕事で」使い始めた。
こんなかんじでテキストに書いている。
-----------------------------------------------------
7/2(日)
スタック
A. 二時間ほど  初期処理の仕様変更対応
C. 一時間    リストア処理の不具合修正
C. 二時間    時刻⇔シリアル秒変換ツール/履歴一覧出力ツール作成   

完了
C. 一時間    makefileを修正して、スタック破壊検知するように。→完了
-----------------------------------------------------
 やる作業について優先順位(A.B.Cのみ)とかかりそうな時間を毎朝書くだけ。
完了したら、完了のところに移動させるてる。
残ったやつはそのまま次の日へ行く。

 今のプロジェクトが全然管理体制が無いこともあってか、
結構効果がでて、仕事の優先順位をある程度意識しつつ作業できるようになった。

 ただ、仕事以外の生活は漫画を読んだりする時間が増えただけだったり。
 そういや著者が、そうならないでねと警告してたなぁ。
 でも俺、システム管理者じゃないし、プログラマーだし、かんけーねーし。
知るかってんだ。ふん。

2枚目ゲット

2008-03-15 14:06:22 | プログラム
 一月頃、「The Art Of Computer Programming VOL.1」のある箇所について、
誤訳か誤記ではないかと、アスキーに問い合わせをした。

つい先日回答があり、結局のところ、誤記ではなく「俺の考え不足」だっただけだった。
ただ、指摘した箇所がメモリを無駄遣いしていたとのことで、$2.56の小切手をMr.Knuthにもらえた。
んだけども、俺の指摘は間違いだったため、嬉しいというより、むしろ恥ずかしい。


今回も、監訳者の方に中継して頂いた。
小切手とともに
「元のコードでもデバック時のことを考えるとあながち間違いではない」
というような趣旨のメモが入っていた。
小切手とダブルパンチで余計に恥ずかしかった。
次からはもっと考えたり試したりしてから問い合わせします。
すみません。

TopcoderでPython

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


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)ってことで一つ。

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