メモの日々


2002年02月15日(金) 遅刻しなかった日

会社

  • 9:05 今日は早いぜ。
  • 9:40 Windows2000のSRP1とMS02-005がWindowsUpdateに上がっていたのでインストールした。2回再起動する羽目に。でも思ったよりは時間かからなくてほっ。
  • 20:35 なんか今日ははかどってる。格付けが国による絞込みをしなければならないことに気付きそれを実装できたところ。うれしーなー。わははははは。
  • 22:35 謎なバグに悩まされ中。記入画面の2ページ目から1ページ目に遷移するとおかしくなるのだ。わからん。
  • 23:45 帰らないと!

テレビ/本

  • ヘイヘイヘイ(録画)。これもかなり古いやつをやっと。ミニモニミスターチルドレン松浦亜弥スキャンティフレイム。サトエリ最高ってところが面白かった。松浦亜弥さん96点。
  • WEB+DB PRESS vol6。Perlでセッション管理などをするところ。Perlには興味がないけどさ。

2003年02月15日(土)

生活

  • 電話とPCとモデムを同時に使うため、テーブルタップを購入。

[soft] FaEditのページ

フリーのブックマーク管理ソフトをメモ。Vectorのレビューより。こういうの色々あるだろうな。

[soft] ちょこっとソース・ビューワー

IEでページの一部分だけのソースを見れるツール。これまたVectorのレビューより。便利そうな気がする。Vector見だすと色々使ってみたくなる。


2006年02月15日(水)

  • 今日は暑い。

[db] MySQL(4.0.26)が起動しなくなった

my.cnfにInnoDBに関する設定項目を追加したら起動しなくなってしまった。エラーログを見ると

InnoDB: Error: log file /xxxx/ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 67108864 bytes!

とあり、ib_logfile0というファイルのサイズがmy.cnfにある設定値と異なるので起動できないようだ。設定値を変えたのだからサイズが違うのは当たり前だ。

新しい設定値を反映させる方法があるのかと思って調べたが分からなかった。InnoDBのログファイルのサイズは途中で変えることができないのだろうか。

MySQLのフォーラムに同じようなエラーへの回答があって、

Just delete the files that it says are a different size. MySQL will recreate them for you with the proper size (from my.cnf) the next time you start it.

とあった。どうせデータは空なので、試しにib_logfile0を削除してみた。すると、ib_logfile0は自動的に作成されたが今度はib_logfile1のサイズが違うというエラーになった。そこでib_logfile1も削除してみたがib_logfile1は自動的に正しく作成されない(サイズが0になってしまう)ようで、やはりMySQLの起動ができない。

で、ib_logfile0とib_logfile1の両方を削除してみると、それぞれ自動的に作成され、MySQLが起動できるようになった。

これが正しい対処方法なのかは分からない。

(追記)

マニュアルのInnoDB データファイルとログファイルの追加と削除に、

InnoDB ログファイルの数またはサイズを変更する場合は、MySQL をシャットダウンし、エラーなくシャットダウンすることを確認する必要があります。 その後に、シャットダウンで問題が発生した場合に備えて、古いログファイルを安全な場所にコピーします。これらはデータベースをリカバリする際に必要となります。古いログファイルをログファイルディレクトリから削除し、my.cnf を編集してから MySQL を再び起動します。起動時に、InnoDB から新しいログファイルを作成していることが通知されます。

とあるので、上の対処法で正しそう。

[dev] 「テストで手を抜く」 (steps to phantasien)

ユニットテストの話。参考になる。

もう少し手抜きをして楽に自動テストをする方法をいくつか紹介しておく. 以下に示す方法の自動テストは完全な単体テストより品質は劣るものの, 開発者レベルのテストが何もない状態よりはだいぶましになる.

やること

  • 決算
  • カレンダーを買う

2008年02月15日(金)

  • Javaの仕事はもうすぐ終わる。次はC++の予定。
  • だったが、Cの仕事が割り込みそう。Cかー。
  • 国民年金基金は継続する予定だったが、考え直して脱退する予定。引っ越しは数少ない脱退のチャンス!
  • メモしたいことは色々あるが、メモするための時間がない。

[java] EclipseでdjUnitを使う

JUnit実行時のカバレッジを取りたい。検索すると、djUnitが便利そうだった。

djUnitは、JCoverageを利用し、実行されたテストのカバレッジレポートを生成し、Eclipse上で確認できるようにします。

Eclipse 3.3.1.1 に djUnit 0.8.3 をインストールしたが、少し困ったのでメモ。

設定画面が表示されない

説明を読むと設定画面があるみたいなんだけど、[ウィンドウ]->[設定]で出るダイアログに出てこない。

む、説明をよく読むと、プロジェクトのプロパティに出てくるのか。ああ、出てきた。解決。

ディレクトリ単位で実行できない

テストクラスを右クリックして[実行]を選ぶとdjUnitで実行するためのメニューがあるので実行できる。

けれど、テストクラスを含むディレクトリを右クリックして[実行]を選んでも、djUnitで実行するためのメニューが無く実行できない。これではテストをまとめて実行できず困る。

次のようにやればいいみたい。テストクラスを含むディレクトリを右クリックして[実行]->[実行ダイアログを開く]を選び、実行ダイアログを開く。左のツリーをよく見るとdjUnitがあるじゃん。それを選択し、上にある「新規の起動構成」をクリックする。すると、右のペインで「選択されたプロジェクト、パッケージ、またはソース・フォルダー内のすべてのテストを実行」が選択されているからこのまま「実行」ボタンをクリックしちゃえばOK。djUnitというよりEclipseの使い方の問題だ。

使ってみた

ら、カバレッジ率80%くらいになった。意外とカバーできてるな。ほんとかいな。

[life] 「国民健康保険料過誤納金還付通知書」が来た

引越し前の自治体から送られてきた。おお、いくら戻ってくるのかと中を見ると、還付金は140円だそうな。えー。

んで、なぜ過誤納金となったのかはどこにも書いておらず分からない。引越しと関係あるのかな?

やること

  • クレジットカード
  • 銀行
  • 新税務署
  • 移転のお知らせ
  • ダンボール
  • 水道料金
  • 確定拠出型年金(郵送)
  • M(郵送)

待機中

  • 火災保険の申し込み(振込用紙待ち)
  • E(書類待ち)
  • 新国民年金基金(書類待ち)
  • 旧国民年金基金(書類待ち)

2018年02月15日(木)

[c++] C++で日本語を扱う

C++での日本語の扱い方をよくわかっていなかったのでメモ。

言語処理100本ノックにある次の問題をC++14で解いてみる。

01. 「パタトクカシーー」

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

std::wstringを使ってみる

std::stringから日本語のようなマルチバイト文字列のn文字目を取り出すのは簡単ではない。ここはstd::wstringの出番か。

#include <iostream>
#include <numeric>
#include <string>

// sからindexesで指定された位置の文字を繋いだ文字列を返す。
std::wstring select(
    const std::wstring& s,
    std::initializer_list<std::size_t> indexes)
{
  return std::accumulate(
      indexes.begin(),
      indexes.end(),
      std::wstring{},
      [&s](auto& result, auto i) { return result + s.at(i); });
}

int main()
{
  std::ios_base::sync_with_stdio(false);
  std::wcout.imbue(std::locale(""));
  std::wcout << select(L"パタトクカシーー", {1, 3, 5, 7}) << std::endl;
}
  • wstring::at()を使えばn文字目を簡単に取り出すことができる。
  • wstringをそのまま出力するにはstd::wcoutを使う必要がある。
  • しかし、wcoutをそのまま使っても正しく出力されない。basic_ios::imbue()を呼び出してストリームにロケールを設定しなければならない。
  • ロケールを設定するだけではまた正しく出力されない。ios_base::sync_with_stdio()を呼び出してCの標準入出力関数との同期をオフにする必要があった。
  • なお、sync_with_stdio()とimbue()呼び出しの代わりにstd::setlocale()を呼び出す手もある。

std::stringだけで処理する

wstringは一見お手軽なのだけれど、外部とのやり取りが発生すると面倒なことになりそうなのでなるべく使いたくない。std::stringだけで処理するにはどうするか。

マルチバイト文字列から1文字を取り出すには<cstdlib>にあるstd::mblen()が使えそう。これを使うと、長くなるけど次のように実装できる。

#include <cstdlib>
#include <iostream>
#include <iterator>
#include <numeric>
#include <stdexcept>
#include <string>

// マルチバイト文字列sのindex番目のマルチバイト文字を表す文字列を返す。
std::string get_mb_char(const std::string& s, std::size_t index)
{
  auto first = s.begin();
  std::size_t len = 0;
  for (std::size_t i = 0; i <= index; ++i) {
    first += len;
    if (first == s.end()) throw std::out_of_range("invalid index.");
    len = std::mblen(&*first, std::distance(first, s.end()));
    if (len < 0) throw std::runtime_error("invalid string.");
  }
  return {first, first + len};
}

// sからindexesで指定された位置のマルチバイト文字を繋いだ文字列を返す。
std::string select(
    const std::string& s,
    std::initializer_list<std::size_t> indexes)
{
  return std::accumulate(
      indexes.begin(),
      indexes.end(),
      std::string{},
      [&s](auto& result, auto i) { return result + get_mb_char(s, i); });
}

int main()
{
  std::setlocale(LC_CTYPE, "");
  std::cout << select("パタトクカシーー", {1, 3, 5, 7}) << std::endl;
}
  • mblen()を使うにはstd::setlocale()によるロケールの設定が必要。
  • n文字目を取り出すには文字列の先頭から順番に調べていく必要があるので効率が悪い。