2012年12月29日土曜日

Octave で PsychToolbox を動かす

はじめに

PsychToolbox という、 MATLABで動く心理学実験用ツールボックスがあります。
http://psychtoolbox.org/wikka.php?wakka=HomePage
最新版はバージョン3 。

日本語解説はこちら。
https://sites.google.com/site/ptbganba/


で、この PsychToolbox はフリーのMATLAB互換ソフト Octave でも動くらしい
ということで動かしてみました。


Octave on Windows で動かす

どうやらバージョンに結構依存するらしいので、最新版ではうごかないっぽいです。
少なくとも、 Windows 7 で以下は動きました。

1. Octave のインストール

最新の Octave 3.6.x では動かないようです。
そこで、3.2.4 をインストール。
http://sourceforge.jp/projects/sfnet_octave/downloads/Octave%20Windows%20binaries/Octave%203.2.4%20for%20Windows%20MinGW32%20Installer/Octave-3.2.4_i686-pc-mingw32_gcc-4.4.0_setup.exe/
これをダウンロードして、とりあえず全部入れる感じで。

インストールパスは C:\Octave になりました。

2. GStreamer のインストール

PsychToolbox は全画面で色々表示したりするので、そのライブラリが必要でうs。
具体的には次のライブラリをインストールします。
http://code.google.com/p/ossbuild/downloads/detail?name=GStreamer-WinBuilds-GPL-x86-Beta04-0.10.7.msi

3. QuickTime のインストール

QuickTime をインストールします。

4. TortoiseSVN のインストール

最新版を入れます。これは PsychToolbox の最新版をダウンロードするためです。
http://tortoisesvn.net/downloads.html

5. PsychToolbox のダウンロード

PsychToolbox は svn で公開されているので、落とします。

C:\Octave\3.2.4_gcc-4.4.0 を開いて右クリックして、 SVN Checkout を選びます。
で、
URL of repository に
http://psychtoolbox-3.googlecode.com/svn/beta/Psychtoolbox/
を入力して、 OK をクリック。するとぶわーっとダウンロードされます。

6. PsychToolbox の設定

初期設定がいるので、 Octave を開いてそれを実行します。
初期ディレクトリは C:\Octave\3.2.4_gcc-4.4.0\bin なので、

cd ..
cd Psychtoolbox
SetupPsychtoolbox 
でなんか実行されます。

7. libusb2.0 をインストール

PsychHID という関数などは、 libusb が無いといわれる。
そこで、
C:\Octave\3.2.4_gcc-4.4.0\Psychtoolbox\PsychContributed\
以下にある、
libusb-1.0.dll
を 
C:\Windows\system32 
にコピーしてあげるとうごく。

8. Demo とか動かしてみる

Octave を再起動するとパスが通っているので、
DotDemo
とか実行してみて、全画面で PsychToolbox とか表示されていればインストール終了。

plot 出来ない問題

このままだと、 Octave で
plot([1, 2, 3])
とかを実行してもグラフが表示されません。isstr が obsolete だとか言われます。

そこで、以下を実行してplot周りの問題を解決します。
pkg rebuild -noauto oct2mat

参考 URL:
http://octave.1599824.n4.nabble.com/warning-message-in-Octave-3-2-4-td3311391.html


2012年12月28日金曜日

Brython ことはじめ

概要

Python でブラウザ上で動くプログラムを書く javascript ライブラリ。
@qwerty__ に教えてもらった。
記事はこれかな。 http://www.moongift.jp/2012/12/20121227/


で、という感じで python をインタプリトしてくれる javascript が
brython らしい。

ざっと見た感じ

オフィシャルサイトはここ。
http://www.brython.info/index_en.html

tgz を解凍すると色々出てくる。
カレントディレクトリに brython ディレクトリを作って、その直下に全ファイルがあるとする。

カレントディレクトリで動く最小構成の HTML はこれ。




brython test








最初の script で brython.js を読み込んで、 bodyの onLoad で brython() を実行することで
初期化してるっぽい。
alert の中身をフォーマット文字列にしてちょっと python ぽくしてみた。

brython.js を読んでみたところ、標準で呼べるモジュールはこれらしい。

'time','datetime','dis','math','random','sys'


他にも、 DOM 触ったり、local strage 触ったり、できるみたい。
トップページの時計は、 canvas に draw しまくることで実現しているようだ。

今度なんか作ってみよう。




Sublime Text 2 設定覚え書き

最近はやりの Sublime Text 2 いいですね。

最初に、これでリポジトリからパッケージをインストール出来るようにします。
http://ready-study-go.blogspot.jp/2011/09/sublime-text-2.html

パッケージ

Ctrl + Shift + P,  install とタイプすると、
パッケージリストが出ます。

1. Python Pep8 Lint 文法・様式チェッカ
2. jslint javascript チェッカ

とりあえず入れてみたけどまだわからん。
html5, jquery, jquery snippet pack, Bracket highlighter, sidebarenhancement, sublimelinter


設定

Preferences Settings Default
1. use_tab_stop を false に --> 全部スペース
2. spell_check を true に

2012年12月24日月曜日

年収150万円で僕らは自由に生きていく

一言でまとめると、
「年収は下がってもいいから、やりがいのある仕事しようぜ!」
という話。たぶん20-30代向け。

まず、現状分析
これから先には (1) 経済成長と (2) 賃金の向上
はあんまり見込めない。
それなら、生活コストを下げて楽しく生きようぜという主張になる。


この主張を聞いて出てくる疑問としては次の2つぐらいがあって、本書ではそれらに答えている。

  1. ほんとに年収下がっても生きていけるの?
  2. やりがいのある仕事ってどうやって見つけるの?

1. ほんとに年収下がっても生きていけるの?

Yes. 実は年収は150万円でも一人ならやっていけると主張している。
一回エクセルとかで計算してみるといいと薦めている。
ここで重要なのは、実際に150万円になるかというよりも、
「最低何万円稼げば生きていけるのか?」
という感覚を持つことだと思う。

ここのポイントは以下の引用にまとまっている:
本来200万円もあれば余裕で生きていけるのに、年収400万円を稼ぐために
毎日心身を削りながら、鬱病になりかけてまで会社につとめる、なんて働き方は
望ましくないと思います。
さらに、
生きていくのに必要な金を減らすために、本書ではシェアハウス自炊を推奨している。
後者はともかく、前者は抵抗あるよなーとは思った。
でも世界的には結構流行ってるし、抵抗がない人が増えていくのかもしれない。

あとは、ネット不労所得 (= アフィブログとか) 得ようぜとかもある。
これは ウェブ進化論 本当の大変化はこれから始まる (ちくま新書) と同じ主張。

2. やりがいのある仕事ってどうやって見つけるの?

質問は4つ。
  1. その仕事は金のためにやっているか?
  2. その仕事はスキル向上のためにやっているか?
  3. 年収半分でもその仕事をするか?
  4. 一生低収入でもその仕事をするか?

結局、金やスキル以外の、「何か楽しいこと」とか「何か解決したい問題」のために
やっているかが重要なんだと言っていた。

で、そのためにボランティアしようぜと言っている。主にNPOの手伝い。
プロボノ推しまくり。初めて聞いた。
http://www.servicegrant.or.jp/

で、今時政治家に任せてうまくいくなんて甘くて、
自分で社会の解決したい問題を解決しようぜ!楽しいならそれはボランティアでいいじゃん。


あと気になった文:
お金の保証が無くなる怖さという、自分の『弱い部分』を会社に預けてしまうと
辞められなくなる
これは非常に同意できる。いつでも会社は辞めらる準備をすべきだと思う。



結局まとめると、
「金やスキル以外の評価軸を生きる上で作ろう」という良くある話になる。
確かに金をもらわなくてもやってて楽しいことはあって、
じゃあそれやればいいやんか。という主張はよく分かるし、同意できる。
週末にオープンソースプロジェクトのコード書くのと一緒。

こういうを日本の古い系企業とかは嫌がるんだろうか。


同意するにせよしないにせよ、一読をおすすめする。


2012年12月14日金曜日

long spectrogram visualizer

python + matplotlib で、
スライダーで表示部分を動かせるコードを書いてみた。
ポイントはスライダーにコールバックを入れて、 set_data するところ。
以下が動作例で、


以下がコード。


import sys
import numpy
import matplotlib.pyplot
import matplotlib.widgets
import matplotlib.mlab
import scikits.audiolab


# parameter
filename = sys.argv[1]
width = 100
NFFT = 512
noverlap = 256

# open wav and calculate spectrogram
wav, fs, fmt = scikits.audiolab.wavread(sys.argv[1])
spec = matplotlib.mlab.specgram(wav, NFFT=NFFT, noverlap=noverlap, Fs=fs)[0]
spec = numpy.log10(numpy.flipud(spec))

# make figure
fig = matplotlib.pyplot.figure()
ax_spec = fig.add_subplot(1, 1, 1)
pl_spec = ax_spec.imshow(spec[:, 0:width], interpolation="nearest")

# make slider
axtime = matplotlib.pyplot.axes([0.1, 0.03, 0.80, 0.03])
stime = matplotlib.widgets.Slider(
    axtime, 'Time', 0, spec.shape[1] - width, valinit=0, valfmt="%d")


# update callback and registor it.
class updater:
    def __init__(self):
        self.prevtime = 0

    def update(self, val):
        time = int(stime.val)
        if time == self.prevtime:
            return
        pl_spec.set_data(spec[:, (time):(time + width - 1)])
        ax_spec.set_xticks(range(0, width, 20))
        ax_spec.set_xticklabels(range(time, (time + width + 20), 20))
        matplotlib.pyplot.draw()
        self.prevtime = time
u = updater()
stime.on_changed(u.update)

# start main loop
matplotlib.pyplot.show()

2012年11月29日木曜日

bibtex で斜体かつ大文字にする方法

タイトルに学名がある場合、
たとえば

Acoustic Communication of Hyla japonica

みたいなのを bibtex で表示させたい場合は、

title = {Acoustic Communication of \emph{Hyla japnica}},

とやるといい。

参考
http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2008-09/msg00366.html

ついでに実は \it とかもう時代遅れらしい。

2012年11月4日日曜日

50歳から慕われる人煙たがられる人


50歳から 慕われる人 煙たがられる人


基本的に、
嫌われる人の特徴と、それの何が嫌われるのか、どうすればいいのか
の三つ組みのセット。

こんな感じの危機感あおる系自己啓発は嫌いなんだけども、
あまりにも周りにいる複数人の顔が浮かんだので
とりあえず買って読んでみると良いと思った。




2012年10月30日火曜日

sudo で GUIアプリケーションを起動したら GTKwarning で落ちる時

sudo じゃなくて gksu を使うといけることがある。

example
sudo ntfs-config --> fail
gksu ntfs-config --> success

2012年10月25日木曜日

Find duplicated file with python

linux用. md5sum コマンド でmd5sum のファイルリストを作成し
同じ md5sum を持つファイルをぶわーっと書きだす。 
 
 
import sys
import re
import itertools


#utility functions
def error():
    print "usage: python finddup.py rootpath extension"
def splitline(line):
   return re.match("([a-z0-9]+)[ ]+(.*)", line).groups()


#command line argument check
if len(sys.argv) == 3:
    os.system(r'find %s -name "*.%s" -exec md5sum {} \; > dup.md5'
              % (sys.argv[1], sys.argv[2]))
else:
    print "reading existing dup.md5..."
    error()

# open file
try:
    files = map(splitline, open("dup.md5"))
except:
    error()
    sys.exit(1)

# find duplicates and print them
for f1, f2 in itertools.product(files, files):
    md5sum1, path1 = f1
    md5sum2, path2 = f2
    if path1 == path2: continue
    if md5sum1 == md5sum2:
        print "duplicated:"
        print "    ", path1
        print "    ", path2


2012年10月20日土曜日

今期アニメ

K
絶園のテンペスト
リトルバスターズ
中二病でも恋がしたい
リトルバスターズ
BTOOM
好きっていいなよ
さくら荘のペットな彼女
CODE:BREAKER
ヨルムンガンド
武装神姫
PSYCHO-
ロボティクスノーツ

--つづき
ソードアートオンライン

2012年9月9日日曜日

最新 nodejs npm を apt-get でいれる

https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

websocket-server で Chrome からアクセス出来ない問題の解決策


Sec-WebSocket-Accept が無いために Chrome だとエラーがおこる。

(npm -i websocket-server したパス)/nodejs/node_modules/websocket-server/connection.js  を編集

console.log(connection);
var key = require('crypto')
            .createHash('sha1')
            .update(connection._req.headers['sec-websocket-key']
                    + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
            .digest('base64');
res += '\r\nSec-WebSocket-Accept: ' + key;

377行目の直前に書く。

377  connection._socket.write(res + '\r\n\r\n', 'ascii');


2012年9月4日火曜日

python で関数に大量の引数をまとめて与える。

たとえば、 struct.pack で 200個の長さのlist をバイナリにしたいとする。
でも、 struct.pack は

    struct.pack(format, p1, p2, ...)

なので、単純には p1, ..., p200 の引数を書かないといけない。つまり
    values = range(100)
    packed = struct.pack("<" + "L" * 100, values[0], values[1], ..., values[199])

でもこれはあまりにしんどい。そんなときは, * を使えば展開可能
    packed = struct.pack("<" + "L" * 100, *(values))


2012年8月22日水曜日

trac+svn でコミットログを書き換える

* subversion サーバ設定
リポジトリのディレクトリ以下の
hooks/pre-revprop-change.tmpl
の .tmpl を消して実行権限をつける

* ログ編集
TortoiseSVN でチェックアウトし、
Show Log でログ表示、右クリックして

* trac のログを更新
trac のプロジェクトのディレクトリに cd して、
trac-admin . resync <リビジョン番号>

とすれば更新完了

2012年7月31日火曜日

サーバメモ Ubuntu 12.04

あとで清書予定。単語間違ってるかも
http://www.server-world.info/query?os=Ubuntu_12.04&p=mail&f=1

/etc/network/interfaces
   iface eth0 inet static
   address, network, netmask, broadcast
   dns-nameservers, gateway はルータのIP

CTU設定 (フォワーディング、ファイアウォール)
   静的ポート変換、ファイアウォール、DHCPサーバ機能設定

ufw
   sudo ufw allow ssh
   sudo ufw allow http
   sudo ufw enable

nginx
   sudo apt-get install nginx-full

Putty
   puttygen で鍵生成
   .ssh/config
      Host HOSTNAME
      IdentityFile .ssh/public_key.pub
   ssh-keygen -i -f .ssh/public_key.pub >> authorized_keys # puttygen で生成したファイルを変換

OpenSSH
   apt-get install openssh-server openssh-client openssh-blacklist openssh-blacklist-extra
   /etc/ssh/sshd_config で PasswordAuthentication no, UsePAM no
   * ssh_config じゃないので注意

Squid
   sudo apt-get install squid3
   vi /etc/squid3/squid.conf
   acl localnet src 192.168.24.0/24
   http_access allow localnet

Fail2ban
   apt-get install fail2ban
   vi /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 192.168.24.0/24
maxretry = 3
findtime = 600
bantime = 600
backend = polling

[ssh]
enabled = true
[ssh-ddos]
enabled = true

Wordpress
    apt-get install php5-fpm php5-mysql php5-cli mysql-server

    * nginx
    sites-available/default の location に追加。ほとんどデフォルトのままでおk
    server {
        listen 80;
        root WWWPATH;

        index index.htm index.html index.php;    # index.php が無いとログインでこける

        server_name DOMAIN;
        location / {
                try_files $uri $uri/ /index.html;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
   }
 
    * php5
    /etc/php5/fpm/pool.d/www.conf の
    listen = 127.0.0.1:9000 をコメントアウトして
    listen = /var/run/php5-fpm.sock を追加

    そして、 sudo service php5-fpm restart

    * mysql
    mysql -u root -p
    apt-get 時に設定したパスワード入力
    create database wp;


    いろいろ設定かえたので、本来は該当するやつを
    service SERVICENAME restart すればよいが、
    とりあえず一回再起動(=全部 restart)するとうまくいく
 

    * web I/F
    あとは、 readme.html を読みながら設定
 


Postfix
   apt-get まで

Dovecot
   apt-get まで
Monit
   apt-get install monit

SparkleShare
   sudo apt-get install git

MediaServer
    streemee?

Django
    aa

2012年7月9日月曜日

2012年夏

今期予約済
貧乏神が!
人類は衰退しました
TARI TARI
うぽって
ホライゾン
アルカナファミリア
ソードアートオンライン

つづき
エウレカセブン


たまってるやつ
アクセルワールド
あっちこっち
謎の彼女
ZETMAN
かんなぎ
夏色キセキ
坂道のアポロン

2012年6月14日木曜日

Python: Separate a list into subsequences using diff

リストを、隣り合う数の差がしきい値より大きい複数のリストに分割したい。


x = [1, 2, 3, 100, 101, 102, 103, 200, 201, 202, 203]
y = [[1, 2, 3], [100, 101, 102, 103], [200, 201, 202, 203]]
に変換したい。


import numpy
thresh = 60
x = [1, 2, 3, 100, 101, 102, 103, 104, 200, 201, 202, 203]
y = [numpy.array(x)[i+1:j+1].tolist()
     for i, j 
     in zip(numpy.concatenate([
                [-1,], 
                numpy.where(numpy.diff(x) > thresh)[0]
              ]), 
            numpy.concatenate([
                numpy.where(numpy.diff(x) > thresh)[0], 
                [len(x),]
              ])
            )
     ]

2012年6月4日月曜日

複数行を1行にまとめるコマンド

paste を使えば、複数行をまとめられる。

# ls
dira
dirb
filea

の場合、
# ls | paste -s
dira dirb filea
と出力される。

2012年2月18日土曜日

emac flyspell

emacs で M-x flyspell-mode とすると、スペルチェックをしてくれる。

apt-get install aspell-en
とかを入れとくとよい

また、
echo "lang en_US" > ~/.aspell.conf
をする必要がある。

Reference: 
http://d.hatena.ne.jp/mooz/20091107/p1

2012年2月15日水曜日

python で記憶つきの関数を作る

関数に静的変数を使いたいときは、 クラス +  __call__ を使う。
オブジェクトを作っておけば、そのオブジェクトを呼び出したとき (= __call__呼び出し) に色々できる。


例えば、3の倍数が与えられたときだけカウントする関数 memory
class Memory:
    def __init__(self):
        self.count = 0
    def __call__(self, i):
        if i % 3 == 0:
            self.count += 1
        return self.count

if __name__ == "__main__":
    memory = Memory()
    for i in range(10):
        print i, memory(i)


結果が以下。
左列がカウント, 右列が3で割った余りが0の数。

0 1
1 1
2 1
3 2
4 2
5 2
6 3
7 3
8 3
9 4


2012年1月31日火曜日

pylab でプロットした画像の余白を消す方法 その2

以前は Inkscape を使う方法を紹介したが、
http://mzmttks.blogspot.com/2011/03/pylab.html

pylab.savefig のオプションで、画像生成時に余白を消せる。

pylab.savefig("filename", bbox_inches="tight", pad_inches=0.0)

ちょっとだけつけたければ pad_inches に値を入れればよい。
これは、画像のフォーマットによらない。

Thanks @miracjp

2012年1月29日日曜日

HTML5 Canvas ratio is strange

HTML5 の Canvas で描画したとき、拡大されているように見える。

これは、
canvas の attribute の width, height と,  style の width, height が一致していないのが原因。

つまり、以下の設定で
< canvas height="H1" style="height: H2; width: W2;" width="W1">
W1 != W2
H1 != H2
のとき、描画が拡大/縮小されているように見える。


English:
If the drawn figure of canvas in HTML5 is strange, check the width and height.
if the ATTRIBUTE of them and STYLE of them are not the same,
this is the reason.

In other words,
in the following tag:
   [lt] canvas height="H1" style="height: H2; width: W2;" width="W1" [gt]
if W1 != W2 or H1 != H2, the ratio is not valid.