第3回sapporo.cppに参加してきました
第3回sapporo.cppに参加してきました。
来たれBoost.勉強会に向けて、Boostの紹介・簡単な扱い方について、
ハンズオンできるということなので、同日開催の札幌セキュリティ勉強会は見送りました。
まず、「事前にBoostをPCに入れてきてね!」
とのことでしたので、Boost C++ Libraries - Browse /boost/1.47.0 at SourceForge.netから
Boostの最新版(tar.gz)を落としてきました。
それから、適当なフォルダで解凍します。
$ tar zxvf boost_1_47_0.tar.gz $ cd boost_1_47_0
README的なものが、HTMLなので、それを見つつインスコします。
$ ./bootstrap.sh --prefix=/usr/local/boost $ sudo ./b2 install
でインストールしました。
コンパイルしなくてもある程度はBoostは使えるらしいので、
実際、「sudo ./b2 install --with-
なので、上記の方法でインスコする場合は暇な時にやってください、
MBAでコンパイルしたときに、30分ぐらいファン全開で動いてました。
次に、ソースのコンパイル。
勉強会参加の皆々様はg++を叩いてコンパイルしてましたが、
うちは面倒なのでMakefile作ってコンパイルしてました。
CXX = g++ CXXFLAGS = -g LDFLAGS = INCLUDES = -I. -I/usr/local/boost/include/ LIBS = -L/usr/local/boost/lib TARGET = problem4 SRCS = problem4.cpp OBJS = $(SRCS:.cpp=.o) all: $(TARGET) clean: -rm $(TARGET) $(OBJS) $(TARGET): $(OBJS) $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) .cpp.o: $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
こんな感じのMakefile作ってました。
さて、勉強会の方ですが、前半は@hotwatermorning さんによるBoostライブラリの解説。
後半は赤チームと青チームに別れて、お題をBoostで解いていこうというもの。
名付けて(?)、“秋の「それ、Boostで書けるよ」祭り 2011”
後半のお題をとく際に色々と注意事項があったんですが、
Better Cとしか使ってなかった自分にとって、ペナルティ対象のオンパレードでした。
例:
- 「using namespace std; はだめよ?」
- 「生配列、生ポインタはなるべく使っちゃだめよ?」
- 「Cのヘッダーはなるべく
とか使いましょう」
そして、C++自体が久々の自分。「::」打つのすら煩わしく感じるほどにC++を使ってない。
そんな中で自分の担当したのが、「tailコマンドの実装」でした。
#include<iostream> #include<fstream> #include<vector> #include<string> void tail_2(const std::string filename, int display_num) { std::ifstream ifs(filename.c_str(), std::ios::in); std::vector<std::string> lines; std::string line; int end_byte = 2; int crlf_count = 0; int crlf = static_cast<int>('\n'); char c; ifs.seekg(-end_byte, std::ios::end); while (crlf_count < display_num) { ifs.get(c); if (c == crlf) { crlf_count++; } ifs.seekg(-(++end_byte), std::ios::end); } ifs.seekg(-end_byte+2, std::ios::end); while(getline(ifs, line)) { std::cout << line << std::endl; } ifs.close(); } void tail(const std::string filename, int display_num) { std::ifstream ifs(filename.c_str(), std::ios::in); std::vector<std::string> lines; std::string line; while(getline(ifs, line)) { lines.push_back(line); } ifs.close(); std::vector<std::string>::iterator it = (lines.begin() + (lines.size() - display_num)); for (;it != lines.end(); ++it) { std::cout << it->c_str() << std::endl; } } int main(int argc, char *argv[]) { tail("test_tail", 5); std::cout << "============" << std::endl; tail("test_tail", 6); std::cout << "============" << std::endl; tail_2("test_tail", 7); std::cout << "============" << std::endl; tail_2("test_tail", 8); return 0; }
tail関数は一度全部読み込んで、後ろから指定された行数表示する。
tail_2関数は後ろから改行コードの数を数えて、指定された行数表示する。
どう見てもboost使ってません、本当に(ry
他の課題を担当した人たちはきっちりBoost使ってまして、
自分のソースに埋め込むとすれば、Boost.Assignとか使えばよかったなぁと。
懇親会は今回家族との先約があったので辞退しましたが、
濃ゆい話を聞きたかったなぁ・・・と後悔してます。
そして、闇の軍団に会える11月を楽しみにしています。