SSE 命令の使用可否チェックする CMake モジュールを単独リポジトリにした

以前書いた SSE 命令の使用可否を判定する CMake モジュールを Gist から単独のリポジトリに移動しました。

https://github.com/hideo55/CMake-FindSSE


Gistのままでもcloneできますが、リポジトリにしておいた方が他の人が利用しやすいだろうという考えによるものです。

利用する場合は以下のようにサブモジュールとするといいと思います。

git submodule add https://github.com/hideo55/CMake-FindSSE.git cmake/FindSSE

あとは、CMakeLists.txt に以下のように記述するだけです。

SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
INCLUDE(FindSSE/FindSSE)
FindSSE ()
IF(SSE3_FOUND)
    IF(SSSE3_FOUND)
            SET(CXX_DFLAGS -DHSDS_USE_SSE3 -msse3 -mssse3)
    ENDIF(SSSE3_FOUND)
ENDIF(SSE3_FOUND)

IF(SSE4_2_FOUND)
        SET(CXX_DFLAGS ${CXX_DFLAGS} -DHSDS_USE_POPCNT -msse4.2 -mpopcnt)
ENDIF(SSE4_2_FOUND)
ADD_DEFINITIONS(${CXX_DFLAGS})

Go言語用の Vim 設定を見なおした

暫く Vim の設定をいじっていなかったので、設定(Vim 7.4 へのアップグレードも含めて)を見直しました。

以前の記事はこちら

Go 付属の vim プラグインを使うのをやめて vim-go にした

$GOROOT/libexec/misc/vimVim プラグインが付属していますが、使うのをやめました。
理由としては付属 Vim プラグインと gocode の Vim プラグインを使うより、vim-go を使うほうが管理が楽だと考えたためです。

Go 関連の設定は以下のようにしました。

if !exists('g:neocomplete#omni_patterns')
    let g:neocomplete#omni_patterns = {}
endif
let g:neocomplete#omni_patterns.go = '\h\w*\.\?'

let g:quickrun_config['go'] = {
          \ 'command': 'go',
          \ 'exec': ['%c run %s']
          \ }

""" vim-go
let g:go_bin_path = expand("~/.go/bin")
let g:go_play_open_browser = 0
let g:go_fmt_fail_silently = 1
let g:go_fmt_autosave = 0
let g:go_fmt_command = "gofmt"
let g:go_disable_autoinstall = 1

au FileType go nmap <Leader>i <Plug>(go-info)
au FileType go nmap <Leader>gd <Plug>(go-doc)
au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
au FileType go nmap <leader>gb <Plug>(go-build)
au FileType go nmap <leader>gt <Plug>(go-test)
au FileType go nmap gd <Plug>(go-def)
au FileType go nmap <Leader>ds <Plug>(go-def-split)
au FileType go nmap <Leader>dv <Plug>(go-def-vertical)
au FileType go nmap <Leader>dt <Plug>(go-def-tab)
au FileType go nmap <Leader>gl :GoLint<CR>

gitでlessが意図しない挙動をする場合

gitのページャとしてlessを使用している場合に、環境変数LESSを設定していないとgitがデフォルトで"FRSX"を設定するようになっています。設定している箇所は以下です。
pager.c

ということで、意図しないオプションが設定されたくない場合は環境変数LESSを自分で設定しておくか、.gitconfig で以下のようにするといいです。

[core]
    pager = less -+$LESS -XR

"-+$LESS" することで、$LESSの設定を打ち消しています。

npm の Node.js C++ Addonを Node.js v0.11 に対応させた

npmにあげてあるNode.jsのC++ Addon を Node.js v0.11 に対応させました。

https://www.npmjs.org/package/kytea
https://www.npmjs.org/package/murmurhash3
https://www.npmjs.org/package/unqlite

これらのモジュールは以前までは自前で Node.js の各バージョンに対応していたが、Node.js v0.11 での非互換な変更に対応しつつ、以前のバージョンもサポートするのが大変だったので NAN を使うようにしました。
現時点では NAN 自体の API もあまり安定していないため、NAN のバージョンアップに対応する手間はありますが Node.js 自体の変化に対応するよりは楽だと判断した結果です。

NANの使用に関しては、基本的に node-leveldownの0.11-wipブランチを参考にすればいいと思います。

テンプレートクラスのメソッドをLD_PRELOADで上書きする

動的にリンクされる共有ライブラリの挙動を変える方法として、有名なのがLD_PRELOADで事前に共有ライブラリをロードしておくことです。しかし、C++でテンプレートクラスの挙動を変更する必要があったのですが例があまり見当たらないので記録しておきます。

続きを読む

MinillaでModule::Build::XSUtilを使う

もう先週の話になりますが、拙作 Module::Build::XSUtilがサポートされたMinilla 0.7.0がリリースされました。

Module::Build::XSUtilとは?

Module::Build::XSUtilはModule::Install::XSUtilと同等の機能をModule::Buildで実現するためのモジュールです。以下の機能があります。

MinillaでModule::Build::XSUtilを使用する方法

minil.tomlに以下のようにXSUtilセクションを記述してください。

[XSUtil]
needs_compiler_c99 = 1
generate_ppport_h = 1
cc_warnings = 1

この設定で、コンパイラのC99サポートのチェック、ディストリビューションのトップディレクトリにppport.hを生成、コンパイラの警告の有効化が行われます。

ファイルを生成する 'generate_ppport_h' と 'generate_xshelper_h' はファイルパスを指定することも可能です。(この機能はMinilla 0.7.0の時点ではバグっていて、0.7.3で修正してます。)

[XSUtil]
generate_ppport_h = "lib/Your/XS/ppport.h"