2026年2月

02月28日(土)

計算物理春の学校の準備。主にスライドの整理。

02月27日(金)

修士論文の学位論文使用許諾書の承認した。

動画の最終確認。

計算物理春の学校の準備。昨日はリポジトリを作ったが、やっぱり考え直して春の学校用のオーガニゼーションを作成することにした。

計算物理屋のためのGit/GitHub入門

必要なリポジトリ、特にプルリク練習用リポジトリは別オーガニゼーションに分けた方が良いかと思って。

とりあえず座学初日のスライドを整理。演習はほとんど再利用なのですぐに作れるはず?

02月26日(木)

研究室ミーティング。今日もどちらも参考になる論文で良かった。

計算物理春の学校用のリポジトリ作成(追記:削除した)。ドキュメントをCC BY、コードをMITにしようとしたが、えらく苦労した。なんかChatGPTが嘘ばかりつく。ライセンスがらみでこういう状態だと、法律関係に使うのはマジで危ないな・・・。

最終的に

と二つのライセンスファイルを置き、LICENSEをCC BYに、LICENSE-CODEをMITとしたら、GitHubが認識した。CC BY-NCは認識しなかった。

02月25日(水)

AIを使って、ファイル転送サービスをファイル保存サービスとして使う、みたいなことをやって燃えた人を見かけた。なんというか、技術のハードルが下がると、倫理も下がるというか、倫理が成長しないうちに高い技術を使えてしまう、みたいなことが起きる。今はAIで簡単にアプリケーションやサービスが作れるようになったが、例えばこれが遺伝子操作だとするとわかりやすいかもしれない。現在は遺伝子操作に至るまでに「学ぶこと」が多く、その過程で倫理も学ぶだろうが、それが「誰でも簡単遺伝子操作キット」が普及したら、どう考えても「ヤバい」使い方をする人が多数出現することは想像に難くない。

論文の査読レポート送った。

面倒なシステムの運用案を作って送った。

バリバリ仕事はしている。外には出ないけれど。

02月24日(火)

PDFのパスワードをpdftkで外そうとしたら、

$ pdftk input.pdf input_pw password output output.pdf
Warning: Using a password on the command line interface can be insecure.
Use the keyword PROMPT to supply a password via standard input instead.
Error: Invalid PDF: unknown.encryption.type.r
Error: Failed to open input PDF file: 
   input.pdf
Errors encountered.  No output created.
Done.  Input errors, so no output created.

と言われた。このPDFのパスワードにPDFTKが対応していないらしい。

qpdfで対応可能。

brew install qpdf
qpdf --password='password' --decrypt input.pdf output.pdf

pipによるインストール、

python3 -m pip install https://github.com/watanabe-appi/simple_rbm.git

ではエラーが出て

python3 -m pip install git+https://github.com/watanabe-appi/simple_rbm.git

としなければならない。最初、Gitでやっていたのをhttpsに変えた時にミスったかな?PRに感謝。

長らく懸案だった「行間解析力学」の正誤表を作った。

数式をどうするか迷ったが、結局「一行でいける場合や分数がない場合」はインラインで、複雑な場合はLaTeXiTで作ることにした。

査読まで手が回らなかった・・・

そろそろ春の学校の準備もしないと。

02月23日(月)

いろいろ仕事。

なんかマークダウンで

* hoge
    * fuga
* hoge
    * fuga

みたいなデータが与えられた時、これを

.
├── hoge
│   └── fuga
└── hoge
    └── fuga

みたいに変換したい。いろいろ調べたが、一番簡単なのはcaarlos0/mdtreeを使うことっぽい。

go install github.com/caarlos0/mdtree@latest 

で使えるようになる。

$ cat test.md
* hoge
    * fuga
* hoge
    * fuga

$ mdtree < test.md
.
├── hoge
   └── fuga
└── hoge
    └── fuga

うん、簡単だな。Goは、一度セットアップしてしまうと、ツールのインストールが楽だなぁ。

学生さんの受賞をお祝いするために伊藤先生のご自宅へ。美味しいご飯とお酒をありがとうございました。

02月22日(日)

水道料金支払った。これまえYahoo公金で払ってたのが、かわさき上下水道アプリという独自アプリになって、その登録がどうしてもうまくいかない。ので、納付書類で払うのが続いている。

で、今回はじめてPayPayで払ってみた。読み取りに少し苦労したがうまくいった。

こういう公金支払いシステム、どうかんがえてもどこかに一本化すべきで、それがYahooである必要はないけれど、少なくとも「川崎市」「上下水道」という分類で個別にアプリを作るのはまずい。

02月21日(土)

一念発起して、ずっと放置していた家の片付けを開始。書斎の床が見えてきた・・・

なぜかUbuntuからsshが繋がらなくなった。同じPCのWindows側からはつながる。wsl --shutdownしても駄目。 しょうがないのでWindowsを再起動したらつながるようになった。謎。

書斎の片付け、ほぼ完了。いろいろ懐かしいものが出てきた。僕が生まれる時の陣痛の時間を父がメモったものとか。

息子が生まれた時の陣痛の時間メモはどこかいっちゃったな。残しておけばよかったかな、と思いつつ、残ってたら残ってたで捨てづらいし、難しいところだな。

夜、何かをしようと思ったが、ちょっとダルくて無理。明日からがんばる。

02月20日(金)

会議したり、原稿の校正チェックしたり、上がってきた動画の修正チェックしたり。

あとは、博士課程はわりとしんどいよね、とか、SNSは駄目だよね、という話をしてた。

02月19日(木)

ハンズオン。今日は「論文の読み方、探し方」

研究室ミーティング。どちらも研究で知りたかったこと、例えば界面粘性であったり、Over confidenceであったりという話についてだったので、とても勉強になった。素晴らしい。

YILオンライン講座に現地参加。分子シミュレーション研究創発センターによる「分子シミュレーションが拓く未来の研究創発」。研究ユニットごとに毎月話しているみたい。

02月18日(水)

予算処理を間違えていたことが判明。事務の方に申し訳ないことをした。

ここ最近集中力を欠いているのは風邪っぽい。子供も風邪をひいていたしな。完全に墜落はしていないが、低空飛行、という感じ。

SNSの話。Xのarticle(?)で、昔の日記おじさんが話題になっていた。何かを発信するでもなく、ただの日常をだらだら書き、かつ見知らぬ人に普通にからむようなおじさんのことらしい。俺じゃん。結局、自分が体験したコミュニケーションが、自分にとってのコミュニケーションなんだろうな。

分子シミュレーション学会の2026年度の年会費払った。数年未納があるかと思ったが、ちゃんと払ってあった。日記を調べたらちゃんと払ってあった。

$ grep 分子シミュレーション */*.md  | grep 会費
log/d202110.md:分子シミュレーション学会の会費振り込んだ。
log/d202112.md:分子シミュレーション学会年会費払った。
log/d202212.md:分子シミュレーション学会の年会費払った。
log/d202401.md:分子シミュレーション学会の年会費払った。

卒論コメント書いた。これで卒論・修論の全てのコメント書いたことに。

懸案だった研究室ウェブサーバの移行準備。まずはWordPressをrsyncでローカルにバックアップし、それを修正しつつコピー、適切なcompose.ymlにより、docker compose upでローカルでの動作確認ができるようにした。

少なくともこれで、サーバが完全に死んだとしても、ローカルにバックアップがあり、最悪そこから復旧できる目処がたった。

次はサーバでの動作確認か。どうするかなぁ。一時的にもう一つVPSを借りるというのが一番現実的かな。

しかし、ChatGPT、明らかに賢くなってるな。以前(ChatGPT-4?)に似たようなことを聞いた時にはあまりうまくいかなかったのだが、今回バックアップ、コピー、設定の修正、compose.ymlの作成までほぼ詰まらずにスムーズに行った。すごいなぁ・・・

02月17日(火)

引き続き集中力を欠く。

なんかSNSで「モンスター」とした言いようがない研究者がいて、それを見ていろいろ考えてしまう。もちろんほとんどの研究者はまともなんだけれど、SNSでは「モンスター」の発言が拡散されやすい。結果、この世界がまるでモンスターに溢れているかのように見える。そんなのを見たら瘴気にあてられるのわかってるのに、つい見ちゃうんだよね。それでソウルジェムが濁る。

なんか、研究者が普通にブログで日常を書いてくんないかなぁ。昔、「なつみかん」で研究者の日記を読んでいたのが懐かしい。

引き続き青関口を読んでいる。これまで自分は量子力学を全く勉強してこなかったんだな、ということがわかる。エーレンフェストの定理が馴染みのない形で出てきたので「あれ?」と思って調べてみたら、Wikipediaに一般形が書いてあった。僕はこんなことも知らなかったのか。

日本物理学会の参加登録費、支払い忘れてた。慌てて支払う。

査読用論文印刷。

メール処理とかメール処理とか。

なかなか進捗が出ないなか、嬉しい知らせが。こうして結果が出ると嬉しい(自分の成果ではなく学生さんの成果だが)。

修論コメント書き終わった。卒論コメント3人分書いた。あと2人分。

02月16日(月)

修士論文コメント4つ書いた。

せっかくあまり予定がないのに、全然集中できなかった。研究もしたかったし、論文の査読も進めたかったのだが。

「時間がないことを言い訳にしている奴は、時間があってもできない」を地でいっている。いかん。

やりたいことがたくさんある。がんばらないと。

02月15日(日)

新学期に向けていろいろ面倒な手続き。

そんな中、なんとか時間を作ってlammpstrj-parserの使い方説明記事を書いた。

lammpstrj-parserの使い方

疲れたな・・・

02月14日(土)

昨日の続き。

lammpstrjファイルから温度を出力するようにしたが、標準出力に出しているとちょっと不便なのでファイルに保存するように修正。fstreamをインクルードして、LammpstrjAnalyzerクラスにstd::ofstream ofs_;を追加。コンストラクタでファイルを開く。

#include <cstdio>
#include <lammpstrj/lammpstrj.hpp>
#include <string>
#include <fstream> // ここを追加

class LammpstrjAnalyzer{
private:
  const std::string filename_;
  int frame_;
  std::ofstream ofs_; //ここを追加

public:
  LammpstrjAnalyzer(const std::string filename): filename_(filename){
    frame_ = 0;
    ofs_.open("temperature.dat"); //ここを追加
  }

  void calc_temperature(const std::unique_ptr<lammpstrj::SystemInfo> &si, const std::vector<lammpstrj::Atom> &atoms) {
    double e = 0.0;
    for (auto &a : atoms) {
      e += a.vx * a.vx + a.vy * a.vy + a.vz * a.vz;
    }
    e /= static_cast<double>(si->atoms);
    e /= 3.0;
    // 以下を修正
    ofs_ << frame_ * 500 << " " << e << std::endl;
    std::cerr << frame_ << std::endl;
    //printf("%d %f\n", frame_ * 500, e);
    frame_++;
  }

  void analyze(void){
    auto callback_function = [this](const std::unique_ptr<lammpstrj::SystemInfo> &si, const std::vector<lammpstrj::Atom> &atoms){calc_temperature(si, atoms);};
    lammpstrj::for_each_frame(filename_, callback_function);
  }
};

標準エラー出力にフレーム番号を吐いておくと処理の進捗がわかって良い。実行するとtemperature.datが出力される。

$ make
$ ./lammpstrj-sample 
(LX, LY, LZ) = (20.000000, 20.000000, 20.000000)
N = 4000
0
1
2
3
4
5
6
7
8
9
10
$ cat temperature.dat
0 0.99975
500 1.03767
1000 1.03179
1500 1.0046
2000 0.953656
2500 0.925923
3000 0.903054
3500 0.861995
4000 0.833804
4500 0.821041
5000 0.806599

.gitignore*.datも追加しておく。

これで温度出力に関しては一段落。

次に、密度をVTKファイルとして出力する奴も作った。後でチュートリアルにまとめよう。

確定申告済ませた。

02月13日(金)

卒論と修論を製本に出した。こういうのが研究室に溜まっていくとうれしいですね。

輪講用の本を注文。

** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html

マジか。もう耐量子アルゴリズムの時代なのか。

サーバを更新しないといけない。まずはWordpressのwp-contentのバックアップのためにrsyncを走らせる。rsyncはいつも最後の「/」がどっちかわからなくなるので、Makefileに残しておく。後でDockerでなんとかする。

lammpstrj-parserのテスト。

mkdir lammpstrj-parser-sample
cd lammpstrj-parser-sample
git init .
git submodule add https://github.com/kaityo256/lammpstrj-parser external/lammpstrj-parser

main.cppを作成。

#include <lammpstrj/lammpstrj.hpp>

int main() {
}

Makefileを作成。

CXX = g++
CXXFLAGS = -std=c++14 -O2 -Iexternal/lammpstrj-parser/include

all: lammpstrj-sample

lammpstrj-sample: main.cpp
  $(CXX) $(CXXFLAGS) main.cpp -o $@

.PHONY: clean

clean:
  rm -f lammpstrj-sample

makeできることを確認。

$ make 
g++ -std=c++14 -O2 -Iexternal/lammpstrj-parser/include main.cpp -o lammpstrj-sample

うまくいっていたら、以下の内容の.gitignoreを追加。

lammpstrj-sample
*.lammpstrj
log.lammps

後のためにlammpsの出力ファイルも追加しておく。

ここまでで以下のような表示になるはず。

$ git status -s 
A  .gitmodules
A  external/lammpstrj-parser
?? .gitignore
?? Makefile
?? main.cpp

これらを全て追加してコミットする。

git add .
git commit -am ":tada: initial commit"

相分離シミュレーションを実施。以下のようなインプットファイルをtest.inputとして作成。

units       lj
atom_style  atomic
boundary p p p
timestep 0.001

variable rho equal 0.5
variable L equal 10.0

lattice fcc ${rho}
region box block 0 ${L} 0 ${L} 0 ${L}
create_box 2 box
create_atoms 1 box
set type 1 type/fraction 2 0.5 98765

mass 1 1.0
mass 2 1.0

pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0 2.5
pair_coeff 1 2 1.0 1.0 1.12246
pair_coeff 2 2 1.0 1.0 2.5

velocity all create 1.0 12345 mom yes rot yes dist gaussian

fix 1 all nvt temp 0.7 0.7 1.0

dump 1 all custom 500 test.lammpstrj id type x y z vx vy vz
thermo 500

run 5000

密度0.5、同種原子はLJ、異種原子はWCAとして温度0.7に固定する。まずは短めに5000ステップだけにしておく。 後のために速度も出力しておく。

LAMMPSを実行する。

$ lmp_serial -i test.input
LAMMPS (20 Nov 2019)
Lattice spacing in x,y,z = 2 2 2
Created orthogonal box = (0 0 0) to (20 20 20)
  1 by 1 by 1 MPI processor grid
Created 4000 atoms
(snip)
Step Temp E_pair E_mol TotEng Press
       0            1    -1.505224            0 -0.005599034  -0.81748395
     500    1.0379285   -1.9071175            0    -0.350614   0.89774455
    1000    1.0320452   -1.9831115            0   -0.4354307   0.83759061
    1500    1.0048542   -2.0875114            0  -0.58060687   0.68268169
    2000   0.95389438   -2.1579864            0  -0.72750253    0.7033103
    2500   0.92615458   -2.2477533            0  -0.85886878   0.64168551
    3000   0.90328012   -2.3386703            0  -0.98408884   0.50502435
    3500   0.86221052   -2.4125228            0   -1.1195303   0.51427453
    4000   0.83401226    -2.485898            0   -1.2351923   0.41993354
    4500   0.82124657   -2.5744925            0   -1.3429306   0.37929561
    5000   0.80680117   -2.6549983            0   -1.4450991    0.3126729
(snip)

まずはこのサイズと原子数を取得する。main.cppを以下のように書き換える。

#include <cstdio>
#include <lammpstrj/lammpstrj.hpp>
#include <string>

int main() {
  const auto filename = "test.lammpstrj";
  auto si = lammpstrj::read_info(filename);
  printf("(LX, LY, LZ) = (%f, %f, %f)\n", si->LX, si->LY, si->LZ);
  printf("N = %d\n", si->atoms);
}

コンパイル、実行する。

$ make
$ ./lammpstrj-sample 
(LX, LY, LZ) = (20.000000, 20.000000, 20.000000)
N = 4000

情報が正しく取れている。

温度の取得。main関数の上に以下のような関数を作成。

void calc_temperature(const std::unique_ptr<lammpstrj::SystemInfo> &si, const std::vector<lammpstrj::Atom> &atoms) {
  static int frame_ = 0;
  double e = 0.0;
  for (auto &a : atoms) {
    e += a.vx * a.vx + a.vy * a.vy + a.vz * a.vz;
  }
  e /= static_cast<double>(si->atoms);
  e /= 3.0;
  printf("%d %f\n", frame_ * 500, e);
  frame_++;
}

main関数からlammpstrj::for_each_framにファイル名とcalc_temperature関数を渡して実行。

int main() {
  const auto filename = "test.lammpstrj";
  auto si = lammpstrj::read_info(filename);
  printf("(LX, LY, LZ) = (%f, %f, %f)\n", si->LX, si->LY, si->LZ);
  printf("N = %d\n", si->atoms);
  lammpstrj::for_each_frame(filename, calc_temperature);
}

コンパイル、実行する。

$ make
$ ./lammpstrj-sample 
(LX, LY, LZ) = (20.000000, 20.000000, 20.000000)
N = 4000
0 0.999750
500 1.037669
1000 1.031787
1500 1.004603
2000 0.953656
2500 0.925923
3000 0.903054
3500 0.861995
4000 0.833804
4500 0.821041
5000 0.806599

先ほどのLAMMPSが出力した温度とほぼ同じ温度が出力されていることがわかる(1frameずれているのか、少しだけ値がずれる)。温度が取れている=原子の情報を全て取得できているので、あとは好き勝手できる。

しかし、フレームがstatic変数になっているのがちょっと気持ち悪いのと、これからいろいろ情報が増えるので、クラスを作って、calc_temperatureをメンバ関数とし、frame_filename_をメンバ変数とするLammpstrjAnalyzerクラスを作る。

class LammpstrjAnalyzer{
private:
  const std::string filename_;
  int frame_;

public:
  LammpstrjAnalyzer(const std::string filename): filename_(filename){
    frame_ = 0;
  }

  void calc_temperature(const std::unique_ptr<lammpstrj::SystemInfo> &si, const std::vector<lammpstrj::Atom> &atoms) {
    double e = 0.0;
    for (auto &a : atoms) {
      e += a.vx * a.vx + a.vy * a.vy + a.vz * a.vz;
    }
    e /= static_cast<double>(si->atoms);
    e /= 3.0;
    printf("%d %f\n", frame_ * 500, e);
    frame_++;
  }

  void analyze(void){
    auto callback_function = [this](const std::unique_ptr<lammpstrj::SystemInfo> &si, const std::vector<lammpstrj::Atom> &atoms){calc_temperature(si, atoms);};
    lammpstrj::for_each_frame(filename_, callback_function);
  }
};

ポイントはanalyze関数。lammpstrj::for_each_frameにコールバック関数としてLammpstrjAnalyzer::calc_temperatureを渡したいが、直接は渡せない。そこで、一度ラムダ式でコールバック関数を作ってやり、その中でメンバ関数を呼ぶようにする。

    auto callback_function = [this](const std::unique_ptr<lammpstrj::SystemInfo> &si, const std::vector<lammpstrj::Atom> &atoms){calc_temperature(si, atoms);};

ここで作ったコールバック関数をlammpstrj::for_each_frameに渡せば良い。

    lammpstrj::for_each_frame(filename_, callback_function);

一度callback_functionという変数に受けなくても、いきなり

lammpstrj::for_each_frame(filename_, [this](const std::unique_ptr<lammpstrj::SystemInfo> &si, const std::vector<lammpstrj::Atom> &atoms){calc_temperature(si, atoms);});

とできるが、可読性を考えると一度変数に受けた方が良い気がする。

02月12日(木)

卒論、修論の論文と要旨をesaにアップロードした。

日本物理学会の予稿の提出が明日までだった。慌てて作成して投稿。

仕事の合間に仕事している、みたいな。

02月11日(水)

修士論文のタイトル承認した。

Dev.toにもRBMの記事ポストした。

A Hands-On Introduction to Restricted Boltzmann Machines with a Minimal NumPy Implementation

02月10日(火)

Grammerlyのサブスクリプションを解除。ChatGPTで代替可能。

製本用修論を全て印刷。金曜日に製本に出す予定。

ブログ更新した。

制限ボルツマンマシンを触ってみる

02月09日(月)

というわけで金曜日の分をマージ。

ブログにSNSシェアボタンをつけた。こんなのは不要だと思ってたんだけど、自分で新しいポストを作った時にシェアするのに必要だった。

LAMMPS Cluster Analyzerをcxxoptを使うように修正。

某インタビュー動画をチェック。字幕について修正コメントをつけて返す。結構時間かかった。あと、自分の声はかなり聞き取りづらいな。字幕がないと何いっているかわからない。プロレスラーか?

製本用卒論を全て印刷。昨年動き出しが遅かったので今年は早めに動く。

02月08日(日)

息子と国立科学博物館の「大絶滅展」へ。前から約束していた。

大絶滅展なんて人気出そうなのに、チケットの予約時に時間指定がなかったので、「あれ?空いているのかな」と思っていたが、案の定大混雑。わりと開館してすぐついたのだが、整理券を配布しており、中でも人が大量にいた。しかし、いろいろ貴重な化石の実物が大量に見られたので満足。自分が知らないことも結構あった。特に恐竜の前に繁栄していたワニの仲間とか知らなかった。

その後選挙に行ってきた。なんかネットが荒れそうだからしばらく近寄らんとこ。

ある契約の更新書類が来ており、契約したのが5年前、しかも記憶にない代理店から手紙。仕方ないので5年前の契約書類を探したら、ちゃんとその代理店と契約していたので、更新のために振込・・・をしようとしたら、銀行アプリが「電話による本人確認では最大振込金額が足りない」と言ってきて、仕方なくワンタイムパスワードをマイナンバーカードで登録しなおして、で、セキュリティコードってなんだっけみたいなことをやってバタバタ。しかし、スマホがマイナンバーカードを読めるようになったので、家で完結したのはありがたい。前のスマホはカード読めなかったからなぁ・・・

家の書類を大量にシュレッダー。いままで手がつけられなかった片付けをどんどん進めていく。

02月07日(土)

金曜日の日記がない。おそらくpush忘れだな。後でマージ。

家の片付け。だいぶ不要な書類を捨ててやった。

RBMの動作デモウェブサイトを修正中。もはやJavaScriptやCSSは完全にAIの方が詳しいので、ほとんどAIに生成させて、デバッグして、という感じ。プログラミングが変わっているのを感じる。しかし、この状態で若い人はプログラミングができるようになるんだろうか?僕にとってのアセンブリとコンパイラみたいに、フルアセンブリでコードは組めなくても、必要な時に必要なところだけ解読できれば良い感じになるとか?

02月06日(金)

修士論文発表会。皆さん無事に発表終了。

プログラミング基礎同演習採点確定。

春の学校の旅費手続き。

残予算の整理。

02月05日(木)

菊地さんの論文が無事出版された。めでたい。

S. Kikuchi and H. Watanabe, Phys. Rev. Fluids 11, 023901 (2026)

学科のメール、転送+ローカル保存していたが、大丈夫そうなので転送オンリーに修正。

頼まれ原稿修正。

RBMライブラリに、Google Colabでそのまま実行できるボタンを追加。

プログラミング基礎同演習のレポートをすべて採点。成績をつけた(まだ未提出)。明日最終確認して確定処理。

出張申請の不備を修正。

輪講用の本、見本を注文してみた。良ければ人数分頼もう。

02月04日(水)

一日おしごと。

02月03日(火)

疲れた。ここしばらく本当に忙しかったが、ようやく落ち着いた。これからは研究ガンガン進めるぞ。

遅くなったが、プログラミング基礎同演習第14回のレポートを採点した。成績もつけないと。

02月02日(月)

卒論発表会。皆さん全く危なげなく、安心して見ていられた。お疲れさまでした。

もうひとつの「2月」終了。長かった。本当に長かった。疲れた。しかし、いい形で終わって良かった。

02月01日(日)

なんか最近、Googleで「kaityo256」で検索するとこの日記が出てくるんだけど、なんでだ?おそらくどこからもリンクはないと思うのだが、僕のGitHubのページのページランクが高いとか?

原稿を修正。「紙面の制約」とするか「誌面の制約」とするか。どうやら「紙面」は新聞でよく使うらしく、雑誌は「誌面」らしい。また「紙幅」の場合は「制約」ではなく「都合」を使うっぽいな。