elispでの検索とその後の処理

org2blogでのorg-roamのノードの投稿 を実装した際に得た知見を書き出す。

検索

正規表現での検索は re-search-forward で行なう。この関数を実行するとカーソルが移動するため、 必要に応じて save-excursion などで元のカーソル位置などを保存する。

下記をテスト用の文字列とする。(■はカーソル位置)

■abc-123-ABC

カーソル位置で下記のLispを実行する。

(defun test-search ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)"))

カーソルはマッチした正規表現の後部に移動する。

abc-123-ABC■

置換

テスト用の文字列の 123456 に変換してみる。

(defun test-replace ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (replace-match "\\1-456-\\3")) 

abc-456-ABC■

削除

削除はマッチした文字列を空文字に置換することで実現できる。

(defun test-delete-1 ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (replace-match "")) 

また、マッチ部分の位置情報を利用しても可能である。

(defun test-delete-2 ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (delete-region (match-beginning 0) (match-end 0))) 

match-beginningmatch-end の引数は正規表現のグループ番号なので、それを指定することでグループ単位での位置情報も利用できる。 abc-123-ABC123 を削除するには下記のように指定する。

(defun test-delete-3 ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (delete-region (match-beginning 2) (match-end 2))) 

abc--ABC■

org2blogでのorg-roamのノードの投稿

テスト (Shalev-Shwartz and Ben-David 2009)

関数

org-roam のノードを wordpress に投稿するための関数を作成した。

単純に org2blog-buffer-post-publish で作成されたプロパティを移動するだけ。

(defun ks-post-to-wordpress ()
  (interactive)
  (let ((snow (format-time-string (org-time-stamp-format t t) (org-current-time)))
        (rtitle (org-make-options-regexp (list "title" "TITLE")))
        (rdate (org-make-options-regexp (list "date" "DATE")))
        (rblog   (org-make-options-regexp (list "blog" "BLOG")))
        (rpostid (org-make-options-regexp (list "postid" "POSTID")))
        (rorb2blog (org-make-options-regexp (list "org2blog" "ORG2BLOG")))
        line1 line2)
    (save-excursion
      (goto-char (point-min))
      (if (re-search-forward rorb2blog nil t 1)
          (progn
            (re-search-forward rdate nil t 1)
            (replace-match (concat "#+\\1: " snow))
            (org2blog-buffer-post-publish))
        (if (re-search-forward rtitle nil t 1)
            (progn
              (insert "\n\n")
              ;; TITLEプロパティの下にORG2BLOGプロパティを
              (insert "#+ORG2BLOG:\n")
              ;; TITLEプロパティの下にDATEプロパティを
              (insert (concat "#+DATE: " snow))
              ;; 投稿
              (org2blog-buffer-post-publish)

              ;; ここからファイル上部に記載される BLOG, POSTID を移動する.
              (goto-char (point-min))

              ;; BLOG を退避、削除する.
              (re-search-forward rblog nil t 1)
              (setq line1 (match-string-no-properties 0))
              (delete-region (match-beginning 0) (match-end 0))
              (delete-char 1)
              ;; POSTID を退避、削除する.
              (re-search-forward rpostid nil t 1)
              (setq line2 (match-string-no-properties 0))
              (delete-region (match-beginning 0) (match-end 0))
              (delete-char 1)

              ;; BLOG, POSTID を追加する.
              (re-search-forward rdate nil t 1)
              (insert "\n")
              (insert line1)
              (insert "\n")
              (insert line2)))))))

参考文献

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

tmux

#+ORG2BLOG

基本操作

prefix キーを C-t とする。

通常時

キーバインド 動作
C-t C-[ コピーモードに以降する
C-t C-] クリップボードの文字列を貼り付ける

コピーモード

キーバインド 動作
C-t 2 マーク
y 選択範囲をクリップボードにコピー

設定

設定ファイル .tmux.conf の再読込は tmux source-file ~/.tmux.conf で実行する。

Tmux Pluging Manager: tqm

まずはこれをインストール.

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

下記のように .tmux.conf に記載。

#===================================
# tpm - Tmux Plugin Manager
#===================================

# Plugins
set -g @plugin 'tmux-plugins/tpm'

# Initialize TMUX plugin manager 
# (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

Plugins

prefix-I でインストール.

Tmux-yank

x1, wayland で自動的にcopyコマンドを切り替えてくれる。wl-clipboard, xsel, xclip をインストールすること。

  1. prefix+[ で選択モードになる
  2. Ctrl-2 で領域選択開始
  3. y で領域をコピー

下記のように .tmux.conf に設定。

set -g @plugin 'tmux-plugins/tmux-yank'

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