Fork me on GitHub

2010/10/07


このエントリーをはてなブックマークに追加
先日「Google 日本語入力 - CGI API」が公開されましたね。
Google 日本語入力 - CGI API
Google 日本語入力 - CGI API デベロッパーガイド

Google CGI API for Japanese Input Google CGI API for Japanese Input は、日本語変換をインターネット上で実現するための、CGI サービ...

http://www.google.com/intl/ja/ime/cgiapi.html
こんなの migemo の為にあるみたいなもんじゃないですか!

さっそく作りました。
"=============================================================================
" File: gmigemo.vim
" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
" Last Change:08-Oct-2010.
" Version: 0.1
" WebPage: http://github.com/mattn/gmigemo-vim
" Usage:
"
"   :GoogleMigemo ここではきものをぬぐ
"     match: "ココでは着物を脱ぐ"
"
"   :GoogleMigemo ここで はきものを ぬぐ
"     match: "此処で履物を脱ぐ"
"
" Require:
"   webapi-vim: http://github.com/mattn/webapi-vim

if exists("loaded_gmigemo") || v:version < 700
  finish
endif
let loaded_gmigemo = 1

function! s:nr2byte(nr)
  if a:nr < 0x80
    return nr2char(a:nr)
  elseif a:nr < 0x800
    return nr2char(a:nr/64+192).nr2char(a:nr%64+128)
  else
    return nr2char(a:nr/4096%16+224).nr2char(a:nr/64%64+128).nr2char(a:nr%64+128)
  endif
endfunction

function! s:nr2enc_char(charcode)
  if &encoding == 'utf-8'
    return nr2char(a:charcode)
  endif
  let char = s:nr2byte(a:charcode)
  if strlen(char) > 1
    let char = strtrans(iconv(char, 'utf-8', &encoding))
  endif
  return char
endfunction

function! g:GoogleMigemo(word)
  let word = substitute(a:word, '\s', ',', 'g')
  let url = "http://www.google.com/transliterate"
  let res = http#get(url, { "langpair": "ja-Hira|ja", "text": word }, {})
  let str = iconv(res.content, "utf-8", &encoding)
  let str = substitute(str, '\\u\(\x\x\x\x\)', '\=s:nr2enc_char("0x".submatch(1))', 'g')
  let str = substitute(str, "\n", "", "g")
  let g:hoge = str
  let arr = eval(str)
  let mx = ''
  for m in arr
    call map(m[1], 'substitute(v:val,"\\\\", "\\\\\\\\", "g")')
    let mx .= '\('.join(m[1], '\|').'\)'
  endfor
  return mx
endfunction

function! s:GoogleMigemo(word)
  if executable('curl') == 0
    echohl ErrorMsg
    echo 'GoogleMigemo: curl is not installed'
    echohl None
    return
  endif

  let word = a:word != '' ? a:word : input('GoogleMigemo:')
  if word == ''
    return
  endif
  let mx = g:GoogleMigemo(word)
  let @/ = mx
  let v:errmsg = ''
  silent! normal n
  if v:errmsg != ''
    echohl ErrorMsg
    echo v:errmsg
    echohl None
  endif
endfunction

command! -nargs=* GoogleMigemo :call <SID>GoogleMigemo(<q-args>)
nnoremap <silent> <leader>mg :call <SID>GoogleMigemo('')<cr>

" vi:set ts=8 sts=2 sw=2 tw=0:
いつも1ファイルで動くものを提供してきましたが、そろそろvimもライブラリとアプリケーションを分けないとvimの今後があやぶまれるな...(vimjoltsってなんだっけ汗)...と思ったので、今回は手前味噌ですが「webapi-vim」というのを使っています。
mattn's webapi-vim at master - GitHub

webapi-vim: vim interface to Web APIDescription:Require: curl command : http://curl.haxx.se/Thanks T...

http://github.com/mattn/webapi-vim
先日 vim-oauth で使った奴ですね。
まぁ単体にしたい人は書き換えて下さい。

使い方は簡単。
:GogoleMigemo ここではきものをぬぐ
とすると、「ココでは着物を脱ぐ」がマッチします。なお、「ここでは着物を脱ぐ」が検索したかったよ...という全国2000万人のエロいオッサン達。慌てないで。
:GogoleMigemo ここでは きものを ぬぐ
とスペースを入れると認識してくれ、ちゃんと「此処では着物を脱ぐ」にマッチします。もちろん「ここで はきものを ぬぐ」とすれば「此処で履物を脱ぐ」や「個々で履物を脱ぐ」にマッチしたりもします。
<leader>mg にキーマップしてあります。あと、グローバル関数「GoogleMigemo」も提供してあるので「let foo = GoogleMigemo(xxx)」な使い方も出来ます。
それなりに便利かもしれません。もちろんネットに繋がってないと使えませんし、エロい語句を検索すると、Google先生にネタを送ってしまいます。
ご利用は計画的に。
Posted at 23:29 in ソフトウェア::vim
Tagged as: google, IME, migemo
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2009/11/25


このエントリーをはてなブックマークに追加
そろそろgoでライブラリを作る頃かなーと思って、migemo(cmigemo)を使う物を書いてみた。
mattn's go-migemo at master - GitHub

migemo extension for go

コードの中ではKoRoNさんのcmigemoを使った。コードは少ないけど実は少しハマって、今日はそれを書き記したい。

migemoでは、正規表現文字列やパターン文字列をunsigned char*で引数として扱っているんですが、cgoを使ったC言語ライブラリの取り込みを行う場合、char*と型が合わなくてコンパイルエラーが発生する。しかしC言語の様に
*C.uchar(p)
等と書けない(これだとucharの参照になってしまう)Go君は、致し方なくchar*を引数に持つwrapper関数を用意するしかないんだけど、実はcgoに食わせるgoファイルでは
package migemo

/*
#include <migemo.h>
static char* _migemo_query(migemo* object, const char* query) {
  return (char*)migemo_query(object, (const unsigned char*)query);
}
static void _migemo_release(migemo* object, const char* str) {
  migemo_release(object, (unsigned char*)str);
}
*/
import "C";
と言った様に、Cのコードが書ける。ここにGoで扱い易い型のwrapperを書けば良い。今回の例だとunsigned char*の引数を持つ関数をchar*で渡せる(C.CString)関数を用意している事になる。

これにより、いちいち別ファイルにwrapper関数用意したりMakefileにwrapperをビルドする為のターゲットを書かなくても良い。

これは便利だ。

話戻してmigemo拡張ですが、現状Open/Close/Load/Queryの4メソッドを持っています。
Queryで渡したパターンによるマッチし得る複数の正規表現が得られます。
package main

import (
  "fmt";
  "regexp";
  "strings";
  "migemo";
)

func main() {
    var pattern = "goGengo";
    var match = "go言語";
    m := migemo.Open("../dict/utf-8.d/migemo-dict");
    s := migemo.Query(m, pattern);
    if (regexp.MustCompile(s).Match(strings.Bytes(match))) {
        fmt.Printf("%s は %s にマッチします!\n", pattern, match);
    } else {
        fmt.Printf("%s は %s にマッチしません!\n", pattern, match);
    }
}
実行すると
goGengo は go言語 にマッチします!
と出力されます。
地味に使えるかも。

Posted at 01:47 in ソフトウェア::lang::go
Tagged as: go, golang, migemo
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2009/02/14


このエントリーをはてなブックマークに追加
Luaでもやろうと思えば、色んな事が出来ます。先日書いた「LuaでTwitterるわ」を良い例に、Luaでも拡張さえ利用すれば何でも出来るんです。
で、今日は何をしようかと考えて...
Luaでmigemoを使用して、本当に「Lua」で「るわ」が検索出来るかどうかやってみようと思います。
#もう結果が見えていますが、やるんです...
まず、Luaで高度な処理を行うには、拡張モジュールを作る必要があります。
MigemoはC/Migemoを基礎ライブラリとして、ラッパI/Fとして作成します。
まずC/Migemoを、香り屋からsvnで取得して、ビルドします。
#今回は、Windowsでコンパイルしています。
C:¥temp> svn co http://cvs.kaoriya.net/svn/CMigemo/trunk cmigemo
C:¥temp> cd cmigemo
C:¥temp¥cmigemo> cp config.mak config.mk.orig
C:¥temp¥cmigemo> vim config.mak
C:¥temp¥cmigemo> diff config.mk.org config.mk
38,39c38,39
< FILTER_CP932  = qkc -q -u -s
< FILTER_EUCJP  = qkc -q -u -e
---
> #FILTER_CP932 = qkc -q -u -s
> #FILTER_EUCJP = qkc -q -u -e
41,42c41,42
< #FILTER_CP932 = nkf -s
< #FILTER_EUCJP = nkf -e
---
> FILTER_CP932  = nkf -s
> FILTER_EUCJP  = nkf -e

C:¥temp¥cmigemo> vcvars32
Setting environment for using Microsoft Visual C++ tools.
C:¥temp¥cmigemo> nmake msvc
C:¥temp¥cmigemo> nmake msvc-dict

次に、今回作成したluamigemoをビルドします。
C:¥Lua¥luamigemo> nmake
後は以下のコードを実行するまで
local migemo = require("migemo")
local rex_pcre = require("rex_pcre")

local mcx = migemo.open("C:/temp/cmigemo/dict/migemo-dict")

--migemo.set(
--  mcx,
--  migemo.DICTID_ROMA2HIRA,
--  "C:/temp/cmigemo/dict/roma2hira.dat")

migemo.set(mcx, migemo.OPINDEX_OR, "|");
migemo.set(mcx, migemo.OPINDEX_NEST_IN, "\\(");
migemo.set(mcx, migemo.OPINDEX_NEST_OUT, "\\)");

function test(subject, query)
  local pattern = migemo.query(mcx, query)
  local match = rex_pcre.match(subject, pattern)
  if match then
    print(subject.." is matched with "..query)
  else
    print(subject.." is not matched with "..query)
  end
end

test("まっつん", "mattun")
test("マッツン", "mattun")
test("マッツン", "mattn")
test("幹事", "kanji")
test("私はマッツンです", "watashiHaMattunDesu")
test("るわ", "lua")

今回は、migemoで取得した正規表現パタンを食わせる為にLrexlibという拡張を使用し、検証しています。
実行結果は
まっつん is matched with mattun
マッツン is matched with mattun
マッツン is not matched with mattn
幹事 is matched with kanji
私はマッツンです is matched with watashiHaMattunDesu
るわ is not matched with lua
となり、結果「Lua」では「るわ」は検索出来ない事が分かりました。

ダウンロード:luamigemo.tar.gz
Posted at 03:01 in ソフトウェア::lang::lua
Tagged as: lua, migemo
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip