sekka 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/sekka-jisyo +51 -15
- data/bin/sekka-server +72 -17
- data/emacs/sekka.el +23 -1
- data/lib/sekka/jisyo-db.nnd +43 -5
- data/lib/sekka/kvs.rb +36 -7
- data/lib/sekka/sekkaversion.rb +1 -2
- data/lib/sekkaconfig.rb +6 -1
- data/lib/sekkaserver.rb +3 -1
- data/test/henkan-main.nnd +52 -30
- metadata +46 -18
data/bin/sekka-jisyo
CHANGED
@@ -65,23 +65,47 @@ core.evalStr( <<";;END-OF-SCRIPT" )
|
|
65
65
|
(dump-sekka-jisyo-f STDOUT sekka-file))
|
66
66
|
|
67
67
|
|
68
|
+
(define (restore-sekka-jisyo tsv-file target)
|
69
|
+
(with-open
|
70
|
+
tsv-file
|
71
|
+
(lambda (f)
|
72
|
+
(restore-sekka-jisyo-f
|
73
|
+
f
|
74
|
+
target))))
|
75
|
+
|
76
|
+
|
68
77
|
(define (display-help)
|
69
78
|
(print "Usage : ")
|
70
|
-
(print " sekka-jisyo convert
|
71
|
-
(print " sekka-jisyo load
|
72
|
-
(print " sekka-jisyo load
|
73
|
-
(print " sekka-jisyo
|
74
|
-
(print " sekka-jisyo
|
79
|
+
(print " sekka-jisyo convert SKK-JISYO.X > SEKKA-JISYO.X ... output SEKKA-JISYO to STDOUT")
|
80
|
+
(print " sekka-jisyo load SEKKA-JISYO.X SEKKA-JISYO.X.tch ... load SEKKA-JISYO to Tokyo Cabinet DB")
|
81
|
+
(print " sekka-jisyo load SEKKA-JISYO.X SEKKA-JISYO.X.db ... load SEKKA-JISYO to ndbm DB")
|
82
|
+
(print " sekka-jisyo load SEKKA-JISYO.X redis:[hostname] ... load SEKKA-JISYO to redis DB on [hostname]")
|
83
|
+
(print " sekka-jisyo load SEKKA-JISYO.X redis: ... load SEKKA-JISYO to redis DB on localhost")
|
84
|
+
(print " sekka-jisyo dump SEKKA-JISYO.X.tch ... dump Tokyo Cabinet DB to DUMPDATA(STDOUT)")
|
85
|
+
(print " sekka-jisyo dump SEKKA-JISYO.X.db ... dump ndbm to DUMPDATA(STDOUT)")
|
86
|
+
(print " sekka-jisyo dump redis:[hostname] ... dump redis DB on [hostname] to DUMPDATA(STDOUT)")
|
87
|
+
(print " sekka-jisyo dump redis: ... dump redis DB on localhost to DUMPDATE(STDOUT)")
|
88
|
+
(print " sekka-jisyo restore SEKKA-JISYO.X.tsv redis:[hostname] ... restore redis DB on [hostname] from tsv-file")
|
89
|
+
(print " sekka-jisyo restore SEKKA-JISYO.X.tsv redis: ... restore redis DB on localhost from tsv-file"))
|
90
|
+
|
75
91
|
|
76
92
|
(define (analyze-kvs-type filename)
|
77
93
|
(cond
|
78
94
|
((rxmatch #/[.]tch$/ filename)
|
79
|
-
'tokyocabinet)
|
95
|
+
(values 'tokyocabinet filename))
|
80
96
|
((rxmatch #/[.]db$/ filename)
|
81
|
-
'dbm)
|
97
|
+
(values 'dbm filename))
|
98
|
+
((rxmatch #/^redis:(.*)$/ filename)
|
99
|
+
=> (lambda (m)
|
100
|
+
(let1 str (rxmatch-substring m 1)
|
101
|
+
(let1 hostname (if (< 0 (str.size))
|
102
|
+
str
|
103
|
+
"localhost")
|
104
|
+
(values 'redis hostname)))))
|
82
105
|
(else
|
83
106
|
(errorf "Error: analyze-kvs-type() got unsupported filename [%s] \n" filename))))
|
84
107
|
|
108
|
+
|
85
109
|
(define (main argv)
|
86
110
|
(cond
|
87
111
|
((= 0 (length argv))
|
@@ -95,16 +119,28 @@ core.evalStr( <<";;END-OF-SCRIPT" )
|
|
95
119
|
(convert-skk-jisyo (second argv))))
|
96
120
|
((eq? 'load command)
|
97
121
|
(let1 filename (third argv)
|
98
|
-
(
|
99
|
-
|
100
|
-
|
101
|
-
|
122
|
+
(receive (type param)
|
123
|
+
(analyze-kvs-type filename)
|
124
|
+
(set-kvs-type type)
|
125
|
+
(if (< (length argv) 3)
|
126
|
+
(display-help)
|
127
|
+
(load-sekka-jisyo (second argv) param)))))
|
102
128
|
((eq? 'dump command)
|
103
129
|
(let1 filename (second argv)
|
104
|
-
(
|
105
|
-
|
106
|
-
|
107
|
-
|
130
|
+
(receive (type param)
|
131
|
+
(analyze-kvs-type filename)
|
132
|
+
(set-kvs-type type)
|
133
|
+
(if (< (length argv) 2)
|
134
|
+
(display-help)
|
135
|
+
(dump-sekka-jisyo param)))))
|
136
|
+
((eq? 'restore command)
|
137
|
+
(if (< (length argv) 3)
|
138
|
+
(display-help)
|
139
|
+
(let1 target (third argv)
|
140
|
+
(receive (type hostname)
|
141
|
+
(analyze-kvs-type target)
|
142
|
+
(set-kvs-type type)
|
143
|
+
(restore-sekka-jisyo (second argv) hostname)))))
|
108
144
|
(else
|
109
145
|
(errorf "Error: no such command [%s] \n" command )))))))
|
110
146
|
|
data/bin/sekka-server
CHANGED
@@ -27,6 +27,26 @@ TC_FILE_LIST = [ DICTDIR + "/SEKKA-JISYO.CUSTOM.tch",
|
|
27
27
|
|
28
28
|
MEMCACHED = "localhost:11211" # memcahced
|
29
29
|
|
30
|
+
def getSekkaDbInfo( env )
|
31
|
+
if env.has_key?( 'SEKKA_DB' )
|
32
|
+
m = env['SEKKA_DB'].match( /^redis:(.*)$/ )
|
33
|
+
if m
|
34
|
+
dictSource = if 0 == m[1].size
|
35
|
+
dictSource = "localhost"
|
36
|
+
else
|
37
|
+
dictSource = m[1]
|
38
|
+
end
|
39
|
+
[ :redis, dictSource ]
|
40
|
+
elsif m = ENV['SEKKA_DB'].match( /^tokyo[a-z]+$/ )
|
41
|
+
[ :tokyocabinet, nil ]
|
42
|
+
else
|
43
|
+
raise RuntimeError, "Error: env var SEKKA_DB requires [redis:hostname] or [redis:] or [tokyocabinet]"
|
44
|
+
end
|
45
|
+
else
|
46
|
+
[ :tokyocabinet, nil ]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
30
50
|
|
31
51
|
def main
|
32
52
|
if not File.directory?( DICTDIR )
|
@@ -48,7 +68,7 @@ def main
|
|
48
68
|
proxyHost = uri.host
|
49
69
|
end
|
50
70
|
|
51
|
-
if not File.exist?(
|
71
|
+
if not File.exist?( TSVFILE )
|
52
72
|
STDERR.printf( "Info: Downloading SEKKA-JISYO\n" )
|
53
73
|
# 辞書をダウンロードする
|
54
74
|
cmd = sprintf( "curl -o %s %s", TSVFILE, TSVURL )
|
@@ -76,26 +96,61 @@ def main
|
|
76
96
|
exit( 1 )
|
77
97
|
end
|
78
98
|
}
|
79
|
-
|
80
|
-
# tsvファイルをTokyo CabinetのHashDB化する
|
81
|
-
STDERR.printf( "Info: Converting TSV file to Tokyo Cabinet *.tch\n" )
|
82
|
-
cmd = sprintf( "tchmgr importtsv %s %s", TC_FILE, TSVFILE )
|
83
|
-
STDERR.printf( "Command : %s\n", cmd )
|
84
|
-
system( cmd )
|
85
|
-
|
86
|
-
# 中身を確認する(tchmgrで読めるものができている)
|
87
|
-
STDERR.printf( "Info: inform *.tch\n" )
|
88
|
-
cmd = sprintf( "tchmgr inform %s", TC_FILE )
|
89
|
-
STDERR.printf( "Command : %s\n", cmd )
|
90
|
-
system( cmd )
|
91
|
-
|
92
99
|
end
|
93
100
|
|
94
|
-
#
|
95
|
-
|
101
|
+
# 環境変数から、DBの接続先情報を取得する。
|
102
|
+
( dictType, dictSource ) = getSekkaDbInfo( ENV )
|
103
|
+
|
104
|
+
case dictType
|
105
|
+
when :tokyocabinet
|
106
|
+
# .tchファイルが存在すうるか調べる
|
107
|
+
list = TC_FILE_LIST.select { |name| File.exist?( name ) }
|
108
|
+
|
109
|
+
if 0 == list.size
|
110
|
+
# tsvファイルをTokyo CabinetのHashDB化する
|
111
|
+
STDERR.printf( "Info: Converting TSV file to Tokyo Cabinet *.tch\n" )
|
112
|
+
cmd = sprintf( "tchmgr importtsv %s %s", TC_FILE, TSVFILE )
|
113
|
+
STDERR.printf( "Command : %s\n", cmd )
|
114
|
+
system( cmd )
|
115
|
+
|
116
|
+
# 中身を確認する(tchmgrで読めるものができている)
|
117
|
+
STDERR.printf( "Info: inform *.tch\n" )
|
118
|
+
cmd = sprintf( "tchmgr inform %s", TC_FILE )
|
119
|
+
STDERR.printf( "Command : %s\n", cmd )
|
120
|
+
system( cmd )
|
121
|
+
end
|
122
|
+
|
123
|
+
# 存在する.tchファイルの中で一番最初のファイルを使う。
|
124
|
+
list = TC_FILE_LIST.select { |name| File.exist?( name ) }
|
125
|
+
dictSource = list[0]
|
126
|
+
when :redis
|
127
|
+
key = "SEKKA::VERSION"
|
128
|
+
# redisサーバーに辞書が投入済みか確認する
|
129
|
+
STDERR.printf( "Info: Checking SEKKA jisyo on redis server...\n" )
|
130
|
+
require 'redis'
|
131
|
+
require 'sekka/kvs'
|
132
|
+
redis = Kvs.new( :redis )
|
133
|
+
begin
|
134
|
+
redis.open( dictSource )
|
135
|
+
result = redis.get( key )
|
136
|
+
rescue => e
|
137
|
+
STDERR.printf( "Error: sekka-server can't connect to redis(port=%s)...\n", dictSource )
|
138
|
+
exit 1
|
139
|
+
end
|
140
|
+
unless result
|
141
|
+
# tsvファイルをuploadする。
|
142
|
+
STDERR.printf( "Info: Uploading...\n" )
|
143
|
+
cmd = sprintf( "sekka-jisyo restore %s %s:%s", TSVFILE, dictType, dictSource )
|
144
|
+
STDERR.printf( "Command : %s\n", cmd )
|
145
|
+
system( cmd )
|
146
|
+
end
|
147
|
+
STDERR.printf( "Info: [OK]\n" )
|
148
|
+
else
|
149
|
+
raise RuntimeError, sprintf( "Error: unknown dictType [%s]", dictType )
|
150
|
+
end
|
96
151
|
|
97
152
|
# 設定項目をConfigオブジェクトに代入
|
98
|
-
SekkaServer::Config.setup(
|
153
|
+
SekkaServer::Config.setup( dictType, dictSource, MEMCACHED, 12929, proxyHost, proxyPort )
|
99
154
|
|
100
155
|
# サーバースクリプトのrootディレクトリへ移動
|
101
156
|
FileUtils.cd(File.dirname(__FILE__) + "/../")
|
data/emacs/sekka.el
CHANGED
@@ -109,6 +109,11 @@ non-nil で明示的に呼びだすまでGoogleIMEは起動しない。"
|
|
109
109
|
:type 'boolean
|
110
110
|
:group 'sekka)
|
111
111
|
|
112
|
+
(defcustom sekka-muhenkan-key "q"
|
113
|
+
"*Non-nil であれば、リアルタイムガイド表示中はqキーで無変換のままスペースを挿入する。q以外のキーも設定可能。
|
114
|
+
但し、アルファベットのようにバッファにinsert可能な文字のみ設定可能。"
|
115
|
+
:type 'string
|
116
|
+
:group 'sekka)
|
112
117
|
|
113
118
|
|
114
119
|
(defface sekka-guide-face
|
@@ -1359,6 +1364,21 @@ non-nil で明示的に呼びだすまでGoogleIMEは起動しない。"
|
|
1359
1364
|
(sekka-insert-space arg))))))
|
1360
1365
|
|
1361
1366
|
|
1367
|
+
(defun sekka-muhenkan-key-init-function ()
|
1368
|
+
(define-key global-map sekka-muhenkan-key
|
1369
|
+
'(lambda (&optional arg)(interactive "P")
|
1370
|
+
(if (< 0 sekka-timer-rest)
|
1371
|
+
;; qキーで無変換+スペースを入力する
|
1372
|
+
(cond
|
1373
|
+
((string= " " (char-to-string (preceding-char)))
|
1374
|
+
;; 2回目のキー入力で本来のsekka-muhenkan-keyで定義された文字を挿入する
|
1375
|
+
(insert sekka-muhenkan-key))
|
1376
|
+
(t
|
1377
|
+
;; 無変換で進むために、スペースを開ける。
|
1378
|
+
(sekka-insert-space 1)))
|
1379
|
+
(insert sekka-muhenkan-key)))))
|
1380
|
+
|
1381
|
+
|
1362
1382
|
(defun sekka-realtime-guide ()
|
1363
1383
|
"リアルタイムで変換中のガイドを出す
|
1364
1384
|
sekka-modeがONの間中呼び出される可能性がある。"
|
@@ -1484,6 +1504,8 @@ point から行頭方向に同種の文字列が続く間を漢字変換しま
|
|
1484
1504
|
(add-hook 'sekka-mode-hook 'sekka-sticky-shift-init-function))
|
1485
1505
|
|
1486
1506
|
(add-hook 'sekka-mode-hook 'sekka-spacekey-init-function)
|
1507
|
+
(when sekka-muhenkan-key
|
1508
|
+
(add-hook 'sekka-mode-hook 'sekka-muhenkan-key-init-function))
|
1487
1509
|
|
1488
1510
|
(when sekka-mode (run-hooks 'sekka-mode-hook))
|
1489
1511
|
|
@@ -1530,7 +1552,7 @@ point から行頭方向に同種の文字列が続く間を漢字変換しま
|
|
1530
1552
|
(setq default-input-method "japanese-sekka")
|
1531
1553
|
|
1532
1554
|
(defconst sekka-version
|
1533
|
-
"0.9.
|
1555
|
+
"0.9.2" ;;SEKKA-VERSION
|
1534
1556
|
)
|
1535
1557
|
(defun sekka-version (&optional arg)
|
1536
1558
|
"入力モード変更"
|
data/lib/sekka/jisyo-db.nnd
CHANGED
@@ -34,11 +34,14 @@
|
|
34
34
|
;;; $Id:
|
35
35
|
;;;
|
36
36
|
(use srfi-1)
|
37
|
+
(require "progressbar")
|
37
38
|
(require "sekka/kvs")
|
39
|
+
(require "sekka/sekkaversion")
|
38
40
|
(use sekka.util)
|
39
41
|
|
40
|
-
(define masterid
|
41
|
-
(define workid
|
42
|
+
(define masterid "MASTER")
|
43
|
+
(define workid "WORK")
|
44
|
+
(define versionid "SEKKA::VERSION")
|
42
45
|
|
43
46
|
(define alphabet-string "abcdefghijklmnopqrstuvwxyz>@;#")
|
44
47
|
(define alphabet-lower-list (to-list (alphabet-string.split "")))
|
@@ -177,6 +180,7 @@
|
|
177
180
|
(kvs.clear)
|
178
181
|
(create-keylist kvs f)
|
179
182
|
(setup-ready-made-keylist kvs keylist)
|
183
|
+
(kvs.put! versionid SekkaVersion.version)
|
180
184
|
(kvs.close)))
|
181
185
|
|
182
186
|
|
@@ -190,9 +194,43 @@
|
|
190
194
|
(kvs.close)))
|
191
195
|
|
192
196
|
|
193
|
-
|
194
|
-
|
195
|
-
|
197
|
+
|
198
|
+
(define (restore-sekka-jisyo-f f filename-or-hostname)
|
199
|
+
(define (file-length f)
|
200
|
+
(let1 total 0
|
201
|
+
(for-each
|
202
|
+
(lambda (x)
|
203
|
+
(set! total (+ 1 total)))
|
204
|
+
f)
|
205
|
+
(f.rewind)
|
206
|
+
total))
|
207
|
+
|
208
|
+
(define (restore f kvs progress)
|
209
|
+
(let loop ([line (f.readline.chomp)])
|
210
|
+
(let* (
|
211
|
+
[key-value
|
212
|
+
(to-list (line.split #/[\t]+/))]
|
213
|
+
[key (first key-value)]
|
214
|
+
[value (if (> 2 (length key-value))
|
215
|
+
""
|
216
|
+
(second key-value))])
|
217
|
+
(kvs.put! key value)
|
218
|
+
(progress.inc))
|
219
|
+
(when (not (f.eof))
|
220
|
+
(loop (f.readline.chomp)))))
|
221
|
+
|
222
|
+
|
223
|
+
(let1 total (file-length f)
|
224
|
+
(let ([kvs (Kvs.new (get-kvs-type))]
|
225
|
+
[progress (ProgressBar.new "Restore" total STDERR)])
|
226
|
+
(kvs.open filename-or-hostname)
|
227
|
+
(kvs.clear)
|
228
|
+
(restore f kvs progress)
|
229
|
+
(kvs.close))))
|
230
|
+
|
231
|
+
|
232
|
+
(define (openSekkaJisyo dictType dictSource cacheSource)
|
233
|
+
(set-kvs-type dictType)
|
196
234
|
(let1 kvs (Kvs.new (get-kvs-type))
|
197
235
|
(kvs.open #?=dictSource)
|
198
236
|
(let1 cachesv (if cacheSource
|
data/lib/sekka/kvs.rb
CHANGED
@@ -42,6 +42,13 @@ class Kvs
|
|
42
42
|
@tcFlag = false
|
43
43
|
end
|
44
44
|
|
45
|
+
@redisFlag = true
|
46
|
+
begin
|
47
|
+
require 'redis'
|
48
|
+
rescue LoadError
|
49
|
+
@redisFlag = false
|
50
|
+
end
|
51
|
+
|
45
52
|
@dbmFlag = true
|
46
53
|
begin
|
47
54
|
require 'dbm'
|
@@ -58,6 +65,11 @@ class Kvs
|
|
58
65
|
raise RuntimeError, "Kvs.new() missed require( 'tokyocabinet' )."
|
59
66
|
end
|
60
67
|
|
68
|
+
when :redis
|
69
|
+
if not @redisFlag
|
70
|
+
raise RuntimeError, "Kvs.new() missed require( 'redis' )."
|
71
|
+
end
|
72
|
+
|
61
73
|
when :memcache
|
62
74
|
# do nothing
|
63
75
|
|
@@ -67,7 +79,7 @@ class Kvs
|
|
67
79
|
else
|
68
80
|
raise RuntimeError, "Kvs.new() missed require( 'dbm' )."
|
69
81
|
end
|
70
|
-
|
82
|
+
|
71
83
|
# do nothing
|
72
84
|
|
73
85
|
when :pure
|
@@ -83,6 +95,8 @@ class Kvs
|
|
83
95
|
if not @db.open( name, TokyoCabinet::HDB::OWRITER | TokyoCabinet::HDB::OCREAT )
|
84
96
|
raise RuntimeError, sprintf( "TokyoCabinet::HDB.open error: file=%s", name )
|
85
97
|
end
|
98
|
+
when :redis
|
99
|
+
@db = Redis.new( :host => name )
|
86
100
|
when :memcache
|
87
101
|
@db = MemCache.new( name )
|
88
102
|
when :dbm
|
@@ -103,8 +117,11 @@ class Kvs
|
|
103
117
|
end
|
104
118
|
|
105
119
|
def fixdb( )
|
106
|
-
|
107
|
-
|
120
|
+
case @dbtype
|
121
|
+
when :tokyocabinet
|
122
|
+
if not @db.optimize( )
|
123
|
+
raise RuntimeError, sprintf( "TokyoCabinet::HDB.optimize error: file=%s", name )
|
124
|
+
end
|
108
125
|
end
|
109
126
|
true
|
110
127
|
end
|
@@ -119,7 +136,7 @@ class Kvs
|
|
119
136
|
def pure_put!( key, value, timeout = 0 )
|
120
137
|
if 0 < key.size
|
121
138
|
case @dbtype
|
122
|
-
when :tokyocabinet, :dbm
|
139
|
+
when :tokyocabinet, :dbm, :redis
|
123
140
|
@db[ key.force_encoding("ASCII-8BIT") ] = value.force_encoding("ASCII-8BIT")
|
124
141
|
when :memcache
|
125
142
|
@db.set( key.force_encoding("ASCII-8BIT"), value.force_encoding("ASCII-8BIT"), timeout )
|
@@ -146,13 +163,21 @@ class Kvs
|
|
146
163
|
end
|
147
164
|
|
148
165
|
def delete( key )
|
149
|
-
@
|
166
|
+
case @dbtype
|
167
|
+
when :redis
|
168
|
+
@db.del( key )
|
169
|
+
else
|
170
|
+
@db.delete( key )
|
171
|
+
end
|
172
|
+
true
|
150
173
|
end
|
151
174
|
|
152
175
|
def clear()
|
153
176
|
case @dbtype
|
154
177
|
when :tokyocabinet, :dbm, :pure
|
155
178
|
@db.clear
|
179
|
+
when :redis
|
180
|
+
@db.flushall
|
156
181
|
when :memcache
|
157
182
|
# do nothing
|
158
183
|
else
|
@@ -163,7 +188,7 @@ class Kvs
|
|
163
188
|
# return array of key string
|
164
189
|
def keys()
|
165
190
|
case @dbtype
|
166
|
-
when :tokyocabinet, :dbm
|
191
|
+
when :tokyocabinet, :dbm, :redis
|
167
192
|
@db.keys.map { |k|
|
168
193
|
k.force_encoding("UTF-8")
|
169
194
|
}
|
@@ -182,6 +207,10 @@ class Kvs
|
|
182
207
|
@db.fwmkeys( prefix ).each { |k|
|
183
208
|
k.force_encoding("UTF-8")
|
184
209
|
}
|
210
|
+
when :redis
|
211
|
+
@db.keys( prefix + "*" ).each { |k|
|
212
|
+
k.force_encoding("UTF-8")
|
213
|
+
}
|
185
214
|
when :memcache
|
186
215
|
raise RuntimeError, "Kvs#forward_match_keys method was not implemented for memcache."
|
187
216
|
when :dbm, :pure
|
@@ -197,7 +226,7 @@ class Kvs
|
|
197
226
|
case @dbtype
|
198
227
|
when :tokyocabinet, :dbm
|
199
228
|
@db.close
|
200
|
-
when :memcache
|
229
|
+
when :memcache, :redis
|
201
230
|
# do nothign
|
202
231
|
when :pure
|
203
232
|
File.open( @name, "w" ) { |f|
|
data/lib/sekka/sekkaversion.rb
CHANGED
data/lib/sekkaconfig.rb
CHANGED
@@ -40,7 +40,8 @@ module SekkaServer
|
|
40
40
|
class Config
|
41
41
|
include Singleton
|
42
42
|
|
43
|
-
def self.setup( dictSource, cacheSource = false, listenPort, proxyHost, proxyPort )
|
43
|
+
def self.setup( dictType, dictSource, cacheSource = false, listenPort, proxyHost, proxyPort )
|
44
|
+
@@dictType = dictType
|
44
45
|
@@dictSource = dictSource
|
45
46
|
@@cacheSource = cacheSource
|
46
47
|
@@listenPort = listenPort
|
@@ -48,6 +49,10 @@ module SekkaServer
|
|
48
49
|
@@proxyPort = proxyPort
|
49
50
|
end
|
50
51
|
|
52
|
+
def self.dictType
|
53
|
+
@@dictType
|
54
|
+
end
|
55
|
+
|
51
56
|
def self.dictSource
|
52
57
|
@@dictSource
|
53
58
|
end
|
data/lib/sekkaserver.rb
CHANGED
@@ -54,7 +54,8 @@ module SekkaServer
|
|
54
54
|
@core.evalStr( "(use sekka.henkan)" )
|
55
55
|
@core.evalStr( '(define (writeToString sexp) (write-to-string sexp))' )
|
56
56
|
@core.evalStr( '(export-to-ruby writeToString)' )
|
57
|
-
(@kvs,@cachesv) = @core.openSekkaJisyo( SekkaServer::Config.
|
57
|
+
(@kvs,@cachesv) = @core.openSekkaJisyo( SekkaServer::Config.dictType,
|
58
|
+
SekkaServer::Config.dictSource,
|
58
59
|
SekkaServer::Config.cacheSource )
|
59
60
|
@queue = EM::Queue.new
|
60
61
|
@mutex = Mutex.new
|
@@ -62,6 +63,7 @@ module SekkaServer
|
|
62
63
|
STDERR.puts( "----- Sekka Server Started -----" )
|
63
64
|
STDERR.printf( " Sekka version : %s\n", SekkaVersion.version )
|
64
65
|
STDERR.printf( " Nendo version : %s\n", Nendo::Core.version )
|
66
|
+
STDERR.printf( " dict-type : %s\n", SekkaServer::Config.dictType )
|
65
67
|
STDERR.printf( " dict-db : %s\n", SekkaServer::Config.dictSource )
|
66
68
|
STDERR.printf( " memcached : %s\n", SekkaServer::Config.cacheSource )
|
67
69
|
STDERR.printf( " listenPort : %s\n", SekkaServer::Config.listenPort )
|
data/test/henkan-main.nnd
CHANGED
@@ -51,6 +51,8 @@
|
|
51
51
|
(cond
|
52
52
|
((eq? dbtype 'tokyocabinet)
|
53
53
|
(set! target "./test.tch"))
|
54
|
+
((eq? dbtype 'redis)
|
55
|
+
(set! target "localhost"))
|
54
56
|
((eq? dbtype 'dbm)
|
55
57
|
(set! target "./test"))
|
56
58
|
((eq? dbtype 'pure)
|
@@ -89,20 +91,39 @@
|
|
89
91
|
(with-open "./test/sekka-dump-out-1.txt"
|
90
92
|
(lambda (f)
|
91
93
|
(let ((_input (f.read))
|
92
|
-
(
|
93
|
-
|
94
|
+
(_output1 (StringIO.new))
|
95
|
+
(_output2 (StringIO.new)))
|
96
|
+
(_output1.set_encoding "utf-8")
|
97
|
+
(_output2.set_encoding "utf-8")
|
94
98
|
(when (or (eq? dbtype 'tokyocabinet)
|
99
|
+
(eq? dbtype 'redis)
|
95
100
|
(eq? dbtype 'dbm)
|
96
101
|
(eq? dbtype 'pure))
|
97
102
|
(test-section "dump db")
|
103
|
+
|
98
104
|
(test* "dump DB to SEKKA jisyo file. (1)"
|
99
105
|
_input
|
100
106
|
(begin
|
101
|
-
(dump-sekka-jisyo-f
|
107
|
+
(dump-sekka-jisyo-f _output1 target)
|
102
108
|
(with-open "./test/sekka-dump-out-1.tmp"
|
103
|
-
(lambda (f) (f.write (
|
109
|
+
(lambda (f) (f.write (_output1.string)))
|
110
|
+
"w")
|
111
|
+
(_output1.string)))
|
112
|
+
|
113
|
+
(test* "dump/restore DB to SEKKA jisyo file. (1)"
|
114
|
+
_input
|
115
|
+
(begin
|
116
|
+
;; ---- RESTORE ----
|
117
|
+
(f.rewind)
|
118
|
+
(restore-sekka-jisyo-f f target)
|
119
|
+
|
120
|
+
;; ---- DUMP ----
|
121
|
+
(dump-sekka-jisyo-f _output2 target)
|
122
|
+
(with-open "./test/sekka-dump-out-2.tmp"
|
123
|
+
(lambda (f) (f.write (_output2.string)))
|
104
124
|
"w")
|
105
|
-
(
|
125
|
+
(_output2.string)))))))
|
126
|
+
|
106
127
|
|
107
128
|
|
108
129
|
(test-section "Open the test-suite DB")
|
@@ -112,6 +133,9 @@
|
|
112
133
|
((eq? dbtype 'tokyocabinet)
|
113
134
|
(kvs.open target)
|
114
135
|
(require "tokyocabinet"))
|
136
|
+
((eq? dbtype 'redis)
|
137
|
+
(kvs.open target)
|
138
|
+
(require "redis"))
|
115
139
|
((eq? dbtype 'dbm)
|
116
140
|
(kvs.open target)
|
117
141
|
(require "dbm"))
|
@@ -122,8 +146,6 @@
|
|
122
146
|
(else
|
123
147
|
(errorf "Unsupported db type [%s]" (symbol->string dbtype))))
|
124
148
|
|
125
|
-
(define db (kvs._db))
|
126
|
-
|
127
149
|
|
128
150
|
;;-------------------------------------------------------------------
|
129
151
|
(test-section "Register User dict")
|
@@ -171,63 +193,63 @@
|
|
171
193
|
(test-section "simple db fetch")
|
172
194
|
(test* "db fetch 1"
|
173
195
|
"Cへんかん"
|
174
|
-
(.
|
196
|
+
(kvs.get "MASTER::henkan"))
|
175
197
|
|
176
198
|
(test* "db fetch 2"
|
177
199
|
"Cかに/かんい"
|
178
|
-
(.
|
200
|
+
(kvs.get "MASTER::kani"))
|
179
201
|
|
180
202
|
(test* "db fetch 3"
|
181
203
|
"Cかんい"
|
182
|
-
(.
|
204
|
+
(kvs.get "MASTER::kanni"))
|
183
205
|
|
184
206
|
(test* "db fetch 4"
|
185
207
|
#f
|
186
|
-
(
|
208
|
+
(kvs.get "MASTER::aaaa"))
|
187
209
|
|
188
210
|
(test* "db fetch 5"
|
189
211
|
"Cへんかんえんじん"
|
190
|
-
(.
|
212
|
+
(kvs.get "dummy::henkanenjin"))
|
191
213
|
|
192
214
|
(test* "db fetch 6"
|
193
215
|
"ka;ko ka@ko kakko kani kanni kaqi"
|
194
|
-
(.
|
216
|
+
(kvs.get "MASTER::(ka)"))
|
195
217
|
|
196
218
|
(test* "db fetch 7"
|
197
219
|
"ka+ kaT ka`"
|
198
|
-
(.
|
220
|
+
(kvs.get "MASTER::(KA)"))
|
199
221
|
|
200
222
|
(test* "db fetch 8"
|
201
223
|
"#kaime #kara# #kqme #kr#"
|
202
|
-
(.
|
224
|
+
(kvs.get "MASTER::(#k)"))
|
203
225
|
|
204
226
|
(test* "db fetch 9"
|
205
227
|
"burogu+ buroguR buroguT burogu`"
|
206
|
-
(.
|
228
|
+
(kvs.get "dummy::(BU)"))
|
207
229
|
|
208
230
|
(test* "db fetch 10"
|
209
231
|
"/ユーザー辞書"
|
210
|
-
(.
|
232
|
+
(kvs.get "dummy::ゆーざーじしょ"))
|
211
233
|
|
212
234
|
(test* "db fetch 11"
|
213
235
|
"yu'za'jisho yu'za'jisyo yu'za'jixo yu'za'zisho yu'za'zisyo yu'za'zixo yu'za-jisho yu'za-jisyo yu'za-jixo yu'za-zisho yu'za-zisyo yu'za-zixo yu'za:jisho yu'za:jisyo yu'za:jixo yu'za:zisho yu'za:zisyo yu'za:zixo yu'za^jisho yu'za^jisyo yu'za^jixo yu'za^zisho yu'za^zisyo yu'za^zixo yu'zc'jisho yu'zc'jisyo yu'zc'jixo yu'zc'zisho yu'zc'zisyo yu'zc'zixo yu'zc-jisho yu'zc-jisyo yu'zc-jixo yu'zc-zisho yu'zc-zisyo yu'zc-zixo yu'zc:jisho yu'zc:jisyo yu'zc:jixo yu'zc:zisho yu'zc:zisyo yu'zc:zixo yu'zc^jisho yu'zc^jisyo yu'zc^jixo yu'zc^zisho yu'zc^zisyo yu'zc^zixo yu-za'jisho yu-za'jisyo yu-za'jixo yu-za'zisho yu-za'zisyo yu-za'zixo yu-za-jisho yu-za-jisyo yu-za-jixo yu-za-zisho yu-za-zisyo yu-za-zixo yu-za:jisho yu-za:jisyo yu-za:jixo yu-za:zisho yu-za:zisyo yu-za:zixo yu-za^jisho yu-za^jisyo yu-za^jixo yu-za^zisho yu-za^zisyo yu-za^zixo yu-zc'jisho yu-zc'jisyo yu-zc'jixo yu-zc'zisho yu-zc'zisyo yu-zc'zixo yu-zc-jisho yu-zc-jisyo yu-zc-jixo yu-zc-zisho yu-zc-zisyo yu-zc-zixo yu-zc:jisho yu-zc:jisyo yu-zc:jixo yu-zc:zisho yu-zc:zisyo yu-zc:zixo yu-zc^jisho yu-zc^jisyo yu-zc^jixo yu-zc^zisho yu-zc^zisyo yu-zc^zixo yu:za'jisho yu:za'jisyo yu:za'jixo yu:za'zisho yu:za'zisyo yu:za'zixo yu:za-jisho yu:za-jisyo yu:za-jixo yu:za-zisho yu:za-zisyo yu:za-zixo yu:za:jisho yu:za:jisyo yu:za:jixo yu:za:zisho yu:za:zisyo yu:za:zixo yu:za^jisho yu:za^jisyo yu:za^jixo yu:za^zisho yu:za^zisyo yu:za^zixo yu:zc'jisho yu:zc'jisyo yu:zc'jixo yu:zc'zisho yu:zc'zisyo yu:zc'zixo yu:zc-jisho yu:zc-jisyo yu:zc-jixo yu:zc-zisho yu:zc-zisyo yu:zc-zixo yu:zc:jisho yu:zc:jisyo yu:zc:jixo yu:zc:zisho yu:zc:zisyo yu:zc:zixo yu:zc^jisho yu:zc^jisyo yu:zc^jixo yu:zc^zisho yu:zc^zisyo yu:zc^zixo yu^za'jisho yu^za'jisyo yu^za'jixo yu^za'zisho yu^za'zisyo yu^za'zixo yu^za-jisho yu^za-jisyo yu^za-jixo yu^za-zisho yu^za-zisyo yu^za-zixo yu^za:jisho yu^za:jisyo yu^za:jixo yu^za:zisho yu^za:zisyo yu^za:zixo yu^za^jisho yu^za^jisyo yu^za^jixo yu^za^zisho yu^za^zisyo yu^za^zixo yu^zc'jisho yu^zc'jisyo yu^zc'jixo yu^zc'zisho yu^zc'zisyo yu^zc'zixo yu^zc-jisho yu^zc-jisyo yu^zc-jixo yu^zc-zisho yu^zc-zisyo yu^zc-zixo yu^zc:jisho yu^zc:jisyo yu^zc:jixo yu^zc:zisho yu^zc:zisyo yu^zc:zixo yu^zc^jisho yu^zc^jisyo yu^zc^jixo yu^zc^zisho yu^zc^zisyo yu^zc^zixo"
|
214
|
-
(.
|
236
|
+
(kvs.get "dummy::(yu)"))
|
215
237
|
|
216
238
|
(test* "db fetch 12"
|
217
239
|
"する"
|
218
|
-
(.
|
240
|
+
(kvs.get "dummy::=sr"))
|
219
241
|
|
220
242
|
(test* "db fetch 13"
|
221
243
|
"=suru"
|
222
|
-
(.
|
244
|
+
(kvs.get "dummy::{su}"))
|
223
245
|
|
224
246
|
(test* "db fetch 14"
|
225
247
|
"したい"
|
226
|
-
(.
|
248
|
+
(kvs.get "dummy::=shitai"))
|
227
249
|
|
228
250
|
(test* "db fetch 15"
|
229
251
|
"=shita =shitai"
|
230
|
-
(.
|
252
|
+
(kvs.get "dummy::{sh}"))
|
231
253
|
|
232
254
|
|
233
255
|
|
@@ -241,11 +263,11 @@
|
|
241
263
|
|
242
264
|
(test* "check user dict 1"
|
243
265
|
"/エントリA/エントリB/エントリC"
|
244
|
-
(.
|
266
|
+
(kvs.get "dummy2::てすとようえんとり"))
|
245
267
|
|
246
268
|
(test* "check user dict 2"
|
247
269
|
"tesutoyouenntori tesutoyouentori tesutoyoueqtori tesutoyowhuenntori tesutoyowhuentori tesutoyowhueqtori tesutoypenntori tesutoypentori tesutoypeqtori"
|
248
|
-
(.
|
270
|
+
(kvs.get "dummy2::(te)"))
|
249
271
|
|
250
272
|
(test* "flush user dict"
|
251
273
|
12
|
@@ -254,11 +276,11 @@
|
|
254
276
|
;; getに失敗しないといけない。
|
255
277
|
(test* "check user dict 3"
|
256
278
|
:no-entry
|
257
|
-
(
|
279
|
+
(kvs.get "dummy2::てすとようえんとり" :no-entry))
|
258
280
|
|
259
281
|
(test* "check user dict 4"
|
260
282
|
:no-entry
|
261
|
-
(
|
283
|
+
(kvs.get "dummy2::(te)" :no-entry))
|
262
284
|
|
263
285
|
(test* "register user dict 2"
|
264
286
|
#t
|
@@ -268,11 +290,11 @@
|
|
268
290
|
;; "エントリB" という単語が消えないといけない。
|
269
291
|
(test* "check user dict 5"
|
270
292
|
"/エントリA/エントリC"
|
271
|
-
(.
|
293
|
+
(kvs.get "dummy2::てすとようえんとり"))
|
272
294
|
|
273
295
|
(test* "check user dict 6"
|
274
296
|
"tesutoyouenntori tesutoyouentori tesutoyoueqtori tesutoyowhuenntori tesutoyowhuentori tesutoyowhueqtori tesutoypenntori tesutoypentori tesutoypeqtori"
|
275
|
-
(.
|
297
|
+
(kvs.get "dummy2::(te)"))
|
276
298
|
|
277
299
|
|
278
300
|
;;-------------------------------------------------------------------
|
@@ -1132,7 +1154,7 @@
|
|
1132
1154
|
|
1133
1155
|
(test* "DB check after henkan kakutei 1"
|
1134
1156
|
"/返還/変換"
|
1135
|
-
(.
|
1157
|
+
(kvs.get (+ userid "::へんかん")))
|
1136
1158
|
|
1137
1159
|
(test* "henkan kakutei(for Elisp) 2"
|
1138
1160
|
'(("変換" nil "へんかん" j 0) ("返還" nil "へんかん" j 1) ("変化" nil "へんか" j 2) ("返歌" nil "へんか" j 3) ("へんかん" nil "henkan" h 4) ("ヘンカン" nil "henkan" k 5) ("へにんあん" nil "henkan" h 6) ("ヘニンアン" nil "henkan" k 7) ("Henkan" nil "Henkan" z 8) ("Henkan" nil "Henkan" l 9))
|
@@ -1142,7 +1164,7 @@
|
|
1142
1164
|
|
1143
1165
|
(test* "DB check after henkan kakutei 2"
|
1144
1166
|
"/変換/返還"
|
1145
|
-
(.
|
1167
|
+
(kvs.get (+ userid "::へんかん")))
|
1146
1168
|
|
1147
1169
|
(test* "henkan kakutei(for Elisp) 3"
|
1148
1170
|
'(("デベロッパ" nil "developer" j 0) ("デベロッパー" nil "developer" j 1) ("ディベロッパー" nil "developer" j 2) ("developer" nil "developer" z 3) ("developer" nil "developer" l 4))
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sekka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 2
|
10
|
+
version: 0.9.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kiyoka Nishiyama
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-15 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
@@ -116,7 +116,7 @@ dependencies:
|
|
116
116
|
prerelease: false
|
117
117
|
version_requirements: *id007
|
118
118
|
- !ruby/object:Gem::Dependency
|
119
|
-
name:
|
119
|
+
name: redis
|
120
120
|
requirement: &id008 !ruby/object:Gem::Requirement
|
121
121
|
none: false
|
122
122
|
requirements:
|
@@ -126,11 +126,11 @@ dependencies:
|
|
126
126
|
segments:
|
127
127
|
- 0
|
128
128
|
version: "0"
|
129
|
-
type: :
|
129
|
+
type: :runtime
|
130
130
|
prerelease: false
|
131
131
|
version_requirements: *id008
|
132
132
|
- !ruby/object:Gem::Dependency
|
133
|
-
name:
|
133
|
+
name: ruby-progressbar
|
134
134
|
requirement: &id009 !ruby/object:Gem::Requirement
|
135
135
|
none: false
|
136
136
|
requirements:
|
@@ -144,7 +144,7 @@ dependencies:
|
|
144
144
|
prerelease: false
|
145
145
|
version_requirements: *id009
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
|
-
name:
|
147
|
+
name: rubyforge
|
148
148
|
requirement: &id010 !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
@@ -154,11 +154,11 @@ dependencies:
|
|
154
154
|
segments:
|
155
155
|
- 0
|
156
156
|
version: "0"
|
157
|
-
type: :
|
157
|
+
type: :development
|
158
158
|
prerelease: false
|
159
159
|
version_requirements: *id010
|
160
160
|
- !ruby/object:Gem::Dependency
|
161
|
-
name:
|
161
|
+
name: eventmachine
|
162
162
|
requirement: &id011 !ruby/object:Gem::Requirement
|
163
163
|
none: false
|
164
164
|
requirements:
|
@@ -172,7 +172,7 @@ dependencies:
|
|
172
172
|
prerelease: false
|
173
173
|
version_requirements: *id011
|
174
174
|
- !ruby/object:Gem::Dependency
|
175
|
-
name:
|
175
|
+
name: fuzzy-string-match
|
176
176
|
requirement: &id012 !ruby/object:Gem::Requirement
|
177
177
|
none: false
|
178
178
|
requirements:
|
@@ -186,8 +186,36 @@ dependencies:
|
|
186
186
|
prerelease: false
|
187
187
|
version_requirements: *id012
|
188
188
|
- !ruby/object:Gem::Dependency
|
189
|
-
name:
|
189
|
+
name: jeweler
|
190
190
|
requirement: &id013 !ruby/object:Gem::Requirement
|
191
|
+
none: false
|
192
|
+
requirements:
|
193
|
+
- - ">="
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
hash: 3
|
196
|
+
segments:
|
197
|
+
- 0
|
198
|
+
version: "0"
|
199
|
+
type: :runtime
|
200
|
+
prerelease: false
|
201
|
+
version_requirements: *id013
|
202
|
+
- !ruby/object:Gem::Dependency
|
203
|
+
name: memcache-client
|
204
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
205
|
+
none: false
|
206
|
+
requirements:
|
207
|
+
- - ">="
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
hash: 3
|
210
|
+
segments:
|
211
|
+
- 0
|
212
|
+
version: "0"
|
213
|
+
type: :runtime
|
214
|
+
prerelease: false
|
215
|
+
version_requirements: *id014
|
216
|
+
- !ruby/object:Gem::Dependency
|
217
|
+
name: nendo
|
218
|
+
requirement: &id015 !ruby/object:Gem::Requirement
|
191
219
|
none: false
|
192
220
|
requirements:
|
193
221
|
- - "="
|
@@ -200,10 +228,10 @@ dependencies:
|
|
200
228
|
version: 0.5.3
|
201
229
|
type: :runtime
|
202
230
|
prerelease: false
|
203
|
-
version_requirements: *
|
231
|
+
version_requirements: *id015
|
204
232
|
- !ruby/object:Gem::Dependency
|
205
233
|
name: rack
|
206
|
-
requirement: &
|
234
|
+
requirement: &id016 !ruby/object:Gem::Requirement
|
207
235
|
none: false
|
208
236
|
requirements:
|
209
237
|
- - ">="
|
@@ -214,10 +242,10 @@ dependencies:
|
|
214
242
|
version: "0"
|
215
243
|
type: :runtime
|
216
244
|
prerelease: false
|
217
|
-
version_requirements: *
|
245
|
+
version_requirements: *id016
|
218
246
|
- !ruby/object:Gem::Dependency
|
219
|
-
name:
|
220
|
-
requirement: &
|
247
|
+
name: ruby-progressbar
|
248
|
+
requirement: &id017 !ruby/object:Gem::Requirement
|
221
249
|
none: false
|
222
250
|
requirements:
|
223
251
|
- - ">="
|
@@ -228,7 +256,7 @@ dependencies:
|
|
228
256
|
version: "0"
|
229
257
|
type: :runtime
|
230
258
|
prerelease: false
|
231
|
-
version_requirements: *
|
259
|
+
version_requirements: *id017
|
232
260
|
description: Sekka is a SKK like input method. Sekka server provides REST Based API. If you are SKK user, let's try it.
|
233
261
|
email: kiyoka@sumibi.org
|
234
262
|
executables:
|