2018年1月10日水曜日

コマンドプロンプトやタスクスケジューラからPC をスリープ/サスペンドさせたい。(SetSuspendState)

解決方法

ネットが広大すぎて正解が分からなかったため、PCをスリープ (サスペンド) させるためだけのプログラムを自分で書いた。

SetSuspendState.zip (1 KB)

  • このzipファイルには、「SetSuspendState.exe」という実行可能ファイルが入っている。
  • SetSuspendState.exe」を実行すると、PCがスリープする
    ※事前の確認メッセージ等は一切出ない。
  • インストールやランタイムライブラリは不要。
  • 動作確認環境: Windows 7 Professional (x64) SP1

※上記プログラムは無保証です。ご利用は各自の自己責任でお願いします。

※リスクの一例として、万が一、スリープやスリープ後の復帰がうまくいかず、保存していなかったメモリ上のデータが失われるリスクもゼロではないため、各自で事前に動作確認をしてからご利用ください。


上記プログラムの説明

  • Windows の API関数 (SetSuspendState) を呼び出すだけのプログラム。
    SetSuspendState(FALSE, FALSE, FALSE)

    第1引数のFALSEは「サスペンド」を意味し、(「休止」か「サスペンド」かの二択)
    第3引数のFALSEは「復帰イベントの許可」を意味する。


上記プログラムのソースコード全文 (C++)

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <powrprof.h>

void WinMainCRTStartup()
{
  ::SetSuspendState(FALSE, FALSE, FALSE);
  ::ExitProcess(0);
}

おまけ: 本質に関係のない技術的注釈

  • 実行可能ファイルのサイズを小さくしてみた。(3,072 バイト)
  • 「KERNEL32.dll」と「POWRPROF.dll」にしか依存していない。

2017年9月22日金曜日

ROBOCOPY の除外オプションの挙動を検証してみた。

序文

近年のWindowsに標準搭載されている ROBOCOPY (高機能なファイルコピーコマンド) について、ヘルプを見ただけではわかりにくい細部の挙動 (除外オプション回り) を検証してみた。

※検証は Windows 7 でしか行っていないため、Windows 10 などでは挙動が異なる可能性あり。


補足: ROBOCOPYを使用する上で、認識しておいた方がよい挙動

  • ROBOCOPYは、ファイルの更新判定を、メタ情報 (更新日時とファイルサイズ) だけで行っている。→ ファイルの中身は比較していない。

  • これは、コピー速度を上げるための有効な戦略で、ほとんどの場合で問題は出ない。

    例外として、もし(パワーユーザが特殊な操作で)ファイルの更新日時を操作していると、ROBOCOPYがファイルの更新に気づけないケースが発生しうる。


検証環境

  • Windows 7 Professional (SP1) 64bit版、日本語
  • コマンドプロンプトのコードページ: 932 (Shift-JIS) と 65001 (UTF-8)

検証結果

検証結果を表にまとめてみたものの、ROBOCOPY にある程度慣れている人にしか伝わらないかもしれない。

No.ファイル有無更新日時サイズ中身表示除外オプション
1コピー のみ---*EXTRA File/XX
2コピー のみ---New File
「新しいファイル」
/XL
3両方に存在 同一日時 同一サイズ同じ Same
「同じ」
(デフォルトで
除外される)
4 異なる
5 別サイズ - Changed
「変更済み」
/XC
6コピー元が新しい同一サイズ同じ Newer
「より新しい」
/XN
7 異なる
8 別サイズ -
9コピー元が古い 同一サイズ同じ Older
「より古い」
/XO
10 異なる
11 別サイズ -
No.ファイル有無更新日時サイズ中身表示 (「/XL /V」指定時)
2コピー のみ---lonely
「コピー元にだけ存在する」

一言コメント

  • 検証の結果分かったこと: 「/XC」の「Changed」(変更された/変更済み) というのは、
    「ファイルサイズが変更されていて、更新日時が変更されていない」という意味だった。
    このオプションを単独で使う状況が思いつかない。
  • コピー元だけに存在するファイルのみをコピーしたいとき (= 両方に存在するファイルは無視したいとき) には、「/XC /XN /XO」を指定すればよい。
  • 除外オプションを試行錯誤するときには、あわせて「/V」オプションも指定しておくと捗る。
  • ROBOCOPYをコピー実行中に Ctrl+C で強制停止させた場合、コピー先にコピー途中の不完全なファイル(更新日付が1980年のファイル)が残るので、適宜手作業で取り除くこと。

読み物 (1): ROBOCOPYの画面表示について

ROBOCOPY を コードページ 65001 で実行すると、きわめて整然とした画面出力がされる。(図1)
非常に見やすく、わかりやすい。

図1. chcp 65001: きわめて整然でわかりやすい

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : Thu Sep 21 07:21:20 2017

   Source : T:\srcDir\
     Dest : T:\dstDir\

    Files : *.*
     
  Options : *.* /V /L /COPY:DAT /R:1000000 /W:30 

------------------------------------------------------------------------------

                   10 T:\srcDir\
   *EXTRA File          6 dstExtra.txt
           same         6 same.txt
           same         6 sameTime_diffContent_sameSize.txt
     Changed            6 sameTime_diffContent_diffSize.txt
     New File           6 srcLonely.txt
     Newer              7 srcNewer_diffContent_diffSize.txt
     Newer              6 srcNewer_diffContent_sameSize.txt
     Newer              6 srcNewer_sameContent.txt
     Older              6 srcOlder_diffContent_diffSize.txt
     Older              6 srcOlder_diffContent_sameSize.txt
     Older              6 srcOlder_sameContent.txt

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         1         0         1         0         0         0
   Files :        10         8         2         0         0         1
   Bytes :        61        49        12         0         0         6
   Times :   0:00:00   0:00:00                       0:00:00   0:00:00

   Ended : Thu Sep 21 07:21:20 2017

しかしながら、我々の コードページ 932 (日本語Windows環境のデフォルト) では、画面表示の桁がそろっておらず、見づらい。(図2)
日本語翻訳チームさんたちには、もう少し頑張ってもらいたかった。

図2: chcp 932: 桁合わせがうまくいっておらず、わかりづらい。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: Thu Sep 21 07:21:20 2017

   コピー元 : T:\srcDir\
     コピー先 : T:\dstDir\

    ファイル: *.*
     
  オプション: *.* /V /L /COPY:DAT /R:1000000 /W:30 

------------------------------------------------------------------------------

                   10 T:\srcDir\
   *EXTRA File          6 dstExtra.txt
           同じ         6 same.txt
           同じ         6 sameTime_diffContent_sameSize.txt
     変更済み            6 sameTime_diffContent_diffSize.txt
     新しいファイル           6 srcLonely.txt
     より新しい              7 srcNewer_diffContent_diffSize.txt
     より新しい              6 srcNewer_diffContent_sameSize.txt
     より新しい              6 srcNewer_sameContent.txt
     より古い              6 srcOlder_diffContent_diffSize.txt
     より古い              6 srcOlder_diffContent_sameSize.txt
     より古い              6 srcOlder_sameContent.txt

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         0         1         0         0         0
     ファイル:        10         8         2         0         0         1
      バイト:        61        49        12         0         0         6
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00

       終了: Thu Sep 21 07:21:20 2017

読み物 (2): 除外オプションの挙動

ここでいう「除外オプション」とは、一部のファイルをバックアップ対象外とするためのオプションを意味する。 これらは、ROBOCOPYのコマンドラインオプション内の「ファイル選択オプション」(File Selection Options)グループに属している。

以下は、ROBOCOPYのコマンドラインヘルプからの抜粋である。(図3、図4)

図3: ROBOCOPYのコマンドラインヘルプ (日本語版) からの抜粋

/XC :: 変更されたファイルを除外します。
/XN :: 新しいファイルを除外します。
/XO :: 古いファイルを除外します。
/XX :: コピー先にだけ存在するファイルとディレクトリを除外し
      ます。
/XL :: コピー元にだけ存在するファイルとディレクトリを除外し
      ます。
/IS :: 同一ファイルを含みます。
/IT :: 異常なファイルを含めます。

図4: ROBOCOPYのコマンドラインヘルプ (英語版) からの抜粋

/XC :: eXclude Changed files.
/XN :: eXclude Newer files.
/XO :: eXclude Older files.
/XX :: eXclude eXtra files and directories.
/XL :: eXclude Lonely files and directories.
/IS :: Include Same files.
/IT :: Include Tweaked files.

とりあえず、日本語版のヘルプは、「ヘルプ上の文言」と「実際に画面表示される文言」とが一致してないため、非常にわかりづらい。わかりづらいというよりは、用語の混乱がある。

ROBOCOPYの概念上、「新しいファイル (New File/Lonely)」と「より新しい (Newer)」は全く別の意味をあらわす用語になっている。これが混乱の元である。

たとえば、「/XN」というオプションの説明文として、
/XN :: 新しいファイルを除外します。
とあるが、このオプションでは 画面上で「新しいファイル」と表示されるファイルは除外されない。このオプションで実際に除外されるのは、画面上で「より新しい」と表示されるファイルである。

新しいファイル」と表示されるファイルを除外するには、「/XL」を指定する必要がある。

(もし「/XN」オプションの説明文が、
/XN :: コピー先より新しいコピー元ファイルを除外します。
だったなら、もう少し親切だったように思う)

なお、英語版のヘルプにもあいまいなところ(説明不足による複数の解釈の余地)があり、あまりわかりやすいとは言えない。日本語翻訳チームも苦労したのかもしれない。

2017年9月16日土曜日

ckw-mod を個人的に改造してみた。(その2)

(ckw-mod を個人的に改造してみた。 の続き)

ダウンロード

※動作確認は、Windows 7 Professional SP1 (64bit) で実施。


リリースノート

Release 0.9.1-mod-amdkkj-2 amdkkj/ckw-mod GitHub
  • 複数行貼り付け時の確認ダイアログをモーダルに変更
  • コードページの動的変更に対応 (by rururu)
    • 隠しコンソールのコードページを常に監視し、
      chcp コマンド等で動的にコードページが変更された場合にも追従するように変更
  • システムメニュを日本語で表示するように変更
    ただし、OSの言語設定が日本語「以外」の環境では、これまで通り英語のシステムメニュが表示される
    • システムメニュで使用している文字列をリソースファイルに切り出したため、
      今後はリソースファイルを編集するだけで日本語以外にも対応可能
  • システムメニュに、標準コマンドプロンプト互換の「貼り付け」を追加
    • 標準コマンドプロンプト同様に、Alt + スペース → e → p の
      キーコンビネーションで クリップボードからの貼り付けができるようになった

関連記事

2017年9月12日火曜日

結局のところ、blockquote要素の内部にcite要素を入れてもよいのか? (HTML)

結論

入れてもOK。
blockquote要素の内部(配下)に、cite要素を入れてもよい。(と思われる)

根拠

下記は、引用についての引用。(※ただし、強調部分は引用者による)

The <blockquote> element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations.

Content inside a blockquote other than citations and in-line changes must be quoted from another source, whose address, if it has one, may be cited in the cite attribute.


経緯

以前にどこかで、「blockquote要素の内部には絶対に絶対にcite要素を入れては駄目だblockquote要素配下には純粋に引用されたものだけを書くんだcite要素は外に出せもしくは代わりにcite属性の方を使え」という主張を見た記憶があったため、調べてみた。

HTML5仕様はまだドラフト段階なので、二転三転することもあるのかもしれない。

2017年9月10日日曜日

ckw-mod を個人的に改造してみた。

※2017/9/16 追記: 最新バージョンはこちら。→ ckw-mod を個人的に改造してみた。(その2)

まとめ


ダウンロード

※動作確認は、Windows 7 Professional SP1 (64bit) で実施。


リリースノート

Release 0.9.1-mod-amdkkj-1 amdkkj/ckw-mod GitHub
  • クリップボードから貼り付けられる文字列が複数行だった場合に、確認ダイアログを表示するよう変更
  • 「--chdir (-cd)」オプション処理の変更 (失敗時の救済処理を追加)
    • 指定されたパスへの SetCurrentDirectory() がエラーになった場合に、
      指定されたパスの「親ディレクトリ」に対し
      再度 SetCurrentDirectory() を試みる処理を追加
  • Windows 7 のエクスプローラで ckw.exe のプロパティを表示したとき、
    「製品名」「著作権」が表示されていなかったため、表示されるように修正
  • ウインドウタイトルが128文字以上の時に落ちる不具合を修正 (by rururu)

関連記事

2017年9月4日月曜日

ckw-mod の系譜を追ってみた。

まとめ

ckw-mod*1 には、本家バージョンよりもさらに開発がすすんでいる派生版 (フォーク) が存在する。

そこで、「(実質上の) 最新版がどこにあるのか」を調査した。※野良ビルドは調査対象外

*1: ckw-mod は、Windows標準のコマンドプロンプトの代替として使えるフリーソフト (オープンソース)

調査結果

Q. ckw-mod の最新は、どこにあるのか?

A. 2017年9月現在でもアクティブに更新されているのは、rururutan さん版 だと思われる。


備考1: ckw-mod の歴史

  1. 始祖 ckw (ckw-mod の派生元)

    はじめに ckw が あった。
    • http://www.geocities.jp/cygwin_ck/ ※リンク切れ
  2. ckw の消滅と、その亜種の乱立

    始祖 ckw は、なくなってしまった。
    しかしながら、ckw はオープンソースだったため、いろいろな人が各所でそれぞれ開発を引き継ぎ、それぞれの修正版を公開した。
  3. ckw-mod 本家 の誕生

    有志の方 (おそらく、deflis さん) が、多数に枝分かれした ckw の各修正版の変更内容を ほぼ すべて取り込んだ統一版である、ckw-mod を作った。(偉業)
  4. ckw-mod 本家 の発展 (~2013年ごろ)

    有志の方々 (deflis さん や、southly さん 他多数) により、本家の ckw-mod はさらに改良されていった。
    本家の更新は 2013年8月ごろまで続いた。
  5. ckw-mod 派生版の台頭

    本家 ckw-mod の更新は落ち着いたが、それ以降も、本家から派生 (fork) したプロジェクト (ckw-mod 派生版) では 引き続き開発が続けられた。
    たとえば、rururutan さんの rururutan/ckw-mod は 2017年現在でもアクティブであり、本家をベースとして UNICODE対応 や Windows 10対応 も行われている。

備考2: 2017年9月初時点での、ckw-mod 派生プロジェクトについて

2017年9月初現在で、ckw-mod の派生 (fork) は、24個 存在する。

この調査を始めた当初は、24個の中の どのプロジェクト (リポジトリ) が最新なのかが分からなかった。そこで、各プロジェクトの状況*1を簡単に調べてみた。(*1: 2017年9月初 現在)

0.@ckw-modckw-mod / ckw-mod本家
1.@abedasterabedaster / ckw-modコミットなし
2.@amuramatsuamuramatsu / ckw-mod独自ブランチあり: improvement-stability (stale)
3.@comuttuncomuttun / ckw-mod独自ブランチあり: b_dist (stale)
4.@deflisdeflis / ckw-mod(本家のプロジェクトメンバー)
5.@iusenix├→ iusenix / ckw-modコミットなし
6.@kkawa└→ kkawa / ckw-modコミットなし
7.@draftcodedraftcode / ckw-mod独自ブランチあり: FontHack (stale)
8.@Fuj18Fuj18 / ckw-modコミットなし
9.@hmrhmr / ckw-modコミットなし
10.@hokorobihokorobi / ckw-modコミットあり: master
11.@lillycodelillycode / ckw-modコミットなし
12.@mallowlabsmallowlabs / ckw-mod独自ブランチあり: high_dpi_support (stale)
13.@MatsuyanagiMatsuyanagi / ckw-modコミットなし
14.@mecabmecab / ckw-mod独自ブランチあり: high_dpi_compat, envvar,
more_bgimage_type (いずれも stale)
15.@mwparkmwpark / ckw-modコミットなし
16.@nocd5nocd5 / ckw-modコミットあり: master
独自ブランチあり: nocd5Feature (stale)
17.@ousttrueousttrue / ckw-modコミットあり: master
18.@rururutanrururutan / ckw-modコミットあり: master, develop ※active
独自ブランチあり: unicode (stale)
19.@tesurijp└→ tesurijp / ckw-mod独自ブランチあり: AdhocForceV2 (stale)
20.@southlysouthly / ckw-mod(本家のプロジェクトメンバー)
21.@staniastania / ckw-modコミットなし
22.@tipjstipjs / ckw-modコミットなし
23.@wantorawantora / ckw-modコミットあり: master
独自ブランチあり: support_gcc, totray, chdir_lock,
remove_warnings (いずれも stale)
24.@yukke64yukke64 / ckw-modコミットなし

おまけ

25.@amdkkjamdkkj / ckw-mod諸般の事情(?)により、私もフォークしました。

関連記事

2017年8月31日木曜日

MinGW の make だけを手動でインストールする

必要なアーカイブ


インストール手順

  1. make-3.82.90-2-mingw32-cvs-20120902-bin.tar.lzma から
    「mingw32-make.exe」を取り出して、パスの通ったディレクトリに格納する。
    ※お好みで、「mingw32-make.exe」を「make.exe」にリネームする。
  2. libintl-0.18.3.2-2-mingw32-dll-8.tar.xz から
    「libintl-8.dll」を取り出して、前手順と同じディレクトリに格納する。
    ※このDLLがないと、make に
    「コンピューターに libintl-8.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。 」
    と怒られる。
  3. libgcc-6.3.0-1-mingw32-dll-1.tar.xz から
    「libgcc_s_dw2-1.dll」を取り出して、前手順と同じディレクトリに格納する。
    ※このDLLがないと、make に
    「コンピューターに libgcc_s_dw2-1.dll がないため、…」と怒られる。
  4. libiconv-1.14-3-mingw32-dll.tar.lzma から
    「libiconv-2.dll」を取り出して、前手順と同じディレクトリに格納する。
    ※このDLLがないと、make に
    「コンピューターに libiconv-2.dll がないため、…」と怒られる。
  5. おわり。

補足

各アーカイブからのファイル取出しは、7-Zip があれば 事足りる。