作成者別アーカイブ: uraku

自宅のPCを本当にMacBook Proに置き換えられるのか考えてみた

ノートPCが必要なのでMacBook Pro (2017)を買いました。何か月か前の話になります。PCが複数ある事自体面倒ですし、どれぐらい同期や共有を出来るのか、Macに一本化可能なのか考えてみます。

構成を比べてみる

現行PC

  • OS: Windows 10 Home Build 1709
  • CPU: intel Core i3 2100 (SandyBridge 3.1GHz 物理2コア 論理4コア)
  • メモリ: DDR3 16GB
  • ストレージ: 240GB SSD(SATA3) + 3TB HDD + 500GB HDD
  • 光学ドライブ: ブルーレイディスクドライブ (BD-RE)
  • サウンド: USB-DAC (USB 2.0), それなりのヘッドフォン、1万円ぐらいのスピーカー
  • タブレット: Wacom intuos 4 (USB 2.0)
  • 入力: ロジクールのマウス (USB 2.0)、東プレのRealforce (USB 2.0)、安いマイク、USBゲームパッド (USB 2.0)
  • ディスプレイ: フルHDの液晶が2枚
  • LAN: ギガビット有線LAN
  • 他に繋ぐもの: SDカードリーダー(USB 2.0)、Android端末(USB 3.1Gen1 Type-C)、デジカメ (USB 2.0)

MacBook Pro 2017 13インチ タッチバー無し

  • OS: macOS 10.12.6 Sierra
  • CPU: intel Core i5 (Kaby Lake 2.3GHz 物理2コア 論理4コア)
  • メモリ: LPDDR3 16GB
  • ストレージ: 512GB NVMExpress SSD
  • 光学ドライブ: 無し
  • サウンド: オンボードのDAC、2ch内蔵スピーカー(低音出ない)、イヤホン出力
  • 拡張: 電源、映像出力含め USB Type-C (Thunderbolt 3) 2ポートのみ
  • 入力: 非常に打ち疲れする硬くて浅いキーボード、タッチパッド、内臓マイクとインカメラ
  • ディスプレイ: 13インチ。2560*1600ドットの解像度が有るが、目がしょぼしょぼしない実効解像度での利用は普通に狭い。自称低反射なものの普通に反射してつらい。
  • LAN: IEEE 802.11ac (無線LANルーター側も対応済み)

MacBookをメイン運用する場合、オンボードサウンドで音楽を視聴するのはちょっと無いのでUSB-DACを繋ぐ必要が有ります。また、ディスプレイ2枚もどうにかつなぐ必要が有ります。タブレットも繋ぐしデジカメもそれなりの頻度で繋ぎます。キーボードも苦痛を感じるレベルなのでメイン利用にするなら別で欲しいです。

そして光学ドライブが必須です。これはnasneで録画したデータを書きだすのにPC側のドライブが必要になるからです。また、音楽CDの取り込みにも必要です。DL販売? ストリーミング? 有ったら苦労しません。マイナーなジャンル、インディーズ(同人)制作の物、レーベルが全くDL版を出す気が無いコンテンツが有ると、何年経っても光学ドライブが不要になる気がしません。映像についても有名な映画なら配信が有りますが、ライブDVD/BDと言った物は物理円盤でしか存在しないケースが多いです。仮に有ってもブックレットなんて付いてきません。

音楽ライブラリ、デジカメで撮り溜めてきた画像のサイズが凄いのでMacBook ProのSSDに突っ込むのは現実的でないです。物理的に入りません。ファイルサイズ、使用帯域、プロバイダ側の通信制限などクラウドストレージも全く現実的ではないです。FLAC形式のライブラリも有るのでiCloud統一も無理です。そのため新たにNASを導入する必要が有ります。

ゲームなどで遅延が生じると困る事から、ディスプレイも物理的な映像ケーブルでつなぐ必要性が有ります。

ソフトウェア

nasne関連、ゲーム関連、一部のユーティリティソフトなどからWindowsは必須なのでブートキャンプでデュアルブートする事になります。ただ、最新のmacOS High Sierraの新ファイルシステムはWindows用のドライバを提供していないので正直かなりアップデートしたくありません……。

MacはBD試聴においてあまり恵まれた環境ではないので、この部分でもWindowsを使います。

ゲームをプレイするにもそもそもMacBook Pro 13インチのGPU(intel内蔵)が弱い件に関しては、金に物を言わせればThunderbolt 3接続の外付けGPUボックスが存在します。MacBook Pro本体についても冷却台などに乗せて強力に冷やす必要が有りますが、Windowsで起動したうえで最新ゲームがプレイできそうな気がします。

必要な物

電源、HDMI、DVI-D、USB-3.1数ポート、USB2.0数ポートをMacBook Pro本体のType-C 2ポートから生やす必要が有ります。めちゃくちゃスマートじゃないです。ちなみに15インチモデルなら本体側のType-Cが4ポートになります(結局変換は必要ですが)。以下、例についてこの商品をお勧めする物ではないのでご注意ください。実際に買って試したわけでもないです。

上流がType-CかつUSB-PD対応で映像出力も有るハブ

例1: Amazon | AIER Type-C ハブ 4in1 USB-C to HDMI/ LAN/ USB3.0/ Type C PD充電 映像変換アダプタ hub グレー https://www.amazon.co.jp/dp/B076HKCFXY/

4,199円 (2018年01月02日時点)

PD対応ポート(電源)、HDMI、ギガビット有線LAN、USB-3.0を出せるハブです。

例2: LENTION USB-C ハブ 4 in 1 Digital AV Multiportアダプタ 4K HDMI PD充電機能 USB-C  https://www.amazon.co.jp/dp/B07749PR7S/

3,999円 (2018年01月02日時点)

ギガビット有線LANは2ポートも要らないので2つ目はUSB-3.0の多いこちら。どちらのハブも3.1Gen2対応でないのが気になりますが、対応製品は今の所持っていないので問題無いです。

まだまだUSBポートが足りないので、足りない分はさらにハブをぶら下げます。

良い感じのNAS

例3: Synology DiskStation DS218j https://www.amazon.co.jp/dp/B076HJB5L1

Time MachineによるmacOS環境のバックアップ、iTunes Server等にも対応する多機能2ベイのNASです。Amazon Glacierへの2次バックアップができる点も面白そうです。

22,290円 (2018年01月02日時点)

例4: 3.5インチ 4TB WD Red HDD https://www.amazon.co.jp/dp/B01N00F9YO/

HDDは別売りなのでWDのNAS向けHDD。これを2台でRAID1構成にします。

16,500円 * 2 = 33,000円 (2018年01月02日時点)

ここまで計: 63,488円

外付けGPU BOX

例5: GIGABYTE ビデオカード GTX1070搭載 外付けVGA BOX GV-N1070IXEB-8GD https://www.amazon.co.jp/dp/B0744C8MHQ/

83,000円です……。もっともGTX1070自体がハイエンドGPUなので、もっと下のランクのGPUとBOXのキットをそれぞれ購入し、自分で組み立てたらもっと安くなると思います。Thunderbolt 3接続なので先述のハブは1つしか利用できませんが、GPU BOX自体から映像の出力が出るのでポート不足にはならないはずです。

意外と何とかなる……?

Type-Cのハブ、Type-Cのハブに電源コード、USB-DAC(の先にヘッドフォンとスピーカー)、BDドライブ、ペンタブレット、HDMI2系統、有線LAN、Realforce、マウスが繋がりそうな気がしてきましたね。お金をかければなんとかなりそうです。

やるかと言われるとなんとも……。MacBook Pro1台にして、これで壊れた時は自分で修理できずAppleに送るしかないです。ファイル共有とバックアップの先としてNASは導入した方が良さそうですね。


CodeIgniter 3.x で作ったWebアプリを更に高速化させていく

この記事は CodeIgniter Advent Calendar 2017 の 12月16日 分の投稿です。

CodeIgniter は元々軽量・軽快で高速なフレームワークですが、今時の高速化トレンドに対応して更に速くしていきましょう。

PHP 7に対応する

PHP 7.0 でも 7.1 でも 7.2 でも動きます!
もちろん PHP OPcache も有効にしておきましょう。更に速くなります。

gzip圧縮にする

Googleのアドバイスツールでも指摘してくるやつですね。CodeIgniter、というよりはPHPの標準的な機能になるのですが、以下のコード(冒頭4行)をビューのアウトプットをする前に入れておくだけでPHPの透過的なgzip圧縮が有効になります。簡単。

// 透過的な圧縮を有効にする
if (ini_get('zlib.output_compression') != 'On') {
	ini_set('zlib.output_compression', 'On');
}

$this->load->library('Twig');
$data = [
	'title' => 'XXXXXXX',
	'hoge' => $hoge,
	'foo' => $foo,
	'bar' => $bar
];
$this->output->set_output($this->twig->render('dir1/example', $data));

※このコードではビューの組み立てにTwigを使っています。

注意点として、画像であったりZIPファイルをバイナリで返したりであるような際に透過的な圧縮が有効になっているとファイルが壊れてしまったりします。そういう出力をするURLが有る場合は、全てのURLで常に適用されるような書き方は避けるのが無難です。

http/2対応にする

これはWebサーバ側の話になるのでもちろん CodeIgniter でも対応可能です。http/2 に対応したバージョンの Apache 2.4 or Nginx (h2oとかOpenLightSpeedとかでも)と php-fpm を組み合わせてあげましょう。Apache を http/2 に対応する場合、prefork MPMではなくevent MPM(やworker MPM)にする事が必要になりますので、その辺りも適宜チューニングしていきましょう。

参考: Amazon Linux AMI 2017.09で今こそApacheをhttp/2対応にする手順

APIのバックエンドとして同時に叩かれる

CodeIgniter 3は同じクライアントから同時に複数URLを叩かれるような場合に、同時に処理せず逐次処理のような挙動をします。これはPHPのセッションが有効になっている際の制限なのですが、セッションの機能を使い終わったタイミングでセッションを書き込み・クローズさせてあげる事で並列度が上がります。

// 同ユーザー・セッションからの連続アクセスの為にセッションのロックを解除する。
// これを実行した後はセッション関連の機能が使えない事に注意。
session_write_close();

そもそもAPIでセッションを利用しているのがよくないという話も有りますが、必要な場合にはこの対策をどうぞ。

Redisでキャッシュとかも使っていきたい

Memcachedとか、AWSのElastiCacheとか。CodeIgniterにはそれらを利用するための機能が標準で用意されています。……といっても私自身は php-pecl-redis で 直接 Redis を扱ってしまっているのでCodeIgniter側の機能は使った事が無いのですが。ちょっと重めの外部APIから値を取得しているような場合など、適用できそうな場所はどんどん Redis でキャッシュしましょう。

最新のMySQLやPostgreSQL使いたいよね

MySQLにしてもPostgreSQLにしてもバージョンが上がるたびに様々な改善が有り、高速化が有り、新機能が有ります。MySQL 8.0にも更なる期待が持てるこの頃。

CodeIgniterには重厚なORマッパーが有りません。QueryBuilderは本当にクエリのビルダですし、生のSQLを直接実行する事も容易です。その為、PostgreSQLやMySQL 8.0のウィンドウ関数、CTEであったり、JSON型、配列型など、RDBの強力な機能を積極的に使っていけます。実際、PostgreSQLの配列型をタグの実装として使っていてなかなか便利だったりします。

参考(外部): タグ検索するならPostgreSQLで決まり! – yohgaki’s blog

配列型はCodeIgniterからは「配列っぽい文字列」として扱う事になるので、適当な変換関数を作ってオブジェクトだったり連想配列だったりでやり取り出来るようにすると便利です。

RDBの冗長化はAmazon RDSが便利だよね

といっても一応フェイルオーバーには数十秒かかります。以下の過去記事で「数秒間のDB接続不可に耐えるための方法」をまとめてあります。

参考: CodeigniterのDB接続不可をハンドリングして再接続する

また、CodeIgniterのデータベース接続には「1つ目の接続先が繋がらなかった場合に2つ目の接続先に繋ぐ」という機能が有ります。これはまだ活用した事が無いのですが、MariaDB の Galera Cluster であったり、PostgreSQL の BDR (Bi-Directional Replication) など、これからのマルチマスター時代のフェイルオーバーに容易に対応出来ちゃったりするのでしょうか。出来るのかは分かりませんが、試してみると面白いかもしれません。

終わり

他にもいろいろあるかもしれませんがこの辺で。フロントエンドだと AMP 、 ServiceWorker など色々な話題が有ります(その辺も勉強しないとなぁ)が、CodeIgniterも高速化していきましょう。