高尾宏治日記 on はてなブログ

プログラミング言語Rubyを中心とした技術情報を扱うブログです(Microsoft Surfaceはやめました)。

which-keyが遅すぎる

最近MacBook 12インチに乗り換えた高尾です。ついでに、「Emacs + 自前の.emacs.d」から「Emacs + Spacemacs」にも乗り換え済み。マシンのメモリ不足からちょっともっさりした感じはありますが、所有欲は十二分に満たされていますので大丈夫です!なにも気にならない、気にしない!!!

さて、今回は、Emacs + Spacemacsに関する記事です。

見つけたぞ、which-key!

次のファイルを編集するよ。Control-x Control-f...あらま、また固まったか...一休みだな。

これはEmacs + Spacemacsを使っているときによく起きることです。

マシンの性能によると思いますが、Spacemacsのコマンド候補の表示(Control+xを押してしばらく待つとminibufferに表示されるやつ)が遅すぎます。少なくとも、手元のMacBook '12 Early 2016だと、候補が多い場合は5秒程度はEmacsが応答しなくなる。これでは困ります。

なんとか改善できないか、調査してみます。そもそも、どのパッケージでそれを実現しているかを調べるところからですね。

ここは、eww-search(Emacs での テキストブラウザ eww を使えるレベルにする | Futurismo)の出番ですね。まだ慣れておらず、うっかりSafariを使ったりしてしまいますが、ewwのほうがよいこともたくさんあります。特に、0キーでマークダウン形式のURLをコピーできるのは使いやすいですね。

で、ググってもなかなか見つけられず...そもそもよいキーワードが思いつきませんね。「spacemacs minibuffer command list」ではだめでした。

それならばということで、 ~/.emacs.d/elpa/ を探索。それっぽいのはないかな。ace-windowってなんだろ、completeを含むものかな、なんて考えながら見ていくと、which-keyというそれっぽいものがあるでないですか。

which-key.elにもそれらしい記述があります。これで間違いなさそうです。

カスタマイズド、which-key。

which-key.elを読むと、defcustomでいろいろ設定項目が定義されています。 気になったのは、コマンド入力をやめてから候補を表示するまでの待ち時間 which-key-idle-delay だけですね。さて、defcustomってどうやって設定するんだったかな?setqでいいのかな???

ここでもeww-search。役立つね。で、defcustomで定義された変数はsetqではなくcustom-set-variablesで設定すべき理由 - kawamuray's blogを見つけました。

.spacemacsのdotspacemacs/user-config ()に以下を追加して様子見です。さて、どうかな。

(custom-set-variables '(which-key-idle-delay 10.0))

WindowsのGitで異常終了するようになったら...一時ファイルの削除と再起動でOK!

はじめに

今日、一日ぶりにWindowsEmacsからmagitを使ってmagit-refresh(magit-statusの画面でgを押す)すると「sh.exeが異常終了しました」というダイアログがでてmagit-refreshが失敗するようになりましたorz

なにか変ったことといえば、昨日、スリープからの復帰に失敗してブルーバックになりました。あぁ、スリープに失敗しまくっているので、いつかはこうなるよな~と思いつつ、対処方法を探します。(一瞬、Windowsのリフレッシュが頭をよぎりましたが、アプリケーションのセットアップなどに数日かかるため恐ろしくてできません...)

作業ログ

インターネットで「sh.exe.stackdump」のキーワードを検索して、次のブログの記事を見つけました。

http://d.hatena.ne.jp/miau/20131229/1388301913 より

git のコマンドを叩くと

 0 [main] sh.exe" 6768 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
 1620 [main] sh.exe" 6768 open_stackdumpfile: Dumping stack trace to sh.exe.stackdump

こんなエラーが出る状態になってしまったので、対策方法のメモ。ちなみに試したバージョンは Git-1.8.4-preview20130916.exe です。

まさにこれですね。

上記の記事で紹介されている「Process monitor」は http://technet.microsoft.com/ja-jp/sysinternals/bb896645.aspx からダウンロードできます。

Process monitorの操作説明を読んで、「Process Nameにsh.exeを含む」でフィルタリングすると、たしかに %TEMP% へのアクセス時に異常終了しているようですね。

じゃあ、あとは一時ファイルを削除すればよさそうです。Windows 7までは「ディスク クリーンアップ」でできたようなのですが、Windows 8では違うようです。

http://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=013968 より

Windows 8.1の場合

「検索」ボックスに「不要」と入力し、表示された一覧から「不要なファイルの削除によるディスク領域の解放」をクリックして、手順5に進みます。

ふむふむ。

「不要なファイルの削除によるディスク領域の解放」で、一時ファイルのみをチェックして「OK」ボタンを押すと一時ファイルが削除されます。

あら、それでもまだmagit-refreshが失敗します。で、PC自体を再起動するとmagit-refreshが成功するようになりましたとさ。

まとめ

magit-refreshに失敗するようになったら、「不要なファイルの削除によるディスク領域の解放」で一時ファイルを削除してから再起動すればOK!

「Process Monitor」を知ることができたのはよかったね。

Surface Pro/Windows 8.1から、Surface Pro 2/Windows 8.1へのデータの移行。 #SurfaceJP

ついにSurface Pro 2を手に入れたのですが、Surface Pro/Windows 8.1からデータを移行する手段がないことを知りました orz

転送ツールがインポートのみの動作になっている

Windows 8Windows 8.1はデータを転送できるのですが、Windows 8.1→Windows 8.1はできないとのこと。う~ん、いまだにファイルの転送をユーザに強いるなんてありえないと思いつつも、愚痴を言っててもしょうがありません、やるしかないです。

クラウド(SkyDrive)経由は、遅すぎるのと、ファイルのバイト列以外の情報(権限とか)が消えてしまうので別の方法にします。

そこで、いったんMicro SDにファイルをコピーすることにしました。

また、Cygwinの操作配下のものはCygwinのtarで圧縮することにしました。これなら権限が適切に保持されるはず、と思ったら tar コマンドで展開すると mklink コマンドで作成したリンクの権限が Administrator からユーザに変わってしまうことがわかりました。なかなか難しい。それに、どうやって移行先の Surface Pro 2 で tar で圧縮したファイルを展開すればいいのでしょう(笑)Cygwinがインストールされていませんからね。困ったな~。

とりあえず、以前 Surface Pro を交換修理したときの手順書を元に手作業で移行することにしました。

以下はその作業記録です。

Emacs: gnupack 24.3-20130503

Emacsさえ動作すれば、あとはどうとでもなる。

  • gnupackからemacs-24.3-20130503.exeをダウンロード・インストール。
    • 展開先は「C:\」
  • SkyDrive上のバックアップからdot.emacs.dなどを配置。
    • 以下、管理者権限のコマンドプロンプトで実行。またSkyDrive直下のdotfilesにバックアップを格納していることが前提。
C:\Users\kouji>mklink /d .emacs.d .\SkyDrive\dotfiles\dot.emacs.d
.emacs.d <<===>> .\SkyDrive\dotfiles\dot.emacs.d のシンボリック リンクが作成されました

C:\Users\kouji>mklink .gitignore .\SkyDrive\dotfiles\dot.gitignore
.gitignore <<===>> .\SkyDrive\dotfiles\dot.gitignore のシンボリック リンクが作成されました

C:\Users\kouji>mklink .gitconfig .\SkyDrive\dotfiles\dot.gitconfig
.gitconfig <<===>> .\SkyDrive\dotfiles\dot.gitconfig のシンボリック リンクが作成されました

C:\Users\kouji>mklink .bashrc .\SkyDrive\dotfiles\dot.bashrc
.bashrc <<===>> .\SkyDrive\dotfiles\dot.bashrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .profile .\SkyDrive\dotfiles\dot.profile
.profile <<===>> .\SkyDrive\dotfiles\dot.profile のシンボリック リンクが作成されました

C:\Users\kouji>mklink .gemrc .\SkyDrive\dotfiles\dot.gemrc
.gemrc <<===>> .\SkyDrive\dotfiles\dot.gemrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .inputrc .\SkyDrive\dotfiles\dot.inputrc
.inputrc <<===>> .\SkyDrive\dotfiles\dot.inputrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .minttyrc .\SkyDrive\dotfiles\dot.minttyrc
.minttyrc <<===>> .\SkyDrive\dotfiles\dot.minttyrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .ruby-version .\SkyDrive\dotfiles\dot.ruby-version
.ruby-version <<===>> .\SkyDrive\dotfiles\dot.ruby-version のシンボリック リンクが作成されました

C:\Users\kouji>mklink .screenrc .\SkyDrive\dotfiles\dot.screenrc
.screenrc <<===>> .\SkyDrive\dotfiles\dot.screenrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .zshrc .\SkyDrive\dotfiles\dot.zshrc
.zshrc <<===>> .\SkyDrive\dotfiles\dot.zshrc のシンボリック リンクが作成されました
  • 環境変数の追加
    • HOME: C:\Users\kouji
    • Path: C:\tools;C:\emacs-24.3-20130503\bin

いろいろなソフトウェア

  • Windowsストアアプリのインストール
    • 基本的にインストール済みのもの(FacebookTwitter)をすべて再インストールすればいい。
  • iTunes
    • 同時にQuickTimeをインストール
    • 2013/12/29現在、iCloudコントロールをインストールすると休止状態から復帰しなくなることが分かったのでここではインストールしない
  • OutlookにGmailのアカウントを設定
    • Outlookのオプションは引き継がないようだ。Surface ProのOutlookのオプションを見ながら手作業で移行
  • 7-Zip
    • 7z920-x64.msi をインストール
  • プリンタ Cannon MP640 のインストール
    • mp68-win-mp640-1_05-ej.exe
  • Skitchのインストール
    • skitchsetup-2.3.0.10.exe
  • Oracle VirtualBoxのインストール
  • Firefoxのインストール
  • Google Chromeのインストール

Cygwin関連

  • Surface ProのCygwinのキャッシュディレクトリC:\Users\kouji\cacheを移行
    • Cygwinのパッケージのダウンロード時間を大幅に短縮できる
  • Cygwin
    • 64ビット版をインストール。32ビット版は正しく動作しないことがわかっている。
    • gcc-core
    • git
    • git-svn
    • make
    • patch
    • libncursesw-devel
    • openssl-devel
    • readline
    • libsqlite3-devel
    • libxml2-devel
    • libxslt-devel
    • wget
    • ruby
    • zip
    • unzip
    • screen
    • zsh
    • openssh
    • ncurses
    • Publishing以下のすべて (←これはとっても時間がかかるから、時間があるときにあとからインストールすることをオススメします)
  • setup-x86_64.exe を C:\cygwin64\bin に移動
    • ついでにスタートにピン止めしておく
  • /etc/passwordのkoujiを以下のように修正(秘密っぽいところは伏せています)。修正後にCygwinのシェルを再起動。
(修正前)
kouji:unused:1001:513:kouji takao,U-kouji-surface2\kouji,****:/home/kouji:/bin/bash
(修正後)
kouji:unused:1001:545:kouji takao,U-kouji-surface2\kouji,****:/cygdrive/c/Users/kouji:/bin/bash

データの移行

  • ~/work以下
    • 私は C:\Users\kouji/work 以下に作業環境一式を配置していますので、移行元の Surface Pro にて work 以下を tar cpzf work.tar.gz work で圧縮して、移行先の Surface Pro 2 にて tar xpzf work.tar.gz で展開しました。
  • 単純にコピーしたもの
    • \tools
    • \Users\kouji.VirtualBox
    • \Users\kouji.bash_history
    • \Users\kouji.bundle
    • \Users\kouji.gem
    • \Users\kouji.heroku
    • \Users\kouji.lesshst
    • \Users\kouji.relish
    • \Users\kouji.s7
    • \Users\kouji.smalruby-editor
    • \Users\kouji.ssh
    • \Users\kouji.subversion
    • \Users\kouji.travis
    • \Users\kouji.uru
    • \Users\kouji\local
    • \Users\kouji\VirtualBox VMs
    • \Users\kouji\Music\iTunes
  • \Users\kouji.sshCygwinシェルで権限を変更
chgrp -R Users .ssh
cd .ssh
chmod 600 authorized_keys config id_rsa id_rsa.new known_hosts

Ruby関連

基本的に work 配下に Ruby 処理系があるため移行は完了しているので、こまごまとした設定を行う。

cd \
mklink /d Ruby \Users\kouji\work\uru\versions\ruby-2.0.0-p353-i386-mingw32\bin
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
  • PowerShellの設定

    • レイアウト - 画面バッファーのサイズ - 幅: 80
    • レイアウト - ウィンドウのサイズ - 幅: 80
    • レイアウト - ウィンドウの位置 - システム設定を使う: チェック
    • 画面の色 - 画面の背景: 黒
  • Gitのインストール

    • Git-1.8.4-preview20130916.exe
    • Adjusting your PATH environment: Run Git and included UNIX tools from the Windows Command Prompt
    • 次の選択肢は真ん中の「Checkout as is, Commit Unix」みたいなの。
  • Heroku Toolbeltのインストール

    • heroku-toolbelt.exe
  • MySQLのインストール

    • mysql-installer-community-5.6.14.0.exe
  • node.jsのインストール

  • インストール後はPower Shellを再起動させること

とりあえずはこんなところです。

Surfaceグループの紹介

Surface全般を扱うはてなグループ Surface に参加してみませんか? みなさんの参加をお待ちしております!!

Surfaceが帰ってきたので、作業環境を復旧するまでの手順を記録する (その1) #SurfaceJP

修理に出していたSurfaceが戻ってきました、イェイ!

で、 2度あることは3度ある ってことでセットアップの手順をチョー簡単にメモしておきます。本当は詳細なメモを残しておきたいのですが、やりたいことがたんまりあるのでね、急ぎ足ですわ♪

あと余談ですが、本日(2013/11/12)のWindows Updateにて「Surface ProをWindows 8.1にアップデートしてしまったあなた、残念ながらBluetoothのキーボードとマウスのどちらかしか使えません!!」の問題が解消されました!Microsoftの関係者のみなさまに感謝します!!

Windows 8.1

  • いつもの初期設定でスタート画面が表示できるところまで作業する。
    • マシン名は「kouji-surface」
    • すでにMicrosoftアカウントの名前を英語表記でかつ全部小文字(kouji takao)に変えているのでここまでは何も問題ありません。
  • Windowsアップデートを2回行う。約2時間。
    • その間にOfficeのライセンス登録を行う。 修理後は新しいライセンスキーが配布されたよ
  • ストアアプリを起動してWindows 8.1にアップグレード。約2時間。
    • このとき電源設定をハイパフォーマンスに変更して、なおかつディスプレイの電源をOFFにしないようにする。こうしないと勝手にスリープしてしまい、アップデートが途中で止まる。
    • アップデート後はいつもの作業。
  • スタート画面をバックアップから復旧
    • PC設定→SkyDrive→同期の設定、パーソナル設定のスタート画面を「オン」にする。
    • しばらくすると見慣れたスタート画面になる。どのタイミングで同期が完了するかは不明。
  • タッチカバー2のキーボード配列を英語配列から日本語に変更
    • これバグっぽいんだけど設定するしかないってことで
    • コントロールパネル→デバイスマネージャ、キーボード→2つある「HIDキーボードデバイス」のどちらか(私は2番目のものでした)のドライバの更新→コンピュータを参照してドライバー ソフトウェアを検索します→コンピュータ上のデバイスドライバーの一覧から選択します→Surface Type Cover Filter Device。このとき「Surface Type Cover Filter Device」が表示されなかったら「HIDキーボードデバイス」を選ぶところからやり直し。

Emacs: gnupack 24.3-20130503

Emacsさえ動作すれば、あとはどうとでもなる。

  • gnupackからemacs-24.3-20130503.exeをダウンロード・インストール。
    • 展開先は「C:\」

f:id:kouji0625:20131114132736p:plain

  • SkyDrive上のバックアップからdot.emacs.dなどを配置。
    • 以下、管理者権限のコマンドプロンプトで実行。またSkyDrive直下のdotfilesにバックアップを格納していることが前提。
C:\Users\kouji>mklink /d .emacs.d .\SkyDrive\dotfiles\dot.emacs.d
.emacs.d <<===>> .\SkyDrive\dotfiles\dot.emacs.d のシンボリック リンクが作成されました

C:\Users\kouji>mklink .gitignore .\SkyDrive\dotfiles\dot.gitignore
.gitignore <<===>> .\SkyDrive\dotfiles\dot.gitignore のシンボリック リンクが作成されました

C:\Users\kouji>mklink .gitconfig .\SkyDrive\dotfiles\dot.gitconfig
.gitconfig <<===>> .\SkyDrive\dotfiles\dot.gitconfig のシンボリック リンクが作成されました

C:\Users\kouji>mklink .bashrc .\SkyDrive\dotfiles\dot.bashrc
.bashrc <<===>> .\SkyDrive\dotfiles\dot.bashrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .profile .\SkyDrive\dotfiles\dot.profile
.profile <<===>> .\SkyDrive\dotfiles\dot.profile のシンボリック リンクが作成されました

C:\Users\kouji>mklink .gemrc .\SkyDrive\dotfiles\dot.gemrc
.gemrc <<===>> .\SkyDrive\dotfiles\dot.gemrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .inputrc .\SkyDrive\dotfiles\dot.inputrc
.inputrc <<===>> .\SkyDrive\dotfiles\dot.inputrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .minttyrc .\SkyDrive\dotfiles\dot.minttyrc
.minttyrc <<===>> .\SkyDrive\dotfiles\dot.minttyrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .ruby-version .\SkyDrive\dotfiles\dot.ruby-version
.ruby-version <<===>> .\SkyDrive\dotfiles\dot.ruby-version のシンボリック リンクが作成されました

C:\Users\kouji>mklink .screenrc .\SkyDrive\dotfiles\dot.screenrc
.screenrc <<===>> .\SkyDrive\dotfiles\dot.screenrc のシンボリック リンクが作成されました

C:\Users\kouji>mklink .zshrc .\SkyDrive\dotfiles\dot.zshrc
.zshrc <<===>> .\SkyDrive\dotfiles\dot.zshrc のシンボリック リンクが作成されました

いろいろなソフトウェア

  • Windowsストアアプリのインストール
    • 基本的にインストール済みのもの(FacebookTwitter)をすべて再インストールすればいい。
  • iTunes
    • 同時にQuickTime、iCloudコントロール
    • iCloud PhotosはMicro SDXCカードに保存(D:\Pictures\iCloud Photos)
    • 管理者権限のコマンドプロンプトで以下のコマンドを実行
>cd \Users\kouji
>mklink /d "Pictures\iCloud Photos" "D:\Pictures\iCloud Photos"
  • OutlookにGmailのアカウントを設定
    • うぐぅ、はやくIE11上でGmailを使いたい
  • Windows 8.1への機能の追加
    • Media Centerのライセンスを持っているため。ライセンス番号は過去のメール(2013/10/30 (水) 20:43)に記述されている。
    • インストール時に再起動が必要。
  • 7-Zip
    • 7z920-x64.msi をインストール
  • MS-IME
    • これは設定を確認しただけ。あらためて設定しなくてもMicrosoftアカウントに同期しておいた設定を自動で反映してくれたようだ。すばらしい。

Ruby関連

  • Cygwin
    • 32ビット版→64ビット版
    • gcc-core
    • git
    • git-svn
    • make
    • patch
    • libncurses-devel
    • openssl-devel
    • readline
    • libsqlite3-devel
    • libxml2-devel
    • libxslt-devel
    • wget
    • ruby
    • zip
    • unzip
    • screen
    • zsh
    • openssh
    • ncurses
    • Publishing以下のすべて
    • 32ビット版だと、なぜかssh経由でのgit fetchができず。forkに失敗している。CygwinでCan't fork()とかのエラーが出た時の対処法を行ったが解決できない。再起動してもダメだった。念のため、Cygwinを再インストールしてみるがダメだった。64ビット版に乗り換えることにした。ただし、64ビット版だとRuby本体がCygwinの64ビット版のAPIに対応していないため最新版しかインストールできないという...困ったな。
  • RubyInstaller for Windows
  • pik
C:\Users\kouji>pik add C:\Users\kouji\work\pik\versions\ruby-1.8.7-p374-i386-mingw32\bin
INFO: Adding:  [ruby-]1.8.7-p374
  Located at:  C:\Users\kouji\work\pik\versions\ruby-1.8.7-p374-i386-mingw32\bin

C:\Users\kouji>pik add C:\Users\kouji\work\pik\versions\ruby-1.9.3-p448-i386-mingw32\bin
INFO: Adding:  [ruby-]1.9.3-p448
  Located at:  C:\Users\kouji\work\pik\versions\ruby-1.9.3-p448-i386-mingw32\bin

C:\Users\kouji>pik add C:\Users\kouji\work\pik\versions\ruby-2.0.0-p247-i386-mingw32\bin
INFO: Adding:  [ruby-]2.0.0-p247
  Located at:  C:\Users\kouji\work\pik\versions\ruby-2.0.0-p247-i386-mingw32\bin

C:\Users\kouji>pik default ruby-2.0.0-p247

今日はここまで。

Surfaceグループの紹介

Surface全般を扱うはてなグループ Surface に参加してみませんか? みなさんの参加をお待ちしております!!

Windows上のEmacs(gnupack)が強制終了しまくったけど、Emacsの設定を見直したら解決した(かも?)

Windows上でも普通のEmacs(Maedowとかじゃなくてね)が動くのでわくわくしていたのですが、実際には日本語入力をしていると強制終了しまくってなかなかにストレスがたまります。さすがに提供元の手元ではこの頻度では落ちていないだろうので、私のEmacsの設定が悪いのだと考えていました。

問題のある設定

IME関連の修正前の設定は以下です。これだと1時間に一回程度の頻度で日本語の入力中にEmacs自体が強制終了します。

(setq default-input-method "W32-IME")
(setq-default w32-ime-mode-line-state-indicator "[A]")
(setq w32-ime-mode-line-state-indicator-list '("[A]" "[あ]" "[A]"))
(w32-ime-initialize))

なお、インジケータに全角文字を使っている理由ですが、最初は日本語入力のときだけ「あ」と表示させていました(MS-IMEを使っていたらそう設定したくなりますよね♪)。しかし、英語(実際にはdefault)のフォントを「Consolas」、日本語(実際にはjapanese-jisx0208)に「メイリオ」フォントを使っていると日本語入力のON/OFFでステータスバーの高さがぴょこぴょこ変化します。これは嫌だと思って、すべて全角文字にしました。

解決した(かも?)

もしかするとインジケータには全角文字を使ってはダメかもしれないと思って、とりあえず以下の設定で様子を見ることにした(日本語入力時は「あ」と表示させたい...)。

(setq default-input-method "W32-IME")
(setq-default w32-ime-mode-line-state-indicator "[A]")
(setq w32-ime-mode-line-state-indicator-list '("[A]" "[J]" "[A]"))
(w32-ime-initialize))

一日経過しましたが、強制終了されないですね♪

もうしばらく様子を見てみます。