2014年12月11日木曜日

Mac OSX なぜか日本語入力が消せなくなった。対処法

普段からGoogle日本語入力を使っているのだが、あるアップデート時(多分Mountain Lionあたり)からなぜか純正日本語入力(ことえり?)が日本語入力の入力ソースの切り替えのオプションに入ってきて、しかも消せなくなった。この状態だと「日本語(Google)」、「日本語(ことえり)」、「Romaji」の3つの入力ソースを切り替えて使わなくてはならず煩わしい。削除したいが、入力ソースのことえりを削除するための-ボタンが無効にされている。

色々調べたところ、この記事から最低ひとつは英字入力ができるようになっていないといけない制約があることがわかった。上の絵をよく見ると実ははことえりがRomajiのところにチェックがついていて英字入力を可能にしている。英字入力の役割を担っているのがこのことえりのみとなっているために消せないということだ。つまり、別の英字入力ソースを加えれば消せるということ。
上図のように英字入力を入力ソースとして加える。
するとことえりを削除するための-ボタンが有効になるので、押す。
消える。

2014年12月10日水曜日

RHEL5でHaskell Platformをソースコードからホームディレクトリにインストールした時のメモ

以下のことをやっても結局動かない(PanDocを入れたかっただけなのですが、インストール失敗)。

基本的には以下のページを参考にした。
http://twdkz.wordpress.com/2011/12/21/installing-ghc-7-0-3-and-the-haskell-platform-on-rhel-5-6/

ダウンロードするもの

  • ghc-6.8.3-x86_64-unknown-linux.tar.bz2
  • ghc-6.10.4-src.tar.bz2
  • ghc-7.0.3-src.tar.bz2
  • haskell-platform-2011.2.0.1.tar.gz


それぞれ、GHCのページとHaskellのページから取ってきた。
Haskellの2011.2.0.1を入れるにはghc-7.0.3が必要で、ghc-7.0.3をソースからインストールするにはghc-6.10.4が、ghc-6.10.4にはghc-6.8.3が必要であるということで順番にいれていく。ghc-6.8.3ならglibcなどバージョンの関係でなのか、Linuxバイナリ版をインストールができるのでそれを使っている。ちなみにghc-7.0.3のインストールには新しいバージョンのgccが必要らしい。私の環境では幸いgcc4.1.2だけでなく、gcc4.4.1が入っていたのでそれをつかった。

ghc-6.8.3

SOFTWARE=$HOME/.software
tar xvf ghc-6.8.3-x86_64-unknown-linux.tar.bz2
cd ghc-6.8.3
CC=gcc44 ./configure --prefix=$SOFTWARE/ghc-6.8.3
make install
特に問題なくインストールできた。

ghc-6.10.4

ビルドの前に先ほどインストールしたghc-6.8.3のbinにパスを通してからインストール。
export PATH=$SOFTWARE/ghc-6.8.3/bin:$PATH
cd ../
tar xvf ghc-6.10.4-src.tar.bz2
cd ghc-6.10.4
./configure --prefix=$SOFTWARE/ghc-6.10.4 --with-gcc=gcc44
make && make install
makeに失敗。bfd.hのところで、#error config.h must be included before this header みたいなエラーがでた。Stackoverflowの投稿によると、autotools?を使っていないためPACKAGEとPACKAGE_NAMEがdefineされておらず怒られているっぽい。とりあえずの解決策として、怒られていたrts/Printer.cの先頭部分に
#define PACKAGE 1
#define PACKAGE_NAME 1
を入れて再度makeしたらコンパイルが通った。

ghc-7.0.3

export PATH=$SOFTWARE/ghc-6.10.4/bin:$PATH
cd ../
tar xvf ghc-7.0.3-src.tar.bz2
cd ghc-7.0.3
./configure --with-gcc=gcc44
make && make install
先ほどと同じbfd.hでこけるので同じ対応をしてビルド成功。

hasklell-platform-2011.2.0.1

export PATH=$SOFTWARE/ghc-7.0.3/bin:$PATH
cd ../
tar xvf haskell-platform-2011.2.0.1.tar.gz
cd haskell-platform-2011.2.0.1
./configure --prefix=$SOFTWARE/haskell-platform --with-gcc=gcc44
make
make install
問題なく成功。あとは.bashrcなどに以下のようなものを追加すれば良い。インストールの時に使ったファイルや古いGHCは消しても良い(と思う)。
SOFTWARE=$HOME/.software
export PATH=$SOFTWARE/haskell-platform/bin:$SOFTWARE/ghc-7.0.3/bin:$PATH

Cabalが動かん

cabal updateするとcabal-installの更新をしろと言われる。cabal install cabal-install をしてインストールしようとするが怒られる。
couldn't read caba file xxxx.cabal
的なことを言われる。stackoverflowのRichard曰く、cabalファイルのフォーマットが変わってしまい、古いcabalで読めないとのこと。新しいCabalをhttp://hackage.haskell.org/packages/archive/cabal-install/1.16.0.2/cabal-install-1.16.0.2.tar.gzからダウンロードしてREADMEの指示に従いインストールすることで解決ができるとのこと。
wget http://hackage.haskell.org/packages/archive/cabal-install/1.16.0.2/cabal-install-1.16.0.2.tar.gz
tar xvf cabal-install-1.16.0.2.tar.gz
cd cabal-install-1.16.0.2
chmod +x bootstrap.sh
./bootstrap.sh
$HOME/.cabal/binにバイナリができるので、忘れずにパスを通す設定をする。

2013年4月4日木曜日

rvm + gitlab (>= 5.0) 問題の解決方法

GitLab4.1(Ubuntu 10.04 LTS + RVM)をインストールしてみた

Gitlabを5.0にアップグレードしたらRVMとの相性の問題でつまずいた。
GitlabのWikiのホームにあるアップグレードの通りにやるとまぁ一見問題なくアップグレードされたように思えた。

しかし、リモート(自分のデスクトップ)からサーバー(Gitlabが動いているサーバー)のリポジトリのクローンを作成するときにエラーが吐き出された。

/home/git/gitlab-shell/bin/gitlab-shell:8: undefined method `require_relative' for main:Object (NoMethodError)
どうやらrvmで設定したruby1.9.3が呼ばれていない模様。ユーザーgit向けにrvmはインストール済みでログインするとちゃんと
which ruby 
/home/git/.rvm/rubies/ruby-1.9.3-p392/bin/ruby
とでる。 実はgit cloneは内部的にはSSHでgitユーザーでgitサーバーに接続して、サーバー側の~git/.ssh/authorized_keysに書かれたコマンドを実行するようになっている。そのコマンドは~git/gitlab-shell/bin/gitlab-shellを呼び出す。それがruby >1.9.2以上であることを想定して書かれている。

同じ問題にぶつかっている人がgithubのgitlabのissueに書き込んでいた。
gitlab-shell + rvm · Issue #12 · gitlabhq/gitlab-shell

zzetとProfのやり取りが面白い。よくわかってない人がわかっている人にアドバイスするという滑稽なやりとり。

実はsshで直接コマンドを実行する場合。どのrcスクリプトも読まれないのです。つまり、.bashrcも.zshrcも.profileもなにも読まれない。もちろん、/etc/profile.dの中にあるスクリプトも読み込まれない。 (その話をしているのに、zzetはそんなはずはない。と見当違いなことを言い続けている。どんなに論拠をProfが見せてもなぜかスルー。 )

そのため、RVMの設定が読まれないでいた。解決策としては2つ挙げられている。
  1. Gitlabのコードを変更して、最初にRCスクリプトを読み込む方法
  2. 「[unix] ssh-env - ssh実行時に環境変数を設定/変更したい」 の方法でsshの環境変数を設定する方法
私は環境側の設定を変更するのがどうも嫌だったので1.の方法をとった。
1.の方法でも2つあったが、とりあえず簡単な方のgitlab-shellを変更する方法にした。
  1. gitlab-shellをコピーしてgitlab-shell.realというファイルを作成
  2. gitlab-shellを以下のように変更
    #! /bin/bash
    
    # RVM installed with single-user mode
    PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
    [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session as a function
    
    # RVM installed with multi-user mode
    #RVMSH_PATH="/etc/profile.d/rvm.sh"
    #[[ -s $RVMSH_PATH ]] && source $RVMSH_PATH # Load RVM into a shell session as a function
    
    
    exec /home/git/gitlab-shell/bin/gitlab-shell.real $@
    

とりあえず、マルチーユーザーモードでRVMをインストールしている場合は下のマルチユーザー向けの設定を読み込むようにすると良い。(両方読み込んでも問題ないかも。マルチユーザー用RVMの仕組みがよくわかっていない。。)

ソースコードを変更するのでアップグレードをするときに注意が必要。

2013年2月11日月曜日

GitLab4.1(Ubuntu 10.04 LTS + RVM)をインストールしてみた

GitLabとはGitHub4.3のクローンのオープンソースソフトウェアです。
今回は仮想マシンにUbuntu 10.04 LTS 64-bitをクリーンインストールしてやってみた。
基本的に本家のGitページのdoc/install/installation.mdを参考に行っただけ。
ただし、RVM(ルビーの仮想環境)を使ったのでやり方が微妙に異なります。
普通のやり方と異なるところだけ書きます。それ以外は1から順番にやってください。

2. Ruby

RubyはソースからインストールしないでRVMからインストールする。ユーザーtaro(Admin)がいるとします。taroでインストールしていきます。今回はMulti-Userモードでインストールして、どのユーザーもRVMを使えることを想定しています。
まず、RVMのインストール。通常は次のコマンドでOK。
taro$ \curl -L https://get.rvm.io | sudo bash -s stable
もしプロキシを使っていてうまく行かなかった場合は、環境変数HTTPS_PROXYをtaroで設定していたら、sudoに環境変数を渡すために-Eオプションをつけます。この後も、ネットワーク問題でハマったら、sudo -Eとしてください。

taro$ \curl -L https://get.rvm.io | sudo -E bash -s stable
これで、/usr/loca/rvmにrvmがインストールされました。

今回は、taroをrvmのAdminにするためにグループにtaroを追加して書き込み権限を付与します。

taro$ sudo usermod -aG rvm taro
~/.bashrcなどに以下を追加。
source /etc/profile.d/rvm.sh
ログインしなおして
taro$ id
...rvmがグループに追加されているのを確認
ruby 1.9.3のインストール
taro$ rvm install 1.9.3
taro$ rvm use --default 1.9.3
この時点ではbundlerはインストールしない。あとで、ユーザーgitlab(3. System Usersで追加される)だけにインストールする。

Install Gems

ユーザーgitlabにrvm環境を設定する。
taro$ sudo su - gitlab
~/.bashrcなどに"source /etc/profile.d/rvm.sh"を追加して再読み込み。
gitlab$ source .bashrc
gitlabユーザー固有のgemsetを作る。
gitlab$ rvm user gemsets
gitlab$ rvm istall 1.9.3
gitlab$ rvm use --default 1.9.3
gitlab$ rvm gemset create
gitlab$ rvm gemset use default
gitlab$ rvm gemset install bundler
gitlab$ rvm gemset install charlock_holmes --version '0.6.9'
DBにはMySQLを使ったので、without postgresでインストール。
gitlab$ cd /home/gitlab/gitlab
gitlab$ bundle install --deployment --without development test postgres

Initialise Database and Activate Advanced Features

taro$ sudo su - gitlab
gitlab$ cd gitlab
gitlab$ bundle exec rake gitlab:setup RAILS_ENV=production
ここでしくじる。execコマンドがないと怒られる。調べると、issueが投稿されてた。Squeeze-backportsリポジトリからredis-serverを入れなおせとのこと。多分RedisServerが古かったのかと思われる。Ubuntu10.04。リポジトリを追加するために、/etc/apt/sources.list.d/squeeze-backports.listというファイルに
deb http://backports.debian.org/debian-backports squeeze-backports main
を書いて保存
taro$ sudo apt-get update
キーが認証されてないとか言われたので、
taro$ sudo -E apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AED4B06F473041FA
taro$ sudo apt-get update
taro$ sudo apt-get remove redis-server
taro$ sudo apt-get -t squeeze-backports install redis-server
インストールされたので、再度
gitlab$ bundle exec rake gitlab:setup RAILS_ENV=production

Check Application Status

taro$ sudo su - gitlab
gitlab$ cd gitlab
gitlab$ bundle exec rake gitlab:env:info RAILS_ENV=production
gitlab$ bundle exec rake gitlab:check RAILS_ENV=production
これで動きました。ローカルではない場合もservernameなどちゃんと設定すれば動きます。 参考: http://d.hatena.ne.jp/hiro_nemu/20120811/1344656084

2013年2月6日水曜日

Chromeで埋め込みのyoutube動画が再生されないときの対処法

<embed>タグで埋め込まれたyoutubeの動画が再生されなくなった。環境はMac OSX Lion のChorme。調べた。
Embedded YouTube videos won't play in Chrome - Google Groups
Embedded Videos Not Playing In Chrome? Here's How To Fix It



要はクッキーを削除すれば良いとか。設定を開く(英語ですがわかりますよね。まんまコピってきました。)


設定(Settings)を開く
下の方にあるShow advanced settings(上級者向け設定?)をクリック

プライバシー設定のところの「ブラウジングデータ消去」的なことが書かれているボタンを押す。

すると下のボックスが表示されれるので、「最初」とか「全部」とかに合わせて上の4つをチェックして消去ボタンを押す。

これで動いた。

2013年2月5日火曜日

Scipy.WeaveでPythonにC++埋め込み 5 Numpyの利用

前回の続き
前回はweave.inlineメソッドへのNumpy受け渡しの基本事項について書きました。今回は実際に計算をしていきます。
まず、前回にもお見せした、行と列のインデックスを足して3の倍数となる要素を0にする計算のpure Pythonバージョンをお見せします。
def numpy_mult3_0_pure(npArr):
    for r in xrange(npArr.shape[0]):
        for c in xrange(npArr.shape[1]):
            if (r + c) % 3 == 0:
                npArr[r, c] = 0
これを次のように呼び出す。
>>> side = 1000
>>> npArr = np.ones((side, side))
>>> numpy_mult3_0_pure(npArr)
>>> print npArr
結果は、以下。
[[ 0.  1.  1. ...,  1.  1.  0.]
 [ 1.  1.  0. ...,  1.  0.  1.]
 [ 1.  0.  1. ...,  0.  1.  1.]
 ..., 
 [ 1.  1.  0. ...,  1.  0.  1.]
 [ 1.  0.  1. ...,  0.  1.  1.]
 [ 0.  1.  1. ...,  1.  1.  0.]]
まったく前回のコピペです。
これのweaveバージョンは以下のようになります。
def numpy_mult3_0_weave(npArr):
    code = """
    for(int r = 0; r < NnpArr[0]; r++) { 
        for(int c = 0; c < NnpArr[1]; c++) {
            if((r + c) % 3 == 0) {
                NPARR2(r, c) = 0;
            }
        }
    }
    """
    weave.inline(code, ['npArr'])
前回やった、N+(変数名), (変数名大文字)+(次元数)のアクセス用マクロ関数を使えば、上のように書けるのです。どのくらい早くなるのか時間を計測してみます。
side = 1000
npArr = np.ones((side, side))
from context_timer import Timer
with Timer("Pure"):
    numpy_mult3_0_pure(npArr)
with Timer("Weave"):
    numpy_mult3_0_weave(npArr)
このTimerについてはこちらの記事をご覧ください。出力は以下です。
[Pure] Elapsed: 0.272620201111
[Weave] Elapsed: 0.00578308105469
Weaveの方が50倍近く早くなっていることがわかります。こんな感じにPythonコードにC++のコードを書くことで高速化することができます。

Scipy.WeaveでPythonにC++埋め込み 4 Numpyの基本

前回
PythonにはNumpy(とScipy)というMatlabに似たインターフェースを持つ数値計算に非常に便利なパッケージがあるのはご存知でしょう。というか、Weaveについて調べてココにたどり着いたなら、知っていて当然ですね。例えばこんな感じ。
import numpy as np # numpyのインポート

# 乱数配列の生成 2行3列
a = np.random.rand(2,3)
b = np.random.rand(2,3)

# 各要素ごとの掛け算 Matlabだと a .* b
c = a * b

# 行列としての掛け算 Matlabだと a' * b
d = np.dot(a.T, b) # C = A^T * B (Cは2行2列になります)

# 固有値分解
[E, V] = np.linalg.eig(d)
Matlabでできることはほぼ全部できます。しかも、無料で。このページは参考になります。Numpy for Matlab Users
行列演算や要素同士、固有値計算などのメソッドなどはCで実装されているので高速に実行できます。しかし、こういった汎用的な演算でない場合はPython上でループを回したりして配列にランダムアクセスするようなコードを書く必要がでてきます。 Pythonのようなスクリプト言語でそういったコードを書くと激遅になりますよね。例えば、ある配列の行のインデックスと列のインデックスを足した値が3の倍数だったら0に書き換えるというコードをPythonで書くと次のようになります(あまり良い例ではないですが、お許しください!)。
def numpy_mult3_0_pure(npArr):
    for r in xrange(npArr.shape[0]):
        for c in xrange(npArr.shape[1]):
            if (r + c) % 3 == 0:
                npArr[r, c] = 0
これを次のように呼び出す。
>>> side = 1000
>>> npArr = np.ones((side, side))
>>> numpy_mult3_0_pure(npArr)
>>> print npArr
結果は、以下。
[[ 0.  1.  1. ...,  1.  1.  0.]
 [ 1.  1.  0. ...,  1.  0.  1.]
 [ 1.  0.  1. ...,  0.  1.  1.]
 ..., 
 [ 1.  1.  0. ...,  1.  0.  1.]
 [ 1.  0.  1. ...,  0.  1.  1.]
 [ 0.  1.  1. ...,  1.  1.  0.]]
時間を計測すると、0.384463787079[秒]でした。 これをWeaveを使ってC化して高速化します。この例に移る前にNumpyをWeaveに使う場合の基本から見ていきます。 weave.inlineはPython変数を渡すと自動的にC内で適当な型に変換してくれます(converterを指定することも可能)。Numpyのndarrayを渡した場合も自動で色々と変換を施してくれます。次の例を見てみます。
def numpy_converted_vars():
    npArr = np.zeros((2, 3, 4), dtype=np.uint16)
    npArr[1, 1, 3] = 1
    print '(py) ndim:', npArr.ndim
    print '(py) shape:', npArr.shape
    print '(py) strides:', npArr.strides
    code = """
    // Number of dimension
    std::cout << "ndim: " << DnpArr << std::endl;
    
    // Shape
    std::cout << "shape:";
    for (int i = 0; i < DnpArr; i++) std::cout << " " << NnpArr[i];
    std::cout << std::endl;
    
    // Strides
    std::cout << "strides:";
    for (int i = 0; i < DnpArr; i++) std::cout << " " << SnpArr[i];
    std::cout << std::endl;
    
    // Access to data as a three dimensional array
    std::cout << "npArr[1, 1, 3]: " << NPARR3(1, 1, 3) << std::endl;
    """
    weave.inline(code, [u'npArr'])
このメソッド内では、まず2×3×4の形のすべての要素が0の3次元配列を作ります。確認の為に[1,1,3]の要素だけ1を代入しておきます。 データ型がuint16=2[bytes]で、3次元、C-contiguousのメモリ上のデータ配置で、2 * 3 * 4の形なので、上の3つのprintの結果は
(py) ndim: 3
(py) shape: (2, 3, 4)
(py) strides: (24, 8, 2)
となります。stridesのところとかよくわからない人はこの画像を見て理解するかググってください。
Cのinlineコードの中でこれらにアクセスする方法を見ていきます。ndim, shape, stridesはinlineメソッドの内部でN, D, Sという接頭辞をつけてNnpArr(int), DnpArr(npy_int*), SnpArr(npy_int*)という名前で使用可能になります。npy_int型はint64かint32(環境に依存)のtypedefだと思います。実際にCの内部でどのように変換されているかを生成された.cファイルを見てみます。npArrのオブジェクトはCコードの中では、PyArrayObjectというNumpyのC内部での構造体として解釈し、npArr_arrayという名前で使えるようにしてくれています。
PyArrayObject* npArr_array = convert_to_numpy(py_npArr,"npArr");
NumpyのC APIについては各自ぐぐって欲しいのですが、PyArrayObject構造体のメンバにstridesなどがあるので、
npy_intp* NnpArr = npArr_array->dimensions;
npy_intp* SnpArr = npArr_array->strides;
int DnpArr = npArr_array->nd;
で値を取り出してくれています。inlineコードのndim, shape, stridesの出力は次のようになり、python側での出力と一致しています。
ndim: 3
shape: 2 3 4
strides: 24 8 2
肝心のnpArrという名前は以下のように配列のデータへの先頭ポインタのアドレスを取り出したものとして宣言しています。
double* npArr = (double*) npArr_array->data;
一次元配列としてアクセスする場合はnpArr[0]などとアクセスすれば値を取り出せますが、この例では3次元配列なので、stridesを使って要素にアクセス必要があります。たとえばnpArr[i, j, k]にアクセスしたい場合は、以下のようにする必要があります(PyArrayObject*->dataはchar*型)。
*((double*)(npArr_array->data + (i * SnpArr[0] + j * SnpArr[1] + k * SnpArr[2])))
しかし、これはめんどくさい。実はこれをやるためのマクロ関数を最高4次元配列の場合まで定義してくれています。
#define NPARR1(i) (*((double*)(npArr_array->data + (i)*SnpArr[0])))
#define NPARR2(i,j) (*((double*)(npArr_array->data + (i)*SnpArr[0] + (j)*SnpArr[1])))
#define NPARR3(i,j,k) (*((double*)(npArr_array->data + (i)*SnpArr[0] + (j)*SnpArr[1] + (k)*SnpArr[2])))
#define NPARR4(i,j,k,l) (*((double*)(npArr_array->data + (i)*SnpArr[0] + (j)*SnpArr[1] + (k)*SnpArr[2] + (l)*SnpArr[3])
3次元配列の場合はnpArrの名前を大文字にして後ろに3をつけた名前が付けられていますので、上のようにpython側でnpArr[1,1,3]=1で変更した値にNPARR3(1,1,3)でアクセスできています。
npArr[1, 1, 3]: 1
今回はNumpyのweave.inlineへの受け渡しの基本を紹介しました。次回に実際計算してみます。