2020年4月12日日曜日

Emacs batch mode と HTML解析

前提

  • たくさんあるhtmlファイルの加工、編集をしたい。
  • 環境はWindows 10.
  • Emacsは入ってます。バージョン26.3.
  • MSYS2も入っていてBash使用可能。
  • しかしPython等のお手軽スクリプト言語の実行環境は無し。MicrosoftのPowershellやその他スクリプト言語には不慣れ。

ということでEmacsのDOM処理用関数を使うワンライナーを書くことにしました。


例題

カレントディレクトリにある拡張子htmlのファイルを開いてid="my-content"をもつ要素だけを抽出し、テキスト化して拡張子.txtのファイルに保存する、というもの。

for f in *.html; do
/c/Users/${user}/local/emacs-26.3-x86_64/bin/emacs --batch $f --eval='(princ (dom-texts (dom-by-id (libxml-parse-html-region (point-min) (point-max)) "my-content") "\n"))' > $f.txt;
done
  • "/c/Users/${user}/local/emacs-26.3-x86_64/bin/emacs": Windows上のemacsコマンドのパス
  • "--batch": Emacsバッチモード。バッチモードの定義は下記参考ページに書いてある。大雑把には、普段「バッファ」や「ウィンドウ」を使用するEmacsの入出力関数(message, princなど)を標準入力や標準出力、標準エラー出力に結び付けて、非インタラクティブに処理を実行する。
  • "--batch"直後の$fは処理対象のhtmlファイルで、非インタラクティブなEmacsはこのファイルを開いてバッファに読み込む。
  • "--eval"の引数としてelispコードを渡す。この例ではhtmlを開いたバッファ全体を"libxml-parse-html-region"関数に渡してDOM化し、次のそのDOMから"my-content"というidをもつ要素を"dom-by-id"関数で選び、選ばれた要素を"dom-texts"関数に渡してテキスト部分を抽出して"princ"で出力している。どの関数もEmacs標準のものだから外部のelispは利用していない。

2015年6月28日日曜日

HPサーバーのSSACLI(Smart Storage Administrator CLI)

RHELやCentOSにインストールしてやって、RAIDの構成や物理ドライブの情報をコマンドで調査できる(Windowsでもできると思う)

# hpssacli

=> controller all show

Smart Array P222 in Slot 4                (sn: xxxxxxxxxxxxxxxx)

=> controller slot=4 logicaldrive all show

Smart Array P222 in Slot 4

   array A

      logicaldrive 1 (931.5 GB, RAID 1, OK)

=> controller slot=4 physicaldrive all show

Smart Array P222 in Slot 4

   array A

      physicaldrive 2I:1:1 (port 2I:box 1:bay 1, SAS, 1 TB, OK)
      physicaldrive 2I:1:2 (port 2I:box 1:bay 2, SAS, 1 TB, OK)

=> quit

とても便利。めったに使わないのでコマンドをすぐ忘れそう。

2015年5月7日木曜日

「先読み」と「後読み」の正規表現(lookahead assertion と lookbehind assertion)

「詳説 正規表現」で「先読み」、「後読み」と呼んでいる正規表現は英語でそれぞれ lookahead assertion, lookbehind assertion、まとめて lookaround assertion と呼ぶ。

$ echo 'Regex example:1234567890.' | perl -p -i -e 's/(?<=\d)(?=(\d{3})+(?!\d))/,/g'
Regex example:1,234,567,890.

2015年5月6日水曜日

Windows ローカルアカウントでログオンするとき「.\ユーザー名」が使える

ドメインに参加していた Windows 7 のPCにローカルアカウントで入りなおすとき、いつも "コンピューター名\ユーザー名" の形式で入力していた。コンピューター名をその都度調べて正確に入力しないといけないから面倒くさいと感じていたが、実は「.\ユーザー名」という形式にも対応しているのだった。

出力をクリップボードにリダイレクトする方法(clip, xclip)

Windows で作業をしていて初めて知った("clip"コマンド)。Linux/Unix の世界にも同様のコマンドがあった("xclip")。知ってよかった。

C:\Users\foo>date /T | clip

2015年2月22日日曜日

Fedora Live USB Creator: "vesamenu.c32: not a COM32R image"

Fedora 21 Workstation の ISO と liveusb-creator をダウンロードしてWindows 8.1 を使ってブータブルUSBを作ってみたものの、次のメッセージが出て起動しなかった。(BIOS環境の場合のみ。UEFIの場合は問題なかった)


vesamenu.c32: not a COM32R image
boot:

この症状は、USBの中にあるSYSLINUXの設定ファイル、具体的には /syslinux/syslinux.cfg をほんの少しだけ変更してあげれば治った。

変更前の /syslinux/syslinux.cfg:
default vesamenu.c32
timeout 100
...
変更後
default linux0
timeout 100
...

こちらに書いてあるように、プロンプトでTabキーを押してイメージの候補を表示する、という方法もある。が、キーボード押したくない場合には syslinux.cfg を編集すればよい。



2015年2月20日金曜日

netshコマンドを使ってWindowsファイアウォールのポートを開ける

netshというコマンドを使えばいい。

たとえば TCP/80 を開けたいなら、コマンドプロンプトを管理者として開いて

netsh advfirewall firewall add rule name="HTTP" dir=in action=allow protocol=TCP localport=80
を実行すればOK。

ここで、nameオプションは「ルールの名前」と呼べばよいだろうか。文脈に応じて分かりやすい文字列を指定すればよい。

Windows Server 2012と2008で動作確認した。