WordPress の評価用サイト(某所のクローン)を作った

当初、せっかくなので 1GB VM x 2 がずっと無料で使えると一部で話題の Oracle Cloud Platform の Always Free Services にチャレンジしてみようと思ったが、インスタンスを作るところで “Out of host capacity” と言われて挫折。申込みが殺到していて、雲の中で物理キャパが足りていない模様です。来週またチャレンジしてみる予定。中の人がんばれ!

仕方がないので、個人で借りている EC2 の一部を間借りすることに。このインスタンスではすでに別の WordPress サイトが動いているので、ミドルウェア的には準備 OK。インスタンスのサイズは t2.micro なので Mem 1GB。自己所有ドメイン(DNS は Route53)に CNAME co-jp-rc を追加。ちなみに co-jp-rc は『某サイト.co.jp の RC(Release Candidate)』という意味。

次に、Web サーバにバーチャルホストを追加する。

$ cd /etc/nginx/conf.d
$ sudo vi co-jp-rc.conf
# /etc/nginx/conf.d/co-jp-rc.conf
server {
    listen      80;
    server_name co-jp-rc.example.com;
# 大きめのファイルをインポートするので制限を緩和(nginx)
    client_max_body_size 512m;
    root        /var/www/co-jp-rc;
    index       index.html index.htm index.php;
    fastcgi_read_timeout 3600;
    access_log  /var/log/nginx/co-jp-rc_access.log;
    error_log   /var/log/nginx/co-jp-rc_error.log;

    location ~ \.php$ {
      try_files     $uri = 404;
      include       /etc/nginx/fastcgi_params;
      fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;

      fastcgi_index index.php;
      fastcgi_split_path_info  ^(.+\.php)(/.+)$;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATHINFO        $fastcgi_path_info;
      fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
# 大きめのファイルをインポートするので制限を緩和(php)
# 後述の All-in-One WP Migration で必要になる。
      fastcgi_param PHP_VALUE "
    upload_max_filesize=512M
    post_max_size=512M
    memory_limit=256M
    max_execution_time=300
    max_input_time=300";
    }

    # Disallow access
    location ~ /\.(ht|git|svn) {
      deny all;
    }
    location = /robots.txt {
      deny all;
    }

    # Don't record access to favicon
    location = /favicon.ico {
      access_log off;
      log_not_found off;
    }
}

# 文法チェック
$ sudo nginx -t

WordPress の追加インストールには wp-cli を利用する。インストールすると wp コマンドが使えるようになる。以下のような感じで新しい WordPress サイトを追加できる。

$ mkdir /var/www/co-jp-rc
$ cd /var/www/co-jp-rc
$ wp core download --locale=ja
$ wp config create --dbname=co-jp-rc --dbuser=root
$ wp db create
$ wp core install \
  --url=co-jp-rc.example.com \
  --title=WP-CLI \
  --admin_user=wpcli \
  --admin_password=wpcli \
  --admin_email=hotta@example.com

# コンテンツファイルの所有者を合わせておかないと、プラグインの削除等で認証を聞かれて困る。
$ sudo chown -R nginx.nginx .
# 設定の反映
$ sudo systemctl restart nginx

これで仮の WordPress サイトが動き出したので、wpcli/wpcli でログイン。wp コマンドで指定したこのクレデンシャル(認証情報)が有効なのは最初だけ。この後すぐに別サイトの中身をインポートで被せるので、クレデンシャル含めて消えてなくなる。

データベースの更新が必要とか言われるのでポチッと。すぐに終わる。

管理画面に入ったら、Web サイトの引っ越しに重宝すると評判の(?) All-in-One WP Migration をインストール。メニューに “All-in-One WP Migration” が現れるので、別サイトで All-in-One WP Migration でエクスポートした xxxx.wpress ファイルを指定してインポート。

これで某サイトのクローンができました。自動的に管理画面からはじき出されるので、『某サイト』側の認証情報を使ってログインし直します。今日はここまで。

(参考情報)

MsiInstaller 2755 で泣かされるの巻

VirtualBox を 6.0.10 から 6.0.12 に上げる際にハマったのだけど、おそらく VirtualBox は無罪。内部的には VirtualBox のインストーラが間接的に使っている msiexec.exe が出しているエラーだと思われる。エラーのスクショは取り忘れたけど、だいたいこんな感じだと思っていただければ間違いない。

環境は Windows 10 Home 1903 で、ImDisk Virtual Disk Driver を入れて RamDisk を 4GB ほど取って Z: ドライブにマウントし、TEMP や TMP 環境変数を Z:\Temp に向けている。

c:\Windows\Installer のパーミッション等を見ても問題なさげ。どうもインストーラが msi を z:\Temp\VirtualBox 配下に展開したのはいいけど、その下の *.msi にアクセスできないように見える。

環境変数を消したりとかいろいろ試してみたけどラチが明かず。最後にやってみた作戦でとりあえず切り抜けた。

  1. 通常通りインストールを行う。最後の [Install] ボタンを押してエラーを発生させる。その後[OK]で終わらせる前に、以下の作業を行う。
  2. この時点で z:\Temp\VirtualBox というディレクトリが作られ、その中に common.cab と VirtualBox-6.0.12-r133076-MultiArch_amd64.msi が展開されている。
  3. この VirtualBox ディレクトリ配下を c:\Windows\Temp 配下にコピー。
  4. [OK]をクリックし、インストーラが致命的エラーで異常終了する。z:\Temp\VirtualBox はクリーンアップされる。
  5. c:\Windows\Temp\VirtualBox\VirtualBox-6.0.12-r133076-MultiArch_amd64.msi を直接指定して実行するとうまくいった。

しかし根本原因が知りたいところ。いったん VirtualBox を消したりしたので、再インストールできなかったら Vagrant 環境が壊滅するところだった。ちなみにトラブルシュートの途中でHow to fix “Error Code 2755” when installing programs or applicationsの手順通りやってたら、

Reimage advertisement

という気になる広告を見つけて、あやうく Reimage っていう詐欺ソフトに金を払ってしまうところだった。ツライ。

n 進数について

10 進数(decimal)について

昔の人は数を表すのに、両手の指で足りないときは石を並べたり していたのでしょうか。今でも 10 以上は「たくさん」ですませてしまうところも、 地球上のどこかにはあるかもしれませんね。

これではめんどうなので、「n 進数」という考え方ができたのでしょう。 今の世の中では 10 進数がメジャーですが、これは両手の指の数の合計から 来たことは想像にかたくありません。

ご存知のように、10 進数では 0 〜 9 までの 10 個の「記号」を 並べて行けば、理論上どんな整数でも表すことができるようになっています。 数を表す記号の種類が 10 進数の場合 10 種類なわけですね。

ところが、10 という数字は 1 種の決め事であり、 世の中には 10 進数以外の数え方で考えるものもたくさんあります。 たとえば時間は 10 進数で表現しますが 60 とか 24 とかいう中途半端な単位で 繰り上がりますね。聞いたところによると、フランス語では 60 進数みたいな 数え方をするらしいです。ただし 1 進数はありません。これでは0しか 表せないからです。

コンピュータの世界では、物理的には電気のオン−オフをそのまま 情報として使用するのが都合が良かったので、ここから 2 進数が生まれたんだと 思います。たとえば電気が通じている状態を 1、切れている状態を 0 (またはこれらの逆)で表すようにしたわけです。2 進数では記号が 2 つしか 必要としないので、もともとあった数字のうちの 0 と 1 が使われています。 この 1 桁の 0 または 1 を記憶する単位のことを ビットと呼びます。

2 進数(binary digit)について

2 進数とは

2 進数では記号が 2 種類しかないので、 ある数を表すときに 10 進数より多くの桁数を必要とします。

なんだか覚えづらいですね。

2 進数の性質

これを、単なる数の羅列で考えるのではなく、ある規則性を持たせてみましょう。実は、2 進数は 2 のべき乗表現で表すことができます。下の図を見てください。ここで、’^’はべき乗を、’*’は掛け算を表します。


この表では、2 進数の 8 桁表現を併記しています。理由は、コンピュータ内部で使われる記憶領域の数え方(=メモリ上の記憶の単位)は、上記の「ビット」ではなく、バイト(=8 ビット)が使われるからです。つまり、0 という 1 ビットで表現可能な数を記憶するために、コンピュータ内部では最低でも 8 ビット分の記憶領域が消費されます。

2 進数から 10 進数への変換

どうでしょう。2 進数の(右から数えて)1 桁目は 2 の 0 乗(つまり 1)が何個あるかを表し、同様に 2 桁目は、2 の 1 乗(つまり 2)が何個あるかを表していますね。これを一般化すると、

「2 進数の n 桁目は、2 の n – 1 乗が何個あるかを表す」
ことになります。これで、任意の 2 進数を 10 進数に変換するための方法が分かりました。
ためしに 2 進数の「00110001」を 10 進数に変換してみましょう。今後は便宜上 2 進数は「」でくくることにします。

「00110001」
= (2^5)*1 + (2^4)*1 + (2^0)*1
= 32 + 16 + 1
= 49

ということで、「00110001」は 10 進数では 49 となります。

10 進数から 2 進数への変換

今度は、10 進数の 123 を 2 進数に変換してみましょう。

2 進数の各桁は、それぞれ 2 の n 乗があるかないかを示しているということができます。では、2 の n 乗の値を具体的に羅列してみると、以下のようになります。分かりやすいように、右から書いています。

…、256, 128, 64, 32, 16, 8, 4, 2, 1

ここで、10 進数 123 はこの中の最大どの数を含んでいる(その数より大きい)かを考えてみますと、128 よりは小さくて、64 を含んでいることがわかります。64 は上記の右から数えて 7 番目ですから、123 を 2 進数に直すと 7 桁になり、1 番大きい桁は 1 となります。つまり、「1??????」という数になります。

次に、先頭の 1 は確定したので、残りの数を求めるために先頭の 1 を除外します。除外するとはすなわち引くことなので、残りの数は

123 – 64 = 59

となります。59 は 64 の次の 32 を含んでいますので、6 桁目にも 1 が立ちます。つまり、

「1100000」 = 64 + 32 = 96

96 まで確定したので、残りの数を求めるためには、

123 – 64 – 32 = 27

です。同様にして、

となるわけです。これを応用すればなんとか計算できるようになりますが、いかんせん 1 と 0 だけでは見やすいとはいえませんね(私もさんざん間違えて、いろいろな方にご指摘いただきました。この場を借りてお礼申し上げますm(__)m )。そこで登場するのが16進数です。

16進数(hexadecimal)について

16進数とは

123 が「1111011」になるのは何とかおわかりいただけたのではないかと思いますが、これは人間にとってとても見やすい数字とはいえません。

人間にとって見やすく、かつコンピュータにとっても割と都合がいい表記法として、16 進数というのがあります。これは、

「2 進数を無理矢理 4 ビットずつに分け、
その単位で記号にしてしまえ」

というものです。つまり、123 の 2 進表現である「01111011」(「1111011」を 8 桁表現にするために、先頭に 0 を付加したもの)を「0111 1011」と表記し、これを 2 桁の記号でと表そうというわけです。

4 ビットずつに分けると、各々のかたまりについてのパターンが 0000 〜 1111 まで 16 通りありますね。(理解できない方は、紙に書いて確かめてください(^^; 1 桁で 0 または 1 の 2 通りですから、4 桁あると 2 × 2 × 2 × 2 で 16 通りになるはずです。)16 通りの数字を 1 桁で表すために 16 個の記号が必要になるので、16 進数というわけです。

0 〜 9 では 10 種類しかないですから、ここは短絡的にアルファベットの A 〜 F を拝借することにしたようです。ということで、変換表は以下のようになります。この分だけは完全に暗記して、即時に変換できるようにしておいてください。

先に例を挙げた 123 の 2 進表現である「0111 1011」を、この表を元に 16 進数に変換してみると、「7B」になるのがお分かりいただけると思います。

16 進数の性質

これも 2 進数と同様で、2 のべき乗のところが 16 のべき乗に変わるだけです。では、いくつか例を示します。便宜上、16 進数は XXh と表記します。

100h
= (16^2) * 1 + (16^1) * 0 + (16^0) * 0
= 256

FFh
= 100h – 1h
= 256 – 1
= 255

FFFFh
= 10000h – 1h
= (16^4) * 1 + (16^3) * 0 + …… + (16^0) * 0 – 1
= (16^2) * (16^2) – 1
= 256 * 256 – 1
= 65536 – 1
= 65535

では、この調子でがんばってマスターしてください\(^。^)/。