gorogoroyasu

福岡の開発会社で働いている。

iPad Pro はいいぞー

iPad Pro 買った自慢ブログです。
購買欲を上げたい方にはお勧めですが、
節制しようと覚悟している人にはあまりお勧めしません。

ということで、行ってきました。
Apple Store 表参道店。
素敵。

そして、買ってきました。
iPad Pro 10.5 インチと スタイラス Apple Pencil。

カバーは残念ながら、Apple Store にはなかったから、
Amazon で買いました。

カバー。
そんなものを使う日がくるなんて。。。 と、ずっと思ってきました。
もちろん僕のiPhone SE には、カバーなんてものはつけてません。
そして、僕のiPad Air2 にも、カバーなんてものはつけてません。

でも。。でも。。。
カメラが。。。
iPad のカメラとか何に使うか一切わからないけど、
割れたら割れたでかっこ悪い。
そう。カメラが出っ張ってるんです。(今更)

最初はカバーなしで使ってたけど、
気にするのがめんどくさくなって、結局カバー買っちゃいました。

でも、買ったカバーが地味に優秀。

Amazon CAPTCHA

なんといっても、ペンが刺さるところがいい!
そして、カメラも気にしなくていい!

ただ、だいぶ重たい。

片手で持つのはだいぶつらいぐらい重たい。

なので、用途を選ぶと思います。
家に帰ってYoutube 見るようにiPad Air 2 を持ち上げた時の喜びと言ったら。。。

プロブロガーみたいなこと書いてしまった

閑話休題

そもそも、なぜiPad Pro を買ったのか。
それは、論文を読むためです。

最近機械学習とかの勉強してて、最新の論文を追っていないと取り残される と感じたから。

そして、その論文を読むという分野において、iPad Pro は、とてもよい。
PC より軽くて、思ったことをPDF に直接書き込める。

そして、付帯効果として紙を抹殺できる。(でかい)
今までスケッチブックをメモ帳代わりに持ち歩いていたけど、かさばるし、情報は散らばるしであまり好きではなかった。
だけど、iPad Pro だと、その心配は(少なくとも今の段階では)ない。

こんな感じで、完璧だらけ(今のところ。9万円の価値があるかは別問題。)のiPad Pro だけど、
いくつか不満もある。

正確に言うと、iPad Pro に対する不満というより、アプリに対する不満だけど。

Mendeley

まず、論文を読み書きするときによく使われるアプリ、Mendeley。

www.mendeley.com

このアプリ、非常に便利でよいのだけど、
肝心のPDF に文字を書き込む機能が付いていない。

こんな感じで欲してる人は多いはずなのに。。。
ちなみにこの掲示板的なところ、けっこう長文のスパムがついてて、まじめに読まされて萎えた。
“7年間ウィルソンとともに歩んできたけど、彼は去っていった” 的な入りだったら、中の人も大変だなー。って思って読むでしょ!
ただのスパムだった。ふざけるな。。

GoodNotes

今使ってるのは、評判が高い GoodNotes というアプリ。
1000円ぐらいだった気がする。
Evernote とかも使いやすいらしいけど、消費者としてはやっぱり買い切りのほうがいい。
(ちゃんと見てないけど、GoodNotes がサブスクリプション型だったらつらい)

PDF の書き込みができて、その完成度が高いところは非常に感謝してる。
ただ、このアプリに一つ不満がある。
それは、手書き部分を非表示にできないこと。
フォトショのレイヤー的な概念(使ったことないけど)で手書きをしたいのに、それができない。

ということで、まだ決定版がない感じです。
さっき調べたところによると、Mendeley にはAPI があるっぽいから、
最悪 自分で作 誰かに作ってもらえばいい。
300円上げるからだれか作ってー。。。

PHP BLT に参加してきた話

PHP BLT

PHPBLT とは、簡単に言うと、PHPネタについてLT をしようという企画のようです!
fukuokaphp みたいな感じですね。

今回は、メルカリさんのオフィスを会場にして行われました。

六本木ヒルズ
f:id:adiboy:20170820153958j:plain

ビルの中に入るのが難しいww

会場に入ると、こんな感じで飲み物と食事が準備されていました。
とても美味しかったです!!
f:id:adiboy:20170820154325p:plain
ちなみに、こちらのお食事、一人の方が作られていて、スケールアウトできないのだとか。
いいTシャツ有るんですけどね。

早速、LT!

koyhoge さん

PSR12 についての発表でした。
なんと、PSR は誰でも提案できるらしいです!(英語)
実際に発行済み 8つ 提案中 15個なのだとか。

PSR2 は、2012 年の規約で若干古くなってきたので、
PSR2 を内包するような形でPSR-12 が策定されようとしているそうです。

登壇資料はこちら!
https://speakerdeck.com/koyhoge/psr-12

まみーさん

ちなみに、まみーさんは、闇のエンジニアらしいです。
まみーさんの呼びかけにより、闇のエンジニアが挙手しましたが、けっこう多かったです。
(※ 闇のエンジニア: DB に画像を保存したことがあるエンジニア)

本LTのまとめ
画像の保存にDBは使わないほうがいいよ
楽だからDBに画像保存はよくない
パフォーマンス・コストとのトレードオフ (覚悟が必要)
しっかり計画しておく (あとで困らないように)
RDB の責務を考えましょう

資料はこちら
https://speakerdeck.com/mamy1326/put-the-image-in-the-rdb-advantages-and-disadvantages

hanhan1978 さん

キャッシュの話。
ISUCON も迫ってきたので、キャッシュ速度の話をしよう という発表でした。
目標は、キャッシュすることにより、1万レコード全件取得する時間が MySQL より速くなること。
MySQL にindex を貼ってたかどうか聴き逃しました。
たぶん、発表資料に書いてあるはず。

結論は、
mysql は偉大です。
Redis に頼りっきりはよくない
IOはコストがかかる
とのことでした。

ちなみに、

  • 大量データを低コストで華麗に読み込む方法
  • Cache にすべきかどうかは要検討らしい

を募集しているそうです。
これ! という解決策をお持ちの方はぜひお知らせください!

なお、議論が分かれるところだったらしく、
memcache は? とか、 全件Select するならCache の意味ないじゃん みたいな質問が飛び交いました。

rela1470 さん

API 仕様書が気づいたらExcel になってた話

資料はこちら

speakerdeck.com

API 仕様書がなぜExcel になってしまったのかが、
時系列で書かれていました。
大事なところですが、正確には、Excel ではなくSpread sheetに落ち着いたそうです。
最低限の人権は保証されている と主張されていました。

ちなみに、Insomnia Teams が、便利らしいです。
(詳しくは発表資料をご参照ください!)
あ、あとこちらもよい案があれば教えてほしいとのことでした!

LEE さん

残念ながら、資料が見つかりませんでした。
上げてください!そして、上げたら @gorogoroyasu までメンション飛ばしてくださいw

韓国の、Leeさんの発表でした。
デザインパターンの話が勉強会で言及されにくいのはなぜか?という話に対する問題提起でした。

なぜあまり論点にならないかの考察は、主に以下の3点でした。

  • 実コードを見ながらやる必要があるから?
  • 他人にどうこう言われる必要はない?
  • 宗教戦争になる?

ちなみに、LEE さんは、ドリフト仲間募集中らしいです。
命知らずの方 興味有る方はぜひ!

KazuakiM さん

vim for php
PHP を書くのに vim を使いましょうという話でした。
この手の話で必ず挙がるのがPhpStorm の使用者の話ですが、
今回もご多分に漏れずPhpStorm 愛用者の挙手イベントが発生しました。
およそ半分ぐらいが使ってる印象でした。
想像以上におおかった。
あ、ちなみに僕もついにJetBrains AllProducts に課金したので、PhpStorm ユーザーです!
Atom 好きなんだけどなー。
ということで、突然ですが、Atom のいいところを発表しようと思います(以下略)

tenkoma さん

社内のSVN を全部GitLab に移行しました!!
だそうです。

又、CakePHP3 x Circle CI の環境を構築されたそうです!

この話超面白かったので、
ブログでまとめてほしいと思ってたら、ポストが出てました!
ほんと、ブログ枠で参加しといて登壇者より出すの遅いとか申し訳ありません。。。

tenkoma.hatenablog.com

Circle CIの話、参考にさせていただきます!

chiroruxx さん

phpDoc のおさらい

初PHPBLT && 初LT だそうです!
素晴らしいですね!

仕様を書く場所は
- phpDoc
- phpspec
- 仕様書
- ユニットテスト
- コード
のように色々ありますが、その中でPHPDoc を使うとこんなにいいことがあるよ という話でした。
自分もけっこうPHPDoc 育てる派ですw

休憩!

ここから、魔の休憩時間が始まりました。
何が “魔” か?

それは、ビルの構造が複雑なこと。
トイレを探して、色々歩き回った結果、ビルの中で迷ってしまいました。
休憩時間5分だったのですが、
戻ってきたのは10分後。

ということで、

Hirakuさん

さんの発表を聞けませんでした。
大変申し訳ありません。
PHPの現場、拝聴しました!

p さん

テスト時のモックライブラリの話。

スプラトゥーンやってるそうです!
テスト大事ですよね?
最近レガシーなプロダクトをバージョンアップしつつ、
テストも鋭意追加されているそうです。

Prophecy というものがおすすめだそうです。
もちろん、新規開発とレガシーコードの保守という役割の違いによるステージの違いもありそうですが。

ちなみに、考えた話なので、これから実践されるそうです。

実践して困った話についてもお聞きしたいですね!

資料はこちら!

speakerdeck.com

きのこたけのこ さん

たけのこのほうが好きらしいです。
言い切っちゃう辺り、すごいですね!

koemu さん

外部API は、いつか切り替えなきゃいけないですよね。
僕は、その準備ができてませんでした。

ドメインクラスを使うとよさそう らしいです。
やっぱ、密結合は辛い。

という話でした。

ぶっちー さん

PHP機械学習をしようという話で、
PHP-ML というライブラリの紹介でした。
PHP のなんでもあるところが大好き とのことでした!
素晴らしい!

ちなみに、自分も最近機械学習に足を突っ込んでるので、
とてもおもしろい話でした。
できることはpython製ライブラリ に比べると少ないそうですが、
PHP で書かれているというところがワクワクします。

YuichiKishimoto

PHP Beginner がぶち当たった壁の話!でした。

ざっと説明すると、
- Fat Controller になるよねー
- Fat Model になるよねー
-> MVC固執せず、自由にクラス分割しましょう!
という話でした。
また、

phpunit でテスト書いてます。
no test no life 

だそうです!

書いたほうがコスパ高いとおっしゃっていました。
まあ、後々のこととか考えるとそうかも と思いました。

きりん さん いいレビュイーになるには? という話でした。
基本みんな忙しい(暇な人は会社やばいかも?)
そこで考えたのが、
“厳正な抽選を hubot で行う"という方法。
これについては、昨年PHPConference のLT で発表しました!

この時の話は、レビュアーに強制的に仕事を振っていくのが解決策だ というのが結論だったそうです。

しかし、レビュイーもけっこうデキることが多いのでは?と感じられたとのこと。

具体的には、
- github テンプレートはいいぞ!
- todo の洗い出しもデキるぞ!
- GFM 記法で書くといいぞー

という話でした。
tips がいっぱい詰まってるので、スライドを是非御覧ください!

scrapbox.io

最後に、@cocoitiban さんによる、飛び込みLT がありました。
昔の話 ということで、聴衆の大半を置いてきぼりにするガラケーの話がありました。
自分が PHPカンファレンス福岡のLT で発表したガラケーの話にも少し触れて頂きました。
PHPの現場podcast でも言及されておりますので、よろしければ!

php-genba.shin1x1.com

福岡から東京に進出してきて2ヶ月、
東京は、色々な勉強会があるなーと感心しています。

もう少しおりますので、色々参加させていただきます!
よろしくどうぞ!

複数のGPUを積んだマシンで、未使用のGPU を選ぶやつ作った。

タイトルが難しい。

とりあえず、作りました。
github.com

作り方はとっても簡単。

nvidia-smi

コマンドたたいて、結果をCSV で受け取るだけ。

使い方はもっと簡単。

使い方

from get_unused_gpu.main import get_unused_gpu


os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = str(get_unused_gpu())

python のお作法は知らないので、git clone して、適当に使ってください。

PyPI 一応登録はしたものの、ちょっと怖くて使えてません。
気が向いたら登録します。

とりあえず、自分用です。
なんか、こんなブログですいません。。。

あ、ちなみに、

gpu temp: under 40°C
utilization.gpu: 0 %
utilization.memory: 0 %

が未使用と判定する条件です。
時系列情報とかとってないし、同時に処理が実行されたときのこととか関係ないのであしからず。
あと、現状使用可能なGPU がない場合 exit() してるので、止まります。
PiPY 登録するときは、最低限この辺きちんと作らなきゃなー

ギガの大切さを考える。その画像、必要ですか?

1月ほど前まで、自分はWeb 開発をしていました。今は、pythonista になるために、日々精進しています。
閑話休題
そんな話をしたかったのではありません。今日は、ギガの大切さの話をしたいのです。(自戒の念をコメて)
そもそも、なぜこんな気持ちになっているか。それは、現在の仮の住まいに、インターネットが通っていないからです。つまり、何をするにもギガを気にしなきゃいけないわけです。
そんな中、一番困るのは広告。よっぴーさんの記事にて一時期議論になった話に似ています。広告記事には [PR] を入れろ云々という話です。 (ギガの関係上リンクは割愛させていただきます。)
でも、少し論点は違います。上記の記事で言われてた話は、

広告記事なんか見たくないからそもそも見せるな

という話です。が、僕が言いたいのはそんなことではなく、

無駄に画像をボコボコ貼って、ギガを消耗させるな!!

という話です。

皆さん、知ってました?画像って、重いんですよ?
キャッシュされるからいい? 後ろにクエリストリングを追加するだけで毎回ダウンロードするんですよ?

まあ、画像のダウンロードでギガが減るのは一部しょうがない部分もあります。非常に有益な画像が落ちてくることだってある。(難しいアルゴリズムを図にして説明してくれてたりとか)

でも、落ちてくるのがそんな画像なことって、めったにないんです。AB◯ Mart の広告だったり、スマホの下の方でピコピコ動く画像だったり(この場合、無駄なJS もダウンロードしてることになる)

その画像、ほんとにギガがない人にとって重要ですか?  
そんな高画質な画像を送ってくる必要ありますか?  
テキストじゃだめですか?  

一番むかつくのは、 facebook にプロモーションで上がってくるリンク。あいつら、クリックすると、画像だらけの 記事のタイトル一覧のページに遷移させやがる。。その記事みたいからクリックしたのに、なぜその記事に遷移させないのか。。。
ついつい言葉が汚くなってしまった。
そんな記事あったら、基本的に見ないようにしてます。が!!それでもギガは減るのです!!!

先月まで自分は、ギガは水よりも安いと思っていました(自宅マンションはネット無料)。
でも、そんな人ばかりじゃないんです!!!

あと、ギガに比例して、通信速度の問題もあります。先月まで自分は、ネット?それ光の速度が上限でしょ? と思ってました(自宅も職場も光回線)。でも、今は違います。128kbpsです。もう少し、ギガが貴重な人向けの仕事をしませんか??

ということで、なんか便利なやつ作ろうかなと思います。画像をダウンロードしないブラウザとか(Feedly のアプリ内ブラウザで実現できてるなら技術的には可能なはず)、画像を圧縮してくれるサーバーを経由したWeb アクセスとか(お金かかりそう)。
このままではダメだ!(rebuild.fm かなにかのpodcast で、新興国向けにそんなサービスがあるという話を効いたことが有る気がする。SSLが問題とか言ってた気がする。。。まあ、そこは追って考えよう。) 皆様のギガを考慮して、改行をなるだけ減らしましたので、多少読みづらさはあるでしょうがご勘弁ください。。 あと、追加30GB(5000円)買いましたことも申し添えておきます。

PHPカンファレンス福岡2017 行ってきました

大変遅くなり申し訳ありません。
ブログを書くまでがPHPカンファレンス
ということで、今日で僕のPHPカンファレンスが終わります。

2017 年 6 月 10 日に、福岡ファッションビルにて、PHPカンファレンス福岡が開催されました。
その、感想などを書いていきます。

前夜祭
PHP カンファレンス福岡では、例年前夜祭が行われているらしいです。
今年は登壇する予定もあったため、正式にオファーを頂き、参加させて頂きました!

よく名前を聞く人や勝手にTwitter フォローしてる人がすぐ側にいたりして、
異様な光景が広がっていました。
(写真なし。)

前夜祭 2次回
赤坂辺りにある、エールズというお店で二次会が行われました。

retty.me

ビールが美味しかったです。
ここでは、最近流行りの開発手法について、色々とお話させて頂きました。
非常にためになる話を聞けて良かったです。
(写真なし)

前夜祭 3次回 うまいラーメン屋があるということで、前夜祭3次回を行いました。
僭越ながら、私がお店を勝手に決め、先導させて頂きました。
食後の写真で恐縮ですが、写真はこちら。(替え玉したあと)
f:id:adiboy:20170615083538j:plain

ちなみに、道中にあった一心亭も、福岡の有名なラーメン屋さんです。

麺物語|一心亭|こだわり

元祖長浜屋の参考記事を貼っておきます。
福岡出身の人に「元祖(もしくは「がんなが」)言ったよー」というと、伝わると思います。
伝わらなかったら、その人は似非福岡人です。(言い過ぎ)
menmusubi.com

こんな感じで、福岡の夜はふけていったのでした。

当日

早朝

朝早くから前夜祭でお会いした方々がスタッフをされていました。
本当に頭が上がりません。
いつもありがとうございます。

開会式

スポンサー紹介で、弊社 Fusic のロゴが全面的に表示されました!

(イメージ図)
http://realid-inc.com/column/assets_c/2014/09/8cfa0ba8402f3b67686f0744b7e58dc7a67ae9c9_large_2x-thumb-560xauto-2098.jpg
(写真引用元: http://norirow.com/archives/17511)

(本物)
f:id:adiboy:20170615084154j:plain

ほぼ一緒ですね!

スポンサーセッション

なななんと、スポンサーセッションに登壇させて頂きました。
数百人の前で話すのも始めてなら、技術の話をするのも初めてでした。

[プラチナスポンサーセッション] speakerdeck.com

こちらでは、自社サービスを題材に、若手が何を考えてサービスを作っているかなどについて発表させていただきました。 そして、ありがたいことに幾つかのブログで言及して頂きました。
スポンサーセッション、裏番組がないところで、我慢して聞いてくださっていた方も多いと思いますが、
少しでも得られるものがあれば嬉しいなと、心から思っています。

次回はもっといい発表をすることをここに誓います。

Ask The Speaker

発表から少し時間をあけて、Ask The Speaker がありました。
誰も来ませんでした。。
(スライド2枚しか見てない方は来てくださいましたがw)
少し反省しました。
確かに、目新しいことは何も言っていなかったな。。。 と。
次回からはいっぱい質問していただけるよう頑張ります!

LT

LT では、ガラケーの世界の話をしました。
speakerdeck.com

Twitter 上で意外と反応してくださっている方々がいて嬉しかったです。

参加させていただいたセッション

多くのセッションに参加させていただきました。

既に多くの方のブログで紹介されているので個々の感想は割愛させていただきますが、
1つだけ書かせて頂きたいと思います。

Hack/HHVMの最新事情とメイン言語に採用した理由

参加者がそこまで多くなかった点だけが残念なところでしたが、
今回参加したセッションの中で一番興味深い発表でした。

なぜ Hack を使ったのか。
Hack を使う上での注意点は何か
など、初心者にも分かりやすくHack の魅力を伝えてくださいました。

実際、PHP7 になって実行速度も変わらないし、
型を利用することができるようになった世界でどのようにHack が生き残っていくのか疑問に思っていたのですが、
そのヒントが散りばめられた発表でした。

僕も、こんな発表ができるようになりたいと、切実に思いました。
自分はPHP 使ってますが、 Nuclide はじめました。(リモートへの接続とかは使ってないですが。。。)

お知らせ

今月末から東京にいることになったので、
東京にいらっしゃる方とか気軽にお声がけいただけると幸いです!!
ご連絡はこちらまで。
twitter.com

ということで

来年もあるとかないとか噂がありますね!!
自分はスタッフをやっていないので何も言えないですが、
できれば開催していただきたいです!
そして、もし来年開催されるなら、
スタッフとして緑色のTシャツをゲットしたいです!!!<- 宣言の力

今年も、ありがとうございました!

タブ区切りのファイルからPHP の配列を作り出すためにやったこと。

タブ区切りのファイルからPHP の配列を作り出すためにやったことを書いていきます。

やりたかったこと。

[
    ['hoge' => 'name1', 'fuga' => 'namae1'],
    ['hoge' => 'name2', 'fuga' => 'namae2'],
    ['hoge' => 'name3', 'fuga' => 'namae3'],
    ・
    ・
    ・
];

みたいな配列を作りたかった。

元データは、

hoge fuga
name1 namae1
name2 namae2
name3 namae3
name4 namae4
name5 namae5
name6 namae6

みたいなの(読み込むやつ.csv)。これがTSV になってた。

とりあえずググった。見つけたのはこれ。

qiita.com

なるほど。CSV ならうまいこと変換できるのか。

ということで、おもむろにatom を開き、 tab を全部 カンマに置換した。
これで、CSVの完成(たぶん)

書いたコードはこんだけ。

readCSV.php

<?php

$file = new SplFileObject('./読み込むやつ.csv');
$file->setFlags(SplFileObject::READ_CSV);
$array = [];
foreach ($file as $line) {
    $array[] = [
        "'hoge'" => "'".$line[0]."',",
        "'fuga'" => "'".$line[1]."',",
    ];
}
print_r($array);

そして、
php readCSV.php > text.txt

を実行。
できた配列の書き出しとか作るとめんどくさいからね!

そして、text.txt をエディタで開く。
ARRAY が含まれている行を全部削除
-> ([に全置換
-> )],に全置換

これで、全部配列に変換された。

一件落着。

全部変換してくれるプログラムが理想だけど、
別に何度も使うものじゃなかったら、これぐらい手動のオペレーションがあってもいいよね?

後日談

頑張ったのに、こんなのあった。 このスクリプト使えば、 TSV -> 配列の変換簡単じゃん!
tab をカンマに置き換える とかしなくてよかったじゃん!

qiita.com

とおもったけど、後の祭り。
ということで、皆さんご自由にお使いください(ほとんど丸コピだけど。。。)

なにはともあれ、出来る限り簡単にデキるようにつくったから、ダメージはほとんどない。
よかった。

空のフィールドに独自のバリデーションをかける方法

CakePHP3 を使っていて、少し特殊なバリデーションを書く機会に遭遇した。

例)

add.ctp

$this->Form->create($entity);
$this->Form->input('hoge');
$this->Form->input('fuga');
$this->Form->submit('submit');
$this->Form->end();

ExamplesController.php

public function add()
{
    $entity = $this->Examples->newEntity();
    if ($this->request->is('post') {
        $tmp = $this->Examples->patchEntity($entity, $this->request->data);
        if ($this->Examples->save($tmp) {
            // something
        }
        $this->set(compact('entity'));
    }
}

という状況で、

fuga に値が入っている場合は、hoge は何か入力されている必要がある。
hoge に値が入っていても、fugaに値が入っている必要はない。

という仕様を考える。

一番簡単なのは、

ExamplesTable.php

public function validationDefault(Validator $validator)
{
    $validator
    ->allowEmpty('hoge');
    $validator
    ->allowEmpty('fuga')
    ->add('fuga', 'custom', [
    'rule' => function ($value, $context) {
        if (!empty($context['data']['fuga'] && empty($context['data']['hoge']) {
            return false;
        }
        return true;
    },
    ['message' => 'fuga を入力する際は、hogeも入力して下さい']
    ]);
}

を使って書いていく方法だろう。

ただ、この方法には問題がある。
それは、
「fuga を入力する際は、hogeも入力して下さい」というメッセージが
fuga に対して出現することだ。

本当に指摘したいのは、"hoge" が空欄であることなのに。。。

そして、そのための方法として考えられるのが、

$entity->errors();

を利用してエラーをセットすること。

しかし、残念ながら、 ‘fuga'につけられたエラーを unset する方法を見つけることができなかった。

とうことで、あえなく断念。
たぶん何か方法があるので、ご存じの方は教えてください。

次に考えつく方法は、

public function validationDefault(Validator $validator)
{
    $validator
    ->add('hoge', 'custom', [
    'rule' => function ($value, $context) {
        if (!empty($context['data']['fuga'] && empty($context['data']['hoge']) {
            return false;
        }
        return true;
    },
    ['message' => 'fuga を入力する際は、hogeも入力して下さい']
    ]);

    $validator
    ->allowEmpty('fuga');
}

だ。
しかし、この方法はうまく機能しなかった。

$this->request->data['hoge']が空文字の場合、
Validation をすり抜けてしまうからだ。

ということで、最終的に見つけたのがこちら。

public function validationDefault(Validator $validator)
{
    $validator
    ->allowEmpty('hoge', function ($context) {
        $hoge = $context['data']['hoge'];
        $fuga = $context['data']['fuga'];
        if (!empty($fuga) && empty($hoge)) {
            return false;
        }

        return true;
    },
     ['fuga を入力する際は、hogeも入力して下さい'']
    );

    $validator
    ->allowEmpty('fuga');
}

という書き方だ。

https://api.cakephp.org/3.3/class-Cake.Validation.Validator.html#_allowEmpty
に書いてある。

この方法を使えば、上記の例の要な場合も簡単に対応できる!
いやー、便利ー!