archive

毎年恒例のユニトラスト社員旅行の季節がやってまいりました。
今年はユニトラスト創業10周年ということもあって、なんと3泊4日の台湾旅行です!
4日間の旅行日程は
1日目:空港に集合し出国、台湾にて帰社日、懇親会
2日目:終日自由行動
3日目:終日自由行動
4日目:お昼まで自由行動、空港へ移動し帰国
となっております!

海外もしくは台湾に行くのが初めてという人がほとんどだったので、みなさんいい思い出をたくさん作ることができたんじゃないでしょうか。
かくいう私も海外初めてなので、非常に楽しい旅行となりました!
というわけで早速1日目をスタート!

ユニトラストの朝は早い

出発日は6:35に羽田空港国際線ターミナルのロビー集合でした。
さすが3泊4日の社員旅行です。しっかりと台湾を堪能するために、初日の出発時間も激早です。
余裕をもってのチェックイン、出国審査を済ませてからは搭乗開始時間までのんびりしていました。
朝早すぎてぼーっとしている人もいましたが、誰も日本に置いていくことなく、無事台湾へ出発します!!

 

約3時間ほどのフライトを経て、、、、

 

台湾の松山空港(ソンシャン)に到着!!
台北付近には松山空港(ソンシャン)と桃園空港(トウエン)の2つの空港があり、桃園空港は台北市より少し西に離れた桃園市にある空港ですが、松山空港は台北市内にある空港なので台北市をメインに動く場合は非常にアクセスの良い空港となります。

日本にいる際は寒かったためアウター必須でしたが、台湾は暑すぎず、寒すぎずで非常に過ごしやすく、旅行には最適な気温でした。そして今回の社員旅行用のツアーバスに乗り込み、まずは「大山茶芸」というお茶屋さんに向かいます。

 

台湾茶を堪能

台湾では人を家に招く際にはお茶で客人をもてなす文化があるそうで、私生活の中でいかに美味しいお茶を飲むことができるかを追求した台湾のお茶はお土産としても非常に人気があります。
ちなみに台湾茶といえば一般的には烏龍茶が有名だそうですが、お茶を極めたお店のマスターはプーアール茶を推していました。
というわけで、我々ユニトラスト一行もお茶でおもてなしをしていただきます。

マスターからお茶の効能や味などの特徴を紹介していただき、3種類のお茶を飲ませていただきました。

 

どれも非常に香りが良くて、気品ある味わいです。
もちろんお店で茶葉の販売もしているため、ここで早速お土産をゲットしている人もいました。

 

宿泊先へ移動&昼食

お茶でおもてなしをしていただいた後は、社員旅行4日間の宿泊先となるサンワールドダイナスティホテル台北に移動です。

ホテル内は1階から天井まで吹き抜けの構造になっているため開放感があり、さらにこちらのホテルにはジムやプールなんかも併設されているので非常に豪華です!
さすが10周年!
ホテルには日本語が話せるスタッフもいるので初海外の人でも安心です。

 

ホテルに到着したのが、ちょうどお昼過ぎでしたのでここで各自お昼休憩を取ります。

タピオカミルク(約140円)を飲みにいったり、ホテル近くのお店で謎のちまき & 麺(2つで約260円)を食べたりと、台湾1発目のフリーな時間を過ごします。
台湾だとちょっとした食べ物、飲み物なんかはだいたい30〜60元がほとんどで、日本円では110〜220円くらいの値段なので非常に安いです。

 

帰社日 in 台湾

その後、宿泊先のホテルにて毎月定例の帰社日を行いました。
今月はちょうど帰社日と社員旅行が被っていたため、海外での初帰社日となります!
いつものオフィスではなく、しかも海外ということもあって少し雰囲気が違います。

10周年目ということもあり、これまでのユニトラストをスライドで振り返りました。
スライドの中には創業準備ための備品設備の購入リストや、10畳ほどのアパートオフィスの写真や、仕事終わりによく飲みに行っていた居酒屋の写真、現オフィスの改装中の写真などがあり、今までのユニトラストを作ってきた数々のシーンや、大きくなってきた過程を見る事ができました。

 

昔の社内イベントの写真の中には社長や先輩方の若い時の姿があり、10年間という時間がしっかり流れて、人も会社も大きく成長してきたことを改めて実感できます。
また次の大きな節目で振り返る時には、さらに会社が成長できているように頑張りたいですね!
そしてまた海外旅行したい!笑

 

懇親会 in 台湾

帰社日後はお待ちかねの懇親会です!
ホテル内のVIP会場にみなさん続々と集まってきます!

 

みなさん集まったら、台湾ビールで社員旅行1日目の疲れを発散します!乾杯!!

 

始まると円卓にどんどん食べ切れないほどの料理が運ばれていきます!
いつもの懇親会であれば電車で帰宅ですが、今日は帰宅先が徒歩数分圏内にあるため、みなさん存分に楽しむことができたんじゃないでしょうか。
台湾旅行1日目お疲れ様でした!!

 

1日目を終えて

懇親会の後は解散となり、1日目の日程は終了です。
あとは最終日4日目のお昼までは完全オールフリーとなるため、懇親会後もまだまだ元気な人は二次会で外に繰り出したり、翌日の起床時間が早い人は就寝したりと、思い思いの時間となります。

2、3日目は、台湾お馴染みの有名観光スポットを回ったり、釣りに行ったり、猫村に行ったり、サイクリングをしたりと、みなさん様々なかたちで台湾を楽しんだみたいです。
では2日目からの台湾旅行記事に乞うご期待!!

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

最近、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の審査の提出を狙ってみようと思います。