エクスプローラーのコンテキストメニューを追加する

Windows 10 のエクスプローラーでも従来と同様にレジストリを編集することでコンテキストメニューを追加できる。

任意の拡張子のファイルに対しては HKEY_CLASSES_ROOT\.拡張子\shell、フォルダーに対しては HKEY_CLASSES_ROOT\Directory\shell にキーを追加すればよい。

たとえばフォルダーに「Visual Studio Code で開く (S)」というメニューを追加する場合は次のようなエントリを追加する。

[HKEY_CLASSES_ROOT\Directory\shell\VSCode]
@="Visual Studio Code で開く (&S)"

[HKEY_CLASSES_ROOT\Directory\shell\VSCode\command]
@="\"C:\\Users\\userName\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe\" \"%L\""


追加されたコンテキストメニューのスクリーンショット。「Visual Studio Code で開く」という項目が追加されている。

xyzzy で上付き/下付き文字を入力するための Lisp

コードを書くためのエディタとしては Visual Studio Code に完全に移行したが、メモ書きや設定ファイルの変更、プロジェクトを作るまでもないちょっとしたコードの編集には xyzzy を引き続き使っている。

今日は xyzzy で SO₄²⁻ のようなイオンの化学式を記述したくなったので、簡単に入力するための関数を書いた。

まずは変換のための関数。

;; Superscript に変換
(defun map-to-superscript (str)
  (let ((from "0123456789+--=()") (to "⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁻⁼⁽⁾"))
    (loop for i from 0 below (length from)
      do (setq str (substitute-string str (subseq from i (1+ i)) (subseq to i (1+ i)))))
    str))

;; Subscript に変換
(defun map-to-subscript (str)
  (let ((from "0123456789+--=()") (to "₀₁₂₃₄₅₆₇₈₉₊₋₋₌₍₎"))
    (loop for i from 0 below (length from)
      do (setq str (substitute-string str (subseq from i (1+ i)) (subseq to i (1+ i)))))
    str))

;; loop の使い方
;; http://www.nct9.ne.jp/m_hiroi/clisp/abcl27.html
;;
;; loop for x from 1 to 10 ...           ; 1 から 10 まで
;; loop for x form 1 to 10 by 2 ...      ; 1, 3, 5, 7, 9
;; loop for x from 1 below 10 ...        ; 1 から 9 まで (10 を含まない)
;; loop for x from 10 downto 1 ...       ; 10 から 1 まで
;; loop for x from 10 downto 1 by 2 ...  ; 10, 8, 6, 4, 2
;; loop for x from 10 above 1 ...        ; 10 から 2 まで (1 を含まない)

次にリージョンを変換するための interactive な関数。

;; リージョンを superscript にする
(defun superscript-region (begin end)
  (interactive "r")
  (when (and begin end)
    (let ((replaced (map-to-superscript (buffer-substring begin end))))
      (delete-region begin end)
      (insert replaced))))

;; リージョンを subscript にする
(defun subscript-region (begin end)
  (interactive "r")
  (when (and begin end)
    (let ((replaced (map-to-subscript (buffer-substring begin end))))
      (delete-region begin end)
      (insert replaced))))

;; (interactive "r") でリージョンの範囲を引数 begin end としてとる関数を定義できる

続いてカーソル位置から前の変換できる文字を変換する関数。

;; 現在の位置より前の変換できる文字を superscript にする
(defun superscript-backward ()
  (interactive)
  (let ((end (point))
        (begin (progn (skip-chars-backward "0123456789+--=()") (point))))
    (let ((replaced (map-to-superscript (buffer-substring begin end))))
      (delete-region begin end)
      (insert replaced))))

;; 現在の位置より前の変換できる文字を subscript にする
(defun subscript-backward ()
  (interactive)
  (let ((end (point))
        (begin (progn (skip-chars-backward "0123456789+--=()") (point))))
    (let ((replaced (map-to-subscript (buffer-substring begin end))))
      (delete-region begin end)
	  (insert replaced))))

;; progn の使い方
;; https://wiki.gz-labs.net/index.php/Progn
;; 各式を順に評価して最後の式の値を返す。
;;
;; (progn (goto-bol) (point)) ; 式の値は行の先頭のポイントとなる

;; 指定した文字を含まない位置までカーソルを移動する
;; (skip-chars-backward "0123456789+--=()")
;; (skip-chars-forward "0123456789+--=()")

最後に superscript-backward と subscript-backward をそれぞれ C-c C-u と C-c C-l に割り当てた。

(global-set-key '(#\C-c #\C-u) 'superscript-backward)
(global-set-key '(#\C-c #\C-l) 'subscript-backward)

これで SO4 (C-c C-l) 2- (C-c C-u) と入力することで SO₄²⁻ という文字列が得られる。

特定の URL のみ Basic 認証をかける・除外する (Apache 2.2)

Apache 2.2 を使用している Web サーバで、 .htaccess のみを使い特定の URL のみ Basic 認証を外す必要があり調べた。

特定の URL のみ Basic 認証をかける

## Allow と Require のいずれかの許可があればアクセス可能にする
Satisfy Any

## /members/ で始まる URL へのアクセスを禁止する
SetEnvIf REQUEST_URI "^/members/" restricted_url
Order allow,deny
Allow from all
Deny from env=restricted_url

## /members/ 以下でも Basic 認証を通過すればアクセスできる
AuthUserFile "/path/to/.htpasswd"
AuthGroupFile /dev/null
AuthName "Restricted Files"
AuthType Basic
require valid-user

ここで SetEnvIf に指定している "^/members/" の部分は正規表現で記述する。単に "/members/" と記述すると /sub/members/directory にもマッチするので注意。

特定の URL のみ Basic 認証を除外する

## Allow と Require のいずれかの許可があればアクセス可能にする
Satisfy Any

## /images/ で始まる URL へのアクセスを常に許可する
SetEnvIf REQUEST_URI "^/images/" allowed_url
Order deny,allow
Deny from all
Allow from env=allowed_url

## それ以外の URL は Basic 認証を通過すればアクセスできる
AuthUserFile "/path/to/.htpasswd"
AuthGroupFile /dev/null
AuthName "Restricted Files"
AuthType Basic
require valid-user

Homebrew で過去にインストールした MySQL の操作

MySQL のバージョン

% mysql --version
mysql  Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)

サービス状態の確認

% mysql.server status

サービス停止

% brew services stop mysql

mysql.server コマンドでは停止できない

root パスワードのリセット

セーフモードでサービスを起動し、一旦パスワードを空にする

% mysqld_safe --skip-grant-tables &
% mysql -u root
 
> use mysql;
> update mysql.user
    set authentication_string = null
    where user = 'root'
    ;

通常モードでサービスを起動したあと、空のパスワードでログインし、パスワードを設定しなおす

% mysql.server restart

> alter user 'root'@'localhost' identified by 'パスワード';

パスワードポリシーの確認と設定

> show variables like '%validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

> set global validate_password.mixed_case_count = 0;
> set global validate_password.number_count = 0;
> set global validate_password.special_char_count = 0;

PuTTY (.ppk) → OpenSSH 形式への変換とパスフレーズの変更

PuTTY → OpenSSH 形式への変換

% puttygen -O private-openssh id_dsa.ppk -o id_dsa.pem
Enter passphrase to load key:

OpenSSH → PuTTY 形式への変換

% puttygen -O private id_dsa.pem -o id_dsa.ppk
Enter passphrase to load key:

OpenSSH: パスフレーズの変更

% ssh-keygen -f id_dsa.pem -p
Enter old passphrase:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

PuTTY: パスフレーズの変更

% puttygen -P id_dsa.ppk
Enter passphrase to load key:
Enter passphrase to save key:
Re-enter passphrase to verify: