カテゴリー: テクノロジー

mkcertでローカルな環境をHTTPS化する

はじめに

ウェブ上のサービスを開発するにあたって、ローカルなウェブサーバをHTTPSで運用したくなることがあります。OpenSSLを使って自己署名証明書を発行する方法が良く知られていますが、手順も多く運用はなかなか大変です。mkcert というツールを使うことでこの手間を軽減できます。

mkcert

mkcert には Linux, Mac, Windows の書くプラットフォーム向けのインストール方法が用意されています。
Debian の場合は以下の通り。

$ sudo apt install libnss3-tools mkcert

使い方は非常に簡単です。

$ mkcert -install

ルート CA 証明書が作成されてインストールされます。

  • システム
    • /usr/local/share/ca-certificates/mkcert_development_CA_*.crt
    • /etc/ssl/certs/mkcert_development_CA_*.pem
  • Firefox
  • Chrome

ルート CA 証明書のファイルが .local/share/mkcert にあるので、自分が必要な場所にコピーして使うこともできます。

$ mkcert -CAROOT
/home/splout/.local/share/mkcert
$ ls /home/splout/.local/share/mkcert
rootCA-key.pem  rootCA.pem

ルート CA 証明書の次はサーバ証明書です。

$ mkcert localhost
$ ls
localhost-key.pem localhost.pem

コマンドを実行したディレクトリに localhost 用の証明書が作成されます。

$ sudo cp localhost-key.pem /etc/ssl/private/localhost-key.pem
$ sudo cp localhost.pem /etc/ssl/certs/localhost.pem

/etc/ssl の下にコピーしたら、Apache の設定に以下を追加します。

SSLCertificateFile      /etc/ssl/certs/localhost.pem
SSLCertificateKeyFile /etc/ssl/private/localhost-key.pem

これで https://localhost/ がブラウザの警告無しで使えるようになります。


7年ぶりに家のパソコンを新調しました。

7年前に買ったPCを買い換えようと思いつつもっと性能のいいグラボが出るのでは?とここ数年ほど伸ばし伸ばしにしていましたが、流石にそろそろ環境に追いついていけなくなっていたのでPCを新調しました。

デスクトップPC

下記の通り大幅性能アップ
CPU:i7-6700K から i7-13700F
グラボ:GTX1080(8GB) から RTX4070(12GB)
メモリ:16GB から 32GBへ

元々は最高スペックを目指してRTX4090を考えていたんですが、電源ユニットの問題や電気代にワット数、そして肝心のプレイするゲームなど諸々考えるとオーバースペックだし無駄に購入費用も月々の電気代もかかってしまう。他にもブレイカーの問題もあるので色々考慮していくとRTX4070辺りがちょうどいいのでは?となりセールもあったので購入に至りました。

少し上のRTX4070Tiだと12GBなのは変わらないしそうなるとRTX4080だけど消費電力が上がり過ぎでRTX4090なんてとてもじゃないですが普段使いの遊び用PCでやってるゲーム的にもオーバースペックすぎました。

届いて最初に感じたことは起動の速さと久しぶりにPCは静かなものだと再確認できたことです。
そしてSteamでゲームを起動して遊んだあとに終了してもPCが落ちない、固まらない!
もちろん起動も早いですし性能アップは目に見えて感じてます。流石に重いゲームは少しうるさいですが今のところとても快適で買い替えて良かったです。

金額も元々最高スペックを目指して50万超えぐらいを考えていたのが27万ほどに下がったので価格面でも納得のいくお買い物でした。しかもCPUとグラボの消費電力で計算したところ前まで使ってたPCと消費電力変わらないか少し下がる感じなのでそこも良かったです。

買ったことで後悔したのは下記の2点でPC自体の後悔は今のところありません。
・ポイントサイト経由で買うのを忘れていて1万円ほど損に・・・
・下取りで1000円引きだったが送るPCが専用のダンボールでないと入らなくて無駄にダンボール代のほうが高くついた


Linuxで指紋認証

開発機としてノートPCに Debian GNU/Linux をインストールして使っています。
以前に比べて Linux で指紋認証を利用するのもずいぶん簡単になっていたので手順をまとめてみました。

指紋認証を使うためには以下の2つのパッケージをインストールします。

$ sudo apt install fprintd libpam-fprintd

その後、 fprintd-enroll を実行して画面の指示通りに指紋を登録するだけです。

ここまでやってから気付いたのですが、Gnome の設定画面からも登録できました。

この画面で「指紋認証ログイン」を選択すれば登録画面に移動します。

こんな感じで登録が完了したら、「指紋認証ログイン」が有効になります。

この状態になっていれば、次回のログインから指紋認証が使えます。

また、sudo の認証も指紋認証でいけます。

$ sudo pam-auth-update

で「Fingerprint authentication」にチェックを入れると sudo で指紋認証が使えるようになります。


Javascriptの ‘文字列’.length の罠

Javascriptから少し離れると忘れてしまう問題。
最近、立て続けで見かけたので備忘録として書きます。

先に結論だけ書くと、現状では完全な解決は難しいということです。

lengthについて

MDNによる length について書かれたページです。
こちらの内容をほぼなぞったものになります。

String length – JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/length

Javscript で文字列の長さを取得したいときはまず length を使うことを考えるでしょう。

const mojiretsu1 = 'mojiretsuhadoushutokusuruka';
console.log(mojiretsu1.length);
// 27
取得できました。
文字列を日本語に置き換えても問題なく取得できます。
const mojiretsu2 = '文字列はどう取得するか';
console.log(mojiretsu2.length);
// 11

何も問題はないように見えます。

全てはうまくいっています。

要素は言葉を切り分ける

MDNにある説明を引用します。

String length – JavaScript | MDN

細かい説明はMDNを見ていただくとして、ここで重要なのは length が文字の数ではなくコードユニットの数で表されることです。

以下に例を示します。

const emoji = '🏴󠁧󠁢󠁥󠁮󠁧󠁿';
console.log(emoji.length);
// 14

なんだかよく分からないこの謎の旗 🏴󠁧󠁢󠁥󠁮󠁧󠁿 の length は14ものコードユニットを内包します。
多すぎる、修正が必要でしょう・・・。

これを見てあなたはすぐに「絵文字禁止にしよう」と思うかもしれません。
しかし、それはベストな解決方法ではないことにすぐに気付くでしょう。

const umaiYasuiHayai = '𠮷野家';
console.log(umaiYasuiHayai.length);
// 4

𠮷野家.length は4。
𠮷の length は2となっているため、このような結果となります。

length はどう生きるか

MDNにある対応例を引用します。

function getCharacterLength (str) {
    return [...str].length;
}
console.log(getCharacterLength('🏴󠁧󠁢󠁥󠁮󠁧󠁿'));
// 7
console.log(getCharacterLength('𠮷野家'));
// 3

これにより ‘𠮷野家’ に対しては3を得ることが可能になります。
しかし、謎の旗は7となってしまい、依然、正しい文字数を得ることができません。

見ての通り、この方法は完璧ではありませんが、いまのところ、これはいくらかマシな方法といえます。
厳しい現実ですが、私たちは常に前を見据える必要があるでしょう。

未来へ

将来の話になりますが、Intl.Segmenter という新しい仕様によりこの問題は解決される見込みです。内容は省きますが、これを書いている現在では一部の環境でしか対応していません。Polyfill は存在するようですので、導入可能な環境であればそちらを利用できるでしょう。

また、length の話からは逸れますが、’文字列’.split() 等でも同様の問題を抱えています。厄介な問題ではあるのですが、Javascript を常に触っていることでもない限り忘却しがちなところも輪にかけて厄介な点です。その度に ‘文字列’.length には期待して、がっかりさせられ、また忘れて期待してしまうのです。

噫無情。

というほどでもないですが、なるべく早く解決されることを期待したいところです。


Demucs で音源分離

音源分離という技術分野があります。
音楽データを入力として、各楽器や音声毎に分離して出力するというものです。
例えば曲の中から歌の部分だけを分離して消してしまえばカラオケのデータになります。
音源分離は昔から様々な手法で取り組まれてきましたが、近年ではこの分野でもAI技術が応用されています。

オープンソースの音声分離ソフトウェアの一つに「Demucs」があります。
Metaの研究所が開発しているもので、GitHub で公開されています。
Python が動く環境であれば簡単にインストールできるようなので使ってみました。

https://github.com/facebookresearch/demucs/blob/main/docs/linux.md
に従ってインストールします。
まずはpythonのバージョンを確認。

$ python3 --version
Python 3.9.2

Python 3.8以上であれば大丈夫です。

pip でインストール

$ pip3 install --user -U demucs

これだけです。
実行します。

$ python3 -m demucs --mp3 -d cpu music.mp3

Core i5 8400 のマシンで2分10秒ほど。
結果ファイルは以下のようなディレクトリ構造に置かれます。

$ find separated
separated
separated/htdemucs
separated/htdemucs/music
separated/htdemucs/music/bass.mp3
separated/htdemucs/music/vocals.mp3
separated/htdemucs/music/drums.mp3
separated/htdemucs/music/other.mp3

ボーカル、ベース、ドラム、それ以外といったところですね。
mp3 オプション無しで実行すれば、結果は wav ファイルになります。

ボーカルとそれ以外、みたいな分離もできます。

$ python3 -m demucs --two-stems=vocals --mp3 music.mp3
$ ls separated/htdemucs/music
no_vocals.mp3  vocals.mp3

実際に聴いてみると、綺麗にそれぞれのパートに分かれています。変なノイズが乗っていたり、別のパートが混ざっていたりということもほぼありません。
ボーカルだけのファイルを聴くのはなかなか不思議な気分です。