Emacs実践入門 改訂新版を読みました.

gihyo.jp

tomoyaさんから献本頂きました. ありがとうございます. 紙で置いておきたいというのと若干申し訳ないというのもあり紙版も購入しました.

感想

「実践」とつくように実践な内容です. 操作, 設定, 拡張の 3つのパートから構成されていますが, どれもほどよい長さにまとまっていて読みやすいです. その上, Emacsにこんな謎の機能あるんだとかではなく, 実際によく使う機能のことが多く書かれていると思います. Emacs自体膨大な機能から成り立っており, 標準機能だけで一冊どころではない本にできますが, それを全部書いたら尋常じゃない量になるし, 人によっては使わない機能ばっかりになってしまいます. この本では標準の機能, 標準外の機能が読みやすい形でまとまっているなぁと思いました. たまに登場するコラムもいいアクセントというか参考になると思いました.

初心者や Emacsを使っているけど 3rdパーティ製のツールを使っていないという人という人には特にいいかなと思います. Emacsと付く本はだいたい読んでいますが, 実践という意味では一番よいと思います.

初版とくらべて

だいぶ前に読んで記憶が若干あやふやですが, 拡張の章が微妙に新しくないなぁと思ったような気がするのですが, 今回の改訂版は新しくなっていて今時だなというのを感じました.

若干気になったところ(順番は適当でページ順ではありません)

  • minor-modeの有効・無効が t, 0が使われている箇所がある. 公式的には有効は正の整数(通常 +1), 無効は負の整数(通常 -1)を推奨
  • add-hookに lambdaを使っている. 紙面上の問題というのもあるけど, lambdaで指定しまうとそれを名前で参照する方法がないので関数で指定した方がよい. 特定の状況で無効化したいとき, 名前で参照できれば, それだけ remove-hookすればよいので.
  • major-modeの決定で見つからなかったら text-modeとなっているけど, fundamental-modeではないだろうか.
  • (どちらでもいいが統一されていないような)lambdaに quoteがついているところがある
  • foo.elと foo.elcがあると常に foo.elcが読まれるとあるが, load-prefer-newerに依存する. デフォルトだと nilなので, elcの方が優先されるのは確かですが

最後に

私が作成したツールも紹介されているのですが, 最近 Emacsまともに使っていないので申し訳ないですね. これを契機に Emacs感を取り戻したいと思います.

転職して 1年と 2ヶ月ほど経った

なかなか忙しい日々を過ごしています.

仕事内容

具体的なことを書いていいのかわからないので雑に書きますが…

  • サーバプログラム(APIサーバ)を Goで書いた
    • 初めての仕事でのサーバプログラムであったが, APIサーバで JSON返すだけなので, そこまで大きな苦労はせず. 仕事の進め方などは前職とはだいぶ変わったので戸惑うところはあったけど, 苦痛とかストレスが溜まるということは特になく楽しくできたと思う
  • サーバプログラムを 4-5ヶ月書いた後からはずっと C++書いている
  • IDEをメインにするようになった
    • Xcodeはあんまり印象よくないけど, Visual StudioC++コンパイラの質を除くとだいぶ良かったので
    • デバッグ周りがだいぶ便利.
    • JetBrains All Products Packを私的に購入
    • 最近少し JSも書いたが, WebStormを使っている

転職について

結果としては良かったと思う. 自分自身も新しい刺激を受けられたというのと, 自分の前職の知識をいくらか広めることができたということが, 特に. ずっと同じことをして何かをずっと伸ばしていくというのもキャリアとしてもちろんあることだと思うけど, 新しいことを学び, 自分の知識を別の場所で広げていくというのもいいなぁと思えました. 社会的にそういうのが広まっていけば, 魅力的な職場というのも増えていくだろうので. 絶対しろとはいいませんけど, 考えてみるのはいいことなのではないかと思います.

激遅回線の改善

東京へ引っ越してきてマンションでのネット契約方法がよくわからず不動産屋からいただいた資料にあった Sonetと契約(100Mbps)したがこれがどうにもこうにも激遅である. 人があんまりいない時間だと普通に使えるんだけど, 夜とか 10年前かってレベルの遅さだったので改善方法がないか調べて対策を行った. 結論としては IPoEをプロバイダに有効にしてもらい, ルータを DS-Lite対応のものすればよい. これでひどいとき 1Mbps出ていたかどうかのレベルだったものが 90Mbpsぐらい安定して出るようになった. インターネット関連のストレスはだいぶ減りました.

IPoEに申し込む

DMM光なんかだと申込時にできるっぽいんだけど, Sonetだと改めて電話して有効にしてもらう必要があった. 電話して一日ぐらいしたら有効になるのでルータ等の電源を一度落として再起動し, IPv6関連の設定を行う. Sonetのトップページにある IPの表示やら kame.netの亀が見れるかを確認して問題ないことを確認する.

DS-Lite対応ルータにする

世の中 IPv6が主流であれば IPoEだけでいいのだろうが, 全然そんなことないのでごく一部のサイトを除くと全然恩恵を受けられない. IPv4のコンテンツを IPv4向けの回線で見ても元の通り遅いままなので, DS-Liteを使う. 元々使っていた前職で開発に関わっていた某社のメーカのルータでは対応していなかったので以下のルータを購入した(無線が 2日に一回ぐらい切れるのであまりよい印象ではないがすぐに購入できるかつ安いというのがそれほどなかった). 設定メニューで該当のものがなくて驚いたが IPv6アドレスを振ってしばらくしたら出てきた.

www.iodata.jp

参考

techlog.iij.ad.jp

blog.amedama.jp

macOS Sierraにアップグレードした際のメモ

今更手持ちの macOSSierraにアップグレードした. karabinerで IMEのトグルとキーリピートだけ変えていたので使えなくなってしまったので自分が行った対応のメモ

キーリピートの変更

知らなかったけど, コマンドライン経由であれば System Preference以上の設定にできるようである. 以下のリンクのもので十分だったのでそのままにした.

% defaults write -g InitialKeyRepeat -int 10 # normal minimum is 15 (225 ms)
% defaults write -g KeyRepeat -int 1 # normal minimum is 2 (30 ms)

apple.stackexchange.com

IMEの切り替え

今までは右 Commandを toggleキーとして使っていたがデフォルトの機能ではだいたいできなかった. 最近は仕事で Windowsを使うことが多々あり Windowsだと Alt + backtick(US配列のキーボード利用のため)で IME切り替えだったのでそれに近い形にした. System Preference -> Keyboard -> Shortcuts -> Input Sourcesの Select next input sourceCommand + backtickを割り当てることとした. 若干面倒くさいがそこまで日本語を打ちまくるわけでもないので十分だと思う.

おわりに

できれば macOS自身にもっとカスタマイズ機能をつけて欲しいところである

Visual Studio(C++)セットアップ

Visual StudioC++を書く際の設定メモ

メニュー等を英語にする

使い方を調べるときなど, Stackoverflow等を見るわけですが, 日本語だと圧倒的に情報が少ないので英語にする. やり方は英語の言語パッケージをインストールして使用言語を英語にすればよい. あと可能であるならば Windowsのシステム言語も英語系にした方がよいと思う. Visual Studio C++コンパイラの仕様でデフォルトのエンコーディングとしてシステム言語が使われるということがあり, CP932だとコンパイルできないソース(Chromiumソースコードとか)が極めて稀だがあった. まあ /utf-8フラグをつけることで対策はできるのでそこまで深刻ではないが…

エクステンション

Qiitaとかいろいろ見て試してみたけどほとんどしっくりこなかった. 最終的に入れたのは VsVimと後述の Reshaper C++のみ. キーバインドEmacsVimに慣れすぎてしまっているので, 十字キーだけでは辛くて, 何かしらの補助がないと欲しい. Vimバインドにしたのは干渉が少ないから. Emacs系だとどうしても IDEが元々提供するものとかぶってしまいうまくいかないから. VsVimは生粋の Vim使いの人はどう思うかわからないけど, かなりよくできている. Visual Studioの各種コマンドといい感じで強調して使えるのがよい. リファクタリング時等に自動でインサートモードに切り替えてくれるなどストレスがあまりない(IdeaVim等設定があるのかもしれないが, 変数の名前一括変換のときなど, nomalモードのままでいらいらすることが多々ある).

Reshaper C++

Visual StudioC++書く人は全員入れた方がいいと思った. 特に仕事でコード書く人は. 無料ではないが余裕でペイできると思う. 提供する機能(Search Everywhere)とかめちゃくちゃ便利なんだけど一番いいのは静的コード検査機能. まあこれは Reshaper C++がいいというのはもちろんなんだけど, Visual Studioが提供するものがしょぼすぎるというのが大きい. Visual Studioが提供する静的検査はめちゃくちゃ遅い上に精度も微妙. 全く使い物にならないってことはないけど, Xcodeの clangの静的解析に比べると質も速さも断然落ちる. あと意味不明な警告もいろいろ出る. 同じループなのになぜか一方だけメモリリークを指摘されるとか(実際はしていないのに). リアルタイムで指摘してくれる警告もデフォルトより大幅に増えるので, コードの質を高めるなら必須だと思います.

company-cmakeで大文字, 小文字を考慮した補完をする

company-cmake(標準)でディレクティブ(関数, キーワード等)を補完すると全部小文字になる. カーソル前の文字列(prefix)が大文字だろうと小文字に変換されてしまう. プロジェクトによっては大文字でディレクティブが書かれていることがあり, 補完後わざわざ upcaseとかしていたけどめんどいので prefixが大文字の場合は大文字に補完されるようにしてみた. コードは以下の通り. 本質的に直そうかと PRを書こうとしたが治す箇所が多いし, 今のところはこれで我慢する.

(defvar my/company-cmake-prefix nil)
(defun my/company-completion-started (unused)
  (let ((prefix (company-grab-symbol)))
    (setq my/company-cmake-prefix (and (not (string-empty-p prefix)) (string= prefix (upcase prefix))))))

(defun my/company-completion-finished (result)
  (when my/company-cmake-prefix
    (delete-char (- (length result)))
    (insert (upcase result))))

(defun my/cmake-mode-hook ()
  (add-hook 'company-completion-started-hook #'my/company-completion-started nil t)
  (add-hook 'company-completion-finished-hook #'my/company-completion-finished nil t))
(add-hook 'cmake-mode-hook #'my/cmake-mode-hook)

Switch from paco to porg

Ubuntuソースコードからインストールしたパッケージは pacoで管理していたんですが, Ubuntu16.10で pacoが削除されてしまったため porgへ移行しました.

データベースの移管

paco2porgを使う. pacoをインストールして dist-upgradeした場合 paco2porgが自動で入っているようです. しかし porg自体はインストールされないので, インストールする必要がありました.

% sudo paco2porg
% sudo apt install porg

paco2porg後 porgコマンドでインストール一覧を見られることを確認します. porg -aで一覧が見られれば OKです.

% porg -a
cmigemo
emacs-devel
global-6.5.4

コマンド利用例

パッケージ追加と削除だけ. コマンド体系はほとんど同じですが, 微妙に異なるものもあります. 詳しくは manなどで確認してください.

パッケージ追加

# パッケージ名を明示的にしている場合
% sudo porg -l --package=emacs-devel make install

# パッケージ名としてディレクトリ名を使う場合
% sudo porg -l -D make install

パッケージ削除

% sudo porg -r  emacs-devel

zsh補完

github.com

オプションが覚えられないので書きました. よろしければどうぞ.

おわりに

ソースからいろいろ入れるなら Archとか Gentooを使うべきですね...