nogawaparkのブログ

書く練習。

emacsでpythonを書く設定

Table of Contents

  1. emacsでpythonを書く設定
    1. Ubuntuの設定
    2. emacsのインストール
    3. 完成したinit.el
    4. 日本語環境の構築
    5. pythonの設定
      1. python仮想環境
      2. 必要なライブラリのインストール
      3. black を動作させる
      4. jupyter notebook で図をemacs上で開く
      5. pdbを起動するための設定
    6. 以上です

ホストWindows10Home, Virtualbox上のゲストUbuntu20.04に emacs26.3を入れてリント、pdb、jupyter notebookを使うまでに行った設定の備忘録 基本的に参考にしたサイトを書いていって、自分の環境で行ったことをここでコメントする。

Ubuntuの設定

https://qiita.com/pyon_kiti_jp/items/0be8ac17439abf418e48 を参考にUbuntuのvirtual machineを作成。

キーボードをUS配列(HHKB)で使いたいので、キーボード設定を更変 https://qiita.com/khsk/items/deb798c457d7888e1714 https://magidropack.hatenablog.com/entry/2019/01/05/174048 日本語キーボードを消して、入力ソースを英語(US)のみに変更 日本語キーボードも使いたくなったら追加する。

emacsのインストール

最新版のemacs26.3を入れたかったので調べたら、GUIでUnuntu Sofrwareでできるとのことだった。 http://ubuntuhandbook.org/index.php/2019/08/gnu-emacs-26-3-released-how-to-install-it-in-ubuntu-18-04/

完成したinit.el

完成版はhttps://github.com/RyotoYamashita/dot.emacs.d/blob/master/.emacs.d/init.el にあります。 注意点としてjupyterで生成した図がインラインで表示されず、 init.el以外の設定を行いました。 これについては記事の下方で述べます。

日本語環境の構築

そのままのemacsの日本語モードはストレスフルである。 例えば、「めりっと」を変換すると「減りっと」にしか変換できない。 そこでmozcを入れた。 https://qiita.com/Maizu/items/fee34328f559c7dc59d8 ターミナルで

$ sudo apt-get install emacs-mozc-bin

WSLの場合、

[https://ahiru8usagi.hatenablog.com/entry/WSL_GUIApps_Japanese:title]

を参考に日本語フォントをインストール

$ sudo apt-get install fonts-ipafont

その後、 ~/.emacs.d/init.el に以下のように書き込んで、emacsを再起動。

;;; package.el
(require 'package)
;; MELPAを追加
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
;; MELPA-stableを追加
(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/"))
;; Marmaladeを追加
(add-to-list 'package-archives  '("marmalade" . "https://marmalade-repo.org/packages/"))
;; Orgを追加
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
;; 初期化
(package-initialize)


(defvar myPackages
  '(better-defaults                 ;; Set up some better Emacs defaults
    mozc
    material-theme                  ;; Theme
    )
  )

;; Scans the list in myPackages
;; If the package listed is not already installed, install it
(mapc #'(lambda (package)
      (unless (package-installed-p package)
        (package-install package)))
      myPackages)


;;; mozc
(set-language-environment "Japanese")           ; 言語環境を"japanese"に
(setq default-input-method "japanese-mozc")     ; IMEをjapanes-mozcに
(prefer-coding-system 'utf-8)                   ; デフォルトの文字コードをUTF-8に

(global-set-key (kbd "C-o") 'toggle-input-method)

これで良い感じの変換を行ってくれる。 C-oで日本語英語切り替えをする。

エラーが出たら、M-x package-refresh-contentsを行った後、emacsを再起動

pythonの設定

elpyというライブラリを入れておけばあらゆるpython機能が使えるらしい。 基本的に、https://realpython.com/emacs-the-best-python-editor/ この神記事を参考にした。 一部設定をこちらでしないといけないことがあるので、 それについて記しておく。

python仮想環境

elpyはpython仮想環境を必要とするらしい。 そのため今回はpython標準でできるvenvを使った。 ターミナルで以下のように記述すると、仮想環境を作って起動できる。

$ python3 -m venv ./test
$ source test/bin/activate
(test)$

この仮想環境を起動した状態でemacsを起動すると、elpyが使える。

必要なライブラリのインストール

blackとjupyterをpipでインストールした。

black を動作させる

blackという保存するたびにリントを効かせるプログラムがあるがこれを動作させるには、 init.elに以下の設定が必要であった。

;; Enable autopep8
(require 'py-autopep8)
(add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save)
;; 以下の行の追加が必要
(add-hook 'after-save-hook 'elpy-black-fix-code)

jupyter notebook で図をemacs上で開く

図がemacsで表示されずfirefoxで表示されてしまう。 いろいろ調べていたらやり方がein公式に書いてあった。

https://github.com/millejoh/emacs-ipython-notebook

display images inline? We find inserting images into emacs disruptive, and so default to spawning an external viewer. To override this,

M-x customize-group RET ein Ein:Output Area Inlined Images

pdbを起動するための設定

(setq gud-pdb-command-name "python3 -m pdb") をinit.elに追加。

以上です

emacsでjupyterができるとは感動です。 現状の不満はelpyによるformattingが pythonファイル以外のファイルの保存のときに動作してしまうことです。

Windows上のemacsでマークダウンをプレビューしながら書くための設定

emacsはカーソルの移動、サーチ、カットペースト、などの機能がマウスを使わずにすべてキーボードで完結しているエディタです。 それだけだと、vimもそうかもしれませんが、ブラウザを見れたりメールを送れたり、マークダウンのプレビューモードなどの高度な機能も使えます。

また、ターミナルもemacsの中で開け、コマンドを実行した結果もキーボードの操作だけでコピーできるところがvscodeとの差別点になっています。

文章を書くだけにしてもemacsの機能を使えば全くマウスを使うことなく書けます。

というわけで家のPCにもemacs環境を導入しました。 ただemacsの設定がめんどうだったで、メモを残しておこうと思います。

やったこと

マークダウンのpreviewモードを使うためにmarkdown-preview-modeをインストールしました。 また日本語入力を整備しようとしました。(中途半端にできました。)

環境

markdown-preview-mode のインストール

  • init.elを書き換えて、elpa, melpa などからパッケージをダウンロードできるようにした。
  • その後、emacsmarkdown-previewモードを導入した。

まず、init.elに以下の行を追加し、emacsを再起動させます。

;;; package.el
(require 'package)
;; MELPAを追加
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
;; MELPA-stableを追加
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/"))
;; Marmaladeを追加
(add-to-list 'package-archives  '("marmalade" . "http://marmalade-repo.org/packages/"))
;; Orgを追加
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
(add-to-list 'package-archives '("ELPA" . "http://tromey.com/elpa/") t)
(package-initialize)

その後、emacsを立ち上げM-x package-install markdown-preview-mode でインストールできます。

init.elの場所やパスの通し方がが分からない場合は、このサイトが参考になります。

Emacs 26.3をWindows10にインストール – IQ138の男が見る世界

その後init.elを少しだけ書き換え、emacsを再起動させます。

;; install後なんかこんなものができています。
;; 初期化
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(package-selected-packages (quote (markdown-preview-mode))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

;;なんかこれを追加すると良いという情報がありました。
(autoload 'markdown-preview-mode "markdown-preview-mode.el" t)

;; ビープ音を出さない
(setq ring-bell-function 'ignore)

markdown ファイルを開いて M-x markdown-live-preview-mode でプレビューモードが走ります。

f:id:nogawapark:20200719122347p:plain

日本語入力設定

  • google日本語入力Windowsにインストールしました。
    • https://www.google.co.jp/ime/
    • 半角/全角ボタンでgoogleの日本語入力に切り替えられるのだが、切り替わったり切り替わらなかったりして挙動がよく分からない。
  • mozc をinstallすると良いという情報がありましたが、インストールしてinit.elでrequireしましたが反映されず。原因不明。

その他 Ctrl2Caps で Caps Lock を Ctrl に変える

持っているPCは日本語配列なので、emacsで多用するCtrlがうちにくい。 そのためCtrl2Capsをインストールしました。

在宅勤務で苦労した点と対策を考える

はじめに

3月から始まった在宅勤務は7月で5ヶ月目に突入しました。

仕事が決まっていて締め切りも近い日なんかは割と集中して仕事ができますが、 逆に特にアウトプットがすぐに求められない日はあまり集中できていないのが現状です。

始めの方は通勤がなくてめちゃくちゃ快適でしたが、 いまは業務時間中なのに仕事してないときは思いつめてしまって逆につらくなっています。

友達で受験時に勉強したいのに勉強に向き合えないのがつらくて メンタルが悪化していたやつがいました。 今の自分はそんなところがあります。

在宅勤務の現状や行ってきたことを振り返ってみようと思います。 また、今後在宅勤務を楽しく行うにはどうするか考えてみたいと思います。

現状

上手くいっているところ

  • 気分が乗っているときは集中している

悪いところ

  • 締め切りがないと集中できない
  • ついついスマホとかパソコンを触ってしまう
  • ついついベッドに横になってしまう

在宅勤務のために試したこと

  • 朝ごはんを食べる
    • 朝ごはんが大事だと、時間栄養学の先生が言っていました。
    • 最近はすき家の350円のまぜのっけ朝食をよく食べます。コスパ最強です。
  • スロージョギングをする
    • 運動が脳を活性化し海馬の成長を促すそうです。
  • 机・椅子・本棚を買った
  • スマホの電源をいれるのを3,4日に一回くらいにしている
  • 換気
  • 昼寝
  • 仕事で朝会を行った
  • 書く瞑想ジャーナリング

家具を買ったり、運動したり、ごはんを食べるというのは、 割と小手先なんだなというのが最近の思うことです。 それより、仕事を健全にちゃんとやるという意識が一番必要なのかな。 また朝会を行うとテンションが上がるしやることも明確になってその日の効率が良かった気がします。

在宅勤務で集中できない原因は?

  • 仕事以外のことに逃避してしまう
  • 雑談をしないので孤独感を感じメンタル不調
  • 仕事に対する責任感がない
    • 最近PLを始めましたが負える程度の責任が生じると楽しいですね

そもそもちゃんと働かないといけないか?

ちゃんと働いた方が良い理由

  • 在宅勤務では成果でしか評価されず、給料や働きやすさに関わる
  • 働かない申し訳なさで心に負担がかかる
  • ちゃんと働いてやることをやっていると、仕事以外でも気持ちが軽い

「会社に来なくても良く、仕事はどこでやっても良い」と、成功する人と落ちぶれる人がはっきり別れる。 | Books&Apps 昨日この記事を読んで働こうという意識が高まりました。 その反動なのか、はたまた今日コーラでカフェインを大量に摂取した影響かのどちらかにより動悸がしてつらいです。

働かずハッピーに暮らしても良い理由

  • 一応締め切りには間に合っている(本当か?)(遅いせいで任されていないだけでもある)
  • 生きていればそれば良い。会社で終わっても死ぬわけではない。

両側から考えると一日4時間で成果だして負い目を感じないような生活が理想ですね。

出社すれば良いのでは?

とはいえ、出社しないことによって2時間浮くし、出社するより早い時間帯で働き始められるメリットは大きい。 この在宅勤務のメリットは何とか出来る限り享受したい。

これから

  • 仕事はちゃんとしないといけないという意識をもつ
    • 仕事中はスマホ・私用のパソコンは触らない
    • とりあえず充分働いた感を自分に持たせる
    • 期限がない時でもやることを見つける
  • 会社の人と話す機会を作った方が良さそう
  • 運動・朝食などの良い習慣は続ける

今日みたいにやることをやった気になってブログまで書くというのがより良い生活の理想として見えてきました。

Kuhn Poker で実験する CFR(Counterfactual Regret Minimization) with Common Lisp

はじめに

以前QiitaにCounterfactual Regret Minimaization(CFR)の基礎 - QiitaというCFRの提案論文の概要をまとめた記事を書いたが、今回は理解を深めるために、実際にkuhnpokerというミニ版のポーカーでCFR計算を実装しナッシュ均衡戦略を求めた。

実装の参考として主にこの記事を用いた: Vanilla Counterfactual Regret Minimization for Engineers | Justin Sermeno この記事はCFRの基礎とPython実装がよくまとまっている。ただし、Python実装をそのまま写経しても身につかないと思ったので他の言語Common Lispに書き直しながら実装を行った。

結果、以下のことが分かった。

CFRについて

CFR とは展開型ゲームのナッシュ均衡戦略を求める手法である。 詳細は解説記事1に譲る。 簡単に書いておく。

(1)求めるものは、平均戦略  \bar{\sigma}_i^ T(a|I) である。

(2)この平均戦略がナッシュ均衡に従うためには、以下のように各ラウンドでの戦略 \sigma_i^ T(a|I)を更新すると実現できる。


\sigma _ i^ {T+1}(a|I) = \begin{cases}
\frac{R _ i^ {T,+}(I,a)}{\sum _ {a\in A(I)}R _ i^ {T,+}(I,a)} &
 {\rm if\ } \sum _ {a\in A(I)} R _ i^ {T,+}(I,a)>0 \\\\
\frac{1}{|A(I)|} & {\rm otherwise.}
\end{cases}

(3)実は、上の更新式は、下に定義するimmediate counterfactual regret  R^ T _ {i, imm} (I) の正の部分が0に収束するように更新される。


R^ T _ {i,imm}(I) = \frac{1}{T}{\rm max} _ {a\in A(I)}\sum _ {t=1}^ T\pi _ {-i}^ {\sigma^ t}(I)(u _ i(\sigma^ t| _ {I\to a},I)-u _ i(\sigma^ t,I))

(4)最後に、二人組ゼロサムゲームで 二人の  max(0, R^ T _ {i, imm} (I)) の和が  \epsilon の時、戦略  \bar{\sigma}_i^ T による利益のナッシュ均衡との差は  2\epsilon 以下である。

kuhnpoker

kuhnpoker とは

kuhnpoker とは、ミニ版の二人制ポーカーである。カードはJ, Q, K の三枚しか使わないがブラフを使う必要が出てくるため、小さいながらもポーカーの本質を備えていると思われる。

ゲームの流れとしては、まずカードが二人のプレイヤーに一枚ずつ配られる。先手後手ともに最初に1ずつ賭ける。先手は check か bet を選ぶ。後手は先手が check の場合は check か bet、先手が bet のときは fold か call を選ぶ(reraise はない)。また、check-bet と来たときのみもう一度先手はfoldかcallを選ぶ。ここでbetの単位は1のみである。最終的にfoldが選ばれたら相手に+1、checkかcallが選ばれたら強いカードを持っている方に+1または+2となる。

以下のゲーム図と合わせて理解できる。

f:id:nogawapark:20200414081814p:plain
ゲーム図 https://justinsermeno.com/posts/cfr/ より引用

ブラフを使う必要性がどこで現れるか説明する。例えば先手が最弱のJだったとしても、強気のbetを行うことで(自分はKを持ってると見せかける)、後手をfoldさせ利益を得ることが可能である。

逆に後手がQを持っているときに先手がbetした場合、後手はfoldする(相手はKだろう)かcallする(相手はブラフのJだろう)か選ばないといけない。 相手がブラフする確率を織り込んで自分もcallする確率を何割か持っていなければならない。

kuhnpoker のナッシュ均衡

実は kuhnpoker のナッシュ均衡は無数にある。Kuhn poker - Wikipedia の説明を引用しておく。

Kuhn demonstrated there are infinitely many equilibrium strategies for the first player, forming a continuum governed by a single parameter. In one possible formulation, player one freely chooses the probability  \alpha \in [0,1/3] with which he will bet when having a Jack (otherwise he checks; if the other player bets, he should always fold). When having a King, he should bet with the probability of  3\alpha (otherwise he checks; if the other player bets, he should always call). He should always check when having a Queen, and if the other player bets after this check, he should call with the probability of  \alpha +1/3. The second player has a single equilibrium strategy: Always betting or calling when having a King; when having a Queen, checking if possible, otherwise calling with the probability of 1/3; when having a Jack, never calling and betting with the probability of 1/3.

果たして、CFRにより求められるナッシュ均衡戦略は上記の Kuhn が例示した均衡戦略と同じものが得られるだろうか。

実装

common lisp の処理系として SBCL を用いた。 roswel をインストールして $ ros emacs とするだけでcommon lisp が書き始められるのは驚きだった。 コードはgithubに上げた GitHub - RyotoYamashita/KuhnPokerCFRExperiment

ので興味があればご覧下さい。

結果

実行速度

Vanilla Counterfactual Regret Minimization for Engineers | Justin Sermeno の記事の python コードと、作成したlispコードを手元のマシンで実行し、速度比較した。 cfr 10,000 イテレーションで行った。

python lisp
4.009 s 0.406 s

実行結果は上記となり、速度はcommon lisp 実装の方が10倍程度速い。 common lisp コードは特に最適化などはしていないが、 floatの値は明示的に 1.0 などとした。 そうしないと、ひたすら有理数の計算をしてめちゃくちゃ重くなった。 平気で分母が10桁の分数の足し算をしだしてしまう。

CFR の収束性

平均戦略の収束性

f:id:nogawapark:20200417085649p:plain
平均戦略: 凡例の情報の元で check or fold を選ぶ確率

各iteration各情報集合のもとで、弱気な選択(check or fold)をする確率を表示した。 Kuhn poker では各情報集合で2つの行動しか選択できないため、片方の選択をする確率のみを表示している。

10000iteration 行くころには、何らかの確率に収束している。 収束の仕方は、確率が0or1となる、おそらく自明な行動では収束が速く、 そうではない自明ではない行動の確率の求解ではぎざぎざとゆっくりと収束する、ように見える。

平均戦略の収束がぎざぎざしている情報集合は以下のグループである。 [J rr, J rrc, Q rrb, Q rrcb, K rr]

得られた解と、Kuhnが示したナッシュ均衡戦略と比べる。 まず、Kuhnによると後手のナッシュ均衡戦略は一通りしかないみたいだが、 今回の結果はそれと同じ解になっている! また先手についても、Kuhn がいうところの  \alpha=0.21ナッシュ均衡戦略を実現していると考えられる。 ただ、なぜ \alpha=0.21がCFRで求められたかは分からない。 ( \alpha \in [0, 1/3] についてナッシュ均衡戦略が構築できる)

immediate counterfactual regret の収束性

f:id:nogawapark:20200417090109p:plain
先手のimmediate counterfactual regret

f:id:nogawapark:20200417090200p:plain
後手のimmediatecounterfactual regret

immediate counterfactual regret の収束性を、先手と後手に分け、両対数グラフで図示した。

この結果から、各情報集合での immediate counterfactual regret の 両対数グラフでの傾きは -1 と -1/2 のグループがあることが分かった。 傾きが -1/2 のグループは、 [J rr, Q rrcb, K rr, J rrc, Q rrb] であり、 これは、平均戦略が0から1の間をとる(混合戦略をとる)情報集合グループと同じである。 つまり、平均戦略とimmediate counterfactual regret の収束性には関係があることが分かる。

実は、このことは数学の定理として予言されていたことが現れた形になる。 immediate counterfactual regret の収束は、平均戦略の収束を上から抑える、という定理があるのだ。 immediate counterfactual regretの収束が速い情報集合における平均戦略の収束は確かに速く、 immediate counterfactual regretの収束が遅い情報集合における平均戦略の収束は 上から抑える速さが緩くなっている分遅くなっていることが分かる。

混合戦略での収束の速さは  O(iter^ {-1/2}) であることが両対数グラフから読み取れるが、 実はこれは理論で言われている収束の最大の遅さと一致している!

exploitability の収束性

(実験中)

immediate counter factual regret < epsilon -> exploitabity < 2 epsilon は成り立っているか

(実験中)

まとめ

  • CFRでナッシュ均衡戦略を求められることが実験的に確かめられた。
  • 次の行動が自明な情報集合と、自明でない情報集合で、収束の速さが異なることが分かった。

今後気になること

アルゴリズム、理論の調査

  • CFR+
  • MCCFR
  • DeepCFR
  • CFRの証明
  • MCCFRの証明
  • なんで三人、六人でも上手くいくのか
  • ナッシュ均衡についての理解を深めたい
  • exploitability を近似的に求める手法について
  • 状態遷移規則を仮定しない fictious play
  • CFRはナッシュ均衡のうちどのような均衡解にたどり着いているのか
  • 平均戦略の収束がぎざぎざしているのはなぜか

実装方針

  • 他のゲームにも切り替えられるように実装する。
  • ゲームの実装、CFRとの連携も考えておく
  • ゲームの実装のとき、実際にプレイするモードが欲しい。
  • ちゃんとasdfを使う

e-typing score を 55 から 205 まで上昇させた話

## はじめに

タイピングがめちゃくちゃ苦手だったのですが、いろいろ役に立つかもしれないということで練習してみました。何か目標があった方が良いかなということで、e-typing でスコア200を目指しました。

(e-typing はタイピングスコアを測定してくれるサイト:https://www.e-typing.ne.jp/)

最初はスコア55(WPM97.5、正確率83%)という絶望的な数字でしたが、最終的には205(WPM219.08, 正確率97.82%)まで上昇しました。

 

タイピング力が上昇したおかげで普段の仕事でもキーボードを見ずに打てるようになり、若干仕事の生産性が上がったように感じられます。ただ数字や記号はまだ苦手でキーボードを見てしまうので、まだまだ練習が必要です。

 

ここまで振り返ったコツとしては、

1. 正しいキー配列を覚える

2. 毎日継続すること

3. 最初は正確性に注力

かなと思いました。

 

## スコアの上昇過程

f:id:nogawapark:20200307123117p:plain

スコア、WPM、ミス入力数の経過

スコアはほぼ毎日朝夜練習する間に伸びました。(上の図)

WPM(word per minute) も ミス入力数もにじわじわと上昇・下降しました。実はこの図を作りながらなんとかモチベーションを保っていました。

(※本当は正確率を表示する方が良いのですが、ミス入力数の方が見やすいのでミス入力数で表示しています)

最初はキー配列を覚えることに注力し、その結果最初の10日ほどで大きくミス入力数が減り、スコアも二倍近くなっています。

そういえば恥ずかしながらホームポジションの概念をここで初めて知り、正しい運指をこの時覚えました。

 

## WPM か正確率か

WPM と正確率をどのように上げたかを次の図で説明します。

f:id:nogawapark:20200307123123p:plain

正確率対WPMの散布図(色は開始からの日数を表す)

 

下図は、横軸正確率(accuracy)、縦軸WPMの散布図で、図中の色で開始から何日かを表しています。(0日紺色から26日黄色まで)

大まかに見ると、散布図は二次関数のように正確率の上昇とともにWPMが上昇していることが分かります。

細かく見ると結果的には、以下に説明するように、正確率上昇->WPM上昇を交互に繰り返してきたことが分かります。

  1. WPM140一定で正確率を80%から95%まで上昇させる。(最初の10日くらい:紺色)

  2. 正確率95%一定でWPMを140から180に上昇させる。(10日から18日くらい:深緑色)

  3. 次にまたWPM180一定で正確率を95%から98%に上昇させる。(19日から23日くらい:黄緑色)

  4. 最後に正確率98%一定でWPMを180から220に上昇させる。(24日から26日)(本当は少し正確率下がってから持ち直している)

手探りでやっていったものの、いろんなところで説明されているように、最初は正確率を重視しました。そうすると速く打てることに気が付いて楽しい!スコア上がる!となるのですが、数日で頭打ちになります。ということでさらなる正確性アップに方針を切り替えて練習という感じで行いました。

 

最初の最初は運指を覚えることに精いっぱい。

で、だんだん気づいたらWPMが速くなってき、運指を覚えたとは言え、頭や指がついてこないので、今のWPMでの正確性というものを途中からは意識していました。 

 

## 今後は

今後スコアの上げ方は、もう100%近くまできたので、

  • 図で言うと左上に進んで右に進むという経路になるか

  • 常に真上を目指すか

になると思います。

「左上に進んで右に進む」だと、意識をWPMか正確性かどちらかにした方が良い、という思想です。

また「常に真上を目指す」だと、正確率を維持した中で、WPMを上げていこう、という思想です。

迷っていますが「常に真上を目指す」が良いのかなと思います。

 

この記事が何かの参考になれば幸いです。

何か図の考察等あればぜひお教えください。

神・時間術を読んで学んだこと・つっこみ

最近やる気がないし生活が乱れているということをある人に相談したら、その人から神・時間術という本を勧めていただいた。何でも朝の時間の使い方が大事らしい。

読んでみたら何か見たことある!という気がする情報も多かったがそれがまとまっているので体系的に理解できそう。自分みたいにあまりまとまっていない人には良い本だと思う。本当は各々が各自でこの本を書くのが良いと思うがそれは大変なので。

その中で学んだこと、また逆につっこみが思い浮かんだので書いてみる。

 

## 学んだこと

これらはすごく意識しようという気持ちになった。

1. 朝起きてから2-3時間が脳のゴールデンタイム(p.108)

2. 運動リセット術(p.170)

3. 仕事から離れたらリラックスする

4. すきま時間は考え事や勉強を行う

 

### 1.朝起きてから2-3時間が脳のゴールデンタイム(p.108)

- 朝起きてから2-3時間が脳のゴールデンタイムだそうで、確かに朝の方が集中できる気はしていた。なのでこの時間に仕事をしたり、自己投資をしたいと思った。

- ただ疑問に思ったのは、起きてから2-3時間なのか、6-7時がゴールデンタイムなのかどっちなんだろう。

- もう一つ疑問があって、このJINSのデータでは「集中力」をどうやって計測したんだろう。

- そういうところがあいまいで、有用な情報ならそれで良いという精神なんだろうと思った。学術書じゃなくて自己啓発本なんだろうから仕方ないね。

### 2. 運動リセット術(p.170)

- 1時間程度の有酸素運動をすると、その後は朝と同じくらいの脳のゴールデンタイムになるそうな。

- 運動をするメリット

1. 海馬の神経を増やし、長期記憶を強化する

2. 脳を育てる

3. 運動直後から学習機能がアップする

4. 頭が良くなる

5. 作業記憶がよくなる

6. ぐっすり眠れる

7. やる気が高まる

- ただ、やりすぎと、寝る3時間前はよくないそうな。

 

## つっこみ

 

- 寝る前にスマホやPC見るなって言ってるのに、寝る前にSNS投稿するのこれいかに?

- 家事はいつやればいいのか?

- 出典がない場合が目に付く

- 科学ではなく使える情報なら良い、という精神

 

### 寝る前に今日あった良いことのSNS投稿の矛盾

- 寝る前のSNS閲覧は睡眠に悪影響(p.194)

- 人は寝る前に考えた人間になる。ので今日やって楽しかったことを書こう!(p.202)

### 家事

- 家事をp.213 の脳科学にもとづく最高の1日、のどこに当てはめようか。

- 朝やるのが一番捗りそうだが、その時間に家事をするのはもったいない。

- 昼過ぎの非集中時間の気分転換にやるのがいいか?職場にいると洗濯とかできないけど、事務処理とかはできるかも。

- 夜は疲れてるから掃除とか皿洗いやる気でない。とは言え、夕方ジムで運動したらテンション上がって意外とできるかもしれない。ただ、脳のゴールデンタイム2もやっぱり勉強とかしたいけど。

- そうすると、夕方のジムの代わりに家事をして体を動かすのがありかもしれない。どうなんだろうか?

- (この著者のおっちゃん家事してるんだろうか?しなくて良いご身分なのかな)

### 出典ない場合が目に付く問題

- 割合は体感5割くらい。

- 医者なら出典書くべきでは?と思った。自己啓発本ならそこまでのガチさはいらないという判断だろうか。

 

いろいろ書いたけど、内容も参考になったし、アウトプットしようという気持ちになって良い本だった。良い買い物をした。

 

二次元氷の場合の数の計算 1

初めに

二次元氷というものを前から知っていて興味を持っていた。以前よりは能力が上がった部分もあり、取り組んでみようと思う。二次元氷の数理について調査、計算していく。

二次元氷について

二次元氷というものがある。普通氷は三次元のものであり、二次元氷は仮想的な結晶である。性質は

  • 酸素Oが二次元格子点上に配置される

  • 水素Hが線分OO間に配置される

  • 各HはどちらかのOに属する

  • 各Oは二つのHを持つ

というルールがある。下の絵が分かりやすい。(この論文中の図を拝借https://www.researchgate.net/publication/235466723_Dichotomous_collective_proton_dynamics_in_ice)

f:id:nogawapark:20190507090641p:plain
2次元氷の模式図

この図の白丸がOで小さな黒丸がHである。(図中のポテンシャル図のようなものは無視してください)

上の図ではHOHの向きがすべて同じであるが、そうではない組み合わせも構成することができる。

また、今はOO間OH間距離は一定で、∠HOH=90°, 180° という抽象的な世界を考えている。

二次元氷の場合の数

このような二次元氷の場合の数は何通りであるか、それについてはwikipedia (https://en.wikipedia.org/wiki/Ice-type_model)に書かれているように、1967年に Lieb によって厳密に解かれている。解かれているらしいが分子数無限大での値のみがwikiにのっている。(論文は読んでいない。一般の m×n の氷の場合の数って厳密解ってあった?)。場合の数を  W、一辺の長さを n とすると、分子数  n×n の二次元氷の時  \lim _ {n \to \infty}W^ {1/n^ 2} = (4/3)^ {3/2}=1.53960... となる。

境界条件

境界条件は周期境界条件と境界制約なしの二つがあったと記憶している。

プログラムで計算

今回はプログラムで何通りになるか計算を行った。境界条件の制約はなしで行った。 結果は以下のようになった。場合の数が多すぎて、3×3までしか計算できなかった。

n が 3 程度では  W^ {1/n^ 2} の 1.53960... への収束は分からなかった。

n×n の氷の場合の数  W の n 依存性

 n  W  W^ {1/n^ 2}
1 6 6
2 343 4.304
3 90732 3.555

コード

上の計算は以下の python コードで行った。

コーディングの雑感

  • オブジェクトのアトリビュートを別の新規のオブジェクトのアトリビュートとしてはいけない。書き換えが同時に起こるから。
  • numpy array を要素に持つリスト中に指定された array があるかを、単純に in で調べたらエラーになった。理由はわかっていない。
  • 一応 1×2 の氷の場合の数があっていたから OK とした。
  • 並列化で高速化はできそう。
  • データ構造の持ち方に無駄があるかもしれない。
  • チェック機能が重そうである。
'''
2次元氷が与えられた大きさに対して何通りあるか求める
'''
import numpy as np
import itertools

NORTH = np.array([0, -1])
EAST = np.array([1, 0])
SOUTH = np.array([0, 1])
WEST = np.array([-1, 0])
NEWS = [NORTH, EAST, SOUTH, WEST]

class H2O:
    def __init__(self, place, gotoes, h2o_num):
        self.place = place
        self.gotoes = gotoes
        self.h2o_num = h2o_num
    def __repr__(self):
        return f'{self.place}, {self.gotoes}'

class Ice:
    '''h2oを管理するクラス
    '''
    def __init__(self, ice=None):
        if ice:
            self.h2os = [h2o for h2o in ice.h2os]
            self.places = [h2o.place for h2o in ice.h2os]
        else:
            self.h2os = []
            self.places = []
    
    def __repr__(self):
        h2o_nums = [h2o.h2o_num for h2o in self.h2os]
        return f'{h2o_nums}'

    def add(self, h2o):
        self.h2os.append(h2o)
        self.places.append(h2o.place)
    
    def get_h2o(self, place):
        return [h2o for h2o in self.h2os if np.array_equal(h2o.place, place)][0]

    def view_ice(self):
        pass
    
def first_ice():
    h2os = []
    ices = []
    h2o_num = 0
    place = np.array([0, 0])
    for arrow1, arrow2 in list(itertools.combinations(NEWS, 2)):
        h2o = H2O(place, [place + arrow1, place + arrow2], h2o_num)
        h2os.append(h2o)
        ice = Ice()
        ice.add(h2o)
        ices.append(ice)
        h2o_num += 1
    return ices, h2o_num

def arr_in_list(arr, lst):
    for elm in lst:
        if np.array_equal(arr, elm):
            return True
    return False

def check_h2o(ice, h2o):
    '''check if can insert h2o in ice
    '''
    for goto_place in h2o.gotoes:
        if not arr_in_list(goto_place, ice.places):
            continue
        h2o_goto = ice.get_h2o(goto_place)
        if arr_in_list(h2o.place, h2o_goto.gotoes):
            return False
    return True

def get_next_h2os(place, h2o_num):
    h2os = []
    for arrow1, arrow2 in list(itertools.combinations(NEWS, 2)):
        h2o = H2O(place, [place + arrow1, place + arrow2], h2o_num)    
        h2os.append(h2o)
        h2o_num += 1
    return h2os, h2o_num

def num_ice(m, n):
    '''(m,n)の大きさの2次元氷が与えられたときの場合の数を求める。
    境界は自由とする
    '''
    ices, h2o_num = first_ice()
    for i in range(1, m*n):
        place = np.array([i%n, i//n])
        next_h2os, h2o_num = get_next_h2os(place, h2o_num)
        ices_next = []
              
        for ice in ices:
            for h2o in next_h2os:
                ice_next = Ice(ice)
                if check_h2o(ice_next, h2o):
                    ice_next.add(h2o)
                    ices_next.append(ice_next)

        ices = ices_next
    '''
    for ice in ices:
        print(f'------------------')
        for h2o in ice.h2os:
            print(h2o)
    '''
    #print(len(ices))
    return len(ices)

if __name__=='__main__':
    for n in range(1, 4):
        num = num_ice(n, n)
        print(n, num, num**(1/n**2))