久々にはてなキーワードの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(/&/, '&').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