鶏頭のプログラム

Ruby, Javascript, C言語, SQLなどのプログラミング

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関数を作成しました。

tebakane/PointerList · GitHub

どんな関数かというと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(&reg, 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

毎回こんなのを打っているとめんどくさい訳です。

そこで登場するのがvimのauto-ctags.vim

$ 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

で問題解消。
Rubyのファイルもこれで問題なく解決。
よいvimライフを!

業務で役立つRuby

私は業務では主にC言語を使用しています。

C言語というのは非常にすばらしい言語ではあるのですが

なにぶん他の言語では10行で済むようなことを100行書かなくては

いけないということがよくあります。

 

業務でちょっとしたことを自動化する場合にC言語で書くなどという面倒な

ことがやってられないことはよくあります。

そんなときに私はRubyを使用しています。とにかく楽だから!

 

そんなこんなで業務で役立つ勉強会というのを先日行いました。

 

業務で役立つRuby - Google スライド

 

勉強会の内容は基本的に

Rubyの文字列操作と正規表現について。

 

正規表現はが使えると使えないでは業務に大きな差が出ると思うんですが

その特殊な構文ゆえ、嫌厭されていることも否めない。