パスワードにはmd5、メールアドレスにはPEAR Crypt_Blowfishが使われてる。Blowfishのキーはconfig.phpに書いてある。

ここのAtomをRailsのAtomFeedHelper#atom_feedで出力してたんですが、基本全て数値文字参照で出る。

エンコーディングに関係無く表示されるので正しくはあるんだろうけど、クロールされてるところ(Planet PHP Japanなど)ではもう一度エスケープがかかって数値の羅列になってしまう。

フィードクライアントとしては数値文字参照をHTMLとして解釈した上でエスケープする必要があるだろう。しかし、自分がクロールする側になったら正直、

「面倒だから数値文字参照などにせんでくれ・・・」

と思うだろう。

しかもそういったクライアントを通して見る第三者の人にとってはそんなサーバークライアント間のやり取りなどどうでもいいことで、単に

「文字化けうぜぇえええ」

である。

atom_feedメソッドでのHTMLのエスケープはたくさんのクラスを遡って、最終的にはここ(String#to_xs)でやってるらしい。

/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb:

class Fixnum
  XChar = Builder::XChar if ! defined?(XChar)

  # XML escaped version of chr
  def xchr
    n = XChar::CP1252[self] || self
    case n when *XChar::VALID
      XChar::PREDEFINED[n] or (n<128 ? n.chr : "&##{n};")
    else
      '*'
    end
  end
end

(...snip...)

class String
  # XML escaped version of to_s
  def to_xs
    unpack('U*').map {|n| n.xchr}.join # ASCII, UTF-8
  rescue
    unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
  end
end

コメントを見ると、そもそもコレ自体XCharライブラリーというのを拝借しているものらしい。

Wikipediaによると、西欧22言語をサポートするISO-8859-1もCP1252も共にLatin1と呼ばれますが、IBM由来のMicrosoft Codepage(CP)では0×80から0×9Fの範囲の文字が拡張されています。(ユーロ、ダガーとか)

要はShift_JISとCP932みたいな問題がLatin1とCP1252にもあるんですな。

何のためのライブラリかというと、多言語化の時に問題になりそうなそのCP1252の拡張部分を適当な文字にマッピングするためのものらしい。(自動的にCP932で書いたら問題が起きそうなことが予想できる)

とりあえずUnicodeをUTF-8で使ってれば問題無いだろうということで下記の様に対処した。

config/initializers/rails_ext.rb:

class String
  def to_xs
    ERB::Util.html_escape(self)
  end
end

大丈夫かな?

CakePHPガイドブック
  • CakePHPガイドブック
  • 毎日コミュニケーションズ(2007-10-25)
  • 毎日コミュニケーションズ
  • 定価:¥ 3,360
  • 新品価格:¥ 3,360
  • 中古価格:¥ 2,860
  • ASIN:4839924317

これからCakePHP使うので借りて読みました。分かりやすかったです。1.2が出そうなのだとしたら読むタイミング悪かったかな?

fixtureってymlよりcsvの方が書きやすいと思いません? 項目の並びが気に食わなかったり、複雑な置換したり・・・。

っていうのは前に書きましたが、編集にはいちいちsamba経由でOpenOffice Calcを使っていて、なんだか不便に感じてました。

CUIのスプレッドシートアプリ無いのかな? → vimでCSV整形するプラグインあればいいんじゃないのか?

ということでCSVに限らず、高機能なテキスト整形ツールのAlignというプラグインを知りました。

インストール・設定:

http://www.vim.org/scripts/script.php?script_id=294 からスクリプトをダウンロード、解凍する。

解凍したAlign.vbaをvimで開く。

:so %

日本語で丁度良く整形されるように.vimrcに追記。

let g:Align_xstrlen = 3

CSVの整形:

row_fixture

整形したい部分を選択して、:Align (区切り文字)

result_fixture

あらやだ、キレイ。

こう揃ってるとボックスで選択していろいろやりやすくてうれし。

CSVの整形のみやってみましたが、TSVやさまざまなフォーマット、ソースコードの整形など便利な機能がまだまだあるみたいです。

これでCalcで開こうとしてsambaのキャッシュ(?)に騙されたりしなくて済みそうです。

参照: 高性能なテキスト整形ツールAlignの使い方 ? 名無しのvim使い

仕事でOpenPNEのソースを読む必要があったんですが、想像してたのとは違って全然読み易い。

「なんだー、読み易いじゃんー」

などと言いながらホクホク読みました。

オープンソースプロジェクトはソースの読み易さを気にするためか、読み易いものが多いようです。しかし、社内ツールやレガシーシステムなど、世の中にはまるで夏の目黒川の如く近づくことさえためらわれるようなPHPアプリケーションが多数存在します。

そんなPHPアプリケーションの異臭を嗅ぎ分けるための7つのポイント。

  1. テンプレートシステム(PHP自身を含む)が無い。
    これさえあればコードを理解するのはかなり容易になるでしょう。さもないと・・・。
  2. register_globalsがOn。
    そのアプリは臨終前の患者です。大きな手術は諦めて延命治療に勤めましょう。
  3. magic_quotes_gpcがOn。
    フォームから保存するたびにバックスラッシュが増えるアプリを見るのはとても悲しいことです。
  4. IIS
    至急PHPとWindows Serverのベテランを探しましょう。
  5. 設定ファイルがXML 。
    最大で深さが2しかないデータ構造にまでXMLが使われている場合、プログラマは設計者の強い信念と独創性に苛まれるでしょう。(特にPHP4では茨の道。)
  6. eval, extract, create_function
    grep殺し。
  7. mbstring.encoding_translationがOn。
    素人にはオススメできない。

これらの特徴はデスマーチの周囲でしばしば目撃されることが知られています。

ある研究者(俺)によれば、php.iniやソースコード管理システムを上記のキーワードで検索するだけでPHPプログラマーのデスマーチ回避率は32%向上すると言われています。

もちろん上記を上手く使っているアプリケーションも多くあり、使っていること自体を非難することはできません。

・・・。

と無難にまとめようと思いましたが、あきらかに使うべきでないものも世の中にはあるんです!

参照: PHPで知っておきたいcreate_function5つのトリビア

現状、「OpenPNE(1)」と「OpenPNEの会員データと連動したWebデータベースアプリ(2)」が動いているコンシューマ向けサイトがあります。

ここに、私が別の「Webデータベースアプリ(3)」を、yoshukiさんが別の「携帯対応フォーラムアプリ(4)」を追加で作る予定があります。

  • (1)、(2)は前担当会社のシステム(PHP)でありこれからサーバー毎引き継ぐ。
  • 1年前から周辺システムはRailsで統一されつつある。
  • サイト全体を今後、継続的に開発していく予定にある。
  • お客さんの優先順位の第一位は(3)を期間内に立ち上げる事
  • (1)はクローズしてもかまわない事。
  • とは言え出来ることなら既存会員データは残したい。(俺の思惑)
  • 工期に余裕はない。(まっさらから3を作る分しかない)

みなさんなら会員データ周りをどのように設計しますか?

俺が考えた選択肢:

  1. (1)、(2)の会員テーブルを見るようにして(3)、(4)を作る。
  2. (3)、(4)ともに新規に作る(データ連携無し)
  3. (3)と(4)は同一会員データで作る(1、2との連携は無し)
  4. (3)、(4)を作った後で(1)、(2)をそれにあわせるように改修する。
  5. (3)、(4)を作った後で(1)はクローズ、(2)は改修する。
  6. 認証サーバ的なものを作る。

俺の中のSIer人格:

「お客さんから必要十分条件は提示されている。当然2だ。どんなシステムも段階的改修が可能である。ストアドプロシージャ、変換スクリプト、バッチ等で次フェーズ以降でのシステム統合を目指せばよい。」

俺の中の楽観主義者:

「5でしょ!きょうびほとんど使われて無いOpenPNE維持してもコストかさむだけでしょ!(2)をRailsで作り直して新機能を作ろう!」

俺の中の潔癖主義者:

「6が正しい。OpenIDサーバーを作り、全てのサービスを対応させる。authorizeとauthenticateは別である。」

俺の中の事無かれ主義者:

「前の会社がOpenPNEに合わせたんだから僕らも1だよ。PHPで作れば環境も合わせられるし」

まあ、おまいら(俺ら)の言い分もわかるが・・・。

DNSBLクライアントのライブラリdnsbl_clientをGithubに置きました。

komagata’s dnsbl_client at master ? GitHub

Install:

% sudo gem install komagata-dnsbl_client -s http://gems.github.com

Usage:

require 'dnsbl_client'
DNSBL::Client.new('list.dsbl.org', 'niku.2ch.net').listed? '61.211.32.39' # safe ip
=&gt; false
DNSBL::Client.new('list.dsbl.org', 'niku.2ch.net').listed? '78.157.143.202' # spam ip
=&gt; true

2chのDNSBL、BBQ用のライブラリも同梱してます。

require 'dnsbl_client'
DNSBL::BBQ.listed? '61.211.32.39' # safe ip
=&gt; false
DNSBL::BBQ.listed? '78.157.143.202' # spam ip
=&gt; true

何で作ったのか

人への嫌がらせ方法も進化したのか、「玄関前に猫の死体」から「ピザの大量注文」になり、最近では「お墓の資料の大量注文」というのもあるようです。

仕事で霊園(お墓)のサイトをやっています。そこでは、お墓を買う予定のある方が興味のある霊園(を運営する石材店)にフォームから資料請求できるようになっています。

この資料請求はお墓の購入にほとんど直結するといってもいいような確度を持つ大事なものです。(お墓は高いすからね)

普通は特定の市、区全体にカラーの広告を配布してやっと1件、2件獲得できる。それがお墓の資料請求なのです。

で、やられました。お墓の資料の大量注文。オープンプロクシ経由でゲイバーに。

そのプロクシ:

% nmap xxx.xxx.xxx.xxx
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2008-09-20 20:41 JST
Interesting ports on xxx.xxx.xxx.xxx:
Not shown: 1655 closed ports
PORT     STATE    SERVICE
21/tcp   open     ftp
53/tcp   open     domain
80/tcp   open     http
88/tcp   open     kerberos-sec
135/tcp  open     msrpc
139/tcp  open     netbios-ssn
157/tcp  open     knet-cmp
179/tcp  filtered bgp
389/tcp  open     ldap
445/tcp  open     microsoft-ds
464/tcp  open     kpasswd5
554/tcp  filtered rtsp
593/tcp  open     http-rpc-epmap
636/tcp  open     ldapssl
1026/tcp open     LSA-or-nterm
1027/tcp open     IIS
1050/tcp open     java-or-OTGfileshare
1720/tcp filtered H.323/Q.931
1723/tcp open     pptp
1755/tcp filtered wms
3268/tcp open     globalcatLDAP
3269/tcp open     globalcatLDAPssl
7070/tcp filtered realserver
8080/tcp open     http-proxy
8443/tcp open     https-alt
Nmap finished: 1 IP address (1 host up) scanned in 65.058 seconds

Windowsなのでスパムメールより主にプロクシとして日本から便利に活用されてるホストみたいです。

追跡を断念して今後の予防策を調べてみたところ、知ったのが2chで使っているDNS BlacklistのBBQです。

DNSBLはスパムメール対策としてよく使われるみたいですが、スパムメール対策としては効果は微妙なようです。ですが、BBSやコメントスパム対策にはかなり効果がありそうです。

荒らしの総本山といえる2chのデータを元にメンテナンスされているBBQのブラックリストは日本で使うには一番の品質なんじゃないでしょうか。実際、上記のプロクシのIPも登録されています。

実装の方は、Apacheで直接DNSBLを使えるモジュールもありますが、完全に弾くだけでなく、どこかに退避させたりしたいのでアプリの中から使いたいところです。PHPではPEARにNet_DNSBLというライブラリがあるみたいです。Rubyで見当たらなかったので作ってみたというわけです。

まだテストもなくしょぼいコードなので何かあったらご指摘(もしくはpush)いただければと思います。

参照:

土曜日に初台のMacでkawaduともくもく会しました。

最近のMacは電源あるのか。

kawaduは何のネット接続環境も無いので来た時点で終了。俺はある程度コード書いたところでkawaduが酒が飲みたくて落ち着かなくなってきたのでもくもく会終了。

飲んでた時間の方が多かった。

kawaduが新入社員のメンターになったというので、フルメタルジャケットみたいな開発チームがあったら生産性はどうなのかという話をした。

メンター:「貴様らは蛆虫だ!地球上で最下等の生命体だ!」

*パソコンを持って毎日10kmのランニング

メンター:「貴様らの恋人はそのパソコンだけだ!」

*パソコンを毎日分解し、磨かせる

メンター:「なんだこのメソッドは!まるでそびえ立つ糞だ!」

メンター:「俺がこの世でただ一つ我慢できんのは―――閉じタグ(php?>)後の改行だ!」

メンター:「豚娘はプログラミングを愛しているか?」

新人:「生涯忠誠!命懸けて!闘魂!闘魂!闘魂!(Gung ho, gung ho, gung ho!)」

メンター:「草を育てるものは?」

新人:「コード!コード!コード!」

メンター:「おれたちの商売は何だ、お嬢様?」

新人:「コーディング!コーディング!コーディング!」

メンター: 「本日をもって貴様らはウジ虫を卒業する 本日から貴様らはプログラマーである 兄弟の絆に結ばれる 貴様らのくたばるその日まで どこにいようとプログラマーは貴様らの兄弟だ 多くはデスマへ向かう ある者は二度と戻らない だが肝に銘じておけ プログラマーは死ぬ 死ぬために我々は存在する だがプログラマーは永遠である つまり―――貴様らも永遠である!」

Game*Spark – : 1992年にGameProが配った『ストリートファイター』バレンタインデーカードが酷い件 by RIKUSYO

人気格闘ゲーム、ストリートファイターのキャラクターが描かれたバレンタインデーカードなのですが、このキャラクターの絵がとんでもない代物でした。

e-honda

92年に送られてきたらたしかにショックだけど、カッコいいなw。

freenodeにrails-tokyoチャネルを作りました

ということで、irc.freenode.netに#rails-tokyoチャネルを作ってみました。

ッザース!

早速JOINして下らない質問をしてみたところ、すぐ回答してもらえました。良い人だー!

質問:「sessionって普通どう消してますか?」

答え:「DBの場合はcronとかで普通に消すとのこと。」

14日前までのは消して、ついでにOPTIMIZEというのを用意してこれをcronで回すことにします。

script/dbmaintenance:

#!/usr/bin/env ruby
RAILS_ENV ||= "production" 
require File.dirname(__FILE__) + '/../config/boot'
require RAILS_ROOT + '/config/environment'

con = ActiveRecord::Base.connection
con.execute "DELETE FROM sessions WHERE updated_at &lt; '#{14.days.ago.to_s(:db)}'" 
con.tables.each do |table|
  con.execute "OPTIMIZE TABLE #{table}" 
end

現行アプリだとショッピングカートみたいのがあるので結構溜まってました。

PHPだと言語自体にsession gcがあるからそういうのがあるのかと勘違いしてました。でもPHPのDebianパッケージ版はsession gc切ってcronで消してたから特に違和感は無いですね。

restful_authenticationだとsessionが使わないから不要?キャッシュ用途だとDBじゃ遅いから意味ないのかな。