なんでもノート

なんでも書くノートみたいなブログ

iOS Safariでvideo要素に設定した動画が表示されない

<input type="file”>で同じファイルを選択できるようにする - なんでもノート に続きtipsの4個目。video要素のsrc属性を動的に変更したとき、iOS Safariで動画が表示されない事象に遭遇した。結論としてはvideo要素のsrc属性を動的に変更した場合は、load()メソッドを呼ぶ必要があった。以下、React + TypeScriptのサンプルコード。CodeSandboxを使ってみた(初めて使った)。12行目をコメントアウトすると選択した動画が表示されなくなる(はず)。

codesandbox.io

<input type="file”>で同じファイルを選択できるようにする

<video>に読み込んだ動画の秒数を取得する - なんでもノート に続きtipsの3個目。でファイルを選択し、再度同じファイルを選択しても1度目のvalueが残ってしまっているため、changeイベントが発火しない。対応方法は2つある。1つ目は1度目のchangeイベントの処理の最後にvalueに空文字列を設定する方法。以下、React + TypeScriptのサンプルコード。

const ref = React.useRef<HTMLInputElement>(null);

const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  // ここに処理を書く

  if (ref.current) {
    ref.current.value ="";
  }
}

// …(略)…

<input ref={ref} type="file" onChange={onChange} />

2つ目はclickイベントでvalueに空文字列を設定する方法。以下、React + TypeScriptのサンプルコード。

const ref = React.useRef<HTMLInputElement>(null);

const onClick = () => {
  if (ref.current) {
    ref.current.value ="";
  }
}

const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  // ここに処理を書く
}

// …(略)…

<input ref={ref} type="file" onClick={onClick} onChange={onChange} />

<video>に読み込んだ動画の秒数を取得する

<input type="file">で選択したファイルのサイズを取得する - なんでもノート に続きtips2個目。video要素に読み込んだ動画の秒数を取得する方法。durationchangeイベント発生時にdurationから読み取れる。以下、React + TypeScriptのサンプルコード。

import React, { useRef } from "react";

// …(略)… 

const ref = useRef<HTMLVideoElement>(null);

const onChangeVideoDuration = () => {
  if (ref.current) {
    const videoDuration = ref.current.duration;
    console.log(videoDuration);
  }
}

// 任意のタイミングでsrcを変更する
const onXXX = () => {
  if (ref.current) {
    ref.current.src = "sample.mp4";
    ref.current.addEventListener("durationchange", onChangeVideoDuration, { once: true });
  }
}

// …(略)…

<video ref={ref} />

<input type="file">で選択したファイルのサイズを取得する

最近使ったtipsを1つずつブログにまとめておこうと思う。1つ目はで選択したファイルのサイズを取得する方法。以下、React + TypeScriptでのサンプルコード。

const onChangeFile = (e: React.ChangeEvent<HTMLInputElement>) => {
  const fileSize = e.target?.files?.[0]?.size;
  console.log(fileSize + " Bytes");
}

// …(中略)…

<input type="file" onChange={onChangeFile} />

2022年7月末までのトピック

2022年になってからブログを全然書いていなかった。仕事が忙しかったと言い訳してしまう。以下、7月末までのトピック。

  • ベッドを買った
  • エルゴヒューマンを買った
  • 仕事でリーダーになった
  • 山梨に行った
  • ソファを買った

その他、友達と遊んだり、会社の人と飲みに行ったりもした。

ベッド、ワーキングチェア、ソファと物理的に大きい買い物をした。ミニマリストからは大きく遠ざかった。

仕事ではリーダーになった。名前から伝わりにくいが、最初の管理職だ。整理してブログに書きたい内容が多い。

山梨に行った。旅行ブログを書くかもしれないし、書かないかもしれない。

またぼちぼち書いていく。

技術書を電子書籍から紙書籍に戻した

最後にブログを書いてから3ヶ月も経ってしまった。3ヶ月の間に色々あったがおいおい書いていきたい。

タイトル通り、電子書籍で買っていた技術書を紙書籍で買うようにした。6月から紙書籍を買っている。

電子書籍を買い始めたのは2018年の8月ごろなので、かれこれ4年近くなる。電子書籍を買い始めた理由は2つだったと思う。1つ目は紙の本を外に持ち歩くのは重かったから、2つ目は当時ミニマリストに憧れていたからだったとと思う。

そして最近、電子書籍が売ってない紙の本を読む機会があった。久しぶりの紙の本はとても読みやすく、すぐに読み終えてしまった。技術書も紙にすればもっと読めるんじゃないかと思い、紙で買うことにした。

結果、10日間くらいで2冊も読みきれてしまった。ちなみに呼んだのは以下の2冊。

なぜかは言語化できないのだが、紙の書籍の方が電子書籍より読みやすいと感じた。また、物理的に存在することによる読まなくてはというプレッシャーを感じるので自然と手が伸びた。

一方で場所を取る、どこでも読めるわけではないというデメリットがあり、それらの点については電子書籍の方が優っている。

しかし、総合的に見てインプットの質が上がり、量も増えそうなので技術書は紙で買おうと思う。

Docker ComposeでMySQLを動かしてみた

Docker ComposeでMySQLを動かしてみたのでメモ。