エクスプローラで移動や削除が重いのを改善する(Windows10)

Windows10にして以来、エクスプローラーのファイル操作全般が変に重くて困っていたのですが、解決方法を見つけました。
ファイルの移動や削除、リネーム等の際に暫く固まるような引っ掛かりがある場合、これで改善する可能性があります。

  1. エクスプローラーのメニューバーから「表示>オプション」を選択。
  2. 「全般」タブ内の「プライバシー」の「最近使ったファイルをクイックアクセスに表示する」と「よく使うフォルダーをクイックアクセスに表示する」の二つのチェックを外す。
  3. そのすぐ下にある「エクスプローラーの履歴を消去する」の消去ボタンを押した後、OKを押す。

ファイルの履歴が溜まることで重くなっていたようなので、同様の原因であればこれで劇的に軽くなります。もし違う原因でも履歴が消える以外は特に副作用は無いと思いますので、一度お試しください。

フォルダーオプションのスクリーンショット

テーマ: Windows 全般 - ジャンル: コンピュータ

ギビバイトという単位

ギビバイト(GiB)という単位がある。
IEC(国際電気標準会議)が1998年に承認した、比較的新しい単位だ。皆さんご存知だろうか。

実はこの単位、お馴染みのギガバイト(GB)とほぼ同じ意味だったりする。
だったらギガバイトでいいんじゃない?と思われることだろう。僕もそう思うし、たぶんみんなそう思っているから、ご存知の通り全くさっぱり普及していない。
もちろん、定義上は全く同じ意味ではない。

キロは1000ではなく1024

そもそもギガとは、千倍を意味するキロの更に千倍のメガの、更に千倍という意味のSI接頭辞(国際的に定められた単位)だ。コンピュータ以外の日常生活ではキロしか馴染みがないけれど、たとえば1キログラムの千倍は1メガグラム(1トン)で、その千倍は1ギガグラムと表すことができる。

しかし、コンピュータの世界の慣例では少し意味が異なる。キロもメガもギガも、ひとつ下位の接頭辞の1024倍を表すのである。このような中途半端な数になる理由には、コンピュータの仕組みが関係している。

現在のコンピュータは、あらゆるデータを内部では0か1の数字の集まり、つまり2進法で表しており、一般的には2進法で8桁分を1バイトとして定義・処理している。
コンピュータは2進法で計算するので、2のn乗の数が最も扱いやすく効率が良い。その為、キロの近似値である2の10乗(2進数10桁)=1024バイトを1キロバイトと定めているのである。さらに1キロバイトの1024倍が1メガバイトで、同様にギガバイト、テラバイト、ペタバイトと続く。

ギビバイトが生まれた理由

つまり、キログラムなど(SI単位)を日常生活で使う時と、キロバイトとではキロの意味が1000倍と1024倍で、24ほど違うのだ。この程度の誤差は大抵、あまり気にはならないだろう。
しかし単位がギガになると、1000の3乗=10億に対してコンピュータでは1024の3乗=約10億7374万なのである。約七千万違うと言われれば、そこそこ気になってくる。
言うまでもなく接頭辞がテラやペタなど上位なれば、更に誤差は大きくなる。

さてここで、やっと本題だ。
この誤差は無視できないので明確に区別したい。いや、したい事にしてみる。
そこで登場するのがギビバイト(GiB)だ。これには明確に、1024の3乗の意味しかない。だからギガのように、その正確な数が1000の3乗なのか1024の3乗なのかを考える必要がなくなる。おお、素晴らしい!……かな?

ギビバイトは必要か

これ、ほとんどの人がピンとこないのが正直なところだろうと思う。
というのも、コンピュータのライトユーザにとって誤差を実際に意識する場面はほとんど無いだろうし、コンピュータに詳しい人にしてみれば、ギガバイトといえば通常は1024の3乗を表すのが当たり前のことなのである。誰もギガバイトを1000の3乗かも?なんて考えたりしないのだ。
なので、学者さんや仕様書を書く人にはギビバイトも必要かもしれないが、他一般の人にとってそれが必要となることは、今後も永遠に無いだろう。だから覚える必要はないし、覚えていてもこの記事のようにウンチクのネタ程度にしか使えない。
厳密さが必須で、見聞きする人が用語の意味を知っている場面では使っても良いが、知らない人が居ることも想定できる場面では、かえって混乱を招くだけだろう。

ストレージ容量の謎

ただ一つだけ、例外がある。
HDDやSSDなどの、ストレージ容量のパッケージ表記だ。これは何と、各単位を千倍として計算している。その為たとえば2TBと表記してあるHDDは、実際には約1.82TB(TiB)しかなく、PCでの表示もそうなる。
恐らくは少しでも容量を多く見せる為に考え出された涙ぐましい工夫だが、いつも少し損した気分になるので、この慣習はそろそろ止めて頂きたいものだ。

そういえば、大昔のゲームソフト(ROMカセット)では単位を「メガ」とだけ表記してあったけど、実はビット容量表記(バイト容量の8倍の値)だったのでした。(おじいちゃんの昔話)

まとめ

実質的に必要性のない複雑さは、無駄である。言葉というものは、必要なぶんだけ意味が伝わればいい。
そしてこの「○ビバイト」という呼び方、キビバイト、メビバイト、ギビバイト、テビバイト…と続くのだけれど、なんだかこの響きはとっても変な感じがする。それにキビとギビが見分けづらい。
だから使いたくなくて、それがこの記事を書いた理由なのだけどね!

参考URL

2進接頭辞 - Wikipedia
通信の世界ではkbps(キロビット毎秒)が1000bpsを意味する事が多いらしい。

勝手にスリープが解除される時の対処法 (Windows10)

Windows10のPCが勝手にスリープから復帰してしまう現象を解消する(かもしれない)設定方法をご紹介します。

原因になっている可能性が高い設定項目は三つあります。
順に変更方法を説明しますが、簡潔にするため設定の意味等は省いています。解らない場合は別途Google等で検索してみてください。
なお、Windows 8や7、それ以前のバージョンでも同様の設定が可能ですが、設定のある場所や項目名が異なる場合がありますのでご注意ください。

何れの設定も、間違って他の箇所を変更しないように慎重に行ってください。

設定の開き方

各項目をコントロールパネルから設定する際、メニューを辿らなくても下記の何れかの方法でも開くことができます。

  • スタートメニューを開いて直接、設定項目名を入力して検索する。「電源オプション」「デバイスマネージャ」など。
  • エクスプローラを開き、アドレス欄に「コントロール パネル\ハードウェアとサウンド」などのパスを貼り付ける。

1. 電源設定

「コントロール パネル\ハードウェアとサウンド\電源オプション」から
現在選択中のプランの「プラン設定の変更」> 「詳細な電源設定の変更」>
「スリープ>スリープ解除タイマーの許可」(他の表記の場合あり) を無効に。

2. 自動メンテナンス

「コントロール パネル\システムとセキュリティ\セキュリティとメンテナンス\自動メンテナンス」から
「スケジュールされたメンテナンスによるコンピューターのスリープ解除を許可する」のチェックを外す。

3. デバイスマネージャ

「コントロール パネル\ハードウェアとサウンド」から、デバイスとプリンターの「デバイスマネージャ」を選択。
デバイスマネージャが開いたら、「ネットワークアダプター」「キーボード」「マウス」それぞれの中にある使用中のデバイスに対して下記のような設定を行う。

キーボードの設定例
「キーボード」の中の「HIDキーボードデバイス」など接続しているキーボードデバイスを開く。
「電源の管理」タブの「このデバイスで、コンピューターのスタンバイ状態を解除できるようにする」のチェックを外す。

※ネットワークアダプターは「Realtek PCIe GBE…」など、マウスは「Logicool…」などで、使っている機器により異なります。

但しキーボードやマウスの設定を変更すると勿論、それぞれからのスリープ復帰が出来なくなるので、不具合改善の最終手段としてください。
ネットワークアダプターは設定しても通常は困らないはずです。他のデバイスよりも原因である可能性が高いので、まずはこれのみ試してみることをお薦めします。

改善しない時は

これらで問題が解決すれば良いのですが、周辺機器の影響や、他の原因の場合もあるようです。
全て試して再起動しても改善しない場合は、下記サイトが参考になります。

Windows10が夜中に勝手にスリープ復帰する場合の解決法
Media CenterやWindows Update関連でのスリープ解除の対処方法(中上級者向け)。

mouse computer FAQ - アーカイブページ
勝手にスリープから復帰する現象について(Windows7)。画像入りで詳しく解説されています。

テーマ: Windows 全般 - ジャンル: コンピュータ

PHPで今日の0時のunixタイムを取得する

PHPで記事の投稿日時などを処理する時、その日時が今日なのか、昨日あるいはそれ以前なのかを判定したい場合があります。
そこで、今日の0時0分0秒のタイムスタンプを取得・比較することで判定する方法を考えてみます。

strtotime()で今日の0時0分0秒のUnixタイムスタンプを取得

strtotime('today') で今日0時のタイムスタンプを取得して、その前後を if()で比較判別する。
取得した値に 3600*24*n を加減算すれば n日前などの判別も可能。

strtotime()では他にも、'yesterday' で昨日、'tomorrow' で明日など、相対的な書式指定で様々なUnixタイムスタンプを取得できる。
また、月末の日を取得する 'last day of' も便利。

mktime()で上記と同じUnixタイムスタンプを取得

mktime(0,0,0) でも strtotime('today') と同じ結果が得られる。
mktime(8,0,0) で今日の8時丁度を取得する等、任意の時間を取得することも可能。
文字列の変換が無いので、たぶん一番軽い。

パラメータは mktime(時, 分, 秒, 月, 日, 年) で全て省略可能、省略時は現在の日時になる。

今日かどうかだけを判別する

タイムスタンプを使わずに、date()で今日現在の日付と $unix_timeの日付を比較して判定。
簡易的だが、2回date()で変換するので多少重いかもしれない。

if( date('Ymd') == date('Ymd', $unix_time) ){ ... }

Windows版PHPで日本語ファイル名が正しく扱えない問題について

Windows版のPHP(5.3~7.0)では、日本語等の全角文字(非ASCII文字)を含むファイル名の取得や指定に失敗することがあります。
例えば glob()や scandir()、RecursiveDirectoryIteratorなどのイテレータを使ってファイル名一覧を取得した時、一部のファイルが抜け落ちてしまいます。

原因

原因はどうやら二つあるようです。
一つは、Windows版PHPはShift_JISでファイル名を扱うようで、Unicodeを含むファイル名を無視してしまう為です。
もう一つは、いわゆる5c問題です。Shift_JISでは全角文字の2バイト目が \記号(16進の0x5c, バックスラッシュ)を含むことがあり、これがエスケープ文字やディレクトリ名の区切りと誤認識されてしまう事に起因する不具合です。

解決策

これに対する解決策はないかと、様々試行錯誤してみたのですが解決できませんでした。
glob()を使ってもイテレータを使ってもダメだったので、setlocale(LC_ALL, 'Japanese_Japan.932')や mb_internal_encoding('CP932')等で5c問題だけでも解決するかもしれないと思い試してみましたが、こちらもダメでした。
よって、Windows版PHP(5.3~7.0)では非ASCII文字のファイル名を全て正しく扱うことは残念ながら出来ないというのが結論です。

ただ、色々調べていて解ったことがあります。
実は、PHP5.2までは(恐らく5c問題については)大丈夫だったようなのです。
つまりこれは、PHP5.3以降、PHP7.0までに固有のバグだということです。
更にこちらの記事によれば、このバグはPHP7.1で遂に修正され、喜ばしいことにShift_JISの0x5cやUnicodeを含むファイル名もUTF-8で正しく扱えるようになるとの事です!やったー(´;ω;`)ウッ…

サーバ運用では日本語ファイル名をどうしても扱わなければならないケースというのはあまり無いとは思いますが、やはり正しく扱えれば有り難い事ですね。

テスト環境

PHP 5.6.15
Windows 10

参考