emacs25にバージョンアップ

有志の方がIMEパッチを適用して64bitでWindowsビルドしてくれているのでこちらを利用。ありがたや。

https://github.com/chuntaro/NTEmacs64

設定を何も変えずにexeだけ置き換えて動いたのに感動。

diredでドット始まりのファイルが先頭に来なくなった。

(setq dired-listing-switches "-aGlhv")

v を足したら元に戻った。

MoinMoinでWebP画像を表示する

moin-1.9.8を使っています。PNG画像を減色して貼り付けていたのですが試しにWebPにしたらめちゃめちゃ小さくなるじゃないですか!
しかしmoin-1.9.8はWebPをアップロードしても画像とは認識してくれませんでした。
むむぅ。

ということでMoinMoinのコードを読んでみる。imgタグを生成してるのはここ。

http://hg.moinmo.in/moin/1.9/file/dbe605c5867c/MoinMoin/action/AttachFile.py#l1161

1160     # destinguishs if browser need a plugin in place
1161     if mt.major == 'image' and mt.minor in config.browser_supported_images:
1162         url = getAttachUrl(pagename, filename, request)
1163         request.write('<img src="%s" alt="%s">' % (
1164             wikiutil.escape(url, 1),
1165             wikiutil.escape(filename, 1)))
1166         return
1167     elif mt.major == 'text':
1168         ext = os.path.splitext(filename)[1]

ふむふむMIMEタイプがbrowser_supported_imagesにあればimgタグになるようになってるな。

browser_supported_imagesを確認してみる。

http://hg.moinmo.in/moin/1.9/file/dbe605c5867c/MoinMoin/config/__init__.py#15

14 # List of image types browser do support regulary
15 browser_supported_images = ('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', )

あ、やっぱりwebpが入ってない。
ということでwikiconfig.pyでもろもろ追加。

import mimetypes
mimetypes.add_type('image/webp', '.webp', True) ### .webp は image/webp
import MoinMoin.config
MoinMoin.config.browser_supported_images = tuple(list(MoinMoin.config.browser_supported_images) + ['webp']) ### webpも画像

これでサーバーを再起動したら見事に.webpが画像として表示されました~。
これで軽量画像ライフが送れます。

chrome以外では表示できないらしいけどねっ。

C++単体テストTIPS ~みんなともだち~

テストコード書いてると対象のクラスのprivateメンバの値が知りたいときがよくある。

class MyTest;
#define private \
    friend class ::MyTest; private
#include <TargetClass.h>
#include <cxxtest/TestSuite.h>

class MyTest : public CxxTest::TestSuite {
public:
    void testHoge() {
        auto p = new TargetClass();
        TS_ASSERT_EQUAL(100, p->privateMember_); // friendになってるのでprivateにもアクセスし放題
    }
};

こんな感じ。

最初はprivateをpublicに置き換えようとしたが、そうするとprivateメソッドのマングルが変わってしまいリンクエラーになったのでfriendを使うことにした。

テストが捗る。

sqlite3でダメ文字を入れてしまったときの対処

うっかりダメ文字をINSERTしてしまって困った。

# hoge.py
conn = sqlite3.connect('hoge.db')
conn.text_factory = lambda raw: raw.decode('utf8', errors='replace')

これは便利。

言語バーのENがたまに復活する。

id:shive:20160720:1469017510
リストに英語(米国)は存在しないのだけど、もう一回追加して削除してやれば消える。なんなんだ…。

子プロセス起動時に管理者権限での実行を強制する

ShellExecuteExでlpVerb=runasにすれば良いらしい。

#include <windows.h>
#include <shellapi.h>
#include <cstdio>

int
main(int, const char**) {
    SHELLEXECUTEINFO sei = {};
    sei.cbSize = sizeof(sei);
    sei.fMask |= SEE_MASK_WAITFORINPUTIDLE;
    sei.fMask |= SEE_MASK_FLAG_NO_UI;
    sei.fMask |= SEE_MASK_NO_CONSOLE;
    sei.fMask |= SEE_MASK_NOASYNC;
    sei.fMask |= SEE_MASK_NOCLOSEPROCESS;
    sei.lpVerb = "runas";
    sei.lpFile = "notepad";
    sei.nShow = SW_SHOWNORMAL;
    if(!ShellExecuteEx(&sei)) {
        return -1;
    }
    std::printf("hInstApp = 0x%08llx\n", uintptr_t(sei.hInstApp));
    std::printf("hProcess = 0x%08llx\n", uintptr_t(sei.hProcess));
    WaitForSingleObject(sei.hProcess, INFINITE);
    return 0;
}

ShellExecuteExってCreateProcessに渡すSTARTUPINFOにあるような子プロセスの標準出力をリダイレクトで拾うにはどうしたらいいんだろうか?