I'll be fine

技術ブログ

【Linux Mint, vim】日本語のtexをvimで書く環境を整える

vim-latexを使わずにvimtex環境を整えます。

$ sudo apt-get install ptex-bin
$ sudo apt-get install texlive texlive-math-extra ptex-bin xdvik-ja
$ sudo apt-get install dvipdfmx cmap-adobe-japan1 ptex-jisfonts okumura-clsfiles jmpost jbibtex-base jbibtex-bin mendexk
$ sudo jisftconfig add
$ wget http://www35.tok2.com/home/hashimotolab/LaTeX/dvipdfm-w32.tar.bz2
$ tar jxvf dvipdfm-w32.tar.bz2
$ cd ./share/texmf/fonts/map/agl/
$ sudo cp -v pdfglyphlist.txt glyphlist.txt /etc/texmf/dvipdfmx
$ sudo vim /etc/texmf/texmf.cnf
CMAPFONTS = .;$TEXMF/fonts/cmap//
を
CMAPFONTS = .;$TEXMF/fonts/cmap//;/usr/share/fonts/cmap//
に書き換え
$ sudo update-texmf
$ sudo apt-get install zathura
$ sudo apt-get install poppler-data

vimrcにquickrunの設定を追記(quickrunのインストールは省略)

let g:quickrun_config['tex'] = {
      \   'command' : 'platex',
      \   'exec': ['%c %s', 'dvipdfmx -o %s:r.pdf %s:r.dvi']
      \}

毎回pdfの結果を見たいなら

let g:quickrun_config['tex'] = {
      \   'command' : 'platex',
      \   'exec': ['%c %s', 'dvipdfmx -o %s:r.pdf %s:r.dvi', 'zathura %s:r.pdf']
      \}

zathuraは自動更新してくれるので、一回立ち上げといてquickrunはコンパイルだけの方が良いと思います。

texファイルでLeader+rでコンパイルできます。

【Linux Mint, vim】vim-powerlineにフォントRictyのパッチをあてる

$ cd
$ apt-get install fontforge
$ apt-get install libxml2
$ apt-get install libpng12
$ mkdir .fonts
$ git clone git@github.com:yascentur/Ricty.git
$ cd Ricty
$ wget http://levien.com/type/myfonts/Inconsolata.otf
$ wget -O mig1m.zip 'http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fmix-mplus-ipa%2F57240%2Fmigu-1m-20121030.zip'
$ unzip mig1m.zip
$ rm mig1m.zip
$ sh ricty_generator.sh auto
$ cp Ricty-Regular.ttf Ricty-Bold.ttf ~/.vim/bundle/vim-powerline/fontpatcher/
$ cd ~/.vim/bundle/vim-powerline/fontpatcher
$ fontforge -lang=py -script fontpatcher Ricty-Regular.ttf
$ fontforge -lang=py -script fontpatcher Ricty-Bold.ttf
$ cp -f Ricty* ~/.fonts
$ fc-cache -vf
terminal>編集>プロファイルの設定>全般
フォントをRicty
.vimrcに以下を追記
let g:Powerline_symbols = 'fancy'
set t_Co=256
矢印が文字化けしている場合は
let g:Powerline_symbols = 'compatible'

【C言語 MPI】MPIUnitのsampleを動かすまで

環境:MPICH2, CentOS 5.7

$ wget 'http://sourceforge.jp/frs/redir.php?m=keihanna&f=%2Fmpiunit%2F29902%2FMPIUnit-1.6.1.tar.gz'
$ tar xzvf MPIUnit-1.6.1.tar.gz
$ cd MPIUnit-1.6.1
$ ./configure
$ make
$ make install
makeで 'all に対して行うべき事はありません' と言われても無視
$ vim /etc/ld.so.conf
/usr/local/lib を追記
$ cd sample
$ make mpiut

ubuntuなどでundefined referenceがでる場合は
$ apt-get install binutils-gold

参考:本家(http://sourceforge.jp/projects/mpiunit/wiki/FrontPage)

【Ruby on Rails】Backbone.jsにinclude先の情報を渡す方法と注意点

次のような中間テーブルを挟むhas_manyなDB構造の場合
users table

id email
1 test1@gmail.com
2 test2@gmail.com
3 test3@gmail.com
4 test4@gmail.com
5 test5@gmail.com

users_services table

id user_id service_id role
1 3 2 role1
2 2 1 role2
3 3 3 role2
4 1 1 role2
5 1 2 role1

services table

id name
1 service1
2 service2
3 service3

railsのコントローラで以下のように書いてもinclude先の情報はbackboneに渡されません。
index_controller.rb

def index
  @users = User.find(
    :all,
    :include => :services,
  )
end

index.html.erb

<script type="text/javascript">
  $(function() {
    window.router = new Blog.Routers.UsersRouter({users: <%= @users.to_json.html_safe -%>});
    Backbone.history.start();
  });
</script>

to_json時にincludeしなければなりません。
index_controller.rb

def index
  @users = User.find(
    :all,
    :include => :services,
  ).to_json(
    :include => :services,
  ).html_safe
end

index.html.erb

<script type="text/javascript">
  $(function() {
    window.router = new Blog.Routers.UsersRouter({users: <%= @users -%>});
    Backbone.history.start();
  });
</script>

中間テーブルのデータをとってくるときの注意点

以下のように中間テーブルのデータを取ってこようとすると

User.find(
  :all,
  :include    => :services,
  :conditions => ["services.id = ?", 1],
)).to_json(
  :only    => [:email,:id],
  :include => {:users_services => {:only => [:service_id, :role]}},
)

次のようなjsonがかえってきます。

'[{"email":"test2@gmail.com","id":2,"users_services":[{"role":"role2","service_id":1}]},{"email":"test1@gmail.com","id":1,"users_services":[{"role":"role2","service_id":1},{"role":"role1","service_id":2}]]'

最後を見てもらえればわかる通りconditionsでservice_idが1のものを指定しているのに2のものがくっついてきています。
to_jsonのinclude時のsql文を見てみると

SELECT `users_services`.* FROM `users_services` WHERE `users_services`.`user_id` = 1
SELECT `users_services`.* FROM `users_services` WHERE `users_services`.`user_id` = 2

なぜかuser_idで絞ってます。
この問題を回避するにはto_json時にmethodsを定義します。
index_controller.rb

def index
  @users = User.find(
    :all,
  )).to_json(
    :only    => [:email,:id],
    :methods => :fetch_service_id_one
  )
end

user.rb

def fetch_service_id_one
  users_services.where("service_id = ?", 1).select("service_id, role")
end

sql

SELECT service_id, role FROM `users_services` WHERE `users_services`.`user_id` = 1 AND (service_id = 1)
SELECT service_id, role FROM `users_services` WHERE `users_services`.`user_id` = 2 AND (service_id = 1)

返ってくるjson

'[{"email":"test2@gmail.com","id":2,"fetch_service_id_one":[{"role":"role2","service_id":1}]},{"email":"test1@gmail.com","id":1,"fetch_service_id_one":[{"role":"role2","service_id":1}]]'

service_idが1のものだけ返ってくるようになりました。

もしこうしたほうが楽にできる、ここ間違ってるなどあれば教えてくださいm(_ _)m

【C言語 MPI】MPIをgdbでデバッグする方法

コードのに無限ループを挿入して止める。(場所は適当に)

int debugwait = 1;
while ( debugwait );

コンパイル時にgdbのオプション(-g)をつける

$ mpicc -g -o progname progname.c

実行

$ mpirun -np 4 ./progname &

実行中のプロセスを調べる

$ ps ax | grep progname

調べたプロセスidのノードでgdbを実行

$ gdb progname process_id

無限ループ解除

(gdb) set debugwait = 0

recvで止まる?もうちょい検証が必要。