scroll-behavior: smoothだとChromeで要素スクロールが動かない

技術系のTIPSをGistに書き溜めてるんだけど、ググラビリティが低すぎる気がするのでこっちにも貼る。

これはoverflowを指定した要素をrequestAnimationFrame経由でスクロールしようとした際、Chromeでは動かなかった時のメモ。

scroll-behavior が smooth だとだめで auto なら動作するので、Chromeのスムーズスクロールと干渉するのかもしれない。FirefoxはどちらでもOKだった。

動作確認用のCodePenはこちら。 https://codepen.io/superdoghuman/pen/ExgzjXP

<div id="parent">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
  <div class="child">5</div>
</div>
  
<button id="scrollButton">
  start scrolling
</button>
#parent {
  scroll-behavior: smooth; /* ここをautoにするとChromeでも動く*/
  overflow-x: scroll;
  display: flex;
  flex-direction: row;
  align-items: center;
  background-color: gray;
  width: 800px;
  height: 200px;
}

.child {
  background-color: darkgray;
  margin: 20px;
  text-align: center;
  min-width: 300px;
  min-height: 150px;
}

#scrollButton {
  margin-top: 50px;
  width: 150px;
  height:100px;
  font-size: 1rem;
}
const parentElement = document.getElementById("parent");
const scrollFunc = document.getElementById("scrollButton");
scrollFunc.onclick = () => {
  animate();
}

function animate() {
  parentElement.scrollLeft += 10;
  requestAnimationFrame(animate);
}

Next.jsでthree.jsのexamplesを利用する

three.jsのリポジトリにはsrcディレクトリと同階層にexamplesディレクトリがあり、有用なツールが多数用意されている。Next.jsからこれらを利用するには、next.config.jsにちょっとした設定が必要。

resolve.modulesでも同じことができるが、aliasの方が意味的によさそう。

// next.config.js
const path = require('path')

module.exports = {
  webpack: (config) => {
    config.resolve.alias['ThreejsExample'] = path.resolve(__dirname, 'node_modules/three/examples')
    return config
  },
}
// FooComponent.js
import { GLTFLoader } from 'ThreejsExample/jsm/loaders/GLTFLoader'

最初ローカルに全然examplesが落ちてこなくて困ったんだけど、yarnのautocleanが有効になってたせいだった。

lamejsでAudioWorkletを使用する

lamejsは定評のあるmp3エンコーダのJS実装なのだが、サンプルコードが少し古めでAudioWorkletが使われていない。

以下のファイルを少し変更するだけで動きそう。 github.com

// mic.js
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
const context = new AudioContext();
const microphone = context.createMediaStreamSource(stream);
await context.audioWorklet.addModule('/voiceRecorderProcessor.js')
const recorder = new AudioWorkletNode(context, 'recorder');
recorder.port.onmessage = e => {
  realTimeWorker.postMessage({cmd: 'encode', buf: e.data});
}
microphone.connect(recorder);
recorder.connect(context.destination);
// voiceRecorderProcessor.js
class Recorder extends AudioWorkletProcessor {
  constructor() {
    super();
  }

  process(allInputs) {
    const inputs = allInputs[0][0];
    this.port.postMessage(inputs);
    return true;
  }
}

registerProcessor('recorder', Recorder);

SwitchでXboxワイヤレスコントローラーが使えるアダプタを買った。

Xbox ワイヤレスコントローラー ファントムホワイト

Xboxワイヤレスコントローラーファントムホワイトを限りなく愛しているのだが、Switchでイカやろうと思ったらなんかProコンがお勧めらしく、でもこれ以上コントローラーが増えるの嫌だし、Proコンって結構お高いしで、なんとかしてこれをSwitchでも使えるようにしたかったのだが、そんな都合のいいガジェットがあるわけあったわスゲー!!!

 

秒で買った。 

f:id:grrr_inu:20200905234643j:plain

Brook X One Adapter

 

パッケージが結構しっかりしててマニュアルも日本語。

f:id:grrr_inu:20200905234855j:plain
 

 

充電中はこんな感じ。一見してわかるバッテリーの小ささ。

f:id:grrr_inu:20200905235053j:plain
 

 

微妙にホワイトの色合いが違うがそんなに気にはならない。

f:id:grrr_inu:20200808233515j:plain

 

とりあえずイカは普通にSまでいけた。特に遅延が起きたり精度が悪い感じもしない。

 

ただバッテリーの少なさはクソ、マジクソ、ぼんやりあつ森してたらすぐ電池切れなので、どうにかして単三電池に対応して欲しかったところはある。 

FILCO MINILA Airの静音赤軸(ピンク軸)がないので作った

FILCO の MINILA Air が好きで何枚も持ってるのだが、静音赤軸モデルがいくら待っても出てこないので自分で作った。

 

f:id:grrr_inu:20200620010323j:plain

 

 

静音赤軸は公式ショップとか個人輸入とかで買える。

www.diatec.co.jp

 

 

左は使い古しの赤軸。並べると色が薄いのが分かる。

f:id:grrr_inu:20200620010318j:plain

 

 

元のスイッチは足がクワッとなっており物凄く外しにくく、はんだシュッ太郎程度では太刀打ちできなかったのでここは金の力だ!となり下記に依頼した。

 ゴッドはんだ株式会社 法人個人はんだ付けサービス はんだ付け教材販売 はんだ付け講座

 

 

返ってきた基板。普通に新品のMINILA Airが三、四枚買える金額がかかるので、同じことがやりたい人は自分で地道に外すのがいいと思う。 

f:id:grrr_inu:20200620010327j:plain

 

 

スイッチの半田付けはとても簡単で、心を無にして手を動かすだけで素人でも完成できた。

f:id:grrr_inu:20200727201903j:plain

 

 

特に動作不良もなく快調だが、完成したらなんか満足してしまい、結局MBPのキーボードに回帰してしまったのでメルカリで売ってる。なんだそれ。

https://www.mercari.com/jp/items/m11350457445/

MacBookPro16インチ(2019)、特定の条件下で最低のマシンになる件

まだキャッキャうふふしてる頃のファーストインプレッションはこれ。
この頃は楽しかったよね…。

zygoptera.hatenablog.jp 

 

自分のMBP 16の場合、問題は二つある。

 

外部ディスプレイを繋ぐと温度が上がってファンが爆回り問題

単にファンが回るだけなら制御アプリ入れればいいんだけど、原因は温度上昇なのでどうしようもない。何ひとつ作業をしなくても、ミラーリングでも、解像度を限界まで下げてもディスプレイが繋がってるだけで温度が10〜15度上昇する。

公式コミュニティでも仕様だよ、嫌なら返品しなよっていう全レスおじさんが出現してたいへん盛り上がってる模様。

https://discussions.apple.com/thread/250878229

温度のせいかバッテリーもみるみる劣化していって、一ヶ月で10%以上容量が減ってしまった。さすがにヤベエとなって修理に出したら一回目はロジックボード交換で返ってきたが全く直っておらず、二回目の修理は症状再現せずで突っ返されてしまった。45万突っ込んだマシンでこれ。最悪。

ディスプレイとの接続ケーブルを抜くとたちまち温度が下がるので、単体で使う人には問題ないはず。ていうか単体だとものすごく快適。

 

 

ブラウザで青いノイズが入る問題

UPDATED: Big Sur 11.4でようやく直った模様。

 

これも外部ディスプレイを繋いでる間にしかならないっぽいのだが、WebGLを使ってるページ(たぶん)を開くと、青い線状のノイズが画面いっぱいに表示される。顕著に現象が出るのはChromeで、例えば症状発生中にYahoo! JAPANのトップを開くと100%こうなる。

f:id:grrr_inu:20200715205918j:plain

こういうゲームあるよね

 

当初Chromeのバグとして報告されたが、Safariでも起きることがわかり、どうやらmacOSGPU周りがなんかおかしいんじゃね、という雰囲気になってる。

https://bugs.chromium.org/p/chromium/issues/detail?id=1068170

今作ってるサービスではThree.jsを使うのでめちゃくちゃつらい。

 

まとめ

現状いいところは64GBメモリ積めてスピーカーが良い音なとこぐらい。

この間出た5600Mだとグラフィックスメモリの種類が変わって症状出なくなったとかいう話もある。つっっっっっっっっら