カテゴリー
ツール

hashids – 自然数からか逆なユニークidを生成する多言語に対応したライブラリ

Hashids は、0または正の数をアルファベット+数字の短い並びに変換し、また逆変換で元の数を取り出すことができるライブラリです。

YouTubeの動画ページのURLについている、動画と一対一にマッチした文字列や、bit.ly などのURL転送サービスでURLごとに生成される文字列のような、一意に決まってなるべく短い文字列を作るという目的で作られたそうです。

サイトのトップに列挙されているのですぐにわかりますが、非常に多くのプログラミング言語に移植されています。

JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Perl 6, Swift, Clojure, Objective-C, C, C++11, D, F#, Go, Erlang, Lua, Haskell, OCaml, Elixir, Rust, Smalltalk, ColdFusion, Kotlin, Nim, VBA, Haxe, Crystal, Elm, ActionScript, Bash, R, TSQL, PostgreSQL, PLpgSQL, Dart, Io, Julia, .NET

Rails, Django, WordPress, など言語だけでなくフレームワークやCMSのプラグインも作られていて、多くの言語や環境を超えて生成されたunique id を渡して取り出すこともできそうです。双方向の変換ができますが、ソルトを与えることで変換結果は個々に違わせることができます。
w
昨日のワードフィルタに関する Hacker News の議論で出てきたのでこのライブラリを知ったのですが、このライブラリの十分にコンパクトな仕様の中で面白いと思ったのは、このユニークな文字列の生成時に「よくある英語の卑語が出てこないようにする」ための方法がドキュメントに大きく書いてあることですね。

ユニークな文字列の生成時に、c, s, f, h, u, i, t の文字が連続して並ばないように指定することで、システムが自動的に作ったユニークidの中に英語のマズイ単語が偶然出てくることを防げることが多い、そうです。経験的なものでしょうけどそんなハックがあるんですね。hashid の変換関数ではセパレータとしてこれらの文字を与えることで、セパレータ同士が隣接しないようにできます。これによって使えない文字列が相当数出てしまいユニークidも少し長くなってしまうでしょうけれど、ユニークidに偶然卑語が出るとよくない、と思うサービス開発者も多いのかもしれません。

カテゴリー
技術者と英語

問題のあるユーザー名登録を防ぐ英語圏のワードフィルタの実例

小片コード共有サービスの pastebin に貼られ、Hacker News で ゲーム配信サービス大手のTwitch がユーザー登録時に弾いているフィルタ部分のソースコードだ、との主張で紹介されている SQL コードは、問題のある単語をチェックするためのコードです。

CREATE OR REPLACE FUNCTION is_terrorism (VARCHAR) RETURNS BOOLEAN STABLE AS $$
 SELECT replace($1,'_','') LIKE '%did911%'
     OR replace($1,'_','') LIKE '%support%isis%'
     OR replace($1,'_','') LIKE '%isis%support%'
     OR replace($1,'_','') LIKE '%join%isis%'
     OR replace($1,'_','') LIKE '%isismember%'
$$ LANGUAGE SQL;


CREATE OR REPLACE FUNCTION is_child_exploitation (VARCHAR) RETURNS BOOLEAN STABLE AS $$
 SELECT replace($1,'_','') SIMILAR TO '%ped(o|0)(f|ph)(i|1)le%'
     OR replace($1,'_','') SIMILAR TO '%isa%ped(o|0)%'

SQL 文としてジャンルごとに定義されている関数は、イスラム国(ISIS)への参加を呼び掛ける文字列や、児童ポルノや人種差別・性犯罪やドラッグに関する英単語が含まれる文字列で True を返すようです。

また、単純な単語の一致だけではなく、それら英単語の一部の文字を数字に置き換えるなどしてチェックをすり抜けようとするものもある程度見つけるようになっていました。a を 4 にしたり、 e を3 にしたりという leetspeak と言われる変換ですね。

ユーザー登録のできるwebサービスでは大なり小なりこのようなフィルタリングを行っているとは思います。コードが Hacker News の投稿者の言う通り Twitch で使われているものかはわかりませんが、この SQL で引っかかるような文字列をいくつか入れてユーザー登録しようとしたら、エラーは出ますね。実際には JavaScript レベルでエラーにしているようなので、SQL 文のフィルタは誰かが再現したものかもしれませんし、あるいはそれぞれが同じネタ元のフィルタを参照して作られたものかもしれません。

各関数の名前からどのような性格の「悪い単語」を排除しようとしてるのかがわかります。

関数名 意味
is_terrorism テロ
is_child_exploitation 児童搾取
is_hateful ヘイト
is_harassment ハラスメント
is_violence 暴力
is_tragedy 悲劇
is_selfharm 自傷
is_sexual 性的
is_drugs ドラッグ
is_derogatory 軽蔑的
is_profanity 淫ら
is_blasphemy 冒涜
is_marijuana 大麻
is_sex_insult 性的侮辱

チェックされる単語の一つ一つは、多くが理解して気持ちのよい単語とは言えません。細かく紹介はしませんが、英語での罵倒や悪口の勉強がしたければいい教材となるやもしれません。

ワードフィルタは false positive であるスカンソープ問題も引き起こすので万能の解決法ではありませんが、海外向けにユーザー登録のあるサービスを公開する場合は対策の一つとしてこのようなフィルタを用意することも考えておかないといけないのでしょう。

カテゴリー
ネットのサービス

1万6000個のチェックボックス要素で作られたDoom

HTMLのチェックボックス「だけ」をひたすら活用できるライブラリ Checkboxland を先週紹介しましたが、さっそくすごい応用サービスが登場しました。

Doom といえば、非力なレトロPC や関数電卓から、ATM や デジカメ、プリンターの液晶などCPUのあるところならどこでも移植されてきたゲームですが、今回は Checkboxland を使って、すべてチェックボックスで作られた Doom が遊べるようになっています。

ページ上部にあるように、カーソルキーの移動と Ctrlキーの射撃で遊べるのですが、青白の二色で解像度も160×100と低いため、敵が出てくるなど込み入った表示になると正直何が起こってるのか判別は難しくなります。Doom ファンならこれでもわかるのかもしれませんが。

左上には元の Doom 画面も表示されているので、どうにもならないときはそちらを見るしかないでしょう。

ブラウザ上で動く Doom は「WebAssembly で FizzBuzz から Doom までを作る」プロジェクトで作られているものを呼び出し、これが非表示の canvas 要素に描いたゲーム画面を MediaStream 経由でCheckboxland の 動画描画機能に渡しています。

via DOOM Rendered via Checkboxes via reddit