タグ別アーカイブ: cygwin

magit と git-gutter が便利!

git-magitを使ったソースコードの履歴管理は凄く便利。 git-gutter-fringe を追加すると、commitした後の更新が常に見えるようになる。 これはズゴク便利。

MELPAから自動でインストール出来て、Macでは言うこと無しに快適。 Cygwinでは、この間までは良くプチフリーズしていたけれど、 設定見直しでファイルアクセスが早くなったので実用範囲になった。

設定したのは、この程度。

;; Control Git from Emacs.
(require 'magit)

;; magit
(global-set-key         (kbd ""C-z m s"")       'magit-status)

;; git-gutter-fringe
(global-git-gutter-mode)
(global-unset-key       (kbd ""C-z g""))
(global-set-key         (kbd ""C-z g t"")       'git-gutter:toggle) ; Toggle git-gutter
(global-set-key         (kbd ""C-z g p"")       'git-gutter:previous-hunk)
(global-set-key         (kbd ""C-z g n"")       'git-gutter:next-hunk)
(global-set-key         (kbd ""C-z g r"")       'git-gutter:revert-hunk)
(global-set-key         (kbd ""C-z g u"")       'git-gutter:popup-hunk) ; popup diff
(global-set-key         (kbd ""C-z g s"")       'git-gutter:set-start-revision) ; Set start revision where got diff
(global-set-key         (kbd ""C-z g g"")       'git-gutter) ; Show changes from last commit or Update change information.
(global-set-key         (kbd ""C-z g c"")       'git-gutter:clear) ; Clear changes

git最高だなぁ。

cygwinのファイルアクセスが遅い件:もっと解決編

magit を更新したら、表示が綺麗になった代わりに、反応がとても遅くなってしまった。

ファイルの更新情報を色々と表示してくれるのは助かるのだけど ファイルアクセスが遅い cygwin 上では、かなりストレスに感じる。

もちろん macやlinuxでは問題なくて、快適そのもの。

そこでもう少し、Cygwinのファイルアクセスの速度を改善してみる。

;; vc無効化は出きないけど、無力化が出来る
(setq vc-handled-backends ())
(eval-after-load ""vc""
  '(remove-hook 'find-file-hooks 'vc-find-file-hook))

まだ動作がモッサリした感じだけど、大分快適にはなった。

cygwinのファイルアクセスが遅い件:解決編

もうmagit無しではemacsでコーディングできない体になってしまった。 さらに便利を求めて git-gutter-fringe+ をインストールしたところ、 Macではもう最高の使い心地。

だけども。 これをCygwinとntemacsで使うと、しょっちゅうプチフリーズしてしまう。 Cygwinのファイルアクセスが異常に遅いせいなのだけれど、 仕事上Cygwin環境は必須だし、git-gutterは手放したくないし。

いくら便利でも、作業中に30秒も固まられると、さすがに我慢できない。 いい加減、ちゃんとCygwinに対策をしなければ…

と言う訳で。

Cygwinの起動やファイルアクセスが遅くて怪しい場合に

CygwinのFAQサイト を検索してみた。

以下、Cygwinのページから引用。

4.2. Starting a new terminal window is slow. What’s going on?

There are many possible causes for this.

~snip~

For almost all its lifetime, Cygwin has used Unix-like /etc/passwd and /etc/group files to mirror the contents of the Windows SAM and AD databases. Although these files can still be used, since Cygwin 1.7.34, new installations now use the SAM/AD databases directly.

To switch to the new method, move these two files out of the way and restart the Cygwin terminal. That runs Cygwin in its new default mode.

~snip~

For the AD case, it can be slower than the old method, since it is trading a local file read for a network request. Version 1.7.35 will reduce the number of AD server requests the DLL makes relative to 1.7.34, with the consequence that you will now have to alter /etc/nsswitch.conf in order to change your Cygwin home directory, instead of being able to change it from the AD configuration.

If you are still experiencing very slow shell startups, there are a number of other things you can look into:

One common cause of slow Cygwin Terminal starts is a bad DNS setup. This particularly affects AD clients, but there may be other things in your Cygwin startup that depend on getting fast answers back from a network server.

~snip~

Another cause for AD client system is slow DC replies, commonly observed in configurations with remote DC access. The Cygwin DLL queries information about every group you’re in to populate the local cache on startup. You may speed up this process a little by caching your own information in local files. Run these commands in a Cygwin terminal with write access to /etc:

getent passwd $(id -u) > /etc/passwd getent group $(id -G) > /etc/group Also, set /etc/nsswitch.conf as follows:

passwd: files db group: files db

~snip~

Either in addition to the previous item or instead of it, you can run cygserver as a local caching service to speed up DC requests.

~snip~

A less preferable option is to create a static read-only cache of the authentication data. This is the old-fashioned method of making Cygwin integrate with AD, the only method available in releases before 1.7.34. To do this, run mkpasswd and mkgroup, then put the following into /etc/nsswitch.conf to make Cygwin treat these files as the only sources of user and group information:

passwd: files group: files

~snip~

If none of the above helps, the best troubleshooting method is to run your startup scripts in debug mode. Right-click your Cygwin Terminal

~snip~

4.3. Why is Cygwin suddenly so slow?

If suddenly every command takes a very long time, then something is probably attempting to access a network share. You may have the obsolete //c notation in your PATH or startup files. Using //c means to contact the network server c, which will slow things down tremendously if it does not exist.

要するに、ドメインで使っている会社のPCで遅くなる原因は。。。

  1. cygwinを 1.7.35 以降の最近のバージョンにする (古いのは遅い)
  2. DNSのIPアドレスが間違っていると、長い待ちがおこる
  3. ドメインじゃないなら、 /etc/passwd と /etc/group を消すと良いかも(知れない)
  4. ドメインなら、ドメインコントローラの返事が遅いのかも
    • その場合、passwd/group をキャッシュして高速化できる
    • cygserverでドメンインキャッシュサーバをたててみても良いぞ
    • そもそもドメインにアクセスするの辞めちゃえば? (ADが更新しても知らんけど)
  5. それでもダメならデバッグモードで起動してみな
  6. ひょっとして ‘//c’ とか書いてない?

DNSが関係しているのは分かっていたけど、 会社のドメインコントローラが遅いとは疑っていなかった。 Windowsでは困ったことないし。

でもやってみよう。

まずはバージョン確認

以下のどちらかで確認できる。

uname -a
cygcheck -c cygwin

2.2.0 だったので、問題なし。

/etc/passwd と /etc/group の削除

cygwinでドメインに関係するような事はしないし、 むしろ悪さしそうなので、まず削除して様子をみてみた。

数時間使ってみて、酷いフリーズは経験しなかったけれど、 プチフリーズが解決したかと言うと、ちょっと分からない。

AD情報のキャッシュ化

ドメインの情報を削除するのも危険な気がしたので、 一応キャッシュしておいて、様子をみてみた。

ドメイン情報のキャッシュは、こうしてとれる。

getent passwd $(id -u) > /etc/passwd
getent group $(id -G) > /etc/group

その後、 /etc/nsswitch.conf を編集して、 ADにアクセスするより先にキャッシュ(files)を見るように変更する。

passwd: files db
group:  files db

正直、これも良くなったのか悪くなったのか分からない。

そもそもドメイン情報を使わないようにする

いくつか試してみた結果、 /etc/passwd と /etc/group を削除してしまうことにした。

実はこの状態でも、ドメインでアクセス管理しているネットワークサーバの ファイルにアクセスできたのだった。しかも今迄よりもサクサクと。(汗)

まだ、たまにフリーズはするものの (キャッシュはあった方が良いのかも知れない)、 全体的にファイルアクセスが軽快になった。

無くて良いものは、無い方が良い。 この状態で、またしばらく使ってみようと思う。

emacs-w64 が最高! cygwinと組合せて更に最高になる話

emacs-w64 が最高な話。

もう1年くらい、emacs-w64 にお世話になっている。

emacs-w64 | 64-Bit GNU Emacs for MS Windows with optimization

これだと、macのHomebrewのemacsとバージョンが合わせられるので、
とても具合が良い。

最近のスナップショットバイナリは、十分安定してるし、
一番新しいリリース版よりも起動がかなり早いのが気分良い。

一般的なソフトと比べると遅いかも知れないけど。。。

emacsとしては、十分な速度だよ。本当だよ。

7/25時点のバージョンは

通常site-lispに入れるlispの類は ~/.emacs.d 以下に集めてあるので、
配布先からダウンロードして解答すれば、インストール完了。

mewやmigemoなどが呼び出すバイナリは、
cygwinの /usr/local にでも置いておけば問題なく使える。

日本語入力がSKKな人には、これで十分だろう。

gnupackにも一時期、
というかかなり長い期間お世話になっていたけど、
すっかり emacs-w64 + cygwin に復帰してしまった。

ただ。
gnupack や cygwin-emacsでも同じなのだけれど、
compile-mode からの make の起動がやたらと遅いことがある。

mewのhtmlレンダリングが異常に遅い事も良くある。
mew が w3m を呼び出すときの shell-command で躓いているらしい。

emacs の exec-path を最小限にしたり。
(C:/Windows/system32 とか、Program Files なんかも必要ないし)

たまに、bash_history を消したり。

WindowsのDNSのキャシュを削除してみたり。
コマンドプロンプトで、

と入力する。

自分自身をDNSで探さないように、LMHOSTS も設定だ。
(C:\Windows\System32\drivers\etc\hosts に書いとく)

emacsもcygwinも、
起動時やshellコマンド使用時にネットワークを見に行っている痕跡がある。
やけにキャッシュが膨れてる。

主犯は DNS だと考えてるのだけど、
再現性がイマイチだから、確証がない。

これさえ無くなれば、Windowsの開発環境には不満なくなるのだけどなぁ…

Visual Studioには、色々文句はあるけど。

cygwinが動かなくなった!プロシージャ エントリ ポイント~が見つかりません

emacsから一番頻繁に呼び出すマンド diff が、
この数日返事しなくなった。

emacsのshell-modeや、cygwinのbashから呼び出すと、
メッセージは何もなしで終了する。

まぁ良いか(「Windowsを再起動したらきっと直るさ…」)、
と思っていたけど、どうもそうじゃないみたい。

試しに、cmd.exeから呼び出すと、

「プロシージャ エントリ ポイント ~ ライブラリ cygwin1.dll から見つかりませんでした」

とか言ってるし。

心当たりはある。
この間 cygwin をアップデートした時に、何か怒られてた。

インストール先の c:\cygwin\bin を覗くと、
cygwin1.dll と cygwin1.dll.new のdllが二つある。

これが問題らしい。
cygwin1.dllのアップデートに失敗していたらしい。

やれやれ。

cygwin1.dll を削除して、
cygwin1.dll.new を cygwin1.dll にリネームしたところ、
無事動くようになった。