WordPress:メニューの言語を変更した場合の副作用

WordPress初心者なのですが、メニューの表記を英語にしたいな、と思ってここをいじってみました:

f:id:thebaker:20180117043554p:plain

すると驚いたことに、TOPページに表示するコンテンツのうち、 一部を抜粋する機能が動かなくなったのです:

f:id:thebaker:20180117043746p:plain

本来はこうあるべきです:

f:id:thebaker:20180117043829p:plain

対策ですが、サイト全体の言語設定は日本語のままにし、 ユーザの言語設定において英語にすればOKです:

f:id:thebaker:20180117044744p:plain

CakePHP3:ブラウザにファイルをダウンロードさせる

mp3のようなファイルを配信する場合、次のように書きます:

$this->autoRender = false;
$download_file   = $file_dir . DS . $file_id . ".mp3";
$response = $this->response->withFile($download_file);
return $response;

このままでは、mp3がその場で再生され、ダウンロードできません。 当初は、ダウンロードするリンクにdownload属性を付けていたのですがIE11ではサポートされていません:

<a href="/Audios/download.php?id=100" download>クリックしてダウンロード</a>

解決策は至って簡単でした。withFileの第2引数に['download' => true, 'name' => 'ファイル名']と指定してあげるだけです:

$this->autoRender = false;
$download_file   = $file_dir . DS . $file_id . ".mp3";
$response = $this->response->withFile($download_file, ['download' => true, 'name' => 'ファイル名');
return $response;

とするだけです。これで、IE11を含めて、正しくダウンロードしてくれます。

念のため、どのような仕組みかソースを見てみました。ファイルはvendor/cakephp/cakephp/src/Http/Response.phpです。

       if ($options['download']) {
            $agent = env('HTTP_USER_AGENT');

            if (preg_match('%Opera(/| )([0-9].[0-9]{1,2})%', $agent)) {
                $contentType = 'application/octet-stream';
            } elseif (preg_match('/MSIE ([0-9].[0-9]{1,2})/', $agent)) {
                $contentType = 'application/force-download';
            }

            if (isset($contentType)) {
                $new = $new->withType($contentType);
            }
            $name = $options['name'] ?: $file->name;
            $new = $new->withDownload($name)
                ->withHeader('Content-Transfer-Encoding', 'binary');
        }

なお、aタグにdownload属性をつけるのを怠ると、Safariでは再生とダウンロードが両方走ります。

VirtualBox:LAN内の他のマシンから、ゲストOSに接続する

VirtualBoxの中にCentOSを立ててとあるウェブアプリケーションを開発しているのですが、 IE11での動作確認をする必要がでてきました。VirtualBoxMac上で動いているのでどうすればいいのか? 調べてみたら、先人の方がちゃんとやり方を公開してくださっていました:

外部からVirtualBox内のサーバにアクセス - Qiita

ここでは、ホストOS(マック)が192.168.0.10で動いており、 ゲストOSはポート80でApacheがlistenしているとします。

以下に、最新のスクショとともにやり方を記載します。

  1. ゲストOSをシャットダウンします。

  2. ゲストOSを選択している状態で「設定」をクリック

f:id:thebaker:20180111190924p:plain

  1. ネットワークのタブから、NATのアダプターを選択して「高度」をクリックし「ポートフォワーディング」をクリック

f:id:thebaker:20180111191025p:plain

  1. すると次の画面が出てくるので、ホストポートに8080、ゲストポートに80と指定してOKをクリック

f:id:thebaker:20180111191112p:plain

  1. ゲストOSを起動し、Windows機からhttp://192.168.56.10:8080とブラウザに入力すると、アクセスできます。

Javascript:クラスじゃないのにthisを参照できる?

以下のコードを書いても動くのであれ?と思いました:

function getArea(width, height){
    this.width = width;
    this.height = height;
    return this.width * this.height;
}

console.log(getArea(10,20)); // 200

thisと書いていますが、これはクラスをnewしたわけではないので何を指しているんだ??? 答えはグローバルオブジェクトでした。上記の後に、

function getArea(width, height){
    this.width = width;
    this.height = height;
    return this.width * this.height;
}

console.log(getArea(10,20)); // 200

console.log(width); // 10と出力される

ことから、グローバル変数を関数から定義&初期化しているのがわかると思います。 constructorを使うと、thisの招待がもうちょっとわかります:

function getArea(width, height){
    console.log(this.constructor); // function Window() { [native code] }と出力される
    this.width = width;
    this.height = height;
    return this.width * this.height;
}

console.log(getArea(10,20)); // 200

console.log(width); // 10と出力される

こういったことを防ぐためにもuse strictをするのが良さそうです:

'use strict';

function getArea(width, height){
    console.log(this.constructor); // thisがundefinedなのでエラーになる
    this.width = width;
    this.height = height;
    return this.width * this.height;
}

console.log(getArea(10,20)); // 200

console.log(width); // 10と出力される

Mac OS:ダブルクリックしてiTerm2のターミナルを開く

ようやくやり方がわかりました(実はこれまで調査してなかった)

iTerm2から、起動したいホストのプロファイル名を読み取ります:

f:id:thebaker:20180108015509p:plain

スクリプトエディタの起動

スクリプトエディタを起動します

スクリプトエディタに以下の内容を記述します

tell application "iTerm"
    create window with profile "hoge_profile"
end tell

アプリケーションの作成

スクリプトエディタの「ファイル」メニューから「書き出す」を選び、 場所を「デスクトップ」に変更。次に書き出し名を入力後、 ファイルフォーマットで「アプリケーション」を選択し「保存」を押します。 するとデスクトップにアイコンができ、ダブルクリックするとiTermが開き、 指定のプロファイルが読み込まれます。

Mac OS:スクリプトエディタが見つからない

iterm2のターミナルを開くショートカットを作るべく、AppleScriptを作成することにしたのですが、 スクリプトエディタが見つからない(笑

Finder > 移動 > アプリケーション で「ユーティリティ」の中にありました:

f:id:thebaker:20180108013847p:plain

IE11を便利に使う

普段は利用を敬遠しているIE11ですが先程、ちょうどよい用途を見つけました。

PlaycodeJavascriptを勉強しているとき、Chromeを使うと「あれ、これES2015なのにBabel通さずに動くな…」ということがあります:

f:id:thebaker:20180107023205p:plain

そこでIE11の出番です。同じコードをIE11で動かすと…

f:id:thebaker:20180107023128p:plain

ちゃんとエラーがでます。ただしletとかはIE11も対応しているので完全ではないですが…