sekka 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|