archive

こんにちは。
ユニトラストの宮本です。

最近、PHPの実行スピードが改善されており、普段PHPを使っている私としてはとても嬉しく思っています。

2019年の末頃にリリースされる予定のPHP7.4の新機能に「Preload」という機能があります。
一体どういう機能なんでしょう?

preloadってどんな機能?

PHPは実行時にロード(読み込み)・パース(構文解析)・コンパイル(実行命令への変換)されて動作しています。
実行時に毎回ロード・パース・コンパイルしていてはどうしてもスピードが遅くなってしまいます。

その為、PHP5.5以降ではOPcacheという機能が標準搭載されています。
OPcacheは一度実行されたPHPファイルをメモリ上にキャッシュすることで実行時に毎回ロード・パース・コンパイルすることなく実行させ高速に動作させる機能です。
ただ、初回の実行はPHPファイルのロード・パース・コンパイルがおこなわれるので、スピードが改善されない問題がありました。

PHP7.4から導入されるPreloadではサーバ起動時にあらかじめ設定したPHPファイルを事前にロード・パース・コンパイルし、メモリ上にキャッシュさせることで確実に動作を高速化させることができます。

preloadの使い方

PHPの設定ファイル(php.ini)にopcache.preloadという項目が追加されています。
まず、この項目にPHPファイルを指定します。

opcache.preload="hoge/huga/preload.php" 

指定したPHPファイル内で事前にキャッシュさせるPHPファイルを指定します。

opcache_compile_file('apppath/hogehoge.php');
opcache_compile_file('apppath/hugahuga.php');

上記のようにopcache_compile_file関数にPHPファイルを指定することで、サーバ起動時にキャッシュをおこないます。

preloadを使うとどうなる?

PHP RFC: Preloadingを読んでみましょう。
サンプルとして、Zend Framework全体をプリロードするスクリプトが書かれています。

<?php
function _preload($preload, string $pattern = "/\.php$/", array $ignore = []) {
  if (is_array($preload)) {
    foreach ($preload as $path) {
      _preload($path, $pattern, $ignore);
    }
  } else if (is_string($preload)) {
    $path = $preload;
    if (!in_array($path, $ignore)) {
      if (is_dir($path)) {
        if ($dh = opendir($path)) {
          while (($file = readdir($dh)) !== false) {
            if ($file !== "." && $file !== "..") {
              _preload($path . "/" . $file, $pattern, $ignore);
            }
          }
          closedir($dh);
        }
      } else if (is_file($path) && preg_match($pattern, $path)) {
        if (!opcache_compile_file($path)) {
          trigger_error("Preloading Failed", E_USER_ERROR);
        }
      }
    }
  }
}
 
set_include_path(get_include_path() . PATH_SEPARATOR . realpath("/var/www/ZendFramework/library"));
_preload(["/var/www/ZendFramework/library"]);

性能に関する部分を読む限り、

Using preloading without any code modification I got ~30% speed-up on ZF1_HelloWorld (3620 req/sec vs 2650 req/sec) and ~50% on ZF2Test (1300 req/sec vs 670 req/sec) reference applications. However, real world gains will depend on the ratio between the bootstrap overhead of the code and the runtime of the code, and will likely be lower. This will likely provide the most noticeable gains with requests with short very runtimes, such as microservices.

zend frameworkで最大50%前後の性能アップが見込めるようです。(実際の利用シーンではもっと低くなるとも書かれています。)
また、マイクロサービスで構築する際により性能アップを実感できそうと書かれています。

preloadの難しいトコロ

一見良いことづくしに思えますがPHP RFC: Preloadingに以下の記述があります。

As mentioned above, preloaded files remain cached in opcache memory forever. Modification of their corresponding source files won’t have any effect without another server restart. All functions and most classes defined in these files will be permanently loaded into PHP’s function and class tables and become permanently available in the context of any future request. During preloading, PHP also resolves class dependencies and links with parent, interfaces and traits. It also removes unnecessary includes and performs some other optimizations.

opcache_reset() is not going to reload preloaded files. It’s just not possible using current opcache design, because during restart, they may be used by some process, and any modifications may lead to crash.

プリロードされたPHPファイルはサーバ起動時にロード・パース・コンパイルされ、メモリに展開された状態になり、PHPファイルを編集しても変更が反映できません。
また、OPcacheをクリアするopcache_reset関数を使用しても、プリロードされメモリに展開されたPHPファイルのキャッシュはリセットされません。

現状、変更を反映する方法はサーバの再起動しかありません。
何を再起動しなければいけないかはサーバの構成により変わるので、構成に合わせて判断しましょう。

その他、preloadするときのPHPファイルの記述方法に制限があるので、試す前にPHP RFC: Preloadingを読んで見ることをお勧めします。

まとめ

今回はPHP7.4の新機能preloadについて簡単に解説しました。
技術の進化は日進月歩です。
新しいものは常にチェックして、快適なサービスを届けられるようにしていきたいですね。

ちなみに、PHPの次期バージョン(PHP8)ではコンパイル言語に匹敵する速度が出せるようになる仕組み(JustInTimeコンパイラ)が導入される予定になっています。
期待して、リリースを待ちましょう!私も楽しみにしています!

ユニトラストでは、一緒に働けるメンバーを募集しています!詳しくは↓バナーからどうぞ!

こんにちは。
ユニトラストの筒井です。

ちょっと前にFacebookより販売されたVRヘッドセット、Oculus Questを購入していました。
しばらく遊んだのち、自分もアプリを開発できないかさっそく調べたところ、
その方法がとてもシンプルかつユニークだったため、その内容を書きたいと思います。

VRって何?

VRはVirtual Realityの略称です。日本語では「仮想現実」と訳されることが多いです。
簡単に言うとヘッドセットを使い、人の手によって作られた空間を、現実世界により近い形の感覚で提供するための技術となります。
詳細な解説は、Wikipediaにお譲りいたします。

Oculus Quest とは

Oculus社(Facebookに吸収合併されました)によって製造された、家庭向けスタンドアロンVRヘッドセットの第二弾となります。
第一弾として2018年5月にOculus Goが販売されておりますが、それから下記のような強化がありました。

個人的にOculus Goの性能や操作性では、動画系のVRコンテンツを楽しむのが精いっぱいかな?と思っていたので、
性能やコントローラー等、様々な側面で強化されたOculus Questには高い期待がありました。

実際、操作系がPC用のVRと統一されたことやもともとOculusブランドだったため、Oculus Questが販売された時点で、
Robo RecallやBeat Saber、VRChatなど、多くのPC向けタイトルが既に移植されており、すぐに楽しめました。
(新規タイトルはそこまで多くはありませんでしたが、公式チュートリアルのFirst Step等はとても素晴らしかったです。)

Oculus Questがどのくらい楽しいのかは、動画を見たり、ぜひ持っているお友達に借りたりしてみてください。
家電量販店などでは、PC向けVRが体験できる場所が用意されていることもあるので、そちらも是非。

開発者向けセットアップ

早速Oculus Questでアプリを作るための環境をセットアップします。
必要なツールは下記の通りです。

関連機能のインストールが充実しているため、今回はUnity 2019.1を使ってセットアップします。

Unity Hubをこちらよりダウンロードし、インストールしてください。
起動後、下記画面の右上から「インストール」を押します。

Unity 2019.1 を選択します(マイナーバージョンはアクセスした時期によって更新されている場合があります。)

モジュール選択で「Android Build Support」およびその中の「Android SDK & NDK Tools」を選択します。

いくつかの規約事項の確認後、下記のように自動的にダウンロード・インストールが開始されます。

ちょっと長いです。その間に Oculus Quest側の開発者設定をオンにします。

Oculus Questとペアリングした端末で「その他の設定」から「開発者モード」をオンにすることで設定できます。
また、アカウントが開発者登録をしていない場合は、その過程で https://dashboard.oculus.com/ での登録を促されるため、
端末のアカウントで開発者登録をします。

 

Unity 2019のインストールが完了したら、Unity Hubにて「プロジェクト」から「新規作成」をし、
下記のように3Dプロジェクトとして作成します。

ひとまず起動することを目標とするため、いくつかのアセットをインストールするステップをいったん省略します。
まず「File」→「Build Settings」→「Android」→「Switch Platform」と順に選択します。
少し待った後、「Player Settings」→「XR Settings」と選択していき、「Virtual Reality SDKs」に「Oculus」を追加します。(ここも多少の待ち時間があります。)

「Other Settings」を開き、Graphics APIsからVulkanがあればそれを削除します。
下記の画像のように「OpenGLES3」になっていれば問題ありません。

そのまま下にスクロールし、「Package Name」を適当なものに変更し「Minimum API Level」をAndroid 4.4 ‘KitKat’ に変更します。

これでビルドできるようになったので試します。
Oculus QuestをPCにつないでおきます。
「開発者モード」をオンにして最初につないだ場合、以下のようなダイアログがHMD内に表示されることがありますので、
コントローラを使って許可します。

無邪気に「Cube」を配置し、「Build Settings」を開きなおし「Build and Run」をします。

ビルドが行われ、接続されているOculus Questに自動的にインストールされます。
インストール完了後、アプリが自動起動するので、HMDを装着し、無邪気に配置したCubeが立体視で見れることを確認できます。

(上記画面は、Chrome拡張機能である「Vysor」を使い、HMD内の映像をPC上に表示しています。)

以上でUnityアプリをOculus Quest用にビルドするための手順は完了になります。
以降は、変更を加えて再ビルドを行うか、下記のようにOculus内にインストール済みのビルドの再実行ができます。

とりあえず何か作ってみる。

Unityの初期状態の青空空間ではさすがにもったいないので、先ほどスキップした、Oculus Integration アセットをプロジェクトに追加して、ボタンの操作を取得してみました。

Oculus Touchの6DoF情報や、ボタンの入力などがしっかり取得できています。

また、ここから、ちょっとしたゲームを作ってみました。
スティックで自機を移動し、Oculus Touchの向きに弾を飛ばす、いわゆるシューティングのようなものです。

サウンドやエフェクト、レベルデザイン、UI/UX等を洗練させていければ、
ゲームとしての完成度も上がっていくと思います。

記事の内容は以上です。
今後もOculus Questを弄りながら、あわよくばOculus Storeの審査の提出を狙ってみようと思います。

ユニトラストでは、これまでIT未経験者の新人採用を学校における最終学年の方としていました。
毎年たくさんの学生さんにお会いでき、その中からユニトラストの仲間に加わってくれる人が増えて続けているのはとても嬉しいです。

一方で、昨今は新人においても採用ルートが多様化し、インターンシップやダイレクトリクルーティング、リファーラル採用など、学生さんとの出会い方が変化してきています。

ユーザやお客様により喜んでいただき、働く仲間がより幸せに感じ、会社としてより成長していくためには、新しい採用に挑戦し、様々な強みをもった仲間を迎えていく必要があると考えています。

そこで、2021年度春入社の新人採用において、インターンシップをはじめることにしました。
2年後に卒業見込の学生さんを中心に夏休み中の実施を想定しています。

インターンシップをはじめるにあたっては、私たちユニトラストとしてどのようなプログラムにすべきかを考えました。
大事な学生生活の夏休みの時間を使ってお越しいただくので、表面的な情報提供や単なる就業体験をするに留まらず、以下のような生涯役に立つものを得ていっていただきたいと思っています。

■社会について
インターンシップに参加いただいた学生さんが卒業後に全員私達の会社へ入社していただけたらとても嬉しいですが、それはなかなか難しいことです。
他の会社や業界に進まれる方もいらっしゃると思いますので、就活時や社会に出てからも活かせる普遍的な考え方をお伝えできたらと思います。
また「社会の一員となり働くことはワクワクすることなんだ」という仕事の面白さ、楽しさもお伝えしたいです。

■ITについて
現在ではプログラムは一部の職人だけが扱える特殊技術ではなく、誰もが気楽に楽しめる表現方法の1つになっています。
ITを使う側から作る側になった楽しさ、自分の書いたプログラムが動いた時の感動やその先に広がる可能性を感じていただきたいです。
また、作って終わりではなく、プログラム(スマホアプリ)をご自身のスマホ入れて持ち帰っていただき、家族や友人たちに感動を共有していただきたいです。

インターンシップでは、ユニトラストの様々な世代のエンジニアたちが参加する予定です。もちろん役員たちも全員参加します。
長く同じ時間を過ごすことでお互いに気づくことが多いと思いますので、最終日には学生さんに先輩からの熱いメッセージを個別に伝えたいと思っています。

インターンシップの開催は8月と9月に予定をしています。
どんな学生さんに会えるか、今から楽しみです!

実施要項は下記をご覧ください。
株式会社ユニトラスト2021年度インターンシップ(外部サイト)