yetnoneの日記

どこぞのPh.D. student。何をやっているかと聞かれると困る。

samtools 1.7 で `error: ‘SAMTOOLS_VERSION’ undeclared (first use in this function)`

使っていた環境に samtools が入っていなかったので入れようとしたら、$ make でタイトル通りのエラーが。

<samtools のルート>/misc/*.c での SAMTOOLS_VERSION の参照がエラーになる。

SAMTOOLS_VERSIONmake の最初の方で生成される <samtools のルート>/version.h の中で #define SAMTOOLS_VERSION "1.7" のように定義されている。

ところが、上記 <samtools のルート>/misc/*.c では #include "version.h" としていて、ヘッダがある正しいディレクトリと1階層ずれている。

$ make を一回走らせてエラーを食らった後、$ cp version.h misc/version.h として再度 $ make でOK。

(GitHub の Issue 立てろ)

Jupyter notebook に Node.js カーネルを追加

[状況] Cent OS サーバ, python3 環境下でインストールした Jupyter に、Node.js カーネルとして jupyter-nodejs を追加したい。python2 仮想環境は Anaconda で(py27の名前で)すでにインストールしてある。

1. jupyter-nodejs をインストール

node はインストール済みと仮定。

python2 環境でないと(python2コマンドが無いと?)ダメそうなので、$ source activate py27 で python2 環境に入る。

$ node installzeromq インストールで引っかかった。

まずは g++ 用の zeromq をインストール。リンク先の POSIX tarball をダウンロード、説明通りにインストール。サーバで自前のディレクトリに入れた場合は CPLUS_INCLUDE_PATH/opt/include を追加すること等を忘れない。

これで $ npm install zmq; npm install zeromq が通るようになるはず。そのままインストールの続きを実行。

2. Jupyter notebook 側の設定

jupyter-nodejs インストール後、python 3 環境に戻って Jupyter notebook を開き NodeJS カーネルを新規作成すると、dead kernel となってしまった。

python2 環境に入ってから再度同様にすると、カーネルは動くが、リモート実行していた(ブラウザをサーバ側で開かずに、ローカルにポートフォワーディングしていた)のが、ブラウザが開くように(設定が無効に)なってしまっていた。

Jupyter のコンフィグファイル ~/.jupyter/jupyter_notebook_config.py を一時退避し、python2 環境下で再度

$ jupyter notebook --generate-config

を実行した後に、退避していたコンフィグファイルを元に(作成したものに上書きして)戻したところ、python2 環境を抜けても元通りの動作をするようになった。

もっとスマートな方法はありそう。

ルート権限無しでライブラリのパスを通す

Linux サーバなどでユーザ権限しか持っていない状況で、(ルート権限が必要な) ldconfigコマンドを使わずに、自分で用意したディレクト/path/to/lib以下にインストールした静的/動的ライブラリを参照可能にする。

d.hatena.ne.jp

動的ライブラリの場合はLD_LIBRARY_PATHディレクト/path/to/libを指定すれば大丈夫だが、静的ライブラリも参照するためにはLIBRARY_PATHにも/path/to/libを指定する必要がある。

d.hatena.ne.jp

そして、パッケージの情報も参照可能にする。これはPKG_CONFIG_PATHディレクト/path/to/lib/pkgconfigを追加すればよい。

結局、以下を.bash_profileに追記する。

export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=/path/to/lib:$LIBRARY_PATH
export PKG_CONFIG_PATH=/path/to/lib/pkgconfig:$PKG_CONFIG_PATH

Typora でエディタ(編集領域)の幅を広げる[Mac]

Kobito -> Bear -> Typora とマークダウンエディタを渡り歩いてきたが、現状 Typora にはとても満足していて、当分より良いマークダウンエディタ探しの旅には出なくて済みそう。Typora を使っていると期待しない動作や編集したファイルの一部が欠落する(!)といった問題挙動(再現性を詳しく調査したわけではないので自分のせいかもしれない)があるにも関わらずこの満足度というのはすごいと思う。

個人的には、あと

  • PDF を含めた(ローカルの)ファイルの添付機能(これは Bear にあった)
  • 埋め込み HTML のサポート(Plotly とかの図を貼り付けたい)

が追加されれば完璧といった感じ。後者は Issue でもけっこう激しく議論されているのでそのうちサポートされるかも(もっとも製作者の哲学としては不要との見解らしいが)。

さて、Typora はデフォルトだと(特に 15インチ MacBookPro を解像度最大で使っている自分のような人間にとっては)編集領域がけっこう狭い。この幅は通常、

${HOME}/Library/Application\ Support/abnerworks.Typora/themes/github.css

中の #writemax-width: 860px のように定義されている。この値を自由に変えればそのまま反映される。下記リンクを参考にした。

github.com

新しい環境での個人的Emacs最低限環境の構築手順

このご時世にまだEmacsを使っているのかとは自分でもたまに思うが、変化を迫る決定的な要因がないから惰性で使い続けてる。

まず、以下を~/.emacs.d/init.elに記述。

(custom-set-faces
 '(default ((t (:background "black" :foreground "#55FF55"))))
 '(cursor ((((class color) (background dark)) (:background "#00AA00")) (((class color) (background light)) (:background "#999999")) (t nil))))

(setq inhibit-startup-message t)
(setq make-backup-files nil)
(setq auto-save-default nil)
(setq auto-save-list-file-name nil)
(setq auto-save-list-file-prefix nil)
(show-paren-mode 1)
(set-face-background 'show-paren-match-face "grey")
(set-face-foreground 'show-paren-match-face "black")
(setq cursor-in-non-selected-windows nil)
(global-font-lock-mode t)
(column-number-mode t)
(line-number-mode t)
(setq fill-column 80)
(setq-default auto-fill-mode t)
(setq tab-width 4)
(setq scroll-step 1)
(setq backup-inhibited t)

;; c mode
(add-hook 'c-mode-common-hook
          '(lambda ()
             (c-set-style "k&r")
             (setq c-basic-offset 4)
             (setq indent-tabs-mode 4)
             (setq tab-width 4)))

次はMELPA。Emacs 24以降じゃないと追加でなんかしないといけないはず。Emacs 24以降であれば以下をinit.elに追記。

;; melpa
(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
                    (not (gnutls-available-p))))
       (url (concat (if no-ssl "http" "https") "://melpa.org/packages/")))
  (add-to-list 'package-archives (cons "melpa" url) t))
(when (< emacs-major-version 24)
  ;; For important compatibility libraries like cl-lib
  (add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/")))
(package-initialize)

MELPAはM-x package-list-packagesでパッケージを探してM-x package-install RET <package_name>でインストール(リストの状態からもIとXでインストールできるが個人的になぜかこっちを好んでいる)。

そしてMELPAを使ってauto-completeパッケージをインストール。その後init.elに以下を追記。

;; auto-complete
(require 'auto-complete)
(require 'auto-complete-config)
(global-auto-complete-mode t)
(define-key ac-complete-mode-map "\C-n" 'ac-next)
(define-key ac-complete-mode-map "\C-p" 'ac-previous)

同じくMELPAでflycheckパッケージをインストール。その後init.elに以下を追記。

;; flycheck
(add-hook 'after-init-hook #'global-flycheck-mode)
(define-key global-map (kbd "\C-cn") 'flycheck-next-error)
(define-key global-map (kbd "\C-cp") 'flycheck-previous-error)
(define-key global-map (kbd "\C-cd") 'flycheck-list-errors)

これで最低限の補完とシンタックスチェックが可能。

init.elの最後を以下で締める。

(provide 'init)
;;; init.el ends here

TODO

  • ac-dict for auto-complete?
  • jedi?

コマンド一発でリモートのJupyterをローカルで開く

  1. ssh先のJupyterをローカルで開けるようにする
  2. sshオプションをコンフィグ化、コマンドを1つにまとめる

1. ssh先のJupyterをローカルで開けるようにする

まずはリモートでJupyterの設定。

Running a notebook server — Jupyter Notebook 5.1.0.dev documentation

後は(最初の方は上と被っているが)以下を参照。

coderwall.com

これで、以下の流れでJupyterのフォワーディングができる。

$ ssh ホスト名
> jupyter notebook &
(別のウィンドウで)
$ ssh -N -f -L ローカルでのポート番号:localhost:JUPYTERで設定したポート番号 ホスト名
(ブラウザを開いて "http://localhost:ローカルでのポート番号" にアクセス)

2. sshオプションをコンフィグ化、コマンドを1つにまとめる

以下Mac環境。まずはsshのコンフィグ化。LocalCommandで自動的にローカルのブラウザを開くようにしてある。

Host jupyter                                                                                                           
    HostName ホスト名
    LocalForward ローカルでのポート番号 localhost:JUPYTERで設定したポート番号
    User ユーザ名
    IdentityFile 秘密鍵
    ServerAliveInterval 60
    ProxyCommand ssh -W %h:%p 経由ホスト名
    PermitLocalCommand yes
    LocalCommand open -a "/Applications/Google Chrome.app" http://localhost:ローカルでのポート番号

そして、sshした後にリモートでJupyterを起動してくれるようなエイリアス.bash_profileに追加。

alias jupyter_remote='ssh jupyter "source ~/.bash_profile; jupyter notebook &" &'

これで、ローカルで$ jupyter_remoteとするだけでリモートのJupyterをローカルブラウザで開けるようになった。

ただ現時点で2つ問題点が残っている。

  1. 作業が終わってsshを切ってもリモートのJupyterは実行し続け、プロセスは残りポートを解放しない。幸いその次の起動からは勝手に他のポートを使ってくれるため、何もしなくても何回でも使い続けることは可能だが、定期的にログインしてプロセスを殺してやらないとゴミプロセス達が溜まる一方となってしまう。なので、ssh切断時にプロセスもkillしてくれるようにしたい。

  2. なぜか(Jupyter関連のゴミプロセスが無い状態での)最初の一発だけはchannel *: open failed: connect failed: Connection refusedとなってしまう。1回これを食らってからもう一回$ jupyter_remoteすると大丈夫。

これらの問題をうまく解決できる方法をご存知の方がいたら教えてください。。

自機のグローバルIPの取得

$ curl inet-ip.info

参考文献

qiita.com