たまに書きます。

気になって調べたことを書いていきます。まずはAboutページをご覧ください。

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

スターバックスの店舗情報のスクレイピングを行うプログラムを更新した。
昨年の今頃、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

CMSimpleというものを使ってみた感想

世間ではContents Management System(以下、CMS)としてWordPressが圧倒的に流行っておりますが、それ以外のフレームワークのお話です。
最近は企業とか、大学の研究室のWebページでもよく使われていますね。
僕の所属している研究室でもWebページを作り直したいと先生に頼まれたので、僕も始めはWordPressをサーバに置いてしまって、必要に応じて誰でも更新できるようにしたいと考えたのですがサーバのPHPがなんと5.1.6で古すぎてWordPressなんておけないということで、もっと用件の緩いものを探しました。

それが今回紹介するCMSimpleというものです。名前からして軽そうな感じがしますが、必要な要件はPHP4.0.4以上でOKのようで、データベースなども必要ないとのことでした。これなら行けそうということでvagrantでサーバを立ち上げて使ってみました。

軽量であることをのぞいた特徴としては、WordPressは記事を時系列に並べたりといったようなブログ的な感じのページが構築できますが、こちらの場合はその用途にはあまり向いていません。
必要があれば更新するような「作りっぱなしの」ページを作るのに向いているようです。研究室のページなどはばっちりそういった類いの者なので十分ですね。

インストールは解凍したものをサーバの上に置いてしまって幾つかのパーミッションを設定するだけで、非常に簡単でした。これも良いと思います。
http://www.cmsimple.org/doku/en/?Installation___Files-_and_Folders_Permissions

他言語対応などもできますが、ドキュメント周りが少々さっぱりしすぎてて試行錯誤が必要な部分は多少ありました。
他にもトップページの扱い(DirectoryIndexとかmod_rewriteを使うかなど)いまいちピンと来ない部分もあるのですが、基本的には使えるはず。

尿管結石事件のその後

先月の尿管結石で苦しんだ事件のその後のお話。
先日再診をしてもらい、とりあえず落ち着きましたねとのこと。
ただし、5年以内に再発する人が大体半数いるらしい。
もうできればなりたくないし、その為には生活習慣の改善が必要ということで、記録もかねて、色々考えたことなどをメモっておく。

その前にまずはタイムラインをまとめてみる。

2014年12月月末: なんだかお腹が痛い時があった。特に食後に腰の左側が痛い症状があったので、胃が調子悪いのかなと思いつつ内科を受診。胃薬と痛み止めを貰って終了。そのときはそれで収まったので、治った物と思っていた。(※食後に痛み、というのが尿管結石の症状なのかどうなのかは分かりません)

2015年
1月4日(日) なんかまたお腹が痛い。やっぱり左側。そして今度はずっと痛い。
1月5日(月) とりあえず治った。単に調子が悪かったんだろうと勝手に納得した。1週間そんな感じ。
1月12日(月 成人の日) お昼頃、なんか赤い尿が出た。この世の終わりのような感情に襲われてしまった。
1月13日(火) とりあえず泌尿器科内科を受診。尿検査するとやっぱり赤血球多めと言われてしまう。その日はあまり時間がなかったので金曜日にエコーの検査をしましょうということで予約をして帰った。とりあえず、対処的措置として体内の血管の出血を止めるための止血剤を処方された。
1月14日(水) 昼過ぎから左の脇腹が痛い(疼く感じ)。悶絶するほどとは言わないがずっと痛い。どうしても外せない用事などがあったので、痛みをこらえつつそれをする。途中で「左脇腹 鈍痛」でググったら尿管結石の疑いがありますねという記事を見る。例の血尿もこの件だったのかなと思って自分の中では勝手に話をつなげてしまった(このとき初めて尿管結石というものを意識した)。明日病院に行こうと決意するが夜になって大学から帰るときにもうとにかく痛くて、13日(火)に行った泌尿器科に連絡する。「左脇腹が痛いんです」といったら先生も「尿管結石の可能性ありますね」といって、僕の住所をしらべてくれて近くの大学病院の夜間外来に行くことを勧めてくれた。
その後、一度帰宅して大学病院に電話。その日は泌尿器科の先生が当直で(運が良かった)すぐに診てもらえた。レントゲンを撮ったが、腸になんかガスがたまってるのと腎臓が荒れてますねと言われるくらいでその他はわからなかったので、人生初のCTスキャンを撮った。もう殆ど膀胱に近いところにきていたみたいだけど、6mm程度の石がありますねとのこと。排斥を促進する薬(どの程度効果があるものなんかは知らん)と痛み止めを貰って帰宅。痛み止めのおかげでかなり楽になった。
1月19日(月) 再診。レントゲンではやはり石は見えなかったが、排石の感じはこれまで無かったので、引き続き水をよく飲むようにしてくださいといわれて帰宅。
1月20日(火) お昼頃、トイレにいると出してる途中(小です)でなんだか一瞬詰まる感じがした(よく見てなかった)。その後見てみても石っぽい物が出てきた形跡は見つけられなかったが、あのときにやっぱり出てきたのかもと勝手に思った。この後もとくに何も感じてない。
2月2日(月) 再々診。やはりレントゲンでは見えなかった。ただもう出ちゃったんじゃないですかねということで結局これにて通院も終了。

という感じ。尿管結石を意識してからは短かったけど、疼くような痛みはこうしてみると結構長く感じていたみたい。

とりあえずこの一件以降、毎日水を2Lは飲むようにしている。2Lのペットボトルの水を毎日または一日おきくらいに買って、大学の研究室のデスクにおいてコップで飲んでいる。
あとは塩分控えめにするのと、カフェインもとらないようにしている。どうしてもコーヒーを飲む時はかならず牛乳を入れる。
カフェインは普通腸管から吸収されて、腎臓に行ったときに偶然腎臓内の水分が少ないと、相対的に尿酸(カフェインは代謝されて尿酸として排出される)濃度が濃くなって、そこでカルシウムと結合すると結晶のタネになるらしいのだが、牛乳を混ぜることでカフェインがカルシウムと結合して、そもそも腸管からの吸収が抑えられるらしい。本当かどうかはわからないので今度論文を探してみようと思うが、コーヒーを0にするのはつらいのでそうしている。
その他、夕食は少なめに、そして寝るまでは4時間以上必ずあける生活をするようにしている。これでどこまで抑えられるかなあ。

まぁ気にしすぎない(神経質になりすぎない)程度に生活を改善して、健康的に生きていければいいなぁと思う。

修士論文発表の一ヶ月前になって尿管結石と診断された話

2014年の年末くらいから時々左の脇腹に違和感があったり、痛いと感じることがあったのだけど、そのときは病院に行って整腸剤とか胃薬・痛み止めを処方してもらうのみで、それで治った(気がしていた)ので気にしていなかった。
そして、今年の成人の日になんか赤っぽい尿(つまり血尿)がでて泌尿器科内科を受診。その日は用事があったので数日後にエコー(超音波)の検査をしましょうという話になったのだけど、その翌日の午後、また年末同様に左脇腹が痛み始めた。なんか殴られているようなガンガンする痛みではなくて、体の左側の中身をラジオペンチみたいなもので思い切り引っ張られているような感じ。鈍痛だけどずっと痛い。
自分で「左脇腹 鈍痛」とかでググったら尿管結石の可能性がありますと書かれたページがいくつかヒットして、自分のここ2、3週間気になっていた痛みとかはそれなのかと思って先の内科に電話。
その日はもう診療を終えてて診てもらうことができなかったけど、痛くて夜寝られそうにないので、夜間外来で自宅近くの大学病院に言ってレントゲンとCTをとってもらったら「石ですね」とのこと。細長い石で、長さは6mmくらいあると言われた。自然排出を期待できる大きさなので、もう後は出てくるのを待つしか無いみたいだ。

痛み止めをもらって、帰宅。
看護師さん曰く、膀胱に落ちる瞬間は立っていられないような激痛が走るらしく、僕はそれは経験した覚えがないので、痛み止めが入った後でなったのかもしれない。

尿管結石になりやすい人の特徴としては
・偏食(特に動物性の食品ばかり食べている)
・夜、ご飯を食べてから時間が経たないうちに就寝
・運動不足
・コーヒーとかをよく飲む・水(清涼飲料水とかではなくて水道水とかの只の水)の摂取量が少ない
・ストレス

などがあって、今の自分は全部当てはまっているではないかと思った。もともと割と神経質な性格ではあるし。
これを機に、自分でも意識的に夜の8ー9時には家に帰って野菜中心にご飯を食べたり、あとは(今ある石を出すため、という理由もあるけれど)毎日2−3リットルの水を飲む、遅くても9時頃にご飯を食べて寝るまでは3時間以上あける、コーヒー・チョコレート食べない、というように生活習慣を変えることにした。
一回高くて痛い授業料を払った気がしたけど、こういうのを経験してしまうと生活習慣をちょっと帰るのは全然つらくない物だと今なら思う(もう慣れた)。

それにしてもCT、MRIとかの可視化技術ってすごい。体に一本も触れなくてもあれだけ精密に可視化できるって医療技術の進歩は偉大だと思ってしまった。痛み止め(ボルタレンっていうめっちゃ強いやつ、プロスタグランジンという痛覚伝達物質の合成を阻害する)とかもすごく良く効いて、いろんな技術のありがたみをとてもよく感じた。