久々にはてなキーワードのSKK辞書を作ってみる - 問題解決

はてなキーワードのSKK辞書を作ってみる - http://rubikitch.com/に移転しました

久々にはてなキーワードSKK辞書を更新しようとしたが問題が起きてしまった。
とりあえず、元スクリプトが更新されていたので更新。で、その通りにやってみたのだが、skkdic-expr2がsegmentation falut起こしてしまった。

[2009/10/27]追記:元スクリプトに変更点が取り込まれた。

wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
ruby keywordlist_furigana2skkdic.rb keywordlist_furigana.csv > tmp.skkdic
skkdic-expr2 -o keywordlist_furigana.skkdic tmp.skkdic

とりあえずgdbを起動。

$ gdb ~/compile/skk/tools/skkdic-expr2 
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb) run -o SKK-JISYO.hatena tmp.skkdic
Starting program: /m/log/compile/skk/tools/skkdic-expr2 -o SKK-JISYO.hatena tmp.skkdic

Program received signal SIGSEGV, Segmentation fault.
processFileAux (fp=0x92501f0) at ./skkdic-expr2.c:266
266					while(*q != ']') {
(gdb) bt
#0  processFileAux (fp=0x92501f0) at ./skkdic-expr2.c:266
#1  0x08049079 in processFile (filename=0xbfc64452 "tmp.skkdic")
    at ./skkdic-expr2.c:371
#2  0x0804935b in main (argc=4, argv=0xbfc63e34) at ./skkdic-expr2.c:379
(gdb) quit

「]」の文字を処理するところで詰まっている。枯れているプログラムなので、プログラムのバグというよりも、入力データが不正だろう。おそらく、 tmp.skkdic で変な場所に「]」が含まれているのだろう。そして、その予想は正しかった。

余計な「[]」を取り除くようにkeywordlist_furigana2skkdic.rbを修正。

#!/usr/local/bin/ruby -Ke
# -*- coding: euc-jp -*-
# はてなダイアリーキーワードふりがなリストをSKKの辞書に変換
#
# 使い方:
#  wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
#  ruby keywordlist_furigana2skkdic.rb keywordlist_furigana.csv > tmp.skkdic
#  skkdic-expr2 -o keywordlist_furigana.skkdic tmp.skkdic
#
# 同一の読みをまとめたりはしていないので、一度skkdic-expr2を通してください。

require 'nkf'

class String
  # borrowed from http://openlab.jp/skk/skk/tools/filters/skkdictools.rb
  def concatify
    #if !(/^([-\w]+.*)$/ =~ self) && (/[;\r\n\/\"]/ =~ self)
    # []の処理をしないとskkdic-expr2がSEGVる。
    if /[\[\];\r\n\/\"]/ =~ self
      tmp = self.gsub(/;/, '\\\073').gsub(/\//, '\\\057').gsub(/\r/, '\\r').gsub(/\n/, '\\n').gsub(/"/, '\\"').gsub(/[\[\]]/, '')
      return '(concat "' + tmp + '")'
    else
      return self
    end
  end
end

# http://d.hatena.ne.jp/hatenadiary/20060922/1158908401
# http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
ARGF.each do |line|
  line.chomp!
  furigana, keyword = line.split(/\t/, 2)
  if furigana.empty?
    next # ふりがながないキーワードを無視
  end
  if furigana == keyword
    next # ひらがなだけのキーワードを無視
  end
  if furigana == NKF.nkf('-Ee -m0 --hiragana', keyword)
    next # カタカナ語は無視
  end
  puts "#{furigana} /#{keyword.gsub(/&amp;/, '&').concatify}/"
end

前回 16068187 バイトだった俺辞書が 17192607 バイトに増量。約1MB増。

-rw-r--r-- 1 rubikitch users 17192607 2009-10-22 13:28 SKK-JISYO.my
-rw-r--r-- 1 rubikitch users 28830176 2009-10-22 13:28 SKK-JISYO.my.cdb