CentOSにSphinxを入れる。
なにかいいドキュメント作成ツールはないものかと
探していたところSphinxというツールにたどりついたので
とりあえず試しに入れてみました。
Mac OS X, Linuxへのインストール — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会
Macの場合は
$ sudo port install py27-sphinx
だけです。
CentOSの場合はもう少し手順を踏む必要があります。
まず、必要に応じてepelのリポジトリを有効にする必要があります。
$ rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
$ yum install -y python-pip python-setuptools Trying other mirror. epel | 4.4 kB 00:00 epel/primary_db | 5.1 MB 00:01 Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package python-pip.noarch 0:1.3.1-4.el6 will be installed ---> Package python-setuptools.noarch 0:0.6.10-3.el6 will be installed --> Finished Dependency Resolution
$ pip-python install sphinx
でインストール完了します。
ただ渡しの場合は
The C extension could not be compiled, speedups are not enabled.
というよくわからない警告が発生していました。
警告なので問題なくインストールできているみたいのなですが
調査が必要かなぁとも思います。
何かわかれば追記します。
PList関数でC言語のポインター操作を少しでも楽に
PList関数を作成しました。
どんな関数かというとC言語の配列型です。
いままでサイズを取って領域の確保をおこなって
さらにそのサイズ分だけループを回すということをやっていたのですが
いちいち何個あったのかを記憶するのが面倒なので作成しました。
使い方はいたってシンプルで以下がサンプルです。
#include "pointer_list.h" #include <stdio.h> int main(){ char *val; PList *list = InitPList(); AddPList(list, "HELLO"); AddPList(list, "WORLD"); AddPList(list, "WORLD2"); forlist(val, list){ printf("%s\n", val); } val = GetValueIndexPList(list, 1); printf("%s\n", val); DeletePList(list, 1); val = GetValueIndexPList(list, 1); printf("%s\n", val); FinalPList(list); return 0; }
結果
HELLO WORLD WORLD2 WORLD WORLD2
C言語で配列を扱う際には何個領域を確保してその分だけ保管し、取り出すときは
回数分ループで回すということをおこなわなくてはいけないという事情がありましたので
そういうメモリ関連を頭から除外したい際には有用ではないかと思います。
Vimのタブの番号
vimのタブ機能は非常に便利です。
vimのコマンドモード中に
:tabnew
と入力し実行すると、新しいタブが開きます。
タブ間の移動は gt やgT を使用するという非常に便利な機能なわけですが
タブが多く開いている状態だとひとつひとつ移動するのは面倒になります。
というわけでタブに番号を降るように
t1, t2などでタブを移動できるよう .vimrc ファイルに設定します。
(1gt, 2gt, 3gt.. のようにタブの移動は可能)
参考 :
vimのすごい便利なのにあまり使われていない「タブページ」機能 - Qiita
function! s:SID_PREFIX() return matchstr(expand('<sfile>'), '<SNR>\d\+_\zeSID_PREFIX$') endfunction function! s:my_tabline() "{{{ let s = '' for i in range(1, tabpagenr('$')) let bufnrs = tabpagebuflist(i) let bufnr = bufnrs[tabpagewinnr(i) - 1] " first window, first appears let no = i " display 0-origin tabpagenr. let mod = getbufvar(bufnr, '&modified') ? '!' : ' ' let title = fnamemodify(bufname(bufnr), ':t') let title = '[' . title . ']' let s .= '%'.i.'T' let s .= '%#' . (i == tabpagenr() ? 'TabLineSel' : 'TabLine') . '#' let s .= no . ':' . title let s .= mod let s .= '%#TabLineFill# ' endfor let s .= '%#TabLineFill#%T%=%#TabLine#' return s endfunction "}}} let &tabline = '%!'. s:SID_PREFIX() . 'my_tabline()' set showtabline=2 nnoremap [Tag] <Nop> nmap t [Tag] map <silent> [Tag]c :tablast <bar> tabnew<CR>
以上でタブ移動が非常に楽になります。
tc コマンドを入力すると新しいタブを開くというのはついでにつけておきました。
鬼車(C言語)
先日どうしても業務で正規表現を使用したい場面に遭遇して(しかもC言語で)
なんか手軽なライブラリはないものかとさがしていたらありました。
鬼車
しかもRubyの正規表現で使っているのでこれはいいと思って使ってみた。
参考は
http://www.geocities.jp/kosako3/oniguruma/doc/API.ja.txt
#include "oniguruma.h" regex_t *InitRegular(const char *pattern){ int return_code = 0; OnigErrorInfo einfo; regex_t *reg; OnigEncoding code = ONIG_ENCODING_UTF8; // SJISの時はONIG_ENCODING_SJIS; return_code = onig_new(®, pattern, pattern + strlen(pattern),ONIG_OPTION_DEFAULT, code, ONIG_SYNTAX_DEFAULT, &einfo); if(return_code != ONIG_NORMAL){ return NULL; } return reg; } void PrintRegular(regex_t *reg, const char *str){ int r; char *start, *range, *end; OnigRegion *region = onig_region_new(); end = str + strlen(str); start = str; range = end; r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE); while (r >= 0) { int match_beg = 0; int match_end = 0; int i, j, len; printf("位置 %d でマッチ\n", r); for (i = 0; i < region->num_regs; i++) { char *match_str; match_beg = region->beg[i]; match_end = region->end[i]; len = match_end - match_beg; match_str = (char*)malloc(len + 1); if (!match_str) { printf("メモリ確保に失敗しました\n"); return 1; } for (j = 0; j < len; j++) { match_str[j] = str[match_beg + j]; } match_str[j] = '\0'; printf("%d: %s (%d-%d)\n", i, match_str, match_beg, match_end - 1); free(match_str); } if((str + match_end + 1) >= end){ break; } onig_region_clear(region); r = onig_search(reg, str, end, str + match_end + 1, range, region, ONIG_OPTION_NOTBOL); } onig_region_free(region, 1); } void FinalRegular(FwRegular *reg){ onig_free(reg); onig_end(); } int main(){ regex_t *reg = InitRegular("(\"(?:[^\"]|\"\")+\"|[^,]+)"); PrintRegular(reg, "a,b,\"c,d\"\"e\",f,g"); FinalRegular(reg); }
基本のソースはこんな感じで動くとおもいます。
サンプルコードはCSVをばらばらにしてみました。
今後、開発が非常に楽になりそうです。
vimのctags
vimを使用していると当然関数ジャンプが使用したくなります。
そんときに有用なのがctagsでしょう。(まぁ、vimじゃなくても使うんですが)
私は自宅ではMac, 会社ではLinux(CentOS)を使っているので
Macの場合は
$ sudo port install ctags
CentOSの場合は
$ yum install ctags
でインストールを行いました。
C言語の場合下のようなコマンドを打ってタグを作成するわけですが
$ ctags -R --langmap=c:+.h --languages=c
毎回こんなのを打っているとめんどくさい訳です。
$ cd ~/.vim/bundle/ $ git clone https://github.com/soramugi/auto-ctags.vim $ vim ~/.vimrc
.vimrcを下記のように
function! s:LoadBundles() " 読み込むプラグインの指定 NeoBundle 'soramugi/auto-ctags.vim' " 読み込んだプラグインの設定 let g:auto_ctags = 1 endfunction
auto-ctags.vimの設定が行われているとファイルを保存するたびにctagsのコマンドを
発行してくれる。
また明示的に
:Ctags
vim上でを打つとctagsコマンドを実行してくれる。
ただ、私の環境ではファイルを保存するたびに
finish が取込スクリプト以外で使用されました。
というよくわからないエラーが発生していました。
調べてみると不具合であることが判明。
参考:Vim - ctagsと連携するように環境を構築する - Qiita
$ cd ~/.vim/bundle/auto-ctags.vim/ $ git pull