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がブルースクリーンになる。

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

2011/12/25

天の川銀河の棒状構造の進化

http://www.nature.com/nature/journal/v477/n7364/full/477286a.html
http://www.nature.com/nature/journal/v477/n7364/full/nature10417.html

Chris W. Purcell et al., Nature 477, pp301-303,
The Sagittarius impact as an architect of spirality and outer rings in the Milky Way

いま現在、銀河中心に対してちょうど地球と反対側に位置している
Sagittarius Dwarf Elliptical Galaxy (Sgr)が銀河の円盤の進化に
影響を与えていることが数値計算によりわかったとのこと。

例えば、Sgrの質量が小さめの場合と大き目の場合で銀河中心に
ある棒状構造が強くなったり弱くなったりするという結果がでている。

数値計算には ChaNGa
http://www-hpcc.astro.washington.edu/tools/changa.html
を使っている。CUDAもサポートしていて、並列実行もできるそうな。
実験で使った粒子数は3000万とのこと。

さらに並列実行には
http://charm.cs.uiuc.edu/
を使っているそうな。

頭皮に電流を流すと…

記憶や言語機能を上げたり下げたり、痛みを軽減したり
笑い出したり沈黙させたりできるらしい。
たった9Vの電池で。
どこに電極をあててどの向きに流すかで
効果が変わるらしい。

副作用があることもあり、電流を流すのをやめても
効果がすぐに切れるというわけではないようなので、
やらないほうが身のためですね。

Nature 472, 156-159 (2011-04-14); doi:10.1038/472156a
Nature digest Jul 2011, Vol. 8 No. 7, pp24-27

2011/12/09

マウスの視覚皮質のニューロンの接続の形

解説記事
doi:10.1038/4641290b

論文
Nature 464,1307-1312,(29 April 2010), Jia et al.
doi:10.1038/nature08947

視覚皮質には目から入ってきた画像に含まれる線の傾きを
検出する部分があり、特定の傾き(方向)にのみ反応する
ニューロンがある。ニューロンへの入力信号と出力信号
には方向性があるが、反応する傾きの範囲は入力に比べて
出力の方がとても狭いことがこれまでに分かっている。

入力信号が発生する傾きの範囲が広いのは、反応する傾きは広いが
同じような傾きに反応する入力信号を選択しているからではなく、
反応する傾き自体は狭いが各シナプスが反応する向きが
幅広いからだと考えられている。

そうすると、どの樹状突起にどこから来た軸索がつながっている
のだろうか?

Jia et al.によると、枝分かれしている樹状突起のそれぞれの
枝につながっている軸索が類似の方向性をもっているのではなく
全体にさまざまな方向性のものがつながっているということが
わかったとのこと。

ただし、実験はマウスの一次視覚皮質のニューロンで行われており、
他のニューロンやほかの種のでは違うかもしれない。


観測のための道具は蛍光Ca2+インジケータと高速二光子顕微鏡と
細胞内電極で、膜電位の変化とCa2+信号を同時に記録している。
本文には撮影された画像が数多く掲載されている。

2011/11/20

ラットの記憶の強化

http://www.nature.com/news/2011/110126/full/news.2011.49.html
日本語 doi:10.1038/ndigest.2011.110407

ラットの脳の海馬にインスリン様成長因子II(IGF-II)を
直接注入すると記憶が強化されたという。
仕組みはまだ明確ではなく、癌のリスク増大の
可能性があるが、記憶関連障害の治療に結びつく
可能性があるとのこと。

2011/08/28

Coffee-ring effect

水道水とかコーヒーとかの水滴が蒸発すると丸い形の跡が残るあれ、
「Coffee-ring effect」というそうだ。

この効果を抑制する方法が
Peter J. Yunker et al. "Suppression of the coffee-ring effect by shape-dependent capillary interactions",
http://www.nature.com/nature/journal/v476/n7360/abs/nature10344.html
に掲載されている。解説記事はこちら。
http://www.nature.com/nature/journal/v476/n7360/full/476286a.html

この論文によると、球形粒子の場合はコーヒーリング効果が
発生するが、粒子が楕円体だとその効果が生じず均一に堆積する
とのこと。条件をうまく設定すると、球形粒子に少量の楕円体の
粒子を混ぜたものでも均一に堆積させることができるらしい。

水道水の水滴の跡が残らないようにできるなら身近なところで
嬉しいわけだが、丸い跡が残らなくても結局均一に堆積することから、
見た目は変わっても残念ながら跡そのものは残りそうだ。

2011/08/21

続 CG-PC4KVMCA

この切り替え器、少なくともPC側のキーボード接続を
USBにしていると説明書に見当たらない
次の機能があることがわかった。

Ctrl+1 : 音量ダウン
Ctrl+2 : 音量アップ
Ctrl+3 : ミュートのON/OFF切り替え

便利なときもあるのだろうが、これとかぶる
ショートカットキーを使うアプリやゲームを
使うときにとても不便である。

この機能を無理矢理切るには
[デバイスマネージャー]→[ヒューマンインターフェイスデバイス]
とたどり、
[HID準拠コンシューマー制御デバイス]
を無効にすればよい。

2011/08/06

CG-PC4KVMCA

4ポート切り替え器 corega CG-PC4KVMCA を購入してみた。
使えるキーボードとマウスがUSBでもPS/2でも大丈夫だと
いうことだったが、実際に使ってみるといくつか問題があった。

[PS/2マウス]
(1) PS/2マウス→[切り替え器]→PS/2接続
マウスカーソルの移動の読み取り精度が荒い。
右に1回移動:3ピクセル右へ移動
左に1回移動:4ピクセル左へ移動
下に1回移動:3ピクセル下へ移動
上に1回移動:4ピクセル上へ移動

(2) PS/2マウス→[切り替え器]→USB接続
こちらもマウスカーソルの移動の読み取り精度が荒い。
右に1回移動:2or3ピクセル右へ移動
左に1回移動:4ピクセル左へ移動
下に1回移動:2or3ピクセル下へ移動
上に1回移動:4ピクセル上へ移動

(3) PS/2マウス→[切り替え器]→PS/2→[別の変換器]→USB接続
これもだめ。2〜4ピクセル一度に移動する。
状況によって移動量が変化する。

(4) PS/2マウス→[別の変換器]→USB→[切り替え器]→USB接続
問題なし。1ピクセルずつ移動できる。

(5) PS/2マウス→[別の変換器]→USB→[切り替え器]→PS/2接続
大部分は1ピクセルずつ移動できる。例外は、
* 右に動かした後に左に動かす1回目のみ2ピクセル移動。
* 下に動かした後に上に動かす1回目のみ2ピクセル移動。

(「別の変換器」はArvelの型番AU02PSを使用)

[LogicoolのワイヤレスUSBマウス]
左右に動かない…。移動が上下だけになる。
したがって使い物にならない。

[PS/2キーボード]
(1) PS/2キーボード→[切り替え器]→PS/2接続
PS/2キーボード→[別の変換器]→USB→[切り替え器]→PS/2接続
キーを押し続けた時のリピート速度がとても遅い。

(2) PS/2キーボード→[切り替え器]→USB接続
PS/2キーボード→[別の変換器]→USB→[切り替え器]→USB接続
通常速度でリピートする。

まとめると、使える組み合わせは
USB接続のキーボード/マウス→[切り替え器]→USB接続
のみで、PS/2系統の接続はおまけだと思ったほうがよい。

2011/07/16

Windows7のファイアウォール

Windows7のファイアウォールの設定がなぜかいつの間にか変更される。
確認できているのは、
  ファイルとプリンターの共有
が含まれる名前の規則。
受信の規則、送信の規則ともに無効にしてもいつの間にか有効にされてしまう。

全体のルールで
  規則に一致しない受信/送信接続はブロック
するようにしているので、規則が無効になっていれば
ブロックされるはずなのだが、いつの間にか有効にされるので
意味がない。

とりあえず回避するには、
  各規則のプロパティ→全般→操作→「接続をブロックする」
を選択しておけばよさそうである。
少なくとも「ブロック」が勝手に「許可」になることは
ないようである。

2011/04/13

フランスIRSNのシミュレーション結果

今回の原発事故に関するフランスIRSNによる情報が
http://www.irsn.fr/EN/news/Pages/201103_seism-in-japan.aspx
に書かれている。

「福島第一原発事故の放射能放出が及ぼす超遠距離に
おいての影響 - 2011年3月30日」のpdfファイル
によると、4月1日時点で北半球のほとんど全体に拡散
していることがわかる。外国に居ても日本に居ても
大気中のセシウム137の濃度(Bq/m^3)に大きな違いは
ないようである。

この資料には大気中核実験が行われていた1960年代の
フランスでの大気中セシウム137の濃度が示されていて、
図(4月1日)からは今の濃度はそのころの濃度の1/10〜10倍
程度であることが分かる。

チェルノブイリ事故後のフランスでの濃度に比べると
1/10000〜1/100くらい小さい。

この結果はあくまでシミュレーションによる結果であるので、
細かい値が正しいとはいえないが傾向を知るには十分である。

また、このくらいの濃度なら、日本国内はともかく、
諸外国が気にする必要はなさそうである。
少なくとも核実験を行っていた国が気にするような
レベルではない。

2011/03/17

グローバルホーク

福島第一原発の撮影に米軍のグローバルホークを
ようやく使用するとのこと。
http://www.47news.jp/CN/201103/CN2011031601001241.html

グアムの機体だそうなので、少し前にグアムに配属された
機体なのかもしれない。

大学とか企業とかで遠隔操作できるロボットがあるなら
それも投入して欲しいところだが、安全のためには
何十kmも離れた所から操作ができる必要があるので、
今となっては難しいだろう。

無人という意味では、以前打ち上げてた日本の情報収集衛星
http://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E5%8F%8E%E9%9B%86%E8%A1%9B%E6%98%9F
が活用できそうだが、これは公開されないので一般人には残念ながら全く分からない。

一方、陸域観測技術衛星「だいち」は使われていてJAXAで公開されている。
http://www.eorc.jaxa.jp/ALOS/img_up/jdis_pal_tohokueq_110315.htm
しかし、撮影画像を見る限り原発の状況を観測するには解像度が足りなさそうだ。

2011/03/16

ひたちなか市堀口のデータ(2)

8時間前の続き。

前と同様、上のグラフは
http://www.houshasen-pref-ibaraki.jp/present/19HP30grf.html
から引用したもので、2011年3月16日 8時10分までの
24時間分のデータである。

感雨程度では反応しないが、雨が降ると線量率が
増加するように見える。

しかしながら、正常時かつ降雨時の過去のデータがないため、
これが雨に反応したものか、風に乗って新たに放射性物質が
運ばれてきた結果なのか区別がつかない。

ひたちなか市堀口のデータ

なかなかアクセスできない茨城県のモニタリングポストのデータであるが、
ようやく1つアクセスできた。

上のグラフは
http://www.houshasen-pref-ibaraki.jp/present/19HP30grf.html
から引用したもので、2011年3月16日 0時10分までの
24時間分のデータである。

グラフの一番左側の値が通常の値である。
いったん上昇して元のレベルに戻るかと思いきや
ピーク時の1/3程度にまでしか下がっていない。
また、減衰が妙にゆるやかだ。

一時雨が降っていたようだが、影響がこのグラフからは
読み取れない。


通常値に戻らない理由としては
(1) 空気中に放射性物質が滞留
(2) 原発から流れ続けてきている
(3) 放射性物質が地表に滞留している
(4) 測定器が不調
(5) 放射性物質が測定器に付着しているだけ
くらいが思いつくが、何時間も無風とは考えられないので(1)はなし。
値が妙に安定しているので(2)もなさそう。
したがって(3),(4),(5)のどれかっぽい。

他の地点のデータにアクセスできれば比較して
判断できそうだ。

2011/03/15

吸収線量の計算

川崎市役所付近のデータがあるので大雑把に
吸収線量の計算をしてみる。

4:40分くらいから始まった上昇が2時間後(6:40)に
下降して元と同じくらいに戻るまでの吸収線量は
上昇して下降するまでの形状が三角形で150nGy/hが
ピーク値(値は?)と通常値(40nGy/hとする)の
中間値だとすると、三角形の部分が
(150nGy/h-40nGy/h)×2h = 110×2=220nGy
となり、通常値の部分が
40nGy/h×2h = 80nGy
になる。足すと、300nGyである。

もしこの増加している時間帯に2時間外に出てたとすると、
通常よりも300/80=3.75倍の放射線を受けた事になる。

増加分が220nGyなので、これを等価線量に換算する。
放射線の全てがβ線かγ線だとすると放射線荷重係数は
1なので、単純に単位を変えるだけになる。つまり、
増加分は220nSv。

http://www.city.saitama.jp/www/contents/1189641690509/index.html
によると胸部レントゲン1回につき0.061mSvであるので、
0.061mSv=61μSv=61000nSv
なので、増加分は無視できる。

もし、40nGy/hから150nGy/hに増えたままの状態が
1年間続いたと仮定すると、増加分はおおよそ
110nGy/h × 365日 × 24時間 = 963600nGy/年 = 963.6μSv/年
となる。その場合、1年間で胸部レントゲン15.8回分増える
ということになる。

ということで、増加しっぱなしはあんまりよくない
ことがわかる。

もうちょっと南の値

茨城よりもかなり南だが、川崎市役所付近(大島局観測)のデータがあった。
http://www.atom.pref.kanagawa.jp/cgi-bin2/telemeter_dat.cgi?Area=5&Type=W

なかなかアクセスできないので画像を引用する。
このグラフによると3月15日5時40分前後と
10時40分前後に何かが発生しているようだ。
グラフの上限値を越えているが、少なくとも150nGy/h以上の
線量が観測されている。

東京都日野市で個人測定されている方
http://park18.wakwak.com/~weather/
のデータだと同日12時20分頃に通常の4倍程度の線量を観測されている。
また、5時20分前後に線量が多少増加している。

関東の広い範囲にわたって到達しているのだろう。

風まかせなのでどの地点にいつ頃届くのかを予測するのは
困難だろうが、多少なりとも届くことがあるということは分かった。

茨城県のモニタリングポスト

東電がモニタリングポストの値をなぜか更新しないので、
茨城県のモニタリングポストの値を見てみる。

データが消えてしまうかもしれないのでコピーしておく。
今日になってから放射線量がどんどん増えている。
おいおい。

----------------------------------
日時 北茨城市 高萩市 大子町
13日 9:30 50 — —
〜 〜 — —
14日20:30 51 — —
20:40 50 — —
20:50 50 — —
21:00 49 — —
21:10 50 — —
21:20 49 — —
21:30 49 — —
21:40 49 — —
21:50 49 — —
22:00 50 40 —
22:10 50 41 —
22:20 50 40 —
22:30 50 41 —
22:40 50 40 —
22:50 50 39 —
23:00 50 40 —
23:10 50 39 —
23:20 50 40 —
23:30 50 39 —
23:40 50 40 —
23:50 50 39 66
15日0:00 49 39 66
0:10 52 36 65
0:20 144 40 66
0:30 278 40 65
0:40 375 39 66
0:50 313 40 65
1:00 216 40 65
1:10 169 40 66
1:20 170 40 65
1:30 173 42 65
1:40 168 48 66
1:50 201 55 66
2:00 200 51 64
2:10 227 46 65
2:20 305 45 65
2:30 373 43 65
2:40 391 41 65
2:50 332 43 65
3:00 416 49 64
3:10 908 53 64
3:20 1190 60 65
3:30 1600 68 65
3:40 2910 87 64
3:50 4120 112 64
4:00 4870 204 64
----------------------------------

なお、3月13日、女川原発では福島第一原発の1号機の爆発で
21,000nGy/hを検出したらしい。

放射性物質が風にのって…

関東地域の人にとってはあんまりうれしくない事態のようだ。
気象庁の3月15日08時の風向・風速データによると、
風向きが福島付近から関東平野までおおよそ北東の風が
吹いている。

今、放射性物質が原発から漏れていたら
ゆらゆらと関東平野にまで到達するかもしれない。

朝日新聞社の2011年3月14日20時27分の記事
http://www.asahi.com/international/update/0314/TKY201103140372.html
によると14日に米軍が一時退避しているらしい。
航空機や救援活動をしていたヘリコプターの乗員から
低レベルの放射性物質が検出されたからだそう。

数字が出ているところは引用。
<引用>
# 空母ロナルド・レーガンは福島第一原発から
# 北東約185キロの洋上に展開していたが、
# 他の艦船群とともに原発の風下から逃れた。
# 米紙ニューヨーク・タイムズによると、
# 試料の採取は福島第一原発から約100キロ
# 離れたところで行われており、放射能汚染が風で
# かなり広がっている可能性を示唆している。
</引用>

185km離れてても米軍が風下から移動していたところを
考えると、福島から200km程度の距離の関東平野だと
風次第では到達しかねないな。

モニタリングポスト

福島第一原子力発電所付近のモニタリングポストの値
http://www.tepco.co.jp/fukushima1-np/monitoring/monita2.html
が地震の後から更新されてない。

いま表示されている範囲は
3/9 14:40 〜 3/11 14:40
である。

福島第二原子力発電所付近のモニタリングポストの値
http://www.tepco.co.jp/fukushima2-np/monitoring/monita2.html
は多少更新されているが頻度が低い。

いま表示されている範囲は
3/11 7:50 〜 3/13 7:50
である。グラフから読むと3/12 9:00前後に
通常の値の2倍程度の値が検出されている。
通常が〜40nGy/hなのがそのときだけ〜80nGy/hになっている。

何があったのだろうか。

いずれにせよ、こういうときにデータが更新されてこそ
モニタリングポストとしての意味があるのではないだろうか。

2011/02/07

英単語の上にルビで日本語訳を表示するサービス

「ずるっこ」(http://zurukko.jp)というサービスおもしろい。
見たいページのURLの後ろにzurukko.jpって追加するだけ。
いちいち辞書を引かなくていい!

2010/11/14

万有引力定数

万有引力定数Gの値は現在のところ3桁の精度しかないようだ。
MKS単位系で、

6.67428 (0.00067) x10^-11 : Wikipedia(JP)
6.674215(0.00009) x10^-11 : J. H. Gundlach and S. M. Merkowitz
6.67234 (0.00014) x10^-11 : H. V. Parks and J. E. Faller
6.67349 (0.00017) x10^-11 : J. Luo et al.

括弧内は1σ。

4桁目で異なるのがなんとも。
各々測定方法が違っているので誤差があるのだろうが、
Gを元に計算する必要のある値は3桁目+α程度の
精度でしか信用できないということになりそうだ。

2010/10/24

csrss.exe + XS35GT に不可解が現象が発生

XS35GTにインストールしたWindows7で動作しているプロセスの一つである
「csrss.exe」 の"I/O write bytes"がどんどん増加するという
現象が起きていることに、数日前気が付いた。

マウスかキーボードを操作すると、
I/O write bytes deltaが50GBとか意味のわからん値を叩きだしていた。
実際に何かを書き込んでいるわけではなさそう。
そもそもこんな速度で書き込めるわけがない。

調べて見ると同じではないが類似の症状の人が海外にいた。
http://blog.tatham.oddie.com.au/2007/07/28/strange-server-behavior-huge-io-other-count-for-csrssexe/
まさしく「the values skyrocketed.」と表現されている通りの現象が起きている。
この人は"I/O Other Bytes" に起きており、
マウスやキーボードの操作で発生しているわけでもなさそうだが、
現象だけは似ている。


ウィルスかスパイウェアかとも考えたがウィルススキャンにも
引っかからない。セーフモードで起動するとこの問題がなくなる。

結局、2日間調べた挙句、原因が突き止められないので
再インストールしながら調べることにした。やれやれだ orz

Windows7 をインストールした直後にはこの問題は発生しない。
マザーボード付属のドライバをインストールすると発生することが判明。
一つずつアンインストールと再起動を繰り返して調べたところ、
「Driver 1.2」が原因であることが判明。
「Install Control AP」のインストール中に一緒に
インストールされるドライバのようで、
とりあえずなくても動きそうなのでアンインストールすることにする。

というわけで、XS35GTにWindows7 Professionalをインストール
するときの手順は次のようになる。

-----
1. Win7をふつーにインストール。
既にWin7がインストール済みだとパーティションが2つ見えるが
2つとも削除してからインストールする。

2. XS35GTについてきてたドライバをインストール
Install Control APのところで
- Cisco EAP-FAST Module
- Cisco LEAP Module
- Cisco PEAP Module
- ControlAP 1.2
- Driver 1.2
の5つがインストールされる。

3. 再起動する。再起動後、I/O write bytesの値
(タスクマネージャだとI/O書き込みバイト数の値)が
どんどん増えていく。

4. Driver1.2をアンインストールして再起動。
たぶんControl APが正常に使えなくなるだけで
それ以外は問題はないと思われる(ほんとかな?)。
I/O write bytesの値が0であることが確認できる。

5. ついでにNTI Backup Now EZをアンインストール。
30日間しか使えないので。
一応、再起動しておく。

6. NVIDIAのドライバをインストールし、再起動
-----
これでOK。I/O write bytesは0のまま。

さて、ここから以前の状態に復旧するのが大変だ。
先が長い…

2010/10/10

細菌が協力して抗生物質に対抗

「Bacterial charity work leads to population-wide resistance」
doi:10.1038/nature09354
によると、抗生物質への耐性が高い菌が耐性の低い菌の
生存を助けているらしい。
また、抗生物質にさらされている中では
高耐性の菌だけで構成されたグループよりも
それらとそうでない菌を混ぜたグループのほうが
増殖率が高いということだ。

低耐性の菌が死滅して高耐性の菌が残りそれらが
増殖して耐性菌だらけになると思っていたが、
どうやらそう単純ではないらしい。

ちなみに、実験で使われた抗生物質は
norfloxacin(ノルフロキサシン)とgentamicin(ゲンタマイシン)で
細菌には大腸菌(Esherichia coli)が使われているとのこと。

2010/10/09

CPU の温度

XS35GTのCPUの温度を「Core Temp」で調べてみた。
他の測定ソフトもたくさんあるのだが、Windows7で
動作するものが意外と少ない。

その温度だが、負荷なしで
室温 25℃
CPU 63℃
SSD 41℃
となった。ファンレスだとどうしても
温度が高くなるようだ。

2010/09/30

IMAX 3D

バイオハザード4を観てきました。
内容は、ゾンビが出てくるマトリックス風味の
アクション映画となっておりました。
もう、ホラーじゃないよ、これは。

それよりもIMAX 3D全然だめ。
シャッター方式でなく偏光方式の3Dのためなのか
3D眼鏡を付けても画面は明るい。
あと、眼鏡の上に3D眼鏡をかけてもずり落ちにくい。

しかーし、黒地に白の字幕が3重に見える。その理由は
左目に右目用の光の一部が漏れ、右目に左目用の光の一部が漏れているから。
そんなわけで常に字幕の左右にゴーストのように文字が分裂します。
背景が明るいときは気になりませんが、
コンテンツがねぇ、暗めですし。

さらにわずかにでも首を傾けると光の漏れが大きくなって
まるっきり3Dにならなくなる。これは、疲れる。

画面全体が横に流れるようなシーンでは全くフレームレートが
足りてません。カクカクしてます。

音に関しては低音が強く、身体にとても響きます。
音量が大きすぎて耳が痛くなるくらい。
もしかすると耳栓持ってったほうがいいかもしれません。
難聴になるよ、こんなのずっと聴いてると。

というわけで、たっかい金額払って
わざわざIMAXで3D映画を見るようなことは
全くもってお勧めできません。
上映される映画の内容によらず、ですよ。

それはともかく、バイオハザード4の3D自体の
できもお粗末でした。
無駄に3Dにしたくてしたくてたまりませんっといった感じ。
風景が写ってるシーンなんて、手前の山が
すごく立体的なのに、奥の山などはただの平面の壁に
絵が描いてあるように見えてしまう。

飛行機がおもちゃに見えるとか、
妙に近いところに見えるようにしてみるとか、
意味がわかりません。

ところどころまともなシーンもあったので、
きちんと作りこめてないってことでしょう。
3Dなんかで観ずに、DVDでも借りて2Dで観るほうが
楽しめるんじゃないでしょうか。
コストも安上がりですしね。

結局のところ、「アバター」のときとは
何もかもが大違いでした。

2010/09/25

FF XIV BENCHMARK

無謀にもFF XIVのオフィシャルベンチマークを実行してみた。

ミコッテ&解像度1280x720で実行した。
結果、
Score : 161
Load Time : 45132ms
となった。

いやぁ、無理でしょう、無理無理。
大体、実行中に画面が秒間数枚しか書き換わらないし。

HDBENCHの結果

XS35GTをHDBENCH 3.3.0.4 で測定してみた

CPU Int181369
CPU Float127253
MemoryR99646
MemoryW94639
MemoryRW174418
DirectDraw37
Rectangle1137
Text719
Ellipse567
BitBlt35

Rectangle, Text, Ellipse, BitBltが
非常に低い。なんだこれ?
最近のGPUの2D描画性能が低いというのは
こういうことなのか。

2010/09/24

XS35GT の消費電力

ワットチェッカーで測定してみた。
とても低い。

起動中 : 21W
ログイン画面 : 17W (29VA, PF=0.55〜0.59)
USB接続のDVDドライブ使用中 : 21W 最大26W
ログイン後の通常状態 : 18W
スリープ : 1W未満(表示は0W)

ちなみにACアダプタの温度は非接触温度計の表示が
正しいなら、熱い部分は通常状態で43〜45℃、
消費電力が増えると48℃くらいまで上昇。

2010/09/22

gccでライブラリ

gccで使えるライブラリ(.a)の作成方法のメモ。
以下、cygwinで試した結果。

-- a1.c --
int AAA=123;
----------
コンパイルする。
$ gcc -c a1.c

できあがった内容を見る。
$ nm -g a1.o
00000000 D _AAA

ライブラリをarで作る。
$ ar -r a.a a1.o
ar: creating a.a

できた内容をチェック。
$ nm -sg a.a
Archive index:
_AAA in a1.o

a1.o:
00000000 D _AAA

インデックスを作ったほうがリンクが速くなるらしい。
既にインデックスができてそうだが、調べた範囲では
ar -r に続いて ar -s を実行するのが通常のようだ。

そこで一応、実行して見る。インデックスを作るには、
ranlib か ar -s を実行する。この2つのコマンドは
等価とのこと。
http://www.linux.or.jp/JM/html/GNU_binutils/man1/ar.1.html

実行してみる。
$ ar -s a.a
$ nm -sg a.a
Archive index:
_AAA in a1.o

a1.o:
00000000 D _AAA

変化なし。必要なのだろうか?

最後に、できあがったa.aをリンクする。
-- main.c --
#include <stdio.h>
int main(void)
{
printf("%d\n",AAA);
}
というファイルを作って、コンパイル&リンク&実行すると、
$ gcc main.c a.a
$ ./a.exe
123

となる。

2010/09/20

ファンレス&スピンレスPC

XS35GTを入手してきました。
http://www.shuttle-japan.jp/barebone/XS35GT/

ベアボーンなので、メモリとHDDをそろえるだけ。
メモリはバルク品のSO-DIMM DDR2-800 2GB。5000円弱。
HDDは使わずSSDを使用。偶然見つけたTrim対応の
東芝製SSD THNS128GG4BBAA を3万円弱で入手。

この2つを組み込んで、ファンレス&スピンレスなPCが出来上がりました。
ACアダプタがちっこくて、だいたい 85mm×35mm×27mm の大きさです。
緑色のパイロットランプ(?)が付いてます。
体温よりは熱くなりますが、手で握ってみると
冬場ならいい感じのあったかさになってます。
温度計がないので何度なのかは不明です。


ファンレスなのでOSインストール中に固まるかもしれないと
予想してましたが、そんなことは全然なくスムーズに
Windows7 Proをインストールできました。
インストール直後の時点でディスクが10GBほど消費されてました。
OSだけで10GB程度というのは予想外に小さいですね。


とりあえずインストール直後のWindowsエクスペリエンスインデックスは

プロセッサ : 3.3
メモリ : 4.7
グラフィックス : 1.0
ゲーム用グラフィックス : 1.0
プライマリハードディスク : 7.1

ベアボーンにくっついてきたドライバをインストールすると

プロセッサ : 3.3
メモリ : 4.7
グラフィックス : 3.3
ゲーム用グラフィックス : 4.6
プライマリハードディスク : 7.1

となり、ウィンドウが半透明で表示されるようになりました。

一時、エクスプローラでファイルなどのD&Dができなくなりましたが、
原因不明のままなぜか直りました。唯一不思議な現象でした。

このベアボーンは、見た目が網網なのでちょっと気色悪いです。
見えないところに押し込めば大丈夫でしょうが、
通気は確保しなければなりません。

ディスクアクセスランプの色は青で、
電源ランプは白色です。正面からみると眩しいです。

LANが100BASE-Tなので、ファイルサーバのようなことには
不向きです。

DVDドライブは付属ではないので、持ってないなら購入しないと
OSのインストールが苦しいです。
今回は外付けのUSB接続のDVDドライブを使いました。

SSDの温度は39℃。
そんなもんかな? ファンなしだし。

2010/07/10

Axonal hotspot

脳みそにあるニューロンの話。
ニューロンのシグナルは軸索起始部(Axon Initial Segment, AIS)で
発生するが、そのAISの領域が移動したり広がったりするらしい。
http://www.nature.com/nature/journal/v465/n7301/full/4651022a.html
(Nature Vol.465, pp.1022-1023, doi:10.1038/4651022a)

ニューロンの中心からAISが遠くなると入力に対する
出力が出にくくなり、AISの領域が広がると入力に対する
出力が出やすくなるそうだ。

あるニューロンにどの軸索が接続しているか、と
それらの軸索がニューロンのどの場所につながっているか
で入力シグナルに対する出力シグナルがおおよそ
決まるのだと思っていたが、他の要因もあるとは。
まだまだ分からないことだらけだ。

2010/07/05

脳波でコミュニケーション?

プレスリリース
http://www.aist.go.jp/aist_j/press_release/pr2010/pr20100329/pr20100329.html
によると、脳波で話せる機械ができたらしい。
言葉ほど速くコミュニケーションできるわけではないし、
伝えられる種類も512種類なので言葉にしゃべらなくても
いいようになるわけでもないので、話せる人には
意味はないかもしれんが、パーキンソン病みたいに
筋肉が動かせない人には朗報かもしれん。

黙読したら別の人にその内容が伝わるくらいになったら
すごいかもしれんが、まだまだ先のことだろう。

2010/05/30

cmake その1

いろんな環境でビルドできるようにするツール、"cmake" を使ってみる。
UNIXのMakefileやVisualStudioのプロジェクトファイルなどを
作成してくれるツールである。メタメイクともいえるかもしれない。
LinuxとWindowsの両方でのビルドやVisualStudioの色々なバージョンに
同時に対応するなどを行いたいときに便利だろう。
ここではWindows環境であると想定して説明する。

まずはここからダウンロード。
http://www.cmake.org/

cygwinを使うならパッケージに含まれているので
そちらからダウンロードする。

ベースになるディレクトリをbasedirとする。
ここに test.cpp を作成する。内容は、

#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "test" << std::endl;
return 0;
}
とする。同じディレクトリに CMakeLists.txt を作成する。
ファイル名はこれでなければならない。内容は、

cmake_minimum_required (VERSION 2.6)
project (Test)
add_executable(Test test.cpp)

とする。1行目はなくてもよい。
2行目はプロジェクト名に Test という名前を指定してる。
Test というプロジェクトに test.cpp というファイルを
追加するのが3行目である。

これで最小限の準備が完了した。

これらをビルドするために、Visual Studio 2010 を使うとする。
ディレクトリ basedir/vc10 を作成し、
そこにカレントディレクトリを移す。
その後、cmakeでプロジェクトファイルを生成する。

> cd vc10
> cmake -G "Visual Studio 10" ..

version 2.8.1の場合、次のファイルがカレントディレクトリに
生成される。

> dir
CMakeFiles (ディレクトリ)
ALL_BUILD.vcxproj
ALL_BUILD.vcxproj.filters
CMakeCache.txt
cmake_install.cmake
Test.sln
Test.vcproj
Test.vcproj.filters
ZERO_CHECK.vcxproj
ZERO_CHECK.vcxproj.filters

CMakeFilesの下にも多くのファイルが生成される。

Test.sln を VS2010で開いて、ビルドする。
ビルドターゲットはデフォルトで次の4つが作成される。

Debug
MinSizeRel
Release
RelWithDebInfo

ターゲットをDebugにして ALL_BUILD プロジェクトをビルドすると、

Debug/Test.exe

が生成される。これを実行すると、
test

が表示される。


同様にVisual Studio 2008用のプロジェクトファイルも簡単に
作成できる。さっきと同じようにvc9ディレクトリを作成して、
cmakeを実行する。なお、cmake実行前にVS2010は終了しておく。

> cd ..
> mkdir vc9
> cd vc9
> cmake -G "Visual Studio 9 2008" ..

VS2008で同じようにTest.slnを開いてビルドして実行すると、

> Debug\Test.exe
test

となる。

今回はここまで。

2010/04/04

シャワーヘッドに細菌が

昨年のnatureの記事
http://www.nature.com/nature/journal/v461/n7262/full/461360a.html
によると、シャワーヘッドに細菌がいることがあるらしい。
塩素殺菌されてるだろうと思いきや、塩素耐性菌が生き残るとのこと。
弱っている人は日和見感染してしまうので、気を付けよう。

2010/03/07

変な形のゆでたまご

ゆでたまごがクレーターのようになってしまった。

☆作り方☆
湯にいれるときに殻にうまい具合にひびを入れる。
白身がすこし出てくる程度にする。
白身がまとわりついて卵が浮くが、そのまま茹でる。
茹で上がったら殻をむくだけ。
(湯が卵に入り込むのでちょっと水っぽくなる)

ちなみに左は普通のゆでたまご。

2010/01/27

アバター

話題の「アバター」観てきた。
(1)3D
3Dの眼鏡がずり落ちる。眼鏡の上にかけてるからだろうけど。
もう少し、考慮してもらえるとありがたい。

普通の眼鏡でいうレンズの部分を眼鏡拭きで拭いても
油がとれない。どうなってんだか。

映像のフレームレートが低い。動きの激しいシーンでは
3Dに見えない。なにか映像がちらちらしているようになる。
今の4倍くらいはフレームレートが欲しい所。

スクリーンは大きいはずなのに、原寸大のような感じがした。
人間はそれっぽい大きさに、アバターもそれっぽい大きさに。
不思議だ。

字幕を読むのは大変。特に原住民の字幕は右端にでるので、
読みにくい。そのうえ眼鏡のせいか像が2重に見える。
字幕が映像のど真ん中に表示されてたことがあったが、
これは読みやすかった。

(2)内容?
2足歩行メカのデザインがMATRIXに出てきたやつに似てた。
だれがデザインしてもあんな感じになるのかなぁ。

髪の毛の束なのか触覚なのか触手なのかよくわからんが、
それをつなげることで原住生物間でコミュニケーションが
とれるようだ。言葉よりもっと直感的な。
攻殻機動隊の首にケーブルをさしてデータのやり取りを
するのとおんなじだね。機械的でなくて生物的だけど。

自分自身をアバターに移動させることもできるようだ。
木を介して。
肉体という入れ物があったら移れるとは…戻れそうには
なかったけど。

原住民の死んだら先祖の元に戻るって思想は
なんだか「プロバビリティー・ムーン」で出てくる
世界(ワールド)人のようだ。

透明のディスプレーいいな。かっこいいな。欲しいな。
たしかCESかどこかで展示されていたはず。
数年後にでも市場に出てきたらうれしいな。

あ、ストーリーはありきたりだよ。上で挙げた要素も
突飛すぎるアイデアでもないし。ゆえに安心してみてられる。
ゲームをこんな風に3Dでできるときっと面白いと思う。

ちなみに、スタッフロールのなかに日本人の名前を2人、日系人の名前を1人
見つけた。もっといるだろうけど、数が多すぎてギブアップ!

なにはともあれ、見る価値はあるよ、面白い。

2009/10/27

Haskell その2

今度はリストを逆順にする関数を作る。

module Main where
import Text.Printf

main = do print (reverse([1,2,3,4,5]))
print (reverse1([1,2,3,4,5]))
print (reverse2([1,2,3,4,5]))
print (reverse3([1,2,3,4,5]))
print (reverse4([1,2,3,4,5]))

reverse1 x | length x == 1 =x
| length x > 1 =reverse1(tail x) ++ head x:[]
reverse2 (x:xs) | length xs == 1 =xs++x:[]
| length xs > 1 =reverse2(xs)++x:[]
reverse3 x=foldl (flip (:)) [] x
reverse4 =foldl (flip (:)) []
最初のreverseは最初から定義されている関数で、その名の通りリストを逆順にする。
reverse1 x | length x == 1 =x
| length x > 1 =reverse1(tail x) ++ head x:[]
これは引数xの長さが1ならxをそのまま返し、xが1より大きければxの先頭の要素を除いたリストを逆順にしたリストにxの先頭の要素を連結した結果を返す関数である。
++はリストの連結を行う演算子で:はリストの先頭に要素を追加する演算子である。
[]は空リストである。
reverse2 (x:xs) | length xs == 1 =xs++x:[]
| length xs > 1 =reverse2(xs)++x:[]
この関数は、リストを引数に取り、その先頭をxに、それ以外をxsとする。
xsの長さが1のとき、xsとxを連結したリストを返す。xsの長さが1より大きいとき、xsを逆順にしたリストにxを連結したリストを返す。
xsのsは英語の複数形で、こういう命名規則なのだそうだ(がどこで見たのかは忘れた…)。
別に従わないとコンパイルが通らないというわけではない。
reverse3 x=foldl (flip (:)) [] x
この関数も引数にリストを取り、それをxとする関数である。
これもリストxを反転した結果を返す関数であるが、少しややこしい。
foldlは引数を3つ取り、第3引数のリストの左側の要素から順に処理を行う関数である。
その処理をC言語風に書くと、第1引数を+、第2引数をa、第3引数のi番目の要素をx[i]、処理結果をrとして、
r = a
for(i=0; i<length x; ++i)
r = r + x[i]
return r
のようになる。

flipは2引数関数の引数を入れ替える関数である。f(x,y)ならf(y,x)になる。
:は右側(第2引数)にリスト、左側(第1引数)に追加する要素を書くが、そのままではfoldlが演算子:を呼び出すときに左右が逆になってしまう。そこで、flipを使って逆向きにする。

以上より、引数で与えられたリストの先頭の要素から順に新しいリストの左側に追加していくという処理になっており、リストの順序が逆向きになることがわかる。

reverse4 =foldl (flip (:)) []
この関数は、foldlの第3引数が指定されていない関数になっている。つまり、reverse4は引数を1つ取る関数である。
foldlの第1,第2引数が指定されている関数であるともいえる。

ああ、ややこしい。

2009/10/25

Haskell その1

erlangはネイティブのバイナリファイルが生成できなかったので、
今度はそれができるHaskellを試してみた。

C++系統の言語とは異なりすぎているので、
なかなか慣れるまでに時間がかかる。
とりあえず、絶対値を求める関数を作った。

module Main where
import Text.Printf

main = do printf "abs -10 is %d\n" (10::Int)
printf "abs -10 is %d\n" ((abst (-10)) ::Int)
printf "abs -20 is %d\n" (absi (-20))

abst x = if x < 0 then -x else x

absi :: Int -> Int
absi x = if x < 0 then -x else x

順に説明する。調べ始めたばかりなので、
間違いが混じっているかもしれない。

 module Main where
はプログラムのエントリポイントを指定している。
C++で言うところのmain関数の名前を指定している。
 import Text.Printf
printfを使うために必要
 main = do
これ以降にメイン関数の定義を書く。
printfは書式付の関数。10::IntはInt型の数字として10を使用することを明示している。明示しないとコンパイルエラーになる。
先に、abstとabsiについて説明する。
abst x = if x < 0 then -x else x
これは、引数xを取る関数abstの定義であって、もしxが0より小さければ-xを、そうでなければxを返すことを表している。
absi :: Int -> Int
これはabsiの関数の宣言でInt型の引数を取り、戻り値の型もIntであることを宣言している。
absi x = if x < 0 then -x else x
はabsiの定義であり、内容はabstと同じ。
printfの説明に戻る。
printf "abs -10 is %d\n" ((abst (-10)) ::Int)
abstに-10を引数として渡して、得られる値を出力するということである。
-10を()で囲っているが、囲まないと-と10が分かれてしまってエラーとなる。
さらに::Intで戻り値の型を指定している。
abstは関数の定義だけを行って、型がどうなっているかの宣言を記載していないので、ここで明示しないと型が曖昧だと言われ、エラーとなる。
printf "abs -20 is %d\n" (absi (-20))
こちらは::Intが不要である。関数の宣言で戻り値がIntであることを明示しているためである。

その他、コードを書くときのルールであるが、インデントによってブロックの範囲が決められる。
タブの使用には注意が必要である。
うっかりスペース4個のタブを使うとコンパイルエラーになる。
スペース8個のタブなら問題ない。

2009/10/18

サイレンサー(ただし戦車砲の)

http://gigazine.net/index.php?/news/comments/20091018_tank_silencer/
(笑)
砲身の先にながーいのがくっつくのかと思いきや、
ぶっとい!
こんなの↓

    ■■■
    ■■■
    ■■■
■■■■■■■  □□□
■■■■■■■――□□□
■■■■■■■  □□□
    ■■■
    ■■■
    ■■■
□:戦車本体
―:砲身
■:サイレンサー

実験用らしい。当然だが。

2009/10/10

世界の大学ランキング

今年の世界の大学ランキングが出ていた。
http://www.topuniversities.com/university-rankings/world-university-rankings/2009/results

上位の大部分はアングロサクソン系。
日本の大学で100位以内を抜き出すと、
=====
東京大学 22位
京都大学 25位
大阪大学 43位
東京工業大学 55位
名古屋大学 92位
東北大学 97位
=====

時系列で、総合ランキングの順位の変化を見てみた。
下位の大学(といっても、世界で見てだが)が徐々に
順位を上げている。

分野別のデータもあったので、それらもグラフにしてみた。
まずは、自然科学。総合順位とあまり大差ない。


次に工学とITのランキング。工業大学というだけあって、
東京工業大学が順位を伸ばしている。

最後に、ライフサイエンス系。
上位3大学とそれ以外の差が大きい。
なぜだろう。資金力の差なのか!?

2009/09/23

温室効果ガス25%削減

日本は温室効果ガスを1990年を基準に25%削減するらしい。
いつも思うのだが、
(1)なぜ1990年を基準とするのか。
(2)25%削減するとどうなるのか。
の2つが報道されない。

(1)は1人あたりの排出量のほうが公平だし、
(2)は達成できても今より温暖化は進む。

もちろん、1人あたりで計算すると先進国が極めて
不利だからだろうし、達成基準なんて「えいやっ」
って決めてるだけだろう。
どうなるかの予測はしてるだろうが。

2009/02/14

テトぐるみ

消波ブロック(「テトラポッド」は商標)のぬいぐるみ。
猫の枕にいいらしい。
数十個あれば、部屋の中が海岸っぽくなるかも!?

テトぐるみの写真
http://blog.livedoor.jp/sohsai/archives/51464356.html

ここで買えるらしい。
http://www.syumatutanken.net/200810/cgi-bin/shop/main.cgi?class=all&word=%83e%83g%82%AE%82%E9%82%DD

2009/02/11

C++0xの右辺値参照

右辺値参照の詳しい説明がここに。
http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

そしてありがたいことに日本語訳がここに。
http://d.hatena.ne.jp/ntnek/20090210/p1

これでもわからなければ、記事を参照しながら
gccで色々試せばよさそうだ。

2008/12/01

円グラフの見せ方

http://www.voltagecreative.com/blog/2008/11/scary-bailout-money-info-graphic/

め、目立つ。
やってることは簡単。

1位の項目が50%を占めていて、2位以下が残りを分け合っているときには、
円グラフを二つ書いて、片方は全て同じ色に塗りつぶして1位のみに割り当てて、
もう片方は2位以下のものを記入する。
1位の円グラフの色は目立つ色がよさそうだ。

まぁ、1位が50%になるように調整するのが難しいだろうが。

2008/10/23

ARM

ARMプロセッサの概略記事があった。
http://techtarget.itmedia.co.jp/tt/news/0810/23/news03.html

かいつまんでみると、

- 命令セット(アーキテクチャ)の名前の数字とプロセッサの名前の数字が
リンクしていない。
- バージョンが上がるほどパイプラインの段数が増えている。
ARMv3のころは3段、ARMv7では13段。
- パイプラインの段数増加に伴い、分岐予測機能が追加されている。
- ARMv6以降にはSIMD命令がある。
- Javaのバイトコードをネイティブ実行できる。

といったところだ。

2008/10/19

quilt

パッチ管理用スクリプト quilt というのがある。
https://savannah.nongnu.org/projects/quilt

使い方については、このページのDownloadから一番新しい
バージョンを取得し、それを展開するとドキュメントがdoc/以下に
できるので、それを参照すればよい。


ところで、googleでquiltで調べたのではなかなか
このページには行き着けない。
本当のキルトのページに行き着いてしまう…

2008/09/30

「食指」と「触手」

http://www.asahi.com/international/update/0930/TKY200809290353_01.html
タイトルが「…に仏も触手。」なんだが、
触手?食指?後ろがないといまいち分かりづらい。

gooの辞書によれば、
# 食指が動く:興味・関心をもつ。してみたい気持ちが起こる。
# 触手を伸ばす:自分のものにしようとして近づく。
だそうで、意味が似ているし、どっちでもよさそう。

2008/09/24

ホウレンソウ

そうかぁ、「ホウレンソウ」の意味は
「優柔不断に決断を先伸ばすこと」なのか。
http://www.doblog.com/weblog/myblog/17090/2615719#2615719

笑える。
確かに、報告して、連絡して、相談、するだけだったら、
何も決まらんもんな。

2008/07/20

WinXP SP3

SP3を当ててみた。
関連付けをことごとく壊してくれた。

.aviや.mpegの関連付けmplayer2にしていたのに
Windows Media Player 9 に再度割り当てられた。

そのうえ、Explorerの関連付けの設定からでは
どうやっても変更できず、mplayer2の関連付けの
設定部分でしか関連付けの変更ができない。


いったいどういう神経してんだか…
しょうもないところでいらん変更するなっつーに。

2008/07/19

ナノテクと電波で癌治療

新しい癌の治療方法が研究されているようだ。
http://wiredvision.jp/news/200807/2008071821.html
http://peswiki.com/index.php/Directory:John_Kanzius_Produces_Hydrogen_from_Salt_Water_Using_Radio_Waves

これまでは、放射線治療や化学療法や外科的な
処置が行われていたが、この方法が治療として
認められれば、かなり画期的なのではないだろうか。

その方法とは、ナノ粒子を癌細胞まで血液に乗せて運び、
そこに電波を当てることで、電子レンジのように
癌細胞を加熱して死滅させる方法だ。

ナノ粒子を使わない方法であれば、日本でも研究はされているとのこと。
http://www.okayama-u.ac.jp/user/ra1/forefront_rfa.htm

この方法については既に米CBSテレビで取り上げられている。
http://www.cbsnews.com/sections/i_video/main500251.shtml?id=4011961n?source=mostpop_video

2008/06/15

XAML でのアニメーション

XAMLのアニメーションについて分かったことをまとめる。

(1)
アニメーションには TargetProperty の型ごとに種類がある。
 DoubleAnimation : 型がDouble用
 SingleAnimation : 型がSingle用
 Int32Animation : 型がInt32用
 Int16Animation : 型がInt16用
 ColorAnimation : 型がColor用

基本的な型に対してこれ以外にも同様に存在する。

これらは AnimationTimeline を継承しているので
以下、各型に対するアニメーションの総称として
AnimationTimeline を用いる。

(1)
AnimationTimeline を管理するオブジェクトは<BeginStoryboard>である。
これが DoubleAnimation 等で指定する TargetProperty とリンクする。

リンク前の値を AnimationTimeline は憶えていて、
AnimationTimeline が破棄されると TargetProperty は元の値に戻る。

(2)
AnimationTimeline の FillBehavior に "HoldEnd" が指定されていると、
アニメーションが終わっても TargetProperty の値は最後の値が保持される。

"Stop"が指定されていると、アニメーションが終わると
該当する AnimationTimeline が破棄され TargetProperty は元の値に戻る。

デフォルトは"HoldEnd"

(3)
同じプロパティに対してEventTrigger と DataTrigger の両方を
設定し、さらにどちらにも FillBehavior="HoldEnd" としておくと、
EventTrigger の AnimationTimeline が優先される。

一度 EventTrigger によるアニメーションが発生すると、
そのままでは DataTrigger の AnimationTimeline は実行されない。

EventTrigger同士であれば、AnimationTimeline は
新しいものに書き換えられる。

(4)
EventTrigger によるアニメーション実行後に同じ TargetProperty に対して
DataTrigger によるアニメーションを有効に機能させるには、EventTrigger による
アニメーションを StopStoryboard によって破棄する必要がある。


具体的には次のようにすれば EventTrigger と DataTrigger が共存できる。

<EventTrigger RoutedEvent="Mouse.MouseEnter">
<BeginStoryboard Name="Test1">
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
To="1.0" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<DataTrigger Binding="{Binding XPath=@AAA}" Value="XXX">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="Test1"/>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
To="0.5" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>

2008/06/07

ListBoxでのホイールイベント (XAML)

マウスホイールのイベントをListBoxで取得するには、
  MouseWheel
ではなく
  PreviewMouseWheel
を使う。

MouseWheelはボタンなど他のコントロールでは有効だが、
ListBoxに関してはなぜか反応しないためである。


具体的には、
<ListBox Width="100" Height="100"
PreviewMouseWheel="MouseWheelHandler">
<ListBoxItem Content="AAA" />
<ListBoxItem Content="BBB" />
</ListBox>

のようにする。MouseWheelHandlerはC#で次のようなものを書けばよい。
private void MouseWheelHandler(object sender,
MouseWheelEventArgs e)
{
if(e.Delta > 0)
{
//前方に回転
}
if(e.Delta < 0)
{
//後方に回転
}
}

2008/06/03

ガソリン価格

街中のガソリンスタンドの価格を見てると、
ガソリン価格がどんどん上がっている。
店頭で1Lあたり170円くらいかな?
このまま行くと200円を超えそうだ。

でも、もっともっと上がればいい。
そうすればCO2の排出量が減って長期的には環境にはよいだろう。
市場原理で環境負荷が下がるなんて、なんてうまいシステムなんだ。

さらに毎年ガソリン税を上げていったほうがいいのではないだろうか。
加速度的に環境負荷を下げれるかもしれない。

今のシステムorフレームワークで商売をしている人たちには痛い話かもしれんが、
新しく台頭してくる企業もあるだろう。

車の使用コストが上がると、車がないと生活できない田舎が問題になる。
これは解決が難しいかもしれない。