Index: /lang/ruby/ssb/test/test_ktai_db.rb
===================================================================
--- /lang/ruby/ssb/test/test_ktai_db.rb (revision 2135)
+++ /lang/ruby/ssb/test/test_ktai_db.rb (revision 2145)
@@ -101,4 +101,19 @@
     assert_equal(ret[0][:name], 'NM502i')
   end
+
+  # useragentで検索するとき、完全一致のときは1件だけ
+  def test_search_by_useragent_fullmatch
+    ret = @ktai_db.search(:useragent => 'UP.Browser/3.04-HI11 UP.Link/3.4.4')
+    assert_equal(ret.size, 1)
+    assert_equal(ret[0][:name], 'C302H')
+  end
+
+  # useragentで検索は前方からの部分一致でok
+  def test_search_by_useragent_partmatch
+    ret = @ktai_db.search(:useragent => 'UP.Browser/3.04')
+    assert_equal(ret.size, 8)
+    assert_equal(ret[0][:name], 'C301T')
+    assert_equal(ret[7][:name], 'C309H')
+  end
 end
 
Index: /lang/ruby/ssb/public_html/ktai_db.rbx
===================================================================
--- /lang/ruby/ssb/public_html/ktai_db.rbx (revision 2141)
+++ /lang/ruby/ssb/public_html/ktai_db.rbx (revision 2145)
@@ -20,9 +20,11 @@
     def do_GET(req, res)
       res.header['Content-Type'] = 'text/html; charset=utf-8'
-      ktai = @db.search(:carrier => req.query['carrier'],
-                        :name    => req.query['name'])
+      ktai = @db.search(:carrier   => req.query['carrier'],
+                        :name      => req.query['name'],
+                        :useragent => req.query['useragent'])
       res.body += "<h1>search result</h1>"
       res.body += "carrier: #{req.query['carrier']}<br />"
       res.body += "name: #{req.query['name']}<br />"
+      res.body += "useragent #{req.query['useragent']}<br />"
       res.body += "result: #{ktai.size}"
       res.body += "<hr />"
Index: /lang/ruby/ssb/libs/ssb/ktai_db.rb
===================================================================
--- /lang/ruby/ssb/libs/ssb/ktai_db.rb (revision 2135)
+++ /lang/ruby/ssb/libs/ssb/ktai_db.rb (revision 2145)
@@ -83,5 +83,12 @@
 
       # 前方一致で探す
-      ret = list.select {|e| e[cond[0]] =~ Regexp.new("^#{cond[1]}.*", Regexp::IGNORECASE) }
+      ret = nil
+      if cond[0] == :useragent
+        # useragent のときだけ前方からの部分一致でok
+        ret = list.select {|e| e[cond[0]].index(cond[1]) }
+      else
+        # 普通は後方一致
+        ret = list.select {|e| e[cond[0]] =~ Regexp.union(/^#{cond[1]}.*/i) }
+      end
       if query.size == 0
         ret
@@ -100,5 +107,5 @@
 
       for cond in remap_table do
-        if source =~ Regexp.new(cond, Regexp::IGNORECASE)
+        if source =~ Regexp.union(/#{cond}/i)
           source = cond
           break
