たまに書きます。

気になって調べたことを書いていきます。

化学屋から見たバンド理論

化学系の学部・学科で理論計算を行う人は、gaussianやGAMESSといった量子化学計算プログラムを使って解析を行うケースが殆どだと思います。

しかし、シュレーディンガー方程式の解釈の仕方はそれだけではなくて、バンド理論というのも一つの見方です。

vaspやQuantum Espressoといったプログラムを用いて計算したバンド構造図は、初めての人には非常にわかりづらく、また、何度か見せられた場合でもよく言われる特徴(バンドギャップの有無、それが直接遷移か間接遷移か)くらいしかわからない人もいるかと思います。

化学分野の人がこれを理解しなければならない、というときは、以下の本が良かったので、ここに載せておきます。

固体と表面の理論化学

固体と表面の理論化学

固体の電子構造と化学

固体の電子構造と化学

一つ目は、福井謙一先生と一緒にノーベル賞を受賞されたホフマンの本で、バンドを直感的に理解するには非常にわかりやすい本であると言えます。バンドは実際には一つ一つが分子軌道と同じように考えることができます。

ただ、この本は絶版なので、図書館で探すしかないと思います。

二冊目は一冊目の本をもう少し現代的に書いた本で、4章でバンド理論のホフマンの本の要点は一通りまとめられてはいます(が、ホフマンの方が個人的にはわかりやすかった)。 実際にバンド理論を考えるには、3d軌道のように、電子が局在する最外殻軌道を考える必要があります。その時に出てくるのがHubbard-Uパラメータですが、このあたりについても説明がなされているので、必要に応じて読むのが良いと思います。

理論化学の本を紹介していく(その1、超入門)

しばらく忙しくて全然書くことができなかった。 けれど何とか生きています。順調に理論化学の博士課程学生をやっています。

さて、相変わらず本は結構読んでいるのですが、最近若干の消化不良になっています。 せっかくなので、読んだ本のことを文章で記録することが重要かと思い、そのモチベーションとしてアマゾンアソシエイトIDに登録しました。 なるべく自分が「なるほど」と思ったものを紹介していきたいと思います。 もし興味を持つようであれば買ってください笑

とりあえず初めてなので、自分の専門分野に関する本を紹介したいと思います。

僕が専門にしているのは量子化学という物理化学という物理化学の一分野です。 どうもこの分野は、大学に入りたての人には非常にわかりづらい分野なのだけど、その勉強に有用な本を紹介したいと思います。

大学で始めて学ぶ化学の授業は、量子化学の分野であることが多いと思います。 自分の時はいきなりシュレーディンガー方程式なるものが出てきて、よくわかりませんでした。

そういう場合は、とりあえず量子化学ノートを読みましょう。

単位が取れる量子化学ノート (KS単位が取れるシリーズ)

単位が取れる量子化学ノート (KS単位が取れるシリーズ)

この本は、シュレーディンガー方程式を天下り的に紹介した後で、例題をいくつか解いて、最終的にはリッツの変分法まで行きます。これを土台にしながら、軌道理論というのを抑えていけばよいと思う。

量子化学をはじめて習う人が押さえるべきポイント

シュレーディンガー方程式そのものは、古典力学ニュートン方程式しかなかった時代に、それは頭の良い人たちが苦労して導出した式です。 しかし、そのプロセスは、超入門期に抑えるポイントではないと思います。 まず抑えるべきは、

  1. シュレーディンガー方程式の形(時間を含む方程式と、時間を含まない(定常状態という)方程式)の形を押さえる

  2. 波動関数の意味を知る

 実際には、これは非常に難しい問題です。ただ、数値的には、それを二乗した場合に電子の存在確率になると教えられます。 波動関数を解くこと≒電子がどの辺にどのくらい集まるかを知ることができる、程度に抑えればよいです。

 さらに、電子の存在確率、というのは、トータルの電子数をかけてやれば、ある座標に電子が何個いるのか、ということになります。専門の人たちの間ではこれを電子密度(charge density)と呼びます。

  1. 井戸型ポテンシャルの波動関数を解く。

 これは必ず出てくる例題です。まずは、無限に深い1次元井戸型ポテンシャルの問題を解きます。これは覚えるくらい何度もやるべき。これがそのままテストになるという大学もあります。  これができたら、3次元の井戸型ポテンシャル問題を解きましょう。といっても、xyz座標は独立なので、変数分離の仕方を覚えるだけです。

とりあえずこの3点を抑えれば、あとはなんとかなります。最低限のことは自分で勉強できるだけの基礎知識はつく、ということです。

この後で調和振動子や水素原子の波動関数を解く、という問題が出てきます。これは実際には自分で解くことは(仮に専門にしたとしても)ないので、一度写経するつもりでやればよいです。

この本は水素原子が終わったら、変分法というものが出てきます。これは、波動関数という原理的に解けない式にたいして、近似を導入する際のとても重要な手法なので抑えるのが良いかと思います。

自分でも一度棚卸の意味も含めてこのように書いてみると色々思い出して良い。

水道の蛇口を締めても水が止まらなくなったときのトラブルシューティング

ふだんは遅くとも9時くらいには研究室から家に帰ってくるのだけど、今日(昨日)はいろいろまとめてやっておきたかったことがあったのを処理しているうちに23時半を回ってしまった。
家に帰ってから、さっさと寝たいと思いながらシャワーを浴びていたのだけど、ここで「蛇口を締めても水道の水がジャージャー出続けて止まらない」案件が発生した。とりあえず、とてもビビる。

管理会社に緊急で電話をして応急処置の仕方を教えてもらった。
寝ようと思ってたのに全然眠くなくなってしまったので、トラブルシューティングとしてここに書き留めておきます。この際なので偶然これを見た人は、水道の元栓と、あとはガスとかその辺も確認しておいて頂ければよいかと。

水道は集合住宅の場合、パイプスペースなどに元栓があるらしい。
うちは、パイプスペースは玄関のすぐ横にあったけれど、これも住宅によっては違う場合があるそうなので、場所は確認しておくのが良いと思う。
f:id:salondunord:20160226020218p:plain

とりあえず、これ(下側のフタ)をあける。
この下の方に横たわっているパイプが水道関係のもの。
f:id:salondunord:20160226015232p:plain

ここについている蓋のついた緑のパーツ、これの蓋をあけると中にメーターが出てくる。
水が出ているときには、メーターの横のベアリングみたいな部分がグルグル回り続けている。
そして、この緑のやつの右に見えるつまみが元栓とのこと。このつまみを時計回りにひねれば水が止まる。うちのは時計回りに90度回したらそれ以上回らなくなって、完全に閉まり、さっきのベアリングみたいなやつの動きも止まった。
業者さん曰く、これは住宅によっては90度以上ひねらなきゃならないものもあるらしい。
ここまでが応急処置。

結局、業者さんがこのあと来てくれて(01:00AM過ぎだった)直してくれた。蛇口のところのパッキンが割れて、その穴から水がダーッと漏れていたとのこと。「たまたま締めようとしたときに噛み合わせが悪かったタイミングだったんでしょうねー」とのこと。正直こればかりはどうしようもないので、今後同じような事態に直面しないですむように祈るのみだなぁ。

ちなみに、賃貸住宅において普通に使っていて急にこのような事態が発生した場合は、設備異常ということで料金は取られない(少なくともうちはそうだった)ので、まずは躊躇せず管理会社に連絡するのが良いかと思う。
水道トラブルの業者に頼んでたらきっと結構取られてたんだろうなぁ。。。(「水道トラブル5000円♩、トイレのトラブル8000円♩〜」てやつに加えて深夜料金で25%上乗せ らしい)

参考URL:
1, 洗面台などの大手のLIXILのウェブサイトtostem.lixil.co.jp
2, うちのマンションの管理会社の緊急事態ページ
【設備メンテナンス】 ご入居者様 | 株式会社 リゾン
ひととおり書いてあって参考になる。

そろそろ眠くなって来た。

スターバックスのファンでした(続編)

スターバックスの店舗情報のスクレイピングを行うプログラムを更新した。
昨年の今頃、Pythonで書き直したのだが、その直後にスターバックスジャパンのウェブサイトがリニューアルされて形式が変わってしまっていたため。今回も、Pythonのlxmlライブラリを使用した。xpathが使えると非常に書きやすい。
表はこちら。
https://github.com/YukiSakamoto/Starbucks_Japan/blob/master/AllJapan.csv


9月26日現在、日本全国で現在1117店舗。
コミットログを見ると、昨年(2014年)9月20日に更新したときの表(こちら
https://github.com/YukiSakamoto/Starbucks_Japan/blob/master/old/StarBucks_All.csv

)では1017店舗なので、この1年の間にちょうど100店舗増えていることになる。

プログラミングの良いリハビリになった。

塩分について考える

突然だが、塩分について書いてみる。
自分は今年の2月に尿管結石になり、また、その少し前に母親が狭心症を煩ったこともあって、それ以来、塩分の量について気にするようになった。
(余談だが、しばらく放置していたこのブログなのだが毎日100-200程度のアクセスがあるようで、検索から来た方のアクセスとしては尿管結石関連の記事はかなりアクセスが多いようである)

cookpad.com
日本人の塩分の摂取量は世界的に見ても多い方で、男性で平均して12g程度、女性で11g程度もある。
一方で、人間が生きて行くのに必要な塩分摂取量は一日5g以下である(3−4g程度)。つまり、日本人はその2−3倍程度の塩分を毎日摂っていることになる。
塩分を多くとることによって人間の血圧は上がる傾向にあり、その結果として日本人の死因で心疾患はガンに次いで多い。

狭心症などは今はかかってもカテーテル技術の発達などによりそれほど重篤な事態にならないこともかなり増えたそうなのだが(母親談)それでもやはり罹らないでよいものなら罹りたくない。

そういう訳で、最近自分が食事の際に気をつけている塩分の量について気にしている点を書いてみる。
1、とりあえず食塩相当量を見る。
とにもかくにもこれに尽きるのではないだろうか。
たいていの加工食品にはほとんど必ず成分表示があって、そこにはナトリウムの量あるいは食塩相当量の表示がされている。
食塩相当量についてはそのまま見ている。ナトリウムの場合は、400 mgに対して食塩1 g相当として考えている。(これは含まれているナトリウムがすべて食塩に由来すると考えたときの換算である。細かく言うならば、Naの原子量は22.3、Clの原子量は35.5なので、合計すれば食塩NaClの分子量は57.8。したがって、かなり適当な計算ではあるのだが、Na400mgに対し食塩1g程度ということになる。)

2、みそ汁を飲まない
日本人のソウルフードとして根付いている?みそ汁なのだが、言って見ればこれは只の塩水である。とりあえずインスタントみそ汁を例にとってみよう。
生みそタイプみそ汁 あさげ|商品情報|永谷園
料亭の味みそ汁 12食|マルコメ
このように一般的な即席みそ汁は1杯あたり2gオーバーの食塩を含んでいる。それほど大きな量とは思わないかもしれないが、仮に3食毎食でお味噌汁を飲むとすると、それだけで6g以上の塩分を摂ることになってしまう。これだと他のものでちょっとでも塩を含むと簡単に目標摂取量をオーバーしてしまうのだ。食堂とかで毎日何も考えずにとりあえずみそ汁をトレーにのせる、という人はかなりいるようだが、これはやめた方が良いと思う。
一方、タニタを始めとする各社から出ている「減塩」タイプの即席みそ汁は、一杯あたり1.0-1.3g程度のみそを含んでいるようだ。自分はお味噌汁を家で飲むときはこのような減塩タイプのみそを使うことにしている。さらに言えば、この減塩タイプのみそ汁でも梱包されている味噌の半分程度、つまり0.5-0.6g程度のみそでも十分美味しいと感じられるようになった。こればかりは慣れの問題なので、少しずつ減らして行くと良いと思う。
タニタ監修 減塩みそ汁|マルコメ
うどん、ラーメン、パスタなどの麺類は、スープを飲まないようにするのは当たり前だが、麺自体が既に多分に塩分を含んでいるため、それも程々に。

3、減塩メニューを覚える。調理する際は、計量スプーンや秤をきちんと使う
恥ずかしながらそれほど料理をするわけではないのだが、最近なにか作るときはこの本に頼ることが多い。www.amazon.co.jp

この本は少量用の計量スプーンなどが付録としてついてくる。そして只の薄味ではなく、「減塩しても自然な味の」メニューを目指して書かれていて、たまにおかずを作ったりする際はこれを参考にしている。この本の始めの方にもきちんと書かれているのだが、はかりや計量スプーンをきちんと使用することで、自分が作っているものにどの程度の塩分や砂糖が入っているかを調べるのは大変重要だ。

4、その他
これは自分もきちんと調べた訳ではなく、参考程度に人に聞いたものなのだが、ワカメやヒジキなどの海草類はカリウムを多く含んでいる。カリウムはナトリウムを体外に排出するのに有効らしく、最近は海藻を好んで食べるようになった。

最後に
別に自分は管理栄養士さんではないしそういう人がすぐ近くにいる訳ではないのでよく分からないが、専門家からすれば、本来はもっと気をつけるべき事柄は多いのではないかと思う。気にし過ぎというのもかえって良くないのだが、上記程度なら自分には自然なことであったし、今は「たまには暴食してしまっても大丈夫」と思えるようになり、この先も続けて行きたいと思う。

参考文献
厚生労働省:死因順位(第5位まで)別にみた年齢階級・性別死亡数・死亡率(人口10万対)・構成割合
Amazon.co.jp: 糖尿病で死ぬ人、生きる人 (文春新書): 牧田 善二: 本

C/C++からCythonを介してPythonの関数を呼び出す話

下で技術系以外のことも書いて行こうと主張した直後でまた技術系の話です。
Cythonについては、PythonからC/C++の関数を呼び出す為のツールで、これについては情報が至る所にあるのでそちらを参照して欲しい。
最近はオライリーから本も出たようだ。
Amazon.co.jp: Cython ―Cとの融合によるPythonの高速化: Kurt W. Smith, 中田 秀基, 長尾 高弘: 本

これを使えば計算コストのかかる部分、例えば二重のループなどをC言語で書いておき、それをPythonから呼び出すことで、フロントエンドはPythonの皮をかぶったまま、中は以外に速い、ということが実現できる。
最近関わっていたプロジェクトでいろいろと書いていたのは、この逆のパターンで、「Cythonでラップされた[C/C++で書かれた]関数から、Cythonを介してPythonの関数を呼び出す方法」である。
このような状況が必要になる機会というのは、そう滅多にはないと思う。自分が関与していたのは、常微分方程式(Ordinal Differential Equation: ODE)を数値積分して行く際、その時々で呼ばれるdx/dtを返す関数をPythonでコールバックとして登録しておき、その値を埋めたら再びC++のODEソルバーに戻ってステップして行く、というものだった。
(sympyなり、別のツールを使えば良いのかもしれないが、今回はプロジェクト上の都合で他のモジュールとの連携などもあり、こうせざるを得なかった)

使用した方法に関しての元ネタは、stackoverflow.com

では方法論に入ろう。
最終的に実行できるようにしたいコードは、以下のようになる。へボいが、エッセンスはこれで一通り詰まっている。

import callfromcpp

def func(n):
    return n * 2;

cb = callfromcpp.PyFrontend(func)
print cb.callback(5.0)

このcb.callbackという部分が、Cで書かれた関数を呼び出して、そのなかからPythonで書かれたfuncという関数を呼び出す関数である。

1、まずはバックエンドを書く。
ここで使用したバックエンドのコードは以下のよう。
backend.hpp

#ifndef __GUARD
#define __GUARD

class cpp_backend {
public:
    // This is wrapper of Python fuction.
    typedef double (*method_type)(void *param, void *callback_func);

    // Constructor
    cpp_backend(method_type, void *user_data);
    // Destructor
    virtual ~cpp_backend();

    double callback_python(void *parameter);

private:
    method_type method_;
    void *python_callback_pointer_;
};

#endif

backend.cpp

#include "backend.hpp"

cpp_backend::cpp_backend(method_type method, void *callback_func)
    : method_(method), python_callback_pointer_(callback_func)
{}

cpp_backend::~cpp_backend()
{}

double cpp_backend::callback_python(void *parameter)
{
    return this->method_(parameter, python_callback_pointer_);
}

これは単体では動かないが、pythonのヘッダーやモジュールに依存している訳ではないので、

$> g++ backend.cpp

としたらコンパイルは通るはずだ(ただし、_mainが無いといってリンカーに怒られる)。

次にcythonに渡すファイルを作成する。

from cython.operator cimport dereference as deref
import sys
# referenced from
# http://stackoverflow.com/questions/5242051/cython-implementing-callbacks

ctypedef double (*method_type)(void *param, void *user_data)

cdef extern from "backend.hpp":
    cdef cppclass cpp_backend:
        cpp_backend(method_type method, void *callback_func)
        double callback_python(void *parameter)

cdef double scaffold(void *parameter, void *callback_func):
    return (<object>callback_func)(<object>parameter)


cdef class PyFrontend:
    cdef cpp_backend *thisptr

    def __cinit__(self, pycallback_func):
        self.thisptr = new cpp_backend(scaffold, <void*>pycallback_func)

    def __dealloc__(self):
        if self.thisptr:
            del self.thisptr

    cpdef double callback(self, parameter):
        return self.thisptr.callback_python(<void*>parameter)

最後にこれらをビルドする為のsetup.pyが以下。

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

source = [
    'backend.cpp',
    './front.pyx'
    ]

setup(
    cmdclass = dict(build_ext = build_ext),
    ext_modules = [
        Extension(
            'callfromcpp',
            source,
            language='c++',
        )
    ]
)

ここでの重要なのは、front.pyの中で定義されている、scaffoldという関数だ。
文字通り、この関数はC++からPythonの関数を呼び出すときの足場としての役割を果たすものだ。これを介すことで、C++Python処理系に依存することなく、関数の形を特定することができる。逆に言えば、Pythonで書いたコールバックの引数が増えるときや、配列を扱うときなどはここで変換を行ってやる必要がある。
上記を行った上で、最初に示したtest.pyが

$> python test.py
10.0

と返ってくれば正解だ。

しばらく放置していたのだけど

この四月から博士課程の学生に身分がかわり、研究室も変更した。そういうこともあってか、ここのところ新しいことを勉強したりとか、とりあえず研究というよりも単なるインプットに偏りすぎていた感じがあるので、とりあえずこれからはアウトプットを少しでも増やす為にもここに色々書いて行きたい。

以前はコンピュータのプログラミング周辺のことばかり書いていたけれど、最近は平日はひたすら研究、週末は暇があればずっと読書しているというような生活をしている。
読書って、仮に本を一冊読んだとしてもそこに書かれていることが脳みそにくっきり全部刷り込まれる訳ではないので、少しでも感想をかくなり、内容をまとめるなりしてアウトプットする作業を行わないと返ってもったいない。
そういう訳で、研究のことはともかく、読書メモなり、(こちらも趣味の)都内のお散歩の記録なり、改めて、色々書いていきたいと思う。たまにはプログラミング関係も。

僕の読書メーター: bookmeter.com