2017/03/20

初期の銀河にはダークマターが少ない

[1,2,3]によると、今の銀河にあるダークマターの質量に比べて
昔の銀河のダークマターの質量が少ない観測結果が得られたとのこと。
著者らが観測した銀河の赤方偏移zは0.9, 1.5, 1.6, 2.2, 2.2, 2.4。
距離はおおよそ100億光年(※1)。

現在の銀河はダークマターの影響により、中心部から一定距離離れると、
回転速度がおおよそ一定になることが知られている。
一方、昔の銀河は中心部から一定距離離れると回転速度が
低下していくことが今回観測された。

銀河の質量に占めるバリオンの量が多いと今回の観測結果が得られることから
ダークマターの割合が少ないことが分かる。


(※1) zからの距離換算は例えば、
http://www.asj.or.jp/geppou/archive_open/2003/pdf/200312art5.pdf
の図4を見ればよい。

参考文献
[1] R. Genzel et al., "Strongly baryon-dominated disk galaxies
at the peak of galaxy formation ten billion years ago," doi:10.1038/nature21685, 2017
[2] M. Swinbank, "Distant galaxies lack dark matter," Nature 543, 318-319, 2017
(doi:10.1038/543318a) ([1]の解説記事)
[3] http://www.natureasia.com/ja-jp/nature/pr-highlights/11726 ([1]の解説記事)

2017/03/06

第二言語の習得能力と遺伝

[1]によると、「第二言語の習得能力は遺伝の影響が強い」そうです。

残念ながら、この根拠となる「一卵性双生児を用いた慎重な調査」の
文献のリファレンスが記載されておらず、真偽はよくわかりません。

それっぽいものは見つけられませんでしたが、[2]経由で見つけた[3]によると、
「Statistical modeling revealed that subjects' grades in the language immersion program were best predicted by fractional anisotropy and COMT genotype.」
とのことですので、第二言語の習得能力はCOMT遺伝子に影響を受けるようです。


参考文献
[1] 池谷裕二, "怖いくらい通じるカタカナ英語の法則," ISBN978-4-06-257987-2, 2016
[2] http://www.kagaku-kentei.jp/news_detail/data/278
[3] Ping C. Mamiya, Todd L. Richards, Bradley P. Coe, Evan E. Eichler, and Patricia K. Kuhl, "Brain white matter structure and COMT gene are linked to second-language learning in adults," PNAS 2016 113 (26) 7249-7254, published ahead of print June 13, 2016, doi:10.1073/pnas.1606602113

2017/02/25

LSTMで文字列を単語(番号)にマッピング

LSTMを無意味に使ってみました。

目的は、文字列を入力したら単語が出力されるニューラルネットワーク(NN)を作ることです。
単なるマッピングなので、連想配列を使えば解決ですが、無理やりNNで実現してみます。

入力層は、文字のone-hotベクトルとします。
同じく、出力層は単語のone-hotベクトルとします。

学習データはどこからともなく見つけてきた英単語300個。

入力と出力の長さが異なっているので、そろえるためにブランク記号 _ を使います。

例えば、n e u r o n を入力すると、_ _ _ _ _ neuron が出力されるように学習します。
単語ごとに文字列長が異なるので、足りない分は入力側にも _ を使います。

単語リストは

business
company
...
neuron
というふうに、単に1行に1単語が書かれたファイルです。

このファイルを次のスクリプトの第1引数に指定してスクリプトを実行します。
学習用ライブラリにはTensorFlowベースのKerasを利用しました。

ブランク記号 _ には数値で0を、ASCII文字には1から順に整数を割り当てています。
単語についても同じです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import numpy as np
import sys,os
import numpy.random as random
from keras.models import Sequential
from keras.layers import Dense, Activation, LSTM, TimeDistributedDense
from keras.optimizers import RMSprop
import keras.preprocessing.text as pp

if len(sys.argv) != 2:
    print("Usage: seq2seq.py [word list]")
    exit(0)

words_file = sys.argv[1]
if not os.path.isfile(words_file):
    print(words_file+" is not found.")
    exit(0) 

random.seed(123)

# 単語データの読み込み
words = []
max_ch_seq = 0
for line in open(words_file):
    line = line.rstrip('\n')
    chars = [ord(c)-ord('a')+1 for c in list(line)]
    col = np.array(chars)
    max_ch_seq = max(max_ch_seq, len(col))
    words.append([col, line])

# 文字長を揃える
max_ch_seq_orig = max_ch_seq
for w in words:
    while len(w[0]) < max_ch_seq:
        w[0] = np.append(w[0], 0) # 0はブランク

word_id_map = {}
id = 1
for w in words:
    word_id_map[w[1]] = id # 重複がないことが前提
    id += 1

input_vec_len = ord('z') - ord('a') + 2 # +1はブランク入力のため
output_vec_len = len(words) + 1 # +1はブランク出力のため
np.set_printoptions(threshold=np.inf)
for w in words:
    # 入力(=文字)のone-hotベクトルを作成する
    input_vec_seq = np.zeros((len(w[0]), input_vec_len))
    input_vec_seq[np.arange(len(w[0])), w[0]] = 1
    w.append(input_vec_seq)

    # 出力(=単語)のone-hotベクトルを作成する
    x = np.zeros(len(w[0]), dtype=int)
    x[-1] = word_id_map[w[1]] #最後に単語を入れる
    output_vec_seq = np.zeros((len(w[0]),output_vec_len))
    output_vec_seq[np.arange(len(w[0])), x] = 1
    w.append(output_vec_seq)

# この時点で、wordsの各要素は、
#   (文字列(数字), 単語, 文字列のOne-hotベクトル, 単語のOne-hotベクトル)
# となっている。
data_dup = 1  # 何度も同じデータを入れるなら、2以上にする

# 訓練用データを設定する
x_train = np.empty((len(words)*data_dup, max_ch_seq, input_vec_len))
y_train = np.empty((len(words)*data_dup, max_ch_seq, output_vec_len))
for j in range(0, data_dup):
    for i in range(0, len(words)):
        x_train[i+len(words)*j] = words[i][2]
        y_train[i+len(words)*j] = words[i][3]

# 評価用データを設定する
x_val = np.empty((len(words), max_ch_seq, input_vec_len))
y_val = np.empty((len(words), max_ch_seq, output_vec_len))
for i in range(0, len(words)):
    x_val[i] = words[i][2]
    y_val[i] = words[i][3]

# モデルを作る
batch_size = 50
model = Sequential()
model.add(LSTM(16, return_sequences=True,
               batch_input_shape=(batch_size, max_ch_seq, input_vec_len)))
model.add(LSTM(16, return_sequences=True))
model.add(TimeDistributedDense(128))
model.add(TimeDistributedDense(output_vec_len, activation='softmax'))

# 学習する
rmsprop = RMSprop(lr=0.0005, rho=0.9, epsilon=1e-08)
model.compile(loss='categorical_crossentropy', optimizer=rmsprop, metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=batch_size, nb_epoch=5000, validation_data=(x_val, y_val))

# モデルを保存
model.save_weights('model.dat')

# 結果の確認
r = model.predict_classes(batch_size=batch_size, x=x_val)
print(r)
78行目まではデータの読み込みと整形部分です。80行目からがモデルを作ったり学習したりする部分です。 とても短いですね

さて、実行すると

Train on 300 samples, validate on 300 samples
Epoch 1/5000
300/300 [==============================] - 1s - loss: 5.6607 - acc: 0.4613 - val_loss: 5.5990 - val_acc: 0.8738
Epoch 2/5000
300/300 [==============================] - 1s - loss: 5.5510 - acc: 0.9046 - val_loss: 5.4750 - val_acc: 0.9215
Epoch 3/5000
300/300 [==============================] - 1s - loss: 5.4081 - acc: 0.9231 - val_loss: 5.3032 - val_acc: 0.9231
Epoch 4/5000
300/300 [==============================] - 1s - loss: 5.2126 - acc: 0.9231 - val_loss: 5.0716 - val_acc: 0.9231
Epoch 5/5000
300/300 [==============================] - 1s - loss: 4.9520 - acc: 0.9231 - val_loss: 4.7682 - val_acc: 0.9231

...

Epoch 1009/5000
300/300 [==============================] - 0s - loss: 0.2684 - acc: 0.9367 - val_loss: 0.3089 - val_acc: 0.9241
Epoch 1010/5000
300/300 [==============================] - 1s - loss: 0.2687 - acc: 0.9297 - val_loss: 0.2368 - val_acc: 0.9646
Epoch 1011/5000
300/300 [==============================] - 1s - loss: 0.2416 - acc: 0.9479 - val_loss: 0.2385 - val_acc: 0.9559

...

Epoch 1499/5000
300/300 [==============================] - 1s - loss: 0.2082 - acc: 0.9518 - val_loss: 0.2559 - val_acc: 0.9285
Epoch 1500/5000
300/300 [==============================] - 1s - loss: 0.1796 - acc: 0.9649 - val_loss: 0.1584 - val_acc: 0.9869
Epoch 1501/5000
300/300 [==============================] - 1s - loss: 0.1629 - acc: 0.9759 - val_loss: 0.1578 - val_acc: 0.9874

...

Epoch 1999/5000
300/300 [==============================] - 1s - loss: 0.0943 - acc: 0.9967 - val_loss: 0.0892 - val_acc: 0.9990
Epoch 2000/5000
300/300 [==============================] - 1s - loss: 0.0941 - acc: 0.9967 - val_loss: 0.0890 - val_acc: 0.9987
Epoch 2001/5000
300/300 [==============================] - 1s - loss: 0.1502 - acc: 0.9644 - val_loss: 0.1626 - val_acc: 0.9487

...

Epoch 2999/5000
300/300 [==============================] - 1s - loss: 0.0155 - acc: 0.9995 - val_loss: 0.0123 - val_acc: 1.0000
Epoch 3000/5000
300/300 [==============================] - 1s - loss: 0.0134 - acc: 1.0000 - val_loss: 0.0121 - val_acc: 1.0000
Epoch 3001/5000
300/300 [==============================] - 1s - loss: 0.0134 - acc: 1.0000 - val_loss: 0.0120 - val_acc: 1.0000

...

Epoch 4998/5000
300/300 [==============================] - 1s - loss: 0.0800 - acc: 0.9813 - val_loss: 6.6157e-04 - val_acc: 1.0000
Epoch 4999/5000
300/300 [==============================] - 1s - loss: 6.1272e-04 - acc: 1.0000 - val_loss: 5.0139e-04 - val_acc: 1.0000
Epoch 5000/5000
300/300 [==============================] - 1s - loss: 4.9502e-04 - acc: 1.0000 - val_loss: 4.4888e-04 - val_acc: 1.0000
というようなログが出力されます。汎化性能は無視なので、ひたすらlossを小さくしました。やりすぎですね。

99行目のprint文の出力は

[[  0   0   0   0   0   0   0   0   0   0   0   0   1]
 [  0   0   0   0   0   0   0   0   0   0   0   0   2]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3]
 [  0   0   0   0   0   0   0   0   0   0   0   0   4]
 [  0   0   0   0   0   0   0   0   0   0   0   0   5]
 [  0   0   0   0   0   0   0   0   0   0   0   0   6]
 [  0   0   0   0   0   0   0   0   0   0   0   0   7]
 [  0   0   0   0   0   0   0   0   0   0   0   0   8]
 [  0   0   0   0   0   0   0   0   0   0   0   0   9]
 [  0   0   0   0   0   0   0   0   0   0   0   0  10]

...

 [  0   0   0   0   0   0   0   0   0   0   0   0 298]
 [  0   0   0   0   0   0   0   0   0   0   0   0 299]
 [  0   0   0   0   0   0   0   0   0   0   0   0 300]]
となります。きちんと、途中は全てブランク(=0)が出ていて、
単語の番号が最後に正しく出力されているのが分かります。

というわけで、LSTMは結構過去のことを覚えておいてくれることが分かりました。
そして、とても重たい連想配列ができました。

hg view

いつのまにかMercurialに面白いエクステンションが追加されていました。

hg view

Tck/Tkを使って、履歴表示やファイルの内容の表示を行ってくれます。
TortoiseHGを入れるのが面倒なときに活躍するかも。

.hgrc に

[extensions]
hgk =

を書くだけ。

確認したhgのバージョンは3.1.2です。

ソースコードを色つきHTMLに変換する方法

いつも忘れるので、メモ。

SyntaxHighlighterのようなJavaScriptを使ってソースコードの色づけをする方法もありますが、 NoScriptを使ってスクリプトをブロックする環境で見ている人にとっては許可操作が面倒なので、 HTMLで埋め込むほうが表示が簡単です。

ツールは他にもありますが、ここでは、pygmentize を紹介します。
http://pygments.org/

インストールしてしまえば、あとは使うだけ。

次のようなシェルスクリプトを作って、引数に変換したいソースコードを指定すると、HTMLファイルが作成されます。

1
2
#!/bin/bash
pygmentize -f html -O full -O style=vs,linenos=1 -o $1".html" $1
作成されたHTMLファイルの中身を記事に貼り付ければ完成です。
背景色や境界線を変更したい場合は、行番号とソースコード本体を囲っている<pre>タグにCSSのクラスを指定します。

2017/02/12

MCMC法

Markov Chain Monte Carlo (MCMC) を何のために使うのかが分かる講義(※1)。
https://www.youtube.com/watch?v=-H28H1unn0M

MCMC法をググっても手法ばかりが書かれていて、その目的の説明がすっぽり
抜け落ちているものだらけなので、MCMCって何という人は聞く(見る?)価値あり。

ものすごく短くまとめると、

  • 高次元の確率分布をランダムサンプリングで求める方法がMCMC法
  • そのうちの1つがGibbs Samplingで、条件付き確率分布から ランダムサンプリングできるのであれば、同時確率分布から ランダムサンプリングできるという手法
となる。


もう少しGibbs Samplingについて詳細に書くと、

確率変数の集合をAとして、|A|次元の同時確率分布からランダムサンプリングしたい場合は、
全てのa∈Aに対して、A\{a}の確率変数の値を決めたときに、aの確率分布から
ランダムサンプリングできるのであれば、Gibbs Samplingを使うことができる、

ということ。


(※1) http://qiita.com/shogiai/items/bab2b915df2b8dd6f6f2 からたどり着いた。

2017/02/07

Meta-learning

機械学習におけるメタ学習(Meta-learning)の2015年のレビュー論文を見つけたので、メモ。
Christiane Lemke, Marcin Budka and Bogdan Gabrys, "Metalearning: a survey of trends and technologies," Artf Intell Rev, 44, pp. 117-130, 2015
http://link.springer.com/article/10.1007%2Fs10462-013-9406-y

2016/12/12

ガンマ振動が脳内のアミロイドβを抑制する

弱っているガンマ振動の活動を戻すと、脳内のアミロイドβの蓄積を
抑制できることが報告された([1], 解説が[2,3])。

実験には、ガンマ振動の活動が弱い、アルツハイマー病のマウスモデル(5XFAD)を
使ったとのこと。これを遺伝子操作して光でガンマ振動を発生させられるようにした。
そのマウスにガンマ振動を発生させるとアミロイドβの蓄積が抑制されることが分かった。

ガンマ振動そのものがアミロイドβを消すわけではなく、
ガンマ振動によってミクログリア(microglia)がアミロイドβが蓄積している場所に集まり、
アミロイドβを食べてしまうとのこと。

ガンマ振動を非侵襲で発生させる方法[4]もあり、光で視覚野にガンマ振動を
発生させることができる。この方法を使ってガンマ振動を発生させたところ、
視覚野のアミロイドβの蓄積も抑制できたとのこと。


[1] doi: 10.1038/nature20587
[2] http://www.natureasia.com/ja-jp/nature/highlights/81380
[3] doi: 10.1038/540207a
[4] Fries, P., Nikolic D. & Singer, W. Trends Neurosci. 30, 309-316 (2007)

2016/11/12

WiMAXとWiMAX2+のレイテンシ比較

WiMAXの回線と、WiMAX2+の回線についてpingによるレイテンシの比較を行ってみた。

測定には、Windowsのpingを用い、
  ping -l 64 -n 20 8.8.8.8
を繰り返し実行することで測定した。


WiMAXのプロバイダはauで、
tracertによる経路は
  [測定PC] → [UQ Communications] → [KDDI] → [xxx.bb.kddi.ne.jp] → [google]
である。グローバルIPが割り当てられている。8.8.8.8も含め、間は10段。

WiMAX2+のプロバイダはSo-netで、
tracertによる経路は
  [測定PC] → [ICMPを拒絶する何か] → [どこかのプライベートネット(172.25.x.x)] → [xxx.bb.kddi.ne.jp] → [google]
である。どこかのプライベートネットはSo-net内部のネットワークと思われる。
8.8.8.8も含め、間は13段。


測定結果を見ると、WiMAXのレイテンシの最頻値は、80ms〜90ms。
WiMAX2+のレイテンシの最頻値は、60ms〜70ms。
ただし、WiMAXは横向きの等間隔の縞模様が現れており、 80ms〜90msの倍数のレイテンシが測定される頻度が多いことが分かる。
どちらも上限1000msで切っているが、1000msを超えるレイテンシが
観測されることもある。

なお、測定中もふつうにネットワークを利用しているので、
何かをダウンロードしている間のレイテンシは大きめに測定されている
可能性がある。

ちなみに、図はgnuplotで作成した。

2016/10/29

systemd-nspawn を使ってみる

Debian 8.5 (Jessie)環境でコンテナを作り、
テスト版であるDebian 9 (stretch)を入れてみる[1]。

Dockerは使わず、systemd-nspawnで行う。
これならJessieのパッケージ管理システムに異物を入れずに済む。

以下、作業ログ。

  1. debootstrapをインストール(aptitudeかapt-getで)。
  2. $ mkdir ~/container
  3. $ cd container
  4. ルート権限で
    $ debootstrap stretch ./stretch http://ftp.jp.debian.org/debian
    を実行。内部でchrootを使っているらしく、ルート権限がないと動作しない。

    なお、fakerootとfakechrootを使えば、ルート権限なしでも実行できるようだ[2]。
    しかし、試してみたところ、
    $ fakechroot
    $ fakeroot
    $ export PATH=/usr/sbin:/sbin:$PATH
    $ debootstrap --variant=fakechroot stretch ./stretch http://ftp.jp.debian.org/debian
    
    では残念ながら動作しなかった。詳しくは下のほうで。
  5. 作った環境のルートのパスワードを設定する。これもルート権限が必要。
    $ systemd-nspawn --directory=stretch passwd
    
    パスワード入力前に以下のメッセージが出るが、とりあえず無視。
    /etc/localtime is not a symlink, not updating container timezone.
  6. コンテナを起動する。ネットワークが必要なければ、
    $ systemd-nspawn --directory=stretch --boot
    
    を実行すればよい。

    実行すると以下のようなログが流れる。仮想マシンで起動しているかのようだ!
    Spawning container stretch on /home/xxx/container/stretch.
    Press ^] three times within 1s to kill container.
    /etc/localtime is not a symlink, not updating container timezone.
    systemd 231 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
    Detected virtualization systemd-nspawn.
    Detected architecture x86-64.
    
    Welcome to Debian GNU/Linux stretch/sid!
    
    Set hostname to <debian64>.
    [  OK  ] Listening on Syslog Socket.
    [  OK  ] Reached target Swap.
    [  OK  ] Listening on Journal Socket.
    [  OK  ] Listening on Journal Socket (/dev/log).
    [  OK  ] Started Dispatch Password Requests to Console Directory Watch.
    [  OK  ] Created slice System Slice.
    Mounting POSIX Message Queue File System...
    Starting Remount Root and Kernel File Systems...
    Starting Journal Service...
    [  OK  ] Created slice system-getty.slice.
    Mounting FUSE Control File System...
    [  OK  ] Reached target Encrypted Volumes.
    [  OK  ] Listening on /dev/initctl Compatibility Named Pipe.
    [  OK  ] Reached target Sockets.
    [  OK  ] Reached target Remote File Systems.
    [  OK  ] Started Forward Password Requests to Wall Directory Watch.
    [  OK  ] Reached target Paths.
    Mounting Huge Pages File System...
    [  OK  ] Reached target Slices.
    [  OK  ] Started Remount Root and Kernel File Systems.
    [  OK  ] Reached target Local File Systems (Pre).
    [  OK  ] Reached target Local File Systems.
    Starting Raise network interfaces...
    Starting Load/Save Random Seed...
    [  OK  ] Mounted POSIX Message Queue File System.
    [  OK  ] Mounted FUSE Control File System.
    [  OK  ] Mounted Huge Pages File System.
    [  OK  ] Started Journal Service.
    Starting Flush Journal to Persistent Storage...
    [  OK  ] Started Load/Save Random Seed.
    [  OK  ] Started Flush Journal to Persistent Storage.
    Starting Create Volatile Files and Directories...
    [  OK  ] Started Create Volatile Files and Directories.
    Starting Update UTMP about System Boot/Shutdown...
    [  OK  ] Reached target System Time Synchronized.
    [  OK  ] Started Update UTMP about System Boot/Shutdown.
    [  OK  ] Reached target System Initialization.
    [  OK  ] Reached target Basic System.
    [  OK  ] Started Regular background program processing daemon.
    Starting System Logging Service...
    [  OK  ] Started Daily apt activities.
    [  OK  ] Started Daily Cleanup of Temporary Directories.
    [  OK  ] Reached target Timers.
    [  OK  ] Started Raise network interfaces.
    [  OK  ] Reached target Network.
    Starting Permit User Sessions...
    [  OK  ] Started Permit User Sessions.
    [  OK  ] Started Console Getty.
    [  OK  ] Reached target Login Prompts.
    [  OK  ] Started System Logging Service.
    [  OK  ] Reached target Multi-User System.
    [  OK  ] Reached target Graphical Interface.
    Starting Update UTMP about System Runlevel Changes...
    [  OK  ] Started Update UTMP about System Runlevel Changes.
    
    Debian GNU/Linux stretch/sid debian64 console
    
    debian64 login: root  
    Password: ←ここで先ほど設定したパスワードを入力
    Linux debian64 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64
    
    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    
  7. 終了するときは、ログの最初に書かれているように、
    Press ^] three times
    とすればよい。つまり Ctrl+] を3回連続で押す。
さて、以降の内容は、通常ユーザー権限によるコンテナ起動に関するメモである。
結論から言うと、通常ユーザーでコンテナは起動できず、ルート権限が必要である。

こんなことを試したのは、単に起動するたびにルート権限がいるのは面倒だというだけのこと。
まず、
$ fakeroot
$ systemd-nspawn --directory=stretch --boot
を実行してみたが、
Press ^] three times within 1s to kill container.
clone() failed: Operation not permitted
が表示されて起動できない。

というわけで、4.からfakechrootとfakerootを使った環境で作業をしてみる。
$ fakechroot
$ fakeroot
$ export PATH=/usr/sbin:/sbin:$PATH
$ debootstrap --variant=fakechroot stretch ./fake-stretch http://ftp.jp.debian.org/debian

最後に次のメッセージを出力して止まってしまった。
W: Failure trying to run: chroot /home/xxx/container/fake-stretch dpkg --force-depends --install /var/cache/apt/archives/base-passwd_3.5.40_amd64.deb
W: See /home/xxx/container/fake-stretch/debootstrap/debootstrap.log for details (possibly the package matches is at fault)
debootstrap.logには、
Setting up base-passwd (3.5.40) ...
Can't load '/usr/lib/x86_64-linux-gnu/perl-base/auto/POSIX/POSIX.so' for module POSIX: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.23' not found (required by /home/xxx/container/fake-stretch/usr/lib/x86_64-linux-gnu/perl-base/auto/POSIX/POSIX.so) at /usr/lib/x86_64-linux-gnu/perl-base/XSLoader.pm line 96.
^@ at /usr/lib/x86_64-linux-gnu/perl-base/POSIX.pm line 36.
Compilation failed in require at /usr/share/perl5/Debconf/Template.pm line 7.
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/Template.pm line 7.
Compilation failed in require at /usr/share/perl5/Debconf/Question.pm line 8.
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/Question.pm line 8.
Compilation failed in require at /usr/share/perl5/Debconf/Config.pm line 7.
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/Config.pm line 7.
Compilation failed in require at /usr/share/perl5/Debconf/Log.pm line 10.
Compilation failed in require at /usr/share/perl5/Debconf/Db.pm line 7.
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/Db.pm line 7.
Compilation failed in require at /usr/share/debconf/frontend line 6.
BEGIN failed--compilation aborted at /usr/share/debconf/frontend line 6.
dpkg: error processing package base-passwd (--install):
subprocess installed post-installation script returned error exit status 255
Errors were encountered while processing:
base-passwd
が出力されていた。

無視して、そのまま(fakeroot環境のまま)
systemd-nspawn --directory=stretch --boot
を実行してみたが、
Press ^] three times within 1s to kill container.
clone() failed: Operation not permitted
と表示され、やはり実行できない。

コマンドの実行方法を替えてみる[3]。
$ fakechroot fakeroot debootstrap stretch ./fake-stretch http://ftp.jp.debian.org/debian
しかし、同じエラーで停止する。

そこで、debootstrapの代わりにcdebootstrapを使ってみる。
$ fakechroot fakeroot cdebootstrap stretch ./fake-stretch http://ftp.jp.debian.org/debian 

stretchがないといわれる。testingに替えても、結局、
E: Unknown suite stretch
といわれる。

[4]によると、/usr/share/cdebootstrap/suitesを修正すればよいらしい。
Suite: stretch
Config: generic
Keyring: debian-archive-keyring.gpg
を追加した。これでstretchのパッケージの取得は動作するようになったが、結局、
...
P: Validating wget
P: Retrieving whiptail
P: Validating whiptail
E: Failed to unshare: Operation not permitted
が表示されて、停止。

仕方がないので、ルート権限で
$ cp -r stretch stretch2
$ chown -R xxx stretch2
として、ルート権限で作ったstretchのディレクトリを一般ユーザーxxxに変更して、
$ fakeroot systemd-nspawn --directory=stretch2 --boot
を試してみたが、だめ。
$ fakechroot fakeroot systemd-nspawn --directory=stretch2 --boot
もだめ。
clone() failed: Operation not permitted
というエラーが出る。

[5]によると、cloneには、CAP_SYS_ADMINが必要らしい。
さらに[6]によると、
# Linux 3.8 以降では、ユーザー名前空間の作成にどのケーパビリティも必要としない
ということなので、カーネルのバージョンを見てみると、
$ uname -r
3.16.0-4-amd64
であった。あれ? 3.8以上のように見えるが…。

とりあえず、systemd-nspawnにCAP_SYS_ADMINを付与してみる。
$ setcap "CAP_SYS_ADMIN=eip" /usr/bin/systemd-nspawn

設定されたか確認してみると、
$ getcap /usr/bin/systemd-nspawn
/usr/bin/systemd-nspawn = cap_sys_admin+eip
となっており、設定された。

この状態で一般ユーザーで実行してみる。

$ fakeroot systemd-nspawn --directory=stretch2 --boot
ERROR: ld.so: object 'libfakeroot-sysv.so' from LD_PRELOAD cannot be preloaded (cannot     open shared object file): ignored.
Need to be root.
となり、残念ながら起動できない。

fakeroot-ng [7]というパッケージがあるので、それをfakerootの代わりに使ってみた。
しかし、CAP_SYS_ADMINの設定の有無に関わらず、

$ fakeroot-ng systemd-nspawn --directory=stretch2 --boot
Spawning container stretch on /home/xxx/container/stretch.
Press ^] three times within 1s to kill container.
clone() failed: Operation not permitted
となり、やはり起動できない。

CAP_SYS_ADMINはあきらめ、[8]を参考に、

$ echo 1 > /proc/sys/kernel/unprivileged_userns_clone
を設定してみたが、
$ systemd-nspawn --directory=stretch2 --boot
$ fakeroot systemd-nspawn --directory=stretch2 --boot
$ fakeroot-ng systemd-nspawn --directory=stretch2 --boot
の3つとも動作しない。

やはりルート権限が必要なようだ。


--- 参考 ---
[1] https://lindenberg.io/blog/post/debian-containers-with-systemd-nspawn/
[2] http://rail.hatenablog.jp/entry/2012/10/25/234638
[3] https://github.com/dex4er/fakechroot/wiki
[4] http://d.hatena.ne.jp/embedded/20150926/p1
[5] http://systemd-devel.freedesktop.narkive.com/GchaIOxs/systemd-nspawn-create-container-under-unprivileged-user
[6] https://linuxjm.osdn.jp/html/LDP_man-pages/man7/capabilities.7.html
[7] https://fakeroot-ng.lingnu.com/index.php/Home_Page
[8] http://systemd-devel.freedesktop.narkive.com/GchaIOxs/systemd-nspawn-create-container-under-unprivileged-user

2016/07/10

uniq でフィールド指定をする方法

uniqで特定のフィールドに対して重複するものを除去するには、
オプション -f と -w を使えばよい。

フィールドは、スペースかタブで区切られた文字列。
-wは比較に使用するフィールドのバイト数。
-fが行頭から順に取り除くフィールドの数。

取り除いたフィールドとその次のフィールドとの間のスペースまたはタブは取り除かれない
そのため、-wと組み合わせるときは、-wのバイト数の計算に注意が必要である。

[a.txt]
11 abc ABC
12 abc xXx
234  abb  XXX
456 bbb XXX
234 bbbc YYY

2個目のフィールドの重複を取り除くには、
$ uniq -f1 -w5 a.txt
11 abc ABC
234  abb  XXX
456 bbb XXX
234 bbbc YYY
とする。-w5は、a.txtの5行目の2番目のフィールドとその直前のセパレータを合わせたバイト数が5であるため。

uniqではフィールド幅が可変長のフィールドの重複除去は行いにくい。
仮に-w6にすると、
$ uniq -f1 -w6 a.txt
11 abc ABC
12 abc xXx
234  abb  XXX
456 bbb XXX
234 bbbc YYY
のようになる。これは、比較に使用される文字が
 abc A
 abc x
  abb 
 bbb X
 bbb c
となるため(行頭にスペースが1個入っていることに注意)。

したがって、
[b.txt]
11 abc ABC
12 abc DEF
13 abcd xXx
14 abcde XXX
15 abcde YYY
に対して、2番目のフィールドで重複除去をしようとしても、
$ uniq -f1 -w6 b.txt
11 abc ABC
12 abc DEF
13 abcd xXx
14 abcde XXX
のようになってしまう。これを避けるには、対象とするフィールドを
行末にコピーしてuniqを行ったあと、それを除去すればよい。
例えば、
$ awk '{print $0" "$2}' b.txt | uniq -f3 | sed 's/ [[:graph:]]*$//'
11 abc ABC
13 abcd xXx
14 abcde XXX
のようにする。

日本語も処理できるが、-wがバイト数のため指定しにくい。
[c.txt (UTF-8)]
11 abc ABC
12 abc DEF
13 あさ xXx
14 あさ XXX
15 あみ YYY

例えば、2番目のフィールドの幅を4バイトとすると、
$ uniq -f1 -w4 c.txt
11 abc ABC
13 あさ xXx
となり、「あ」しか比較対象にならない。
なので、
$ awk '{print $0" "$2}' c.txt | uniq -f3 | sed 's/ [[:graph:]]*$//'
11 abc ABC
13 あさ xXx
15 あみ YYY
のように、後ろに移動させてからuniqするのが簡単。

2016/05/28

フォントの高さの修復方法

TeXで使われているフォントをWindowsで使おうとすると、
行の高さ(line-space)が壊れていることがあるので修復してみた。

TeXで使われているフォントは、
https://www.ctan.org/
で入手できるものが多い。

TeXでデフォルトで使われるフォントはComputer Modern Unicode
https://www.ctan.org/pkg/cm-unicode
で、このフォントの高さは正常なのでそのままWindowsのフォントとして使用できる。

しかし、すべての文字についてデフォルトがComputer Modernだというわけではない。
数式で使用されるギリシャ文字にはLatin Modern Math (LM Math)
http://www.gust.org.pl/projects/e-foundry/lm-math
https://www.ctan.org/tex-archive/fonts/lm-math
が用いられている。

残念ながら、この記事を書く時点では、このLatin Modern Mathの
フォントファイルに記録されている行の高さ情報は正しくなく、
上下におよそ3行分ずつ余分な空白が入ってしまう。
WordやLibreOfficeで使おうとするととても使いにくい。


そこで、FontForge
https://fontforge.github.io/en-US/
を使ってフォントの高さの修復を行う。

なお、FontForgeで検索すると日本語で書かれている
http://fontforge.github.io/ja/
がヒットするが、そこからたどりつく
https://sourceforge.net/projects/fontforge/files/fontforge-executables/
にある
FontForgeSetup_2012-07-31_Windows.exe
は使わないほうがよい。古く、日本語が正常に表示されない。

一方、Cygwin版
fontforge_cygwin-20090914.tar.bz2
なら表示が崩れることはない。しかし、fontforgeのGUI表示用にCygwinのXが必要になるので
CygwinのXをインストールしなければならず、また、FontForge自体が古い。


さて、FontForgeの準備ができたら、起動して修正したいフォントを読み込み、
次の手順にしたがってフォントを修正する。

  1. エレメント→フォント情報と進み、設定画面を表示させる。Cygwin版ならElement→Font Infoと進む。 
  2. 左側の一覧から「一般情報(General)」を選択する。 
  3. 高さ(Ascent)と深さ(Descent)の値を覚える。
  4. 左側の一覧から「OS/2」を選択し、「メトリック(Metrics)」タブを選択する。
  5. 「オフセットを指定(Is Offset)」のチェックボックスをすべてはずす。
  6. Win AscentとWin Descentの値をそれぞれ3.で覚えた値に設定する。
  7. 組版上の高さ(Typo Ascent)とhheaテーブルでの高さ(HHead Ascent)を3.で覚えた高さの値に設定する。
  8. 組版上の深さ(Typo Descent)とhheaテーブルでの深さ(HHead Descent)を3.で覚えた深さの値を負にした値に設定する。例えば、深さが194であれば-194を設定する。
  9. OKボタンを押す。
  10. ファイル(File)→フォントを出力(Generate Fonts)と進む。
  11. 出力形式を指定する。今、修正しようとしているLatin Modern MathはOpenTypeフォントなので、OpenTypeを選択する。
  12. 生成ボタンを押す(フォントによっては途中で警告表示がでるかもしれない)。
  13. 生成したフォントファイルのプレビュー(エクスプローラで右クリック→プレビュー)を表示すると、無駄な行間スペースがなくなっていることが確認できる(はず)。

以上で行の高さを修正したフォントが得られるので後はシステムにインストールするだけである。

フォントの高さの設定に関しては、以下を参考にした。
http://fontforge.github.io/faq.html#linespace
https://fontforge.github.io/ja/fontinfo.html#TTF-Metrics
http://designwithfontforge.com/en-US/Line_Spacing.html

2016/05/15

d3.jsで横向きの棒グラフ

JavaScriptで棒グラフを作成してみた。
d3.jsを使う。使い方は、主に、
http://ja.d3js.info/alignedleft/tutorials/d3/
を参考にした。

まずはデータを準備する。ファイル名は、test.datとする。
スペース区切りのデータである。1列目が項目名、2列目が棒グラフにする値である。
3列目は棒にマウスが移動すると表示される値とする。

Tokyo 300 0.1
Kyoto 100 0.5
Osaka 150 1.2
Nagoya 200 0.3
Yokohama 250 0.7
このデータから横向きの棒グラフ

を作成する。

そのためのHTMLファイルは以下の通りである。
ファイル名は任意で、test.datと同じディレクトリに作成する。
このファイルをブラウザで表示すると、横向きの棒グラフが表示される。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <title>D3 Test</title>
    <script type="text/javascript" src="d3/d3.js"></script>
    <style type="text/css">
      .axis path, .axis line {
        fill: none;
        stroke: black;
      }
      .axis text {
        font-family: sans-serif;
        font-size: 11px;
      }
    </style>
  </head>
  <body>
    <script type="text/javascript">
      var w = 500; // Width of a SVG canvas
      var h = 100; // Height of a SVG canvas
      var axisHeight = 20; // Height of a horizontal axis
      var barPadding = 3;  // Padding between bars
      var svg = d3.select("body")
        .append("div")
        .append("svg")
        .attr("width", w)
        .attr("height", h);
      d3.text("./test.dat", function(error, text) { // load a data file
        // Parse space-separated values
        var data = d3.dsv(" ", "text/plain").parseRows(text, function(d) {
          return { name: d[0], value: d[1], ratio: d[2] }; // Parse one line
        });
        
        // Make a tooltip showing data.ratio as text when mouseover
        var tip = svg.append("text")
          .attr("font-size", "11px")
          .attr("text-anchor", "start")
          .attr("dominant-baseline", "middle")
          .attr("visibility", "hidden");

        // Draw region of y-label
        var yLabelOffset = 5; // Padding between a label and a bar
        var yLabelMaxWidth = 0;
        var yLabel = svg.selectAll("text")
          .data(data, function(d, i){
            if(d === undefined){
              return i;
            }
            return i+1;
          })
          .enter()
          .append("text")
          .text(function(d) {
            return d["name"];
          })
          .attr("y", function(d, i){
            return (i+0.5)*(h-axisHeight)/data.length;
          })
          .attr("font-size", "11px")
          .attr("text-anchor", "end")
          .attr("dominant-baseline", "middle")
          .each(function(d){
            yLabelMaxWidth = Math.max(this.getBBox().width, yLabelMaxWidth);
          })
          .attr("x", yLabelMaxWidth);
        yLabelMaxWidth += yLabelOffset;

        // Make a horizontal scale
        // (last '-10' makes room for drawing axis labels)
        var xScale = d3.scale.linear()
          .domain([0, 500])
          .range([0, w - yLabelMaxWidth - 10]);
        
        // Make an axis with xScale
        var xAxis = d3.svg.axis().scale(xScale).orient("bottom");

        // Make horizontal bars
        svg.selectAll("rect")
          .data(data) // Load data
          .enter()    // Make placeholders
          .append("rect")
          .attr("x", yLabelMaxWidth)
          .attr("y", function(d, i) {
            return i*(h - axisHeight)/data.length + barPadding/2;
          })
          .attr("width", function(d){return xScale(d["value"])})
          .attr("height", (h - axisHeight)/data.length - barPadding)
          .attr("stroke", function(d) {
            return "rgb(0, 0, " + (d["value"]) + 50 + ")";
          })
          .attr("stroke-width", 1)
          .attr("fill", function(d) {
            return "rgb(0, 0, " + (d["value"]) + ")";
          })
          .on("mouseover", function(d, i){
            return tip.attr("visibility", "visible")
            .text(d["ratio"])
            .attr("x", yLabelMaxWidth + xScale(d["value"]) + 3 + "px")
            .attr("y", ((i + 0.5)*(h - axisHeight)/data.length) + "px");
          })
          .on("mouseout", function(d){
            return tip.attr("visibility", "hidden");
          });
        svg.append("g")
          .attr("class", "axis")  // Define the class "axis"
          .attr("transform", "translate(" + yLabelMaxWidth + ","
            + (h - axisHeight + barPadding/2) + ")")
          .call(xAxis);
      });
    </script>
  </body>
</html>

2016/01/20

マグネシア

マグネシウムの語源は、地名の「マグネシア」だそうだ。

マグネシアの名前は
・ギリシャのマグネシア半島
・小アジアのマグネシア地方(現在のトルコのマニサ)
の2箇所にみられる。

小アジアのマグネシアは、古代ギリシャのテミストクレスが
晩年(紀元前466〜459年)に過ごした都市だ。

紀元前190年に「マグネシアの戦い」があった場所でもある。

ちなみに、そのころ日本は弥生時代。
https://ja.wikipedia.org/wiki/%E5%BC%A5%E7%94%9F%E6%99%82%E4%BB%A3

2016/01/13

Mercurial largefiles の管理下のファイルの確認方法

Mercurialのlargefilesエクステンションを使用しているリポジトリで、
ラージファイルとして扱われているファイルは、

$ hg locate

で確認できます。ファイルのパスの最初が .hglf であれば、
それがラージファイルです。それ以外が通常のファイルですので、
簡単に区別できます。


.hglfだけを一覧表示したい場合は、

$ hg locate "set:.hglf**"

で表示できます。

2015/08/20

脳紋

特定の言葉に対するEEGの反応を使って、指紋のように個人認証ができるようになる可能性があるそうだ。
ただし、現時点での精度はまだまだである。

Armstrong et. al., "Brainprint: Assessing the uniqueness, collectability, and permanence of a novel method for ERP biometrics," Volume 166, Pages 59-67, 2015
(http://www.sciencedirect.com/science/article/pii/S0925231215004725)

記事
http://www.itmedia.co.jp/news/articles/1506/04/news081.html

2015/07/30

磁気センサー

磁場の強さは、
http://www.nips.ac.jp/~nagata/MEG/MEGoutline.pdf
によると、

10^-4 〜 10^-5 地磁気
10^-5 〜 10^-7 都市雑音
10^-9 〜 10^-10 心臓
10^-10 〜 10^-11 筋肉
10^-11 〜 10^-12 脳(α波)
10^-12 〜 10^-13 脳(視覚反応)

とのこと。そのため、用途によってセンサーにも低感度から高感度まで色々とあるようだ。


1. 地磁気
検索すると色々と出てくるが、例えば
YAS532B (http://www.yamaha.co.jp/product/lsi/magnetic_sensor/)
だと、分解能が0.15μTであるので、地磁気から都市雑音まで検出できそうだ。


2. 脳(α波)
NISTで開発されているセンサーの感度は1pTとのこと。
プレスリリースと関連記事が以下。
http://www.nist.gov/pml/div688/brain-041912.cfm
http://www.medtecjapan.com/ja/news/2012/05/08/221
http://sustainablejapan.net/?p=1486

他にも東北大学, コニカミノルタ株式会社, 科学技術振興機構
で開発されているセンサーがあり、こちらも
http://www.jst.go.jp/pr/announce/20150723/
の図から読み取るとpTレベルの感度があるようだ。


3. 脳(視覚反応)
SQUIDと呼ばれるデバイスがある。感度はfTレベル。
ただし、磁気シールドルームや液体ヘリウムが必要。
以下を参考。
https://en.wikipedia.org/wiki/SQUID
http://www.yokogawa.co.jp/me/meg/whatmeg/me-whatmeg1-ja.htm

2015/07/19

Kurz Gesagt にシドニアが!?

科学の様々な分野における基礎的な内容を概説する動画が公開されています。
Kurz Gesagt - In a Nutshell
http://kurzgesagt.org
https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q


そのなかのひとつの動画に
The Fermi Paradox
https://www.youtube.com/watch?v=sNhhvQGsMEc
がありますが、なんと 00:57〜01:07 にシドニアとおぼしき宇宙船が出現。
こういう形の宇宙船は一般的な形なのか、それとも、製作者がファンなのか、
どっちなのでしょうね。

http://animeanime.jp/article/2014/06/19/19150.html
によると、2014年に北米やヨーロッパでNetflixが配信したようですので、
後者なのかもしれません。

鳥獣戯画制作キットで遊んでみた

鳥獣戯画制作キットbeta
http://gigamaker.jimdo.com/
で鳥獣戯画が簡単に作製できるとのことで、
試しにてきとーに作ってみた。

スタンプで絵を描くのと同じですな。

来年の干支は申(さる)なので、年賀状にちょうどよさそう。

2014/12/11

SOLID 原則

ソフトウェアの設計の5つの原則。
ときどき、それぞれの名前を忘れるのでメモ。

1. SRP : Single Responsibility Principle (単一責任の原則)
2. OCP : Open-Closed Principle (オープン・クローズドの原則)
3. LSP : Liskov Substitution Principle (リスコフの置換原則)
4. ISP : Interface Segregation Principle (インターフェイス分離の原則)
5. DIP : Dependency Inversion Principle (依存関係逆転の原則)

(参考:ISBN4-7973-2336-1, ISBN978-4-87311-614-3)

2014/08/03

ask のイメージ

askの日本語訳を調べると、
1. 尋ねる
2. 依頼する
3. 請求する
4. 招待する
5. 必要とする
が書かれているが、いずれも日本語の観点では類似性が乏しい。
askが表す意味の範囲と、日本語訳の個々の単語が表す意味の範囲が
うまい具合にずれているためであろう。

日本語訳から想起すると、ask x は、
「相手または何かからxに関する何かを引き出すようなイメージ」
に近いのではないだろうか。
さらに、引き出す行為に対して「お願いする」という雰囲気がくっついている。

こう考えると、
1. 尋ねる ← 相手からxに関する情報を引き出す。
2. 依頼する ← 相手からxに関する行動を引き出す。
3. 請求する← 相手から代金(=x)を引き出す。
4. 招待する ← xを自分のところに引き出す。
5. 必要とする ← xを自分のところに引っ張ってくる。
のようになり、範囲は広いが1つの単語で表せてもおかしくはない。

例えば、
I ask a job of you
は、
あなたに属する、仕事に対する行動を引き出す。→ あなたに仕事を依頼する。
となり、
I ask a question of him
は、
彼に属する、質問に関する情報を引き出す。→ 彼に質問する。
となる。

ところで、「〜に」を表すためにtoではなくてofを使うが、
これは、上の例にあるように「〜に属している何か」を引き出すので、
ofになるのだと理解することができる。

仮にtoを用いると、引っ張り出した「何か」の行き先がわからなくなり、
意味不明な文章となる。


………


ほんとかな!?

2014/07/21

電磁波が渡り鳥の磁気コンパスに影響を与えているかも?

メモ。
doi:10.1038/nature.2014.15176
doi:10.1038/nature13334

人間の脳にも磁鉄鉱(Fe3O4)があるそうだ。
Joseph L. Kirschvink et al. "Magnetite biomineralization in the human brain," 1992
(http://www.pnas.org/content/89/16/7683.full.pdf)

2014/01/26

buildbot + mercurial の使い方

次のような設定を行うと、リポジトリ変更時に自動的にビルドされるようになる。
buildbotはver.0.8.6を使用した。
buildbot関連のファイルを置くディレクトリを$workとする。

1. マスター用の設定ファイルを作る

cd $work
buildbot create-master master
cd master
cp master.cfg.sample master.cfg

2. master.cfg を変更する

2.1. CHANGESOURCES を変更する

もともとあったGitPollerを削除し、次の2行を追加する。
from buildbot.changes import pb
c['change_source'] = pb.PBChangeSource(port=9988, user='changeuser', passwd='password_xxx')
ただし、port, user, passwdは適切な値に変更する。

2.2. SCHEDULERS を変更する

SingleBranchScheduler の引数を変更する。
c['schedulers'].append(SingleBranchScheduler(
                         name="all",
                         branch="default",
                         builderNames=["runtests"]))
ブランチを使っていないなら、branchにはdefaultと指定する。
branch名の指定を誤ると、mercurialからアップデートが 通知されるだけになり、ビルドは実行されなくなる。

2.3. BUILDERS を変更する

git関連を削除して、次の行を追加する。
from buildbot.steps.source.mercurial import Mercurial
factory.addStep(Mercurial(repourl='/xxx/yyy/bb-test', mode='full',
                          method='fresh', branchType='inrepo'))
factory.addStep(ShellCommand(command=["./make.sh"]))
repourl はリポジトリのパス。
make.sh はビルドするためのスクリプト。
Makefileを使用しているなら、単にmakeでもよい。

2.4. リポジトリの設定をする

.hg/hgrc に次の内容を追加する。
[hooks]
changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook

[hgbuildbot]
master = localhost:9988
auth = changeuser:password_xxx

3. slave を作る

cd $work
buildslave create-slave slave master example-slave pass

4. 動作させる

cd $work
buildbot start master
buildslave start slave
これで、リポジトリに変更をpushするだけで、変更が反映されたソースコードで 自動的にビルドされるようになる。

2013/11/16

bash で二重に trap

Q. 最初のスクリプトでtrapを呼び、そこから呼び出したスクリプト内でもtrapを呼ぶとどうなるのか?

A. 両方が呼び出される。以下、実験結果。

[test.sh]
#!/bin/bash
trap "echo xxx" 2
./sub.sh
sleep 5

[sub.sh]
#!/bin/bash
trap "echo yyy" 2
sleep 5

test.shを実行して、5秒以内にCtrl+Cを押すと、端末に
^Cyyy
xxx
が表示される。

5秒から10秒の間にCtrl+Cを押すと、端末に
^Cxxx
が表示される。



ここにtrapの解説がある。
http://shellscript.sunone.me/signal_and_trap.html

2013/10/19

perl で連想配列に配列を記録する方法

いつも忘れるのでメモ。

%x2y = ();
# 読み込み
while(<>)
{
    $_ =~ s/[\r\n]//g;   # 改行除去
    @c = split / /;   # スペースで分割
    push(@{$x2y{$c[0]}}, $c[1]); # キーが$c[0]の配列に$c[1]を追加
}
# 表示
while(($k,$v)=each(%x2y))
{
    print $k." --> ".join(", ",@$v)."\n";
}

このスクリプトに標準入力から

a a
b b
b c
c d
c e
c f

を入力すると、

c --> d, e, f
a --> a
b --> b, c

が得られる。

Brzozowski さんの読み方

http://d.hatena.ne.jp/m-hiyama/20131017/1381998987
によると、「ゾゾウスキイ」とのこと。

しかしよくよく音声を
http://ja.forvo.com/word/brzozowski/
で聞いてみると最初のzが発音されず、

ブロゾウスキー
プロゾウスキー
ブロゾフスキー
プロゾフスキー

のどれかに近いように聞こえる。

「ゾ」にアクセントをおいて発音すると
forvoにある音声と似たような発音ができそうだ。

2013/05/30

読めない苗字

こんな苗字を見つけた。

Ljolje

ここにたくさんある。
http://www.linkedin.com/pub/dir/+/Ljolje

どうやらクロアチア語圏かそのあたりの苗字のようだ。

http://croatia.kororo.jp/lang/01accent.html
によると、Ljは「リュ」の音が近いようなので、
仮にクロアチア語だとしてカタカナ読みをすると、

「リョーリュェ」とか「リョーレ」

と読めばいいのだろうか。

2013/04/21

RVOと右辺値参照

C++11のお話。

RVO(Return Value Optimization)と右辺値参照が競合する場合は、
RVOが優先される。

#include <iostream>
class test
{
public:
  test(void) : val(0)
  {
    std::cout << "ctor with no args" << std::endl;
  }
  ~test(void)
  {
    std::cout << "dtor : " << val << std::endl;
  }
  test(int a) : val(a)
  {
    std::cout << "ctor : " << a << std::endl;
  }
  test(const test &) = delete; // undef copy constructor
  test(test &&a) : val(a.val)
  {
    std::cout << "move ctor : " << val << std::endl;
    a.val = -val;
  }
  const test& operator=(test &&a)
  {
    std::cout << "move oper= " << a.val << std::endl;
    val = a.val;
    a.val = -val;
    return *this;
  }
  
private:
  int val;
};

test ret_test(int a)
{
  test t(a);
  return t;
}

int main(void)
{
  {
    test t1 = ret_test(1); // RVO
    t1 = ret_test(2); // rvalue reference
  }
  std::cout << "---" << std::endl;
  {
    test t3 = std::move(ret_test(3)); // rvalue reference by std::move
  }
  return 0;
}



処理した結果は次のようになる。g++ ver.4.7.2 と Debian clang version 3.0-6.2
のどちらでも同じ結果となった。

ctor : 1
ctor : 2
move oper= 2
dtor : -2
dtor : 2
---
ctor : 3
move ctor : 3
dtor : -3
dtor : 3

2013/03/25

LibreOffice で条件付き書式

条件付き書式で数値ではなく文字列を指定するには、

[セルの値が] [次の値に等しい] "ABC"

のようにすればよい。この例の場合、セルの値がABCの場合に
条件を満たす。指定したい文字列を " で括る必要がある。
' で括っても動作しないし、単に文字列を書いただけでも動作しない。

2013/02/08

[Python] numpy の行列

numpy の行列の各要素へのアクセス方法をいろいろと試した。
まず、numpyを読み込んで、npという名前でアクセスできるようにする。

>>> import numpy as np
さらに、行列Mを作成する。
>>> M=np.matrix([[1,2,3],[4,5,6],[7,8,9]])
1行目1列目が1、1行目2列目が2である。


2行目を表示する。
>>> print M[1]
[[4 5 6]]

2行目3列目の値を表示する。
>>> print M[1,2]
6

以降、i行列j列目を(i,j)と書くこととする。

(3,2)と(1,2)の成分を取り出す。
>>> print M[[2,0],[1,1]]
[[8 2]]
(3,1)と(2,2)の成分を取り出すわけではないことに注意。

(1,3)と(2,2)、(3,1)の成分を取り出す。
>>> print M[[0,1,2],[2,1,0]]
[[3 5 7]]

(2,3)と(2,2)、(2,1)の成分を取り出す。
>>> print M[[1,1,1],[2,1,0]]
[[6 5 4]]
省略して書くこともできる。
>>> print M[1,[2,1,0]]
[[6 5 4]]
これも同様。
>>> print M[[1],[2,1,0]]
[[6 5 4]]

次の書き方はエラーとなる。
>>> print M[[1,2],[2,1,0]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.7/numpy/matrixlib/defmatrix.py", line 305, in __getitem__
    out = N.ndarray.__getitem__(self, index)
ValueError: shape mismatch: objects cannot be broadcast to a single shape

(3,2)と(2,2)、(1,2)の成分を取り出す。
>>> print M[[2,1,0],[1,1,1]]
[[8 5 2]]

同様に省略できるが、形式が変わる。
>>> print M[[2,1,0],1]
[[8]
 [5]
 [2]]

次の3つはすべて同じ結果となる。
>>> print M[[2],1]
[[8]]
>>> print M[[2],[1]]
[[8]]
>>> print M[2,[1]]
[[8]]

しかし、[]が[]内にないと、スカラーの値が表示される。
>>> print M[2,1]
8

次の2つは同じ。
>>> print M[np.arange(3),np.arange(3)]
[[1 5 9]]
>>> print M[[0,1,2],[0,1,2]]
[[1 5 9]]

1行目と2行目を取り出す。
>>> print M[[0,1]]
[[1 2 3]
 [4 5 6]]

転置をとる。
>>> print M.T
[[1 4 7]
 [2 5 8]
 [3 6 9]]

2013/02/01

mnist.pkl.gz の読み込み方

http://deeplearning.net/tutorial/gettingstarted.html
に記載されている MNIST Dataset
http://deeplearning.net/data/mnist/mnist.pkl.gz
のデータ構造は次のようになっている。

[mnist.pkl] = [[train_set], [valid_set], [test_set]]
[*_set] = [[*_setの入力], [*_setの正解]]
[*_setの入力] = [[784個の浮動小数点の配列], ... ]
[*_setの正解] = [[0〜9の整数], ... ]

ここで、[784個の浮動小数点の配列]は28x28の手書き数字画像、
*_setはtrain_set、valid_set、test_setのいずれかである。

読み込んで端末に表示してみるコード(load.py)は次の通り。

import cPickle, gzip, numpy, sys
if len(sys.argv) != 2:
  quit()
data_index=int(sys.argv[1])
f=gzip.open('../data/mnist.pkl.gz','rb')
train_set, valid_set, test_set=cPickle.load(f)
train_set_x, train_set_y=train_set # setの中身が
for i in range(data_index,data_index+1):
  for y in range(0,28):
    for x in range(0,28):
      if train_set_x[i][y*28+x]<0.5:
        sys.stdout.write(" ")
      elif train_set_x[i][y*28+x]<0.8:
        sys.stdout.write("+")
      else:
        sys.stdout.write("*")
    sys.stdout.write("\n")
  print "correct =",train_set_y[i]
  print "--------------------------------"


8番目のデータを表示する実行例は次の通り。
$ python load.py 7





              ******+
          +**********+
         +************
          ***+++++****
                  ***+
                  ***+
                 +***
               *****+
           +++*****
         *********+
         **********
                +**
                 **
                 **
                ***
      +*       ****
     ***++++++***+
     ***********+
      +*******+
        **+



correct = 3
--------------------------------
データを読めていることが確認できる。

2013/01/30

[Python] theano.tensor.grad

theano.tensor で書いた関数を自動的に微分することができる。
ただし、関数で計算した結果得られる値はスカラーでなければならない。
ベクトルや行列になっているとエラーとなる。

gradを使った例を次に示す。

import numpy
import theano
import theano.tensor as T

x=T.dscalar('x')
v=T.dvector('v')
M=T.dmatrix('M')

y1=x**3
y2=T.dot(v,v)*x
y3=T.sum(T.dot(M,M))

gy1=T.grad(y1,x)
gy2=T.grad(y2,v)
gy3=T.grad(y3,M)

f1=theano.function([x],gy1)
f2=theano.function([x,v],gy2)
f3=theano.function([M],gy3)

print "f1  :",theano.pp(f1.maker.fgraph.outputs[0])
print "f2  :",theano.pp(f2.maker.fgraph.outputs[0])
print "f3  :",theano.pp(f3.maker.fgraph.outputs[0])

print "f1(2) =",f1(2)
print "f2(2,[3,5]) =",f2(2,[3,5])
print "f3([[1,2],[3,4]]) =",f3([[1,2],[3,4]])

実行すると、
f1  : Elemwise{Composite{[mul(i0, sqr(i1))]}}(TensorConstant{3.0}, x)
f2  : Elemwise{Composite{[add(*1 -> mul(i0, i1), *1)]}}(x, v)
f3  : gemm_inplace(_dot22(alloc(TensorConstant{(1, 1) of 1.0}, Shape_i{0}(M), Shape_i{1}(M)), M.T), TensorConstant{1.0},
 M.T, alloc(TensorConstant{(1, 1) of 1.0}, Shape_i{0}(M), Shape_i{1}(M)), TensorConstant{1.0})
f1(2) = 12.0
f2(2,[3,5]) = [ 12.  20.]
f3([[1,2],[3,4]]) = [[  7.  11.]
 [  9.  13.]]
が得られる。f1 の出力を見ると、mul が掛け算で sqr が2乗、i0=TensorConstant{3.0}、
i1=x であるから、y1 を x で微分した結果である 3*x^2 が得られていることがわかる。
f2 と f3 は複雑すぎて読み方がわからないが、具体的な値を入れた結果は
正しく出力されている。



エラーが出る例として、ベクトルが戻り値になるような関数を試してみる。
import numpy
import theano
import theano.tensor as T

x=T.dscalar('x')
v=T.dvector('v')
y=v*x
gy=T.grad(y,x)
すると、
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    gy=T.grad(y,x)
  File "/usr/local/lib/python2.7/dist-packages/theano/gradient.py", line 411, in grad
    raise TypeError("cost must be a scalar.")
TypeError: cost must be a scalar.
といわれて微分できない。

2013/01/24

[Python] theano.tensor.fill

fill の挙動がわからないので調べてみた。

import numpy
import theano
import theano.tensor as T

x=T.dscalar('x')
xc=T.dscalar('xc')
y1=3*x
y2=xc*x
y3=T.fill(xc,3)*x

f1=theano.function([x],y1)
f2=theano.function([x,xc],y2)
f3=theano.function([x,xc],y3)

print "x=",theano.pp(x)
print "y1=",theano.pp(y1)
print "y2=",theano.pp(y2)
print "y3=",theano.pp(y3)
print "f1=",theano.pp(f1.maker.fgraph.outputs[0])
print "f2=",theano.pp(f2.maker.fgraph.outputs[0])
print "f3=",theano.pp(f3.maker.fgraph.outputs[0])
print "f1(2)=",f1(2)
print "f2(2,3)=",f2(2,3)
print "f3(2,3)=",f3(2,3)
print "f3(2,100)=",f3(2,100)

実行すると、
x= x
y1= (TensorConstant{3} * x)
y2= (xc * x)
y3= (fill(xc, TensorConstant{3}) * x)
f1= (TensorConstant{3.0} * x)
f2= (xc * x)
f3= (TensorConstant{3.0} * x)
f1(2)= 6.0
f2(2,3)= 6.0
f3(2,3)= 6.0
f3(2,100)= 6.0
が得られた。

f3(2,3)もf3(2,100)も同じ値を返していることから、
fill は第1引数を第2引数の値に固定した結果を返しているように見える。
何に使うのだろうか。

ところで、
f3=theano.function([x,xc],y3)
f3=theano.function([x],y3)
に置き換えると
theano.gof.fg.MissingInputError: ('An input of the graph, used to compute Elemwise{second,no_inplace}(xc, TensorConstant{3}), was not provided and not given a value', xc)
というエラーが出力される。
値が与えられてない変数が残っていると、たとえfillを使って値を与えていても
関数化するのは無理なようだ。

2013/01/20

流行のDNN

なんか、DNNが流行っているらしい。
というわけで、探してみると日本語の概要があった。
http://www.slideshare.net/mokemokechicken/pythondeep-learning
http://www.slideshare.net/tushuhei/121227deep-learning-iitsuka

Python+Theanoを使うと簡単なそうな。
実装例が
http://deeplearning.net/tutorial/
にあるので、まずは準備で、
http://deeplearning.net/tutorial/gettingstarted.html
に書いてあるとおり、githubからcloneでソースを取得する。

チュートリアルどおり、実験用の手書き数字画像としてMNIST datasetをダウンロードする。
gitで取ってきたなかの、
data/download.sh
を実行するとデータがダウンロードされる。

また、

$ cd doc
$ make
を実行すると チュートリアルのpdf版が html/deeplearning.pdf に作成される。

使い方はまだよく調べていないが、次のように実行すると、
とりあえずテスト実行できるようだ。
$ python
>>> import test
>>> test.speed()


実行した結果は、以下。一部省略。
-- logistic_sgd のログの一部(float64) --
epoch 30, minibatch 83/83, validation error 8.031250 %
     epoch 30, minibatch 83/83, test error of best model 7.843750 %
Optimization complete with best validation score of 8.031250 %,with test performance 7.843750 %
The code run for 30 epochs, with 1.299264 epochs/sec
The code for file logistic_sgd.pyc ran for 23.1s

-- logistic_cg のログの一部(float64) --
validation error 7.927083 %
Optimization complete with best validation score of 7.927083 %, with test performance 8.041667 %
The code for file logistic_cg.pyc ran for 53.4s

-- mlp のログの一部(float64) --
epoch 5, minibatch 2500/2500, validation error 7.300000 %
     epoch 5, minibatch 2500/2500, test error of best model 7.590000 %
Optimization complete. Best validation score of 7.300000 % obtained at iteration 14999, with test performance 7.590000 %
The code for file mlp.pyc ran for 2.88m

-- convolutional_mlp のログの一部(float64) --
epoch 5, minibatch 100/100, validation error 6.430000 %
     epoch 5, minibatch 100/100, test error of best model 6.920000 %
Optimization complete.
Best validation score of 6.430000 % obtained at iteration 599,with test performance 6.920000 %
The code for file convolutional_mlp.pyc ran for 2.26m

-- dA のログ(float64) --
... loading data
Training epoch 0, cost  63.2891694201
Training epoch 1, cost  55.7866565443
The no corruption code for file dA.pyc ran for 2.05m
Training epoch 0, cost  81.7714190632
Training epoch 1, cost  73.4285756365
The 30% corruption code for file dA.pyc ran for 2.06m

-- SdA のログ(float64) --
... loading data
... building the model
... getting the pretraining functions
... pre-training the model
Pre-training layer 0, epoch 0, cost  194.503144937
Pre-training layer 1, epoch 0, cost  695.507788509
Pre-training layer 2, epoch 0, cost  529.03645135
The pretraining code for file SdA.pyc ran for 6.89m
... getting the finetuning functions
... finetunning the model
epoch 0, minibatch 166/166, validation error 14.868687 %
     epoch 0, minibatch 166/166, test error of best model 15.727273 %
epoch 1, minibatch 166/166, validation error 11.595960 %
     epoch 1, minibatch 166/166, test error of best model 11.717172 %
Optimization complete with best validation score of 11.595960 %,with test performance 11.717172 %
The training code for file SdA.pyc ran for 6.70m

-- DBN のログ(float64) --
... loading data
... building the model
... getting the pretraining functions
... pre-training the model
Pre-training layer 0, epoch 0, cost  -165.566548661
Pre-training layer 1, epoch 0, cost  -620.030667461
Pre-training layer 2, epoch 0, cost  -133.876169806
The pretraining code for file DBN.pyc ran for 7.84m
... getting the finetuning functions
... finetunning the model
epoch 1, minibatch 166/166, validation error 28.373737 %
     epoch 1, minibatch 166/166, test error of best model 29.848485 %
epoch 2, minibatch 166/166, validation error 20.272727 %
     epoch 2, minibatch 166/166, test error of best model 21.424242 %
Optimization complete with best validation score of 20.272727 %,with test performance 21.424242 %
The fine tuning code for file DBN.pyc ran for -64.90m

-- rbm のログ(float64) --
... loading data
WARNING (theano.tensor.opt): Your current code is fine, but Theano versions prior to 0.5rc2 might have given an incorrect result. To disable this warning, set the Theano flag warn.subtensor_merge_bug to False.

Training epoch 0, cost is  -53.1045703345
Training took 17.727500 minutes
WARNING (theano.tensor.opt): Your current code is fine, but Theano versions prior to 0.5rc2 might have given an incorrect result. To disable this warning, set the Theano flag warn.subtensor_merge_bug to False.
 ... plotting sample  0
['logistic_sgd', 'logistic_cg', 'mlp', 'convolutional_mlp', 'dA', 'SdA', 'DBN', 'rbm']
float64 times [   24.00578618    55.60583591   175.75342607   136.53151321   248.71974111
   823.29348183   874.02775431  1079.12984514]
float64 expected [10.300000000000001, 23.699999999999999, 78.099999999999994, 73.700000000000003, 116.40000000000001, 346.89999999999998, 381.89999999999998, 558.10000000000002]
float64 % expected/get [ 0.42906322  0.42621426  0.44437256  0.53980212  0.46799663  0.42135643
  0.43694265  0.51717595]

-- float32の場合の最後の方のログ --
 ... plotting sample  0
['logistic_sgd', 'logistic_cg', 'mlp', 'convolutional_mlp', 'dA', 'SdA', 'DBN', 'rbm']
float32 times [   21.94568563    49.98527789   177.91128731   136.48723054   291.68081236
  1048.11308694  1128.05673623  1302.78659558]
float32 expected [11.6, 29.600000000000001, 47.200000000000003, 66.5, 71.0, 191.19999999999999, 226.80000000000001, 432.80000000000001]
float32 % expected/get [ 0.5285777   0.59217436  0.26530076  0.48722507  0.24341677  0.18242306
  0.20105372  0.33221097]
float64/float32 [ 1.09387269  1.11244427  0.98787114  1.00032445  0.85271204  0.78550062
  0.77480833  0.82832434]

Duplicate the timing to have everything in one place
['logistic_sgd', 'logistic_cg', 'mlp', 'convolutional_mlp', 'dA', 'SdA', 'DBN', 'rbm']
float64 times [   24.00578618    55.60583591   175.75342607   136.53151321   248.71974111
   823.29348183   874.02775431  1079.12984514]
float64 expected [10.300000000000001, 23.699999999999999, 78.099999999999994, 73.700000000000003, 116.40000000000001, 346.89999999999998, 381.89999999999998, 558.10000000000002]
float64 % expected/get [ 0.42906322  0.42621426  0.44437256  0.53980212  0.46799663  0.42135643
  0.43694265  0.51717595]
float32 times [   21.94568563    49.98527789   177.91128731   136.48723054   291.68081236
  1048.11308694  1128.05673623  1302.78659558]
float32 expected [11.6, 29.600000000000001, 47.200000000000003, 66.5, 71.0, 191.19999999999999, 226.80000000000001, 432.80000000000001]
float32 % expected/get [ 0.5285777   0.59217436  0.26530076  0.48722507  0.24341677  0.18242306
  0.20105372  0.33221097]
float64/float32 [ 1.09387269  1.11244427  0.98787114  1.00032445  0.85271204  0.78550062
  0.77480833  0.82832434]
expected float64/float32 [ 0.46934054  0.47413961  0.43898283  0.53997725  0.39906636  0.33097574
  0.3385468   0.42838942]
ERROR (theano.sandbox.cuda): nvcc compiler not found on $PATH. Check your nvcc installation and try again.

 ... plotting sample  0
['logistic_sgd', 'logistic_cg', 'mlp', 'convolutional_mlp', 'dA', 'SdA', 'DBN', 'rbm']
gpu times [   23.64237881    50.57395744   185.60482621   139.12935448   289.82814217
  1050.09374905  1123.013515    1268.43072391]
gpu expected [3.0766348799999998, 7.5552349100000002, 18.992267850000001, 9.5999999999999996, 24.130070450000002, 20.399999999999999, 56.0, 302.60000000000002]
gpu % expected/get [ 0.1301322   0.14938983  0.10232637  0.06900054  0.08325648  0.01942684
  0.04986583  0.2385625 ]
float64/gpu [ 1.01537102  1.09949545  0.94692272  0.98132787  0.85816284  0.78401903
  0.77828783  0.85075978]

Duplicate the timing to have everything in one place
['logistic_sgd', 'logistic_cg', 'mlp', 'convolutional_mlp', 'dA', 'SdA', 'DBN', 'rbm']
float64 times [   24.00578618    55.60583591   175.75342607   136.53151321   248.71974111
   823.29348183   874.02775431  1079.12984514]
float64 expected [10.300000000000001, 23.699999999999999, 78.099999999999994, 73.700000000000003, 116.40000000000001, 346.89999999999998, 381.89999999999998, 558.10000000000002]
float64 % expected/get [ 0.42906322  0.42621426  0.44437256  0.53980212  0.46799663  0.42135643
  0.43694265  0.51717595]
float32 times [   21.94568563    49.98527789   177.91128731   136.48723054   291.68081236
  1048.11308694  1128.05673623  1302.78659558]
float32 expected [11.6, 29.600000000000001, 47.200000000000003, 66.5, 71.0, 191.19999999999999, 226.80000000000001, 432.80000000000001]
float32 % expected/get [ 0.5285777   0.59217436  0.26530076  0.48722507  0.24341677  0.18242306
  0.20105372  0.33221097]
gpu times [   23.64237881    50.57395744   185.60482621   139.12935448   289.82814217
  1050.09374905  1123.013515    1268.43072391]
gpu expected [3.0766348799999998, 7.5552349100000002, 18.992267850000001, 9.5999999999999996, 24.130070450000002, 20.399999999999999, 56.0, 302.60000000000002]
gpu % expected/get [ 0.1301322   0.14938983  0.10232637  0.06900054  0.08325648  0.01942684
  0.04986583  0.2385625 ]
float64/float32 [ 1.09387269  1.11244427  0.98787114  1.00032445  0.85271204  0.78550062
  0.77480833  0.82832434]
expected float64/float32 [ 0.46934054  0.47413961  0.43898283  0.53997725  0.39906636  0.33097574
  0.3385468   0.42838942]
float64/gpu [ 1.01537102  1.09949545  0.94692272  0.98132787  0.85816284  0.78401903
  0.77828783  0.85075978]
expected float64/gpu [ 0.43565836  0.46862063  0.42078647  0.52972286  0.40161731  0.33035146
  0.34006715  0.4399925 ]
float32/gpu [ 0.92823509  0.98836003  0.95854882  0.98100959  1.00639231  0.99811382
  1.00449079  1.02708534]
expected float32/gpu [ 0.49064437  0.58528147  0.25430373  0.47797246  0.24497276  0.18207898
  0.20195661  0.34120902]
speed_failure_float64=8
speed_failure_float32=8
speed_failure_gpu=8



仮想マシン上のlinuxなので、CUDAが使えない…

2012/10/14

男性2人の脳地図

成人の男性2人の脳の解剖と解析をしたとのこと。
doi:10.1038/nature11405
http://www.nature.com/nature/journal/v489/n7416/abs/nature11405_ja.html

データは
http://www.brain-map.org
で公開されている。

2012/10/13

Linuxのターミナルが文字化けしたら

元に戻す方法が
http://wiliki.zukeran.org/index.cgi?Linux%a4%ce%a5%bf%a1%bc%a5%df%a5%ca%a5%eb%a4%ac%ca%b8%bb%fa%b2%bd%a4%b1%a4%b7%a4%bf%a4%c8%a4%ad%a4%ce%c2%d0%bd%e8
に載っている。これによると、

[Screenを使っているとき]
screenのコマンドキー(デフォルトならCtrl+a)を押してから
:encoding utf8
とか
:encoding euc
などと入力。

[Screenを使っていないとき]
echo "^V^O"

を入力すればよい。

ついでに、
[端末の画面が固まってしまったら]
おそらくCtrl+sを誤って押してしまっているので、
Ctrl+qで解除できる。

2012/06/19

脳のカラムの作られ方

解説記事
Nature 486, 41-42 doi:10.1038/486041a

LETTER
(1)Nature 486, 113-117 doi:10.1038/nature10958
(2)Nature 486, 118-121 doi:10.1038/nature11110

脳のカラムの作られ方は、解説記事の図1そのままではあるが、
1. 胚発生時、分裂したニューロンが皮質の表面に向かって並んでいく。
こうして並んだニューロンが兄弟ニューロン。
2. 出生後の発達時、兄弟ニューロンはギャップ結合と呼ばれる穴でつながり
(樹状突起同士でつながる)、互いに電流が流れるようになる
3. その後、ギャップ結合は消失し、兄弟ニューロン間でシナプスが形成される。
4. 最終的に、兄弟ニューロンが類似の応答をするようになる。
ということである。

ギャップ結合をなくすことで3.が起きないことは(1)が示し、
4.が起きないことは(2)が示した。

ギャップ結合の阻害はレトロウィルスを使った変異を利用するか、
ギャップ結合遮断薬を用いることで実現している。

2.は阻害せず、3.を阻害すると4.はなくなるのだろうか?
気になる。


なお、上記の話は全てマウスに関するものである。

2012/06/02

工業から情報産業へ

「情報の文明学」(ISBN4-12-203398-5) pp.244-245 に
こんなことが書いてあった。

<引用>
工業社会はまだ、情報産業を競争相手とはみていない。
生産の原理が、工業から情報産業にうつりつつあることを
認識したときに、工業はどういう態度をとるであろうか。
そこで「工業こそは国の礎」という反動イデオロギーが
発生する可能性がある。それはおそらく、農本主義に
ならって工本主義と名づけられるであろう。
</引用>

これが書かれたのは1988年3月である。

最近、いろいろなところで「ものづくり」や
「ものづくり大国日本」などという言葉をよく見聞きする。

たとえば、関東経済産業局のページ
http://www.kanto.meti.go.jp/seisaku/seizousangyou/monodukuri/index_mono.html
には冒頭に

<引用>
「ものづくり」は我が国の国際競争力の源泉であり、
</引用>

と書かれている。こういったものは先の引用文にあった
反動イデオロギーのように思えてならない。
「ものづくり」の連呼はいつ終わるのだろうか。

2012/04/15

仮想PC

VirtualBoxとVirtual PCの両方を動作させると
ホストOSがブルースクリーンになる。

なにかが干渉するのだろう。