org-modeでのlatex定理環境

まず、下記のように amsthem パッケージを宣言する。

\usepackage{amsmath, amsthm, mathrsfs, amssymb, xifthen, xstring, physics, tikz, tikz-cd}

定理の環境を定義する。

\theoremstyle{plain}
\newtheorem{thm}{Theorem}
\newtheorem*{thm*}{Theorem}

使用方法は org-mode にて下記のようにする。

#+ATTR_LATEX: :options [Hoeffding's Inequality]
#+begin_thm*
    i.i.d (独立同分布, independent and identically distributed) の確率変数
    $\theta_1, \ldots, \theta_m$ とそれらの確率変数の期待値を $\mu$
    ($\mathbb{E}[\theta_i] = \mu$) 、範囲を $a \leq \theta_i \leq b$ (
    $\mathbb{P}[a \leq \theta_i \leq b] = 1$ ) とする。その時、 任意の正の
    $\epsilon$ で次が成立する。


    \begin{equation}
    \mathbb{P} \left[ \bigg| \frac{1}{m} \sum_{i=1}^m \theta_i - \mu \bigg| > \epsilon \right] \leq 2 \exp (-2m\epsilon^2/(b-a)^2)
    \end{equation}
#+end_thm*

そうすると下図のような出力が得られる。 screenshot_2022-08-15_05-22-06_696133645.png

多項式回帰

背景

(Shalev-Shwartz and Ben-David 2009) の Model Selection and Validatin の図を再現したい。つまり、 Figure: 1 のようなデータを多項式で回帰したい。

example.png
Figure 1: 多項式のようなデータ

コード

Python の scikit-learn で実現する。概略は入力データを指定次元分の単項式に変換し、線形回帰で実現する。

使用するのは主に2つの機能である。

  1. sklearn.preprocessing.PolynomialFeatures — scikit-learn 1.1.2 documentation
  2. sklearn.linear_model.LinearRegression — scikit-learn 1.1.2 documentation

まず、特徴量を PolynomialFeatures で変換する。変換元のデータが一次元のはずなので、形状に注意。

polynomial_features= PolynomialFeatures(degree=3)
xs_poly = polynomial_features.fit_transform(xs.reshape((30,1)))

そして、線形回帰を使用する。

model = LinearRegression()
model.fit(xs_poly, ys)
ys_pred = model.predict(xs_poly)

Figure: 2 に作成された多項式回帰のモデルの予測結果をプロットした。

deg2.png
Figure 2: 訓練データと3次多項式回帰

参考文献

Shalev-Shwartz, Shai, and Shai Ben-David. 2009. Understanding Machine Learning. Cambridge University Press. https://doi.org/10.1017/cbo9781107298019.

org-modeでのPython仮想環境

poetry で作成した仮想環境を org-mode のコードブロックで使うことを考える。仮想環境は $HOME/repos/ks_python_env に作成されているとする。

コードブロックのデフォルトのHeaderを定義しておく。セッション名とファイルが存在するフォルダパスをどのコードブロックでも共通して使用するようにしている。

#+PROPERTY: header-args:python :session (concat "*python* - " (buffer-file-name))
#+PROPERTY: header-args:python+ :var cur_dir=(identity default-directory)
#+PROPERTY: header-args:python+ :eval no-export

poetry コマンドの機能を利用して、仮想環境の python のパスを org-babel-python-command に設定する。

#+begin_src elisp :dir ~/repos/ks_python_env :exports none
  (let* ((env_path (s-trim (shell-command-to-string "poetry env info -p")))
  (python_path (f-join env_path "bin/python")))
  (setq-local org-babel-python-command python_path))
#+end_src

上記を実行すれば、下記のように仮想環境のPythonが実行される。

#+begin_src python :results output :exports both
  import sys  
  print(sys.version)
#+end_src  

import sys  
print(sys.version)
3.8.12 (default, May  6 2022, 13:18:25) 
[GCC 11.2.0]

lisp

環境構築

roswell をパッケージマネージャでインストールする。

環境を下記を参考に作成した。

  1. Common Lisp開発序ノ口 〜プロジェクトの作成と実行〜 – Lambdaカクテル

ローカルプロジェクトの管理方法は下記を参考にした。

  1. Roswell 環境下でのローカル・プロジェクト管理入門 · wshito’s diary

仮想環境(?)にありがちな、プロジェクト毎ライブラリ管理。

  1. fukamachi/qlot: A project-local library installer for Common Lisp

ros install qlot でインストールする。試しに下記をインストールする。

  1. sharplispers/ironclad: A cryptographic toolkit written in Common Lisp

qlot add ironclad

hogeproject.asd と main.lisp を編集する.

(defsystem "hogeproject"
  :version "0.1.0"
  :author "Windymelt"
  :license ""
  :depends-on ("ironclad")
  :components ((:module "src"
                :components
                ((:file "main"))))
  :description ""
  :in-order-to ((test-op (test-op "hogeproject/tests"))))

(defsystem "hogeproject/tests"
  :author "Windymelt"
  :license ""
  :depends-on ("hogeproject"
               "rove")
  :components ((:module "tests"
                :components
                ((:file "main"))))
  :description "Test system for hogeproject"
  :perform (test-op (op c) (symbol-call :rove :run c)))

(defpackage hogeproject
  (:use :cl) ;; あるいはここに :ironclad を追加
  (:export :hoge))
(in-package :hogeproject)

;; blah blah blah.
(defun hoge ()
  (ironclad:make-digest :shake256 :output-length 22)
  (format t "ddd"))

書籍

sway

Screenshot

swayshot をインストール

Shift + PrtSC
領域を選択して、ファイルに保存してクリップボードにパスを貼る
PrtSc
画面全体をファイルに保存してクリップボードにパスを貼る
Alt + PrtSc
ウィンドウをファイルに保存してクリップボードにパスを貼る

$HOME/.config/swayshot.sh/ に下記を記載することで、クリップボードに画像本体を貼ることができる

export SWAYSHOT_WL_COPY_FILE=1

色温度の調整

夜になると画面が眩しいので wlsunset を導入した。config に下記を追加した。

# -l: latitude 緯度 東京 北緯 + 36
# -L: longnitude 経度 東京 東経 +140
exec wlsunset -l 36  -L 140  -t 3500 -T 6000 -g 0.8

ox-bibtex.el のキーバインディング

HTMLへのエクスポート時に参照文献を出力するため, ox-bibtex.el を導入した。しかし、このファイルを (require 'ox-bibtex.el) で設定すると org-ref のキーバイドが上書きされる事象が発生した。

該当部分を抜粋すると下記のようになっている。そのため、/org-ref/ のまえに上記の設定を記述しないと org-add-link-type に~ox-bibtex.el~ の独自の関数が設定されてしまう。

;;; Follow cite: links

(defun org-bibtex-file nil "Org-mode file of bibtex entries.")

(defun org-bibtex-goto-citation (&optional citation)
  "Visit a citation given its ID."
  (interactive)
  (let ((citation (or citation
              (org-icompleting-read "Citation: "
                        (obe-citations)))))
    (find-file (or org-bibtex-file
           (error "`org-bibtex-file' has not been configured")))
    (goto-char (point-min))
    (when (re-search-forward (format "  :CUSTOM_ID: %s" citation) nil t)
      (outline-previous-visible-heading 1)
      t)))

(let ((jump-fn (car (org-remove-if-not #'fboundp '(ebib org-bibtex-goto-citation)))))
  (org-add-link-type "cite" jump-fn))

yasnippet のエスケープ

yasnippet のテンプレートの中に $1 などを書くと yasnippet の予約語と被るため期待した動作にならない。orgファイルの #+MACRO: の引数が $1 で表現されるために変な動作になった。

Writing snippets を参考に下記のように $\$ のようにバックスラッシュでエスケープすることで正常に動作する。

# key: rep2
# name: report2
# --

#+LaTeX_CLASS: koma-jarticle

#+STARTUP:  overview
#+STARTUP:  hidestars
#+OPTIONS:  H:4 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+LINK_UP:
#+LINK_HOME:
#+MACRO: if-html (eval (if (org-export-derived-backend-p org-export-current-backend 'html) \$1))
#+MACRO: if-latex (eval (if (org-export-derived-backend-p org-export-current-backend 'latex) \$1))

#+TITLE: ${1: title}
#+AUTHOR: k-sunako
#+DATE: `(let ((x (org-time-stamp '(16) t ))))`

{{{if-latex(\vspace*{-1.5cm})}}}

* 概要
  blabla

* 参考文献
  #+LaTeX: \printbibliography[heading=none]
  {{{if-html(bibliography:~/myspace/Bibliography/references.bib)}}}

org-modeのエクスポートの改善

org-modeでの記述した技術文書をpdfやhtmlにエクスポートする方法を改善したので記す。

Latex のエクスポート

下記記事を参考に koma-script でのエクスポートを設定する。

(add-to-list 'org-latex-classes
             '(
               "koma-jarticle"
               "\\documentclass[12pt]{scrartcl}
                [NO-DEFAULT-PACKAGES]
                \\usepackage{amsmath}
                \\usepackage{amssymb}
                \\usepackage{mathrsfs}
                \\usepackage{xunicode}
                \\usepackage{fixltx2e}
                \\usepackage{zxjatype}
                \\usepackage[ipa]{zxjafont}
                \\usepackage{xltxtra}
                \\usepackage{graphicx}
                \\usepackage{longtable}
                \\usepackage{float}
                \\usepackage{wrapfig}
                \\usepackage{soul}
                \\usepackage[xetex]{hyperref}
                \\usepackage{xcolor}
                \\usepackage{minted}
                \\usepackage{geometry}
                \\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
                \\usepackage[natbib=true]{biblatex} 
                \\DeclareFieldFormat{apacase}{#1} 
                \\addbibresource{~/myspace/Bibliography/references.bib}"
               ("\\section{%s}" . "\\section*{%s}")
               ("\\subsection{%s}" . "\\subsection*{%s}")
               ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
               ("\\paragraph{%s}" . "\\paragraph*{%s}")
               ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

参考文献の扱い

参考文献は ~/myspace/Bibliography/references.bib に記載されている。引用は cite:total2009daisy のような形式で org ファイル内で記述される。参考文献一覧を出力するために下記のセクションを設ける。

* 参考文献
  #+LaTeX: \printbibliography[heading=none]  
  {{{if-html(bibliography:~/myspace/Bibliography/references.bib)}}}

又、htmlへの参考文献の出力には bibtex2html というツールが必要となる。emacsにも追加で ox-bibtex の設定も必要となる。 ox-bibtex は標準のパッケージではないため下記のように追加でパッケージのインストールが必要となる。

(use-package org-contrib
  :after org
  :ensure t
  :confit
  (require 'ox-bibtex))

レポートのスニペット

org ファイルでレポートを作成する際には下記のような構成で書き始める。

#+LaTeX_CLASS: koma-jarticle

#+STARTUP:  overview
#+STARTUP:  hidestars
#+OPTIONS:  H:4 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+LINK_UP:
#+LINK_HOME:
#+MACRO: if-html (eval (if (org-export-derived-backend-p org-export-current-backend 'html) $1))
#+MACRO: if-latex (eval (if (org-export-derived-backend-p org-export-current-backend 'latex) $1))

#+TITLE:  title
#+AUTHOR: k-sunako
#+DATE: [2021-07-11 日 12:18]

{{{if-latex(\vspace*{-1.5cm})}}}

* 概要
  blabla

* 参考文献
  #+LaTeX: \printbibliography[heading=none]
  {{{if-html(bibliography:~/myspace/Bibliography/references.bib)}}}

上記の構成をスニペットで簡単にファイルに書き込めるようにした。 (yasnippetを使用)

# key: rep2
# name: report2
# --

#+LaTeX_CLASS: koma-jarticle

#+STARTUP:  overview
#+STARTUP:  hidestars
#+OPTIONS:  H:4 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+LINK_UP:
#+LINK_HOME:
#+MACRO: if-html (eval (if (org-export-derived-backend-p org-export-current-backend 'html) \$1))
#+MACRO: if-latex (eval (if (org-export-derived-backend-p org-export-current-backend 'latex) \$1))

#+TITLE: ${1: title}
#+AUTHOR: k-sunako
#+DATE: `(let ((x (org-time-stamp '(16) t ))))`

{{{if-latex(\vspace*{-1.5cm})}}}

* 概要
  blabla

* 参考文献
  #+LaTeX: \printbibliography[heading=none]
  {{{if-html(bibliography:~/myspace/Bibliography/references.bib)}}}

Pythonプロジェクトのテンプレート

Qiitaの記事を参考に Github に個人でPythonプロジェクトを作成する際の雛形を作った。

  1. GitHubのTemplate Repository機能のすゝめ – Qiita

最もフォルダ構成はcookiecutterの cookiecutter-data-science から借用している。必ず使用するパッケージを追加して、ローカルに .venv が作成される設定を追加した程度である。

作成したテンプレートが下記となる。 “Using this template” ボタンがあり、これにてこのテンプレートを基に新しいプロジェクトを作成する。

  1. k-sunako/py38-ds-template

テンプレートから作ったプロジェクトがこちら。

  1. k-sunako/learning-DAISY-feat-desc: 画像の特徴量記述であるDAISYについて学ぶ

org2blog/wp-mode での ddskk の C-j の挙動について

emacsのorg2blogにてブログの記事を書いていると、日本語入力で不思議な動作になることがあった。よく観察すると直接入力モードから C-j をタイプしてかなモードに変更できていないようであった。

検索するとorg2blogではないようだが、同様の現象に悩んでいる方がいたようだ。

  1. Emacs DDSKKの設定メモ – takeokunn’s blog

開発者の方から解決策を提示されたようでその解決策が下記にある dot.skkskk-C-j-key 関数を使用するもの。

  1. ddskk/dot.skk at master · skk-dev/ddskk

下記のように org2blog/wp モードを追加して、 ~/.skk に記述したところ C-j が正常に動作するようになった。

;; ■モードのまま C-j を有効とする
(defun skk-C-j-key (arg)
  (interactive "P")
  (let ((enable-modes '(lisp-interaction-mode ; eval-print-last-sexp
                        emacs-lisp-mode       ; newline-and-indent
                        org2blog/wp           ; org-newline-and-indent?
                        )))
    (cond
     ((and (null (skk-in-minibuffer-p)) 
           (null skk-henkan-mode)
           (member major-mode enable-modes))
      (skk-emulate-original-map arg))
     (t
      (skk-kakutei arg)))))

(add-to-list 'skk-rom-kana-rule-list
             '(skk-kakutei-key nil skk-C-j-key))