無職です。はたらいてます。 旧ブログ: 1 Entry per Day

Logicool M750を買ったけど、すぐM590に出戻りした

タイムライン

  • 愛用のLogicoolのマウスM590が2年以上使い倒し表面が摩耗したりしてきたので、買い替えを検討。
  • M590は生産終了しておりLogicoolのラインナップから消えている。
  • 性能的にほぼ上位互換のM750のS/Mサイズを購入。
  • 一日使ってみた所、大きさなどが絶妙に手に合わず、変に疲れたりしてしまい、ストレスの方が大きかった。
  • Lサイズを求めて電気屋に行ったところ、M590の在庫があったので結局またM590を買った。

サイズ感について

側面の滑り止め加工が触り心地が悪くて使っていてストレスがあったというのもあるんですが、合わなかった最たる原因はサイズかなと思っています。 ※数値は後述の参考記事より。

M750 S/M M590 M750 L
横幅 108mm 103mm 118mm
奥行 61mm 64mm 66mm
高さ 38mm 40mm 42mm

実際使ってみた所、使いづらいというか、使っていて腕がどんどん疲れてくるという現象に悩まされました。 どうやらマウスに手を乗せて預けるような持ち方をしているため、より小さいM750 S/Mだと手の重さを預けきれずに意図せず腕の力で支えるような持ち方になっていたようです。 そのため、ずっと腕が緊張した状態になり、異常に疲れたのだと思います。

本体の形状も見比べてみた所、M590だと全体が卵形で後ろ側が大きめだったのですが、全体的にコンパクトになったM750だと後ろ側が膨らんでいない形でした。 そのため、M590で同じ感覚で手を乗せられなかったようです。

大きさの問題だと気付いたので、Lサイズはどうなんだろうと思い、サンプルを触って確認できたらなと思いながら電気屋に行った所、M590の在庫があったので結局この原稿もM590を使いながら書いています。

ちなみに、遂にこのM590でおそらく3台目で、前身となった機種を使っていたころから数えて6年以上このモデルをつかっています。

ですが、次に買い換える頃にはM590を手にいれることはできないだろうと思い、その時にまたサイズ感で購入ミスをしないように自戒のためこの記事を書きました。

参考記事

サイズ情報を引用させていただいた記事

  • ロジクール M590 レビュー/クリック音が小さい静音マウス。オフィスや寝室でも気にせず作業が出来る | モノペディア https://mono-pedia.jp/logicool-m590/
  • Logicool M750 Signatureレビュー!4,500円でMX Master3Sと機能性は同じです。 | TECHYOU(テックユー) https://tech-you.jp/logicool-m750signature-review/
    • この記事の著者の方はLogicoolのサイト上のガイドではMサイズ相当の手の大きさなのですが、Lサイズの方が持ちやすいと書かれています。🍏の手の大きさも同じくらいなので、やっぱりLサイズがよかった感。

PUBG: NEW STATE でちょくちょく勝てるようになってきたのでプレイングのメモを残す

2021年末に最近見てるYouTuberさんたちがPUBGをやってたので、影響されて2022年の年明けからPUBG: NEW STATEをプレイしてました。

newstate.pubg.com

一月半くらいやってきて時たまドン勝もできるようになってきたので、今までプレイしてきた中でメモを公開します。

ただし、勝利のコツというよりは、FPS/TPSの初心者がまず生き残ってチャンスを掴むためにこういう状況には気をつけろ、というのが殆どです。

以下、プレイし始めてから今までその時々で気付いたことのメモ:

  • 車とかで走っていて撃たれたら逃げ切る。相手の場所がわからない状態で車を降りない。
  • 無防備な状態で車の音や射撃音が聞こえたら、すぐ逃げる。
  • 近くに敵がいるとわかっている状態で外に出るな。
  • 建物の側にいる敵を轢こうとしても建物に逃げられて撃たれるだけなのでさっさと離脱する。
  • 終盤で車での立ち回りできないと倒されるかプレイゾーンで死ぬので、ガソリンorバッテリーは必ず確保。
  • 銃声フェイク https://www.youtube.com/watch?v=qjYfk8Dx8ME
  • どんな時でもできるだけ射線を切った位置から狙撃する。
  • (特にエリアが狭い状態で)小屋に立て籠ると突っ込んできた敵に対処しずらいので岩陰とかの方がマシかも。
  • 撃ち合いの時、頭の高さを狙う。そうしないと相手のヘッドショットが先に当たって結局負ける。
  • 車両を維持できないのなら素直に物陰で乗り捨てて、こそこそ歩いた方が堅実では?
  • 車が来たら撃つ前に逃げろ。
  • 障害物がないところで立ち止まるな。
  • 打ち損じたからといって前に出て自分の優位な位置取りを無くさない。
  • 敵を倒した後、その位置で回復してると銃声を警戒した敵がこっちを見て見つかるので、他の位置を取る。
  • 最終円で敵を探しに行くのは無謀なのて、相手の位置がわからないうちは動かない。粘って粘ってこちらの位置を知らせないようにする。ドローンは必須かも。
  • 最終円あたりではどこから狙われるか判らないので必ずスモークを焚いてから回復する。見つかって撃たれて死ぬよりは生存しそう。
  • 余所に向かってる車両を撃っても有効打にはならないので、見つからないように隠れておくのがよい。
  • より高い位置がある状態で屋根に登ると狙われる。
  • 位置がわからない敵に狙われている時はとにかく身を隠しながら逃げる。
  • 真ん中取りに失敗したら円の縮小と同時に動く方がいい。敵達も動かざるを得ない状況じゃないと一方的に狙われる。
  • 撃ってきている時点でバレてるんだから、確実に身を隠せる場所に移動する。
  • 車に乗っていて撃たれてる時に身を乗り出して撃ち返すとこっちが中りやすくなるだけなのでただ乗ったままのほうが生存率は高そう。
  • 物音などの違和感を大事に。
  • ゆっくり敵を探す暇はないので、常に動いて狙いをつけさせないまま探すか、粘って隠れ続ける。
  • 建物の中でも必ず射線を切った位置で買い物する。
  • 屋上とか射線が通るところで潜んでると違う方向から狙われるので屋内に行こう。
  • ショットガンで置き撃ち中らないのでやめよう。
  • SRのまま車を運転しない。すぐ戦闘できるよう必ずARをすぐ打てる状態で運転する。
  • 人を轢こうとしにいくのはミスして自爆しがちなのでやめよう。木などの障害物がある場合は特に。
  • 補給物資は落ちてしばらくしてから取りに行っても狙われるだけ。
  • 物音が聞こえたら一度すぐ隠れる。それから安全に索敵する。
  • 建物に車で止まる前にぐるっとまわって人がいないか確認する。
  • 敵のだいたいの位置がわかっても詳細な位置がわからなければ、突っ込んでも明後日の場所を探しているうちに撃たれるだけ。
  • クリアリングはちゃんと敵がいそうな隅を見る。
  • 最終円で敵が見当たらない時、常に安全確保を優先して動く。敵に突っ込む必要はない。
  • 補給物資を漁る時は常にスモーク焚こう。どこかしらか狙われやすいので。
  • 車動かしながらドリンク飲むのは手間取って狙われがちなのでやめよう。
  • 平原で岩陰に隠れる時、背後の射線通る所を一度クリアリングする。
  • 車両は敵の死角で降りる。
  • 物陰にいると解ってる敵にはグレネード投げて誘き出して撃とう。
  • 相手が隠れていてもTPP視点でこっちを見ている可能性を考えよう。
  • 車マジ大事。
  • 対面してるときにしゃがむと相手が頭撃ちやすいので、立とう。
  • 平地でSRに抜かれた仲間は助けに行けばこちらもやられる。諦めて、スナイパーの位置を見つけるのを最優先にする。
  • 撃たれたら、すぐ近くの物陰より一つ下がった物陰があればそこに移動して戦域を見渡せる位置を取るのが良さそう。
  • 建物の外壁の角に隠れて止まっていると、突っ込んで来た敵に先に撃たれるので、動き続けて良い位置を取りに行こうと動いてみよう。
  • 角から出て撃つときは前に出ずに、すぐ角に隠れられるようにする。すぐ隠れないと、相手の返り討ちでやられる。
  • 2階に立てこもっている相手と戦う場合は、階段側にグレネード投げて奥に退かせてから階段を登る。
  • 確殺は後回しでいい、ノックダウンしたら周りを警戒する。パルスが近かったら勝手に死ぬので自分が安全地帯に移動を優先。
  • 安全地帯が狭くなってきてる時に移動をギリギリまでしないでいると、先に車両を撃たれるので、ちょっと早いかなくらいのタイミングで移動したほうがよい。まだ移動が必要なタイミングで籠城は弱い。
  • 最終円あたりでは如何に安全な位置を取るかが重要。敵と撃ち合うよりまず自分がより安全な位置を取る事を優先したほうが勝率は高そう。敵の位置を探っている間に敵が移動してしまっていて取り残されたり、一方的に撃たれる位置を取られたりしてしまう。

さて、これで一区切りついたので明日からは禁じられた西部を旅します。

JSConf 2021 資料まとめ

JSConf 2021を完全に見逃したので、後で見返すための資料まとめ。

Twitterで検索して出てきたものだけ。

https://jsconf.jp/2021/

録画アーカイブ

時間帯別資料

12:10 - 12:40 基調講演

12:50 - 13:20

13:20 - 13:50

14:00 - 14:30

14:30 - 15:00

15:10 - 15:40

15:40 - 16:10

16:20 - 16:50

17:00 - (トラックAのみの時間帯) - 18:10

18:10-18:40 スポンサーLT

18:50 - 19:20

  • (未発見 トラックA)

日本語の文字単位diffオプションをgit aliasに設定する

まとめ

  • ある正規表現を指定することで、日本語文章のdiffを文字単位で見れるようにできる
  • それをgit aliasに設定したかったけど、正規表現エスケープ周りでうまくいかなかった
  • スクリプトファイル化したものをgit aliasで実行することで解決した

日本語を文字単位でdiffを見るいい感じの方法

gitで日本語の文章を扱っていると、行ではなく文字単位でdiffが見たかったりする。

そういう場合、↓の記事で紹介されているdiffのオプションがとても便利で重宝しています。

skoji.jp

git diff --word-diff=color --word-diff-regex=$'[^\x80-\xbf][\x80-\xbf]*' またはショートハンドで git diff --color-words=$'[^\x80-\xbf][\x80-\xbf]*' と実行すると、空白文字は無視して文字単位での挿入・削除だけが表示できる。

例えば簡単な例で、 id:mstsskJSer.infoさんに出したtypo修正のdiffで試してみると、次のように削除した文字列と追加した文字列だけがインラインで表示できている。

f:id:mstssk:20210819234353p:plain

ただgit aliasに設定するとエラー

これをgit aliasとして .gitconfig に次のように設定し git diffrgit showr <commit> のように簡単に実行したかったが、この書き方では正規表現が問題になるらしく実行時にbad configエラーが発生してしまった。

[alias]
    diffr = diff --color-words=$'[^\x80-\xbf][\x80-\xbf]*'
    showr = show --color-words=$'[^\x80-\xbf][\x80-\xbf]*'

頑張ってエスケープしようとしたが、通るやり方を結局見つけられなかった。 普通のaliasでやる方法もあるが、個人的にはgitのaliasとして設定しておきたい。

同じことで悩んだ方の記事: Git Diff で日本語の文章も綺麗に差分を出す - Neo's World

しばらくは diffr = diff --color-words="[^€-¿][€-¿]*" という正規表現を使わない設定の仕方で回避していたが、これは正規表現から文字の実態に置き換える時に盛大に間違えていて、動作したりしなかったりの駄目な設定だった。

外部のシェルスクリプトとして実行してしまえばいい!

どうにかならんもんかと最近あらためて見直したところ、git aliasなんだから外部化してしまえばええやん、と思い至った。

git aliasは ! を先頭につける書き方をすると任意の外部コマンドやシェルスクリプトを実行できるので、やりたいことをシェルスクリプトにしてそれを呼び出す様にしてしまえばいい。 むかーし自分の過去blogにも書いていたやり方だったのに、すっかり忘れていた。

mstssk.blogspot.com

というわけで、次のような感じに設定してうまくいきました。

~/.gitconfig

[alias]
    diffr = !~/path-to-shell-dir/git-color-words.sh diff
    showr = !~/path-to-shell-dir/git-color-words.sh show

git-color-words.sh

#!/bin/bash

cmd=$1
shift
git $cmd --color-words=$'[^\x80-\xbf][\x80-\xbf]*' $*

前述のファイル内容はサンプルで、実例はdotfilesリポジトリを適当に参照してください。

github.com

天穂のサクナヒメのエンディングがエモすぎて心に空いた穴が塞がらない話

※この記事は天穂のサクナヒメのネタバレを含みます。

www.marv.jp

こちらのnoteを読んで、とても「わかる!わかるぞー!」と思い、俺も書き殴りたくなったので書きました。

note.com


そももそもあんまりゲームは何本も買う方じゃないんですが、Ghost of Tsushimaをトロコンするまでプレイして「今年は良いゲームに巡り会えたな」とか思っていたところに現れた『天穂のサクナヒメ』はとっても良いダークホースでした。

世間で取り沙汰されてるとおり、稲作だとかしっかりとした横スクロールアクションとかももちろん良かったんですが、エンディングがエモすぎて一気に個人的GOTYが塗り替えられてしまいました。

以下、どこが心に刺さったのか簡単に切り分けつつ書き出してみました。

ミルテのかなわない約束

これは🍏の解釈なので実際の設定とは違うかもしれませんが、エンディング近くでミルテと田右衛門が叶わぬ約束をしているシーンがあります。

ヒノエ島で長く過ごすうちにそれが当たり前になってしまい、本来は布教の旅の途中であるはずのミルテが「また来年も…」と言ってしまった自分に驚愕したりの一連の流れです。 そしてある夜、ミルテと田右衛門が二人きりで話すシーン。 「自分は元の世界に戻らなければならない、サクナ達と出会い培ったいろいろなことを故郷に持ち帰り広めなければいけない。いつかそれを終えたら、また…」 といった事をミルテが田右衛門に話しているのをサクナは聞いてしまいます。

でも再会することは多分不可能なんですよね。 食事シーンで語られる、ミルテの国からヤナトにやってくるまでの話を聞くかぎり、とても簡単に往復できる距離ではない。 戦国時代くらいの日本とヨーロッパの距離感です。 そもそも一度麓の世に戻った後に頂の世に戻ってこれる可能性はほとんど無い。 もう田右衛門着いていけよ!とか思っちゃうんですが、そこでしっかり別れを描くというあたりがこの作品の憎いところ。 田右衛門は戦ばかりの麓の世に戻れない一方で、ミルテは宣教師としての役目を果たさなければならない。 この作品はそれぞれの心の傷と決意を蔑ろにして大団円にはしなかった。 しっかり別れを描いた。 それが(いい意味で)しんどい。

しかも、エンディング見た後の喪失感が冷めやらぬまま、ローンチトレーラーを見返してみたらまたヤバい。

冒頭のキャプション:

遥か東方の果て ヤナトの国あり
古来よりこの地では神の世と人の世
すなわち"二つ世"があると信じられてきた
これは我が布教の旅の中 異教の神サクナと出会い 共に暮らした日々の記録である

宣教師ミルテ著 "耶那土見聞記"より

www.youtube.com

トレーラーでもうミルテが帰ってしまうことが思いっきり示唆されてるじゃん!!!!!11

2度も喪失感を味わう羽目になったわけですよ。 ローンチトレーラーで辛い気持ちになるとは思わなかった。

ゲームの当初の設定ではこんなキャラではなかったミルテをここまで心を抉るキャラクターにしたのは凄いと思うわけです。

ゆいのかんざし

エンディングでヒノエ島を去るきんたを見送るゆいの後ろ姿が写ります。 その頭には無骨な風車の形のかんざしが刺さっています。

ゆいがいなくなったイベントできんたが話していた「作ってあげると約束したかんざし」が、エンディングのここぞというタイミングでしれっと映り込んでいるんです。 そしてカメラが切り替わり、笑顔で見送るゆいの姿を写します。 きんたはいつものスンとした顔で振り返っています。 いつもの二人の姿なんですが、その間にも素晴らしい「ヤナト田植唄」と、二人が今生の別れであることを暗示するかのようにその後の二人の行く末を書いたキャプションが表示されています。 こういう演出は他のゲームなんかでもたまに見かけますが、とっても心が抉られて大好きな演出です。

やり込みプレイができない

プレイ後のやりこみがエンディング前の状態のループなのがつらい。

こんなに心を抉るエンディングを見せられた後に、「やり込みプレイはエンディング直前の状態で進行します」とか言われても辛いわけですよ。 あんな別れをした/する仲間たちが、これまでの姿のままいつものように家にいる姿なんか見てられないわけですよ。 どうしてもそれに気が向いてしまって2周目プレイに着手できませんでした。

ボリュームがちょうど良かった

エモい点というわけではないですが、ゲーム全体のボリュームがちょうど良かったと思ってます。 あんまり超大作だとやってる途中でフェードアウトしちゃったりすることもあるんですが、サクナヒメがちょうど物足りないくらいでした。 ストーリー的には伏線回収しきってないけど、クリア後の喪失感がとっても素晴らしかったんですよね。 そして上にあげた諸々の心を抉る点たちの、その衝撃たるや。

ヤナト田植唄の歌詞が良い

仕事中にYouTube Musicのランダム再生をBGMにしているんですが、「〽️植えよ〜 根付けよ〜」と始まる度に手が止まってしまいパフォーマンスが落ちてます。 エピソード記憶としてしっかり残しってしまっているので、歌い出しでもうエンディング直後の感情が思い出されてむしろ辛い。

www.youtube.com

実際の田植え唄を編纂して作ったというのがまた素晴らしくて、作品世界と現実を地続きにしてくれてるような気持ちになります。 エンディングのキャプションでも「作詞:不明」になってるし、YouTube Musicの概要欄の作詞者情報もpublic domainになってます。 歌詞については、冒頭に書いたnoteの記事も必見です: https://note.com/tekken8810/n/n39f146378c70

あとは、前半でしっかり振ったあとにCパートあたりでそれを逆手に取るみたいな歌詞の作りになっているのが単純に好みです。

ちなみに、楽曲や朝倉さやさんについて調べているうちに、朝倉さやさんのプロデューサーががん再発で余命宣告されているという情報を見てしまい余計に心にきたりしました。

感想がしんどいとかつらいとかばっかりだけど、それもまた作品の魅力

大団円ですっきり終わる作品ももちろん良いんですが、すっきりすぎて感情が右から左にスッと抜けてしまったりもするわけです。 良くも悪くも観た人に強い印象を与えて、「ああっ、もうちょっと観たい!」みたいな喪失感を感じさせる作品ってやっぱり凄いと思います。

天穂のサクナヒメの購入した理由自体はゲームさんぽでプロモーションされているのを観て、「稲作なんてニッチなところをゲームに組み込むとか凄いな。こういうゲームを世に出してくれたこと自体が凄いと思うし投げ銭がてら買っておくか」という感じです。

www.youtube.com

正直、厄災の黙示録が発売するまでのつなぎにプレイするかーくらいの気持ちだったんですが、すっかり心にクソデカ感情を刻み込まれてしまい、ぜんぜん厄災の黙示録がプレイできてません。

2020年いろいろありましたが、この作品に出会えたことは素晴らしい出来事だったと思っています。

RICOH GR3をWebカメラ化したメモ

id:mstssk の周囲にも一眼レフ持ちがちょこちょこいて、Webカメラ化をやっているみたいなので羨ましいなーと思っていたら、自分が持っているRICOH GR3でもWebカメラ化ができそうと書いている人を見かけのでやってみたら出来た。という話です。

bbs.kakaku.com

GR3にUSA-PHD01を接続

どうするのか

GRなら無条件で買うので、特にGR3のスペックをそこまで確認していなかったのが悪いんですが、この子はUSB Type-C端子からDisplayport alternate modeで外部映像出力をしてくれます。背面の液晶に表示する内容がそのままDisplayport出力される感じです。

なので、上記の価格.com掲示板にレスを付けている方の言う通り、Displayportの信号をうまい事変換してやればよいわけです。

GR3 → DP-HDMIアダプタ → HDMIキャプチャーボード → MacbookPro

撮影時のインジケータ類の表示も出力されちゃいますが、それはDISPボタン何度か押せばトグルして消せます。

必要なもの

DP-HDMIアダプタ

ミヨシのUSA-PHD01。
USB PDに対応しているのでGR3に給電しながらカメラが使えます。
というか、こいつ自体も給電が無いと動作してくれない様子。 www.mco.co.jp

HDMIキャプチャーボード

HDMIの信号をUVC(USB Video device Class)として扱えるようにしてくれるデバイスが必要です。 PCからは普通のWebカメラのように認識されるようになります。

まともなものを買うと2万円くらいするのですが、とりあえずお試しということでAmazonの2千円台の安いやつを適当に購入。 Amazonの販売者情報ページを見る限り、深センのZasLukeというよくわからんメーカーのです。

注意点として、Macに繋げる場合はちゃんとMac対応を謳っているものを買いましょう。 これを買う前に別の製品を「Winのみサポートって書いてあるけど、Webカメラの規格なんて一緒だし行けるやろ」と思って本当にテキトーに購入したら640x480サイズの映像しか受信できなくてつらい思いをしました。しかも16:9の映像を640x480で入力してくるから完全にアスペクト比おかしいし…

給電

USA-PHD01にUSB PDで給電する必要があります。
もともと持っていたAnker PowerPort Atom PD 2を使いました。 もちろん、USB Type-Cで給電できれば別のものでもよいです。 ただし、給電量には注意(後述)。

www.ankerjapan.com

その他

三脚として卓上に置くので小さめの↓を購入。

しかし、小さすぎて下にマンガを何冊か重ねて高さを稼いだり、ホットシューにアダプタ無理やり付けて伸ばしたりする羽目になりました。 他の人はクリップ型のカメラ雲台で吊り下げるようにしている人が多いみたいですね。

使ってみた結果/使用上の注意

残念なことに、購入から5日でキャプチャーボードが壊れました

ちゃんと使えてはいたので満足はしていたのですが、安物だったのでさもありなんという感じです。
USBに繋いでいる間ずっと妙に発熱していてヤバいなと思い、使っていないときは抜くようにしていたのですが、5日目に忘れて繋ぎっぱなしにしていたときにオシャカになりました。

映像について

カメラの設定次第ではありますが、Webカメラよりやはりかなり画質は良かったです。 使っているところをスクリーンショット撮る前に使えなくなってしまいましたが。

Webカメラは照明の光でどうしても全体が白っぽく写ってしまったりしますが、GR3では当たり前ながらちゃんと露出や絞りを調整して撮影できます。
Webカメラとして使っているときはマニュアルモードにして絞りなどを固定して使うとよかったです。そうしないと写っている自分が多少動いたときにいちいちフォーカスや絞りが変化して大変でした。

給電が足りない

給電には気をつけましょう。

60Wまで出してくれるし大丈夫やろと思ってAnker PowerPortにMacbookPro 13'とUSA-PHD01をそれぞれ繋いで使っていたのですが、これではUSA-PHD01への給電が足りないようで、使っているうちにどんどんGR3の電池がなくなっていくというタイムリミットありのWebカメラになってしまいました。
リモートでミーティングしたり人狼しているときに「電池がなくなりました」というメッセージと共に俺の姿が消えるのを見た人が何人かいます。

アスペクト比はPCのソフトウェア側でなんとかする

安いキャプチャーボード使っていたせいかもしれませんが、受贈する側のソフトウェアが映像のサイズまたはアスペクト比を指定していないと16:9が4:3になってしまって細長い映像になってしまいました。自分でMediaDevices.getUserMediaでやってみたら、サイズのパラメータなしだと4:3にされて細長になり、16:9のサイズを指定すると整った絵になりました。 また、getUserMediaで1280x720より小さいサイズを指定して映像を取得しようとすると、縮小するのではなく真ん中あたりを勝手にクロップした映像になるという罠も(どこまでがデバイスのせいで、どこからがブラウザやOS・ドライバーのせいか切り分けできていない)。

例えば、Zoomは16:9がデフォルト設定なので問題なく使えましたが、Google Meetはデフォルトでは縦長になっちゃってました。 Google Meetも設定をいじればよかったのかもしれませんが、試していません。

Google Meetで縦長になってしまった問題は、Snap Cameraを間に挟むことで解消しました。

snapcamera.snapchat.com

Snap CameraはWebカメラの映像にフィルタをかけた映像を別のWebカメラのデバイスとして扱えるようにするツールです。 Snap Cameraを通して出力する映像はデフォルトでは1280x720(16:9)になっているので、フィルタ無しでSnap Cameraを通すことでアスペクト比がおかしい問題を回避しました。

もっと動画配信やカメラに詳しい人はSnap Camera以外の回避方法を知ってそう。

ちゃんとしたキャプチャーボードを買おうか迷っている

とりあえずで買ったキャプチャーボードが壊れたので今GRはただのカメラに戻っています。

以下は、今度はちゃんとしたキャプチャーボードを買おうかなー、どうしようかなーというメモ。

動画配信やっている人たちのなかでは、キャプチャーボードといったらAVerMediaElgatoらしいので、その2社から自分のニーズに合っているものをピックアップした。

条件は、Mac対応・UVC・比較的最近のモデルであること。

UVC非サポートでもWebカメラとして使えたりするデバイスはあるそうだが、WindowsなのかMacなのかでまた変わってきそうなので、安全側に倒してUVC前提で探してます。 汎用的な規格に沿ってた方がいいでしょ、たぶん。

Elgato Cam Link 4K

名前の通り、カメラの映像を変換してつなげるためのデバイス。 使いたい用途にドンピシャの製品。だいたい2万円。

www.elgato.com

似た製品でもっと安いものはあるけど、安いものを買った結果5日で壊れたから、まともに使えるものを買うにはこのあたりが最低ラインなんだろう。

非4K対応版の旧Cam Linkはもう販売していないみたい。

ちなみに製品ページにはUVC対応かどうか書かれていないが、サポートページの方に書いてある。 help.elgato.com

Elgato Game Capture HD60 S+

同じくElgatoのデバイス。こちらはゲームキャプチャー用で、HDMIパススルーに対応している。

せっかくキャプチャーボード買うならゲームキャプチャーもできるやつにしようかなーと迷ってこちらもピックアップ。

www.elgato.com

UVC対応についてはサポートページ参照。 旧モデルのHD60 SはUVC非サポートという罠。

help.elgato.com

HD60 SとWindows環境でそのままWebカメラとして使えたという方はいる様子。

AVerMedia Live Gamer Ultra GC553

HD60 S+と同じようなスペックのAVerMediaの製品。 価格はAmazonではこちらのほうが1000円くらい安い。

https://www.avermedia.co.jp/jp/product-detail/GC553

HD60 S+に比べるとこちらのほうがパススルーできる最大解像度が高い。

ちょうどHD60 S+とGC553の比較について説明している動画を見かけたのでURLを貼っておく。
https://www.youtube.com/watch?v=OLLYkcgW9Ic

AVerMedia Live Gamer Portable 2 PLUS - AVT-C878 PLUS

あっ、これ見たことある!と思ったけど、見たことあったのは旧モデルの「Live Gamer Portable 2」の方だった。 この旧モデルが2016年発売で、以前からこれを使って https://stat.ink/ を使っている人を見かけていた。

https://www.avermedia.co.jp/jp/product-detail/GC513

AVerMedia ライブゲーマーエクストリーム GC513

AVerMedia ライブゲーマーエクストリーム GC513

  • 発売日: 2019/09/06
  • メディア: Personal Computers

これは2018年発売のマイナーバージョンアップモデル。名前にPLUSと付いている。

UVCサポートはもちろん、ハードウェアエンコードもサポートしていて、こいつ単体で動画キャプチャできるすごいやつ。

 

他にもたくさんあるけど、UVC対応を確認できなかったりしたものは省いているのでこんだけ。

用語メモ

  • ハードウェアエンコード
    • キャプチャデバイス自体に録画機能がついているもの。SDカードにMOVファイルとして保存したりする。
  • ソフトウェアエンコード
    • キャプチャデバイスHDMI信号をPCへの入力に変換するだけで、録画はPC側で何かしらのソフトウェアを使って録画する必要があるもの。
  • パススルー
    • HDMIの入力を出力から(ほぼ)ラグなしで出せること。あくまでHDMI信号の話で、PCへの入力は遅延する。PC側の性能にも寄ったりするらしい。
  • UVC: USB video device class

input[type=range]で範囲指定っぽいUI

f:id:mstssk:20200518231950p:plain

input[type=range]要素を組み合わせると、なんちゃって範囲指定のUIが構築できそうなのでやってみた。

始値を指定するスライダーと、終了値を指定するスライダーが連動して、開始値が終了値より先にいったりしないよう制限もかけている。

developer.mozilla.org

実際に動作するサンプルはStackblitzで作ったページを参照: https://react-ts-keurq5.stackblitz.io

stackblitz.com

大事なのはdatalist要素で範囲を定義しておくこと。 単純にinput[type=range]要素でmax属性とmin属性で最大値・最小値または連動するように互いのvalueを参照し合うよう指定しても、想像した任意の値の範囲を指定するようなUIにはならない。 正確に言えば、開始値が終了値を追い越さないようになっているし開始値と終了値を指定する機能自体は満たしているけど、スライダーの値の範囲がぐちゃぐちゃ可変してしまって使いづらい。

そこで、datalistで値の範囲を定義して、2つのinput[type=range]要素がどちらも同じ値の範囲を持つスライダーになるようにした。 開始値のスライダーが終了値のスライダーより大きい値にならないように仕込むには、max,min属性を使っていけなくて、onChangeイベントで引っ掛ける必要があった。

以下にコードを貼り付けておく。 今回はReactで作ったが、やっていることは単純なので、他のフレームワークや素のJavaScriptでもすぐ書ける。

import React, { Component } from "react";
import { render } from "react-dom";
import "./style.css";

interface AppProps {
  startAt: number;
  endAt: number;
  callback?: (range: AppState) => any;
}
interface AppState {
  startAt: number;
  endAt: number;
}

class App extends Component<AppProps, AppState> {
  constructor(props) {
    super(props);
    this.state = {
      startAt: this.props.startAt,
      endAt: this.props.endAt
    };
  }

  render() {
    const onChangeStart = (event: React.ChangeEvent<HTMLInputElement>) => {
      const startAt = parseInt(event.target.value);
      // 終了値を超えないように
      if (startAt < this.state.endAt) {
        this.setState({ startAt }, () => {
          this.props.callback(this.state);
        });
      }
    };

    const onChangeEnd = (event: React.ChangeEvent<HTMLInputElement>) => {
      const endAt = parseInt(event.target.value);
      // 開始値を下回らないように
      if (endAt > this.state.startAt) {
        this.setState({ endAt }, () => {
          this.props.callback(this.state);
        });
      }
    };

    // option要素で値の範囲を定義しないと、範囲が固定にならない。
    const options = [];
    for (let i = this.props.startAt; i <= this.props.endAt; i++) {
      options.push(<option key={i} value={i} />);
    }

    return (
      <div>
        <h1>input[type=range]で範囲指定っぽいUI</h1>
        <p>スライダーをドラッグして開始と終了をそれぞれ指定する</p>
        <datalist id="datalist">{options}</datalist>
        <p>
          値の範囲: {this.state.startAt}{this.state.endAt}
        </p>
        <div>
          開始:&nbsp;
          <input
            type="range"
            list="datalist"
            min={this.props.startAt}
            max={this.props.endAt}
            value={this.state.startAt}
            onChange={onChangeStart}
          />
          <br />
          終了:&nbsp;
          <input
            type="range"
            list="datalist"
            min={this.props.startAt}
            max={this.props.endAt}
            value={this.state.endAt}
            onChange={onChangeEnd}
          />
        </div>
      </div>
    );
  }
}

const logging = value => {
  console.log(value);
};

render(
  <App startAt={0} endAt={120} callback={logging} />,
  document.getElementById("root")
);

stackblitz上のソースコードhttps://stackblitz.com/edit/react-ts-keurq5?file=index.tsx