6月10日

2011/6/10作成

アメリカの作曲家とだという「デイヴィッド・マスランカ」の記事が定義文なしで削除依頼に回っていたので、英語版を元に少し加筆してみる。ほんとは英語版を翻訳すればいいんだけど、英語版の記事はどうも情緒的な文章な気がするので、そのまま翻訳してもってきたら日本語版では削除されそうな気がしてやめておく。

昨日の「ジンガ」について、改名提案の修正対応。審議期間も今日から一週間に延長。

jawptool。文字実体参照の変換テーブルを作成。数がいっぱいあって面倒で大変。でもなんとか完成。ぜいぜい。昨日抽出した実体参照の使用データに適用してみると、まあいい感じ。&A;とかは誤記と思われるので無視しても構わんだろう。CGI.pmのunescapeHTML()みたいに、&と;だけを除去なんてことをしないからテキストを破壊することもないし。

ちなみに、変換テーブルはこんなのになりました。

my %table = (
    # マークアップ
    '&quot;'=>'"', '&lt;'=>'<', '&gt;'=>'>',
    # ISO-8859-1 ラテン
    '&nbsp;'=>' ', '&iexcl;'=>'?', '&cent;'=>'?', '&pound;'=>'?', '&curren;'=>'?', '&yen;'=>'\\', '&brvbar;'=>'?', '&sect;'=>'§', '&uml;'=>'¨', '&copy;'=>'?', '&ordf;'=>'?', '&laquo;'=>'?', '&not;'=>'?', '&shy;'=>'?', '&reg;'=>'?', '&macr;'=>'?', '&deg;'=>'°', '&plusmn;'=>'±', '&sup2;'=>'?', '&sup3;'=>'?', '&acute;'=>'´', '&micro;'=>'?', '&para;'=>'¶', '&middot;'=>'?', '&cedil;'=>'?', '&sup1;'=>'?', '&ordm;'=>'?', '&raquo;'=>'?', '&frac14;'=>'?', '&frac12;'=>'?', '&frac34;'=>'?', '&iquest;'=>'?', '&Agrave;'=>'?', '&Aacute;'=>'?', '&Acirc;'=>'?', '&Atilde;'=>'?', '&Auml;'=>'?', '&Aring;'=>'?', '&AElig;'=>'?', '&Ccedil;'=>'?', '&Egrave;'=>'?', '&Eacute;'=>'?', '&Ecirc;'=>'?', '&Euml;'=>'?', '&Igrave;'=>'?', '&Iacute;'=>'?', '&Icirc;'=>'?', '&Iuml;'=>'?', '&ETH;'=>'?', '&Ntilde;'=>'?', '&Ograve;'=>'?', '&Oacute;'=>'?', '&Ocirc;'=>'?', '&Otilde;'=>'?', '&Ouml;'=>'?', '&times;'=>'×', '&Oslash;'=>'?', '&Ugrave;'=>'?', '&Uacute;'=>'?', '&Ucirc;'=>'?', '&Uuml;'=>'?', '&Yacute;'=>'?', '&THORN;'=>'?', '&szlig;'=>'?', '&agrave;'=>'?', '&aacute;'=>'?', '&acirc;'=>'?', '&atilde;'=>'?', '&auml;'=>'?', '&aring;'=>'?', '&aelig;'=>'?', '&ccedil;'=>'?', '&egrave;'=>'?', '&eacute;'=>'?', '&ecirc;'=>'?', '&euml;'=>'?', '&igrave;'=>'?', '&iacute;'=>'?', '&icirc;'=>'?', '&iuml;'=>'?', '&eth;'=>'?', '&ntilde;'=>'?', '&ograve;'=>'?', '&oacute;'=>'?', '&ocirc;'=>'?', '&otilde;'=>'?', '&ouml;'=>'?', '&divide;'=>'÷', '&oslash;'=>'?', '&ugrave;'=>'?', '&uacute;'=>'?', '&ucirc;'=>'?', '&uuml;'=>'?', '&yacute;'=>'?', '&thorn;'=>'?', '&yuml;'=>'?',
    # ラテン拡張
    '&OElig;'=>'?', '&oelig;'=>'?', '&Scaron;'=>'?', '&scaron;'=>'?', '&Yuml;'=>'?', '&circ;'=>'?', '&tilde;'=>'?', '&fnof;'=>'?',
    # ギリシア文字
    '&Alpha;'=>'Α', '&Beta;'=>'Β', '&Gamma;'=>'Γ', '&Delta;'=>'Δ', '&Epsilon;'=>'Ε', '&Zeta;'=>'Ζ', '&Eta;'=>'Η', '&Theta;'=>'Θ', '&Iota;'=>'Ι', '&Kappa;'=>'Κ', '&Lambda;'=>'Λ', '&Mu;'=>'Μ', '&Nu;'=>'Ν', '&Xi;'=>'Ξ', '&Omicron;'=>'Ο', '&Pi;'=>'Π', '&Rho;'=>'Ρ', '&Sigma;'=>'Σ', '&Tau;'=>'Τ', '&Upsilon;'=>'Υ', '&Phi;'=>'Φ', '&Chi;'=>'Χ', '&Psi;'=>'Ψ', '&Omega;'=>'Ω', '&alpha;'=>'α', '&beta;'=>'β', '&gamma;'=>'γ', '&delta;'=>'δ', '&epsilon;'=>'ε', '&zeta;'=>'ζ', '&eta;'=>'η', '&theta;'=>'θ', '&iota;'=>'ι', '&kappa;'=>'κ', '&lambda;'=>'λ', '&mu;'=>'μ', '&nu;'=>'ν', '&xi;'=>'ξ', '&omicron;'=>'ο', '&pi;'=>'π', '&rho;'=>'ρ', '&sigmaf;'=>'?', '&sigma;'=>'σ', '&tau;'=>'τ', '&upsilon;'=>'υ', '&phi;'=>'φ', '&chi;'=>'χ', '&psi;'=>'ψ', '&omega;'=>'ω', '&thetasym;'=>'?', '&upsih;'=>'?', '&piv;'=>'?',
    # 一般記号と国際化用の制御文字
    '&ensp;'=>'?', '&emsp;'=>'?', '&thinsp;'=>'?', '&zwnj;'=>'?', '&zwj;'=>'?', '&lrm;'=>'?', '&rlm;'=>'?', '&ndash;'=>'?', '&mdash;'=>'―', '&lsquo;'=>'‘', '&rsquo;'=>'’', '&sbquo;'=>'?', '&ldquo;'=>'“', '&rdquo;'=>'”', '&bdquo;'=>'?', '&dagger;'=>'†', '&Dagger;'=>'‡', '&bull;'=>'?', '&hellip;'=>'…', '&permil;'=>'‰', '&prime;'=>'′', '&Prime;'=>'″', '&lsaquo;'=>'?', '&rsaquo;'=>'?', '&oline;'=>'~', '&frasl;'=>'?', '&euro;'=>'?', '&image;'=>'?', '&ewierp;'=>'?', '&real;'=>'?', '&trade;'=>'?', '&alefsym;'=>'?', '&larr;'=>'←', '&uarr;'=>'↑', '&rarr;'=>'→', '&darr;'=>'↓', '&harr;'=>'?', '&crarr;'=>'?', '&lArr;'=>'?', '&uArr;'=>'?', '&rArr;'=>'⇒', '&dArr;'=>'?', '&hArr;'=>'⇔',
    # 数学記号
    '&forall;'=>'∀', '&part;'=>'∂', '&exist;'=>'∃', '&empty;'=>'?', '&nabla;'=>'∇', '&isin;'=>'∈', '&notin;'=>'?', '&ni;'=>'∋', '&prod;'=>'?', '&sum;'=>'?', '&minus;'=>'?', '&lowast;'=>'?', '&radic;'=>'√', '&prop;'=>'∝', '&infin;'=>'∞', '&ang;'=>'∠', '&and;'=>'∧', '&or;'=>'∨', '&cap;'=>'∩', '&cup;'=>'∪', '&int;'=>'∫', '&there4;'=>'∴', '&sim;'=>'?', '&cong;'=>'?', '&asymp;'=>'?', '&ne;'=>'≠', '&equiv;'=>'≡', '&le;'=>'?', '&ge;'=>'?', '&sub;'=>'⊂', '&sup;'=>'⊃', '&nsub;'=>'?', '&sube;'=>'⊆', '&supe;'=>'⊇', '&oplus;'=>'?', '&otimes;'=>'?', '&perp;'=>'⊥', '&sdot;'=>'?',
    # シンボル
    '&lceil;'=>'?', '&rceil;'=>'?', '&lfloor;'=>'?', '&rfloor;'=>'?', '&lang;'=>'?', '&rang;'=>'?', '&loz;'=>'?', '&spades;'=>'?', '&clubs;'=>'?', '&hearts;'=>'?', '&diams;'=>'?'
);

&amp;がないけど、これは最初に変換しないといけないので、特殊ケースとして除外。

ということで、本番データで集計テストをしてみるんだけど、すげえ遅くなってる。これは、明らかに実体参照の変換に時間が掛かってるんだな。テストのときは処理を外そうか。というか、文字列に&が含まれてなかったらスルーするようにすればいいのか。そうだな。それが当たり前だよな。そんな当然のことすら、やってみないとわからないというのが、私の頭の悪いところだよな。

それでも遅いので、ループ回して処理していたのを、逆転させて正規表現でそれっぽいパターンをテーブルからひいてみるという処理に変更。ちなみに最初に書いたのはこんなコード。

foreach( keys %table ) {
    $text =~ s/$_/$table{$_}/g;
}

これを

$text =~ s/(&\w+;)/defined($table{$1}) ? $table{$1} : $1/eg;

というのに変えました。つか、それってlintのときに高速化に使ったテクニックそのままやん。これでようやく修正前くらいの速度にまで戻った。ああ、半日無駄にした。それにしてもアホすぎる。

それでなんとか出来上がったレポートを眺めてみる。うーん、URLエンコードされたデータがあるなぁ。これもデコードしてやらないかんか。また処理が重くなる。

あと、集計値が0になってしまうバグがあったんで修正したけど、修正をミスってプログラムが途中終了するようになってしまった。なかなか原因が見つけられなかったけど、変数を壊しているところをなんとか発見して修正。ぜいぜい。ということで再集計。

管理者の信任投票が始まったな。最初の方の人はもっと前に始まってるんだけど。で、15歳さんは反対意見が今のところ多い。うーん、そうなるか。質疑応答を見てる限り、私は問題ないと思うんだけどなぁ。ただ、編集歴が少なく、どのような人か判断がつかないというコメントはごもっとも。

集計結果が出た。チェックしてみると、だいぶいい感じ。疑問の残る部分もなくはないが、現状で公開してもさほど問題のない結果を得られたのではないだろうか。ただ、URLデコードは失敗してるようなので、そこは要修正。


あおやぎのさいと2.0 新人うぃきめでぃあん日記