tech

A collection of 18 posts

tech

破損した動画ファイルを高速に検出する

以前の記事で書いたように、自宅のサーバー上で録画環境を構築している。このサーバーでは、番組の録画が完了すると、録画した TS ファイルを h.264 の MP4 ファイルにエンコードして別のディレクトリに保存するようなスクリプトを動かしている。元の TS ファイルもそのまま保持していたのだが、最近ストレージ容量が厳しくなってきたので、エンコード済みの TS ファイルを削除しようと思い立った。 問題は、エンコードが正しく終了せず破損した MP4 ファイルがいくつか存在することだ。これらのファイルについては元の TS ファイルを残しておきたい。そこで、大量のファイルの中から破損したファイルを高速に検出する方法を調べた。 調べた結果、以下のようにするのが良さそうだ。(ffprobe コマンドは ffmpeg をインストールするとインストールされる) $ ffprobe -v error -f lavfi movie="/path/to/file.

  • mecab
    mecab
tech

ZFS ZVOL の拡張と、その中の ext4 パーティションの拡張

ZFS で作成した ZVOL のサイズが足りなくなり拡張するという作業を数年に一度行っているが、毎回やり方をググっているのでメモを兼ねて書く。ZVOL を拡張しても、内部のパーティション(ext4 を想定)も拡張しないと、実際に使用可能な容量は増えないのでこちらも拡張する。 なお、ここでは内部にパーティションが1つしか無いことを想定している。複数ある場合、末尾のパーティションは簡単に拡張できる (partedで指定するパーティション番号を変更するだけ)が、それ以外は大変なはず.....。 (作業前にスナップショットを取っておくと安心) $ sudo zfs snapshot pool0/vol0@before_expand 作業前にアンマウントすること! $ sudo umount /mnt/path/of/where/volume/is/mounted まず ZVOL を拡張する。 $ sudo zfs set volsize=

  • mecab
    mecab
CS381 を使って MicroATX に 48 TB 分の HDD を詰める
tech

CS381 を使って MicroATX に 48 TB 分の HDD を詰める

SilverStone SST-CS381B という PC ケースを買った。このケースは、MicroATX にもかかわらず、最大で 12 台と大量の HDD/SSD を積むことができる。ユニークなのはホットスワップベイで、8 台が 4 台ずつまとめられて 2 本の SAS (SFF-8643 Mini-SAS)で接続するようになっている。本記事では、このケースについてレビューする。

  • mecab
    mecab
tech

Vetur を複数のルートフォルダを持つワークスペース上で正しく動作させる方法

TL; DR Vetur を動作させたいフォルダをワークスペースの先頭に移動させると良い。 (adsbygoogle = window.adsbygoogle || []).push({}); 本文 Vetur は Visual Studio Code 用の、Vue プロジェクトのための拡張機能だ。これは Vue コンポーネントのためのシンタックスハイライティングやフォーマッティング、Linting などを行ってくれて便利だ。しかし、複数のルートフォルダを持つプロジェクトでは、期待する設定ファイルを読み込まず、上記の機能が正しく動作しないことがある。 以下に例を示す。 上記の画像では、個人的に作っているプロジェクトのビューの一つだが、@/... で始まるパスが VSCode 上で解決されておらず、エラーが出ている。さらにこのために関連するモジュールについて効かなくなっている。参照されるべき tsconfig.json には "paths": { "@/*": [ "

  • mecab
    mecab
ホットクックのレシピを検索する Slack bot を作って、副産物としてホットクックレシピ検索ライブラリができた。
development

ホットクックのレシピを検索する Slack bot を作って、副産物としてホットクックレシピ検索ライブラリができた。

ホットクックという、シャープが販売している自動調理鍋があって、これは神の調理器具だ。材料を切って調味料とともに鍋の中に入れてメニューを選択すれば、いつの間にか料理が完成している。しかもおいしい。さらに Wi-Fi 接続モデルでは、公開された新しいレシピが随時ダウンロードされていく。ダウンロード機能の件を抜きにしても、Wi-Fi があるモデルのほうが画面も見やすく操作しやすいと思うので、どうせ買うなら Wi-Fi 版を買った方が良いと思う。 現代の三種の神器として、ホットクック・ルンバ・食洗機を入れていいのではないかと個人的には感じている。 レシピはホットクックの公式サイトで検索できるが、わざわざブラウザを開くのもめんどくさいので Slack bot として動き、メンションを投げると検索したり、レシピの詳細を表示してくれるプログラムを Node.js 用に書いた。

  • mecab
    mecab
development

TypeScript コードのテスト時、ビルド後のファイルもテストする

TypeScript でコードを書いた際、ソースのテストは通っていても、何かの弾みでビルドされたコードが壊れていないことを念のために確認しておきたいという需要はある。とくにライブラリを作っていて、npm に公開する場合など、publish 前に検証するのは良い考えだろう。 このために、同じテストコードをソースと生成物それぞれに対して適用する方法を考える。つまり、以下のような conditional import を行いたい。 // このコードは動かない。 if (process.env.TESTMODE === 'dist') { import { FooClass, FooString } from '../dist/Foo'; } else import { FooClass, FooString } from '../src/Foo'; } describe('Test foo', function() { it('works', function(

  • mecab
    mecab
tech

(未解決)OpenWrtでv6プラス (MAP-E) 接続すると、一部のサイトに接続できなくなった。

先日の記事で、OpenWrtでMAP-E、あるいは国内ではv6プラスと呼ばれる方法での IPv4 over IPv6 接続に成功したことを書いた。 快適に利用できていると思っていたが、ある日、一部のサイトに接続できないことに気づいた。例えば、ニチバン株式会社のWebサイト (https://www.nichiban.co.jp) に接続できない。読み込みまでとても時間がかかったり、あるいはタイムアウトしてしまう。他のサイトでも時々読み込み遅かったり、途切れたりすることがある [1]。 IPv6 ではルータがパケットをフラグメントすることが禁止されているため、MTUが大きすぎた上に経路上で ICMP がフィルタされて Packet too Big が届かなかった場合、接続ができなくなる可能性があるとの情報を見たため、MTUを下げたり、MSS Clamping の設定を有効にしたが、改善しなかった。 @chinjinson さんが、前の記事を読んで同様に MAP-E 接続に成功されたということだったので、ニチバンのサイトに接続できるかどうか伺ったところ、

  • mecab
    mecab
tech

OpenWrtでv6プラス (MAP-E) での IPv6 / IPv4 接続と、IPv4 PPPoEでのサーバー公開を両立する

(追記)この方法は完全ではないです 後日、以下の方法では特定のサイトが見ることができなくなったり、表示が遅くなったりする問題が起こることが分かった。この問題はまだ解決できていない。本記事の内容を試す前に、追記記事を読むことを強く勧める。(そして、発生する現象の解決を試みるのも良いかもしれない。) (未解決)OpenWrtでv6プラス (MAP-E) 接続すると、一部のサイトに接続できなくなった。 概要 IPv6 の普及が進みつつあり、IPv6 での接続オプションを提供するプロパイダも増えている。日本国内においては、光接続において一般的に使われてきた IPv4 PPPoE 接続においてはフレッツ網終端装置での混雑によって速度が低下することが指摘されているが、IPv6 接続ではこの混雑を回避することができ、通信速度が向上するという利点もある [1]。 今回、自宅のインターネット接続を IPv6 化を試み、OpenWrtを導入したルータで IPv6 接続できたので、本記事ではその方法を記録する。IPv6 で接続した際に、 IPv4 の通信をどのように通す(IPv4 over IPv6)

  • mecab
    mecab
Emacs

GUI 版 Emacs のフォントサイズをシュッと変える interactive function

2019年10月15日: さらに簡単に変更する、標準で可能な方法を追記をした。 Mac 上で GUI 版の Emacs を使っているが、フォントサイズを変更したくなることが時々ある。ターミナルで Emacs を使っているならば、ターミナルのフォントサイズを変更すればいいが、GUI 版の場合、set-face-attribute関数を使って変更しなければならない [1]。 そこで、フォントサイズを簡単に変更するための interactive function を書いた。以下のGistにあるスニペットを .init.el 等に追加すれば、M-x change-font-size でフォントサイズを変更できる。現在のフォントサイズも表示されるので分かりやすい。 Gist: mecab/change-font-size.el 以前使っていたビルドではツールバーにフォントサイズ変更のメニューがあったのだが、今使っているビルドでは無くなってしまって少し悲しい。 追記 標準で簡単なキーバインドで変えられるやんけ!!!しかもバッファごとに変更できるし! text-scaleは次のショートカットを覚えてしまうのがいいです。 次のどれか一つを覚えさえすればOKです。 C-x C-+

  • mecab
    mecab
firebase

Firebase Authentication のデータを別プロジェクトにコピーするスクリプトを書いた

表題の通り、Firebase Authentication のデータを別プロジェクトにコピーしたい状況が起こったので、それを行うためのスクリプトを書いた。 copy_firebase_auth.sh 使い方 Firebase CLI でコピー元、コピー先それぞれのプロジェクトにログインする Firebase の Web コンソール上でコピー元のハッシュパラメータをコピーし、スクリプトと同じディレクトリに .hashParameter として保存する PROJECT_FROM={コピー元プロジェクトID} PROJECT_TO={コピー先プロジェクトID} copy_firebase_auth.sh を実行する 解説 基本的にやっていることは単純で、Firebase のCLI にはユーザーのデータをディスク上に書き出す firebase auth:export と、書き出されたファイルから Authentication にデータを読み込む

  • mecab
    mecab
tech

追加ソフトのインストール無しで、ボイスロイド品質のTwitchチャット読み上げを行う。

この記事の内容はもう使えません 2019年6月17日をもって、docomo による「音声合成【Powered by AI】API」が終了した [^1]。これにより、以下の方法によるチャット読み上げは使えなくなった。以前書いた、Webブラウザに内蔵されている音声合成エンジンを利用する記事(棒読みちゃんなどのインストール無しで簡単にTwitchチャットの読み上げを行う)を利用してほしい。 あるいは、株式会社エーアイが提供するもの以外(HOYA製とNTTテクノクロス製)の音声合成エンジンを利用するAPIは引き続き提供されているので、知識のある方はそれらを使うのもいいだろう。 概要 先日、棒読みちゃんなどのインストール無しで簡単にTwitchチャットの読み上げを行うという記事を書いた。この記事では、StreamLab の Chat Box と、Web Speech API を組み合わせることで、追加のソフトウェアをインストールすることなく、Twitch チャットの読み上げを行う方法を書いた。 上記の方法を応用すると、Twitch チャットの情報を Web Speech API

  • mecab
    mecab
棒読みちゃんなどのインストール無しで簡単にTwitchチャットの読み上げを行う
tech

棒読みちゃんなどのインストール無しで簡単にTwitchチャットの読み上げを行う

2020年8月23日: コードを修正した件について追記しました。後続記事(docomo の API を使う版)は既に動かなくなっているので、その旨を追記しました。 概要 本記事では、追加のソフトウェアのインストールを行うことなく Twitch チャットの読み上げを行う方法について説明する。正確を期せば Chrome、 Firefox、Edge といったブラウザが必要になるが、多くの環境ではすでに導入されているだろう。本手法では、Streamlabs [1] の Chat Box に対して、受信したチャットメッセージを Web Speech

  • mecab
    mecab
tech

Cloud Firestore エミュレータ を concurrently と一緒に使う

概要 Cloud Firestore エミュレータ を コマンドの並列実行支援モジュール concurrently と一緒に使う場合、コマンドを少し工夫しないと期待通りに動作しない。以下を行う必要がある。 エミュレータの起動の際、firebase serve --only firestore < /dev/null とし、標準入力を /dev/null から取るようにする。 concurrently の--success (-s) オプションを適切に設定する。 期待通りに動作する npm script の例を以下に示す。 "scripts": { "test": "concurrently --success=first --kill-others -n 'emulator,

  • mecab
    mecab
development

Firebase Hosting のルーティングを噛ませて webpack-dev-server などの静的コンテンツホストを使うためのプロキシ

2019/1/14 午前5:57 (JST) provider のコードを修正。 概要 Firebase Hosting 用に設定したURL書き換えを利用しつつ、webpack-dev-server などの他の開発サーバーからコンテンツの取得をしたい。この問題に対して、Firebase Hosting の開発サーバー (firebase serve) が内部的に利用している superstatic を使い、URLを書き換えた上で別のサーバーからコンテンツを取得するようなプロキシを作ることで解決した。 完全なコードは https://gist.github.com/mecab/9890416390e8c5a2c42547823d252e20 で参照できる。 (adsbygoogle = window.adsbygoogle || []).push({}); 背景と問題 Firebase Hosting は Google が提供する静的コンテンツのホスティングサービスだ。コンテンツを用意して適切な設定を書けば、そのコンテンツをHTTPで取得できるように

  • mecab
    mecab
ZshとiTerm2の環境下で、プロンプトにemojiを用いた場合にコマンド補完後に最初の1文字が重複して表示される問題を解決した。
terminal

ZshとiTerm2の環境下で、プロンプトにemojiを用いた場合にコマンド補完後に最初の1文字が重複して表示される問題を解決した。

ある日久々にiTerm2をアップデートしたところ、コマンド補完後に最初の1文字が重複して表示される問題が起こった。 と言われてもどのような問題か分からないと思う。ぼくも上手く説明できない。実際に見るとすぐ分かるので動画を撮った。 以上のように、補完を行うと、入力していた文字列の1文字目が重複して表示される上に、行を消しても1文字だけ残ってしまう状況になる。これは表示上だけの問題で、Enterキーを押しても入力されて無いものとして扱われる。この状況で作業するとかなりストレスが溜まった。 プロンプトの文字列を変更して問題を切り分けると、emojiがプロンプト中に含まれているのが原因だと分かった。ぼくの環境では$の代わりに💰のemojiを使っている。金運アップを見込んでだ。 解決するにはプロンプト指定において、emoji部分を%1{と%}で囲めばよい。%1{💰%}という具合だ。 解決にあたっては、StackexchangeのFirst characters of the

  • mecab
    mecab
32TB分のHDDを買った
tech

32TB分のHDDを買った

自宅で運用しているサーバには既に12TB分のストレージ を積んでいるが、最近は容量が枯渇してきていた。そのため、HDDを増設することにした。せっかく増設するならば、しばらく容量に関して思い悩まないようにするために思い切ってたくさん積みたいと思って、4TBx8台ほど積むことにした。後に述べるとおり、HDDケースとeSATA拡張カードも一緒に買った。 機材の選定と購入 HDDケース 既にHDDベイは使い切っているのでHDDケースも買う必要があった。8台詰めるケースとなるとその時点で選択肢はかなり少なくなるのだが、その中でもロジテックのガチャベイ LHR-8BNHEU3を購入した。これにした理由は、以下の2点からだ。 1) ケース側でRAIDを作らず、HDDを個別に認識できる 2) eSATA 6GとUSB3.0の両インターフェースを持っている。 1の要件は、サーバ側でZFSプールを作りたいと思っていたので必須だった。なお、同じケースののRAID対応版としてLHR-8BRHEU3があるのだが、こちらは

  • mecab
    mecab