log

PS4でなぜかゲーム内ボイスだけ聞こえてこない

タイトルにあるとおり、謎の現象にハマったので記録に残す。

前提として、こんな感じで接続していた。

特に問題ないと思ってゲームを始めたものの、ムービー中にボイスが聞こえない。ちなみにやってたのはリリンク。

体験版もプレイ済みだったんだが、そっちではボイスがあったはず。さすがに本編になってボイスが消えるのはおかしいよな?と思うものの、BGMは聞こえている。謎。

そこで同じくプレイ中の知人に聞いたところ、ムービー中はフルボイスのはず、とのこと。YouTube でプレイ動画を探してみると確かにある。というわけで自分の環境がなにかしらおかしいことがわかる。

とりあえずHDMI切替器を介さずにPS4とモニタを直接繋いだところ、聞こえるようになった。

そこでHDMI切替器を元に戻した上で、間のHDMIケーブルをいくつかとっかえひっかえしてみるものの、変化なし。ついでに同じケーブルでPS4とモニタを直接つないでみると、すべてうまくいく。

どうにもわからんということで検索していたところ、以下のHDMI切替器(自分が使ってるものとは別)のレビューがひっかかった。

www.amazon.co.jp

以下、レビューの引用。

この機器をPS4に接続すると一部の音が出ない現象が起こりました。 原因はPS4がこの機器を「7.1chが出力できる機器」として認識するためのようで、 PS4が7.1ch(もしくは5.1ch)で出力した音をモニターの2chのスピーカーで聞くと センタースピーカーなどにに振られた音(人物の声など)がごっそり無くなってしまうためのようです。 本当に7.1chとして出力されているのかは確認できませんでしたが、現象からはそのように推測できます。 この問題はPS4の音声出力設定の「主に使用する出力端子」を光デジタル出力(AAC)に変更すると直りました。 光デジタル端子は使用していませんが、この設定でHDMIの方には2chで出力されるようです。

これを見て、とりあえずPS4の「主に使用する出力端子」を「光デジタル出力」に切り替えたらボイスが出るようになったのでした。めでたしめでたし。

なんだが、そもそもHDMI切替器に2CH/5.1CH/7.1CHの切り替え機能があり、そこを(なぜか)7.1CHにしていたのをすっかり見落としていた。今のところ7.1CHで出力する機器は持ってないので、2CHに固定することで今度こそ解決したのでした。めでたしめでたし。

Proプランに切り替えて独自ドメインを設定した

突然手が滑ってProプランへの切り替えと独自ドメインを設定した。ドメイン自体は随分前から契約しているが、GitHub Pagesぐらいにしか使ってなかった。

ブログも昔はそれなりに書いていたが、めっきり放置してしまっている。長文を書く機会も減っていざ書こうとしてもなかなか筆が進まないのでリハビリしていきたい。自分の中で謎に記事を書くハードルが上がってしまっているので、もっと毒にも薬にもならないことを書いてハードルを下げるのが良さそうだ。

rails の i18n をフィーチャートグルで制御する

この記事は SmartHR AdventCalendar の7日目です。

最近は機能開発をする際にフィーチャートグルを利用しています。なぜフィーチャートグルを使うのかを書き始めるとそれだけで一記事消費してしまいそうなので多くは語りませんが、今ではなくてはならないものと感じています。

ですが実際にはフィーチャートグルの適用が難しいケースがあります。例えば railsi18n です。YAML で定義している翻訳をフィーチャートグルのON/OFFで差し替えたい、となるとなかなか面倒です。i18n は以下のように YAML で定義されているため、そこに Ruby のコードを差し込むことはできません。

config/locales/en.yml

en:
  hello: "Hello world"

ですが、実は i18nYAML だけでなく Ruby ファイルもサポートしています(参考:Rails 国際化 (i18n) API - Railsガイド)。

そこで、フィーチャートグルで翻訳を切り替えられないか試してみました。環境は Ruby 3.0.3, Rails 6.1.4.1 です。

ちなみに今回はフィーチャートグルっぽく動くものとして以下のようなクラスを準備しました。あくまで「それっぽいもの」です。

app/models/setting.rb

class Setting
  class << self
    def awesome_feature_enabled?
      unless defined?(@awesome_feature_enabled)
        @awesome_feature_enabled = false
      end

      @awesome_feature_enabled
    end

    def awesome_feature_enabled!
      @awesome_feature_enabled = true
    end

    def awesome_feature_disabled!
      @awesome_feature_enabled = false
    end
  end
end

とりあえず翻訳の定義はそのままに .rb に置き換えてみます。

config/locales/en.rb

{
  en: {
    hello: "Hello world"
  }
}

まずはこれで動くか確認します。

$ bin/rails c
irb(main):001:0> I18n.t('hello')
=> "Hello world"

動きますね。ですが、これだけだと記述量が増えただけで特に旨味はありません。そこで、フィーチャートグルの返り値で翻訳を切り替えてみます。

config/locales/en.rb

{
  en: {
    hello: -> { Setting.awesome_feature_enabled? ? "Hello feature toggle" : "Hello world" }
  }
}

動かしてみます。

$ bin/rails c
irb(main):001:0> I18n.t('hello')
/Users/yono/sample/config/locales/en.rb:3:in `block in load_rb': wrong number of arguments (given 1, expected 0) (ArgumentError)

引数が足りないというエラーですね。適当に足してみましょう。

config/locales/en.rb

{
  en: {
    hello: -> (x) { Setting.awesome_feature_enabled? ? "Hello feature toggle" : "Hello world" }
  }
}

これでどうでしょうか。

$ bin/rails c
irb(main):001:0> I18n.t('hello')
=> "Hello world"
irb(main):002:0> Setting.awesome_feature_enabled!
=> true
irb(main):003:0> I18n.t('hello')
=> "Hello feature toggle"
irb(main):004:0> Setting.awesome_feature_disabled!
=> false
irb(main):005:0> I18n.t('hello')
=> "Hello world"

動きました。フィーチャートグルのON/OFFで返り値の切り替えもできてますね。よさそうです。

ただ、引数の中身が何者かわからないのは気になりますね。確認しておきましょう。

config/locales/en.rb

{
  en: {
    hello: -> (x) { x }
  }
}

これで実行してみます。

$ bin/rails c
irb(main):001:0> I18n.t('hello')
=> "hello"

引数にはi18nのキーが含まれているようですね。変数名を直しておきます。

config/locales/en.rb

{
  en: {
    hello: -> (key) { Setting.awesome_feature_enabled? ? "Hello Feature toggle" : "Hello world" }
  }
}

というわけで、i18nもフィーチャートグルで切り替えられるようになりました。こちらからは以上です。

builderscon tokyo 2018 に参加してきた

2018/09/06 〜 2018/09/08 に開催された builderscon tokyo 2018 に参加してきました。

builderscon.io

6日が前夜祭で、7日と8日が本編ですね。懇親会 + After party 含めて全参加できました。

印象に残った発表

しんぺいさんの「開発現場で役立たせるための設計原則とパターン」がめちゃくちゃ良かったですね。

業務でコードを書いていく中でいい感じのコードはこういうやつ、という輪郭は見えてきて(現場のコードから学ぶことが多い)、ただそれらが具体的にどう良いのか、体系的に学ぶ必要があるなと思って最近改めてオブジェクト指向設計の本をいくつか読んでるわけですが、しんぺいさんの発表を聴いてそれら(設計における原則とデザインパターン)が具体的につながり、どういったプロセスを踏むことで設計が進められるのかというのがはっきり見えてきました。最高。

発表資料はこれから公開されるとのことなので、私は気長に待とうと思います。

追記: 2018/09/10

当日の発表の様子を再現した記事が公開されていました。

nekogata.hatenablog.com

追記終わり

builderscon.io

Jackさんの「「Web とは何か?」 - あるいは「Web を Web たらしめるものは何か?」」も良かったです。

最近ちょうど WebUSB の存在を知り、「え、そこまで Web でやる必要ある?」と感じていたので、それに対するアンサーというか、Web がどういう流れで進化してきてどのような経緯で今現在そういった API が生まれてきているのかというような話が非常にわかりやすく解説されていました。「Webを支える技術」読まなきゃ……。

builderscon.io

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

あとはぷりんたいさんの「つらくないマルチテナンシーを求めて: 全て見せます! SmartHR データベース移行プロジェクトの裏側」も良かったですね。

デプロイがいつまで経っても終わらない、最長で100時間かかったという聞いただけでなぜか胃が痛くなるような状況があり、蓋を開けてみると migration が異常に時間がかかるという状況があり(migration が長時間かかるとだんだん不安になってきませんか。私はなります)、そういった状況を脱して最終的に migration を秒で終わるようにしたという感動巨編でした。やばい。

builderscon.io

speakerdeck.com

懇親会とかアフターパーティーとか

そんなに知り合いもいない状況なので大量に酒を入れつつなんとなく目があった方に声をかけるなどしていました。結果いろんな方とお話できてよかったです。ありがとうございました。

その他感想

  • ノベルティがあらかじめひとまとめになっているの良いですね
  • 投票システムであわせてフィードバックを送れたので最高と思ったセッションに最高でしたと伝えやすかったです
  • 朝一で採れたうまい棒は旨い

来年も参加したいしその際はぜひしゃもじ3.0(a.k.a 謎ガジェット)を手に入れたいですね。運営の皆様、スピーカーの皆様最高の時間をありがとうございました。

TokyuRuby会議12でLT発表してきた

2018/07/29 に開催されたTokyuRuby会議12に参加してきました。

TokyuRuby会議12 - Regional RubyKaigi

TokyuRuby会議には初参加だったのですが、いろいろあってLT発表もしてきました。 RubyKaigi 2018 の After Party で万葉に入社した経緯を @yancya さんと@publichtml さんに話してたら「それ TokyuRuby会議で話したらよくない!?」と煽られたのでじゃあ出すか〜と気軽に応募したのがきっかけでした。結果的にめちゃくちゃ楽しかったのでお二人には本当に感謝です。

speakerdeck.com

時期的には去年のうちに発表できてたら良かったかな〜と思わなくもないのですが、発表モチベーションが高まったのがここ最近なのでそのへんは仕方ないですね。モチベーションマネジメント大事。

終わった後にTLを眺めてたらいい話だったと言っていただけていて、発表してよかったです。感想をくださった皆様ありがとうございました。

美味しいビールと美味しいご飯と楽しいLTと、本当に最高の一日でした。また来年も何かしら発表できたら嬉しいですね。運営スタッフの皆様、スポンサーのサントリーさん、本当にありがとうございました。

Rails Developers Meetup 2018 Day 3 Extreme で進行のお手伝い&発表してきた

2018/07/14 に開催された Rails Developers Meetup Day 3 Extreme に参加してきました。

techplay.jp

今回 株式会社万葉 が進行協力スポンサーとしてお手伝いさせていただきました。 具体的には @tatsuosakurai が司会、私が Google Hangout 配信役ということでお手伝いさせていただきました。

勉強会のお手伝いはほとんど初で、若干不安もありましたが無事終わってほっとしています。

スポンサーは10分の発表時間がいただけるということで、私が万葉入社時に受けた研修についてお話させていただきました。

speakerdeck.com

言いたいことを詰め込んだ結果早口で話して10分ギリギリになってしまい、もう少し削ってもよかったなーと反省しています orz これでもかなり削っていて、最初は15分くらいの内容でした。詰め込みすぎでは……。

パブリックな場での発表も7年ぶりくらいで緊張しきりだったので、リハビリせねばなーという感じでした。

印象に残った発表

エンジニアのためのスライドデザイン実践講座

speakerdeck.com

esa の赤塚さんの発表。自分のスライドを作る前にこの発表を聴きたかったですね…… orz

どう変えたか、なぜこう変えたかというのがわかりやすく解説されていて非常に参考になりました。

悪魔の城のヒアドキュメント

speakerdeck.com

ヒアドキュメントのカオスっぷりがやばかったですね。それでも発表を聞いてるとなんとなくわかったつもりになりました。

まとめ

懇親会も含めてすごく楽しかったです。オーガナイザー&発表者の皆様本当にありがとうございました!

MVP Community Camp 2014 に参加してきた

参加してから時間経ってしまいましたが。

MVP Community Camp 2014

私が参加したのは沖縄会場です。

MVP Community Camp 2014 沖縄会場

そもそも MVP とはなんぞや?ってことで、引用します

マイクロソフト MVP アワード プログラムとは

マイクロソフトが個人の活動を評価する、特別な賞。

MVP (Most Valuable Professional) アワード プログラムは、マイクロソフトの製品やテクノロジーに関する豊富な知識と経験を持ち、オンラインまたはオフラインのコミュニティや、メディアなどを通して、その優れた能力を幅広いユーザーと共有している個人を表彰するものです。MVP アワードの表彰は全世界で行われており、現在は、世界 90 か国以上、4,000 名を超える方々が MVP として精力的な活動を続けています。

そんなわけで、普段から MS 製品には馴染みが深いけど MS 製品のコミュニティってあまり見ない(少なくとも沖縄では聞かない)のでどんな情報が得られるのか、どんな人と会えるのか楽しみで行ってきました(とかいいつつ去年も参加してますが)。

非常に印象に残っているのが田中亨さんのExcelについてのセッションでした。

うろ覚えなので若干間違ってるかもしれませんがこんな感じ。

  • Excel は「機能」「関数」「VBA」から成り立っている。全てを知らなければ Excel を知ったとは言えない(それぞれに上下関係はない、と)
  • シートは「入力」「計算」「出力」に分ける。(MVCっぽいと感じました)
  • 学ぶことに「初級編」や「上級編」といった区別は意味が無い。必要な知識を覚える。
  • 「習うより慣れろ」ではなく「習ってから慣れろ」。基礎を学んだ上で実際にやってみなければ意味が無い。

内容もそうなんですが語り口がとにかく「聞かせる」発表で、聞き入ってしまいました。とにかく良かった。

schoo にも講義があったので気になる方はどうぞ。

田中亨(Office TANAKA)先生のプロフィール 教員名簿 - schoo(スクー) WEB-campus

以前開催されたITごった煮勉強会もまた開催されるかも、とのことなので、こちらも非常に楽しみです。