ブラウザなどウィンドウが勝手に最前面になる(常に手前に表示される)件

Internet Explorer のウィンドウがなぜか最前面になる問題に出くわした。

対処方法

当該アプリを再起動する

原因

Windows の仕組みの話になるが、詳しくまとめておく。

まずウィンドウの表示順序は、Windows の仕組みとして以下のようになっている。

  • 直前にアクティブにした順で手前に表示される
  • ただし「最前面」というモードを有効にすると、そのウィンドウは常に手前に表示される
  • 「最前面」モードのウィンドウ同士でも、直前にアクティブにした順で手前に表示される

また「最前面」モードについては、以下のような発動形態になっている。

  • 「最前面」モードは特殊なツール or アプリ側の「このウィンドウを最前面にする」的な機能を使わない限り、有効になることはない
  • アプリによっては自らを最初から最前面モードにしていることもある

本題に入る。

なぜ Internet Explorer が最前面になってしまったのか。とりあえず、

  • 原因1: 特殊なツールで最前面モードにしてしまった

が考えられるので、覚えがあれば解除する。ない場合は、

  • 原因2: Windows あるいは Internet Explorer あるいは特殊ツールのバグ

だと思われる。

なぜかというと、Internet Explorer には「このウィンドウを最前面モードにする」的な機能がないから。ないにもかかわらず、今回このような現象が起きたので、これはバグとしか言いようがない。Windows のバグか、Internet Explorer のバグか、はたまた(最前面モードを設定しているアプリを使っているなら)そのアプリのバグや誤動作か、よくわからないが、どこかがおかしい。

幸いにも、最前面モードという機能は ウィンドウ一つ一つの単位の設定 なので、いったんウィンドウを閉じて、また開き直せばリセットできる。

Critical Mention ―― チャットで個人宛 Mention(メンション) の乱用を防ぐヒント

チャットで Mention されたので見てみたら、ただの情報共有だった……みたいな感じで最近集中を阻害されているので、どうやったら防げるのだろうと考えている。とりあえず Critical Mention という考え方について、荒削りだがまとめてみる。

Mention の問題点

割り込まれること

割り込まれると今やっている仕事が中断され、短期記憶が失われたり注意力が逸れてしまい、創造性や生産性が損なわれる。

たとえるなら対局中のプロ棋士に対して「ねぇねぇ、今ちょっといい?」と割り込むようなもの。

どうすればいいか?

割り込みを減らせばいい。

具体的には Mention の使い方および通知設定を工夫することで、割り込んでまで見てもらうべき Mention(Critical Mention)の数を減らせば良い

言い換えると、以下の二つが必要とも言える。

  • (1) Critical Mention とは何かをきちんと定めること
  • (2) Critical Mention の利用頻度を下げるようなルールや体制や風土を整えること

Critical Mention を定める

(予備知識) Mention の 4 タイプ

まず前提として Mention の種類をまとめておく。以下 4 種類に分類できる。

  • Important Instant …… 「できるだけ早く反応してくれ。重要な用事だ」
  • Instant …… 「できるだけ早く反応してほしいんだが(最悪反応無くてもまあ良い)」
  • Important 「重要だから必ず読め。対応しろ」
  • Talk …… 雑談でメンションしていじる、個人宛 FYI(例:これあなた向けだよ) など

Critical Mention は Instant である

Instant と Important Instant のみを Critical Mention とする べきである。

Instant 以外の Mention はどう扱うか

Instant 以外――つまりは Critical Mention 以外のメッセージについては こちら(Mention を受けた側)のタイミングで読みたい時に読む で良い。

そもそもコミュニケーションはお互いが拘束されるためコストの高い作業である。少ないに越したことはない。特にクリエイティブな仕事のように「個人の集中」を要する場合は、なるべく個人で集中できる環境を整えるべき。

具体的には、コミュニケーションは可能な限りリアルタイムではなく キューイング (要件があれば突っ込んでおく。相手は空いた時に見て対応する。自分のキューも空いた時に適宜確認して対応する)にする。

キューイングなら、自分のキューを適切に確認して対処しさえすれば 個々は邪魔されることなく仕事ができるし、リアルタイムではないがコミュニケーションも取れる。

Critical Mention の運用を阻む原因

私が障害だと感じている原因(特に組織や人に絡むもの)を雑多に取り上げる。

ただし、いくつか注意を。

  • 現実は会社やチームにもよる
  • 本項で取り上げるのは私の観測範囲における場合である
  • 私自身のことは棚に上げる(私も下記全てに完全に当てはまらないかというと必ずしもそうではない)

チャンネル内容を定期的に確認しない人たち

たとえば「連絡事項を #news チャンネルに流しておくから、各自確認して、必要なら各自対応するように」と運用したとする。

このとおりに対応してくれる人は驚くほどに少ない。そもそも見ていなかったり、あるいは見てもその場で後回しする → 忘れる、で結局対応しなかったりする。彼らの言い分として「面倒くさい」「忙しい」などがあるが、要するに情報源を定期的にチェックする要領が無い or 方法を知らないだけである。中には「言われなければ読まなくていいか」という確信犯さえもいる。

※このような(連絡事項などの対処を)自律的に行う作業は、頭だけでは行えない。タスク管理という専用の技術を使う必要がある。

ともあれ、上記のような「各自見といてね」運用は大体破綻する。結局、誰かが Mention や口頭などでフォローすることになる。つまり Critical Mention を使うことになる。

効率、生産性、創造性に無頓着な人たち

「コミュニケーションはリアルタイムよりもキューイング」という発想が通じない人も意外と多い。

効率や生産性といった概念に無頓着で、たとえば PC をデフォルト設定のまま(たとえば IE やメモ帳をそのまま)使っていたり、起動に何十秒と待ち時間があっても平然としていたり、小さな画面の小さなキーボードのノート PC だけで煩雑な作業をしていたりする。

そもそも彼らは ものづくりという創造を知らない ため、これに起因する事項にはまるでピンと来ない。当然クリエイターの性格や性質などは知らないし、考慮や配慮もできない。どころか自分たちの常識(大半はクリエイターにとって害となるもの)を押し付けてきて邪魔してくる。何もしない方が何倍も助かる ことも少なくない。

こういう人たちが多いと、当然ながら Critical Mention という考えも通じない。

職位や立場にこだわる人たち

要するに 「下っ端が何を言っているんだ」 である。

私は本記事のような提案をしたことがあるが、決まって「生意気」「自分勝手」などと称された。別にそのような言動をしたつもりはない。ただ情報として、提案として、雑談チャンネルに書いただけである。

他にも 「従ってたまるか」「これが俺のやり方なんだ!」的なプライド が邪魔をしているケースもある。特に上位職になると、そのやり方でそこまで昇進したわけで、自信の塊なので、これが強い。

正論が常に最適とは限らないことも、人が感情的な生き物であることも、組織である以上立場といった要因があることも知っているが、これらは思っているよりも深く根付いている。下っ端の意見は、まずまともに取り扱われない、読まれないと考えた方がいい。情報や意見の価値はそれらそのものではなく、その発信者で決まる。下っ端というステータスは価値が低いし、一度「こいつはなんかよくわからんことをほざく失礼なやつ」とレッテルを貼られれば、もう挽回はできない。スパム扱いになりさがる。

ルールの遵守に腰が重い人たち

要するに 仕事においてもずぼら な人たちである。

私生活がずぼらなのは勝手だが、仕事はチームプレーなのだから秩序と効率は必要だ。そしてそれらを担保するには何らかの「仕組み」が必要である。だからこそルールだとか規約だとかガイドラインとかいったものがある。プログラミングの世界でもその手のやり方やドキュメントは普通にある。つくるし運用する。

チャット、もっと言えばコミュニケーションのやり方についても同じだ。

ずぼらな人たちはこのような制定や運用を好まないし、「面倒くさいから」「テキトーでよくね?」と従わない。また、このような過ごし方にも慣れていないので腰も重たいし、まして自ら考えて定めようとは思わない。

ここまでを踏まえて、どう行動するか(整備するか)

一案を雑多に取り上げる。ただし検証などはしていない、ただの想像であり、机上の空論かもしれない。

[管理] 雑談チャンネルをつくる

雑談は「見なくてもいい、反応しなくてもいい」チャンネルとして整備する。

間違ってもここに反応必須の連絡事項や相談などを書いてはいけない。

※ただし雑談で話題を振られるケースについてはここでは議論しない(振られたのに無視したら心証が悪い、など対人関係的に考慮すべき事項が出てくるが、本記事で扱う分野ではない)。

[管理] 連絡事項チャンネルをつくる

各自見ておいてね、各自締切までに対応しておいてね、といったネタについても、専用のチャンネルをつくり、そこに投下する。

そうすれば各々は「自分のタイミング(空いた時など)で読んで対応する」だけで済む。割り込みは生じない。

[個人] 了解や完了をリアクションする

連絡や依頼について、何もリアクションがないと「できたの?できてないの?」と不安になり、結局あとで Critical Mention なり口頭なりで割り込む必要性が生じてくる。

そうならないためにも、リアクションはする。

[個人] 定期的にチェックして対応する、という仕事術を覚える

私が思うに、仕事は頭の中だけで行うものではない。それはプログラミングで言えば Main 関数に何の関数化やクラス化もせずにブワーっと書くようなものである。終わらせるのは早いが、優先度の低いものはおろそかになるし、そもそも考慮事項が多いと破綻する。

ではどうするかというと、タスク管理である。

たとえば下記のようなルールを定め、日々まわせるような仕組みをつくる。

  • 連絡事項チャンネルは一日最低一回は目を通す
  • 目を通した内容のうち、対応が必要なものは TODO リストに入れる
  • TODO リスト内の TODO は一日最低一回は目を通し、必要に応じて対処する
  • すべての TODO について、期限以内に対応できるよう、計画的に対処する
  • 無理ゲーや「これやる必要ある?」などは、すぐに相談して調整する

上記のようなことは我流の思いつきでできることではない。タスク管理という専用の考え方が必要になる。……が、現状タスク管理に関するわかりやすい資料などはなく、一部の物好きや意識高い系しか知らないのが現実だ。

その他

おわりに

Critical Mention という概念について取り上げ、Mention という名の割り込みが乱用される問題を軽減するためのヒントを模索してみた。 一部不満たらたらしてるのはご愛嬌。。。

Excel で時刻の差分を分単位で計算する

Excel で 16:09 と 12:11 から 238 分の差がある、みたいな計算がしたかったので調べた。

やり方

  • 計算対象のセルには普通に hh:mm で記入
  • 差分計算を行うセルには以下を記入
    • =(D4-C4)*24*60 のように引き算と 24*60 の掛け算を
    • 書式は [表示形式]タブ > [分類] から 標準 を選ぶ

ちなみにセル書式は Ctrl + 1 で開ける。

気になる挙動やら疑問やら

12:11 - 16:09 の結果は?

Ans: -238

マイナスになる。

hh:mm 以外の不正値を使って計算したらどうなる?

Ans: そもそも計算以前にセル内で正しく時刻表示されない

たとえば 23:60 という値(60分という書き方はない)を入れてみると、「1900/1/1 0:00:00」になったり「1」になったりする。 正しい時刻表記でない場合、その時点で当該セルの値がおかしくなる ので(おかしいことに)すぐ気付ける。

書式設定で「分単位で表示」みたいな表示形式があるのでは?

Ans: 無い。

もしあったら教えてほしい。

参考

Slack でステータス(ログイン状態)を常にオンライン(アクティブ)にする

Slack では 30 分放置すると強制的に Away(離席中) になってしまう。この挙動を変えることはできない。これは「離席中であることをシステムが保証してくれる」点では素晴らしいが、離席しているのがバレるというデメリットもある。というわけで、でもないのだが、離席中にならないようにする方法を考えてみた。

最初に結論

  • Slack の設定上からは(REST API を使っても)実現できない
  • 常にアクティブを実現したいなら、(30分未満の頻度で活動を行う)ツールやスクリを仕込むしかない
  • で、できたの?
    • Ans: 一応できたっぽい
    • AutoHotkey で「Slack のブラウザウィンドウの定期的なアクティブ化を自動化する」でいけた

まずは仕様をまとめとく

ステータスとログイン状態

Slack の用語では

  • ステータス(Status)
  • ログイン状態(Availability)

の二つがある。

ステータスとは「会議中」や「病欠」など、自分で任意に設定できる テキスト

ログイン状態は アクティブ(Active) or 離席中(Away)のいずれか二値を取る状態

本記事でいうステータスとは後者、ログイン状態のこと。以降では「ログイン状態」という呼称を使うことにする。

ログイン状態の仕様

一言で:

  • Slack の仕様なので 変更や停止は不可能
  • 30分 未活動だと離席中(Away) になる

Slack のステータスを設定する – Slack によると、離席中と判断されるのは、

  • デスクトップの場合、『非アクティブ状態が 30 分間続いた』
  • Webブラウザの場合、『ブラウザの非アクティブ状態が 30 分間続いた』
  • モバイルの場合、『アプリを切り替えた』『Slack を終了した』『画面をロックした』

続いて REST API として User presence and status | Slack を見てみると、

  • active と away の二値
  • 30分未活動なら away になる。これは slack の仕様で変更不可、停止不可
  • user.setPresence を使えば away(ずっとaway) or auto(上記の30分awayルール) をセットできる
    • 常に active は無理

常にアクティブにする戦略を考える

デスクトップアプリ、Webブラウザ、モバイルと 3 パターンあるが、モバイルは除外する。

いずれにせよ「30分活動しなかったら離席中になる」仕様なので、だったら 30 分以内に何かしら活動する よう仕込めばいい。

残る不明点

  • 活動とは何か
  • どうやって活動を仕込むか

活動については(よほど Slack の実装がひねくれてなければ) mouseover, mouseclick あたりが該当するだろう。つまり Slack の画面内でマウスカーソルを動かす or マウスクリックできればいい。

どうやって仕込むか

実現方法として以下 2 パターンが考えられる。

  • (1) ブラウザの機能(拡張機能など)でマウス操作をエミュレート
  • (2) OSの機能(たとえばクリック自動化ツール or マウス操作を行えるスクリを書く)でマウス操作をエミュレート

また、いずれにしても仕込む際は以下 3 ケースを考慮する必要がある。

  • (A) 離席中(Slack のウィンドウを30分以上アクティブにしなかった)
  • (B) 離席中(Slack のウィンドウはアクティブだが、30分以上操作しなかった)
  • (C) 離席中(PC ロックをして30分以上経った)

注意すべきが (C)。PC ロックすると画面が PC ロック画面になってしまうため、特に (2) で「指定座標をクリックする」ようなやり方を採用していた場合に、自動化が効かなくなる。

試してみた

本題。以下方法を試した。

  • [1] Firefox Quantum + Tampermonkey で、Slack の入力欄を 1 秒間隔でクリックするスクリプト
  • [2] Windows + AutoHotkey でウィンドウアクティブ化を自動化するスクリプト

各方法に関する詳細解説は割愛。スクリだけ載せる。

[1] (失敗) Tampermonkey でクリック自動化

結果:

  • PC ロックして放置 → 動作せず(30分で離席中になった)
  • PC ロックせずに放置 → 動作せず(30分で離席中になった)

Tampermonkey – Get this Extension for Firefox (ja)

// ==UserScript==
// @name         Slack always active
// @namespace    http://tampermonkey.net/
// @version      0.1
// @author       You
// @match        https://(YOUR-TEAM).slack.com/messages/(CHANNEL_ID)/
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
// @grant        none
// ==/UserScript==

function touch(){
    $('#msg_input').click();
}
$(function(){
    setInterval(touch, 1000);
});

スクリプト解説:

  • Slack のメッセージ入力欄を 1 秒ごとにクリックする
  • メッセージ入力欄にフォーカスが当たる = Slack 側で Active とみなすのでは?という仮説
  • 結論: 仮説は間違っていた

[2] (成功) AutoHotkey でウィンドウアクティブ化を自動化

結果:

  • PC ロックして放置 → たぶん成功?
  • PC ロックせずに放置 → 成功
#Persistent
#WinActivateForce

Loop
{
  SetTitleMatchMode, 2

  WinActivate, Slack - Mozilla Firefox
  sleep, 1000*3

  WinActivate, ahk_class Progman
  sleep, 1000*30
}

スクリプト解説(AHKスクリプトに書いてたコメントを載せただけなので多少見づらいが):

; Slack のブラウザウィンドウを指定インターバルでアクティブにする. ただし,
; - 既にアクティブの場合は何もしないに等しくなるので,
;   別のウィンドウ(ここではデスクトップ)をアクティブにする操作もはさむ.
; - PCロックから復帰した時に Slack が Active かどうかを見たいので,
;   Slack ウィンドウがアクティブになりづらいように Sleep する.
;   (はさむ方のウィンドウを長めにアクティブにする)
;   → 何が言いたいかというと、PC ロックを解除した直後に
;      「PC ロックせずに放置」時の挙動で Active になったのを
;      「あ、PC ロックして放置しててもアクティブじゃん」と誤解してしまうのを
;     防ぎたいという話.

『PC ロックして放置 → たぶん成功?』って何?:

  • 30分以上ロックして放置する実験がだるかった
  • 数回ほど試したけど、ぶっちゃけ上記の『「あ、PC ロックして放置しててもアクティブじゃん」と誤解してしまう』をしてしまったかもしれないので「成功!」と言えない
  • 気が向いたら実験し直す予定

参考

本記事を書くきっかけになった記事。

Auto mouse mover.

などヒントが得られた記事。

Windows 7 で太った Temporary Internet Files を削除する

Windows を重くする一因、「ファイルが多い」「ファイルサイズがでかい」を軽減するために、あちこち不要ファイルを削除してまわっている。Temporary Internet Files(インターネット一時ファイル)もその対象で、規模は(環境次第だが当環境では)ファイル数何千、サイズも 1 GB 超だった。

早速消そうとしたのだが、ちょっと苦戦したのでメモ。

Temporary Internet Files フォルダの開き方

ファイル名を指定して実行などから「shell:cache」で。

すると「C:\Users\...\AppData\Local\Microsoft\Windows\Temporary Internet Files」みたいなフォルダが開かれるはず。

Temporary Internet Files フォルダの中身について

インターネットの一時ファイルが置いてある。

ファイルを削除する

本題。ちょっと面倒くさい(複数のやり方が必要)。

(1) インターネットオプション

ファイル名を指定して実行などから「inetcpl.cpl」で開く。

[全般] タブ > 閲覧の履歴 > [削除] ボタン > インターネット一時ファイル及び Web サイトのファイル

これで Temporary Internet Files の 一部のみ 消える。全部は消えてくれない。その証拠に、Temporary Internet Files のプロパティからサイズを見ても、あまり変わってないと思う。

(2) 隠しファルダ内

実は Temporary Internet Files 内には隠しフォルダがあって、Office 系の一時ファイル も保存されている。こいつらが何百 MB を占めていることが多い。

これらフォルダの存在は dir /a コマンドで見れる。

$ cd
C:\Users\....\AppData\Local\Microsoft\Windows\Temporary Internet Files

$ dir /ad /b
Content.IE5
Content.MSO
Content.Outlook
Content.Word
...

Content.XXXX フォルダである。 Temporary Internet Files といいつつ、インターネット無関係の Office 系の一時ファイルも保存しているのである

これらの一時ファイルを消すには、エクスプローラーから上記フォルダ名を入力して開き(あるいはコマンドプロンプト上で操作してもよいが)、中身をまるごと消せば良い。

その後、Temporary Internet Files フォルダのプロパティからサイズを見てみると、減っているはず。

Before/After

(1) と (2) で一通り消せば、1GB が 20MB くらいになったりする。

秀丸エディタ上でアウトライナーを実現する houtliner

秀丸エディタ上でアウトライナーを実現する houtliner を公開した。

中身

  • 強調定義ファイル
  • マクロ
  • バッチファイル(一部機能をマクロから呼び出して使う)

入手、インストール、マニュアルについて

入手とインストールについては以下。

アウトライナーのコンセプトについて

2ペイン

アウトライナーには 1 ペイン型と 2 ペイン型があるが、houtliner は 2 ペイン型。

以下の 2 つのペインがある。

  • アウトラインを書き連ねていく「編集領域」
  • アウトライン全体(セクション、レベル1、レベル2の計 3 段)を俯瞰したり操作したりする「アウトライン枠」

アウトライン枠の表示位置は上・下・左・右から選べる。また非表示も可。

情報の構造(ファイル/セクション/アウトライン/ズーム)

情報の構造としてファイル、セクション、アウトライン、ズームがある。

  • ファイル
    • .outline ファイル
    • 複数のセクション、複数のアウトラインを持てる
  • セクション
    • 複数のアウトラインを持てる単位で、フォルダみたいなもの
  • アウトライン
    • 箇条書き
    • レベルは無限だが、色分けされるのはレベル6まで
  • ズーム
    • 箇条書き一行に「ファイル一つ分の記入領域」を付与したもの

文法

  • セクションは「・・」はじまりの行
  • アウトラインは「・」はじまりの行
  • アウトラインのレベルは 半角スペースの個数 で区別する
    • レベル1は0個、レベル2は1個、レベル3は2個……
  • 強調系は以下のとおり
    • 引用は「>」はじまり(全角可)
    • (TODOリストなどの)完了は「x」または「X」はじまり(全角可)
    • 太字は「@」で囲む(全角のみ)
    • かっこ(「」と『』)
    • リテラル(バックチック ` で囲む)

日本語を書く

houtliner は日本語でアウトラインを書くことを想定している。

ゆえに以下性質がある。

  • 箇条書きの「・」にせよ太字の「@」にせよ全角文字
  • 他の文法についても全角文字半角文字どちらでも強調されるようになっている(全角のまま打つことを考慮している)
  • 日本語文でよく使う「」『』も強調する

サポートする操作

アウトラインプロセッシングを円滑にするために、色々と操作を用意している。

  • 折りたたみ(現在位置のアウトライン表示を折りたたむ)
  • 移動 …… 現在位置のアウトラインやセクションを、一つ前または後に移動
  • 並び替え …… アウトラインやセクションを D&D で並べ替え
  • フォーカス …… 現在位置のアウトライン以外を編集できないようにする(現在位置のみの編集に集中するモード)

なぜ houtliner を使うのか(他のアウトライナーではダメなのか)

オフラインで使いたいから

アウトライナーとして名を馳せているのが WorkFlowy や Dynalist だが、これらはクラウドサービスである。オンラインでないと使えない。

テキストエディタの便利機能をフル活用したいから

私がクラウドサービスでテキスト編集を行わない理由の一つが、エディタとして貧弱だからである。ローカルのテキストエディタの方が高速だし、何より高機能でカスタマイザブルだ。テキストエディタに慣れていると、クラウドはストレスでしかない。

さて、アウトライナーだが、これは小説やプログラミングのようにガシガシテキストを書くものだと私は考えている。ゆえにガシガシ書けるポテンシャルが必要だ。少なくとも WorkFlowy や Dynalist 程度では務まらない。

たとえば秀丸エディタには以下機能がある。

  • 検索/置換
  • 行ブックマーク
  • ファイルブックマーク
  • ウィンドウ分割(一ウィンドウ内を縦横or上下で二画面に分割する)
  • ファイルマネージャ枠(今開いているファイルのあるフォルダ内を一覧表示するペイン)

ブラウザアプリのただのテキストエリアよりも何倍も、何十倍も使いやすい。

データをファイルで扱いたいから

私はエンジニアということもあり、アウトラインを書いたデータはファイルとして管理したい。バージョン管理したいし、grep をはじめツールやスクリプトでの利活用・加工編集もしたい。

houtliner は .outline ファイルという形でデータをつくるため、ファイルとして管理することができる。

秀丸エディタ上で使いたいから

これは完全に私の好みだが、私が普段使っている秀丸エディタ上で実現したかった。

FAQ

Q. 1ペインは実現できない?

Ans: できない

秀丸エディタの仕様上、できないと思われる。

詳しくは 秀丸エディタで 1 ペインのアウトライナーを実現できない理由 - stamemo を。

バッチファイルを実行した後に編集しようとするとなぜか System プロセスにロックされていて編集できない件 in Windows 7

不思議な現象が起きた。

あるバッチファイル xxxx.bat を実行した後、xxxx.bat をテキストエディタで編集しようとすると、なぜかロックされていて上書き保存できない。Process Explorer で犯人を調べてみると、System プロセスがロックしている。どういうこと?

事象

Windows 7 Pro にて。

  • バッチファイル xxxx.bat を実行した後、xxxx.bat をテキストエディタで編集しようとすると、なぜかロックされていて保存できない
  • Process Explorer で犯人を調べてみると、System プロセスがロックしている
  • このロックは数十秒ほどで消える

原因

Windows 7 のバグらしい。Application Experience サービスを無効にしていると発生することがある らしい。

解決方法

Application Experience サービスを有効にする

services.msc などからサービス画面を開いて、Application Experience を手動&開始にする。そうしたら当方環境でもあっさり直った。

補足

Process Explorer で指定ファイルをロックする犯人を調べる方法

  • [Find]メニュー > Find Handle or DLL > 調べたいファイル名を入れて検索する

何かヒットすれば、そいつが犯人。

今回の場合だと、xxxx.bat を入力して検索したら、System プロセスがヒットしていた。

うざい Application Experience を止めるにはどうしたら?

タスクスケジューラー上のスケジュールを無効にするだけに留めておく。

具体的には \Microsoft\Windows\Application Experience 配下のスケジュールたち。

秀丸エディタで 1 ペインのアウトライナーを実現できない理由

アウトライナーは 2 ペインよりも 1 ペインが使いやすい(シームレスだから)が、秀丸エディタでは 1 ペイン型のアウトライナーを実現できそうにないことがわかった。試行の過程を書き殴っておく。

前提

  • 秀丸エディタ V8.58

現状の成果物

houtliner というブツとして公開している。

github.com

中身は強調定義ファイルとマクロのセット。「・」から始まる箇条書きをアウトラインと捉え、折りたたみやアウトライン枠などの機能を提供する感じ。

2 ペインのアウトライナーを一応実現できていると思う。

以下、実現にあたって欠かせないコアな部分を軽くまとめておく。

アウトライン解析の枠

秀丸エディタには「アウトライン解析の枠」というペインがある。

これは指定した書式に一致する行を「見出し」とみなし、その見出しを階層込みで目次のように表示するペインである。たとえば Markdown の見出しを実現するなら、「# ……」を大見出し、「## ……」を中見出し、というふうに解釈させる(指定は正規表現を使う)。

このペインを使えば、見出しの単位で目次を一覧表示できるため文章全体の視認性が向上する他、クリック一発で指定見出しにジャンプしたり、D&D で並び替えができたりもする。

折りたたみ

折りたたみとは、指定した書式に一致する行(が包含する部分)を丸ごと折りたたむ(表示上見えなくする)機能である。

これを使えば、たとえば「この大見出し以下の文章を折りたたむ」といった使い方ができる。1 ペインのアウトライナーを実現したいなら欠かせない。

すべて折りたたみ

これは折りたたみ操作を文書全体に適用する操作である。

ちなみに、レベルを指定した折りたたみはできない。たとえば「中見出し以下をすべて折りたたむ」といったことはできない。すべて折りたたみは、必ずトップレベル(大見出し)単位での折りたたみになる。

1 ペインに向けて

houtliner を元に、1 ペインのアウトライナーを実現しようと思う。

しかし道のりは険しく、そして潰えていることがわかった。順に見ていく。

ゴールを定める

まずは「何をしたら 1 ペインを実現したと言えるか」を定めたい。

以下三つを満たすもの、と定めよう。

  • (1) 任意のアウトラインについて、その配下を自由に折りたたみ・折りたたみ解除ができる
  • (2) 文書全体について、指定したレベルですべて折りたたみ・折りたたみ解除ができる
  • (3) 折りたたんだテキストを編集(たとえばコピペや並び替え)しても、折りたたみは解除されない

これだけ実現できれば、アウトライン解析の枠がなくても、十分アウトライン内を縦横無尽に行き来できる。

あとは、これら 1~3 をすべて実装するだけだ。

(1) 単体配下の折りたたみ

結論: 実現できる

というより、houtliner で既に実現できている。

マクロで言えば以下部分。

if(#si==#I_TOGGLE_FOLD){
    if(folded==1){
        unfold;
        endmacro;
    }

    // 0x0002 インデントの深さ

    // fold の挙動:
    //   if カーソル行が折りたたみ可能 → 折りたたむ
    //   if カーソル行が折りたたみ不可 → 折りたたみ可能行にジャンプ

    if(foldable(0x0002)){
        fold 0x0002;
        endmacro;
    }

    // ここに来た = 折りたたみ不可能.
    //   案1: fold x2 で直近の親で折りたたむ
    //   案2: 折り畳まない
    // 試用したところ, 案1 で直近の親にカーソルが移るのは煩わしいと感じた.
    // 案2で.
    /*
    // fold を二回行えば, 折りたたみ可能行にジャンプ → 折りたたむ, ができる.
    fold 0x0002;
    fold 0x0002;
    */
    endmacro;
}

細々としているが、要するに

  • もし既に折りたたまれているなら → 折りたたみを解除する
  • もし折りたたまれていないなら → 折りたたむ

上記が上手いこと動くように工夫しているだけだ。命令で言えば fold と unfold の二つを使うのみ。

(2) 指定レベルでのすべて折りたたみ

結論: 実現できない

すべて折りたたみを行うには foldall 命令を使うしかないのだが、この命令に「指定レベルでたたむ」的なパラメーターが存在しない。

if(#si==#I_FOLD_ALL){
  // 0x0002 → どんな表現を折りたたみ対象行とみなすかの指定(0x0002はインデントベース)
  // 0      → 確認ダイアログを出さない
  foldall 0x0002, 0;
  endmacro;
}

パラメーターは上記の二つだけである。

理想を言えば、以下二つの命令が欲しい。

// レベル3以下のみすべておりたたむ
foldall 0x0002, 3, 0;

// カーソル行が折りたたみ対象行として何レベルであるか(-1、0~n が返る)
foldlevel;

(3) 折りたたんだテキストが勝手に解除されない

結論: 実現できない

現状の秀丸エディタでは、折りたたんだテキストに対してコピペで並び替えをしたり、「前(後)の見出しに移動」で移動したりすると、折りたたんだテキストが勝手に開かれてしまうという仕様がある。

そして、これを制御する設定は、設定画面およびマクロ命令を一通り見た限りでは、存在しない。

理想は おりたたんだテキストは、ユーザーが明示的に解除しない限り、展開されない 仕様にすることだろう。アウトライナーにおいては「レベルnまで見る」といった用途でレベルn以下をすべて折りたたむ、という用途が多い。勝手に展開されては困るのだ。

ここまでの結論

以下理由により、秀丸エディタでは 1 ペインのアウトライナーは実現できない。

  • (2) 指定レベルでのすべて折りたたみ、に対応していないから
  • (3) 折りたたんだテキストが勝手に解除されない、を満たさないから

もう少し粘る

秀丸エディタの強みは「アウトライン解析の枠」だ。私も日頃からお世話になっているし、秀丸エディタから離れられない理由でもある。

仕方ないので、「アウトライン解析の枠」を使った 2 ペインベースで、1 ペインに近い使い心地を実現する 方向で頑張ってみることにする。

まずは「アウトライン解析の枠」の機能をチェック

まずは上記 3 要件が、枠の範囲内で実現できるかを調べてみる。調べてみた。結果は、

  • OK (1) 単体配下の折りたたみ
  • OK (2) 指定レベルでのすべて折りたたみ
  • NG (3) 折りたたんだテキストが勝手に解除されない

となった。勝手に解除される件以外は、実現できる。

……ひとまず (3) は諦めることとして、(1) と (2) のみ満たした妥協案の実現を考える。

(1) はカーソルキーで既にたためる。

(2) についても、実は実現できる。

以下の部分だ。

if(#si==#I_LV1){
    #ret = sendmessage(outlinehandle, 0x111, 7181, 0);
    endmacro;
}

if(#si==#I_LV2){
    #ret = sendmessage(outlinehandle, 0x111, 7182, 0);
    endmacro;
}

わかりづらいのでヘルプから抜粋する。

7181 ツリー表示:レベル1まで展開
7182 ツリー表示:レベル2まで展開
7183 ツリー表示:レベル3まで展開
7184 ツリー表示:レベル4まで展開

つまり レベル4までなら、指定レベル配下のみすべて折りたたむ を実現できる。houtliner にも既に搭載済だ。

ゴールを決める

もう一度ゴールを決める。

実現したいのは「2ペインでも、1ペインみたいに使えるアウトライナー」。

具体的には、私は vi の概念を取り入れることにした。

vi には モード がある。編集モードとコマンドモードがあり、これを切り替えて操作する。これと同じ概念を取り入れる。つまり、

  • 本文編集モード(文章編集)
  • アウトライン解析の枠操作モード(折りたたみはじめアウトライン操作)

この二つである。

「そんなの既に実現できているじゃないか」と思うかもしれないが、そうじゃない。vi がキー一つでモードを行き来できるように、秀丸エディタでもキー一発で行き来したい。 それくらいシームレスでなければ、1 ペインみたいに使える、は実現できないだろう

おそらくはキー割り当てを使うレベルでカスタマイズが発生するはずだ。しかし、不可能ではなさそうだ。

早速、実装をはじめた。

思わぬトラブルに遭遇

ここで思わぬトラブルに遭遇した。

アウトプット解析の枠の表示設定はグローバルで一つ、というものだ。

言うまでもなく、アウトプット解析の枠に表示する内容はファイルタイプ別ごとに異なるので、表示設定もファイルタイプ別に分離されているべきだが、実はそうなっていない。

アウトライナー用に表示内容を変えた(たとえば表示位置=上、表示領域も大きめ)とする。すると、他のファイルタイプにおける枠も同じ表示になってしまう。これは言うなれば「アウトライナーを実現したいなら、アウトプット解析の枠というグローバルな設定は私のためだけに使いなさい(他の設定は知らんがな)」である。

既に Markdown などでアウトプット解析の枠を使っている私としては、これは容認できない。せめてアウトプット解析の枠の表示状態をマクロで変えることができるならば、まだ手を打てなくもないが、そんなマクロはない。詰んだ。

さらに粘る

淡い期待をする。

「最新版では上記で挙げた機能が実はサポートされていたりする?」

というわけで覗いてみたのだが、

残念ながらその旨はなかった。

本当に詰んだ。

おわりに

というわけで、秀丸エディタで 1 ペインアウトライナーを実現する試みは潰えた。悔しい。

git diff --name-status で出る R100 って何?

git diff --name-status をラップしたスクリプトを常用しているのだが、ある日 R100 という見慣れないステータスが表示されたので、ちょいと調べてみた。

表示サンプル

こんな感じ。

$ git diff origin/master --name-status
R100    gtd_gomi.md     gtd/home/gtd_gomi.md
R100    gtd_projects.md gtd/home/gtd_projects.md
R100    gtd_trigger_list.md     gtd/home/gtd_trigger_list.md

書式と意味

書式は (操作一文字)(一致スコア三文字)

一番よく見るのは R100。これは「Rename された」もので「内容は100%一致するよ」の意。

参考

Sublime Text 3 で F5 キーによる Sort Lines を無効化する

Sublime Text 3 には F5 キーに Sort Lines(行の並び替え)という暴力的な操作が割り当てられています。うっかり押してしまうと、表示中のテキストがソートされ破壊されてしまいます……。危なすぎますよね。というわけで、これを防ぐ方法をまとめてみました。

設定方法

(1) File メニュー > Preferences > Key Bindings を開く。

すると設定ファイルが開かれます。

(2) Default(OSX).sublime-keymap - User の方に、以下を追記してください。

[
  { "keys": ["f5"], "command": "noop" },
  { "keys": ["ctrl+f5"], "command": "noop" }, 
]

追記後、上書き保存します。これで完了です。

動作確認

File メニュー > Edit > Sort Lines の項目に F5 が表示されていないことを確認してください。

表示されていないなら成功です。

(余談) 上記設定内容の解説

Sublime Text 3 においては、「何も割り当てない」を実現するために、

  { "keys": ["f5"], "command": "noop" },

上記のように noop コマンドを割り当てる必要があるみたいですね。コマンドの指定を省略したり、適当な文字列で埋めたりしても上手くいきませんでした。

参考: keyboard shortcuts - How to unbind a key binding in Sublime Text 2? - Stack Overflow

おわりに

F5 キーの Sort Lines 発動を無効にする手順をまとめてみました。これでうっかり F5 キーを押してびっくりすることもなくなります。

Mac で Sublime Text 3 の検索窓に日本語を入力する方法(特別な設定要らず)

Mac 版 Sublime Text 3 で日本語検索を行おうとすると、入力した日本語が消えてしまい検索できません。調べてみると面倒くさそうな設定を行わせる記事にヒットしますが、実は設定無しでも入力は可能です。

入力手順

  • (1) かな入力モードで日本語を入力する
  • (2) スペースキーを押す(すると変換候補が出ます)
  • (3) 必要ならカーソルキーで候補を選ぶ
  • (4)「あ」を入力(打ちやすい文字キーなら何でも構いません)

すると、「あ」以前にある日本語が確定し、入力されます。あとは「あ」を消去するだけです。

ポイントは (3) の後に Enter キーで確定しないこと です。もっと言えば Enter キーで確定するのではなく、 「あ」を押すことで前に入力されていた分を確定させる とも言えます。

Q: ひらがなを打ちたい場合はどうすればいい?

Ans: (3) の候補選択時に、ひらがなを選んでください

たとえば「べんきょう」と入力したい場合、(2) でスペースを押した時点で「勉強」が候補になります。この後、カーソルキーを二回ほど押せば ひらがなの「べんきょう」を選択できます。

練習してみよう

早速練習してみましょう。

お題:『Enter キーを使わずに "入力の練習" と入力してください』

答え

おそらくこんな感じになるはずです。

  • "にゅうりょく"
  • スペースを押して、"入力" (まだ未確定)
  • A キー を押して "あ" を入力(ここで "入力" 部分が確定)
  • Delete で "あ" を消去
  • "の"
  • スペース、↓、↓を押して、変換候補として "の" を選択(まだ未確定)
  • A キー を押して "あ" を入力(ここで "の" 部分が確定)
  • ...

慣れるまで少し戸惑いますが、慣れたらサクサクと入力できます。

おわりに

設定なしで Mac の Sublime Text 3 検索に日本語を入力する方法についてご紹介しました。

「設定するのが面倒くさい」という方は試してみてください。

また、このテクニックをおぼえておくと、Sublime Text 3 以外に日本語を入力できない部分でも使えます。覚えておいて損はないでしょう。

Outlook 2013 で仕分けルールが削除できなくなった件

Outlook 2013 で仕分けルールが削除できない、というか全く編集できなくなるという問題に出くわした。「レジストリまたはインストールに問題があるため……」というエラーが出て何もできない。この問題に対処したのでメモ。

現象

ファイル > 仕分けルールと通知の設定 を選ぶと、以下エラーダイアログが出る。

1 つまたは複数の仕分けルールにはエラーが含まれています。仕分けルールを削除するか、変更してください

f:id:stakiran:20190109192025j:plain

また、仕分けルールと通知画面にて、何か編集して OK ボタン or 適用ボタンを押すと以下エラーダイアログが出る。そして OK や適用ができない。

レジストリまたはインストールに問題があるため、操作は失敗しました。Outlook を再起動し、もう一度実行してみてください。まだ問題が解決しない場合、Outlook を再インストールしてください

f:id:stakiran:20190109192040j:plain

つまり 仕分けルール設定を全くいじれなくなる という、結構致命的な現象。

発生原因

推測だが、以下を満たすとたぶん発生する

  • クライアントルールで仕分けルールを作っている
  • 当該ルールが(「指定フォルダーへ移動する」設定で)参照するフォルダを削除した

つまり、クライアントルールの仕分け先フォルダが存在しなくなることが原因だと思われる。

対処方法

仕分け先フォルダを、適当なフォルダに変える

  • 仕分けルールの説明 のところにある「指定フォルダーへ移動する」一文の、指定リンクをクリック
  • 適当なフォルダを選択して OK

f:id:stakiran:20190109192131j:plain

これで 赤文字だった仕分けルールが黒文字に戻るはず。これでこのルールは削除なりなんなりできる。

上記対処を、赤文字になっている仕分けルール全てに対して実施する。

(参考) 情報源

support.office.com の公式にて情報があった。

The issue may occur after installing the following perpetual updates:

Windows Update が原因です。

Warning: We do not recommend removing security updates as a workaround for this issue.

(原因となる更新プログラムは特定できてますが)削除は推奨しません。

The Outlook Team is working on fixes.

この問題は現在対処中です。

If you need to preserve the client side rules please wait for the fix to be released.

もしクライアントルールとして仕分けルールを持ちたいなら、我々が直すまで待ってください。

という、割とふざけた内容……。

(余談) 「仕分けルール」は英語で言うと?

今回原因を調べるのに英語名を知る必要があったのでメモ。

英語名は Manage Rules and Alerts

Rules。「仕分け」的な意味は無いのね……。探すのに苦労した(Outlook の英語版の画像を画像検索で探すというアプローチで何とか見つかった)。

Outlook 2013 で肥大化した古いメールを整理する一案は「CSVでバックアップして消す」

肥大化した古いメールがサイズ(.pst データファイルのサイズ)を圧迫しているため、消したい。でも、もしかしたら後で読む必要性が出てくるかもしれないので消せない……と悩んでいた。そこでバックアップしてから消すという方法を取ることにした。

全体手順

  • 古いメールは CSV 形式でエクスポート(バックアップ)する
  • エクスポート後、当該メール(の入ったフォルダを丸ごと)を削除する
  • 最後に Outlook の圧縮操作を実施する(これしないと .pst ファイルサイズに反映されない)

1: CSV 形式でエクスポート

  • ファイル > オプション > 詳細設定 > エクスポート 部分の「エクスポート」ボタン。ウィザードが開くはず
  • ファイルにエクスポート、次へ
  • テキストファイル(カンマ区切り)、次へ
  • エクスポートしたいフォルダーを選択した後、次へ
    • サブフォルダはエクスポートされません……
  • エクスポート先のファイル名を変えた後、次へ
    • 前回のファイル名はそのまま残るのでちゃんと変えないと、前回保存したファイルを上書きしちゃいます……
  • 完了ボタン

これをバックアップしたいフォルダの数だけ実施する。サブフォルダがエクスポートされないのが面倒くさい。

2: 当該メールを Outlook 上から削除

メールの入ったフォルダを丸ごと削除するかと思う。

ごみ箱を入れただけではダメ。ごみ箱も空にすること。

3: Outlook の圧縮操作

  • 左ペインから対象ツリーを選び、右クリックから「データファイルのプロパティ」
  • 全般タブの詳細ボタン
  • 今すぐ圧縮ボタン

これで .pst データファイルに圧縮処理が入り、削除したフォルダの分が実際に反映される。なお圧縮処理にはしばし時間がかかる。

ちなみに私は去年の年末、この整理作業を行って .pst ファイルを 500MB から 200 MB に圧縮した。

(補足1) CSV ファイルのフォーマット

  • 一行一メールでずらりと並ぶ
  • 列のフォーマットについては下記
  • 列について(当環境の場合。他環境でどうかは不明)
    • 差出人や宛先などは人名で表示され、メールアドレスは記録されていない
    • メールヘッダも記録されていない

列について

列はたとえば以下のような感じ。

"件名","本文","差出人","宛先","CC","BCC","重要度",,...

どんな列が存在するかは環境次第(会社次第)で異なると思われる。

※詳しくは知らないが Outlook 含む Microsoft Office 製品は、組織全体で一つの配信サーバーを持ち、各社員(が使っている PC の Office 製品)はこのサーバーの命令に従って動く、みたいな形態になっているのだと思う。だから配信サーバーが「Outlook のメールデータにはこの列とこの列と……この列をサポートする!」と決めていれば、各社員は逆らうことができない。このルールは当然ながら組織次第で異なってくるはず。

ちなみに、1: の手順で完了ボタンを押す前にフォーマットをいじれるボタンがあり、そこを使うとエクスポート対象列を絞れる。以下は 4 つに絞った例。

"件名","本文","差出人","宛先"

(補足2) FAQ

Q: エクスポートを pst ファイルでしないのはなぜ?

Ans: pst ファイルだと閲覧しづらいから。

pst ファイルは Outlook でないと見れない上、Outlook で開くと左ペインにツリーとして追加されるという挙動になる(pst ファイルの中身単体を単体のウィンドウで閲覧できる、という感じではない)。

つまり Outlook のデータファイル(へのポインタ)はグローバルにただ一つだけ管理されており、pst ファイルを開く=ポインタを追加する、という動作 になっている。当然ながら、バックアップした pst ファイルを消したり置き場所を変えたりしたら、Outlook 側が「データファイルが見つからないんだが?」と毎回エラーを吐く。エラーをなくすために、また pst ファイルを戻して……と対応に苦労した。

Q: CSV ファイルはインポートはできる?

Ans: 試してないので知らない。

とある秀丸エディタヘビーユーザーの秀丸エディタへの要望

私は秀丸エディタにどっぷり浸かっている。欲しいと思う機能も色々とある。要望と題してざっと書き殴ってみた。

強調表示の設定数を増やして欲しい

  • Actual) 8 + 4 + 4 = 16 個しかない
  • Expect) 32 個くらいは欲しい

理想を言えばn個(制限無し)。たとえば「月、火、水、木、金、土、日それぞれの文字に別の強調を割り当てる」くらいはやりたい(拙作 Tritask 用)し、「スペース2個インデント」と「4個」「6個」「8個」なども別々の色で強調(開発中のアウトライナー文法で使う予定)させたい。今の16個だと全然足らない。

アウトライン解析枠内の表示文字列にキャプチャを使いたい

  • Actual) 解析枠に余分な文字(見出し文法)も表示される
  • Expect) キャプチャを使って余分な文字を省きたい

たとえば Markdown の見出し記法をアウトラインで認識させる場合、大見出しなら正規表現で ^(\#)([^\#]+)$ などと書くのだが、この時、アウトライン解析枠には \2 を指定する、みたいなことがしたい。

今はこの機能が無いため、アウトライン解析枠には常に # xxxx が表示されてしまう。# 部分は邪魔だ。キャプチャ指定に対応していれば、この邪魔部分をカットできる。

複数行コメント内の「行の強調」を無効にしたい

  • Actual) 複数行コメント内でも「行の強調」が働いてしまうため見た目がノイジー
  • Expect) 無効にしたい

今は複数行コメント内でも「行の強調」が働いてしまうため、ちょっと見栄えが悪い。

Grep 機能に指定ディレクトリを除外する設定が欲しい

  • Actual) 除外手段が無いので .git や node_modules があると死ぬ
  • Expect) 除外したい

.git やら node_modules やらを除外したいのだが、秀丸エディタの Grep 機能だけでは除外できない。

.git の場合は拡張子を指定すれば回避できるが、node_modules 内には js ファイルなどもあるので、js ファイルに対して Grep したい場合は詰む。

文字数ダイアログの設定を複数持ちたい or 切り替える手段が欲しい

  • Actual) 設定はグローバルで一つのみ
  • Expect) 複数設定を持ちたい or マクロで変更する手段が欲しい

文字数ダイアログは地味に便利だが、少なくとも「小説用」と「プログラミング用」の二つ分の設定が欲しい。小説用では全角も一文字だが、プログラミング用では(主に Windows で SJIS 扱っている関係で)二文字にしたいことが多い。今は設定が一つしかないので、いちいち文字数ダイアログ上で切り替えないといけない。

「レベル n 以下は全て折りたたみ」が欲しい

  • Actual) foldall(レベル1以下は全て折りたたみ)しかない
  • Expect) レベル2以下は全て折りたたみ、が欲しい

foldall は表示中のテキストを折りたためて便利だが、「レベル1だけじゃなくてレベル2も見たい」と思う時がよくある。「レベル n 以下のみ折りたたみ」のような n の余地があると嬉しい。

できるじゃないか?

いえいえ、私が言いたいのは foldall 0x0020, 0; という「0x0020(アウトライン解析との対応)」による折りたたみ、という前提で、「アウトライン解析で認識されているレベルのレベル 2 以下のみ折りたたみ」がしたい。

ウィンドウ位置とサイズを変えるマクロ命令が欲しい

  • Actual) 位置とサイズを変更できる命令は無い
  • Expect) 位置とサイズを変更できる命令が欲しい

秀丸エディタマクロだけで秀丸エディタウィンドウを完全にコントロールしたい。現状足りないのはウィンドウの位置やサイズを変える命令が無いこと。