tag:blogger.com,1999:blog-44026443774658641822024-03-13T21:10:37.870+09:00馬の脳機械学習、科学計算、Webアプリ開発、モバイルアプリ開発、開発環境に関する記録Unknownnoreply@blogger.comBlogger63125tag:blogger.com,1999:blog-4402644377465864182.post-1769765594636487182014-12-11T17:50:00.003+09:002014-12-11T17:50:33.302+09:00Mac OSX なぜか日本語入力が消せなくなった。対処法普段からGoogle日本語入力を使っているのだが、あるアップデート時(多分Mountain Lionあたり)からなぜか純正日本語入力(ことえり?)が日本語入力の入力ソースの切り替えのオプションに入ってきて、しかも消せなくなった。この状態だと「日本語(Google)」、「日本語(ことえり)」、「Romaji」の3つの入力ソースを切り替えて使わなくてはならず煩わしい。削除したいが、入力ソースのことえりを削除するための-ボタンが無効にされている。<br />
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiONsb-SNuZx_9pg1hu59XCdAgFUXS3XuFS4orNcHaD1mSUSs-LA7NkAGW5bR1eOMmHmflZHjqMo6RGu3bwvrVrOO2nfk27fRcw_qe2i2gRGG_GxNNkBtTGmXyuZO3qtmu8Gofp_t_ffmI/s1600/Screen+Shot+2014-12-11+at+12.38.15+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiONsb-SNuZx_9pg1hu59XCdAgFUXS3XuFS4orNcHaD1mSUSs-LA7NkAGW5bR1eOMmHmflZHjqMo6RGu3bwvrVrOO2nfk27fRcw_qe2i2gRGG_GxNNkBtTGmXyuZO3qtmu8Gofp_t_ffmI/s1600/Screen+Shot+2014-12-11+at+12.38.15+AM.png" height="355" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
色々調べたところ、<a href="https://teachme.jp/contents/105610" target="_blank">この記事</a>から最低ひとつは英字入力ができるようになっていないといけない制約があることがわかった。上の絵をよく見ると実ははことえりがRomajiのところにチェックがついていて英字入力を可能にしている。英字入力の役割を担っているのがこのことえりのみとなっているために消せないということだ。つまり、別の英字入力ソースを加えれば消せるということ。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbN9rgEkYSGVPp8RvGUs0-9GqkwLPKh9VzRDehbpSqvkq7mfVCQtOphpUBEXAnjrEtXEBWI68lg9oDU2vhoGT0UjAOmNYLeAvsrVBaRVcBtRLHzyFBZGYmOs8FJHNu77IEXvurhoXsCNg/s1600/Screen+Shot+2014-12-11+at+12.47.51+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbN9rgEkYSGVPp8RvGUs0-9GqkwLPKh9VzRDehbpSqvkq7mfVCQtOphpUBEXAnjrEtXEBWI68lg9oDU2vhoGT0UjAOmNYLeAvsrVBaRVcBtRLHzyFBZGYmOs8FJHNu77IEXvurhoXsCNg/s1600/Screen+Shot+2014-12-11+at+12.47.51+AM.png" height="355" width="400" /></a></div>
上図のように英字入力を入力ソースとして加える。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6jZjyaLaqFmlnjo58EtZosx_E7hQ46M6w8RW5XiU6MtVhsq54NfTIL3BTD46iFjKZBYFV4GoJR_67dlyYSH9aXZgKiO5pXvS8kMccYbSV8BHoHOEAmk4GTIhhMzya5qdyFeTybS1xDvY/s1600/Screen+Shot+2014-12-11+at+12.48.20+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6jZjyaLaqFmlnjo58EtZosx_E7hQ46M6w8RW5XiU6MtVhsq54NfTIL3BTD46iFjKZBYFV4GoJR_67dlyYSH9aXZgKiO5pXvS8kMccYbSV8BHoHOEAmk4GTIhhMzya5qdyFeTybS1xDvY/s1600/Screen+Shot+2014-12-11+at+12.48.20+AM.png" height="355" width="400" /></a></div>
するとことえりを削除するための-ボタンが有効になるので、押す。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYHRn2SLPogCxfNQDMZX5jhhApaak8lcsRnlUjilEvFOxRoGwx2_aEErFaLy0TGEv080MSsMH0MVmXDNgJatEnE0S7R_lmweZvw3NipEh_KdUEh_RFKSNAzAGI_Mxjc3VkqndZmBqYYGk/s1600/Screen+Shot+2014-12-11+at+12.49.58+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYHRn2SLPogCxfNQDMZX5jhhApaak8lcsRnlUjilEvFOxRoGwx2_aEErFaLy0TGEv080MSsMH0MVmXDNgJatEnE0S7R_lmweZvw3NipEh_KdUEh_RFKSNAzAGI_Mxjc3VkqndZmBqYYGk/s1600/Screen+Shot+2014-12-11+at+12.49.58+AM.png" height="355" width="400" /></a></div>
消える。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-39656268954477460962014-12-10T11:37:00.001+09:002014-12-20T05:24:52.622+09:00RHEL5でHaskell Platformをソースコードからホームディレクトリにインストールした時のメモ<b><span style="color: red;">以下のことをやっても結局動かない(PanDocを入れたかっただけなのですが、インストール失敗)。</span></b><br />
<br />
基本的には以下のページを参考にした。<br />
<a href="http://twdkz.wordpress.com/2011/12/21/installing-ghc-7-0-3-and-the-haskell-platform-on-rhel-5-6/">http://twdkz.wordpress.com/2011/12/21/installing-ghc-7-0-3-and-the-haskell-platform-on-rhel-5-6/</a><br />
<br />
ダウンロードするもの<br />
<br />
<ul>
<li>ghc-6.8.3-x86_64-unknown-linux.tar.bz2</li>
<li>ghc-6.10.4-src.tar.bz2</li>
<li>ghc-7.0.3-src.tar.bz2</li>
<li>haskell-platform-2011.2.0.1.tar.gz</li>
</ul>
<br />
<div>
<br /></div>
<div>
それぞれ、GHCのページとHaskellのページから取ってきた。</div>
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が入っていたのでそれをつかった。<br />
<br />
<h4>
ghc-6.8.3</h4>
<pre class="prettyprint lang-sh">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
</pre>
特に問題なくインストールできた。<br />
<h4>
ghc-6.10.4</h4>
ビルドの前に先ほどインストールしたghc-6.8.3のbinにパスを通してからインストール。
<br />
<pre class="prettyprint lang-sh">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
</pre>
makeに失敗。bfd.hのところで、#error config.h must be included before this header みたいなエラーがでた。<a href="http://stackoverflow.com/questions/11748035/binutils-bfd-h-wants-config-h-now" target="_blank">Stackoverflowの投稿</a>によると、autotools?を使っていないためPACKAGEとPACKAGE_NAMEがdefineされておらず怒られているっぽい。とりあえずの解決策として、怒られていたrts/Printer.cの先頭部分に
<br />
<pre class="prettyprint lang-c">#define PACKAGE 1
#define PACKAGE_NAME 1</pre>
を入れて再度makeしたらコンパイルが通った。
<br />
<h4>
ghc-7.0.3</h4>
<pre class="prettyprint lang-sh">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
</pre>
先ほどと同じbfd.hでこけるので同じ対応をしてビルド成功。
<br />
<h4>
hasklell-platform-2011.2.0.1</h4>
<pre class="prettyprint lang-sh">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
</pre>
問題なく成功。あとは.bashrcなどに以下のようなものを追加すれば良い。インストールの時に使ったファイルや古いGHCは消しても良い(と思う)。
<br />
<pre class="prettyprint lang-sh">SOFTWARE=$HOME/.software
export PATH=$SOFTWARE/haskell-platform/bin:$SOFTWARE/ghc-7.0.3/bin:$PATH
</pre>
<h3>
Cabalが動かん
</h3>
cabal updateするとcabal-installの更新をしろと言われる。cabal install cabal-install をしてインストールしようとするが怒られる。
<br />
<pre>couldn't read caba file xxxx.cabal</pre>
的なことを言われる。<a href="http://stackoverflow.com/questions/16005372/cabal-install-couldnt-read-cabal-file" target="_blank">stackoverflow</a>の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の指示に従いインストールすることで解決ができるとのこと。
<br />
<pre class="prettyprint lang-sh">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
</pre>
$HOME/.cabal/binにバイナリができるので、忘れずにパスを通す設定をする。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-80549677642056763602013-04-04T09:15:00.001+09:002013-04-04T09:17:12.245+09:00rvm + gitlab (>= 5.0) 問題の解決方法<a href="http://2013/02/rvmgitlab41.html" target="_blank">GitLab4.1(Ubuntu 10.04 LTS + RVM)をインストールしてみた </a><br />
<br />
Gitlabを5.0にアップグレードしたらRVMとの相性の問題でつまずいた。<br />
<a href="https://github.com/gitlabhq/gitlabhq/wiki" rel="nofollow" target="_blank">GitlabのWikiのホーム</a>にあるアップグレードの通りにやるとまぁ一見問題なくアップグレードされたように思えた。<br />
<br />
しかし、リモート(自分のデスクトップ)からサーバー(Gitlabが動いているサーバー)のリポジトリのクローンを作成するときにエラーが吐き出された。<br />
<br />
<pre>/home/git/gitlab-shell/bin/gitlab-shell:8: undefined method `require_relative' for main:Object (NoMethodError)
</pre>
どうやらrvmで設定したruby1.9.3が呼ばれていない模様。ユーザーgit向けにrvmはインストール済みでログインするとちゃんと
<br />
<pre class="prettyprint">which ruby
/home/git/.rvm/rubies/ruby-1.9.3-p392/bin/ruby
</pre>
とでる。
実はgit cloneは内部的にはSSHでgitユーザーでgitサーバーに接続して、サーバー側の~git/.ssh/authorized_keysに書かれたコマンドを実行するようになっている。そのコマンドは~git/gitlab-shell/bin/gitlab-shellを呼び出す。それがruby >1.9.2以上であることを想定して書かれている。<br />
<br />
同じ問題にぶつかっている人がgithubのgitlabのissueに書き込んでいた。<br />
<a href="https://github.com/gitlabhq/gitlab-shell/issues/12#issuecomment-14929039" rel="nofollow" target="_blank">gitlab-shell + rvm · Issue #12 · gitlabhq/gitlab-shell</a><br />
<br />
zzetとProfのやり取りが面白い。よくわかってない人がわかっている人にアドバイスするという滑稽なやりとり。<br />
<br />
実はsshで直接コマンドを実行する場合。どのrcスクリプトも読まれないのです。つまり、.bashrcも.zshrcも.profileもなにも読まれない。もちろん、/etc/profile.dの中にあるスクリプトも読み込まれない。 (その話をしているのに、zzetはそんなはずはない。と見当違いなことを言い続けている。どんなに論拠をProfが見せてもなぜかスルー。 )<br />
<br />
そのため、RVMの設定が読まれないでいた。解決策としては2つ挙げられている。<br />
<ol>
<li>Gitlabのコードを変更して、最初にRCスクリプトを読み込む方法</li>
<li><a href="http://d.hatena.ne.jp/taiyo/20080613/p1" rel="nofollow" target="_blank">「[unix] ssh-env - ssh実行時に環境変数を設定/変更したい」</a> の方法でsshの環境変数を設定する方法</li>
</ol>
私は環境側の設定を変更するのがどうも嫌だったので1.の方法をとった。<br />
<ul>
<li>環境変数を有効にする危険性 ( サーバー側に悪質なユーザーがいなければ大丈夫なはず? )</li>
<ul>
<li><a href="http://www.saturn.dti.ne.jp/~jpug/doc/linux/sshd_config.html" rel="nofollow" target="_blank">sshd config </a></li>
<li><a href="http://d.hatena.ne.jp/lurker/20060511/1147354551" rel="nofollow" target="_blank">[unix]環境変数 LD_PRELOAD</a></li>
</ul>
</ul>
1.の方法でも2つあったが、とりあえず簡単な方のgitlab-shellを変更する方法にした。<br />
<ol>
<li>gitlab-shellをコピーしてgitlab-shell.realというファイルを作成</li>
<li>gitlab-shellを以下のように変更<br />
<pre class="prettyprint">#! /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 $@
</pre>
</li>
</ol>
<br />
とりあえず、マルチーユーザーモードでRVMをインストールしている場合は下のマルチユーザー向けの設定を読み込むようにすると良い。(両方読み込んでも問題ないかも。マルチユーザー用RVMの仕組みがよくわかっていない。。)<br />
<br />
ソースコードを変更するのでアップグレードをするときに注意が必要。 Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-51847029249308683142013-02-11T14:44:00.000+09:002013-02-11T23:34:59.028+09:00GitLab4.1(Ubuntu 10.04 LTS + RVM)をインストールしてみたGitLabとはGitHub4.3のクローンのオープンソースソフトウェアです。<br />
今回は仮想マシンにUbuntu 10.04 LTS 64-bitをクリーンインストールしてやってみた。<br />
基本的に<a href="http://gitlab.org/" rel="nofollow" target="_blank">本家</a>のGitページの<a href="https://github.com/gitlabhq/gitlabhq/blob/stable/doc/install/installation.md" rel="nofollow" target="_blank">doc/install/installation.md</a>を参考に行っただけ。<br />
ただし、<a href="https://rvm.io/" rel="nofollow" target="_blank">RVM</a>(ルビーの仮想環境)を使ったのでやり方が微妙に異なります。<br />
普通のやり方と異なるところだけ書きます。それ以外は1から順番にやってください。<br />
<br />
<h2>
<a href="https://github.com/gitlabhq/gitlabhq/blob/stable/doc/install/installation.md#2-ruby" rel="nofollow" target="_blank">2. Ruby</a></h2>
RubyはソースからインストールしないでRVMからインストールする。ユーザーtaro(Admin)がいるとします。taroでインストールしていきます。今回はMulti-Userモードでインストールして、どのユーザーもRVMを使えることを想定しています。<br />
まず、RVMのインストール。通常は次のコマンドでOK。<br />
<pre class="prettyprint">taro$ \curl -L https://get.rvm.io | sudo bash -s stable
</pre>
もしプロキシを使っていてうまく行かなかった場合は、環境変数HTTPS_PROXYをtaroで設定していたら、sudoに環境変数を渡すために-Eオプションをつけます。この後も、ネットワーク問題でハマったら、sudo -Eとしてください。<br />
<br />
<pre class="prettyprint">taro$ \curl -L https://get.rvm.io | sudo -E bash -s stable
</pre>
<div>
これで、/usr/loca/rvmにrvmがインストールされました。</div>
<br />
<div>
今回は、taroをrvmのAdminにするためにグループにtaroを追加して書き込み権限を付与します。</div>
<br />
<pre class="prettyprint">taro$ sudo usermod -aG rvm taro
</pre>
<div>
~/.bashrcなどに以下を追加。</div>
<pre class="prettyprint">source /etc/profile.d/rvm.sh
</pre>
<div>
ログインしなおして</div>
<pre class="prettyprint">taro$ id
</pre>
<div>
...rvmがグループに追加されているのを確認</div>
<div>
ruby 1.9.3のインストール</div>
<pre class="prettyprint">
taro$ rvm install 1.9.3
taro$ rvm use --default 1.9.3
</pre>
この時点ではbundlerはインストールしない。あとで、ユーザーgitlab(<a href="https://github.com/gitlabhq/gitlabhq/blob/stable/doc/install/installation.md#3-system-users" rel="nofollow" target="_blank">3. System Users</a>で追加される)だけにインストールする。
<h2>
<a href="https://github.com/gitlabhq/gitlabhq/blob/stable/doc/install/installation.md#install-gems" rel="nofollow" target="_blank">Install Gems</a></h2>
ユーザーgitlabにrvm環境を設定する。
<pre class="prettyprint">taro$ sudo su - gitlab
</pre>
~/.bashrcなどに"source /etc/profile.d/rvm.sh"を追加して再読み込み。
<pre class="prettyprint">gitlab$ source .bashrc
</pre>
gitlabユーザー固有のgemsetを作る。
<pre class="prettyprint">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'
</pre>
DBにはMySQLを使ったので、without postgresでインストール。<br />
<pre class="prettyprint">gitlab$ cd /home/gitlab/gitlab
gitlab$ bundle install --deployment --without development test postgres
</pre>
<h2>
<a href="https://github.com/gitlabhq/gitlabhq/blob/stable/doc/install/installation.md#initialise-database-and-activate-advanced-features" rel="nofollow" target="_blank">Initialise Database and Activate Advanced Features</a></h2>
<pre class="prettyprint">taro$ sudo su - gitlab
gitlab$ cd gitlab
gitlab$ bundle exec rake gitlab:setup RAILS_ENV=production
</pre>
ここでしくじる。execコマンドがないと怒られる。調べると、<a href="https://github.com/gitlabhq/gitlabhq/issues/2700" rel="nofollow" target="_blank">issue</a>が投稿されてた。<a href="http://backports-master.debian.org/Instructions/" rel="nofollow" target="_blank">Squeeze-backportsリポジトリ</a>からredis-serverを入れなおせとのこと。多分RedisServerが古かったのかと思われる。Ubuntu10.04。リポジトリを追加するために、/etc/apt/sources.list.d/squeeze-backports.listというファイルに
<pre class="prettyprint">deb http://backports.debian.org/debian-backports squeeze-backports main
</pre>
<div>
を書いて保存</div>
<pre class="prettyprint">taro$ sudo apt-get update
</pre>
<div>
キーが認証されてないとか言われたので、</div>
<pre class="prettyprint">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
</pre>
<div>
インストールされたので、再度</div>
<pre class="prettyprint">gitlab$ bundle exec rake gitlab:setup RAILS_ENV=production
</pre>
<h2>
<a href="https://github.com/gitlabhq/gitlabhq/blob/stable/doc/install/installation.md#check-application-status" rel="nofollow" target="_blank">Check Application Status</a></h2>
<pre class="prettyprint">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
</pre>
これで動きました。ローカルではない場合もservernameなどちゃんと設定すれば動きます。
参考: <a href="http://d.hatena.ne.jp/hiro_nemu/20120811/1344656084">http://d.hatena.ne.jp/hiro_nemu/20120811/1344656084</a>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-91293716958448407912013-02-06T18:43:00.001+09:002013-02-06T18:43:48.344+09:00Chromeで埋め込みのyoutube動画が再生されないときの対処法<embed>タグで埋め込まれたyoutubeの動画が再生されなくなった。環境はMac OSX Lion のChorme。調べた。<br />
<a href="http://productforums.google.com/forum/#!topic/youtube/3229vlkKkY4" rel="nofollow" target="_blank">Embedded YouTube videos won't play in Chrome - Google Groups</a><br />
<a href="http://techfleece.com/2012/11/23/embedded-videos-not-playing-in-chrome-heres-how-to-fix-it/" rel="nofollow" target="_blank">Embedded Videos Not Playing In Chrome? Here's How To Fix It</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://techfleece.com/wp-content/uploads/2012/11/not-working.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="222" src="http://techfleece.com/wp-content/uploads/2012/11/not-working.png" width="320" /></a></div>
<br />
<br />
要はクッキーを削除すれば良いとか。設定を開く(英語ですがわかりますよね。まんまコピってきました。)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://techfleece.com/wp-content/uploads/2012/11/Settins-button-in-Chrome.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="88" src="http://techfleece.com/wp-content/uploads/2012/11/Settins-button-in-Chrome.png" width="320" /></a></div>
<br />
<br />
設定(Settings)を開く
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://techfleece.com/wp-content/uploads/2012/11/options-in-chrome.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://techfleece.com/wp-content/uploads/2012/11/options-in-chrome.png" width="254" /></a></div>
下の方にあるShow advanced settings(上級者向け設定?)をクリック<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://techfleece.com/wp-content/uploads/2012/11/show-advanced-settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="230" src="http://techfleece.com/wp-content/uploads/2012/11/show-advanced-settings.png" width="320" /></a></div>
<br />
プライバシー設定のところの「ブラウジングデータ消去」的なことが書かれているボタンを押す。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1CYj9shwnq62LKHn4LPOLL7fowkwuJeCfJWSHT5LNv7PlJGRI9d0yDITiXHN4jZQ9dbJoT65lK0Rhuc9XoQ1Q3Bkk9Jy958zd58ZwCDaMpXtTxGyMO0v6UKU8rsTbpgAtXwvlu6Nv6a0/s1600/Screen+Shot+2013-02-06+at+18.41.44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1CYj9shwnq62LKHn4LPOLL7fowkwuJeCfJWSHT5LNv7PlJGRI9d0yDITiXHN4jZQ9dbJoT65lK0Rhuc9XoQ1Q3Bkk9Jy958zd58ZwCDaMpXtTxGyMO0v6UKU8rsTbpgAtXwvlu6Nv6a0/s320/Screen+Shot+2013-02-06+at+18.41.44.png" width="320" /></a></div>
<br />
すると下のボックスが表示されれるので、「最初」とか「全部」とかに合わせて上の4つをチェックして消去ボタンを押す。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://techfleece.com/wp-content/uploads/2012/11/clear-cookies.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="http://techfleece.com/wp-content/uploads/2012/11/clear-cookies.png" width="320" /></a></div>
<br />
これで動いた。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-64402608586863570762013-02-05T16:37:00.000+09:002013-02-05T16:40:02.491+09:00Scipy.WeaveでPythonにC++埋め込み 5 Numpyの利用<a href="http://horse-brain.blogspot.com/2013/02/scipyweavepythonc-4-numpy.html" target="_blank">前回</a>の続き<br />
前回はweave.inlineメソッドへのNumpy受け渡しの基本事項について書きました。今回は実際に計算をしていきます。<br />
まず、前回にもお見せした、行と列のインデックスを足して3の倍数となる要素を0にする計算のpure Pythonバージョンをお見せします。
<br />
<pre class="prettyprint lang-py">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
</pre>
これを次のように呼び出す。
<br />
<pre class="prettyprint lang-py">>>> side = 1000
>>> npArr = np.ones((side, side))
>>> numpy_mult3_0_pure(npArr)
>>> print npArr
</pre>
結果は、以下。
<br />
<pre class="prettyprint lang-py">[[ 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.]]
</pre>
まったく前回のコピペです。<br />
これのweaveバージョンは以下のようになります。
<br />
<pre class="prettyprint lang-py">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'])
</pre>
前回やった、N+(変数名), (変数名大文字)+(次元数)のアクセス用マクロ関数を使えば、上のように書けるのです。どのくらい早くなるのか時間を計測してみます。
<br />
<pre class="prettyprint lang-py">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)
</pre>
このTimerについては<a href="http://horse-brain.blogspot.com/2013/02/python-with.html" target="_blank">こちらの記事</a>をご覧ください。出力は以下です。<br />
<pre class="border">
[Pure] Elapsed: 0.272620201111
[Weave] Elapsed: 0.00578308105469
</pre>
Weaveの方が50倍近く早くなっていることがわかります。こんな感じにPythonコードにC++のコードを書くことで高速化することができます。
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-14303514869091663392013-02-05T16:16:00.003+09:002013-02-05T16:38:21.315+09:00Scipy.WeaveでPythonにC++埋め込み 4 Numpyの基本<a href="http://horse-brain.blogspot.jp/2013/01/scipyweavepythonc-3.html">前回</a><br />
PythonにはNumpy(とScipy)というMatlabに似たインターフェースを持つ数値計算に非常に便利なパッケージがあるのはご存知でしょう。というか、Weaveについて調べてココにたどり着いたなら、知っていて当然ですね。例えばこんな感じ。
<br />
<pre class="prettyprint lang-py">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)
</pre>
Matlabでできることはほぼ全部できます。しかも、無料で。このページは参考になります。<a href="http://www.scipy.org/NumPy_for_Matlab_Users" target="_blank">Numpy for Matlab Users</a><br />
行列演算や要素同士、固有値計算などのメソッドなどはCで実装されているので高速に実行できます。しかし、こういった汎用的な演算でない場合はPython上でループを回したりして配列にランダムアクセスするようなコードを書く必要がでてきます。
Pythonのようなスクリプト言語でそういったコードを書くと激遅になりますよね。例えば、ある配列の行のインデックスと列のインデックスを足した値が3の倍数だったら0に書き換えるというコードをPythonで書くと次のようになります(あまり良い例ではないですが、お許しください!)。
<br />
<pre class="prettyprint lang-py">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
</pre>
これを次のように呼び出す。
<br />
<pre class="prettyprint lang-py">>>> side = 1000
>>> npArr = np.ones((side, side))
>>> numpy_mult3_0_pure(npArr)
>>> print npArr
</pre>
結果は、以下。
<br />
<pre class="prettyprint lang-py">[[ 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.]]
</pre>
時間を計測すると、0.384463787079[秒]でした。
これをWeaveを使ってC化して高速化します。この例に移る前にNumpyをWeaveに使う場合の基本から見ていきます。
weave.inlineはPython変数を渡すと自動的にC内で適当な型に変換してくれます(converterを指定することも可能)。Numpyのndarrayを渡した場合も自動で色々と変換を施してくれます。次の例を見てみます。
<br />
<pre class="prettyprint lang-py">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'])
</pre>
このメソッド内では、まず2×3×4の形のすべての要素が0の3次元配列を作ります。確認の為に[1,1,3]の要素だけ1を代入しておきます。
データ型がuint16=2[bytes]で、3次元、C-contiguousのメモリ上のデータ配置で、2 * 3 * 4の形なので、上の3つのprintの結果は
<br />
<pre class="border">(py) ndim: 3
(py) shape: (2, 3, 4)
(py) strides: (24, 8, 2)
</pre>
となります。stridesのところとかよくわからない人はこの画像を見て理解するかググってください。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwQO7tv3vMsS3DP-EnZR4AjUUhFZG8IER3py7IZyQ0Nbj1NcWmXQx8-ujmYRO6WxTxv2yrmrfba0wv6alwO6d-UhkTTDc3JMtrh9g5MSxcmTAeVL8jP31Ir6XNLl2Oca_qe5__IwakTBU/s1600/numpy-strides.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwQO7tv3vMsS3DP-EnZR4AjUUhFZG8IER3py7IZyQ0Nbj1NcWmXQx8-ujmYRO6WxTxv2yrmrfba0wv6alwO6d-UhkTTDc3JMtrh9g5MSxcmTAeVL8jP31Ir6XNLl2Oca_qe5__IwakTBU/s320/numpy-strides.png" width="320" /></a></div>
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という名前で使えるようにしてくれています。
<br />
<pre class="prettyprint lang-c">PyArrayObject* npArr_array = convert_to_numpy(py_npArr,"npArr");
</pre>
NumpyのC APIについては各自ぐぐって欲しいのですが、PyArrayObject構造体のメンバにstridesなどがあるので、
<br />
<pre class="prettyprint lang-c">npy_intp* NnpArr = npArr_array->dimensions;
npy_intp* SnpArr = npArr_array->strides;
int DnpArr = npArr_array->nd;
</pre>
で値を取り出してくれています。inlineコードのndim, shape, stridesの出力は次のようになり、python側での出力と一致しています。<br />
<pre class="border">ndim: 3
shape: 2 3 4
strides: 24 8 2
</pre>
肝心のnpArrという名前は以下のように配列のデータへの先頭ポインタのアドレスを取り出したものとして宣言しています。
<br />
<pre class="prettyprint lang-c">double* npArr = (double*) npArr_array->data;
</pre>
一次元配列としてアクセスする場合はnpArr[0]などとアクセスすれば値を取り出せますが、この例では3次元配列なので、stridesを使って要素にアクセス必要があります。たとえばnpArr[i, j, k]にアクセスしたい場合は、以下のようにする必要があります(PyArrayObject*->dataはchar*型)。
<br />
<pre class="prettyprint lang-c">*((double*)(npArr_array->data + (i * SnpArr[0] + j * SnpArr[1] + k * SnpArr[2])))
</pre>
しかし、これはめんどくさい。実はこれをやるためのマクロ関数を最高4次元配列の場合まで定義してくれています。
<br />
<pre class="prettyprint lang-c">#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])
</pre>
3次元配列の場合はnpArrの名前を大文字にして後ろに3をつけた名前が付けられていますので、上のようにpython側でnpArr[1,1,3]=1で変更した値にNPARR3(1,1,3)でアクセスできています。
<br />
<pre class="border">npArr[1, 1, 3]: 1
</pre>
今回はNumpyのweave.inlineへの受け渡しの基本を紹介しました。<a href="http://horse-brain.blogspot.com/2013/02/scipyweavepythonc-5-numpy.html" target="_blank">次回</a>に実際計算してみます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-38604145719604064532013-02-05T14:33:00.001+09:002013-02-05T14:33:12.347+09:00[Python] try/except/else/finally, with/asなどについてわからなくなったら<a href="http://d.hatena.ne.jp/kobakoba0723/20110408/1302277270" rel="nofollow" target="_blank">初めてのPython(27章) | kobakoba0723の日記</a><br />
このお方のブログを見る。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-45350883588038622122013-02-05T14:28:00.000+09:002013-02-05T14:28:01.139+09:00[Python] with文を使った実行時間計測クラス(コンテキストマネージャー)時間計測にはtimeitとかもありますが、もっとお気楽に測る場合の話です。<br />
<a href="http://stackoverflow.com/questions/5849800/tic-toc-functions-analog-in-python" rel="nofollow" target="_blank">Matlab - tic, toc functions analog in Python</a><br />
ここで紹介されていたやり方です。with文では、withの後ろに与えたコンテキストマネージャクラスがステートメント内に入るときに__enter__が呼ばれ(本来asで受け取る変数を返す)、終わりに__exit__が呼ばれます。これを利用して__enter__で時間計測開始を、__exit__で時間計測結果の出力を行い、with文のステートメントの中のプログラムの実行時間を表示します。with文の詳細については「python with文」でぐぐってください。
<br />
<pre class="prettyprint lang-py"># context_timer.py
import time
import sys
class Timer(object):
def __init__(self, name=None, out=sys.stdout):
self.name = name
self.out = out
def __enter__(self):
self.tstart = time.time()
def __exit__(self, type, value, traceback):
if self.name:
print >> self.out, '[%s]' % self.name,
print >> self.out, 'Elapsed: %s' % (time.time() - self.tstart)
</pre>
これを使って、1から1000までの整数の和を計算する時間を測る場合は次のようにwith文を使います。
<br />
<pre class="prettyprint lang-py">from context_timer import Timer
with Timer("Sum"):
val = 0
for i in xrange(1, 1001):
val += i
print val
</pre>
出力は次のようになります。
<br />
<pre>500500
[Sum] Elapsed: 0.00104784965515
</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-75750144856302473892013-02-03T19:26:00.002+09:002013-02-03T19:26:28.690+09:00Windows 7 64bit でPython環境構築科学計算をやっている人向けにPythonの環境を簡単に構築できるPython(x,y)は非常に便利ですが、32bit向けのインストーラしか用意されていません。そのため、64-bit版を自分でビルドする必要があります。BLASだATLASだ、色々依存するライブラリをインストールしなくてはならないので結構大変です。そこで、UCIのGohlkeさんという方が公開しているインストーラ群を利用します。<br />
<br />
まず、Pythonの64bit版を自分でインストールします。<br />
例えば、Pythonのバージョン2.7でのインストールの場合、下記URLから「Python 2.7.3 Windows X86-64 Installer」のリンクをクリックしてインストーラをダウンロード、インストールしてください。<br />
<a href="http://www.python.org/getit/">http://www.python.org/getit/</a><br />
<a href="http://www.python.org/ftp/python/2.7.3/python-2.7.3.amd64.msi" target="_blank">http://www.python.org/ftp/python/2.7.3/python-2.7.3.amd64.msi</a>(インストーラ直リンク)<br />
<br />
ここまでは非常に簡単です。本来、ココからがNumpyやScipyなどをインストールするのは大変な作業ですが、Gohlkeさんのページにあるインストーラを使えば簡単です。感謝です。<br />
<a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank">Unofficial Windows Binaries for Python Extension Packages</a><br />
インストールしたいパッケージを探し、利用するPythonのバージョンと「amd64」をファイル名に含むインストーラをダウンロードしてインストールしてください。例えば、Scipyをインストールする場合、「<a href="http://www.blogger.com/blogger.g?blogID=4402644377465864182" style="background-color: white; border-color: rgb(136, 136, 0); color: #e00000;" title="[61.1 MB] [Python 2.7] [64 bit] [Feb 02, 2013]">scipy-0.11.0.win-amd64-py2.7.exe</a>」を利用します。「Requires Numpy-MKL. 」と書かれているので、「<a href="http://www.blogger.com/blogger.g?blogID=4402644377465864182" style="background-color: white; border-color: rgb(136, 136, 0); color: #e00000;" title="[16.3 MB] [Python 2.7] [64 bit] [Feb 02, 2013]">numpy-MKL-1.6.2.win-amd64-py2.7.exe</a>」もインストールします。この要領でその他のパッケージもインストールできます。<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-66976141730402719662013-02-01T09:59:00.000+09:002013-02-01T09:59:17.856+09:00Numpy.Arrayが整数(Integer)型か浮動少数(Float)型か調べる数値計算していると、整数型の配列を数値で割ったりすると<br />
<pre class="prettyprint">>>> a= np.ones(10, dtype=np.uint8)
>>> a /= 10.0
>>> print a
[0 0 0 0 0 0 0 0 0 0]
</pre>
<br />
てな具合に0.1ではない結果になってしまう。<br />
<br />
こんな場合は、arrayが整数型か浮動少数型か分けて処理をしたいとか、整数型だったら例外を投げるとかいう処理する必要があります。<br />
例えば、<br />
<pre class="prettyprint">def normalize(arr):
arr /= arr.sum()
</pre>
というメソッドがあったとして、これに整数型を渡すと切り捨てられてしまうので、浮動少数型に限定したい。この場合、np.issubdtypeというメソッドで型が整数か浮動少数か調べます。<br />
<pre class="prettyprint">def normalize(arr):
if np.issubdtype(arr.dtype, np.integer):
raise ValueError("arr must be float.")
arr /= arr.sum()
</pre>
みたいな感じ。浮動少数か調べるにはnp.floatを使えばいいはず。<br />
他に良い方法があったら教えて欲しいです。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-37455905822250165402013-01-13T15:26:00.001+09:002013-02-05T16:17:21.561+09:00Scipy.WeaveでPythonにC++埋め込み 3 変数を返す<h1>
変数を返す</h1>
<h2>
数値型を返す</h2>
<pre class="prettyprint lang-py">def test_ret_int():
print "---- Return int ----"
code = """
return_val = 1;
"""
ret = weave.inline(code)
print "ret:", ret
</pre>
Cの中でint型作成して返すサンプルです。Cのコードから値を返すときには、決してreturn文を使わないでください。weave内では、codeに書かれたコードに到達する前にreturn_valというSCXXのpy::objectが宣言されています。(生成されたcppファイルを見るとわかります。)return_valに代入された変数はweave.inlineメソッドの戻り値として受け取ることができます。APIを見るとわかりますが、py::objectのCの数値型や文字列型を代入すると、自動的にPythonのオブジェクトに変換してくれます。結果は次のようになります。<br />
<pre class="border">---- Return int ----
ret: 1
</pre>
<h2>
タプルなどを返す</h2>
<br />
<pre class="prettyprint lang-py">def test_ret_tuple():
print "---- Return tuple ----"
code = """
if(scxxFlag) {
// scxx
py::tuple ret(2);
py::object tmp(1); ret.set_item(0, tmp);
tmp = 3.5; ret.set_item(1, tmp);
return_val = ret;
} else {
// Python C API is more reasnable.
return_val = Py_BuildValue("id", 1, 3.5);
}
"""
scxxFlag = 1
ret = weave.inline(code, ["scxxFlag", ])
print "ret (scxx):", ret
scxxFlag = 0
ret = weave.inline(code, ["scxxFlag", ])
print "ret (Py/C API):", ret
</pre>
return_valはpy::object型なので、SCXXのpy::tuple, py::dictなどを代入することも可能ですし、Python/C APIのPyObject*を渡すこともできます。ここでは、if文のscxxFlagが1の場合はSCXXでtupleを、0の場合はPython/C APIでtupleを作成しています。(boolの受け渡しはサポートしていないっぽいので、scxxFlagをbool型にしませんでした。)
出力は以下。
<br />
<pre class="border">---- Return tuple ----
ret (scxx): (1, 3.5)
ret (Py/C API): (1, 3.5)
</pre>
両方とも同じ結果になっていますね。
Python/C APIの
<a href="http://docs.python.jp/2.5/ext/buildValue.html" target="_blank">Py_BuildValue</a>
はとても便利なので使った方が良いと思います。フォーマットのiはint、dはdouble, sは文字列(char*), OはPyObject*を意味します。
listもdictも簡単に生成できるので試してみてください。
<br />
<pre class="prettyprint lang-py">return_val = Py_BuildValue("[i,d]", 1, 3.5);// List
</pre>
<pre class="prettyprint lang-py">return_val = Py_BuildValue("{s:i,s:[d,s]}", "abc", 1, "def", 3.5, "Hoge"); // Dict
</pre>
<a href="http://horse-brain.blogspot.com/2013/01/scipyweavepythonc-2.html">前回の例</a>とあわせて、これで値の受け渡しができるようになりました。次回は、数値計算を利用している方向けに<a href="http://horse-brain.blogspot.jp/2013/02/scipyweavepythonc-4-numpy.html" target="_blank">NumpyのArrayを利用した例</a>を見ていきます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-47614987294564299152013-01-13T00:02:00.000+09:002013-01-13T13:49:07.088+09:00Scipy.WeaveでPythonにC++埋め込み 2 変数を渡す<h1>
変数を渡す</h1>
<h2>
数値型を渡す</h2>
以下はInt型をPythonからCに渡して標準出力するメソッド例です。
<br />
<pre class="prettyprint lang-py">def test_pass_int():
print "---- Pass int ----"
val = 1
code = """
std::cout << "val: " << val << std::endl;
"""
weave.inline(code, ['val', ], headers=['<iostream>', ])
</iostream></pre>
結果は次のようになります。<br />
<pre class="border">---- Pass int ----
val: 1
</pre>
weave.inlineの第2引数はargs=[]のオプション引数であり、Cのコード内に渡したいPython側の変数名を文字列のリストとして渡します。すると、inlineはPython側でローカル変数またはグローバル変数で使われている変数を探します。そして、見つかった変数を適切な型に変換してCコードの中で使えるようにしてくれます。上の例ではvalはPythonのPyInt型なのでC側ではそのまま使えないはずですが、ちゃんとCのint型に変換してくれます。ここでさり気なく、C++スタイルの標準出力プリントを使いました。cout, endlを使うには<iostream>が必要なので、オプション引数headersにヘッダの文字列リストを与えています。<br />
<h2>
タプルとかを渡す</h2>
タプルやリストや辞書型を渡したときにどのように扱わうか見てみます。
<br />
<pre class="prettyprint lang-py">def test_pass_tuple():
print "---- Pass tuple ----"
seq = (1, 0.5, "Hoge")
code = """
std::cout << "length: " << seq.len() << std::endl;
std::cout << "seq[0]: " << static_cast<int>(seq[0]) << std::endl;
std::cout << "seq[1]: " << static_cast<double>(seq[1]) << std::endl;
std::cout << "seq[2]: " << static_cast<char>(seq[2]) << std::endl;
"""
weave.inline(code, ['seq', ], headers=['<iostream>', ])
</pre>
数値型や文字列型以外のタプルやリストなどのオブジェクトは<a href="http://davidf.sjsoft.com/mirrors/mcmillan-inc/scxx.html" target="_blank">SCXXというPython C APIのC++ラッパーライブラリクラス</a>に変換されます。しかし、そのまま使っているわけではなく、weave向けに独自に名前とか書き換えているっぽいです。tuple型はpy::tupleに変換されます。APIは直接weave.__file__の下のscxxフォルダにある*.hファイルを読めばすぐわかります。一応ここ(
<a href="http://projects.scipy.org/scipy/browser/trunk/Lib/weave/scxx" target="_blank">http://projects.scipy.org/scipy/browser/trunk/Lib/weave/scxx</a>)でも見れます。py::list::operator[]でタプルの中の要素をpy::object(正確にはindexed_ref型)として取り出すことができます。py::objectには、数値型、str型、complex型の変換演算子が定義されているので、代入やキャストによって中身をCの型として取り出すことができます。<br />
出力は以下。
<pre class="border">---- Pass tuple ----
length: 3
seq[0]: 1
seq[1]: 0.5
seq[2]: Hoge
</pre>
リストの場合もSCXXのpy::listに変換され、APIはほぼ同じです。
<pre class="prettyprint lang-py">def test_pass_list():
print "---- Pass list ----"
seq = [1, 0.5, "Hoge"]
code = """
std::cout << "length: " << seq.len() << std::endl;
std::cout << "seq[0]: " << static_cast<int>(seq[0]) << std::endl;
std::cout << "seq[1]: " << static_cast<double>(seq[1]) << std::endl;
std::cout << "seq[2]: " << static_cast<char>(seq[2]) << std::endl;
"""
weave.inline(code, ['seq', ], headers=['<iostream>', ])
</pre>
出力は以下
<pre class="border">---- Pass list ----
length: 3
seq[0]: 1
seq[1]: 0.5
seq[2]: Hoge
</pre>
辞書型はSCXXのpy::dict型に変換されます。APIも非常に簡単です。
<pre class="prettyprint lang-py">def test_pass_dict():
print "---- Pass dict ----"
dct = {"PyInt":1, "PyFloat":0.5, "PyString":"Hoge"}
code = r"""
std::cout << "length: " << dct.len() << std::endl;
std::cout << "dct[\"PyInt\"]: " << static_cast<int>(dct["PyInt"]) << std::endl;
std::cout << "dct.has_key(\"PyInt\"): " << dct.has_key("PyInt") << std::endl;
std::cout << "dct.has_key(\"PyHoge\"): " << dct.has_key("PyHoge") << std::endl;
py::list keys = dct.keys();
std::cout << "keys[0] : " << static_cast<char>(keys[0]) << std::endl;
py::object tmp = py::object(634);
dct.set_item("SkyTree", tmp);
std::cout << "dct[\"SkyTree\"] : " << static_cast<int>(dct["SkyTree"]) << std::endl;
"""
weave.inline(code, ['dct', ], headers=['<iostream>', ])
</pre>
出力は以下。
<pre class="border">---- Pass dict ----
length: 3
dct["PyInt"]: 1
dct.has_key("PyInt"): 1
dct.has_key("PyHoge"): 0
keys[0] : PyInt
dct["SkyTree"] : 634
</pre>
例にはないですが、変数は参照として渡されているのでinlineの中で変更したdict型は呼び出し側でも変更されます。<br /><br />
今回は変数を渡す例をお見せしました。次回は変数を返す例を見てみます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-39399805077310897112013-01-11T12:55:00.000+09:002013-01-11T21:29:33.544+09:00Ubuntu10.04LTSにPython2.7.3をインストール numpy,scipy,matplotlib,opencv,pygtkソースからインストールします。全然難しくありません。<br />
<br />
sqliteパッケージ使うのに必要だったはず<br />
<pre class="border">sudo apt-get install sqlite3
</pre>
<div>
<br /></div>
インストール先を指定(ルートインストールしない場合)<br />
<pre class="border">IPX=$HOME/python27
export PATH=$IPX/bin:$PATH
export LD_LIBRARY_PATH=$IPX/lib:$LD_LIBRARY_PATH
</pre>
rootでインストールしてしまう場合は<br />
sudo su -でルートになる。<br />
ルートインストールする場合は--prefixオプションはいらないです。
<br />
<div>
<br /></div>
<div>
Python-2.7.3をダウンロードして解凍</div>
<pre class="border">./configure --prefix=$IPX --enable-shared && make install
</pre>
<div>
<br /></div>
<div>
EasyInstallをインストール</div>
<div>
サイトから setuptools-0.6c11-py2.7.eggをダウンロード</div>
<pre class="border">sh setuptools-0.6c11-py2.7.egg --prefix=$IPX
</pre>
<div>
<br /></div>
<div>
Pipも</div>
<pre class="border">$IPX/bin/easy_install pip
</pre>
<h2>
ついでにNumpyやら必要なものをインストール</h2>
<pre class="border">$IPX/bin/pip install numpy
sudo apt-get install liblapack-dev gfortran g++
$IPX/bin/pip install scipy
$IPX/bin/pip install ipython
$IPX/bin/pip install virtualenv virtualenvwrapper
$IPX/bin/pip install matplotlib
</pre>
再ログインなどするとパスが通っていないので、<br />
<pre class="border">IPX=$HOME/python27
export PATH=$IPX/bin:$PATH
export LD_LIBRARY_PATH=$IPX/lib:$LD_LIBRARY_PATH
</pre>
を.bashrcなどに追加して常にパスが通っているようにしておく。(rootインストールの場合は必要なし)<br />
<h2>
ついでにOpenCVもインストールする。</h2>
<pre class="border">sudo apt-get install cmake-curses-gui
wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.3/OpenCV-2.4.3.tar.bz2
</pre>
ダウンロードして解凍。 cmakeに必要なオプションを渡してインストール。
<br />
<pre class="border">ccmake .. -DCMAKE_INSTALL_PREFIX=${IPX} -DPYTHON_EXECUTABLE=${IPX}/bin/python -DPYTHON_INCLUDE_DIR=${IPX}/include/python2.7 -DPYTHON_LIBRARY=${IPX}/lib/libpython2.7.so
make install
</pre>
OK。
<br />
<pre class="border">$ ipython
>>> import cv2
</pre>
で使えます。
<br />
<h2>
PyGTKも</h2>
<div>
<div>
依存関係を考慮してシステムのバージョンに合わせる</div>
<div>
pygtk 2.17.0</div>
<div>
pycairo 1.8.10</div>
<div>
pygobject 2.21.1</div>
<div>
<br /></div>
<div>
py2cairoをインストール</div>
<pre class="border">wget http://cairographics.org/releases/py2cairo-1.8.10.tar.gz
tar xvjf py2cairo-1.8.10.tar.gz
cd py2cairo-1.8.10
./waf configure --prefix=$IPX
./waf build
./waf installl
</pre>
<div>
pygobjectインストール</div>
<pre class="border">sudo apt-get install libffi-dev
http://ftp.gnome.org/pub/GNOME/sources/pygobject/2.21/pygobject-2.21.1.tar.bz2
tar xvjf pygobject-2.21.1.tar.bz2
cd pygobject-2.21.1
./configure --prefix=$IPX
make install
</pre>
<div>
pygtkインストール</div>
<pre class="border">
sudo apt-get install libgtk2.0-dev
export PKG_CONFIG_PATH=$IPX/lib/pkgconfig:$PKG_CONFIG_PATH
wget http://ftp.gnome.org/pub/GNOME/sources/pygtk/2.17/pygtk-2.17.0.tar.bz2
あとはPyGObjectと同じ
</pre>
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-53264776269080763072013-01-10T09:11:00.000+09:002013-01-13T13:45:59.995+09:00Scipy.WeaveでPythonにC++埋め込み 1 Hello worldPythonって超便利ですね。非常に多様な目的に使われる言語ですが、Numpy・Scipyによる数値計算ライブラリがあるので数値計算・グラフ描画もできます。Matlabなんかもういらないのではないかとおもいますね。しかし、MatlabやPythonのようなインタープリタ言語でループを回したりすると一気に実行速度が激遅になります。そこで、開発者(研究者)はプログラムの高速化が必要な部分をC/C++(以下、C)で書いて呼び出したりします。MatlabではMexによってこれが実現できます。Pythonでもctypes, SWIG, Boost.Python, Cython, Scipy.WeaveによってCによる高速化ができます。今回はWeaveを使った例をお見せします。(Cythonもいずれ紹介します。)
<br />
<h3>
誰もが最初にやるやつ</h3>
そう、Hello worldです。WeaveはPythonのコードの中にCコードを直接埋め込むことができます。
<br />
<pre class="prettyprint lang-py">from scipy import weave
def test_hello_world():
print "----- Print ----"
code = r"""
printf("Hello world!!\n");
"""
weave.inline(code)
if __name__ == '__main__':
test_hello_world()
</pre>
Cコードを埋め込むための一つのメソッドがweave.inlineです。上のように、第1引数にCのコードを書いた文字列を取ります。出力は、
<br />
<pre class="border">----- Print ----
Hello world!!
</pre>
となります。<br />
inlineメソッドは呼び出されたときに第一引数の文字列codeのCコードを実行時コンパイルして呼び出します。これだと呼び出す度にコンパイルが行われ余計に計算時間がかかってしまうと思うかもしれません。しかし実際には、inlineは一度コンパイル済みのものと同じ内容のcodeが渡された時にはコンパイル済みのものを使うため、高速にCコードを呼び出すことができます。
何が起こっているか確認するために、verbose=2と強制的に同じcodeでもコンパイルするためのforce=Trueをオプション引数に追加するように変更してみます。<br />
<pre class="prettyprint">weave.inline(code, verbose=2, force=True)
</pre>
いろいろverboseされます。
<br />
<pre class="border">----- Print ----
<weave: compiling>
running build_ext
running build_src
build_src
building extension "sc_de155a42ad0378e80d2e4d68a547cce52" sources
build_src: building npy-pkg config files
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
building 'sc_de155a42ad0378e80d2e4d68a547cce52' extension
compiling C++ sources
C compiler: c++ -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -I/usr/local/include -DNDEBUG -g -O3 -Wall
compile options: '-I/usr/local/lib/python2.7/site-packages/scipy/weave -I/usr/local/lib/python2.7/site-packages/scipy/weave/scxx -I/usr/local/lib/python2.7/site-packages/numpy/core/include -I/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c'
c++: /usr/local/lib/python2.7/site-packages/scipy/weave/scxx/weave_imp.cpp
c++: /Users/USERNAME/.python27_compiled/sc_de155a42ad0378e80d2e4d68a547cce52.cpp
c++ -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -isysroot / -L/usr/local/lib /var/folders/jp/rhc_v7hn46g05j5v678bjbfm0000gn/T/USERNAME/python27_intermediate/compiler_f217358f4c5a874fd8a2d639e1b28c86/Users/USERNAME/.python27_compiled/sc_de155a42ad0378e80d2e4d68a547cce52.o /var/folders/jp/rhc_v7hn46g05j5v678bjbfm0000gn/T/USERNAME/python27_intermediate/compiler_f217358f4c5a874fd8a2d639e1b28c86/usr/local/lib/python2.7/site-packages/scipy/weave/scxx/weave_imp.o -o /Users/USERNAME/.python27_compiled/sc_de155a42ad0378e80d2e4d68a547cce52.so
running scons
Hello world!!
</pre>
ごちゃごちゃとありますが、
<br />
<pre class="border">c++: /Users/USERNAME/.python27_compiled/sc_de155a42ad0378e80d2e4d68a547cce52.cpp
</pre>
を見るとCコードが生成されている場所がわかります。僕はMac OSX Lionなので、ホームの.python27_compliedにソースコードが自動生成されているのがわかります。Windwosなどでもverbose=2にすれば、どこにソースが生成されたかを知ることができます。このソースを覗いてみるとweaveがどのようにcodeをCコードに変換しているかがわかります(compiled_func関数)。<br />
今回はまったく実用的でないプログラムでしたが、次はweave.inlineに引数を渡す例をお見せします。
<br/>
<a href="http://horse-brain.blogspot.jp/2013/01/scipyweavepythonc-2.html">変数を渡す編</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-21231713048246155832012-11-05T01:56:00.001+09:002012-11-05T01:59:44.893+09:00Mac OSX Lion で Homebrew 経由で Python の pip 使うときに苦労した話<div>
超雑記。</div>
<div>
<br /></div>
<div>
portなどを使っていた環境からbrewへの移行。</div>
<div>
portのときどんなふうにインストールしたか記憶がない。</div>
<div>
virtualenv, virtualenvwrapperで仮想環境を作っていた。</div>
<div>
<br /></div>
<div>
(Homebrewのインストールは省略。ユーザー権限でインストール。rootじゃない)</div>
<div>
<div>
<br /></div>
<div>
brew install python でpython をインストール</div>
<div>
.zshenvに</div>
<div>
export PATH=/usr/local/bin:/usr/local/share/bin:$PATH</div>
<div>
を追加。普通は.bashrc。</div>
<div>
<br /></div>
<div>
同時にインストールされるというpipでnumpyをインストールしようとすると</div>
<div>
<div>
すでに入っていると言われた</div>
</div>
</div>
<div>
<br /></div>
<div>
とりあえず pip freezeで得られるパッケージを全削除して</div>
<div>
foreach i (`pip freeze | awk -F== '{print $1}'`)</div>
<div>
sudo pip uninstall $i</div>
<div>
end</div>
<div>
(rootでインストールされていたのでsudo)</div>
<div>
<br /></div>
<div>
再度インストール</div>
<div>
しかし</div>
<div>
/Library/... permission denied</div>
<div>
と怒られる。</div>
<div>
root権限のところに書こうとしている。前使っていた環境のpipでの書き込み先だ。</div>
<div>
<br /></div>
<div>
brew uinstall python</div>
<div>
<br /></div>
<div>
brew install python --universal</div>
<div>
してみた</div>
<div>
しかしだめだ</div>
<div>
<br /></div>
<div>
よくよくインストールログを見るとbrew linkが完了しなかったという情報が</div>
<div>
<br /></div>
<div>
brew link python</div>
<div>
<br /></div>
<div>
してみると</div>
<div>
pipがすでにあるからリンク貼れなかったぜ馬鹿野郎と怒られる</div>
<div>
<br /></div>
<div>
brew link --overwrite python</div>
<div>
<br /></div>
<div>
して元からあるやつを上書き。</div>
<div>
ちゃんと動いた。</div>
<div>
前に使っていたpipがpath上に残っていたせいで、そちらのpipの環境を使ってしまっていたのが原因だった。</div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-24558868032182359632012-10-17T16:24:00.000+09:002013-01-29T10:41:01.033+09:00ubuntu12.04にcuda5.0をインストールしたときに苦労した話<div>
Ubuntu12.04でCUDAでハマったのでメモ。<br />
※CUDAでGPGPU始める人はコレ読んでください。サンプルを見て練習できるので非常に理解がしやすいです。<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=dvbscb-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4844329782" style="height: 240px; width: 120px;"></iframe>
</div>
とにかく、うまく行かなかった。<br />
いろいろ試したが、何が効いたかはわからない。<br />
…が、最終的にうまくいった。<br />
<br />
自分の環境はUbuntu12.04 64bit、Dell Precision T5500, Quadro FX 580(capability 1.1)。<br />
<br />
とりあえず、最初ココを見て、わけもわからずこのとおりにやった。<br />
<a href="http://d.hatena.ne.jp/iRiE/20120620/1340230211">http://d.hatena.ne.jp/iRiE/20120620/1340230211</a><br />
ここでやっている人と明らかに違うのが、Cudaのバージョンが5.0にアップグレードされているというところ。<br />
<br />
Ubuntu12.04用のインストーラはないので、11.10のものを代わりに↓からダウンロードした。<br />
<a href="http://developer.nvidia.com/cuda/cuda-downloads">http://developer.nvidia.com/cuda/cuda-downloads</a><br />
<br />
sudo sh ./cuda_5.0.35_linux_64_ubuntu11.10.run<br />
を実行すると、libglut.soがないと怒られた。<br />
<br />
sudo apt-get install freeglut3-dev<br />
した後、もう一度インストールしてみたが、<br />
やはりないと言われる。<br />
<br />
調べてみると、12.04 64bitではlibglut.soが変なところにインストールされることがわかった。<br />
<br />
sudo ln -s /usr/lib/x86_64-linux-gnu/libglut.so /usr/lib/libglut.so<br />
してちゃんとしたところにシンボリックリンクを貼る。<br />
<br />
再度インストールするもInstall failed、失敗。<br />
ログ見てみると、gdm止めねばならないことが判明。<br />
<br />
自分の場合、Shift+F1でtty1のコンソールを起動して、<br />
<br />
sudo service lightdm stop<br />
としてデスクトップマネージャーを止める。(12.04からgdmからlightdmに変わったらしい)<br />
<br />
再度チャレンジすると、Installed、成功!<br />
<br />
とりあえず、再起動。<br />
<br />
<br />
…<br />
<br />
デスクトップが起動しないではないか。<br />
そのままtty1に飛ばされる。<br />
ログを見てみると、plymouthに繋げなかったとか言っている。<br />
<br />
よくわからないが、ウェブで調べた結果、xserver-xorg-nouveauを消してみたり、nvidia-currentをreinstallしてみたりした。<br />
<br />
デスクトップが起動した。<br />
<br />
しかし、compizが起動していない。なぜだ。<br />
<br />
とりあえず、気にせずCUDAのサンプルをmakeしてコンパイルして、bin/linuz/releaseにいき、<br />
<br />
./deviceQuery<br />
<br />
したが、capableなビデオカードが見つからないとエラーを出された。<br />
(通常はビデオカードの情報が出力される)<br />
<br />
うおーっ!ってなって、<br />
<br />
sudo sh ./cuda_5.0.35_linux_64_ubuntu11.10.run --uninstall<br />
でアンインストールして、もう一回インストールしたりしたが、また、デスクトップが起動しなくなった。<br />
<br />
最後の方は、記憶がないが、効いたっぽいのが、<br />
<a href="http://sn0v.wordpress.com/2012/05/11/installing-cuda-on-ubuntu-12-04/">http://sn0v.wordpress.com/2012/05/11/installing-cuda-on-ubuntu-12-04/</a><br />
に書いてある。<br />
<br />
sudo apt-get remove --purge nvidia*<br />
によるnvidia関連のソフトウェアの全削除。<br />
<br />
これやったあとに、<br />
<br />
sudo sh ./cuda_5.0.35_linux_64_ubuntu11.10.run<br />
<div>
でCUDAドライバのインストールをやり直したら、Compizも復活して、</div>
<div>
<br /></div>
<div>
./deviceQuery</div>
<div>
でちゃんと結果が出力された。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
どれが良かったか、わからないがこの中のどれかであるはず。</div>
<div>
<br /></div>
<div>
あと、「追加のドライバ(Additional driver)」から適当にExperimentalの一番新しいっぽいやつをインストールしたりもしたな…</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-36494570410814461792012-10-17T09:48:00.000+09:002013-01-29T10:47:47.575+09:00Ubuntuでbootを逼迫している古いLinuxカーネルを削除慣習に従って/bootディレクトリのパーティションを分けていたら(確か100M)、カーネルの更新のたびに、カーネルイメージがインストールされて、それが残って、/bootパーティションを逼迫していた。dist-upgradeができない状態に。<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=dvbscb-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4798033812" style="height: 240px; width: 120px;"></iframe>
古いカーネルは不要なので削除する。ちなみに、Ubuntuのバージョンは12.04です。<br />
インストールされているカーネルを確認する。<br />
<br />
<pre class="prettyprint">[*****@*****] $ dpkg -l | grep linux-image
rc linux-image-3.2.0-23-generic 3.2.0-23.36 Linux kernel image for version 3.2.0 on 64 bit x86 SMP
rc linux-image-3.2.0-25-generic 3.2.0-25.40 Linux kernel image for version 3.2.0 on 64 bit x86 SMP
rc linux-image-3.2.0-26-generic 3.2.0-26.41 Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii linux-image-3.2.0-27-generic 3.2.0-27.43 Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii linux-image-3.2.0-29-generic 3.2.0-29.46 Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii linux-image-3.2.0-31-generic 3.2.0-31.50 Linux kernel image for version 3.2.0 on 64 bit x86 SMP
iU linux-image-3.2.0-32-generic 3.2.0-32.51 Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii linux-image-generic 3.2.0.31.34 Generic Linux kernel image
</pre>
いっぱいある。結構たくさんある。なんとなく少しは戻れるように3.2.0-29以前を削除することにする<br />
<pre class="prettyprint">[****@***] $ sudo apt-get remove linux-image-3.2.0-2{3,5,6,7,9}-generic -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package linux-image-3.2.0-23-generic is not installed, so not removed
Package linux-image-3.2.0-25-generic is not installed, so not removed
Package linux-image-3.2.0-26-generic is not installed, so not removed
The following packages will be REMOVED:
linux-image-3.2.0-27-generic linux-image-3.2.0-29-generic
0 upgraded, 0 newly installed, 2 to remove and 66 not upgraded.
15 not fully installed or removed.
After this operation, 298 MB disk space will be freed.
Setting up ubuntu-keyring (2011.11.21.1) ...
...(略) ...
Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-3.2.0-32-generic
</pre>
よくみたら最初の方はrcだった。とりあえず、<br />
<pre class="prettyprint">sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
</pre>
してOK。df -hするとbootパーティションが半分くらい空いたが、また消すのめんどくさいな。<br />
調べてみると、今の時代ではbootを別パーティションにする必要はないっぽい。<br />
参考:<a href="https://forums.ubuntulinux.jp/viewtopic.php?pid=12939">https://forums.ubuntulinux.jp/viewtopic.php?pid=12939</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-9759877563679684732012-10-16T21:13:00.000+09:002012-10-16T21:13:04.405+09:00pyublasのメモ(vector、matrixの受け渡し)受け渡しに関するメモ<br />
<br />
ublas型でも受け渡しができるので便利、ただし、参照型はconstでしか受け取れない。
<pre class="prettyprint">
// コピーなし受け渡し、しかしmatへのアクセスは遅いらしい
template<class ValueType>
pyublas::numpy_matrix<ValueType> takeAndReturn(
pyublas::numpy_matrix<ValueType> mat)
{
return mat;
}
// ただ返すだけ
template<class ValueType>
pyublas::numpy_matrix<ValueType> returnNumpyMatrix(int numRow, int numCol)
{
pyublas::numpy_matrix<ValueType> mat(numRow, numCol, 0);
return mat;
}
// ublasをnumpyに変換して返してくれる
template<class ValueType>
pyublas::numpy_matrix<ValueType> returnUblasMatrixAsNumpyMatrix(int numRow, int numCol)
{
ublas::matrix<ValueType> mat(numRow, numCol, 0);
return mat;
}
// ublasとして返しても変換テーブルで変換して返してくれる。C++で使っている関数がそのまま使える。
template<class ValueType>
ublas::matrix<ValueType> returnUblasMatrix(int numRow, int numCol)
{
ublas::matrix<ValueType> mat(numRow, numCol, 0);
return mat;
}
// ublasにコピーして渡される
template<class ValueType>
void takeUblasMatrix(ublas::matrix<ValueType> mat)
{
}
// コンパイルは通るが、実行時に怒られる
template<class ValueType>
void takeUblasMatrixRef(ublas::matrix<ValueType> &mat)
{
}
// ublasに変換してコピーして渡される
template<class ValueType>
void takeConstUblasMatrix(const ublas::matrix<ValueType> mat)
{
}
// constだと参照でも渡せる。
template<class ValueType>
void takeConstUblasMatrixRef(const ublas::matrix<ValueType> &mat)
{
}
</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-21698057324022874002012-10-16T20:32:00.000+09:002012-10-16T21:13:25.583+09:00pyublas使うまでのメモ環境はUbuntu12.04、Boostはインストール済みとする。ちなみに1.46<br />
<div>
<br /></div>
<div>
まずはPyUblasのインストール</div>
<div>
ここから最新版をダウンロード <a href="http://pypi.python.org/pypi/PyUblas">http://pypi.python.org/pypi/PyUblas</a></div>
<div>
</div>
<pre class="prettyprint">tar xvzf PyUblas-VERSION.tar.gz</pre>
<div>
解凍して</div>
<pre class="prettyprint">cd PyUblas-VERSION
./configure.py --boost-python-libname=boost_python --use-iterators
sudo make install
</pre>
<div>
<br /></div>
<div>
boost-python-libnameは/usr/libにあるlibboost_python*.soのlibと.soを除いた部分を設定。</div>
<div>
今回はCMakeでサンプルをビルドしてみた。別にMakeでもよい</div>
<pre class="prettyprint">cd test</pre>
<div>
すると</div>
<div>
sample_ext.cppとsample.pyがある</div>
<div>
自分で考えろという意味なのか、Makefileとかがない。</div>
<div>
調べると必要なものは</div>
<div>
Include: boost, python, pyublas</div>
<div>
Library: boost_python, python</div>
<div>
で、自分の環境では、</div>
<div>
Include:</div>
<div>
/usr/local/lib/python2.7/dist-packages/PyUblas-ほげほげ/include</div>
<div>
/usr/lib/python2.7</div>
<div>
Library:</div>
<div>
/usr/lib/libboost_python.so</div>
<div>
/usr/lib/libpython2.7.so</div>
<div>
にあった</div>
<div>
<br /></div>
<div>
ちなみに、PyUblasのIncludeパスは<a href="http://documen.tician.de/pyublas/faq.html#where-do-the-headers-get-installed">http://documen.tician.de/pyublas/faq.html#where-do-the-headers-get-installed</a>を参考に見つけた。</div>
<div>
<br /></div>
<div>
これを元に、Makefileを作っても良いが、楽をするために、CMakeでやった。</div>
<div>
<br /></div>
<pre class="prettyprint">cmake_minimum_required(VERSION 2.8)
find_package(Boost COMPONENTS python REQUIRED)
find_package(PythonLibs REQUIRED)
find_path(PYUBLAS_DIR pyublas /usr/local/lib/python2.7/dist-packages/PyUblas-2011.1-py2.7-linux-x86_64.egg/include)
# 共有オブジェクトを作成する
add_library(
sample_ext
SHARED
sample_ext.cpp
)
# インクルードディレクトリ -Iにあたる
include_directories(
${Boost_INCLUDE_DIRS}
${PYTHON_INCLUDE_DIR}
${PYUBLAS_DIR}
)
# リンクディレクトリ -Lにあたる
link_directories(
${Boost_LIBRARY_DIRS}
)
# リンク -lにあたる。libboost_python.soとlibpython2.7.soが設定されている
target_link_libraries(
sample_ext
${Boost_LIBRARIES}
${PYTHON_LIBRARIES}
)
# libsample_extとならないようにする
set_target_properties(
sample_ext
PROPERTIES PREFIX ""
)
</pre>
<div>
<br />
パッケージが見つからなかったときの処理とかは書いていない。<br />
これをCMakeLists.txtというファイル名でsample_ext.cppと同じディレクトリにおいて、<br />
そこから<br />
<pre class="prettyprint">mkdir build
ccmake ..
</pre>
して見つからなかったところを設定して、(特にPYUBLAS_DIRのところ)<br />
ジェネレートして、makeして、OKだったら<br />
<pre class="prettyprint">mv sample_ext.so ../
cd ..
python sample.py
</pre>
<br />
2倍されている結果が帰ってくる</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-30867258169028634512012-08-23T23:46:00.000+09:002013-01-29T10:52:33.663+09:00jqueryとjquery uiを使ったマウスオーバーによるポップアップ水色のボックスにマウスをのせるとポップアップが出ます。<br />
ツールチップ的な使い方もできます。<br />
jquery uiのpositionを使って、ポップアップの位置をマウスのポジションからの相対的に決めています。<br />
<div>
<br /></div>
<div>
<br /></div>
<iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/zKeUX/8/embedded/" style="height: 300px; width: 100%;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=dvbscb-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4844362135" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=dvbscb-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4798123447" style="height: 240px; width: 120px;"></iframe>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-45925131961333569992012-08-12T17:19:00.000+09:002012-08-12T17:22:58.205+09:00djangoでsyncdbで管理者ユーザーを設定する<style type="text/css">
.prettyprint {
overflow : auto;
}
</style>
<a href="http://djangoproject.jp/doc/ja/1.0/howto/initial-data.html" rel="nofollow" target="_blank">fixture</a>という機能で設定します。<br />
<a href="http://stackoverflow.com/questions/2412328/how-to-load-sql-fixture-in-django-for-user-model" rel="nofollow" target="_blank">ココ</a>を参考にして、initial_data.json(settings.pyのFIXTURE_DIRSに設定したディレクトリ内)を作成して<br />
<br />
<pre class="prettyprint"> [
{
"pk":1,
"model": "auth.user",
"fields": {
"username": "admin",
"password": "pbkdf2_sha256$10000$Z9TQtBh3bSmV$gq99AxSMLIHyIjDCSsVRjX8doLYgJxl1p1z7QZMWBr4=",
"is_staff": true,
"is_superuser": true
}
}
]
</pre>
<div>
<br />
を設定する。ちなみにこのパスワードはmanage.py shell(自分はDJANGO_SETTINGS_MODULE=settings ipythonでやる)で次をやって生成する。<br />
<pre class="prettyprint">>>> from django.contrib.auth.models import User
>>> u = User()
>>> u.set_password('admin') #adminというパスワードを作成
>>> u.password
'pbkdf2_sha256$10000$Z9TQtBh3bSmV$gq99AxSMLIHyIjDCSsVRjX8doLYgJxl1p1z7QZMWBr4='</pre>
<br />
これでmanage.py syncdbすると自動的にユーザーadminが設定される。</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-47547915858547794002012-08-12T15:07:00.000+09:002012-08-12T15:11:49.914+09:00Twitter Bootstrap - tabの中のdropdown menuの表示問題<h2>bootstrap v2.0.4での問題</h2>
<p>
bootstrapのtabの中にdropdownを置くとはみ出す部分が切り取られてしまう。<a href="https://github.com/twitter/bootstrap/issues/3661">Stack overflow</a>
再生ボタンをおして、Actionsボタンを押してみてほしい。(+ボタンを押すとソースを見れるページに飛びます)
</p>
<iframe allowfullscreen="allowfullscreen" frameborder="0" src="http://jsfiddle.net/GGMWX/7/embedded/" style="height: 300px; width: 100%;"></iframe>
<h2>とりあえずの解決方法</h2>
<p>
bootstrap.jsの中身を見ていると.tab-contentにはoverflow:auto;が設定されている。
.tab-contentにoverflow:visible;を上書き設定すると直った。
</p>
<iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/GGMWX/8/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<p>
何か他のところで問題がでるかもしれない。
とりあえず、Chrome、Firefox、Safariでちゃんと動いている。
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-34128999582584621872012-08-01T11:19:00.000+09:002012-08-09T11:26:07.693+09:00Django - settings.py url.pyでreverseを使う自分用メモ<br />
url.pyなどで、reverseを使うとurl.pyが実行される時点では、urlの設定はされていないため、うまく動かない。<br />
そこで、django.utils.functionalのlazyを使って、reverseを遅延評価させる。<br />
<a href="http://stackoverflow.com/questions/1794655/reverse-django-generic-view-post-save-redirect-error-included-urlconf-doesnt">http://stackoverflow.com/questions/1794655/reverse-django-generic-view-post-save-redirect-error-included-urlconf-doesnt</a><br />
<div>
<br />
lazyの解説はここがわかりやすい。</div>
<div>
<a href="http://d.hatena.ne.jp/perezvon/20061022/1161530146">http://d.hatena.ne.jp/perezvon/20061022/1161530146</a></div>
<br />
追記<br />
Django1.4からreverse_lazyというメソッドが追加されているのでそれを使えば良い<br />
<a href="https://docs.djangoproject.com/en/dev/releases/1.4/#reverse-lazy">https://docs.djangoproject.com/en/dev/releases/1.4/#reverse-lazy</a><br />
<br />
例えば、<br />
<br />
from django.core.urlresolvers import reverse_lazy<br />
<br />
LOGIN_URL = reverse_lazy('accounts-login')Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4402644377465864182.post-15679683137264657422012-06-21T12:09:00.001+09:002013-01-29T10:46:55.008+09:00Ubuntu 12.04 LTS のプロキシで無視リストを設定Ubuntuを10.04LTSから12.04LTSに移行したらプロキシ設定のUIが変わってた。<br />
<br />
めちゃくちゃシンプルになっていて、今まであったプロキシの例外設定を加える項目が見当たらない。<br />
<br />
調べてみると見つかった。<br />
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=dvbscb-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4798033812" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
<a href="http://askubuntu.com/questions/68089/where-to-set-proxy-ignore-list" rel="nofollow" target="_blank">Where to set proxy ignore list?</a><br />
<br />
まず、設定するためのソフトウェアdconf-toolsを入れる。<br />
sudo apt-get install dconf-tools<br />
<br />
Superキー(Winキー)を押してUbuntuメニューを表示し、dconfと入力すると、「dconf Editor」というものが出てくるのでそれを実行。<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0WOOcnFa5trOKZf2wM018o6roLaALCjRNRyR69ilm0je6GHmaUkIYPn1wPZQw-MwQbHQ6YHcRqNyFGvTspYsM22kCP9OtrNEaT_keDX7nK9wCKkER0BR-UGofyoDtoQOXemX5WPRnp4Q/s1600/Screenshot+from+2012-06-21+21:05:00.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0WOOcnFa5trOKZf2wM018o6roLaALCjRNRyR69ilm0je6GHmaUkIYPn1wPZQw-MwQbHQ6YHcRqNyFGvTspYsM22kCP9OtrNEaT_keDX7nK9wCKkER0BR-UGofyoDtoQOXemX5WPRnp4Q/s320/Screenshot+from+2012-06-21+21:05:00.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">gconf editor設定画面</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
proxyのところにignore-hostsという項目があるので、Valueのところをクリックして、無視リストを追加する。例えば、['localhost','127.0.0/8'<span style="color: red;">,'*.example.com'</span>]とか。<br />
<br />
以上。Unknownnoreply@blogger.com0