ミケガモのブログ/a>

AutoHotkeyの導入 ~KeySwapとの併用~

キーバインド設定のためにAutoHotkeyを導入した。KeySwapの拡張として、同時押しで1つのキー入力などの少し高度な設定をするのが目的。今の所複雑なプログラムを書く予定はない。

日本語化はされていないがその機能性から広く普及しているようで、wikiをはじめとした解説サイトが非常に充実している。が、初めて導入する人にソフトの概要を簡潔にまとめたサイトが見当たらず苦心したのでここにメモしておく。私のようにとりあえずキーバインドの設定だけできれば良いという人を想定して書いている。


概要

AutoHotkey本体は、.ahkスクリプトを実行するための常駐型ソフトウェアである。インストールした時点でソフトのスタートアップ設定が完了する。

.ahkファイルにはホットキーの設定を記述する。例えば、

a::send,{b}

は、「aキーを押すとbが入力される」というスクリプトである。

.ahkファイルをダブルクリックすると、ファイル内のスクリプトがPC電源を切るまで半永久的に実行される。

インストーラーでインストールすることにより、

  • .ahkファイルとの自動関連付け
  • 右クリックメニューに「新規作成 > AutoHotkey Script」を追加。任意の場所で.ahkファイルを簡単に作成可能

といった機能が導入される。

実践

キー設定を常駐させるまでの手順は2ステップ。

  1. 「新規作成 > AutoHotkey Script」で、設定したいキーバインドの.ahkスクリプトを作成・保存する。
  2. .ahkファイルのショートカットリンクを作成し、スタートアップフォルダに移動する。

PC起動中はAutoHotkeyがタスクトレイに常駐している。右クリックから「Suspend Hotkey」を選ぶと、一時的にキーバインドを解除できる。

スクリプトは検索すればテンプレートがいくつも出てくるので、それを少し改良すれば簡単に自分の求めるものが作れるはず。↓のサイトの(2)鉄則を覚えよう!は非常に大事。 ch.nicovideo.jp

機能の限界・KeySwapとの併用

どうせなら今まで使っていたKeySwapの設定をAutoHotkeyに一元化しようと思ったのだが、AutoHotkeyCapsLock, NumLockなどのロックキーや、半角/全角キーを出力に設定することができない(できるかもしれないが動作を安定させるのが困難だと思われる)ため、結局両者を併用することにした。現在は以下のように設定している。

  • KeySwap
    • 左CtrlとCapsLockキーの入れ替え。
    • 無変換キーを半角/全角キーに。
    • 変換キーを左Shiftに。
  • AutoHotkey
    • Insertキーをシフトキーと同時に押したときのみ動作させる。
    • NumLockキーを"="に設定。

AutoHotkeyスクリプト

+Ins::send,{Ins}
Ins::return
Numlock::send,+-

プログラミング言語「Python」のメモ

数値データのファイルを行列として読み込む

np.loadtxt

ファイル読み込みには様々な流儀があるが、一番使いやすいのはnumpyのloadtxtだと思う。

 import numpy as np
 data1 = np.loadtxt("sample.dat", skiprows=1, unpack=False) #普通のファイルの場合
 data2 = np.loadtxt("sample.csv",delimiter=",", skiprows=1, unpack=False)  #CSVファイルの場合
  • スペースで区切られていればdelimiter指定なしでも読み込んでくれる。
  • unpack = True にすると、列ごとに1次元配列を作ってくれる。その場合、左辺の変数を列数分だけ用意する。
csvモジュール

文字列を含む行列を読み込むときは、読み込むファイルをcsv形式にしてcsvモジュールを使うと良い。リストを用意し、.appendで行を追加していく。

import csv
list = []
with open('sample.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        list.append(row)

行列をファイルに書き込む

np.savetxt

numpyを使っている場合、対となるsavetxtでファイルに保存できる。

import numpy as np
np.loadtxt("sample.dat", data1) #普通のファイルの場合
np.loadtxt("sample.csv", data2, delimiter=",")  #CSVファイルに書き込む
  • header/footerオプションで、ファイルの先頭行/最終行にコメントを挿入可能。
普通に書き込み

文字列のリストを書き込むときは、普通にwrite文をforループで回すのが無難だろう。enumerate関数は、リストのインデックスと要素を同時に取得できる便利な関数である。

with open(output, mode='w') as f:
    for (n, string) in enumerate(str_list):
         f.write(n + "\t")
         f.write(string)
         f.write(\n)

この場合、以下のようなファイル出力になる。

0  str0
1  str1
2  str2
...

ディスプレイ拡大率設定時のgnuplotフォント

ディスプレイ拡大率を200%に設定しているWindowsPCでグラフをpngやpdfに出力したら、フォントサイズがおかしなことになってしまった。ちなみに標準ターミナル出力(windows,wxt)では正常に表示される。

↓ 画像上がデフォルト、下が拡大率ありのおかしなプロット。 f:id:mikegamo:20180930154904j:plain

流石にこんなマニアックなことを書いているサイトはどこにもないので、自分で試行錯誤。アプリケーション個別のDPI設定で解決しないだろうかといじってみたら見事正解だった。

対処法

wgnuplot.exeのプロパティ>互換性タブ>

高DPI設定の変更 > 高DPIスケール設定の上書き

「高いDPIスケールの動作を上書きします」にチェックを入れ、「拡大縮小の実行元」で「システム」を選択する。

他のアプリケーションにも応用が利くはず。

Windows10のディスク使用率が100%になる問題

【起動直後のWindows10が重い】

果たして悩まされたことのないWindows10ユーザーはいるのだろうか。Windows7まではこんなことで手を煩わされることはなかったと記憶しているのだが… ちょっとPCに詳しい人ならば、

【タスクマネージャーで確認するとディスク書き込みが常に100%】

が原因であることを突き止められるだろう。こいつをネットで調べると、実にたくさんの対処法が紹介されている。悪さをしている可能性があるプログラムは数多くあるため、それぞれへの対処法があるというわけだ。

このページでは私がかき集めた対処法を。効果・手間・リスク の3点で評価し、優先度の高い順にまとめた。これらはあくまでメジャーなものたちであり、重くなる原因のすべてを網羅できているわけではない。すべて試してなおディスク書き込みが100%になるのなら、そのたびにタスクマネージャーを起動して悪者の正体を突き止める必要がある。

メインドライブをSSDに換装する

デカデカと書いているサイトは流石にどこにもなかったが、経験上これが一番有効。私の身の回りだけに関して言えば、ディスク書き込み100%問題が発生するのはすべてメインドライブがHDDのPCである。起動直後は色々なプログラムが集中的にディスクにアクセスするため、書き込み速度の遅いHDDでは交通渋滞を起こしてしまうのだろう。ならば、書き込み速度を上げて全てのアクセスを素早く処理できるようにすればいいだけではないか。今やHDDでは最新CPUの性能を活かしきれないので、知識があるなら是非SSDの導入を勧めたい。なお、CPU性能が低いPCの場合は書き込みの実行速度が遅いだけの可能性も否定はできない。まあ、それでもディスクの方が律速段階だと思うが…。

サービス管理ツール系

ピアネットワーク無効化
SuperFetch無効化
Windows Search無効化
Connected User Experiences and Telemetry無効化

Win + x >コンピューターの管理>サービスとアプリケーション>サービス

あるいは

タスクマネージャー>サービスタブ>サービス管理ツールを開く

を実行し、一覧の中から

  • Peer Name Resolution Protocol
  • Peer Networking Grouping
  • Peer Networking Identity Manager
  • SuperFetch
  • Windows Search
  • Connected User Experiences and Telemetry

のスタートアップの種類を「無効」に変更する。ピアネットワークの無効化に関しては、"IPv6の無効化"でもよい。さらに「Connected User Experiences and Telemetry」無効化に関連して、

PC設定>プライバシー>診断&フィードバック

で、チェックを「完全」から「基本」に変更。

Microsoftストア(wsappxの無効化)

Microsoftストアを起動し、設定(画面右上)から「アプリを自動的に更新」のチェックを外す。

セキュリティソフトの確認

  • ウイルスソフトが入っていないかをセキュリティソフトで確認。
  • セキュリティソフト自体がディスク書き込みで負荷をかけていることがあるので、必要があれば一時停止。

OneDriveの自動起動無効化

以下のいずれかの方法で、OneDriveが自動起動しないように設定する。

ローカルグループポリシーを使った完全な無効化は、Windows10 Proでのみ可能。Homeバージョンでは代わりにレジストリを使って同期機能をオフにできる(上のページを参照)。

タスクバー・タイトルバーなどの色を無効化

PC設定>個人用設定>色

「以下の場所にアクセントカラーを表示します」の、「スタート、タスクバー、アクションセンター」「タイトルバー」のチェックを外す。

Windows Updateの設定

WindowsUpdateが何らかの理由で上手くいかなかった場合、アップデーターが「更新→失敗」というサイクルを延々と繰り返して重くなることがあるらしい。このような場合は、アップデートを手動でやり直すと解決するかもしれない。

一方、WindowsUpdateそのものの設定を変更するには↓のツールが便利。

Windows10 設定変更ツール Ver1.5

Windows Updateの挙動を設定・管理できるフリーソフト。常駐型で「指定した時間以外にWindows Updateが動いていたらすぐにkillする」という仕組み。Updateの完全な無効化も設定できるが、一応非推奨。また、下2項目「自動メンテナンスの停止」「Microsoft Compatibility Appraiserの無効化」も設定できる。

自動メンテナンスの停止

コントロールパネル>セキュリティとメンテナンス>自動メンテナンス

メンテナンスが進行中であれば、メンテナンスを停止させることで一時的に動作の軽量化が可能。定期メンテナンスオフはあまり推奨されないが、必要ならばレジストリ編集で設定できる。一定期間使っていなかったPCを起動したときに重くなるケースの原因。

Microsoft Compatibility Appraiserの無効化

Win + x>コンピュータの管理>タスクスケジューラ 左メニュー Microsoft>Windows>Application Experience

の「Microsoft Compatibility Appraiser」を無効化。

ディスクエラー・容量不足への対処

  • "Cドライブ"などのプロパティ>ツール のチェック
  • "Cドライブ"などのプロパティ>全般>ディスクのクリーンアップ
  • "Cドライブ"などのプロパティ>ツール>ドライブの最適化とデフラグ にて「最適化」をクリックしデフラグ

StorAHCI.sysドライバーを修正

HDD,SSDのデータ転送を管理しているドライバのエラー。(おそらく)デスクトップPCのみに有効。 http://www.partitionwizard.jp/partitionmagic/100-disk-usage-windows-10.html

仮想メモリの設定を変更する

コントロールパネル>システム>システムの詳細設定>詳細設定タブ>「パフォーマンス」欄の設定>詳細設定タブ>仮想メモリ>変更

「すべてのドライブのページングライフのサイズを自動的に管理する」のチェックを外し、ページングファイルのサイズを調整する。

その他

  • ドライバ、BIOSなどの見直し。
  • 電源プランを「省電力」から「バランス」「高パフォーマンス」に

結局、PC設定はどれが効果的なのか分からない。 Windows10として今後改善されるようにも思えないので、我慢ならなくなったらSSDに換えてしまうのが一番良いと思う。

Windowsのユーザーフォルダ名を変更したい(失敗)

高度なPC設定としてはメジャーな、「ユーザーフォルダ名の変更」について。

今回自分が手を伸ばしたきっかけは、パスを参照するプログラムコードを複数のパソコンで共有する機会があったからである。どうせなら使うPCの絶対パスを統一しておいたほうが便利だろうという思い付きで作業を始めたのだが、結果的に大失敗に終わってしまった。同じ轍を踏む方が一人でも減ればいいと思い、一連の過程を記しておく。

ちなみに、コードに関しては ホームディレクトリを表す "~" を使えば解決する ということに後から気付いた。コード共有という課題だけをクリアしたい人がいるなら、くれぐれもこんな大袈裟な真似をしないように(そんなドジは流石に私だけか…)。

基礎知識

Windowsのユーザーフォルダ(C:/User/username)は、アカウント作成時のユーザー名で作成される。その後ユーザー名を変更しても、ユーザーフォルダ名には反映されない。また基本的に、自身が使っているユーザーフォルダ名をエクスプローラーから直接編集することはできない。

要するに、最初の設定したユーザー名から変更するのは簡単ではないGoogle先生に尋ねると、大きく分けて次の2通りの方法が出てくる。

  1. 新規にローカルアカウントを作成し、移行する。
  2. 管理者権限アカウントで強制的にフォルダ名を変更し、レジストリを書き換える。

1.新規ローカルアカウント作成・移行

ユーザーフォルダ名が新規作成時のユーザー名で固定されるのなら、変更したい名前で新規にユーザーを作ってしまおうというもの。新規アカウントの設定は手作業で行うという泥臭い手筋である。Microsoftアカウントがあれば再設定も簡単らしいのだが、自分は使っていないので分からない。

手順1

Microsoftアカウントでサインインしている場合は、まず現在のアカウントを一時的な作業用ローカルアカウントに変更する。PC設定>アカウント>ユーザーの情報 から、「ローカルアカウントでのサインインに切り替える」を実行し、適当な名前のローカルアカウントに変える。このとき、アカウント名は希望フォルダ名にしないこと

この手順は既存のアカウントとMicrosoftアカウントとの紐付けを解除するための作業である。もとからローカルアカウントでサインインしている場合、手順1は必要ない。

手順2

希望フォルダ名のローカルアカウントを新規作成する。 PC設定>アカウント>家族とその他のユーザー で、「その他のユーザーをこのPCに追加」。アカウントの名前は希望するフォルダ名にする。さらに、「ユーザーの種類を変更」で新規アカウントを"管理者"にする。

手順3

新しいアカウントにファイル、ソフトなどを移行する。ユーザーフォルダ内のフォルダを、旧アカウントから新規アカウントに全て移動し、ソフトウェアは必要に応じて再セットアップする。

手順4

PC設定>アカウント>ユーザーの情報 から「Microsoftアカウントでのサインインに切り替える」を実行し、新規アカウントとMicrosoftアカウントを紐付ける。ローカルアカウントのままでよければ手順4は必要ない。

https://ottan.xyz/windows10-users-folder-name-modify-6062/

2.強制変更・レジストリ編集

  • 管理者権限を持つアカウントは、別のユーザーのユーザーフォルダ名を書き換えることが可能
  • レジストリ内にユーザーフォルダ名を指定する値がある

この2つを踏まえた上で、旧アカウントのユーザーフォルダ名を変更する手法。アカウント移行の手続きが無くて済むが、レジストリとの衝突が怖い。

手順1

管理者権限を持つアカウントを別に作成する。上記の手順でローカルアカウント作成→管理者に設定でも良いし、コマンドプロンプトで net user administrator /active:yes を入力してAdministratorアカウントを出現させても良い。

手順2

手順1で用意した別の管理者アカウントでサインインし、目的のユーザーフォルダ名を変更する

手順3

レジストリエディタを起動する(Win+R → regedit)。 HKEY_LOCAL_MACHINE -> SOFTWARE -> Microsoft -> Windows NT -> CurrentVersion -> ProfileList 内にある、旧ユーザーフォルダのパスの書かれたレジストリを探して新しいユーザーフォルダのパスに書き換える

また、必要に応じて上以外で旧ユーザーフォルダのパスを含むレジストリを検索し、新しいパスに書き換える。ただし量が膨大なので、全て書き換えるのは現実的でない。

https://qiita.com/aaaKUKIaaa/items/83d6234b69b0d958d3f1


自分は2番を選択した。一応フォルダ名変更後にPCは起動できたのだが、Googleバックアップと同期が上手く動かなくなってしまった。調べても直る気配が無かったので諦めて元の状態に戻そうとしたのだが、なんとシステムの復元が全ての復元ポイントで失敗するという訳の分からない状態になってしまった。打つ手がなくなり、仕方なく回復ドライブから設定を初期化する羽目に。

「既存のアカウントのユーザーフォルダ名だけをスッキリ変える」方法は無いのだろうか…。Microsoftには是非とも改善してほしいところである。