ようへいの日々精進XP

よかろうもん

小ネタ道場一本勝負 〜 MacOS X でランダムな英数字を生成する 〜

たのもう

MacOS X でランダムな英数字を生成したいんです。

もちろん、pwgen というコマンドがあるのは知っていますが、今回は pwgen は使わない方法を模索します。

技あり!を取られた気分

こんな感じで

cat /dev/urandom | tr -dc A-Za-z0-9 | fold -w32 | head -n1

いけるはず…

ところが…

$ cat /dev/urandom | tr -dc A-Za-z0-9 | fold -w32 | head -n1
tr: Illegal byte sequence

お…技ありを取られた気分。

なぜ、こんな事が起こるかについては、以下の記事に書かれていました。

unix.stackexchange.com

Computers store data as sequences of bytes. A text is a sequence of characters. There are several ways to encode characters as bytes, called character encodings. The de facto standard character encoding in most of the world, especially on OSX, is UTF-8, which is an encoding for the Unicode character set. There are only 256 possible bytes, but over a million possible Unicode characters, so most characters are encoded as multiple bytes. UTF-8 is a variable-length encoding: depending on the character, it can take from one to four bytes to encode a character. Some sequences of bytes do not represent any character in UTF-8. Therefore, there are sequences of bytes which are not valid UTF-8 text files.

tr is complaining because it encountered such a byte sequence. It expects to see a text file encoded in UTF-8, but it sees binary data which is not valid UTF-8.

cat /dev/urandomtr が期待しない文字列(UTF-8 では無い文字列)が流れてきているからとのことです。

ということで、一本

こんな感じで

$ export LC_ALL=C; cat /dev/urandom | tr -dc A-Za-z0-9 | fold -w32 | head -n1
2u8uJ3zweCwHAvRjTsIYUKjXGG9KId5y

有難うございました

unix.stackexchange.com

やっぱり、pwgen が良い気がしました。