Linuxbrewで Github CLI(gh)を install

先の Linuxbrewさえうまくインストールできれば、brewで ghを installするのは実に簡単。

install

% brew install gh

とするだけ。

コマンドラインで使えるように .zshrc に下記の設定を書く。

# GitHub CLI
eval "$(gh completion -s zsh)"

bashなら .bashrcに書く。

eval "$(gh completion -s bash)"

auth login

次のように gh auth login と入力しあとは terminal画面の指示通りに進めて完了させれば、ghコマンドが使えるようになります。

% gh auth login
? What account do you want to log into? GitHub.com
- Logging into github.com
? How would you like to authenticate? Login with a web browser
! First copy your one-time code: ****-****
#👇Enterキーを押すとブラウザから認証作業ができます(下の図参照)。
- Press Enter to open github.com in your browser...
#👇ブラウザでの作業完了後に表示されます。
✓ Authentication complete. Press Enter to continue...
? Choose default git protocol HTTPS
- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as ***********

認証後正常にログインできるようになっていると、ステータスが正常に跳ね返ってきます。

Debian11 (bullseye)に Linuxbrewを install

GitHub CLIツール ghをインストールするのに brewの方が簡単だったので Debianに Linuxbrewをインストールすることにした。 Mac時代に慣れ親しんだ Homebrewが Linuxからも使えるのは感動でした。

install

brewインストールの前に依存ツールをダウンロードしておきます。私の場合は、既にインストール済みだったので省略しました。

% sudo apt install build-essential curl file git

つづいて公式にあるように下記でインストールできます。

% sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

warning at install

install時に Warning: /home/linuxbrew/.linuxbrew/bin is not in your PATH. パスがないと怒られますので、.bashrc or .zshrc に PATHを追加します。私の場合は、zshなので下記のようになります。

% echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >>  ~/.zshrc
% source ~/.zshrc

Confirmation after install

brewが正常に installされたことを確認しておきます。

% which brew
/home/linuxbrew/.linuxbrew/bin/brew

PATHが通っていることが確認できました。

% brew help
Example usage:
  brew search TEXT|/REGEX/
  brew info [FORMULA|CASK...]
  brew install FORMULA|CASK...
  brew update
  brew upgrade [FORMULA|CASK...]
  brew uninstall FORMULA|CASK...
  brew list [FORMULA|CASK...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA|CASK

Contributing:
  brew create URL [--no-fetch]
  brew edit [FORMULA|CASK...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh

helpコマンドが表示されたら正常です。つづいて update確認しておきます。

pangu-spacing.el : 全角と半角の間に自動でスペースを入れる

上記の Tipsを参考にして、markdown-modeに導入してみた。

日本語においては、いわゆる半角文字と全角文字の間にスペースを入れた方が見やすいと言われていて、pangu-spacing.el はそれを自動で行ってくれるというものです。

ただ、「Google日本語入力」などと書くときに「Google 日本語入力」ではおかしくなるし、なんとなく間延びした感じになるのが好みではなかったので アルファベット文字列の右端だけにスペースが入るようにカスタマイズした。

pangu-spacing.elのコードを見るとデフォルトでは、正規表現で [a-zA-Z0-9] なっているので半角数字の場合にも同様に処理されてしまう。 数字にも半角スペースが有効になると、[2021 年 11 月 16 日] という感じになるので、日付表示のケースでは面白くない。 そこで、正規表現の記述を [a-zA-Z] に変更して半角数字は対象外としアルファベットのみが pangu-spacingの対象となるようにしている。

(leaf pangu-spacing
  :ensure t
  :hook ((markdown-mode-hook text-mode-hook) . pangu-spacing-mode)
  :config
  (setq pangu-spacing-real-insert-separtor t)
  (setq pangu-spacing-include-regexp
		(rx (or (and (or (group-n 3 (any "。,!?;:「」()、"))
						 (group-n 1 (or (category japanese))))))
			(group-n 2 (in "a-zA-Z")))))

上記の例では、markdown-mode と text-modeに導入している。

ac-mozc : モードレス日本語入力を試してみた

随分前に一度試してみたが、mozc.elと併用する時に若干変換ルールに違いがあって使いにくく、そのうち使わなくなっていた。 その後、elispの勉強も進み Emacsのスキルも多少向上したので、再度工夫して試してみることにした。

mozc.el導入時には、ローマ字テーブルに azik を使っていたが、これが曲者だということに最近気づいた。結局、標準の mozc.elの romotableを使って、azikのうち手慣れたものだけ追加して試してみたところ、快適に使えるようになったので備忘録に残しておくことにした。

アルファベットと日本語との間に半角スペースを空けるかどうかについては諸論あるけれど、見やすさを優先した。

pangu-spacing.elというパッケージを使うときは自動的に処理してくれるのでいのだけれど、数字にも反応するので日付表示のときはどうにも間の抜けた感じになる。 なので数字には対応させないようにした。

使ってみた感想

スムーズに変換できているときにはとても効率がいいのだけれど、一度ミスタイプになったものを修正しようとするとおかしな変換になるときがあり、 修正するときは mozc-modeにして対応するということが多い。結局、どちらが快適という点はよくわからない。

変換スピードがもう少し改善されたら更に使いやすくなると思うので、誰か companyと連携した ac-mozc作ってくれないかしらと思う。

 ;; ac-mozc with extended auto-complete
  (leaf auto-complete
	:ensure t
	:bind (:ac-completing-map
		   ("<tab>" . ac-next)
		   ("<backtab>" . ac-previous))
	:hook ((text-mode-hook markdown-mode-hook) . auto-complete-mode)
	:custom (ac-comphist-file . "~/.emacs.d/tmp/ac-comphist.dat")
	:config
	(leaf ac-mozc
	  :ensure t
	  :hook ((text-mode-hook markdown-mode-hook) . my-ac-mozc-setup)
	  :config
	  (add-to-list 'ac-modes '(text-mode . markdown-mode))
	  (bind-key* "<henkan>" 'ac-complete-mozc ac-mode-map)
	  (defun my-ac-mozc-setup ()
		(setq ac-sources
			  '(ac-source-mozc ac-source-ascii-words-in-same-mode-buffers))
		(set (make-local-variable 'ac-auto-show-menu) 0.2)))
	;; auto add space between Japanese and English characters.
	(leaf pangu-spacing
	  :ensure t
	  :hook (markdown-mode-hook . pangu-spacing-mode)
	  :custom (pangu-spacing-real-insert-separtor . t)))

Emacs : Open Last Closed Buffer

darkroom-modeを使うときは、Syntax Highlightが邪魔なので、どのモードのファイルであっても強制的に text-modeで開くように設定している。 当然ながら darkuroom-modeから抜けるときにはもとのモードに戻す必要がある。

もとの major-modeを記憶させておいて restoreすればいいのだが、 auto-save-buffers-enhanced で自動保存しているので、回りくどいことをしなくても一度 Kill-bufferして再び読み込めばよい。

いろいろググって下記の Tipsを見つけた。

原案では、多機能で長いコードになっていましたが、私には必要のない部分は削って dietしました。

;; Open last closed file
(defvar my:recently-closed-buffers nil)

(defun my:close-current-buffer ()
  "Close the current buffer."
  (interactive)
  (setq my:recently-closed-buffers
		(cons (cons (buffer-name) (buffer-file-name)) my:recently-closed-buffers))
  (kill-buffer (current-buffer)))

(defun my:open-last-closed ()
  "Open the last closed file."
  (interactive)
  (find-file (cdr (pop my:recently-closed-buffers))))

ようは、kill-buffer の代りに my:close-current-buffer を使い、再読込したいときに my:open-last-closed すればよいことになる。

darkroom-modeの in/out 設定は以下のようになった。

(leaf darkroom
  :ensure t
  :bind ("<f12>" . my:darkroom-in)
  :config
  (bind-key "<f12>" 'my:darkroom-out darkroom-mode-map)

  (defun my:darkroom-in ()
	(interactive)
	(display-line-numbers-mode 0)
	(setq line-spacing 0.4)
	(darkroom-tentative-mode 1))


  (defun my:darkroom-out ()
	(interactive)
	(darkroom-tentative-mode 0)
	(setq line-spacing 0.1)
	(display-line-numbers-mode 1)
	(my:close-current-buffer)
	(my:open-last-closed)))

つまり、darkroom-outのとき、一度 bufferを閉じて(kill-buffer)、再度読み込むという処理をしているわけである。

Emacs : 作業目的別にテーマを切り替えて使う

Melpaから package installできる Emacsテーマは、たくさんあってお好みで選べるようになりとても便利なのですが、一つに絞り込むのは難しいですね。

私の場合、作業目的に応じて3つのテーマを切り替えて使えるようにしています。

1. iceberg-themes

普段使いで目に優しいテーマ:iceberg-theme(自作テーマ)

私の Emacsは、執筆むけに使うことが多く、日本語の文章作成、編集が大半ですので、目に優しいこのテーマを愛用しています。

もともとは、Vim向けに開発された、目に優しいダークブルーの配色です。

Emacs向けに移植されたものは、幾つか存在しますが、お好みにカスタマイズしたかったので自作しました。GitHubに置いてます。

Alt Text

2. doom-doracura.theme

コード編集するときのテーマ:doom-dracura.theme

ごくたまに Emacs-Lispや Perlスクリプトなどを編集することもあるので、そのときは視認性に優れていて多くの Emacserの間でも普及しているこのテーマを愛用しています。

Alt Text

3. doom-solarized-light.theme

執筆モードでリラックスできるテーマ:doom-solarized-light.theme

Darkroom-mode で、短い文章を書いたり、エッセイの下書き、編集などをするときに珈琲を飲みながらゆったりした気分で文字書きできるので愛用しています。メニューバーもモードライも一切なしの Fullscreen画面は白紙の上になぐり書きしているかのようで快適です。

別途 installしてもよかったのですが doom-themesの中に solarized-light.themeもあったので、そちらを使っています。

Alt Text

4. テーマを切り替えて使うための設定

同様の趣旨で作られたものが Melpaでも見つかったのですが、私の場合うまく作動しなかったので独自に関数を作りました。

というより下記記事からのパクリです。

(leaf doom-themes
  :ensure t
  :init
  (leaf iceberg.emacs :el-get minorugh/iceberg.emacs)
  (add-to-list 'custom-theme-load-path "~/.emacs.d/el-get/iceberg.emacs/"))

(leaf cycle-custom-theme
  :config
  (setq my:themes (list 'iceberg 'doom-solarized-light 'doom-dracula))
  (setq curr-theme my:themes)

  (defun cycle-custom-theme ()
	"Switch themes to cycle."
	(interactive)
	(disable-theme (car curr-theme))
	(setq curr-theme (cdr curr-theme))
	(if (null curr-theme) (setq curr-theme my:themes))
	(load-theme (car curr-theme) t)
	(message "%s" (car curr-theme)))

  (bind-key "<f11>" 'cycle-custom-theme)
  (setq curr-theme my:themes)
  (load-theme (car curr-theme) t))

Downloadした CGI Scriptを Severへ Uploadするときは改行コードを修正する必要あり

Windowsから Linuxに移行してから Webで Downloadした CGIスクリプトをそのまま FTPアプリでアップロードすると必ずエラーになる。 試行錯誤して原因は、主要な CGIスクリプトの改行コードが CRLFとなっていたことでした。

Linux環境でダウンロードして解凍するというプロセスによってそうなるのかどうかは解明できていませんが、これを LFに変えてやることで問題なくスクリプトが動作しました。

いつも何も考えずにアップレードして「あれ!」となるのでしっかり備忘録に記しておこうと考えた次第。そういえば、Mac環境のときもそうだった気がする。UNIX系の症状かも知れないのでもう少しググって調べてみよう…

たくさんファイルがある時は、いちいち Terminalを開くのは面倒なので Emacsでやっている。

  (defun convert-encode-to-utf8 ()
	"Convert character code of the file to utf-8."
	(interactive)
	(let ((file (buffer-file-name)))
	  (if (not (use-region-p))
		  (compile (concat "nkf -w -Lu --overwrite " file)))))

  (defun convert-encode-to-sjis ()
	"Convert character code of the file to utf-8."
	(interactive)
	(let ((file (buffer-file-name)))
	  (if (not (use-region-p))
		  (compile (concat "nkf -s -Lu --overwrite " file)))))

iframeに異なるドメイン(クロスドメイン)のコンテンツを読み込んで高さを自動調節する方法

wordpressでサイトを構築したときに掲示板をつけることになりました。 bbpressをはじめ何種類かのプラグインも試しましたが、不要な機能が多く使いづらいので、別サイトで簡易なcgi掲示板を構築してiframeで埋め込むことにしました。

wordpress側の負担を減らすためもあり、表示部がHTMLでサーバに負荷をかけず表示の軽い掲示板cgi(kent-webの SUN BOARD) を選びました。

表示幅を最大にしたり、スクロールバーを非表示にしたりというのは簡単にできたのですが、「高さを自動調整する」という課題に躓き、Googleで調べてTipsを見つけました。

iframe(親)に異なるドメインのページ(子)を読み込んで、親フレームにスクロールが出ないよう、iframeの高さを子ページの高さに自動調節する

親ページと子ページにそれぞれ下記をコピペするだけでうまく行きました。感謝!

wordpress (親) 側の設定

<html>
<head>
    <title></title>
    <script src="js/jquery.js"></script>
    <script>
        window.addEventListener('message', function(e) {
        var iframe = $("#fugapage");
        var eventName = e.data[0];
        var data = e.data[1];
        switch(eventName) {
            case 'setHeight':
                iframe.height(data);
                break;
            }
        }, false);
    </script>
</head>
<body>
    <iframe id="fugapage" src="http://fuga.com/" width="100%" height="auto" " frameborder="0" scrolling="no"></frame>
</body>
</html>

埋め込みたい別ドメインのページ (子)

fuga.com

<html>
    <head>
        <title></title>
        <script type="text/javascript">
        window.onload = function() {
            var height = document.getElementsByTagName("html")[0].scrollHeight;
            window.parent.postMessage(["setHeight", height], "*");
        }
        </script>
    </head>
    <body>
    ・・・
    </body>
</html>

Gist on Emacs

みなさん、Emacsで Gist 使ってますか?

私も気軽に使っているのですが GitHub Gist の Webページを開いて直接コード書き込んだりコピペするというのは何げに中途半端ですね。

ローカルに cloneして git管理するという Tipsも見かけましたが、そもそもバージョン管理がしたいのであればGistにこだわらず、素直にリポジトリで管理すれば済むことです。

何がしたいのか整理してみる

  • Emacsで開いている Buffer(or region)をそのまま即 gistしたい。
  • gistに成功したら、結果をブラウザで開いてほしい。
  • 自分の GitHub Gist ページを一発で開きたい。

試行錯誤しましたが、yagist.el を package installすれば簡単だと気づきました。 yagist.el には、いろいろ機能があるのですが、私の場合は必要な関数だけ利用しています。

ターミナルで gist コマンドが扱えること

このTipsは、ターミナルからコマンドラインで gist が扱えるように設定済であることが前提です。

ターミナルで gist -help を打つといろいろオプションパラメターがわかります。

Usage: gist [-o|-c|-e] [-p] [-s] [-R] [-d DESC] [-u URL]
                          [--skip-empty] [-P] [-f NAME|-t EXT]* FILE*
       gist --login
       gist [-l|-r]

        --login                      Authenticate gist on this computer.
    -f, --filename [NAME.EXTENSION]  Sets the filename and syntax type.
    -t, --type [EXTENSION]           Sets the file extension and syntax type.
    -p, --private                    Makes your gist private.
        --no-private
    -d, --description DESCRIPTION    Adds a description to your gist.
    -s, --shorten                    Shorten the gist URL using git.io.
    -u, --update [ URL | ID ]        Update an existing gist.
    -c, --copy                       Copy the resulting URL to the clipboard
    -e, --embed                      Copy the embed code for the gist to the clipboard
    -o, --open                       Open the resulting URL in a browser
        --no-open
        --skip-empty                 Skip gisting empty files
    -P, --paste                      Paste from the clipboard to gist
    -R, --raw                        Display raw URL of the new gist
    -l, --list [USER]                List all gists for user
    -r, --read ID [FILENAME]         Read a gist and print out the contents
        --delete [ URL | ID ]        Delete a gist
    -h, --help                       Show this message.
    -v, --version                    Print the version.

Emacsの設定

1. yagist-region-or-buffer

名前の通り Emacsで開いている Buffer(or region)を POSTしてくれます。