キンガ!キンガ!
参考: https://twitter.com/todesking/status/51560179707293696

ポイント支払いの上,額がみみっちいので初任給もらったら追加する予定.
卒業前に旅行に行こうかしらん.
0101000111001110101001001110011100111100001001000000100001010100 1001001111011101111110110001100001000110001010001110111010111110 1100010110110010101011011111011100110101110011011000111011100111 1101000110110000001101011011010000110100111100011000111000001110 0100010001010001011100011110101101110101110000001001001111100011 1100011111010100100111000001011010101001111000111111101101001110 1100100001100100000101011000111100001010010111110100101011010101 1001101010110001011111010110010011101011100100010110011111101111 0110011110111111010111000110001001110010110100001010100001011010 1010000101011101100100000010000110001100111100101110101111101110 1011001000110101001101001111110000111001001111011110001111010110 1101101110011111011011011011100001010010101110100011101100010011 1111110111010100101010010100101111110010111110011111001100000011 1100100001101110010010001001010010000100111000110000001011101010 0100110000010110111001100001010110011001000010110010111111011101 101111001010010110010111110001
私はオフ専門なのでオンライン対戦の感想は他あたってください.
XUL/Migemoが長らく更新されてないわけですが,しかしVimperatorと組み合わせて使ってる人もいるわけでして.んで,C/MigemoでXUL/Migemoが提供しているAPI部分を代替できるんじゃないのと思って,js-ctypesとAdd-on SDKの練習がてらさらさらっと書いてみた.必要でしたら持って行ってください.パッケージング化する気力はないので必要としている人がやってくれ.
注意事項:
//migemo.js
const {Cc,Ci,Cm,Cr,Cu} = require("chrome");
Cu.import("resource://gre/modules/ctypes.jsm", this);
/* for migemo_load() */
var MIGEMO_DICTID_INVALID = 0;
var MIGEMO_DICTID_MIGEMO = 1;
var MIGEMO_DICTID_ROMA2HIRA = 2;
var MIGEMO_DICTID_HIRA2KATA = 3;
var MIGEMO_DICTID_HAN2ZEN = 4;
var MIGEMO_DICTID_ZEN2HAN = 5;
/* for migemo_set_operator()/migemo_get_operator(). see: rxgen.h */
var MIGEMO_OPINDEX_OR = 0;
var MIGEMO_OPINDEX_NEST_IN = 1;
var MIGEMO_OPINDEX_NEST_OUT = 2;
var MIGEMO_OPINDEX_SELECT_IN = 3;
var MIGEMO_OPINDEX_SELECT_OUT = 4;
var MIGEMO_OPINDEX_NEWLINE = 5;
const migemo = new ctypes.StructType(
'migemo',
[
{'enable': ctypes.int32_t},
{'mtree': ctypes.voidptr_t},
{'charset': ctypes.int32_t},
{'roma2hira': ctypes.voidptr_t},
{'hira2kata': ctypes.voidptr_t},
{'han2zen': ctypes.voidptr_t},
{'zen2han': ctypes.voidptr_t},
{'rx': ctypes.voidptr_t},
{'addword': ctypes.voidptr_t},
{'char2int': ctypes.voidptr_t}
]);
var migemo_open;
var migemo_close;
var migemo_query;
var migemo_release;
var migemo_set_operator;
var migemo_get_operator;
var migemo_setproc_char2int;
var migemo_setproc_int2char;
var migemo_load;
var migemo_is_enable;
var m;
var lib;
function ensureLoaded(){
var path = "C:\\path\\to\\migemo.dll";
var dict = "C:\\path\\to\\dict\\utf-8\\migemo-dict";
if(!lib){
return load(path, dict);
}else{
return m;
}
return null;
}
function load(path, dict){
if(!lib){
lib = ctypes.open(path);
if(!lib) throw "can't load migemo dll";
}else{
unload();
}
migemo_open = lib.declare("migemo_open",
ctypes.winapi_abi,
migemo.ptr,
ctypes.char.ptr); //path to dict
migemo_close = lib.declare("migemo_close",
ctypes.winapi_abi,
ctypes.void_t,
migemo.ptr); //migemo object
migemo_query = lib.declare("migemo_query",
ctypes.winapi_abi,
ctypes.unsigned_char.ptr,
migemo.ptr, //migemo object
ctypes.unsigned_char.ptr); //query
migemo_release = lib.declare("migemo_release",
ctypes.winapi_abi,
ctypes.void_t,
migemo.ptr, //migemo object
ctypes.unsigned_char.ptr); //query
/* TODO:
int MIGEMO_CALLTYPE migemo_set_operator(migemo* object, int index,
const unsigned char* op);
const unsigned char* MIGEMO_CALLTYPE migemo_get_operator(migemo* object,
int index);
void MIGEMO_CALLTYPE migemo_setproc_char2int(migemo* object,
MIGEMO_PROC_CHAR2INT proc);
void MIGEMO_CALLTYPE migemo_setproc_int2char(migemo* object,
MIGEMO_PROC_INT2CHAR proc);
*/
migemo_load = lib.declare("migemo_load",
ctypes.winapi_abi,
ctypes.int32_t,
migemo.ptr, //migemo object
ctypes.int32_t, //dict_id
ctypes.char.ptr); //path to dict file
migemo_is_enable = lib.declare("migemo_is_enable",
ctypes.winapi_abi,
ctypes.int32_t,
migemo.ptr); //migemo object
if(!m){
m = migemo_open(null);
}
if(!m.address()) throw "creation of migemo object failed";
var rv = migemo_load(m, MIGEMO_DICTID_MIGEMO, dict);
if(rv == 0){
throw "failed to load migemo dict:" + dict;
}
return m;
}
function unload(){
migemo_close(m);
lib.close();
m = null;
lib = null;
}
function provider(){
return "C/Migemo bridge 0.0.1"
}
function version(){
return "0.0.1";
}
function lang(){
return "ja"; //temporary
}
function query(aInput){
ensureLoaded();
var p;
p = migemo_query(m, aInput);
var rawstr = p.readString();
console.log(rawstr);
migemo_release(m, p);
return rawstr;
}
function queries(aInput){
var arr = aInput.split(" ");
arr = arr.filter(function(e) {
return e != "";
});
return arr.map(function(e){ return query(e); });
}
function queryFunctional(aInput){
if(!ensureLoaded()) return "";
throw "not implemented";
}
function queriesFunctional(aInput){
if(!ensureLoaded()) return "";
throw "not implemented";
}
function getRegExp(aInput, aFlags){
return new RegExp(query(aInput), aFlags);
}
function getRegExps(aInput, aFlags){
var rxs = queries(aInput);
return rxs.map(function(e){ return new RegExp(e, aFlags); });
}
function getRegExpFunctional(aInput, aFlags){
if(!ensureLoaded()) return null;
throw "not implemented";
}
function getRegExpsFunctional(aInput, aFlags){
if(!ensureLoaded()) return null;
throw "not implemented";
}
exports.query = query;
exports.queries = queries;
exports.getRegExp = getRegExp;
exports.getRegExps = getRegExps;
//main.js
//こんな感じで使えるはず,たぶんXUL/Migemo互換.
var migemo = require("migemo");
var notifications = require("notifications");
var rawstr = migemo.query("$");
notifications.notify({ title: "Migemo", text: rawstr });
C/Migemoのソース見たらXPCOM化するためのソースも入ってたんですね,でもjs-ctypesのお陰でこの労力も要らなくなるわけだ.
4年ぶりの更新でございます.XULRunner 6.0だといろいろ面倒なので7.0以降対応です.Windows 7で動作を確認しています.
wxWidgets2.9.3 からwxWebViewCtrlが使えるようになるらしいんですけど,こいつはWindowsではIE,Gtk環境とMacではWebKitを使うようになってます.GeckoめんどいしwxWebViewCtrlかwxWebKitにごっそり移行したいですね.
wxWidgets版WebKitをビルドしててリンク時にメモリが足りなくて往生したので(特にデバッグ版),あと最近仮想マシンの作り過ぎでノートPCが手狭だったので,根本的解決を図るべくメモリの多いマシンを構築しようと思い立った.あまり部屋にスペースが無いため,なるべくコンパクトなものをということで,富士通のPRIMERGY MX130 S1を買い,メモリを4G×2追加した.
とりあえず動けばいいやと思ってたので型を合わせるだけの簡単な仕事をした.なので汚い.基本的に素のF#の範囲でどうにかしようと思ってたんだけど,List.memの代替品がなさげなので,やむなくPowerPackのOCaml互換モジュールを使った.今できているのはPowerPC版だけだがdiffを見ればすぐSPARC版もできるはず.fib.mlは合致することを確認済み.float.cはまだ移植してない.
jQueryでタブブラウザ的な何かを作ってみましたが残念ながらChromelessではありません.QtWebKitのWebKit Bridge,つまりC++で書かれたQObjectをWebKitのJavaScriptから叩くことができる機能を使ったものです.タブ部分はdynatreeをそのまま使って,CSSをゴニョゴニョしてそれっぽく見せています.dynatreeだとitemの中にHTMLを自由に仕込むことができるので,僕の用途にもっとも近い.自力でGUI部品作るのってとても精神を害するので本当に良かった.
命名は鉛筆からの連想で,ちょっとしたメモを取りやすいものにしたいから.
ま,どこまでちゃんとやるか分からんけどねー.いままでもそうだったし,これからもきっとそうだ.
ほい(PDF).ぶっちゃけ出し惜しみしてたデータを全開放しただけです.