2012/11/01


先日「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 by



2012/10/31


サブドメインに任意の文字列が入るウェブアプリのローカル開発 - 冬通りに消え行く制服ガールは?夢物語にリアルを求めない。 - subtech

サブドメインに任意の文字列が入るようなサービスをローカルで開発しようとすると、いろんなホストを /etc/hosts に書かないといけなくてすごく不便なので、なんとかしようと思っていたところ、id:hakobe932 先生に「それアレでできますよ」との御言葉を頂き、簡単なスクリプトを書きました。

http://subtech.g.hatena.ne.jp/cho45/20110804/1312389877
僕ならこうやるかも

libcho45.c
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>

static const char* host_mask;
static struct hostent *(*__gethostbyname)
    (const char*);
static int (*__gethostbyname_r)
    (const char*, struct hostent*, char*, size_tstruct hostent**, int *);
static int (*__getaddrinfo)
    (const char*, const char*, const struct addrinfo*, struct addrinfo**);

__attribute__((constructor))
void
wrap_gethostbyname() {
  __gethostbyname = dlsym(RTLD_NEXT, "gethostbyname");
  __gethostbyname_r = dlsym(RTLD_NEXT, "gethostbyname_r");
  __getaddrinfo = dlsym(RTLD_NEXT, "getaddrinfo");
  host_mask = getenv("HOST_MASK");
  if (!host_mask) host_mask = "";
}

struct hostent*
gethostbyname(const char* name) {
  if(strstr(name, host_mask)){
    return (*__gethostbyname)("localhost");
  }
  return (*__gethostbyname)(name);
}

int
gethostbyname_r(const char* name, struct hostent* result, char* buffer, size_t buflen, struct hostent** presult, int* h_errnop) {
  if(strstr(name, host_mask)){
    return (*__gethostbyname_r)("localhost", result, buffer, buflen, presult, h_errnop);
  }
  return (*__gethostbyname_r)(name, result, buffer, buflen, presult, h_errnop);
}

int
getaddrinfo(const char* name, const char* service, const struct addrinfo* hints, struct addrinfo** res) {
  if(strstr(name, host_mask)){
    return (*__getaddrinfo)("localhost", service, hints, res);
  }
  return (*__getaddrinfo)(name, service, hints, res);
}
このソースを # gcc -o libcho45.so -fPIC -shared libcho45.c -ldl -lnsl
でビルドして、例えばこんなperlスクリプトであれば

cho45.pl
use strict;
use warnings;

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://cho45.local.example.com/");
warn $res->decoded_content;
以下の様に起動する
# HOST_MASK=.local.example.com LD_PRELOAD=./libcho45.so perl cho45.pl
まぁ、やってる事は単純ですね!もちろんちゃんとした後方一致にするべきですが、まぁいいですよね。
昔のオジサン達はこんな事やってました。

この辺り、オジサンじゃないけどkazuhoさん辺りが詳しそう。
Posted at by



2012/10/30


plack を使ってて「サーバのサブフォルダを間借りして動かしたい」って事がたまにあるんだけど、そんな場合 nginx の設定でリバースプロキシに渡すって事をやります。 location /foo {
    try_files $uri $uri.html $uri/index.html @proxy-foo;
}

location @proxy-foo {
    proxy_pass http://localhost:5000;
    proxy_set_header Host $http_host;
}
この場合、通常の Plack アプリケーションだと / がアプリケーションルートになっているので404になってしまう。よって app.psgi とは別に !perl

use strict;
use warnings;
use Plack::Builder;
use Plack::Util;

builder {
    mount '/foo/' => Plack::Util::load_psgi('app.psgi');
}
の様な wrapper スクリプトを書く必要がありました。
しかし先日、plackup に --path 引数が追加され $ plackup --path /foo と書くことで、自動的にマウントしてくれる機能が付きました。
これでいちいち wrapper スクリプトを書かずに済むようになりました。

僕的に便利
Posted at by