IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

HaskellのshiftLではまった話

数値リテラルで計算すると期待する結果になるけど、なぜかバインドした値を使うと結果が異なり、しばらく悩みました。

 > a
10
 > b
149
 > c
91
 > a `shiftL` 16 .|. b `shiftL` 8 .|. c -- 期待していない結果
91
 > 10 `shiftL` 16 .|. 149 `shiftL` 8 .|. 91 -- これが期待する結果
693595
 >

理由は、型がWord8だからでした。左にシフトしても桁あふれてしまうので、期待した結果になりませんでした。

 > :t a
a :: Word8
 > :t b
b :: Word8
 > :t c
c :: Word8
 >

つまり

c :: Word8
 > (10::Word8) `shiftL` 16
0
 > (149::Word8) `shiftL` 8
0
 >

ということ。

重複したフィールドラベル

今の手元の環境は下記なのですが、

 > :! stack ghc -- --version
The Glorious Glasgow Haskell Compilation System, version 8.2.2

下記のブログ記事をコピペして手元で動作させたらコンパイルエラーになりました。

d.hatena.ne.jp

IsLabelクラスのfromLabel関数に、いつのタイミングなのか明確に調べていませんが、APIの変更があったようです。

base-4.9.1.0

class IsLabel (x :: Symbol) a where
  fromLabel :: Proxy# x -> a

base-4.10.1.0

class IsLabel (x :: Symbol) a where
  fromLabel :: a

Duplicate Record Fields in Haskell

Windowsでcurlとかwgetとか

for($idx=2; $idx -lt 10; $idx++) {
   Invoke-WebRequest -Uri "https://www.foo.bar/${idx}.mp3" -outfile "D:\buzz/${idx}.mp3"
}

Audacityで音声ファイルの連結

いつも忘れるのでメモ

  1. ドラックアンドドロップで音声ファイルを取り込む
  2. 連結したい順番に上から下に並べ替える
  3. 取り込んだトラックを選択する
  4. メニュー->トラック->トラックをそろえる->開始点を別トラックの最終点に合わせる
  5. オーディオの書き出し

FFmpegのパラメータの順番で-toの挙動が変わる

Web検索すると、ffmpegのパラメータの使い方として、ファイルを指定する-iより、シーク場所を指定する-ssを、先に指定したほうがよいとの情報があります。

ffmpeg -i foo.mp3 -ss 00:00:02.540 -t 3 -c copy bar.mp3

よりも

ffmpeg -ss 00:00:02.540 -i foo.mp3 -t 3 -c copy bar.mp3

よいと。この例では、切り出す時間の長さを指定する-tオプションが使われています。

-tではなく、トリムの終点を指定する-toオプションを使った場合、-i-ssの順番の違いで挙動が異なりました。

ffmpeg -i foo.mp3 -ss 00:00:02.540 -to 00:00:06.649 -c copy bar.mp3

とすると、00:00:02.540から00:00:06.649の範囲でトリムができました。しかし、

ffmpeg -ss 00:00:02.540 -i foo.mp3 -to 00:00:06.649 -c copy bar.mp3

とすると、00:00:02.540を起点として00:00:06.649の時間分のトリムをするようです。バグだろうと思ったのですが、この挙動はちゃんとドキュメントに書いてありました。

Seeking – FFmpeg

起点と終点を指定したい場合は、-copytsを加える必要があるとのこと。