にしし ふぁくとりー:西村文宏 個人サイト

Presented by Nishishi via Movable Type. Last Updated: 2023/02/02. 00:21:03.

Sakura Scope (2021年08月)

ちょっと倒錯気味な、ただの日記です。(^^;)
これはやばいと思われた場合は、お早めに閲覧を中止されることをお勧め致します。

画面を見ずにWindows10をキー操作でログオンまたはシャットダウン(または再起動)する方法

画面を見ずにWindows10をキー操作でログオンまたはシャットダウン(または再起動)する方法

何らかの原因でディスプレイに何も映らなくなった際には、キー操作だけでWindows10にログオンしたりシャットダウンしたりする方法が使えると役に立ちます。

例えば、PCの電源を入れたら、PC自体は起動プロセスに入ったようだけども画面には何も映らないとか。
➡そういう場合には、画面を見ずにログオンを成功させて、かつ、安全にシャットダウンさせたいですよね。

もしくは、普通にWindows10を使えていたのに何かの拍子に突然画面に何も映らなくなったとか。
➡ディスプレイの電源を入れ直したりHDMIケーブルを挿し直したりしても、どうにも画面に何も出てこない場合は、とりあえず起動中のソフトウェアを一旦無視してWindows10を再起動させたいです。

そのようなとき、Windows10ならわりと簡単にキー入力だけで操作できます。

【目次】

画面が見えない状態でログオンする方法

まずは、ログオン画面が確実に表示されていると思える頃合いまで待ちましょう。
これは普段からそのPCを使っていれば想像可能だと思います。もし分からない場合は、1分なり2分なり充分な時間を待てば良いでしょう。

Windows10のログオン画面が表示されている状態とは、もし画面が見える状況なら下図のような感じの画面になっている状態です。
Windows10のログオン画面の表示例

ここでマウスを適当にクリックしてはいけません。ログオン画面に表示されている文字の上にたまたまマウスポインタがあったら、ログオン後にブラウザが自動起動してしまうことがあるからです。ここでは、マウスは触らずに、キー操作だけでログオンしましょう。

▼キー操作だけでWindows10にログオンする手順

キー操作は以下のようにします。

  1. まず、[BackSpace]キー押します(※)。
    ➡ すると、パスワード(またはPIN)の入力画面になります。
  2. 次に、パスワード(またはPIN)を入力します。
  3. 最後に、[Enter]キーを1回だけ押します。

上記の手順で、ログオンができるはずです。

できなかった場合は、パスワードの入力が誤っているか、入力画面が出ていないかでしょうね。画面が見えない状態では区別する方法がないので、上記の操作手順を再度試してみるしかないでしょう。

※パスワードを間違えた場合は、「パスワードが違います」という表示とともに「OK」ボタンが表示されます。なので、パスワードを再入力する前に1度[Enter]キーを押す必要があります。しかし、「今、OKボタンが表示されているのか、入力欄が表示されているのか」を画面を見ずに区別することはできないので、もしうまく行かないようなら、『[Enter]キーを何度か押す→パスワードの再入力を試す』という手順を何度か試して、偶然うまくいくことを狙うしかない気がします。

▼※最初に[BackSpace]キーを押す理由

ログオン画面では、何らかのキーを押すとパスワード(またはPIN)の入力状態にできるのですが、ここでは適当なキーではなく、[BackSpace]キーを押すのがお勧めです。

なぜかというと、

  • 何らかの文字のキーを打ってしまうと、パスワードの1文字目として誤認されると入力が正しくなくなる。
  • [Enter]キーを押すと、パスワードの入力完了操作だと誤解されるとその後の対処が面倒。
  • [BackSpace]キーなら誤認される可能性がないし、連打しても問題ない。

だからです。
画面が見えない以上、「いま、どういう状況なのか」が把握できないので、極力余計な操作はしないのが一番です。

[BackSpace]キーなら、単独で押しても特に意味はない(しかしパスワードの入力画面には移行してくれる)ので、ここでは適しているでしょう。もし、既にパスワードの入力画面になっている場合でも、[BackSpace]キーなら何の文字も入力されないので安心です。

※なお、[Ctrl]キーを押す方法でも良いと思います。単独では意味がないキーなので。しかし、[Shift]キーや[Alt]キーではダメでした。(私の環境で試したところ、入力画面に移行しませんでした。)

というわけで、まず最初に[BackSpace]キーを押しましょう。

※ただし、ユーザ名も自力で入力しなければならない環境で使っている場合は、[Ctrl]+[Alt]+[Del]キーを押し、ユーザ名を入力してから[Tab]キーを1回押し、パスワードを入力してから[Enter]キーを押す手順が必要です。

画面が見えない状態でシャットダウンor再起動

Windows10では、[Windows]キー+[X]キーを押すと下図のような小さなメニューが出てきます(※スタートボタンを右クリックしても出てくるメニューです)。このメニューの構成はバージョンや設定によって微妙に異なることがありますが、下の方に「シャットダウンまたはサインアウト」という項目があります。このメニューはキー操作で押せますから、画面が見えなくても操作できます。

[Windows]キー+[X]で表示されるメニューにはシャットダウンや再起動の項目もある

上記の機能を使うと、画面が一切見えない状態でもシャットダウンや再起動ができます。

  • シャットダウンは、まず[Windows]+[X]キーを押してから、[U]キー→[U]キーの順で押します。
  • もし再起動させたい場合は、[Windows]+[X]キーを押してから、[U]キー→[R]キーの順で押します。「都市再生機構のUR」で覚えましょう。(笑)

※英字キーを上記では大文字で記載していますが、大文字を打たなければならないわけではないので[Shift]キーは不要です。そのまま英字キーを押して下さい。

以上のキー操作で、Windows10のシャットダウンや再起動ができます。
とても簡単ですね。

なお、デスクトップPCをお使いなら、「PC本体の電源ボタン」を押すだけでもシャットダウンできる場合があります。ノートPCの場合は、電源ボタンはスリープや休止状態などに割り当てられている場合もあるので、シャットダウンできるとは限りませんが。(どちらも場合でも、電源ボタンを10秒間くらい長押しすれば、強制的に電源を切ることはできると思います。それは「最後の手段」ですけども。)

Windows10にログオンした直後とか、もしくは何らかのソフトウェア(アプリ)を起動してはいるものの「未保存のデータが1つもない」状態なら、上記のショートカットキーだけでシャットダウンや再起動ができます。しかし、未保存のデータがある場合は、別の画面が出てきますのでもう少し対処が必要です。その方法を以下で解説します。

未保存のデータを編集中のソフトが起動している状況で、キー操作だけでシャットダウンや再起動する方法

既にWin10をしばらく利用していて、何らかの未保存のデータを編集中のソフトが起動している状況で画面が見えなくなってしまった場合はちょっと操作が増えます。

先の方法([Windows]+[X]キーを押してから[U]→[R])で再起動しようとしても、下図のように「このアプリが再起動(シャットダウン)を妨げています」などと表示されて、強制的に再起動するかキャンセルしてデスクトップに戻るかの選択肢が表示される画面で止まります。なので、この画面の対処が必要です。

アプリを閉じて再起動します「このアプリが再起動を妨げています」強制的に再起動orキャンセル画面

この画面でもキー操作でボタンを押せますが、余計なキーを押してしまうとうまくいかなくなるので注意が必要です。

上の写真からは見えませんが、この画面が表示された直後は「キャンセル」ボタンにフォーカスがあります。なので、[Enter]キーを押すとデスクトップに戻ってしまいますし、[ESC]キーを押してもデスクトップに戻ります。

▼キー操作で「強制的に再起動(シャットダウン)」を選ぶ手順

ここでは、以下のキー操作が必要です。

  1. まず、[Shift]+[Tab]キーを1回だけ押します。すると、フォーカスが「強制的に再起動」ボタンの方に移動します。(下図参照)
    [Shift]+[Tab]キーで左隣の「強制的に再起動」にフォーカスを移動。
    ※うっかり2回以上押してしまった場合は、押しすぎた回数だけ[Tab]キーを押すと戻れます。
    ※カーソルキーでは移動できません。
  2. 次に、[Enter]キーを押します。するとボタンが押下できますから、強制的にアプリを終了させてWindows10の再起動が実行されます。

上記のステップでは、最初に[Shift]+[Tab]キーで移動する点がポイントです。[Tab]キーだけだと、上のアプリ選択肢にフォーカスが移動してしまうので、そのとき起動しているアプリの数によって必要な移動量が異なりますから、画面が見えないとどうしようもありません。

どうもキー操作に失敗したっぽい……という場合は、[ESC]キーを押してデスクトップに戻り、再度 [Windowsキー]+[X] から操作をやり直すと良いでしょう。[ESC]キーを押せば、フォーカスがどのボタンにある場合でもデスクトップに戻れます。

画面を見ずにキー操作で対処した後はケーブルも確認

以上、画面に何も映らない状態でもWindows10にログオンしたり安全にシャットダウンしたりする方法でした。(いや、起動中のアプリを強制終了する場合は「安全にシャットダウン」できるかどうかは分かりませんけども。でも、少なくともPC本体の電源ボタンを長押しするとかでWindows10を強制終了するよりは安全ではないかと思います。^^;)

なお、Windows10を再起動しても何をしてもディスプレイに何も映らない場合でも、「PCが故障した」または「ディスプレイが故障した」と考えるのは早いかもしれません。ケーブルが断線したという可能性もあります。まずは、PCとディスプレイを接続しているケーブルを挿し直してみるとか、別のものに交換してみるとか試してみるのがお勧めです。

縦長ページでlazyloadを使うとページ内リンクの移動先がズレる問題の解決方法

LazyLoadを使っているページで「ページ内リンク」の移動先がズレる問題を解消するには、画像の専有面積を事前に確定させれば良い

見出しの1行だけで言いたいことは全部言えてしまうのですけども。(^_^;)

最近のブラウザならどれにも搭載されている画像の遅延読み込み機能(=画像の掲載場所付近までスクロールしない限り画像ファイルを読み込まないようにしてくれるブラウザ側の機能)は、無駄な通信量の削減に役立ちます。

初期はJavaScriptで実現するしかありませんでしたが、HTML5でloading属性が正式に追加されたので、今ではimg要素にloadiong="lazy"と追記しておくだけで簡単に使えます。(このように指定されたimg要素の画像は、閲覧者が実際にその表示位置までスクロールしない限り読み込まれません。)

とてもお手軽な方法なので、最近ではimg要素を書く際には(どれがどこに掲載されるものでも)問答無用でloadiong="lazy"を加えています。

ただ、この属性を加える際(というか遅延読み込みを使う際)には注意しないと、ページ内リンクの移動距離が正しくなくなって、ページ内リンクがうまく機能しなくなることがあります。具体的には、ページ内リンクの移動先座標よりも手前までしか移動できなくなってしまう現象が起きることがあります。

画像の掲載面積が不明だと、まだスクロールされていない位置にある画像の描画空間を確保できないため、移動位置がずれる。

※画像素材の提供元: ウェブサイトのイラスト(@いらすとや)

図の左側は、ページ内の画像が全部読み込めている状態の例です。右側は、LazyLoadによって「1画面目」を超える位置にある画像は読み込めていない場合(で、画像の縦横比が分からないために画像の占有空間を確保できていない状態)です。

このとき、②の位置へ移動するページ内リンクを作っていたとします。図の右側のように、各画像の専有面積が確保できていなければ、②の位置はもっと上部の①の位置になります。その結果、各画像の専有面積が確保できていない状態でのリンク先(移動先)は①の位置になります。なので、①の位置までしか移動してくれなくなるわけです。

(通信速度が遅ければ、一旦は②の位置までスクロールしたように見えて、途中にある画像が次々に読み込まれていった結果として、目的の位置(②の位置)が下方向へどんどんずれていく様子が見えるかもしれません。)

img要素にwidth属性とheight属性がないと、画像の専有面積(特に縦横比)がソースからは分からないので、画像用空間の事前確保ができない

このような移動距離不足の問題が起きるのは、img要素にwidth属性やheight属性を書いていない場合です。

レスポンシブなデザインが当たり前になって以後は、(個人的には)img要素にwidth属性もheight属性も書かないことが多くありました。CSS側でサイズを指定するのでHTML側にサイズを書いても無駄だろうという考えからです。

しかし、width属性やheight属性を省略してしまうと、実際に画像が読み込まれるまで画像がどのようなサイズでページに描画されるべきなのか(ブラウザ側が)判断できない問題があります。

その結果、画像の専有面積をゼロだと仮定した移動量で計算されてしまうのか、「画像が読み込まれていない状況での移動先座標」と、「画像が読み込まれた後での移動先座標」にズレが出てしまって、ページ内リンクで(特に長距離を)移動する際には移動先の座標がズレてしまうのでした。

なので、width属性とheight属性は省略せずに書く

これを防ぐには、とりあえずwidthとheight属性をimg要素に書いておくことです。

とはいえ、実際に表示されるサイズである必要はありません。
画像の表示サイズは、CSSを使って「横幅を割合で指定+高さは自動調節」というように書いている場合もよくありますよね。この場合、画像が実際に表示されるサイズをHTMLにお書いておくことはできません。実際に必要なのは「画像の縦横比」だけですから、縦横比が分かる値が書かれていれば問題ありません。

望ましいのは「CSSが読み込めなかった場合に表示させたいサイズ」を書いておくことだとは思いますけども。ただ、昨今、「CSSが読めなかったらどうしようもないページ」もそこそこありそうなので、まあ、原寸サイズを書いておくのでも良いかな、という気がしています。

このwidthとheightの両属性がHTMLにあれば(それによって縦横比が分かるので)、CSSと組み合わせることで画像の占有面積が特定できるため、遅延読み込みによって画像が読み込まれていなくてもページ内の物体の配置座標が確実に決まりますから、ページ内リンクがズレることもありません。

(HTML側でサイズの指定がなくても、CSS側でピクセル単位でサイズが指定されているなら問題はないのでしょうけども。)

もしかしたら業界では当たり前のことだったかも知れないのですけども、私はそこに気付くのに結構な時間が掛かってしまいました。┌(:3」└)┐

※なお、この「widthとheightがHTMLにあれば、CSSでwidth:100%とか書いていても縦横比から正しい専有面積を事前にブラウザが計算してくれるよ」という話は、Google developersの記事 Optimize Cumulative Layout Shift > Images without dimensions でも解説されていました。

PCデスクを新調するなら背面や側面は金属製がお勧め

机の背面や側面に電源タップ等を磁石でくっつけられると、床にケーブルを散乱させずに済むので、床にホコリが溜まりにくい

PCデスクの背後にはケーブルが溜まりがちです。できるだけケーブルを少なくしようと思っても、PCやディスプレイはもちろん、周辺機器1つ1つに電源ケーブルが必要ですし、それらを相互に接続するケーブルも必要ですから、なかなか少なくはできません。近接した場所にあるなら複数のケーブルを1本にまとめる方法でシンプルにできそうに思えますが、実際には各周辺機器はそれなりに離れていることもあってなかなか1本にはまとまらず、結局、ケーブルが散乱することになります。

そんなPCデスクに必須だと言っても過言ではないと思っている条件が、側面や背面が金属製であることです。
机の背面や側面に磁石がくっつくなら、床を常時スッキリさせられます。

下記の写真(1枚目)は、私のメインPCデスクを背後から撮影したものです。
電源タップや各種機器が机の背面にくっついているのが見えます。これはマグネット付きの電源タップ等を使っているためで、机の背面の金属板に磁力でくっついています。

PCデスクの背面に磁石で固定されているタップ等から伸びるケーブル群 PCデスク前面からの光景

先日に31.5インチ液晶を導入したと書いたブログ記事で紹介したPCデスク(上記2枚目の写真)の背面はこんな感じになっていたのでした。

たくさんケーブルが見えますが、机の背面に電源タップや各種機器がひっついていることで、ケーブルが床に散乱するのを防げています。(右下に1本だけ白い電源コードが床に付いているように写真では見えるかもしれませんが、PC机のキャスターの上に引っかけてあるので、微妙に床からは離れています。)

これだけのケーブルが全部もし床にあったら、ケーブルとケーブルが作り出す輪っか空間にホコリが溜まりまくって掃除がめちゃくちゃ大変になるでしょう。
しかし、上記の写真のようにケーブルが机の背面にあれば(ケーブルそのものの上にはもちろんホコリは付くのですが)ホコリが床に溜まることがないのでずいぶん掃除は楽です。クイックルワイパーでさっと拭くだけで済みます。

削減しようのないケーブルがいっぱいあるのはどうしようもない

写真では右側から、①電源タップ1(黒色)、②電源タップ2(白色)、③キーボード・マウス切替機、④スイッチングHUBがそれぞれ磁石で貼り付いています。これらは各製品が元々「マグネット付き」として販売されているものです。既存の製品に自力で磁石を貼り付けても良いかもしれませんが、私は(マグネット付きの製品ばかり調達できたので)そうはしていません。

磁石でPCデスクの背面にくっついている機器

なんでこんなにケーブルがあるんだ……? と自分でも不思議に思うのですが、実際にカウントしてみるとどれも必要なケーブルばかりで削減できません。
具体的には以下のケーブルがあります。

▼電源

  • メインPCの電源ケーブル。
  • サブPCの電源ケーブル。
  • メインディスプレイの電源ケーブル。
  • サブディスプレイの電源ケーブル。
  • ノートPCの充電電源ケーブル。
  • スキャナの電源ケーブル。
  • モバイルルータの充電電源ケーブル。
  • スイッチングHUBの電源ケーブル。

まず、電源だけで8本ですね。電力を使う機器である以上、電源ケーブルは省略しようがありませんから、繋げるほかどうしようもありません。なお、プリンタは無線接続でPC机からはちょっと離れた場所に設置してあるので、ここからは電源を取っていません。また、家庭内LANのルータも別部屋にあるのでここからは電源を取っていません。

あと、机の上に電源を伸ばすための延長コード(小さめの電源タップ)も繋がっています。そこには、モバイル機器を充電するためのUSBケーブルとか、有線LANの先を無線化する機器とか、その他の周辺機器の電源等が繋がっています。机上の使い方によっては、これらの電源ケーブルも背後に垂らしたかもしれません。

▼入力機器(キーボード・マウス)とその切替機

  • 入力切替機とキーボードを繋ぐUSBケーブル
  • 入力切替機とマウスを繋ぐUSBケーブル
  • メインPCと入力切替機を繋ぐUSBケーブル
  • サブPCと入力切替機を繋ぐUSBケーブル
  • 入力先PCの切替ボタンを机の上まで延ばすケーブル

メインとサブの2台のPCで、「1つのマウス・1つのキーボード」を共用しているため、切替機が必要です。写真では見えにくいですが、切替機が机の背面に磁石でくっついています。(切り替えボタンがケーブルで机の上まで延ばせる仕様になっているので、机の上にあるボタンを押すことでPCを切り替えられます。なので、そのボタン用のケーブルもあります。最初に電源を入れた方のPCに自動的に切り替わるので、押す機会はそう多くはないのですが。)

▼通信(ルータ/ハブ/LANケーブル)

  • 別部屋のメインルータからスイッチングHUBまで延びてくるLANケーブル
  • スイッチングHUBとメインPCを繋ぐLANケーブル
  • スイッチングHUBとサブPCを繋ぐLANケーブル
  • スイッチングHUBとノートPCを繋ぐLANケーブル
  • スイッチングHUBと無線化機器(有線LANを無線化するWi-Fi機器)を繋ぐLANケーブル
  • モバイルルータのクレードルとスイッチングHUBを繋ぐLANケーブル

これらはネット接続をすべて無線化してしまえば不要になるケーブルではあるのですが、有線の方がLAN内の通信速度が速い上に、通信トラブル時に原因を探る手間が減るので、主な機器はすべてLANケーブルで有線接続しています。

とはいえ、iPod touchやタブレットなどのモバイル端末は無線(Wi-Fi)でしか繋がらないので、有線LANの先をWi-Fi化する機器も1つ繋げてあります。(別部屋にある大元のルータには今は無線機能もあるのですが、なかった時代から使っているので。)

というわけで、LANケーブルは6本あります。

(なお、家庭内LANのメインルータに繋ぐこともできますし、モバイルルータに有線で繋ぐこともでき、必要に応じてケーブルを差し替えて使っています。このように回線が2つあると、片方に通信トラブルが発生したときにもインターネット接続自体は断たれにくいので、いざというときに役に立ちます。片方の回線が混雑しているときに、もう片方に切り替えて使ったりもしています。)

▼機器同士の接続ケーブル

机の背面に磁石で貼り付いている機器に直接繋がっているケーブルは上記くらいです。
しかし、それ以外にも机の背面に回り込むケーブルはあります。機器同士を繋ぐケーブルです。PC本体は机の背後や横に設置してあるので、そうなります。

  • メインPCとメインディスプレイを繋ぐHDMIケーブル
  • メインPCとサブディスプレイを繋ぐDVIケーブル
  • サブPCとメインディスプレイを繋ぐHDMIケーブル
  • サブPCとサブディスプレイを繋ぐVGAケーブル
  • メインPCとスキャナを繋ぐUSBケーブル
  • メインPCとマイクを繋ぐ音声ケーブル

ディスプレイも繋ぐほか選択肢はありませんから、これらのケーブルも省略できません。とはいえ、ディスプレイにはスピーカーが内蔵されていて、音声信号は映像と一緒にHDMIケーブル1本で伝送されますから、その分のケーブルは省略できているのですけども。
(PCで音楽を再生するときはヘッドホンを使うので音楽用のスピーカーは必要ありませんから、ディスプレイ内蔵のスピーカーで充分です。BGM再生用のBluetooth接続スピーカーが机からちょっと離れた場所にあるにはあるのですけども。)

▼PCの電源スイッチ延長ケーブル

あと特殊なところでは、PCの電源ボタンを延長するケーブルもあります。先の写真で手前や左側に少し見えている白い物体がメインPCとサブPCです。私はPC本体を机の背後に追いやっているので、PCの筐体にある電源ボタンを押そうと思ったら机を回り込まないといけません。それでは手間なので、電源ボタンを延長するケーブル(※汎用ではなく、そういう拡張が可能なPC筐体でしか使えない専用機能です)を使って、PCの電源ボタンを机の上に配置しています。そのケーブルが1本あります。

とはいえ、PCの電源はほとんど入れっぱなしなので、電源ボタンを押す機会はそんなにはないのですけども。

これらのケーブルがすべて床と接触していない点が重要

で、本題に戻るわけですが、
上記で紹介したすべてのケーブルが、床には散乱していないことが重要です。磁石で机の背面に取り付けられると、床にケーブルが散乱せずに済むので掃除が楽です。もしこれらのケーブルがすべて床の上にあったら、ケーブルとケーブルの間にホコリは溜まるし、ケーブルのせいで掃除はしにくいし、かなり大変でしょう。

というわけで、もしこれからPCデスクを調達しようとしている方には、机の側面や背面が金属でできている製品を強くお勧めします。PC関連機器は(主にオフィス用途を想定しているのでしょうけども)裏面が磁石になっている製品も多々ありますから、そういうのを選ぶと便利です。(もちろん、自力で磁石を貼り付けても良いと思いますが。電源タップは(たくさんケーブルを挿せばなおさら)そこそこ重たくなるので、ずり落ちないようにするにはわりと強めの磁力が必要な気がします。)

機器と機器を繋ぐケーブルは磁石では付きませんが、「ケーブル同士をまとめるマジックテープ」と「粘着シールで貼り付くフック」を併用して、ケーブルの束を机の背面の下端あたりに引っかけることで、床には付かないようにしてあります。(写真ではPC筐体に隠れて見ませんが。)

このようにしておくと、床が大変スッキリするのでクイックルワイパーとかで簡単に掃除ができます。

電源タップにもホコリは溜まりがちですが、コンセント(差し込み口)が上向きになっていると、空いている穴にホコリが溜まって危なそうですよね。電源タップが机の背面に磁石で付いていると、(たいていは)差し込み口が横を向くのでホコリは溜まりにくそうです。そんなメリットもあります。(もっとも、コンセントキャップを使えば向きはどうでも良いのですけども。念のために私も空いているコンセントにはキャップを付けてあります。)

▼既に金属製ではない机がある場合は

とはいえ、既に金属製ではない机がある場合には、わざわざ机を新調するわけにもいかないでしょう。要は、電源タップ等がくっつく場所があれば良いわけですから、机の横とかにスチールラックのような磁石のくっつく物体を置いて、そこにひっつけられるようにする手もありそうな気がします。もちろん、金属の板とかを買ってきて机の背面に貼っても良いかも知れませんが。その場合はしっかり貼らないと重さで落下しそうですけども。

あと、机は背面を部屋の壁にひっつけない方が良いと思います。
机の背面を壁にひっつけてしまうと、背後のケーブルにアクセスするのが大変ですよね。いちいち机や機器を動かさないといけなくなりますから。机の背面ではなく側面を部屋の壁にひっつけるよう机を配置すると、机の裏に回り込めるのでケーブルの調整がしやすくて楽です。
まあ、この辺は部屋の間取り次第でしょうけども。

というわけで、PCデスクは背面や側面が金属製のものがお勧めだという話でした。

マグネット付きの電源タップ(@Amazon.co.jp)
マグネット付きのスイッチングHUB(@Amazon.co.jp)
キーボード・マウス切替機 手元スイッチ・マグネット付(@Amazon.co.jp)

BingbotやGooglebotのクロール頻度を下げる方法を試した

普通は必要なだけクロールして欲しいものだけど、API利用権の制限がある場合にはBotアクセスだけで上限を超えると困るのでクロール頻度の制限が要る

私が運営しているとあるウェブサイト(※このブログがあるサイトではありません)では、ある外部WebサービスのAPIを利用してページを生成しています。

そのWebサービスのAPIには1日あたりのリクエスト数に制限があるため、それを超えてリクエストを送るとエラーが返ってくるようになってしまいます。なので、リクエスト数を超えないように利用頻度の調整が必要です。

元々そんなに多くのアクセスがあるとは想定していなかったサイトなのですけども、調べてみると1日あたりのAPIリクエスト数が結構高いところまで増えてしまっていました。23時29分の時点で権利数の95%を消費していて、ちょっとでもアクセスが集中することがあったら権利を使い果たしてしまいそうな感じです。

以下は、そのウェブサイトを構築したときに、クローラーからのアクセスだけでAPI利用権を使い尽くしてしまわないようにするために採った施策の話です。

▼多くはbotからのアクセスなのだけども

サーバのアクセスログを見てみると、本当にユーザ数が多いわけではなく、大半はbot(クローラー)からのアクセスでした。元々いくつかの方法でbotからのアクセスを弾いたり頻度を制限したりする施策は加えてあったのですが、お手製のフィルタをすり抜ける新しいbotが現れることもあります。放っておくと、1日に数千回のような莫大な回数もアクセスしてくる悪質なbotが時々現れるので困ります。(-_-)

Webサイトへのアクセスをそのまま(Webサービスの)APIに投げるようなことはしておらず、同じデータは一定期間(数週間)は再取得せずに済むようにキャッシュを取ってはいるのですけども、それでもbotの数が増えてアクセス頻度も増えれば、いつかは1日のリクエスト数の上限に達してしまうわけで、何らかの対策は必要です。

今は「botのようだったらフィルタを通す」というようなプログラムを書いているのですが、これだといたちごっこになりがちなので、どうしても対処できなさそうなら「人間っぽくなければ全部フィルタを通す」というような方法にせざるを得ないかもしれません。
前者の方法を採用しているのは「マイナーなアクセス環境から来ている人にも正しく閲覧できるようにしたい」と考えてのことです。後者の方法を採ると「本当は人間なのに弾かれてしまう」ケースが出てくる可能性があるので、できるだけ最後の手段にしたいとは思っているのですが……。

Bingbotのアクセス頻度を下げる方法

で、サーバのアクセスログを詳しく確認してみたところ、なんとMicrosoftの検索サイト「Bing」から来るクローラーであるBingbotも結構な頻度でアクセスしてきていたことに気付きました。

Bingbotのアクセスは1日で10,785回でした。1日(24時間)は秒に換算すると‭86,400‬秒ですから、12秒に1回くらいのペースですね。
なんでそんなに……。(^_^;;;

というわけで、まずはBingbotのアクセス頻度を下げる方法を試しました。
Microsoftが提供しているBing Webmaster Toolには、クロール時間帯を調整する機能はあるのですけども、クロール総数(頻度)を抑制する機能はなさそうです。
しかし、robots.txtに「Crawl-delay」の項目を加えて値を書いておくことで、クロール間隔の指定は可能なようでした。

▼robots.txtファイルにCrawl-delayを書く

検索サイトのクローラーへの指示方法として代表的なのはrobots.txtファイルを設置しておくことですね。
Bingbotが1日にrobots.txtを何回読んでいるのかなと思ってログを調べたら、70回も読んでいて驚きました。robots.txt以外の全ページを含めたアクセス回数が10,785回でしたから、Bingbotは全クロールの0.65%をrobots.txtの読み込みに使っていることになります。アクセスログを見たのは1日だけなので、毎日そうなのかどうかは分かりませんけども。(ちなみに、Googlebotがrobots.txtを読む頻度はだいたい0.1%くらいでした。)

とりあえずrobots.txtに、以下の2行を加えてみました。

User-agent: Bingbot
Crawl-delay: 30

翌日に確認したところ、6割減くらいにまで削減できていました。(Bingbotが凄まじく大量にアクセスしまくっていたことにも驚きましたが)robots.txtに制限(Crawl-delay)を書くだけであっという間に制限に従ってアクセス頻度を低下してくれたことにも驚きました。
さすがにMicrosoftの名前を冠してアクセスしてくるだけあって、(デフォルトの行儀はともかく)明示的な制限にはきっちり従ってくれるようですね。

Googlebotからのアクセス頻度を下げる方法

GoogleのクローラーであるGooglebotは、当初はかなーり上品な頻度(要するに少ない頻度)でしか来なかったのですけども、(日々増えるページが自動追加される仕組みの、動的に生成した)サイトマップXMLを少し前にGoogle Search Consoleへ登録しておいたところ、予想以上にアクセス頻度が高くなり、結構な頻度でアクセスされるようになりました。アクセス自体はありがたいのですけども、これもまたAPIの利用権を半日で使い果たしてしまうくらいの高頻度だったので、ちょっと制限が必要になりました。(サイトマップXMLって、ちゃんと読まれていて、しっかり効果があるのだなと実感しました。^^;)

▼Crawl-delayに意味はなく、429を返す頻度による自動学習に頼るしかなさげ

Googlebotは、robots.txt内に「Crawl-delay」を書いても読まない(解釈しない)仕様のようです。Googlebotのクロール頻度を下げる方法は、Googleによる解説ページ「Googlebot のクロール頻度の変更」に書かれています。ただ、ここに書かれていることは基本的に「Googlebotのクロール頻度をWebサイトオーナー側が指定することはできない」ということですが。^^;

Google側は一応はクロール頻度(最大頻度)を指定できる設定ページを用意しているのですけども、90日間しか有効ではなく、90日後には自動判断に戻ってしまう仕様です。何より、今回クロール頻度を調整したいのは、「外部WebサービスのAPIリクエスト権に上限があること」が原因なので、「APIを利用せずに出力できるページのアクセスを制限する必要はない」という点があるので、クロール頻度(の上限)そのものを指定する方法はあまり適切ではありません。

Googleの解説にはもう1つ「緊急クロールの制限」として、「負荷の増大を動的に検出して対応できるなら『HTTP 429』を返せ」と書かれています。そうすると、そのうちGooglebot側が学習してアクセス頻度を落とす感じなようです。今回はその方法を採用しました。具体的には、API利用権の残数が少なくなってきたときに、「APIを利用しないと出力できないページ」にアクセスされた場合にだけ、HTTPステータスコード429(Too Many Requests)を返すようにPHPを書きました。

有名検索サイト以外のクローラーは行儀が悪い大量アクセスをしてくるので問答無用で制限(^_^;)

当初は検索サイト以外から来るbotでも、アクセスを問答無用で拒否したりはせず、ある程度だけ制限した上で許可するような方針で運営していたのですけども、上述のように検索サイトからも結構な頻度で来てくれるので、有名検索サイトからのクローラーだけを優遇する方針に変えました。

具体的には、Googlebot、Bingbot、Applebotだけを特別扱いして、それ以外のBotは概ねブロック(完全にブロックするわけではなくて、外部サービスのAPIを利用して生成しなければならないページだけでブロック)する方針にしました。

一度でも人間または有名検索サイトのクローラーがクロールすれば、一定期間はサーバ側でキャッシュされる仕組みを作ってありますから、その静的キャッシュページにはそれ以外のBotでも何でも大量アクセスされて問題ありませんので、そういうページへのアクセスは何もブロックしません。なので、この制限の仕組みを施しているからといって、必ずしもBotへ情報が遮断されるわけではありませんから、この方針でも概ね問題なさそうだと思っています。

もうちょっとしっかり管理する方針に

当初はそんな行き当たりばったりの感じで対策を施していたのですけども、それでも全体のページ数が増えれば増えるほど、クローラーのアクセスも増えるかも知れませんし、ずっとこの方法でいくのは無理があるな、と思いました。

そこで、最終的には「1日のAPIリクエスト数がXXXX回を超えたら50%ブロック(=HTTPステータスコード429を返す)し、YYYY回を超えたら75%ブロックし、ZZZZ回を超えたら100%ブロックする」というように、具体的なリクエスト総数に応じて多段階にブレーキを掛ける仕様を加えました。
よく考えれば最初からこう作っておけば良かったのですけども。

この方法なら、API利用権を使い切ってしまうこともなく、余らせすぎることもなく、良い感じに自動運営ができそうな気がします。やや心配なのは、HTTPステータスコード429を返す期間が長すぎるとGoogle側が学習してアクセス頻度を大きく低下させてしまう可能性があるかもしれない点なのですけども。(極端な話、「午前中(AM)はアクセス可能で、午後(PM)は完全ブロック」のようになりかねないので、1日の後半のHTTP429数の多さだけから学習されてしまうと困ります。Google側も24時間単位で考えてくれるなら良いのですが。)
しかし、上記の方針で数ヶ月ほど運営してみて、ほぼ毎日同じくらいの分量の「ほどほどのクロール」が続いているようですから、わりと良い対処方法だったのかなと評価しています。

2021年08月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

他の月

--- 当サイト内を検索 ---