yetnoneの日記

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

新しい環境での個人的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

サーバでpython

サーバ(CentOS)のvirtualenvでpython (python2とpython3両方)とpip。

  • pyenv: 異なるバージョンのpythonを使いやすく
    • $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
    • .bash_profileに数行追加(リンク参照)
    • 各種コマンド(pythonインストール、バージョン一覧表示、バージョン切り替え、virtualenv構築)もリンク参照
  • pip: $ pip install pip???
    • $ curl -kL https://bootstrap.pypa.io/get-pip.py | python*
    • パイプ後のpythonのバージョンに合わせたpipがインストールされる
    • pipのアップグレードは$ pip install -upgrade pip

-> pyenvがインストールするpythonはstandard libraryが含まれていない?(Jupyter notebookを使おうとしたが、sqliteが無いと怒られてハマった。)

結局、pyenv -> anacondaが手っ取り早い(これもリンク参照; standard library, pipともにanacondaインストール時に自動で付いてくるし、python2/3切り替え機能も、virtualenv機能もある)。

anaconda w/ python3インストール後、$ conda create -n py27 python=2.7 anacondaでpython2.7インストール。

$ source activate py27でpython2.7環境に入れる。

参考文献

qiita.com

www.qoosky.io

qiita.com

qiita.com

qiita.com

qiita.com

"腸に効く"アイスは可能か?(細菌の定着の観点から)

以前とある事情から少し調査した内容(と一部私見)。

  • 胃腸の温度を冷やすと、消化機能が低下するらしい。もしかしたら"腸内バリア機能"も?(要出典)
    • -> 細菌が定着しやすくなる可能性はある?

  • Ericsson, A., Personett, A., Turner, G., Dorfmeyer, R. & Franklin, C. Variable Colonization after Reciprocal Fecal Microbiota Transfer between Mice with Low and High Richness Microbiota. Frontiers Microbiol 8, (2017).
    • FMTにおいてfrozen sampleはfresh fecesと同様の効果があった
      • frozenの方が良いわけではない
    • FMTはそもそも最初に抗生物質で元々いる細菌叢を崩してから行うので、単なる細菌の経口摂取で効果があるかは不明
    • frozenだとサンプル調整が楽らしい
  • David, L. et al. Diet rapidly and reproducibly alters the human gut microbiome. Nature 505, 559–563 (2014).
    • 食事由来の細菌は長期的には細菌叢の変化をもたらさないが、当日などの短期的には遺伝子発現を含めて変化させる
      • 腸内で増えることは増えるが、どうやって定着させるかが結局は問題
  • Donaldson, G., Lee, S. & Mazmanian, S. Gut biogeography of the bacterial microbiota. Nat Rev Microbiol 14, 20–32 (2016).
    • どの菌種が増えるかはprebiotics (それぞれの菌種が必要とする栄養)に依存する
    • ヒト腸内細菌叢の形成においては、乳などによってprebioticsがコントロールされている
      • BifidobacteriumとBacteroidesが寡占的となる
    • ヒト腸内には菌種組成を安定に保つ何らかの機構が存在する
      • 部位ごとに局所的にそれぞれ栄養を制限することで菌種組成を制御している
      • 抗生物質などで菌種組成が崩れた時に元に戻すための、細菌の保管場所のようなものが存在する
      • それならば、FMTで菌種組成が変わるのはなぜ?抗生物質は一応組成を変えることは変えるということか?
  • Anselmo, A., McHugh, K., Webster, J., Langer, R. & Jaklenec, A. Layer‐by‐Layer Encapsulation of Probiotics for Delivery to the Microbiome. Adv Mater 28, 9486–9490 (2016).
    • 多糖類のカプセルで細菌を包むと腸に届くまでに死ににくい
      • そりゃそうだ
    • 1時間後の増殖率しか見ていないので、定着は無理だったか
  • Chassaing, B. et al. Dietary emulsifiers impact the mouse gut microbiota promoting colitis and metabolic syndrome. Nature 519, 92–96 (2015).
    • 乳化剤が炎症を起こす
      • アイスにも入っていることが多い
  • Roberfroid, M. Prebiotics: the concept revisited. The Journal of nutrition (2007).
    • prebiotics = (腸内の)細菌の増殖を促進させるもの
    • トランスガラクト−オリゴ糖やイヌリン
  • Sanders, M. & Marco, M. Food Formats for Effective Delivery of Probiotics. Food Sci Technology 1, 65–85 (2010).
    • prebiotics + probioticsが効果を促進する
  • Lourens-Hattingh, A. & Viljoen, B. Yogurt as probiotic carrier food. Int Dairy J 11, 1–17 (2001).
    • ヨーグルトだと酸に耐性のない菌は入れにくい
    • Bifidobacteriumの増殖には37度が最適
      • アイスだと当然だが真逆

Bear: Markdownエディタ

Bearとかいう素晴らしいものを見つけてしまった。

Kobitoと比較した場合、個人的に特筆すべき点は、

  • UIがきれい
  • Markdownを書いたそばから解釈して修飾してくれる
  • メモ一覧にピン機能がある
  • メモのリンクが可能
  • チェックボックスを書ける
  • PDFその他ファイルを埋め込める、さらにAcrobatで開けるのでハイライト・コメント編集も可能
  • (Pro版だと)PDFにエクスポートできる(未確認)

すごい。ただ、現時点では以下のような至らない点もいくつかある。

  • 数式、表の入力ができない(LaTaXiTでPNGに出力してそれを貼り付けることはできる)
  • バックアップをどうするかまだよく分からない
  • Pro版は有料

数式と表は使いたいので少し痛いが、それを補っても余りあるほどのメリットがBearにはある。

すでにいくつかのメモをKobitoから以降したが、今後機能が順調に充実していけばおそらくBearに完全以降するだろう(このブログも怪しいと一瞬思ったが、短いメモや利用頻度の低いメモが一覧を圧迫するのが嫌いなので、そういったものや、今回のような一過性のメモについては今後もこちらに書くことになるだろう)。

あと余談だが、Bearはググラビリティが低すぎる。。。ググラビリティと使用率に相関があったりしないかなと考えたりするのだが、見つけたい人はちゃんと見つけるので大丈夫か。

Git(Hub)で他人のレポジトリをcloneして新規branchを作って自分のレポジトリに公開するまでの流れ

(Qiitaに書いた方がいいかも)

  • $ git clone URL
    • submoduleも一緒に取ってきたい場合は--recursiveをつける
    • submoduleをアップデートしたい場合は$ git submodule update --recursive
  • $ git remote -vで現在のリモートリポジトリ覧表示
  • $ git branchでブランチ一覧表示、引数を付ければその名前のブランチを作成
  • $ git checkout BRANCH_NAMEでブランチ移動
  • GitHub上で自分の(空の)レポジトリを作成
  • $ git remote add REMOTE_NAME REMOTE_URLでリモートリポジトリを作成
  • $ git add .; git commit -m "MESSAGE"
  • $ git push REMOTE_NAME BRANCH_NAMEで自分のレポジトリのブランチに追加
  • .gitmodulesのURLを適切なものに変更する
    • ../REPOSITORY_NAMEだと自分のレポジトリ、URLのフルパスにすると任意の(他人の)レポジトリを参照できる
  • $ git submodule add URL LOCAL_NAME; git submodule update --init --recursiveでsubmoduleを追加
    • $ git branch -rでmaster以外にどのブランチがあるか確認
    • $ git checkout BRANCH_NAME origin/BRANCH_NAMEでブランチ追加
    • submoduleが指すコミットを変更したい場合は、submodule内部で$ git checkout BRANCH_NAME|COMMIT_ID -> submodule外部で$ git add .
    • $ git submodule deinit ディレクトリ名; git tm -rf ディレクトリ名で削除
  • $ git log --oneline --graph --decorateでログツリーを確認
  • $ git pull, $ git mv, $ git rm (--cached), $ git status

SSH接続

  • $ git remote -vhttps://github.com/...と表示されたら、$ git remote set-url origin git@github.com:...
  • 以降はここに従って~/.ssh/configを編集
    • id_rsa以外の鍵を使いたい場合は-iで指定
  • Gtk-WARNING **: cannot open display と表示されたら$ unset SSH_ASKPASS

.gitignoreファイル

  • 複数のディレクトリに置くことができる
  • 深い階層の.gitignoreに書かれた指定の方が優先順位が高い
  • 以下の上の行から順に解釈される
    • /を含まない、もしくは末尾以外にのみ/を含む行(e.g. file, /file, path/to/file, /path/to/file)
    • 末尾が/の行(e.g. /path/to/directory/, path/to/directory/)
    • !で始まる行(e.g. !/path/to/file)
      • !以降のパターン文字列が示すファイルまたはディレクトリを無視しない
      • 前の無視指定を上書きする
      • 以降の無視指定に上書きされうる
    • 空行もしくは#で始まる行
      • 解釈されない
  • ワイルドカード(*, ?, [0-9]など)も使える