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
下記のブログ記事をコピペして手元で動作させたらコンパイルエラーになりました。
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
PowerShellの配列のカンマに嵌る
$ary = @( ('a', '1') , ('b', '2') ) foreach($x in $ary){ Write-Host $x[0] "-" $x[1] }
a - 1 - b - 2
なんと!
$ary = @( ('a', '1'), ('b', '2') ) foreach($x in $ary){ Write-Host $x[0] "-" $x[1] }
a - 1 b - 2
どういう仕様なんでしょうか?
Windowsでcurlとかwgetとか
Audacityで音声ファイルの連結
いつも忘れるのでメモ
- ドラックアンドドロップで音声ファイルを取り込む
- 連結したい順番に上から下に並べ替える
- 取り込んだトラックを選択する
- メニュー->トラック->トラックをそろえる->開始点を別トラックの最終点に合わせる
- オーディオの書き出し
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の時間分のトリムをするようです。バグだろうと思ったのですが、この挙動はちゃんとドキュメントに書いてありました。
起点と終点を指定したい場合は、-copyts
を加える必要があるとのこと。