2009/07/23


MOONGIFTでKeepNoteってのを知った。
MOONGIFT: » Evernoteのような個人用スクラップブック「KeepNote」:オープンソースを毎日紹介

今回紹介するオープンソース・ソフトウェアはKeepNote、マルチプラットフォームで動作するメモアプリケーションだ。

http://www.moongift.jp/2009/07/keepnote/
試してみた。WYSIWYGエディタでなかなか良い。
keepnote
MOONGIFTでは

GTKとあって、Windows上での動作がちょっと不安定な気もする。マルチプラットフォームで動作するメモ環境に興味のある方は試してみよう。

と書かれていたけど、少し手を加えるだけで結構使い勝手が良くなった。
以下、WindowsでKeepNoteを使う場合のフリカケ。

日付表示でロケールを使わない

そのままだと、一覧に表示される作成日付が「%p」というAM/PMをロケールに直した物が使われるが、utf-8なGTKにも関わらずWindowsなのでシフトJISが使われてしまう。設定画面で、AM/PM付き12時間表記「%I:%M %p」から24時間表記「%H:%M」に直す。
ちなみに、もしソースからコンパイルされたのであれば g_locale_to_utf8 という関数で utf-8 に直すようなpatchを書くといい。

入力モジュールを追加する

KeepNoteのWindows版にはimmoduleというGTK上での入力機構モジュールが同根されていない。入力出来ない訳ではないが OverTheSpot な入力は出来ない。そこでここからGTKのランタイムを持ってきて中にある lib/gtk-2.0/2.10.0/immodules/ をKeepNoteにコピーする。これで完了。

この2つだけでもグンと使いやすくなった。

このKeepNote、ページ自身はHTMLで出力されるのでノート出力先フォルダをDropboxにしておけば、もうEvernoteですね。
Linux版もあるので、試してみよう。
Posted at by



2009/07/21


jjencode素晴らしいですね。記号だけでjavascriptが実行出来てしまいます。
何かに使えないかなーと考えて、apacheのmod_ext_filterを使ってjavascriptの難読サーブをやってみようかと思います。
javascriptエンジンとして使うのは、v8。本当は全部Cで書けば速いのでしょうがメンドクサイのでやりません。
以下フィルタのソース
crypt-js.cc
#include <v8.h>
#include <string>
#include <iostream>

static std::string&
replace_string(std::string& str, const std::string from, const std::string dest) {
    std::string::size_type n, nb = 0;
    while((n = str.find(from, nb)) != std::string::npos) {
        str.replace(n, from.size(), dest);
        nb = n + dest.size();
    }
    return str;
}

v8::Handle<v8::Value> Print(const v8::Arguments& args) {
  bool first = true;
  for (int i = 0; i < args.Length(); i++) {
    v8::HandleScope handle_scope;
    if (first) {
      first = false;
    } else {
      printf(" ");
    }
    v8::String::Utf8Value str(args[i]);
    const char* cstr = *str ? *str : "";
    printf("%s", cstr);
  }
  printf("\n");
  return v8::Undefined();
}

int main(int argc, char* argv[]) {
  v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
  v8::HandleScope handle_scope;
  v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
  global->Set(v8::String::New("print"), v8::FunctionTemplate::New(Print));
  v8::Handle<v8::Context> context = v8::Context::New(NULL, global);
  v8::Context::Scope context_scope(context);

  std::string line, content;
  while(!std::cin.eof()) {
    std::getline(std::cin, line);
    content += line;
  }
  replace_string(content, "\\", "\\\\");
  replace_string(content, "'", "\\'");
  line = "var text = '";
  line += content;
  line += "';";
  line +=
    "var r=\"\";"
    "var n;"
    "var t;"
    "var b=[ \"___\", \"__$\", \"_$_\", \"_$$\", \"$__\", \"$_$\", \"$$_\", \"$$$\", \"$___\", \"$__$\", \"$_$_\", \"$_$$\", \"$$__\", \"$$_$\", \"$$$_\", \"$$$$\", ];"
    "for( var i = 0; i < text.length; i++ ){"
    "    n = text.charCodeAt( i );"
    "    if( n < 128 ){"
    "        r += \"\\\"\\\\\\\\\\\"+\" + n.toString( 8 ).replace( /[0-7]/g, function(c){ return \"$.\"+b[ c ]+\"+\" } );"
    "    }else{"
    "        r += \"\\\"\\\\\\\\\\\"+$._+\" + n.toString(16).replace( /[0-9a-f]/gi, function(c){ return \"$.\"+b[parseInt(c,16)]+\"+\"} );"
    "    }"
    "}"
    "print("
    "\"$=~[];$={___:++$,$$$$:(![]+\\\"\\\")[$],__$:++$,$_$_:(![]+\\\"\\\")[$],_$_:++$,$_$$:({}+\\\"\\\")[$],$$_$:($[$]+\\\"\\\")[$],_$$:++$,$$$_:(!\\\"\\\"+\\\"\\\")[$],$__:++$,$_$:++$,$$__:({}+\\\"\\\")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};\"+"
    "\"$.$_=\"+"
    "\"($.$_=$+\\\"\\\")[$.$_$]+\"+"
    "\"($._$=$.$_[$.__$])+\"+"
    "\"($.$$=($.$+\\\"\\\")[$.__$])+\"+"
    "\"((!$)+\\\"\\\")[$._$$]+\"+"
    "\"($.__=$.$_[$.$$_])+\"+"
    "\"($.$=(!\\\"\\\"+\\\"\\\")[$.__$])+\"+"
    "\"($._=(!\\\"\\\"+\\\"\\\")[$._$_])+\"+"
    "\"$.$_[$.$_$]+\"+"
    "\"$.__+\"+"
    "\"$._$+\"+"
    "\"$.$;\"+"
    "\"$.$$=\"+"
    "\"$.$+\"+"
    "\"(!\\\"\\\"+\\\"\\\")[$._$$]+\"+"
    "\"$.__+\"+"
    "\"$._+\"+"
    "\"$.$+\"+"
    "\"$.$$;\"+"
    "\"$.$=($.___)[$.$_][$.$_];\"+"
    "\"$.$($.$($.$$+\\\"\\\\\\\"\\\"+\" + r + \"\\\"\\\\\\\"\\\")())();\");";
  v8::Handle<v8::String> source = v8::String::New(line.c_str(), line.size());
  v8::TryCatch try_catch;
  v8::Handle<v8::Script> script = v8::Script::Compile(source, v8::String::New(""));
  v8::Handle<v8::Value> result = script->Run();
  return 0;
}

エスケープして変数textに入れて、残りはjjencodeそのままです。
これをhttpd.confで以下の様に設定します。 LoadModule ext_filter_module modules/mod_ext_filter.so
ExtFilterDefine crypt_js mode=output intype=application/x-javascript cmd="/path/to/crypt-js"
出来ました。簡単ですね。
これで以下のjavascriptをダウンロードしてみます。
window.alert('hasegawa!');
コマンドラインから...
curl http://localhost:8080/filter/foo.js
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+"\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$__+$.$__+"\\"+$.__$+$.$_$+$.$$$+"\\"+$.__$+$.$$_+$.$$$+"\\"+$.$_$+$.$$_+"\\"+$.__$+$.$__+$.__$+"\\"+$.__$+$.$_$+$.$__+"\\"+$.__$+$.$__+$.$_$+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$$_+$.$__+"\\"+$.$_$+$.___+"\\"+$.$__+$.$$$+"\\"+$.__$+$.$_$+$.___+"\\"+$.__$+$.$__+$.__$+"\\"+$.__$+$.$$_+$._$$+"\\"+$.__$+$.$__+$.$_$+"\\"+$.__$+$.$__+$.$$$+"\\"+$.__$+$.$__+$.__$+"\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$__+$.__$+"\\"+$.$__+$.__$+"\\"+$.$__+$.$$$+"\\"+$.$_$+$.__$+"\\"+$.$$$+$._$$+"\"")())();
おぉ!
HTMLから実行してみました。
hasegawa-crypt-js
おぉ!

これいいね!とか思ってjQueryでやってみたら、30秒以上は戻って来ませんでした... orz
Posted at by




別にEditor's Warを起こそうって訳では無いです。
だたvimが弱々しく読める文章だったので補足させて頂きたい。
Emacs の人と Vim の人のキーストロークの数え方の違い。 - 日々、とんは語る。

Ctr キーは1ストロークには入りません!

普段 Emacs を使うとき、どう考えても「修飾キー + 文字キーの組み合わせは一発操作」という感覚でしかありません。

「Ctr + Alt + s」とか、修飾キーが複数であっても、同時押しであれば、僕の中では1ストロークです。

http://d.hatena.ne.jp/tomoya/20090715/1247590638
慣れればそうかもしれませんが、モディファイアキーを使うには両手、もしくは指が2本要ります。片手で済むならばもう片方の手で鼻をほじる事だって出来るんです。なんてすばらしい。

Emacs の人と Vim の人のキーストロークの数え方の違い。 - 日々、とんは語る。

一発で何んでもできるっていうところが重要で、とりあえず、気に入ったコマンドはキーバインドを割り当てます*1。これ常識。

http://d.hatena.ne.jp/tomoya/20090715/1247590638
vimもしますよ。人によってはストロークではなくてモディファイアキーを使った物にマップする人もいます。

Emacs の人と Vim の人のキーストロークの数え方の違い。 - 日々、とんは語る。

何ならキーバインド定義用のマイナーモードとか作って、オンオフを切り替えることで、キーバインドを自由に入れ替えて使う事もできます。

http://d.hatena.ne.jp/tomoya/20090715/1247590638
それもvimで出来ますし、無ければ作れます。

Emacs の人と Vim の人のキーストロークの数え方の違い。 - 日々、とんは語る。

そういった、キー操作カスタマイズの柔軟性が Emacs の利点であり、Vim の場合のアレコレする場合はコマンドを打ち込まないとアレコレできないところに、僕は不満を感じるのかもしれないなぁと、ふと思った。

http://d.hatena.ne.jp/tomoya/20090715/1247590638
vimも設定次第ではいくらでも出来ます。キー登録用のスクリプトもやろうと思えば出来ます。
emacsでも次回起動からも有効にしようと思えば .emacs に書くかと思いますが、間違ってますか?

ただしvimmerはしません。なぜなら...

コマンドを打ち込むのが好きだから。

自分だけのvimrcを作る為に、惜しげなく時間を費やす人達なのです。DropBoxなんかのストレージサービスやgithubなんかにvimrcを置いてしまう人達なんです。
ブログなんかでvimrcを晒しちゃう人達なんです。


えっそれemacsユーザも同じ?変態ですね!

mattn the vimmer!
Posted at by