世界刑務所入所者率地図

刑務所にぶち込まれている人数の、全人口に対する割合を国ごとに調べて、高いところが濃くなるように塗ったものだそうです。

アメリカとロシアは、10万人中500人以上が入所してるんですね。200人に一人以上? その分は社会から隔絶されているわけで、まあ刑務所でも何らかの生産は行なってるんだろうけれど、無駄が多いといえば無駄なんじゃないかなあ。

率が低い国にしたって、犯罪者を捕まえるための社会システムが追いついてない国もあるのかもしれませんから、一律にどうこうは言えないのかもしれませんけど。

あと、オーストラリアが載ってないのはオーストラリアが元々刑務所(流刑の島)だから、というきついジョークがDiggで出てました。単なる加工ミスだとは思いますしオーストラリアの人が聞いたら怒るでしょうけど笑ってしまった。

via Digg

[メモ] symfony/sfPayloadFilterChainPluginによる文字列のフィルタ保存

sfPayloadFilterChainPlugin

掲示板とかで、表示時にフィルタをかけるんじゃなくて、保存時にまずい文字列とかを見つけて伏字にしたりするためのsymfony プラグイン。

インストール方法

> symfony plugin-install http://plugins.symfony-project.com/sfPayloadFilterChainPlugin

設定ファイル

$ cd frontend/config/pfc
$ edit frontend/config/pfc/profiles.yml
post_comment: [censor_bad_words, hide_phone_number]

$ edit frontend/config/pfc/filters.yml

  censor_bad_words:
    enabled: on
    class:   myCensorshipFilter
    params:
      bad_words:        [死ね, 死ねばいいのに, 氏ね]
      replacement_word: "王大人に死亡確認されればいいのに"
  hide_phone_number:
    enabled: on
    class:   akkyHidePhoneNumberFilter
    params:
      replacement_word: "***-****-****"

payloadでフィルタするテキストを受け渡す作りで、説明にあるように単純なpayloadクラスを作っておく

lib/payload/myTextPayload.class.php

class myTextPayload
{
  public function getText()
  {
    return $this->text;
  }
  public function setText($text)
  {
    $this->text = $text;
  }
}

あとはフィルタクラスを実装して配置。autoloadさせるので置いたら”symfony cc”を呼ぶこと

lib/filter/akkyHidePhoneNumberFilter.class.php

/**
 * hide Japan's phone number from text
 *
 */
class akkyHidePhoneNumberFilter extends sfFilter
{
  // not a perfect solution
  //  see http://blog.livedoor.jp/nipotan/archives/17526053.html
  const PATTERN = '/(?:0\d{1,4}[-.]?)?\d{1,4}[-.]?\d{4}/';
  /**
   * Make phone number unreadable.
   * 
   * @param     string     $text
   * @return    string
   */
  public function execute($chain, $payload)
  {
    $replacementWord
      = $this->getParameter('replacement_word', 'xxx-xxxx-xxxx');

    // Retrieve text from payload
    $text = $payload->getText();

    $censoredText = preg_replace(self::PATTERN, $replacementWord, $text);

    // Replace payload text
    $payload->setText($censoredText);
    
    // Execute next filter in chain
    $chain->execute($payload);
  }
}

あとは、実際に書き込みの発生するところで、手動(アクション側)または自動(モデル側)でこのfilterを呼び出すことで、まずい単語にマスクをかけるフィルタなどを、フィールド毎に適用させることができます。

class messageActions extends sfActions
{
  public function executePost()
  {
    $payloadComment = new myTextPayload();
    $payloadComment->setText($this->getRequestParameter('comment'));
    // Filter payload
    $chain = new pfcPayloadFilterChain();
    $chain->loadProfile('post_comment');
    $chain->setPayload($payloadComment);
    $chain->execute();
    $this->comment = $payloadComment->getText();

    (このあとpropelオブジェクトにセットして保存とか)

で、入力フィールドのこういうのが

秋元(030-5555-5555)死ね

こうなる

秋元(***-****-****)王大人に死亡確認されればいいのに

アクションごとに適用できるフィルタをきめ細かく変更できるところと、適用するfilterをyamlで調整したり、可変のパラメータを設定できたりするところが利点なんでしょうか。もうちょっと使ってみようかと思っています。

Firefoxのdel.icio.usアドオン、高機能な方は重いですねえ

前にも一回やったんだけど、また同じ失敗をしてしまいましたわ。

del.icio.usボタンをブラウザにつけるFirefox AddOnって、が両方配布されてるんだけれど、新の方はいろいろと高機能なかわりに、ブックマーク数が多い人(5000個とか)はメモリ喰ってたいへんなんでした。

ブックマークしようとしてブラウザが劇重になったり、メモリ消費が100Mbytesとか増加したりしたので、あわてて旧addonに戻しました。古い方はほとんど何も機能ないんだけど、それでも困ってないといえば困ってないんで。

データ量が少ない間はサクサクと動くので、ヘビーじゃないユーザ(==大多数のユーザ)からは悪い感想が出てこない、ってのもソフトウェアだとよくありますよね。

勉強会を開催します。ウェブで調べ物をするときに役立つ手法などについて

パソナテックさんと、ネットでの情報収集力を上げるための実践的なセミナーを開催することになりました。

てくらぼ自習室 第1回ネット・リサーチ ハンズオン セミナー

僕は仕事柄、一日中英語のサイトやブログを泳いで回ったりすることもあるのですけど、そこでどのようにわかっていないことを調べたり、複数のソースを探して確からしさを検証したりしているのか、といったようなことを、会場にいらしたみなさんのお題などを使って実際にお見せしつつ、お伝えできればと思います。

# 調査する内容は、日本の情報でも海外の情報でも構いません。

また、僕自身の使いこなしにもおかしなところや個人的な癖があるでしょうから、参加者のみなさんからのアドバイスも受けたり、みなさんで共有する場にできればと思っています。

セミナーの後は、希望者で懇親会も行なうので、そこでもいろいろな情報交換ができたらいいなと思っています。

申し込みはこちらから。よろしくおねがいいたします。