作成者別アーカイブ: uraku

「選定した技術が1年で死んだ話」の1年後

1年半前に以下のような記事を書きました。その記事が前提となり、その続きになります。

対応の方向性

2018年末ごろから Symfony 4.2 への移行を始めました。Symfony 4 についての日本語情報はかなり少なかったので、数少ない日本語情報に感謝をささげながら、基本は Symfony 公式のドキュメントを Google翻訳にかけて読みながら対応しました。

※ 得られた知見を本ブログ内別記事にまとめています。

Silex 1.x → Symfony 4.2 への移植の実際

現状の2代目システムの実装としては Silex 1.x での実装となり、依存性注入の仕組みは Pimple というアレイアクセスベースのシンプルなサービスロケータ、クラス構成の主要な部分としては、コントローラ、サービス、リポジトリのインタフェース、リポジトリ、DoctrineDBALで読みだしたレコードを保持したりバリデーションが実装されていたりするレコードオブジェクトという構成になっていました。

コントローラとビュー

まずはコントローラの移植になりますが、基本的にはこの部分が実コードでは一番重いものになりました。Silexのルーティングから Symfony のアノテーションを使った物に置き換えていく作業は主に以下の内容になりました。

  • SilexのクロージャベースのルーティングをSymfonyのアノテーションベースのルーティングに書き換える作業を進めます。どちらか一方でしか出来ない機能という物がなく、淡々と対応すれば完了しました。ただし物量が多い。
  • Requestオブジェクトなど要素要素の機能はもともとSymfonyコンポーネントを使っていたSilexなのもあり、そのまま使い続ける事が出来る。
  • リダイレクトなどは関数名が変わってくるので調整する。
  • ビューはTwigがそのまま使えるのでセッションに関する扱いだけ調整すればそのまま動作する。
  • Pimpleを使っていたDIは全てコンストラクタインジェクションに変更。あとはSymfonyが勝手にサービスを注入してくれる。

ルーティングは書き換えになりますがコントローラ内のアクション処理としては9割そのままコピペで動いた印象です。残りの1割を書き換えていきました。

サービス

ここでいうサービスは所謂ビジネスロジックです。サービスクラスは一部Pimpleのサービスロケータを引き回している部分が有ったので全てコンストラクタインジェクションか、コントローラから呼ばれる際のメソッドインジェクションに変更しました。ログ出力に関しても同様に Psr\Log\LoggerInterface を注入するように変更。それ以外はSilex独自の機能への依存がほとんどなく、ほぼそのまま動作しました。

リポジトリとレコードオブジェクト

リポジトリの実装はDoctrineDBALの存在にがっつり依存していましたが、これはSymfonyでも同様に利用できるので問題になりませんでした。ほとんどの処理がそのまま動作しました。

テスト

PHPUnitで実装されたテストは全体の2~3割程度に調整が必要になりました。この背景として元々使っていた phpunit/dbunit の開発終了が有ります。
https://github.com/sebastianbergmann/dbunit

データベース周りのテストを行う際にレコードの取得結果を比較したり、YAMLファイルで定義したデータをDBに流し込んだりリセットしたりなどの機能を提供しているライブラリなのですが、これが開発終了し新しいPHPUnitに対応していかなくなる事態になりました。

色々方法は考えたのですが、phpunit/dbunit の提供する機能のうち、実際に利用してたものだけについて互換実装を作り込んで使う事にしました。YAMLファイルを読み込んでDBに書き込む機能、欠けた部分のある連想配列を欠けていない部分のみで比較する機能などを関数のインタフェースに互換性を持たせながら実装して、これは1ファイル1クラスのシンプルな互換機能になりました。もちろん PHPUnit 8系で問題なく動作する物になっています。

結果

期間としては大体3か月程度でSymfony 4.2 への移植が完了しました。これは想定よりもだいぶ短い期間でした。併せて PHP 7.1 から 7.2 への移行を行ったり様々な追加機能を載せたりしていますが、現状問題なく運用し続けています。上手く行った要因としては以下が有ったのかと思います。

  • Silex 自体の開発が終了したと言っても Symfony は健在なので、置き換えが必要なクラス、機能が最小限で済んだ。結果論ではあるがSilex採用時の「Symfonyコンポーネントを使ったフレームワークにしよう」という選択に助けられた。
  • もともとサービスクラス、リポジトリ、レコードオブジェクトがほぼSilexに依存しておらず、依存関係も依存性注入を使った作りになっていたので移植コストが低かった。再設計時の設計が(ベストかどうかはともかく)悪くなかった。
  • 初代システム(1ページ1PHPファイル)とは違って2代目システムはテストコードが有ったので、動作確認のコストが抑えられた。テストが書かれていなかった部分やテストは書かれているもののカバーしきれていなかった動作、その他もろもろでバグは出たものの、それでもテストが無い状態よりははるかに楽になった実感が有る。

結論

  • フレームワークの機能を便利に使いつつも 、それに依存しすぎない疎結合な設計になっているとフレームワークが開発終了に見舞われてもコードの大部分をそのまま動かす事が出来る。それまで「疎結合大事って言ってもライブラリ、ユーティリティ的なクラス以外はあんまり再利用したりしなくない? テストが書きやすくなるのは間違いないけど」と思う部分も有ったが、テストが書きやすいだけではないフレームワークに対する疎結合の重要性を体感した。
  • さすがにフレームワークが変わるレベルだと動かなくなるテストコードも少なくないので「元と同じテストが全部通ればOK」とはならないものの、とはいえ有るのと無いのでは全く違う。テストコード大事。

ASUS Zenfone 5Z 雑感

3年間使った HTC 10 (au版 + ドコモ系MVNO回線)からの乗り換え先としてさんざん悩んだ結果 ASUS Zenfone 5Z 国内SIMフリー版にしたので雑感を。

要件

  • SoC性能の下限は Snapdragon 660。ゲームをプレイするので速ければ速いほどよいが価格とのバランスによる。
  • RAM容量の下限は 4GB、4GBのつらさを感じつつあるので出来れば 6GB欲しい。
  • ストレージ容量はmicroSD対応なら64GB、非対応なら128GBが下限。
  • なるべくお安く。MVNO運用前提。
  • イヤホンジャックが有るとうれしいが必須ではない。
  • カメラが良いとうれしいが並以上なら可。

という条件でもろもろ検討したのですが、家電量販店店頭での実売価格が税込み6万を切り(2019年5月10日時点 ビックカメラ池袋本店)、発表されたばかりの Pixel 3a より約1万円高いだけで Snapdragon 845、RAM 6GB、ストレージ 128GB、並以上のカメラ、イヤホンジャック有りの Zenfone 5Z にしました。もちろん Pixel 3a はGoogle公式端末なのでOSアップデート期間が長いメリットが有りますが、Zenfone 5Z は現状でAndroid 9 Pie までアップデート済み、かつ Android Q がテスト可能な端末という事で Q まではアップグレードされるかな?と予想しています(あくまで予想)。

デザイン・サイズ感

良くも悪くももボディに占める画面サイズが広い昨今なので、端末ごとの差はあんまり感じないですね。悪くないと思います。ただ、指が短い事も有り HTC 10 (72mm * 146mm * 9.2mm)の時点で片手操作がきつかった身としては、Zenfone 5z は片手操作は不可能な水準です。付属品のカバー(TPUっぽい素材)を付けると摩擦係数が上がるのでそれでなんとか、といった所。素直に両手操作推奨。

Zenfone 5z ケース
Zenfone 5z 表
Zenfone 5z 裏

片手操作モードが有り、有効にしておくとホームボタンをダブルタップすると画面サイズが小さくなります(下記スクリーンショット参照)。と言っても縦横比が固定のまま小さくなるので上部はまだ遠いままという印象。高さに合わせて更に画面サイズを小さくすると今度は横幅が狭く文字入力が厳しい。見た目的にも無理に縮小しているので文字にジャギーが見られたりしますが、まぁ無いよりは有った方が良い機能ですね。無いよりは便利です。

Zenfone 5z の片手モード

スペック面とゲームプレイ

おさらいになりますが、2018年時点でのQualcom製ハイエンドSoc Snapdragon 845に、RAM容量は多めの6GB(他メーカーの流れ的にも2019年以降はRAM 6GBからがハイエンド端末の基準になるはず)、ストレージ容量は十分な 128GB に microSDカード対応です。

Antutu等のベンチマークはググればいくらでも出てくるとして、実際のゲームタイトルとしては「アイドルマスターシンデレラガールズ スターライトステージ(以下 デレステ)」、同「ミリオンライブ シアターデイズ(以下 ミリシタ)」でテスト。これから増えてくる Snapdragon 855搭載端末を除けばこれが最上位のスペックなので当然では有るのですが、3D高画質設定でも特に問題なくMV再生できますね(当然すぎるのでスクショ省略)。

タッチの感度としては Android 9 Pie かつ数日前にリリースされたアップデート適用済みの状態では特に問題は感じられませんでした。タイミング調整的にもデレステは+-0、ミリシタは -2 とかなり優秀(タイミング調整は個人差も有りますので目安程度に)。

デレステ タイミング調整 Zenfone 5z
ミリシタ タイミング調整 Zenfone 5z

タップの精度(タッチ抜け等)ですが、正直音ゲーはそこまで上手くなく最上位難易度でプレイできないのであまり分かりません。デレステのPro譜面、ミリシタの 6MIXまでは問題無いです。ちなみに Zenfone 5z は直近のアップデートまでは音ゲー周り(特にデレステ)で問題を抱えていたようですが、アップデートで改善されたとの情報をTwitterで見かけます。この端末はアップデート全て適用済みの状態となります。

デレステ @ Zenfone5z
ミリシタ @ Zenfone 5z

音ゲーでも3Dグラフィックスでもない作品としては「アイドルマスター シャイニーカラーズ」も触ってみましたが、操作感としてはデレステ、ミリシタ以上に改善を感じられました。HTML / CSS / JavaScript で作られた HTML 5アプリ(非ゲームアプリ含む)全般の改善が期待できそうです。

カメラ

並~並以上なのは確かです。HTC 10 のカメラはあまりよくなかった事も有り、それよりは明確に良いですね。HUAWEI製スマホのように尖った部分は無く、夜景はもちろん Pixel 3 等に負けますが、それなりに悪くない画が出てきます。個人的な好みとしては Pixel 3 の夜景はHDR感が強すぎるように感じるので、これくらいでもちょうどいいですね。ただ、高彩度の色が少し苦手なような……?。以下の例は全てオートモードでの撮影、 4032 * 3024 ピクセルの写真を 1920 * 1440 まで縮小した物になります。

Zenfone 5z カメラ作例
Zenfone 5z カメラ作例
Zenfone 5z カメラ作例
Zenfone 5z カメラ作例

標準カメラアプリのUIの操作感も悪くないです。なお、Zenfone 5z は2レンズ(2センサー)の機種で、サブ側のカメラは超広角レンズ(35mm版換算で12mm相当)になっています。標準のレンズも広角なので広角 + 超広角という組み合わせになります。超広角レンズは扱いが難しいのであまり使う機会は無さそうですが、写したい人が多いけどこれ以上後ろに寄れない室内等の時には良いかもしれません。

音質

スピーカーに関しては「よくあるスマホ」の音で並み程度ですね。通話時に耳を当てる側のスピーカー音量が小さいので左右にパンを振る曲だと片方が小さく聞こえるのはちょっと微妙なポイント(ただこれは HTC 10 でもそうです)。肝心のイヤホンジャックの方の音質ですが、言われているほど悪いとは感じません(Zenfone 5z はイヤホンジャックの音質に対する評判が悪いです)。直近のアップデート内容には「音質改善」も明確に含まれているため、ここで改善が入った結果かもしれません。プレイヤーアプリは ONKYO HF Player、イヤホンでは final E3000、ヘッドフォンでは AKG K712 Pro で視聴しましたが特に悪い点は無く並のスマホ程度の再生機としては使っていけると思います。

ONKYO HF Player @ Zenfone 5z

なお、何らかのアプリの暴走時など、端末に尋常でない負荷がかかっている際に音がブチブチ言う現象が起きる事を確認しましたが、これは他のAndroid端末でも起きる事なので仕様ですね。デレステやミリシタのMV程度では問題無いです。

他にはスマホにたまに実装されている「ヘッドホン効果」的な機能も有りますが、今の所はOFFで使っています。バーチャルサラウンド系の音はあんまり好きじゃないです……。

その他に

端子は USB-Type C、防水やFelicaやワンセグは非対応。ワイヤレス充電も非対応です。指紋認証は本体裏面。戻るボタンやホームボタンは画面上のソフトキーです。USB-PD対応なのである程度充電は速いですが、めちゃくちゃ速い訳ではないです。その他注意点としてはデフォルト設定のままだと時計アプリなどもバックグラウンドで落とされてしまう事が有るようで、そうなるとアラームが鳴らなくなってしまうので落とされると困るアプリは事前に設定調整しておきましょう(以下リンク参照)。

参考
ZenFone 5(ASUS、2018)まとめWiki
https://zenfone5-asus-wiki.fxtec.info/

総評

スペック面はカタログスペック時点で問題なく懸念点としては音ゲーと音質面でしたが、どちらも問題ない水準でこの価格で買えるなら大いにアリなスマホです。もうすぐに Zenfone 6 発表が控えていますが登場直後から現在の価格水準で買える事はおそらく無いと思われるので今から選んでも全然良いスマホだと思います。ただし、片手操作は本当に無理なのでそこを外せない方は諦めが必要になります。


概念上の温泉

温泉や温泉宿に行きたいなと思う事は多々あるが、「概念上の温泉」に行きたいという人は居ないだろうか。私は概念上の温泉に行きたい。

温泉、温泉宿には私個人としては以下のイメージが有る。

  • ゆっくり温まれる。
  • それによって体中の疲れが取れる。
  • 露天風呂なら解放感の有る景色。
  • 肌触りの良い浴衣。
  • 座敷部屋にはみんな大好きな窓際の謎空間。
  • 豪華で美味しい料理。
  • 作業やら勉強やら集中できる。
  • 複数人で行ったらワイワイ楽しい。

では実際の温泉に行ってみるとどうだろうか。これは私の話なので完全に私の主観の話になる。

ゆっくり温まれる:
そもそも熱いのが苦手なので湯船に長時間浸かるのが苦手。せっかく温泉まで来ておいて5分有れば満足。粘っても15分かなという所である。

体中の疲れが取れる:
これは実際に取れるような気はしているのだが、気合を入れて温泉らしい温泉まで行くと帰る過程で結局疲れてしまう。家に着いてみると結局行く前より疲れている。また、温泉はどうしても多人数利用かつ水物なので、綺麗な温泉でもどこか温泉の成分ではなさそうなヌルヌル感があったり髪の毛が浮いていたりで、体にプラスのはずの場所でどうにも気になってしまう。レジオネラ菌もわんさか居るので本当に疲れきっている時は入らない方がいいと思う。

露天風呂なら解放感の有る景色 :
良い所はほんとに良いんだけども、それを観るには日中入らないといけない。日本は行った事のない土地の方がまだまだ圧倒的な私としては日中は普通に観光したいのである。

肌触りの良い浴衣 :
実際着てみるとあまりしっくりこないあの感じ。一応使うけど使わずTシャツで寝る事もままあり。

座敷部屋にはみんな大好きな窓際の謎空間 :
なんだか暗くて日中外出していると特に使わない。部屋の景色も良い宿なら朝は良い感じ。

豪華で美味しい料理 :
温泉旅館の食事、食べててきつい量でよくみんなあの量食べられるなと思います。海沿いそうでない関係なくやたら海老と蟹の登場率が高いですが、私はどちらもアレルギー。夕食の門限もうちょっと遅くなりませんかね。

作業やら勉強やら集中できる :
これはビジネスホテルでもそういう所結構有るのですが、正直もうちょっと照明明るくしてほしいですよね。

複数人で行ったらワイワイ楽しい :
楽しいは楽しいんだけど、夕食の門限が早いせいで結構手持無沙汰。とりあえずTV付けるかみたいな感じになりがち。そして楽しい旅行の後は虚無感に襲われがち。

と、こういう感じなのが温泉、温泉宿。ただ、文句ばっかり言っていますが温泉は嫌いではなく、温泉という概念は一番最初に上げたプラスのイメージのままなんですよね。温泉行きたい意欲も有る。実際に行ってみて実際にある程度良い所なんだけど、私の行きたかった温泉とは少し違う。温泉サイドが悪い訳でもなく悪いのは完全に私。

複数人で行くと皆は温泉を楽しんでいて、もちろん水を差したくは無いので微妙なポイントを直接口で列挙したりはしないが、どこか自分だけ楽しめていない気がしてくる。

ようするに「概念上の温泉」に行きたいんですよね。