OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

自宅の狭い作業環境を拡張してみた

おひさしぶりです。サーバエンジニアのyukimuraです!

全国で緊急事態宣言が解除されましたね。 まだまだ油断せずに節度ある生活を心がけていこうと思います。

さて、今回の自粛期間中フルリモートとなり会社からリモートワーク一時金をいただきましたので、自宅の作業環境を拡張してみました。
https://note.com/otobank/n/n40323daa3c93

タイトルの通り私の作業スペースは横幅約70cmと結構狭いです。 しかし、狭くても快適な環境を作りたい!ということで拡張の様子を晒していきます👐

拡張前

f:id:yukimura0301:20200526172141j:plain

横幅70cmくらいのPCデスクを置いて作業しています。 本当はもっと横長の机を置いてディスプレイを横に並べたいのですが、 デスク横に扉があるのでこれ以上横長の机は置けないんですよね。 う〜ん狭い。

横に並べられないなら縦に並べれば良いんじゃない?ということで、 今回はモニターアームを買って縦にディスプレイを並べてみることにしました。

拡張後

モニターとモニターアームを購入しました!

縦にモニターを2枚配置しています。(上部のプリンタ台は撤去。プリンタは足下の台に移動) f:id:yukimura0301:20200529125342j:plain

後ろ。モニタの角度を変えられて良い感じです。 f:id:yukimura0301:20200529125412j:plain

うちは扉があるため出来ませんが、ネジを緩めて高さ調整すれば横に2枚配置する事も可能です。
なお、このモニターアーム(FLEXIMOUNTS社製M6SD)を組み立てる際にはモニタを手で支えながらアームのねじ止めをする必要があるため、1人で組み立てを行うのはかなり厳しいです。
(説明書にも安全のため大人2名で組み立てるよう、注意書きがあります。)
モニターアームの購入を考えている方がいたら、誰かに組み立てを手伝ってもらってくださいね。

構成

  • PC: MacBook Pro 13-inch 2019(Apple)
  • PCデスク: HLN-60BKN(サンワサプライ)
  • 既存モニタ: RDT234WLM(MITSUBISHI)
  • 新モニタ: GW2780(BENQ)
  • USBTypeCハブ × 1 : A8335(Anker)
    ※ ハブは無くても良いですが、USB2.0のデバイスを接続するためにあると便利。この機種の場合はmacの電源ケーブルを接続して充電もできます。
  • HDMIケーブル(USBTypeC to HDMI) × 1
  • HDMIケーブル × 1
  • モニタアーム: M6SD(FLEXIMOUNTS)

接続は以下構成です。

  • macbookのTypeCポート --- USBTypeCハブ --- HDMIケーブル --- 新モニタ

  • macbookのTypeCポート --- HDMIケーブル(USBTypeC to HDMI) --- 既存モニタ

感想

今のところ上モニタにブラウザやコンソール、下モニタにエディタ、Macbook本体画面にslackやその他ツールを表示・・という形で使っておりなかなか快適です。
アプリを開いたり非表示にしたりという動作が減って作業が効率的になっている気がしています。

しかし予想していたことではありますが、椅子を高くしないと上の画面を見上げると首が痛くなりますね・・。 椅子を高くした状態で使っていると、手元のmacbookを見ると背中が丸まってしまい 気付くと姿勢が悪くなっているということがあるため良い対処法がないか検討中です😓

おわりに

まだまだ改善点があるため、今後も理想的な作業環境を模索していきたいと思います。 ヘッドセットを買おうと思っているためおすすめがある方は教えていただけると嬉しいです!!

それでは、他のエンジニアの作業環境も見たいな〜と前振りして終わります🙏

React Nativeアプリで Sign in with Apple を実装する

こんにちは、アプリ開発担当のエモトです。待望の映画 SHIROBAKO が地方映画館でも上映される矢先、昨今の事情で休館になり、悲しみに暮れております。しかしながら、首都圏中心だったIT技術系の勉強会がリモート開催されるようになったりと、新しい世界を楽しもうと思った田舎民です。

さて、先日のアップデートでオーディオブックアプリは iOS / Android ともに Sign in with Apple に対応しました。今回は、その話を少ししたいと思います。Webでの話は こちら をご覧ください。

Sign in with Apple

Sign in with Apple は、アップル社が Apple ID を使った認証システムを提供します。ユーザーはパスワード不要で Face ID / Touch ID でアプリに登録やログインできる、サービス提供側は承認済みの Apple ID なのでメール確認不要など、様々な利点のもとで利用することができます。

React Nativeアプリで実装する

弊社サービスは自社の会員登録に加えて、Facebookでのログインをサポートしているので、Sign in with Apple は開発ガイドラインからも対応必須でした。アプリは React Native でクロスプラットフォーム開発を行っていますが、この実装は iOS / Android それぞれ別々に実装をしました。

iOS

こちらのライブラリ invertase/react-native-apple-authentication を使用しました。iOS の SDK をラッパーしているので、一連の認証フェーズは問題なく実装できました。手前味噌ですが、このライブラリのネイティブ部分のコードに不足があったので、私の方でPRを出して、コードを修正しました。

検証中に気づいた点として、シミュレーターでは Sign in with Apple はサポートされてないようなので、実際の認証を確認する場合は実機でデバッグするとよいです。また、当初は iPod touch で実機検証していたのですが、検証のたびに Apple ID のパスワードを入れるのが億劫でして、検証機を Touch ID がある iPhone 8 に入れ替えました。開発時は、利点でもある Touch ID や Face ID がある端末を利用するのがおすすめです。

Android

Android で Sign in with Apple を用いるのは個人的にもレアケースだと思います。弊サービスは iOS / Android / Web と複数のプラットフォームで提供しており、スマホは Android だけどタブレットは iPad などのケース(その反対も)も考えられるので、Android でも実装しました。

アップルが Android 用のネイティブ開発の SDK を用意していないのもあり、開発時点で React Native で利用できるライブラリは見つけることはできませんでした。そこで、直接認証URLにアクセスして、認証を行いました。

こちらのサイト Incorporating Sign in with Apple into Other Platforms / Send the Required Query Parameters を参考にして、https://appleid.apple.com/auth/authorize の認証URLを生成しました。redirect_uri に指定したURLに認証結果が戻ってくるので、それからユーザー情報を取得して、アプリを実装しました。

当たり前ですが、SDK で組んだ iOS に比べて、Android の方が手間がかかりました。

まとめ

実装自体は簡単にできると思います。しかしながら、名前が取得できるタイミングが最初の認証時のみなど、Sign in with Apple の仕様面を自社サービスに組み込むところに苦労しました。通常な使い方では問題ないと思いますが、開発時や、ユーザーがいったんサービスを退会してから再登録する場合など、いろいろ考えて作りました。

Sign in with Apple の既存アプリの対応締め切りが6月末と迫ってきています。まだ、React Native アプリで実装がまだの方はがんばっていきましょう。

最後に、オトバンクではエンジニアを募集中です。オーディオブックや、React Native開発に少しでも興味があれば、是非どうぞ。

お待ちしております。

PHPStan、phpstan-doctrine を 0.12 へと アップデートした

はじめに

弊社のサーバーサイド でのメインプロジェクトでは、過去のブログエントリにもあるように、PHP ならびにORMとしてDoctrine を導入しています。

そして PHPStan をQAでの主な静的解析として利用しており、コードレビュー時の負担を減らすため機械が指摘できることは極力機械で行えるように随時設定の見直し・チェック項目の追加などを行っています。

先月にはプロジェクトでの導入している PHPStan ならびにそのエクステンションのひとつである phpstan-doctrine のバージョンを ^0.12 にやっとのことでアップデートをしました。 その際の対応点と、バージョンをあげたことによる恩恵などについて記したいと思います。

PHPStan 0.12 ならびに phpstan-doctrine とは

PHPStanはよりfeatureを盛り込んだ0.12.0 が 去年12月に リリースされていました。

とりわけ ジェネリクスのサポートは Doctrineのコレクションクラスを多用しているプロジェクトではより型を検査することに活躍できますね。 0.12 でのほかの feature としては以下が挙げられます。

“class-string” 擬似型 でのクラス文字列名のチェック

これは例えば

<?php
/**
 * @param class-string $className
 */
function foo(string $className): void { }

foo('DateTime');
foo(Bar::class); // Class Bar not found.

という風に、主にライブラリでクラス名を指定するようなケースでのミス防止につながります。

phpstan/phpdoc-parserが0.4 にあがったことによる array-shapes (Object-like arrays) へのチェック

※ 正直なところとしては psalmですでにサポートされている array-shapes記法が PHPStan:0.11 ではエラー(Unexpected token)となってムムムと思ってました。

「PHPでの型」と 「Doctrineでのカラム型」の不一致の判定

上述の OndrejMirtesのブログエントリ内にある 「Doctrine extension: compare property type against @ORM\Column definition」の記述の通り、Doctrineで定義されている型と@var アノテーションでのプロパティ型に不一致がある場合警告してくれるようになりました。これは ^0.12 に上げることで最も大きい恩恵と言えるでしょう。

これは主に、nullable=true とカラムを定義していたにも関わらず、@var アノテーションにnullableなユニオン型チェックを定義していない検出に役立ちました。

また、下記のようなdeciaml定義をしたにも関わらず int を記述しているようなケースについても

    /**
     * @var int
     * @ORM\Column(name="latitude", type="decimal")
     */
    private $latitude;

type mapping mismatch\\: database can contain string but property expects int と警告で気づけるようになりました。

また、

<?php
class User
{
    /**
     * @var CreditCard
     *
     * @ORM\OneToOne(targetEntity="CreditCard", mappedBy="user", cascade={"persist","remove"})
     */
    private $creditCard;

のような nullがありうる OneToOneなどのアソシエーションへも

 ------ ----------------------------------------------------------------------------------------------------------
  Line   User.php                                                                                                 
 ------ ----------------------------------------------------------------------------------------------------------
  123    Property User::$creditCard type mapping mismatch: database can contain
         CreditCard|null but property expects CreditCard.
 ------ ----------------------------------------------------------------------------------------------------------

と警告がでるようになりました。

^0.12 に上げるためにしたこと、併せて行ったこと

otobank/phpstan-doctrine-criteria をアップデート

PHPStan 0.12 への変更に追従しているかを確証するために各ユニットテストの追加と 依存する phpstanならびにphpstan-doctrineのバージョンを 0.12 系に上げました。 https://github.com/otobank/phpstan-doctrine-criteria/pull/1

不足していたプロパティ指定の追加。

phpstan-doctrineを 0.12 に上げた際に、主に対応量が多かったのは、下記のような OneToManyなプロパティについて、

<?php
class Audiobook
{

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\OneToMany(targetEntity="Artwork", mappedBy="audiobook", cascade={"persist","remove"}, orphanRemoval=true)
     */
    private $artworks;
 ------ -----------------------------------------------------------------------------------------------------------
  Line   Audiobook.php                                                                                             
 ------ -----------------------------------------------------------------------------------------------------------
  217    Property Audiobook::$artworks type mapping mismatch: property
         can contain Doctrine\Common\Collections\Collection but database expects
         Doctrine\Common\Collections\Collection&iterable<Artwork>.
 ------ -----------------------------------------------------------------------------------------------------------

と警告が出る点でした。 これはもちろんそのプロパティを参照するさいに(foreachで回す場合など)はどのエンテイティを取得しているか必要となるため、これは警告通り iterable<エンテイティクラス>なユニオン指定を地道に追加していきました。

<?php
class Audiobook
{

    /**
     * @var \Doctrine\Common\Collections\Collection&iterable<Artwork>
     *
     * @ORM\OneToMany(targetEntity="Artwork", mappedBy="audiobook", cascade={"persist","remove"}, orphanRemoval=true)
     */
    private $artworks;

プロパティタイプヒントを必須に

上述の"「PHPでの型」と 「Doctrineでのカラム型」の不一致の判定"は、各プロパティの型が検出できなければいけません。PHPStan でのlevel 6 では(主にアノテーションでの)タイプヒントに関しての各ルールが追加され、この中の MissingPropertyTypehintRule によってタイプヒント指定されているかを検出できます。

また、phpstan.neonでのパラメータで inferPrivatePropertyTypeFromConstructorをtrueにすればコンストラクタでの型指定からプロパティの型補足する方法もあります。 しかしながら、現在のコードベースでのタイプヒント全般については、継続的に都度記述を行って改善している段階であります。

そのため、プロパティタイプでの型宣言を必須とするチェックには、PHP_CodeSniffer 用の追加ルール slevomat/coding-standard での SlevomatCodingStandard.TypeHints.PropertyTypeHint Sniff を用いて コーディング規約チェックとして検出するようにしました。

まとめ

この記事では、PHPStan 0.12 を導入した点でも特に、phpstan-doctrine での利点/対応点についてふれました。 ここ最近の PHP静的解析シーンでの注目は、強力な擬似型のサポートであるわけですが、今回メインプロジェクトにて PHPStanを0.12に上げたことにより、その効果によりバグの減少やテストの強化につながる土台を整えらえて安堵しています。