sekka 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- mode: nendo; syntax: scheme ; coding: utf-8 -*-
3
+ require 'nendo'
4
+ $LOAD_PATH.push( File.dirname(__FILE__) + "/../lib" )
5
+ core = Nendo::Core.new()
6
+ core.setArgv( ARGV )
7
+ core.loadInitFile
8
+ core.evalStr( <<";;END-OF-SCRIPT" )
9
+ ;;;
10
+ ;;; sekka-benchmark - sekka-serverのベンチマークプログラム
11
+ ;;;
12
+ ;;; Copyright (c) 2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
13
+ ;;;
14
+ ;;; Redistribution and use in source and binary forms, with or without
15
+ ;;; modification, are permitted provided that the following conditions
16
+ ;;; are met:
17
+ ;;;
18
+ ;;; 1. Redistributions of source code must retain the above copyright
19
+ ;;; notice, this list of conditions and the following disclaimer.
20
+ ;;;
21
+ ;;; 2. Redistributions in binary form must reproduce the above copyright
22
+ ;;; notice, this list of conditions and the following disclaimer in the
23
+ ;;; documentation and/or other materials provided with the distribution.
24
+ ;;;
25
+ ;;; 3. Neither the name of the authors nor the names of its contributors
26
+ ;;; may be used to endorse or promote products derived from this
27
+ ;;; software without specific prior written permission.
28
+ ;;;
29
+ ;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30
+ ;;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31
+ ;;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32
+ ;;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33
+ ;;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34
+ ;;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
35
+ ;;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
36
+ ;;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
37
+ ;;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
38
+ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
39
+ ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40
+ ;;;
41
+ ;;; $Id:
42
+ ;;;
43
+ (require "benchmark")
44
+ (define (bench-block title block)
45
+ (print "----------------------------------------")
46
+ (printf "[%s]\n" title )
47
+ (.puts Benchmark::CAPTION)
48
+ (.puts (Benchmark.measure
49
+ (&block ()
50
+ (block)))))
51
+
52
+
53
+ (define (gen-curl-command-string keyword limit)
54
+ (let ((host "localhost"))
55
+ (sprintf "curl --silent --show-error --max-time 60 --insecure --header 'Content-Type: application/x-www-form-urlencoded' http://%s:12929/henkan --data 'format=sexp' --data 'yomi=%s' --data 'limit=%d' --data 'method=normal' --data 'userid=%s' > /dev/null" host keyword limit "benchuser")))
56
+
57
+
58
+ (define (henkan-with-same-keyword limit)
59
+ (let1 cmd (gen-curl-command-string "Kanji" limit)
60
+ (bench-block
61
+ (sprintf "Samekey limit=%d (all request hits memcached)" limit)
62
+ (lambda ()
63
+ (for-each
64
+ (lambda (x)
65
+ (display ".")
66
+ (.system cmd))
67
+ (range 100))
68
+ (newline)))))
69
+
70
+ (define (henkan-with-uniq-keyword limit)
71
+ (let1 keylist
72
+ '(
73
+ "Aimai" "Ao" "Aoumigame" "Akakeitou"
74
+ "Bangou" "Bankai" "Banninkyoutuu" "Banouyaku"
75
+ "Chance"
76
+ "Dangai" "Daiichihousoku" "Daigakuin" "Daidokoro"
77
+ "Enjin" "Eigyoukatudou" "Eiseikidou" "Ebisu"
78
+ "Fantaji-"
79
+ "Goukaku" "Gakkou" "Gaikoku" "Gakki" "Gamenkeishiki" "Gamensaizu" "Garapagosu" "Gankyuu"
80
+ "Hinode" "Hi-ro-" "Hiroshima" "Hinjaku" "Hakari" "Ha-monika" "Haru"
81
+ "Iwanami" "Ikimono" "Inarizushi" "Iso" "Ishi" "Ima" "Imi" "Inu"
82
+ "Jinkoumondai" "Jinkoueisei" "Jiken" "Jiko" "Jirou" "Jakouneko"
83
+ "Kousei" "Kaisen" "Kiso" "Kisokenkyuu" "Kisoshikkan" "Kenkyuukikan" "Kenkyuunaiyou"
84
+ "London" "Lonly" "Load" "Love" "Listen" "List"
85
+ "Manyousyuu"
86
+ "Nouzei" "Namae" "Nakanaka" "Nihongohenkan" "Nihongo" "Nishi"
87
+ "Okinawa" "Oudanhodou"
88
+ "Painappuru" "Pa-sonaru"
89
+ "Quizu"
90
+ "Rokuon" "Rasenkaidan" "Risoku" "Risuku"
91
+ "Sougouhyouka" "Sougou" "Son" "Soro"
92
+ "Tuuka" "Tuika" "Taiyou" "Taiou" "Tamatama"
93
+ "Umi" "Ushiro" "Utagoe" "Uso" "Ukai"
94
+ "World" "Watagashi" "Watarigani"
95
+ "Yamagataken" "Yamai" "Yu-suke-su"
96
+ "Zonbi" "Zou" "Zanshin" "Zannen"
97
+ )
98
+
99
+ (bench-block
100
+ (sprintf "Uniqkey limit=%d" limit)
101
+ (lambda ()
102
+ (for-each
103
+ (lambda (x)
104
+ (let1 cmd (gen-curl-command-string x limit)
105
+ (display ".")
106
+ (.system cmd)))
107
+ keylist)
108
+ (newline)))))
109
+
110
+
111
+ (define (display-help)
112
+ (print "Usage : ")
113
+ (print " sekka-benchmark samekey0 .... henkan 100 times with same keyword [Kanji] (get N candidate)")
114
+ (print " sekka-benchmark samekey1 .... henkan 100 times with same keyword [Kanji] (get 1 candidate)")
115
+ (print " sekka-benchmark uniqkey0 .... henkan 100 times with uniq keywords [Aimai Ao ...] (get N candidate)"))
116
+
117
+
118
+ (define (main argv)
119
+ (cond
120
+ ((= 0 (length argv))
121
+ (display-help))
122
+ (else
123
+ (let1 command (string->symbol (first argv))
124
+ (cond
125
+ ((eq? 'samekey0 command)
126
+ (henkan-with-same-keyword 0))
127
+ ((eq? 'samekey1 command)
128
+ (henkan-with-same-keyword 1))
129
+ ((eq? 'uniqkey0 command)
130
+ (henkan-with-uniq-keyword 0))
131
+ (else
132
+ (errorf "Error: no such command [%s] \n" command )))))))
133
+
134
+ (main *argv*)
135
+ ;;END-OF-SCRIPT
data/emacs/sekka.el CHANGED
@@ -55,11 +55,6 @@
55
55
  :type 'string
56
56
  :group 'sekka)
57
57
 
58
- (defcustom sekka-use-viper nil
59
- "*Non-nil であれば、VIPER に対応する"
60
- :type 'boolean
61
- :group 'sekka)
62
-
63
58
  (defcustom sekka-realtime-guide-running-seconds 30
64
59
  "リアルタイムガイド表示の継続時間(秒数)・ゼロでガイド表示機能が無効になる"
65
60
  :type 'integer
@@ -369,14 +364,17 @@
369
364
  ;; ユーザー語彙をサーバーに登録する。
370
365
  ;;
371
366
  (defun sekka-register-userdict-internal ()
372
- (let ((str (sekka-get-jisyo-str "~/.sekka-jisyo")))
373
- (when str
374
- (message "Requesting to sekka server...")
375
- (sekka-debug-print (format "register [%s]\n" str))
376
- (let ((result (sekka-rest-request "register" `((dict . ,str)))))
377
- (sekka-debug-print (format "register-result:%S\n" result))
378
- (message result)
379
- t))))
367
+ (let* ((str (sekka-get-jisyo-str "~/.sekka-jisyo"))
368
+ (str-lst (sekka-divide-into-few-line str)))
369
+ (mapcar
370
+ (lambda (x)
371
+ ;;(message "Requesting to sekka server...")
372
+ (sekka-debug-print (format "register [%s]\n" x))
373
+ (let ((result (sekka-rest-request "register" `((dict . ,x)))))
374
+ (sekka-debug-print (format "register-result:%S\n" result))
375
+ (message result)))
376
+ str-lst)
377
+ t))
380
378
 
381
379
 
382
380
  ;;
@@ -392,17 +390,52 @@
392
390
  t))
393
391
 
394
392
 
393
+ ;; str = "line1 \n line2 \n line3 \n line4 \n line5 \n "
394
+ ;; result:
395
+ ;; '(
396
+ ;; ("line1 \n line2 \n line3 \n ")
397
+ ;; ("line4 \n line5 \n ")
398
+ ;; )
399
+ ;;
400
+ ;; for-testing:
401
+ ;; (sekka-divide-into-few-line
402
+ ;; "line1 \n line2 \n line3 \n line4 \n line5 \n line6 \n line7 \n line8 \n line9 \n line10 \n line11 \n line12 \n")
403
+ ;;
404
+ (defun sekka-divide-into-few-line (str)
405
+ (if (stringp str)
406
+ (let ((str-lst (split-string str "\n"))
407
+ (result '()))
408
+ (while (< 0 (length str-lst))
409
+ (push
410
+ (concat
411
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
412
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
413
+
414
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
415
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
416
+
417
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
418
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
419
+
420
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
421
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
422
+
423
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
424
+ (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n" (pop str-lst) "\n"
425
+ )
426
+ result))
427
+ (reverse result))
428
+ '()))
429
+
395
430
  (defun sekka-get-jisyo-str (file &optional nomsg)
396
- "FILE を開いて SKK 辞書バッファを作り、バッファを返す。
397
- オプション引数の NOMSG を指定するとファイル読み込みの際のメッセージを表示しな
398
- い。"
431
+ "FILE を開いて Sekka辞書バッファを作り、バッファ1行1文字列のリストで返す"
399
432
  (when file
400
433
  (let* ((file (or (car-safe file)
401
434
  file))
402
435
  (file (expand-file-name file)))
403
436
  (if (not (file-exists-p file))
404
437
  (progn
405
- (message (format "SKK 辞書 %s が存在しません..." file))
438
+ (message (format "Sekka辞書 %s が存在しません..." file))
406
439
  nil)
407
440
  (let ((str "")
408
441
  (buf-name (file-name-nondirectory file)))
@@ -410,12 +443,10 @@
410
443
  (find-file-read-only file)
411
444
  (setq str (with-current-buffer (get-buffer buf-name)
412
445
  (buffer-substring-no-properties (point-min) (point-max))))
413
- (message (format "SKK 辞書 %s を開いています...完了!" (file-name-nondirectory file)))
446
+ (message (format "Sekka辞書 %s を開いています...完了!" (file-name-nondirectory file)))
414
447
  (kill-buffer-if-not-modified (get-buffer buf-name)))
415
448
  str)))))
416
449
 
417
- ;;(sekka-get-jisyo-str "~/.sekka-jisyo")
418
-
419
450
 
420
451
  ;; ポータブル文字列置換( EmacsとXEmacsの両方で動く )
421
452
  (defun sekka-replace-regexp-in-string (regexp replace str)
@@ -998,36 +1029,6 @@
998
1029
  (point))
999
1030
  result)))))
1000
1031
 
1001
-
1002
- ;;;
1003
- ;;; with viper
1004
- ;;;
1005
- ;; code from skk-viper.el
1006
- (defun sekka-viper-normalize-map ()
1007
- (let ((other-buffer
1008
- (if (featurep 'xemacs)
1009
- (local-variable-p 'minor-mode-map-alist nil t)
1010
- (local-variable-if-set-p 'minor-mode-map-alist))))
1011
- ;; for current buffer and buffers to be created in the future.
1012
- ;; substantially the same job as viper-harness-minor-mode does.
1013
- (viper-normalize-minor-mode-map-alist)
1014
- (setq-default minor-mode-map-alist minor-mode-map-alist)
1015
- (when other-buffer
1016
- ;; for buffers which are already created and have
1017
- ;; the minor-mode-map-alist localized by Viper.
1018
- (dolist (buf (buffer-list))
1019
- (with-current-buffer buf
1020
- (unless (assq 'sekka-mode minor-mode-map-alist)
1021
- (setq minor-mode-map-alist
1022
- (append (list (cons 'sekka-mode sekka-mode-map)
1023
- (cons 'sekka-select-mode
1024
- sekka-select-mode-map))
1025
- minor-mode-map-alist)))
1026
- (viper-normalize-minor-mode-map-alist))))))
1027
-
1028
- (defun sekka-viper-init-function ()
1029
- (sekka-viper-normalize-map)
1030
- (remove-hook 'sekka-mode-hook 'sekka-viper-init-function))
1031
1032
 
1032
1033
  (defun sekka-sticky-shift-init-function ()
1033
1034
  ;; sticky-shift
@@ -1156,8 +1157,6 @@ point から行頭方向に同種の文字列が続く間を漢字変換しま
1156
1157
  (sekka-kill-sekka-mode))
1157
1158
  (setq sekka-mode (if (null arg) (not sekka-mode)
1158
1159
  (> (prefix-numeric-value arg) 0))))
1159
- (when sekka-use-viper
1160
- (add-hook 'sekka-mode-hook 'sekka-viper-init-function))
1161
1160
  (when sekka-sticky-shift
1162
1161
  (add-hook 'sekka-mode-hook 'sekka-sticky-shift-init-function))
1163
1162
  (when sekka-mode (run-hooks 'sekka-mode-hook)))
@@ -1199,7 +1198,7 @@ point から行頭方向に同種の文字列が続く間を漢字変換しま
1199
1198
  (setq default-input-method "japanese-sekka")
1200
1199
 
1201
1200
  (defconst sekka-version
1202
- "0.8.1" ;;SEKKA-VERSION
1201
+ "0.8.2" ;;SEKKA-VERSION
1203
1202
  )
1204
1203
  (defun sekka-version (&optional arg)
1205
1204
  "入力モード変更"
data/lib/sekka/kvs.rb CHANGED
@@ -41,6 +41,7 @@ class Kvs
41
41
  case dbtype
42
42
  when :tokyocabinet
43
43
  @db = TokyoCabinet::HDB.new( )
44
+ # @db.setxmsiz(512 * 1024 * 1024) # expand memory
44
45
  when :memcache
45
46
  # do nothing
46
47
  else
@@ -1,6 +1,6 @@
1
1
  class SekkaVersion
2
2
  include Singleton
3
3
  def self.version
4
- "0.8.1"
4
+ "0.8.2"
5
5
  end
6
6
  end
data/lib/sekkaserver.rb CHANGED
@@ -39,6 +39,7 @@ require 'nendo'
39
39
  require 'eventmachine'
40
40
  require 'syslog'
41
41
  require 'uri'
42
+ require 'date'
42
43
  require './lib/sekkaconfig'
43
44
  require './lib/sekka/sekkaversion'
44
45
 
@@ -67,15 +68,22 @@ module SekkaServer
67
68
  @thread = Thread.new do
68
69
  Thread.pass
69
70
  EventMachine::run {
71
+ d = DateTime.now
70
72
  EventMachine::PeriodicTimer.new( 5 ) do
71
73
  while not @queue.empty?
72
- @queue.pop { |word|
74
+ @queue.pop { |word|
73
75
  arr = word.split( /[ ]+/ )
74
76
  userid = arr[0]
75
- dictline = arr[1] + " " + arr[2]
77
+ dictline =
78
+ if 3 == arr.size
79
+ arr[1] + " " + arr[2]
80
+ else
81
+ ";; comment"
82
+ end
76
83
  registered = @core.registerUserJisyo(userid, @kvs, dictline)
77
84
  if registered
78
- puts "Info: added to dict userid[" + userid + "] dictline[" + dictline + "]"
85
+ str = d.strftime( "%D %X" )
86
+ puts "Info: [" + str + "]added to dict userid[" + userid + "] dictline[" + dictline + "]"
79
87
  @core.flushCacheServer( @cachesv )
80
88
  else
81
89
  puts "Info: ignored (already added or comment) userid[" + userid + "] dictline[" + dictline + "]"
@@ -110,14 +118,14 @@ module SekkaServer
110
118
  when "/register"
111
119
  dict = URI.decode( req.params['dict'].force_encoding( "UTF-8" ) ).split( "\n" )
112
120
  dict.each { |x| @queue.push( userid + " " + x ) }
113
- sprintf( "register request successful (%s) words", dict.size )
121
+ sprintf( "sekka-server:register request (%s) words added, current-queue-size (%s)", dict.size, @queue.size )
114
122
  when "/flush"
115
123
  @core.flushCacheServer( @cachesv )
116
124
  n = @core.flushUserJisyo( userid, @kvs )
117
125
  printf( "info : flush [%s] user's dict %d entries.", userid, n )
118
- sprintf( "flush request successful. flush (%d) entries.", n )
126
+ sprintf( "sekka-server:flush request successful. flush (%d) entries.", n )
119
127
  else
120
- sprintf( "unknown path name. [%s]", req.path )
128
+ sprintf( "sekka-server:unknown path name. [%s]", req.path )
121
129
  end
122
130
  else
123
131
  "no message."
@@ -36,7 +36,7 @@
36
36
  (require "sekka/kvs")
37
37
  (use nendo.test)
38
38
  (use sekka.henkan)
39
- (load "test/common.nnd")
39
+ (load "./test/common.nnd")
40
40
 
41
41
  (define dbtype (string->symbol (first *argv*)))
42
42
 
@@ -36,7 +36,7 @@
36
36
  (use nendo.test)
37
37
  (use sekka.roman-lib)
38
38
  (test-start "roman-lib")
39
- (load "test/skk-azik-table")
39
+ (load "./test/skk-azik-table.nnd")
40
40
 
41
41
  ;;===================================================================
42
42
  (define skk-azik-roman->kana-alist
data/test/henkan-main.nnd CHANGED
@@ -37,7 +37,7 @@
37
37
  (use nendo.test)
38
38
  (use sekka.convert-jisyo)
39
39
  (use sekka.henkan)
40
- (load "test/common.nnd")
40
+ (load "./test/common.nnd")
41
41
 
42
42
  (define dbtype (string->symbol (first *argv*)))
43
43
  (define userid "dummy")
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sekka
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 8
9
- - 1
10
- version: 0.8.1
8
+ - 2
9
+ version: 0.8.2
11
10
  platform: ruby
12
11
  authors:
13
12
  - Kiyoka Nishiyama
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-11-26 00:00:00 +09:00
17
+ date: 2010-12-06 00:00:00 +09:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 3
30
28
  segments:
31
29
  - 0
32
30
  version: "0"
@@ -40,7 +38,6 @@ dependencies:
40
38
  requirements:
41
39
  - - ">="
42
40
  - !ruby/object:Gem::Version
43
- hash: 3
44
41
  segments:
45
42
  - 0
46
43
  version: "0"
@@ -54,7 +51,6 @@ dependencies:
54
51
  requirements:
55
52
  - - ">="
56
53
  - !ruby/object:Gem::Version
57
- hash: 3
58
54
  segments:
59
55
  - 0
60
56
  version: "0"
@@ -68,7 +64,6 @@ dependencies:
68
64
  requirements:
69
65
  - - ">="
70
66
  - !ruby/object:Gem::Version
71
- hash: 3
72
67
  segments:
73
68
  - 0
74
69
  version: "0"
@@ -82,7 +77,6 @@ dependencies:
82
77
  requirements:
83
78
  - - ">="
84
79
  - !ruby/object:Gem::Version
85
- hash: 3
86
80
  segments:
87
81
  - 0
88
82
  version: "0"
@@ -96,7 +90,6 @@ dependencies:
96
90
  requirements:
97
91
  - - ">="
98
92
  - !ruby/object:Gem::Version
99
- hash: 3
100
93
  segments:
101
94
  - 0
102
95
  version: "0"
@@ -110,7 +103,6 @@ dependencies:
110
103
  requirements:
111
104
  - - ">="
112
105
  - !ruby/object:Gem::Version
113
- hash: 15
114
106
  segments:
115
107
  - 0
116
108
  - 4
@@ -126,7 +118,6 @@ dependencies:
126
118
  requirements:
127
119
  - - ">="
128
120
  - !ruby/object:Gem::Version
129
- hash: 3
130
121
  segments:
131
122
  - 0
132
123
  version: "0"
@@ -140,7 +131,6 @@ dependencies:
140
131
  requirements:
141
132
  - - ">="
142
133
  - !ruby/object:Gem::Version
143
- hash: 3
144
134
  segments:
145
135
  - 0
146
136
  version: "0"
@@ -149,6 +139,7 @@ dependencies:
149
139
  description: Sekka is a SKK like input method. Sekka server provides REST Based API. If you are SKK user, let's try it.
150
140
  email: kiyoka@sumibi.org
151
141
  executables:
142
+ - sekka-benchmark
152
143
  - sekka-jisyo
153
144
  - sekka-server
154
145
  extensions: []
@@ -158,6 +149,7 @@ extra_rdoc_files:
158
149
  files:
159
150
  - COPYING
160
151
  - README
152
+ - bin/sekka-benchmark
161
153
  - bin/sekka-jisyo
162
154
  - bin/sekka-server
163
155
  - emacs/http-cookies.el
@@ -198,7 +190,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
198
190
  requirements:
199
191
  - - ">="
200
192
  - !ruby/object:Gem::Version
201
- hash: 49
202
193
  segments:
203
194
  - 1
204
195
  - 9
@@ -209,7 +200,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
200
  requirements:
210
201
  - - ">="
211
202
  - !ruby/object:Gem::Version
212
- hash: 3
213
203
  segments:
214
204
  - 0
215
205
  version: "0"