第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月を楽しみにしています。