カテゴリー
ゲーム

ROWS & TABLES – SQLカードゲーム

ROWS & TABLES は、SQL をテーマにしたカードゲームです。

ゲームに含まれるカードは大きくわけて4種類。Insert, Delete, Select, Update です。

各プレイヤーに3枚の手札を配り、時計回りにプレイします。自分のターンになったらまず山札から一枚引いて、場に出すカードを選びます。

Insertカードの片面はデータになっていて、トラとかテディベアとかのentry と、所有者 owner 、カテゴリー category が記載されています。

自分の場にデータカードを Insert で増やしていきます。

Select カードを使うと、category で指定した場のデータカードで条件にあったものを、場から下げて獲得することができます。一旦獲得してしまったデータカードは、今後他のプレイヤーから奪われることがありません。

他の2種類のカードは、他のプレイヤーとのやりとりになります。

Delete カードでは、カラムの条件を指定することで場に出ているカードを廃棄させます。うまく他プレイヤーが多く出している条件を指定することで、自分が有利になるわけですね。

Update カードは、データの 内容を where で指定し、owner を「自分」に変更することで、他人が場に出したデータを奪うことができます。相手のデータを減らして自分につけることができるので、効果は大きそうです。

これらのカードを使い、場でデータを集め、うまく Select で手中に確保し、最後にすべてのカードを使った後に場と獲得したカードの枚数が一番多い人が勝利者となります。

ゲームの解説動画はこちら。

このカードゲームは1セット $15(1650円) 、4セットだと$40(4400円) ということです。

SQL の勉強の始めに、このようなカードゲームで導入をするのもいいかもしれませんね。

カテゴリー
技術者と英語

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

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

カテゴリー
データ可視化

トイレは空いているか? Raspberry Pi でトイレの利用状況をネット表示

“Is the toilet free?”(トイレは空いているか?)という直球なドメインにアクセスすると、”yes”か”no”のどちらかの文字だけが画面に大写しされます。

isthetoiletfree-com

ソフトウェア企業Made by Manyが社内プロジェクトとして開発したのが、トイレの空き情報をRaspberry Piで監視する Is The Toilet Free 。トイレのドアの開閉を、Raspberry Piをベースとした機器で収集し、その結果を冒頭のwebサイトで公開したり、その他の方法で共有させています。

View this post on Instagram

Prototyping continues

A post shared by @ fionamclaren on

データ分析

3週間分のデータをSQLで引いてわかるようになったのは、以下のような項目です。

  • トイレが空いているか?
  • 総ビジター数
  • ビジター間の最短時間
  • ビジター間の最長時間
  • 平均ビジター間経過時間
  • 時間ごとの総ビジター数
  • 日ごとの総ビジター数

これらから類推される結果として、以下のようなことも判明しました

  • 最も好まれているトイレはどれか
  • ピークタイム
  • オフピークタイム
  • 予測待ち時間

MacOSのメニューバーにトイレの空き状況を表示するツールも、別の社員によって開発されています。

is-the-toilet-free-mac-os-menu-bar

社内の壁には、トイレの空きを緑で、満員を赤で表示するディスプレイも備え付けられました。

2014-05-02_1029

Rapsberry Piとウェブカメラを使った別の人のトイレ監視工作もあるようですが、今回のドアの開閉だけをセンスするものに比べると、トイレにカメラというのは利用者を心配させてしまうような気がします。

回路図やソースコード、トイレからのデータ取得ということでプロジェクトのプライバシーポリシー、など制作に必要な情報はGitHub等ですべて公開されているので、同じものを作ったり、自分たちように改造することもできるでしょう。

[追記 2015-06-16] 同様のものがいろいろ出てきています。何センサーで使用中と判定するかや、状態の表示方法などで異なるアイデアが出てますね。

ヘブンズ・ドア 〜私が行ったら空いてるトイレ〜

社内トイレ問題をIoTで楽しく解決! – mizunoq's blog