htsign's blog

ノンジャンルで書くつもりだけど技術系が多いんじゃないかと思います

個人的によく使うWindowsコマンドまとめ

Twitterで戯れていたら流れで思いついたので唐突にまとめてみます。
「個人的によく使う」というのがミソで、ここに載っていないものは載せ忘れかほとんど使わないか存在を知らないものです。
載せ忘れは思い出し次第追記していきます。

基本

Win+Rで「ファイル名を指定して実行」を呼び出せます。
Win+Rで起動したプログラムは通常ユーザー権限で起動する為、明示的に管理者権限で起動させたい場合は「Winを一回だけ押し(スタートメニュー呼び出し)てコマンド打ってCtrl+Shift+Enter」です。

ただし、スタートメニューを使う方法はコマンド履歴が残らないので、毎回全部打ち込む必要があってちょっと面倒くさいです。
可能な限りWin+Rを使う方法をお勧めします。

なお、コマンドは大文字小文字を区別しません。
ここでは分かりやすさの為に一部大文字で表記しますが、普段は全て小文字で打っています。

リスト

基本系

  • cmd
    • 言わずと知れたコマンドプロンプト
      • 上記の「管理者権限で起動」で起動することが最も多いコマンド
  • .
    • エクスプローラ
      • 一文字だけで起動できるので便利と言えば便利。普段はWin+E使うことの方が多いです。
  • \
    • エクスプローラ
      • こちらはシステムドライブ(厳密にはユーザーデータが保管されているカレントドライブのルート)が表示されます。

ツール系

  • notepad
    • メモ帳
      • ささっと何かメモっておきたいときに
  • write
    • ワードパッド
      • ちょっと豪華なメモ帳かつちょっと簡素なMS Wordみたいな立ち位置。名前の通りwordpadでも起動します。
  • calc
    • 電卓
  • mspaint
    • ペイント
      • 旧名の「ペイントブラシ」から来ているpbrushでも等価です。
  • mstsc
  • winword
    • MS Word
      • 当然ながら MS Office インストール前提です。
  • excel
  • powerpnt
  • powershell_ise
  • psr
    • ステップ記録ツール
      • 「Probrem Steps Recorder」の略です。
        あらゆる操作手順を画像つきで記録してくれるスグレモノですが、名前の通り本来は問題が起こったときの報告用ツールなので、記録データには一部デバッグ情報も含まれます。あと、画像は強力に圧縮されたJPEGで結構汚いです。

コントロールパネル系

  • sysdm.cpl
    • システムのプロパティ
      • 何かとお世話になることがあると思います。
  • SystemPropertiesAdvanced
    • 「システムのプロパティ」の「詳細設定」タブ
      • なぜこれ単体でexeファイルが用意されているのか謎。
        もっと言うと全てのタブ(と一部の機能)ごとにそのタブや機能を直接呼べるexeファイルがあります。
        f:id:htsign:20161213212521p:plain
  • ncpa.cpl
  • inetcpl.cpl
    • インターネットのプロパティ
      • IE使わない人にとってはプロクシの設定くらいでしかお世話にならない。
  • main.cpl
    • マウスのプロパティ
      • 何を略して main になったのか分かりません。
  • mmsys.cpl
    • サウンド
  • fonts
    • フォント
  • firewall.cpl
  • wf.msc
  • powercfg.cpl
    • 電源オプション
      • ちなみに拡張子を省略すると同名のpowercfg.exeが呼び出されます。一瞬黒い画面が表示されてすぐ消えます。
  • control folders
    • フォルダオプション
  • control userpasswords2
    • ユーザーアカウント
      • ちなみにcontrol userpasswordsだと、コントロールパネルから呼べるユーザーアカウントと等価です。
  • appwiz.cpl
    • プログラムと機能
  • OptionalFeatures
    • Windows の機能の有効化または無効化
  • wuapp
  • control /name Microsoft.DefaultPrograms
    • 既定のプログラム
      • 余談ですが、control /nameによる呼び出しはたくさんあり、例えばcontrol /name Microsoft.AudioDevicesAndSoundThemesmmsys.cplと同等です。
        Microsoftは長ったらしい呼び出しの方を推奨しています。今後置き換えを図っていくものと思います。
  • control /name Microsoft.System
    • システム
      • Win+Pauseでも同じ効果なので、Pauseキーがあるキーボードを使える場合はショートカットキーを使っています。
  • taskschd.msc
    • タスクスケジューラ
      • タスクスケジューラを上手く活用するとUACバイパスとかできるようになりますが、セキュリティリスクの増大にもつながるので、計画的に使いましょう。
  • devmgmt.msc
    • バイスマネージャ
      • mgmt.msc」シリーズ筆頭
        おそらく「DEVice ManaGeMenT」の略でしょう。
  • diskmgmt.msc
    • ディスクの管理
  • compmgmt.msc
    • コンピュータの管理
      • これ一つでいろいろ入ってるので、これを覚えればtaskschd.msc devmgmt.msc diskmgmt.msc services.msc fsmgmt.msc等を覚えなくていいと考えることもできます。
        でもdevmgmt.mscservices.mscは特によく使うので、個人的には習得必須ですね。
  • services.msc
    • サービス
  • fsmgmt.msc
    • 共有フォルダ
  • certmgr.msc
    • 証明書のアレやコレ

shellスキーム系

  • shell:sendto
    • コンテキストメニューの「送る」フォルダの実体
      • ここにショートカットファイルを置いて「送る」の項目を増やしたり、ショートカットを削除して(or 隠し属性付けて)項目を減らしたりできます。
  • shell:programs
    • プログラムメニューの実体
  • shell:startup
    • プログラムメニューの中でも特に「スタートアップ」フォルダ
      • 気軽に使えるので便利ですが、しっかりセットアップするときはレジストリHKCU\Software\Microsoft\Windows\CurrentVersion\Runに置く方が好きです。
  • shell:recent
    • 最近使ったファイル
  • shell:desktop
    • デスクトップ
      • 使う場面はそう無いと思います。
  • shell:appdata
    • AppDataのRoaming
      • 入力速度的には%appdata%といい勝負

システム系

  • msinfo32
    • システム情報
  • dxdiag
    • DirectX 診断ツール
      • 個人的にはこいつ呼ばなくてもmsinfo32で済む場面が多いです。
  • cleanmgr
    • ディスクのクリーンアップ
  • perfmon
    • パフォーマンスモニタ
  • eventvwr
    • イベントビューア
  • regedit
  • taskmgr
    • タスクマネージャ
      • でもCtrl+Shift+Escで起動することの方が圧倒的に多いです。
        タブレット機ではタスクバー右クリックが多いです。
  • shutdown -s -t 0
    • OSの終了
  • shutdown -r -t 0
    • OSの再起動
      • これを覚えておくだけで、例えば不意にグラフィクスドライバのみがクラッシュして復帰しなくなった(音楽等は正常に鳴っていたりするのに画面描画だけ何やっても更新されない)場合にも、電源長押しせずに、慌てずこれ打ち込んで再起動させることができるようになります。

マニアック系

  • wbemtest
    • WMIテストツール
      • WBEM」は「うぇぶえむ」と読みます。WBEMという規格のMicrosoft実装がWMIです。
        WQLのコールとかできます。

最後に

コマンドは自然に指が動くくらいでないとマウスでぽちぽちするより逆に遅くなるので、便利に使いたいと思ったらきっかり覚えましょう。

.NET Framework 3.5環境で nameof 演算子っぽいことする

最近仕事でこんな感じのメソッドを定義して使っています。

public static class Utility
{
    private static Dictionary<string, string> exprCache = new Dictionary<string, string>();
    
    public static string NameOf<T>(Expression<Func<T>> expr)
    {
        string exprString = expr.ToString();
        string name;
        
        if (!exprCache.TryGetValue(exprString, out name))
        {
            var body = expr.Body;
            
            if (body is ConstantExpression)
            {
                object value = ((ConstantExpression)body).Value;
                
                if (body.Type == typeof(Type))
                {
                    string typeName = value.ToString();
                    
                    int backqIndex = typeName.IndexOf('`');
                    if (backqIndex >= 0)
                        typeName = typeName.Substring(0, backqIndex);
                    
                    typeName = typeName.Substring(typeName.LastIndexOf('+') + 1);
                    typeName = typeName.Substring(typeName.LastIndexOf('.') + 1);
                    name = typeName;
                }
                else
                    name = value != null ? value.ToString() : (string)null;
            }
            
            else if (body is MemberExpression)
                name = ((MemberExpression)body).Member.Name;
            
            else if (body is MethodCallExpression)
                name = ((MethodCallExpression)body).Method.Name;
            
            else
                throw new ArgumentException(exprString);
            
            exprCache[exprString] = name;
        }
        return name;
    }
}

使い方は簡単。

public class Program
{
    private static void Main(string[] args)
    {
        // リテラルはそのまま出力されます。
        // nameof 演算子ではそもそもリテラルを囲うことができません。
        Console.WriteLine(Utility.NameOf(() => "magic string"));   // => "magic string"
        
        // 定数の場合はILへのコンパイル時に完全に置き換えられる為、定数名を出力できません。
        const string constString = "const string";
        Console.WriteLine(Utility.NameOf(() => constString));      // => "const string"
        
        // 型名が欲しい場合は、typeof演算子を使います。
        // 構文上の制限による苦肉の策です。
        Console.WriteLine(Utility.NameOf(() => typeof(MetaVar));   // => "MetaVar"
        Console.WriteLine(Utility.NameOf(() => typeof(Klass));     // => "Klass"
        
        // ==== ここから下は nameof 演算子と近い挙動を示します ====
        
        // 列挙型を変数に入れるとNameOfメソッドは変数名を返します。
        // これは列挙型に限らず、ローカル変数は全て変数名を返します。
        var hoge = MetaVar.Hoge;
        Console.WriteLine(Utility.NameOf(() => hoge));             // => "hoge"
        
        // 列挙型を直接指定すると列挙型の名前を返します。
        Console.WriteLine(Utility.NameOf(() => MetaVar.Fuga));     // => "Fuga"
        
        // klass はローカル変数なので、変数名を返します。
        var klass = new Klass();
        Console.WriteLine(Utility.NameOf(() => klass));            // => "klass"
        
        // プロパティの場合はプロパティ名を返します。
        Console.WriteLine(Utility.NameOf(() => klass.Number));     // => "Number"
        
        // メソッドの場合はメソッド名を返します。
        Console.WriteLine(Utility.NameOf(() => klass.Echo()));     // => "Echo"
    }
    
    public enum MetaVar { Hoge, Fuga, Piyo }
    
    public class Klass
    {
        public int Number { get; set; }
        
        public string Echo()
        {
            return "I'm a instance of Klass";
        }
    }
}

今のところArgumentExceptionが投げられる場面には遭遇してません。

本来のnameof演算子とは違ってコンパイラがよしなにするものではなく、式木の操作は動的な実行です。
定数はコンパイル時に置換されてしまっていますので、Utility.NameOfメソッドはその違いを認識できません。
そのため、Utility.NameOf(constString)nameof(constString)では実行結果が違います。

とはいえ、多少違いはあるものの、そこそこ実用できるのでいいと思います(こなみ)

そもそも C# 6.0/VB 14.0 の機能であって、.NET Framework 3.5はあんまり関係ないですね。
どちらかと言うとVisual Studioのバージョンが古いときに使えるtipsみたいな。

あと、注意点としては、式木の計算は結構重いです。
その対策として、上ではキャッシュ機構を組み込んでいます。
どれくらいキャッシュの効果があるかはベンチ取ってないので分かりませんが、対策なしは止めましょう。
INotifyPropertyChangedの実装など、比較的呼び出される頻度が高いと効いてきそうです。

Windows 10 Mobileでのユーザー辞書クリア手順

W10M端末におけるユーザー辞書英語キーボード用)及び予測変換情報の初期化方法が思った以上に分かりにくかったのでメモがてらに。

  1. 画面上端から下へスワイプし、アクションセンターを表示します。
  2. クイックアクション右下の「展開」をタップしてすべてのアクションを表示します。(もう一度画面上端から下へスワイプでもいいです)
  3. 「すべての設定」をタップします。
  4. 「プライバシー」をタップします。
  5. 音声認識、インク操作、入力」をタップします。
  6. 「自分の情報を知らせない」をタップします。確認ポップアップが表示されるので「オフにする」をタップします。
  7. 「自分を知ってもらう」をタップします。確認ポップアップが表示されるので「オンにする」をタップします。

以上です。
お察しかと思いますが、辞書以外の機能の学習状況もクリアされる模様なのでご承知の上ご利用ください。

以後は特に指定のない限りJSはES6記法で書いていこうと思います。

Intlオブジェクトというものを知りました。
国際化表記における各種変換を取りまとめるそこそこ大規模なオブジェクトらしい。

Collator DateTimeFormat NumberFormatの3つのサブオブジェクトを持つ模様。
それぞれインスタンス化して使用するっぽい。

(() => {
  let localeOption = { style: "currency", currency: "jpy" };
  let locale = new Intl.NumberFormat("ja-JP", localeOption);
  console.log(locale.format(1234500)); // => ¥1,234,500
})();

便利。

第二引数のoptionにcurrencyDisplayを指定すると表記方法が変わるっぽい。
currencyDisplay: "symbol"がデフォルトで、他にcodenameがあるらしい。
symbolの場合の記号が半角とか全角とか、その辺は実装依存っぽい。

とか思ってたら

Number#toLocaleStringとか、他の代表的なオブジェクトにメソッドとして同等機能が提供されていた。
newはオーバーヘッドも大きいし*1、特別な理由がない限りは基本こっちですね。

*1:実測はしていませんが

グローバルIPアドレスを得る

今まではipifyを使っていました。

> Invoke-WebRequest api.ipify.org | Write-Host
125.203.***.***

非常にシンプルで使用制限もなく応答速度も問題なくて重宝していました。


これで終わりでいいんですが、みんな大好きStackOverflowのとあるスレッドで有用なやり取りがあったので。
Getting my public IP via API - Stack Overflow

どうやらipinfo.ioというのがあるようで、「1日1000リクエストまで」という制限があるようですが*1柔軟性が高いです。
オプションを何もつけなければJSONでデータが返ってきます。

> Invoke-WebRequest ipinfo.io | Write-Host
{
  "ip": "125.203.***.***",
  "hostname": "i125-203-(中略).ap.plala.or.jp",
  "city": "",
  "region": "",
  "country": "JP",
  "loc": "35.***,139.***",
  "org": "AS4713 NTT Communications Corporation"
}

まぁ使い方は公式サイトにでかでかと書かれてるのでわざわざここで説明するまでもないんですが、JSONのプロパティがオプション名になってます。

> Invoke-WebRequest ipinfo.io/ip | Write-Host
125.203.***.***

> Invoke-WebRequest ipinfo.io/country | Write-Host
JP


特に凝ったことするのでなければipify, ちょっと別の情報も使いたいってときはipinfo.ioって具合に使い分けましょうかね。

*1:無料プランでの話なので、有料プランを選べばもちろん制限は緩くなります。

OSXのバージョンを確認する方法

ただ単に今駆動しているOSXのバージョンを確認するだけなら

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F1605

で終わりです。

今回はとあるパーティションにインストールされているOSXのバージョンを外部から確認する方法です。
ある方から起動できなくなったHDDにインストールしたOSXのバージョンを確認してほしい、との依頼があったために調べて知った方法です。
要するに一部のLinuxディストリで言うcat /etc/*-releaseのようなものです。

まずは目的のパーティションに移動します。

$ cd /Volumes/Machintosh\ HD/

その上で、そのパーティション上の/System/Library/CoreServices/の中にあるSystemVersion.plistにバージョン情報が書かれています。

$ cat System/Library/CoreServices/SystemVersion.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>ProductBuildVersion</key>
        <string>14F1605</string>
        <key>ProductCopyright</key>
        <string>1983-2016 Apple Inc.</string>
        <key>ProductName</key>
        <string>Mac OS X</string>
        <key>ProductUserVisibleVersion</key>
        <string>10.10.5</string>
        <key>ProductVersion</key>
        <string>10.10.5</string>
</dict>
</plist>

ちなみに、ここのXMLを書き換えることで「このMacについて」で表示されるバージョン情報を偽装することができるようです。

参考: Tutorial: Change the OS X Version by modifying systemversion.plist

久しぶりにPC周りのお買い物

ついに買いました。TLCSSD
nttxstore.jp

思えばSLCで容量40GBしかないのを買って、MLCだけど容量60GBしかないのを買って、MLCで容量120GBのを買って、MLCで256GBのを買って、今度のやつで5枚目です。
SandForce製とかいう0Fill, 1Fill以外まるで速度の出ないゴミみたいなコントローラ載っけてたのもありました。今は外付けケースに入れてポータブルになってますが使ってません。

Steamのゲームをいくつか置いとくだけなので、そこそこの容量とそこそこの読み込み速度があれば役に立ってくれると信じてる。

ベンチマークスコア

f:id:htsign:20160108012118p:plain
公称値はSeqRead 540MB/s SeqWrite 470MB/sなので、書き込みはともかく読み込みはまずまずの速度じゃないかと思います。
他所のレビューではスコアがもう少しよかったので、単純にSBチップやSATAケーブルがアレだったかも。
ケーブルくらいは近いうちに買い替えます。