あよなの足跡

工学全般の話題が多いと思います.

【Ruby】組み込み変数について

今更ですが,rubyのオプション変数について,詰まったことがあったのでまとめておきます.

色々と種類がありますが, 今回は自分で必要になったものだけまとめます.

組み込み変数とは

ローカルスコープ

以下の変数はスレッドローカルです.

$'

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした部分より後ろの文字列です.最後のマッチが失敗していた場合にはnilになります.

$&

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした文字列です.最後のマッチが失敗していた場合にはnil

まとめ

闇が深そう....

グルコサミンは関節痛に効く?

昔はテレビでよくグルコサミンのサプリのCMが流れていたと思います.
(今はテレビを見ないので,知りませんが)

これが膝関節などの関節痛に効くようにうたっています.

結論から言うと,グルコサミンが痛みなどの軽減効果があると言う信頼できるデータはありません.

グルコサミンとは

グルコサミンは,主に3種類あります. * N-アセチルグルコサミン * グルコサミン硫酸塩 * グルコサミン塩酸塩 「N-アセチルグルコサミン」は関節の軟骨成分と同じものです.

しかし,軟骨の原料を摂ったからといって,それで効果が出ると言うのは短絡的過ぎです.
痛みの改善すると言う十分な証拠はありません.

サプリのリスク

これは全てのサプリに言えることですが,
サプリメントにはうたわれている成分以外も含まれているため, アレルギー反応やクリスとの相互作用が起きるリスクがあります

まとめ

グルコサミンサプリは効果がないし,リスクがあるから,高い金払って買う必要はないよ.

mpi4pyを試してみる

Pythonの並列処理のためのライブラリであるmpi4pyを試してみました.

公式のチュートリアルがわかりやすかったので,かなり参考になります.

Tutorial — MPI for Python 3.0.0 documentation

僕はいつも通り,Docker imageから作っていきます.

FROM python

# install via apt
USER root
RUN apt-get update
RUN pip install -U pip

# mpi4py
RUN apt-get install -y libopenmpi-dev
RUN pip install mpi4py

WORKDIR /root/work

ビルド済みイメージをDockerHubにあげておきました.

https://hub.docker.com/r/denden047/mpi4py/

なので,こんな感じで実行できます.

$ docker run --rm denden047/mpi4py /bin/bash

Hello Worldのプログラムを書いてみました.
これをmain.pyという名前で保存します.

from mpi4py import MPI

def main():
    comm = MPI.COMM_WORLD
    rank = comm.Get_rank()
    size = comm.Get_size()

    print(f"Hello, world! from rank {rank} out of {size}")


if __name__ == "__main__":
    main()

っでこれを実行してみますが, 並列実行させるために,mpiexecコマンドを利用します.
具体的には以下のコマンドを実行します.

$ docker run --rm denden047/mpi4py /bin/bash -c "mpiexec --allow-run-as-root -np 4 python main.py"
Hello, world! from rank 1 out of 4
Hello, world! from rank 3 out of 4
Hello, world! from rank 0 out of 4
Hello, world! from rank 2 out of 4

Dockerコンテナで動かしているので,rootでも実行できるように, --allow-run-as-rootオプションを付けています.
また,-np 4としているので,4つのプロセスで並列に実行されています.

ここまでで,大体の感覚は掴めるので,公式のチュートリアルをやっていきましょう!

Tensorboardをtensorflowなしで使用する

Tensorboardって便利ですよね?
簡単に可視化できるツールとして,かなり優秀だと感じでいます.

そんなtensorboardですが, チュートリアルなどを見ると, かならずtensorflowとセットで紹介されています.

でも,こんな便利なツールなんだから, tensorflow以外のときも使いたいな~っと思いました.
tensorflowなしでtensorboardを使う方法を調べて見ました.

早速結論ですが,以下のサイトが一番直感的に使えます.

A generic tensorboard logger for scalars and histograms or distributions · GitHub

少し解説すると,TensorBoardLoggerクラスを宣言することで, 簡単にtensorboardの形式でログを取ることができます.

このソースコードは,scalar(つまり折れ線グラフ)とhistgramにしか対応していません.

import numpy as np
import tensorflow as tf

class TensorBoardLogger(object):

    def __init__(self, log_dir, session=None):
        self.log_dir = log_dir
        self.writer = tf.summary.FileWriter(self.log_dir)
        self.episode = 0
        print('TensorBoardLogger started. Run `tensorboard --logdir={}` to visualize'.format(self.log_dir))

        self.histograms = {}
        self.histogram_inputs = {}
        self.session = session or tf.get_default_session() or tf.Session()

    def log(self, logs={}, histograms={}):
        # scalar logging
        for name, value in logs.items():
            summary = tf.Summary()
            summary_value = summary.value.add()
            summary_value.simple_value = value
            summary_value.tag = name
            self.writer.add_summary(summary, self.episode)

        # histograms
        for name, value in histograms.items():
            if name not in self.histograms:
                self.histogram_inputs[name] = tf.Variable(value,validate_shape=False)
                self.histograms[name] = tf.summary.histogram(name, self.histogram_inputs[name])

            input_tensor = self.histogram_inputs[name]
            summary = self.histograms[name]
            summary_str = summary.eval(session=self.session, feed_dict={input_tensor.name:value})
            self.writer.add_summary(summary_str, self.episode)

        self.writer.flush()
        self.episode += 1

このクラスの使い方は,簡単に以下のように使えます.

logger = TensorBoardLogger(log_dir='/tmp/test')
for i in range(10):
    logger.log(
        logs=dict(
            float_test=np.random.random(),
            int_test=np.random.randint(0,4),
        ),
        histograms=dict(
            actions=np.random.randint(0,3,size=np.random.randint(5,20))
        )
    )

インスタンス宣言時に,log_dir引数に保存先のディレクトリを指定します.
.log()関数により,好きな値を保存していくことができます.

あとは保存先のディレクトリをしていして, tensorboardを起動させます.
これで,localhost:6006などに接続することで結果を確認することができます(Macだと127.0.0.1:6006かな).

docker run --rm \
    -p 6006:6006 \
    -v ${LOG_DIR}:/logs \
    -w /logs \
    denden047/tensorboard \
    tensorboard --logdir /logs

※接続先は,dockerの設定よって変わります.

サンプルのソースコードをまとめると,こんな感じです.

import numpy as np
import tensorflow as tf

class TensorBoardLogger(object):

    def __init__(self, log_dir, session=None):
        self.log_dir = log_dir
        self.writer = tf.summary.FileWriter(self.log_dir)
        self.episode = 0
        print('TensorBoardLogger started. Run `tensorboard --logdir={}` to visualize'.format(self.log_dir))

        self.histograms = {}
        self.histogram_inputs = {}
        self.session = session or tf.get_default_session() or tf.Session()

    def log(self, logs={}, histograms={}):
        # scalar logging
        for name, value in logs.items():
            summary = tf.Summary()
            summary_value = summary.value.add()
            summary_value.simple_value = value
            summary_value.tag = name
            self.writer.add_summary(summary, self.episode)

        # histograms
        for name, value in histograms.items():
            if name not in self.histograms:
                self.histogram_inputs[name] = tf.Variable(value,validate_shape=False)
                self.histograms[name] = tf.summary.histogram(name, self.histogram_inputs[name])

            input_tensor = self.histogram_inputs[name]
            summary = self.histograms[name]
            summary_str = summary.eval(session=self.session, feed_dict={input_tensor.name:value})
            self.writer.add_summary(summary_str, self.episode)

        self.writer.flush()
        self.episode += 1

logger = TensorBoardLogger(log_dir='/tmp/test')
for i in range(10):
    logger.log(
        logs=dict(
            float_test=np.random.random(),
            int_test=np.random.randint(0,4),
        ),
        histograms=dict(
            actions=np.random.randint(0,3,size=np.random.randint(5,20))
        )
    )

乳酸菌は体にいいの?

引き続き健康について書いていきたいと思います.

「生きたまま乳酸菌が腸に届く」などのキャッチコピーがありますが,
乳酸菌は生きて届いたところで,健康効果はあるのでしょうか?

乳酸菌とは

乳酸菌は糖を分解して,乳酸という物質をつくる最近の総称です.

乳酸菌は体で何をするのか?

人体の中での乳酸菌の働きは正確にはわかっていません.

しかし,小腸までたどり着いた乳酸菌は「免疫系」の過剰反応(アレルギー反応)を抑えると考えられています.
さらに,大腸までたどり着くと,有用菌の「ビフィズス菌」を増やし,間接的に下痢や便秘を改善する効果があります.
また,乳酸菌の作る乳酸や酢酸が,腸の筋肉を動かして排便をうながしていると考えられています.
ただ,これらの効果を期待している場合は,腸に常に乳酸菌がいるようにする必要があり,毎日の摂取が必要です

ほんとに生きたまま届くの?

そもそも多くの乳酸菌は胃で死にます
しかし,食事後は胃酸が薄まって,乳酸菌が死ににくいと考えられます.

死んだ乳酸菌でも,その構成成分が腸に作用すると考えられて, 排便改善などの効果出るとされています.

【Python】pandasで行,列を指定して抽出する

最近,データサイエンスをやっていて,pandasを久しぶりに使っています.
その都度,調べるのが面倒なので,ここにメモしておきます.

今回はちょっと特殊なデータセットを使っています.
リンクは下に貼っておきます.

Sexualitics :: Datasets

このxHamsterのJSONデータを利用しました.

JSONデータセットの読み込み

まずはデータセットをpandasのread_json()関数で読み込みます.
実行結果も一緒に示します.

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

DATASET_DIR = '/data'

path = os.path.join(DATASET_DIR, 'xhamster.json')
xhamster_dataset = pd.read_json(path)
xhamster_dataset.info()
xhamster_dataset.head()  # いい感じにデータを表示

f:id:GoKIDS:20181126160800p:plain

行でデータ抽出

早速データを抽出してみましょう.
今回はコンテンツのタグ情報に当たるchannelsの行だけを抽出します.

pandas.DataFrame.locで行ラベルを指定してデータを取り出すことができます.
列方向も同じようにラベル指定で取り出せます.

tags = xhamster_dataset.loc['channels']
print(tags)

f:id:GoKIDS:20181126162137p:plain

pandasには,locilocixなどがありますが,
これらの違いをわかりやすく解説したサイトが以下になります.

ailaby.com

コラーゲンを食べる意味はあるか?

僕ももう20歳を過ぎてしまったので,健康には多少興味があります.

ちょうどNewtonで健康食品に対する特集があったので,自分用のメモとして残しておきます.

さて,よく健康食品の怪しげな特集では,コラーゲン配合などの謳い文句がありますが,
あれは本当に効果があるのでしょうか?

結論から言うと美容効果に対する証拠はないです.

エビデンスhttp://hfnet.nibiohn.go.jp/ です.

やっぱり,みんな気になるのか特集が組まれています.

「健康食品」の安全性・有効性情報

まずコラーゲンを口から摂取しても,消化されてしまいます.
そのため,コラーゲンがそのままの形で吸収されることはありません.

ちなみにコラーゲンが消化されて出来たペプチド(ジペプチドやトリペプチド)が吸収されます.
最近は,このペプチドが関節などの体の特定部分で,何らかの機能を発揮している可能性が考えられています.
しかし,人間に十分な効果があると言う証拠はありません.

コラーゲンってなに?

最後にコラーゲンってなんなのかを書いておきます.
だらだら書いても読まないと思うので,箇条書きで要素だけまとめます.

  • コラーゲンはタンパク質の一種
  • 全タンパク質の約30%
  • 体内コラーゲンのうち40%は皮膚に,20%は骨や軟骨に存在
  • コラーゲンには色々な種類がある
    • 皮膚や腱などの主要なコラーゲンはI型
    • 軟骨の主要なコラーゲンはII型