読者です 読者をやめる 読者になる 読者になる

sconsコマンドのzsh補完関数を書いてみた

https://raw.github.com/cubicdaiya/zsh_completions/master/_scons 探したけどなかったので書いてみた。便利な分何かと複雑なzshだけど補完関数あたりは割と単純なのとサンプルが豊富なのでササッと書ける。 やり方がわかれば後はひたすらコマンドのヘルプ…

node-dtlをnpmに登録しました

npmはハマりどころが多すぎて困る。 $ npm search dtl dtl A diff template library binding for node.js =cubicdaiya diff diff3 editdistance unified format plate A javascript templating language =chrisdickinson template dtl $ npm install -g $

dtlのnode.jsバインディング

https://github.com/cubicdaiya/node-dtl最近、久々にJavaScriptを勉強し直してる関係でnode.jsで遊んでみたんだけど、結局C++で書いてしまった。 そんなにほかの言語のバインディング書いた経験はないけど、node.jsのバインディング書くのは結構簡単。 node…

SConsで並列ビルド

今更ながらSConsでもMakeと同じく「-j 」オプションで並列ビルドができること知った。なので、さっそく自分のプロダクト(dtl)で試してみた。CPUのスペックやビルド対象は以下の通り。 CPU Intel Core i5 CPU 660 @ 3.33GHz Dual Core(HTT対応なのでOSからはQ…

dtl-1.09

http://code.google.com/p/dtl-cpp/ dtl-1.09をリリースしました。今回の主な変更点は以下になります。 specifyConflictionが正常に動作しないケースへの対応およびテストの追加 Diff3クラスのtemplateパラメータにカスタムコンパレータを指定できるように変…

dtl-1.08

http://code.google.com/p/dtl-cpp/ dtl-1.08をリリースしました。今回の主な変更点は以下になります。 Diffクラスのコンストラクタに渡した関数オブジェクト(要素の比較用)が無視されてデフォルトの関数オブジェクトが使用されてしまうバグの修正 GCCの-Wオ…

make -> scons

dtlはヘッダファイルのみから構成されるライブラリなので、単にdtlを使用するユーザはdtl自体を特にビルドする必要はないんだけど、サンプルプログラムとテストプログラムはmakeかsconsを使ってビルドする必要がある。元々はMakefileだけ用意していたんだけ…

モダンなC, C++の開発環境の構築方法

まだC, C++がないようなので書いてみた。主にLinux(DebianとかUbuntu)での環境構築について。 コンパイラ まずはapt-getでコンパイラをインストールする。UbuntuやDebianなら以下のコマンドでgccやg++および標準ライブラリ等がインストールされる。 $ sudo a…

dtl-1.07

http://code.google.com/p/dtl-cpp/ dtl-1.07をリリースしました。今回の変更点は以下になります。 インデントサイズを2文字から4文字に変更 onlyEditDistanceフラグがONの場合にメモリリークが発生するバグの修正 特定のパターンのdiff3の際に衝突箇所の検…

Makefileを書くのに疲れた人のためのSCons

dtlのサンプルプログラムやテストプログラムのビルドをSConsでやってみた。dtlの複数あるサンプルプログラムのMakefileはこんな風になっている。 Makefile CPP = g++ CPPFLAGS = -c -O2 -Wall OBJS_FLAGS = -O2 -o STRDIFF_OBJS = strdiff.o common.o STRDIF…

dtl-1.06

http://code.google.com/p/dtl-cpp/ 昨日のことですが、dtl-1.06をリリースしました。今回は3つの要素列をマージした時に衝突が発生した場合、衝突箇所を(ある程度)明確化するための機能を追加しています。例えば、元の文字列がabcでこれをadcに変更したもの…

dtl-1.05

http://code.google.com/p/dtl-cpp/ dtl-1.05をリリースしました。主な変更ですが、ユーザさんからの指摘で Segmentation Faultになる可能性がある箇所を修正しています。

Cで動的配列

http://github.com/cubicdaiya/stk Cで簡単な動的配列を実装してみました。

Cでハッシュテーブル

http://github.com/cubicdaiya/fnv なんとなくCでハッシュテーブルを実装してみた。使い方はこんな感じ。 /* main.c */ #include <stdio.h> #include "fnv.h" int main (int argc, char *argv[]) { fnv_t tbl[FNV_TBL_CNT]; const char *key = "KEY"; const char *val</stdio.h>…

車輪の再発明をしなければならなくなる時

http://d.hatena.ne.jp/tt_clown/20091228/1261996214 http://d.hatena.ne.jp/Isoparametric/20091230/1262134418なんか昨年末の話で、反応するには少々遅い気がするけど、個人的に車輪の再発明をするに至る場合や理由について考えてみる。 勉強のために既に…

dtl-1.04

http://code.google.com/p/dtl-cpp/ dtl-1.04をリリースしました。前回と同じく、ライブラリ自体の変更はほとんどありませんが、 googletestを使ったテストコードを追加しています。テスト結果はこんな感じ。 $ cd dtl-1.04/test $ make && make test g++ -c…

Goで編集距離

とりあえず遊んでみたかったので、"An O(NP) Sequence Comparison Algorithm"をGoでササッと実装してみた。 まだまともにマニュアルを読んでないので、かなりテキトー。 /** * The algorithm implemented here is based on "An O(NP) Sequence Comparison Al…

MercurialのリポジトリをGithubにpushする

dtlは去年からずっとMercurialでバージョン管理してるんだけど、Githubに一応ミラーリングしておこうと思って変換ツールであるHgGitを使ってみた。 http://hg-git.github.com/ まず、HgGitを動作させるのに必要なdulwichをインストールする。 $ sudo apt-get…

メモリプール

http://github.com/cubicdaiya/mpool Cで至極簡単なメモリプールを実装してみた。 使い方はこんな感じ。(↑のgithubのexamplesにあるのと同じ物) #include <stdio.h> #include <string.h> #include <mpool.h> int main (int argc, char *argv[]) { mpool_t *pool; int *n = NULL; int *m =</mpool.h></string.h></stdio.h>…

cpprefで候補が複数ある場合

http://d.hatena.ne.jp/antipop/20091009/1255087113 id:antipopさんの作ったcpprefが便利そうなので使ってみました。 普段は手元のリファレンス本をたまに見ながら調べていたので、 それに比べるととても快適です。ただ、候補が複数ある場合、例えばswapで…

dtl-1.03

http://code.google.com/p/dtl-cpp/ dtl-1.03をリリースしました。今回の変更は少なめで、元々1つだったヘッダファイルを複数に分割したことを除けば、LCSをvectorで取得できる関数を追加したくらいです。

EmacsLispで改行マッチ

string-matchとかで文字列でマッチさせるには単に「\n」でいいんだけど、query-replace(-regex)で改行にマッチさせる方法がわからなくてちょっと嵌った。調べてみたところ、C-q C-jで改行を入力できることがわかった。

"An O(NP) Sequence Comparison Algorithm" with C

http://github.com/cubicdaiya/onp/tree/master/c/ 少し前の話ですが、"An O(NP) Sequence Comparison Algorithm"をCでも実装してみました。今のところ、計算するのは編集距離のみです。ちなみにC99の勉強がてらに書いたので、gccだと-std=c99を付加しないと…

dtl-1.02

http://code.google.com/p/dtl-cpp/ dtl-1.02をリリースしました。今回の主な変更は以下の通りです。 要素列を比較する際、(dtl::Compareクラスを継承した)任意の関数オブジェクトを使用できるように 出力系の関数で出力先を引数として渡せるように std空間…

dtl-1.01

http://code.google.com/p/dtl-cpp/ dtl-1.01をリリースしました。今回はちょっとしたリファクタリングおよびconstや参照を多少厳密に付加した程度の変更です。

"An O(NP) Sequence Comparison Algorithm" with Python

近頃、「Pythonチュートリアル」を買って読み始めたんだけど、読んでるだけだと飽きて来たので、"An O(NP) Sequence Comparison Algorithm"で編集距離を計算するプログラムをPythonで実装してみた。以前書いたLuaのコードの部分的な写経なので、Pythonっぽく…

segmentation faultした際の出力

今日遭遇して「あれ?」と思ったんだけど、プログラムがsegmentation fault起こした際、シェルのリダイレクトがどう振る舞うのかというお話。まず、以下のように標準出力(以下stdout)と標準エラー出力(以下stderr)に文字列を出力するCプログラムがある。 /* …

dtlを各バージョン管理システムから使う

ふと思い立ってSubversion、Mercurial、Gitでdiffする際にdtlのサンプルプログラムであるunidiffを呼ぶようにしてみた。dtlを使ったunidiffはこんな感じ。dtl-1.00のexamplesにあるやつそのままなんだけど、改めて眺めてみるとちょっとテキトーだなあ。 #inc…

dtl-1.00

http://code.google.com/p/dtl-cpp/ dtl-1.00をリリースしました。 自分に必要な機能は大体揃った感じなので、バージョンを0.07から一気に1.00に上げました。0.07からの主な変更は以下の通りです。 コピーコンストラクタが正しく実行されるよう修正 本当は衝…

dtl-0.07

http://code.google.com/p/dtl-cpp/ dtl-0.07をリリースしました。 今回は一部の関数の引数の数の変更および可読性向上のためのコード整理が行われています。

dtl-0.06

http://code.google.com/p/dtl-cpp/ dtl-0.06をリリースしました。 主な変更点は以下の通りです。 mergeがテキトーだったのを修正 編集距離だけを記録するオプションを追加 mergeがテキトーだったのを修正 dtl-0.05のmergeがなんだかちゃんと動かないのは前…

あるファイルの特定の行を別のファイルの内容に置換する

今日、「↑みたいなことをやりたいんだけど、どうすればいい」と聞かれたので、やってみた。 具体的には以下のようなtestというファイルがあり、 ... test ... test ... 上記のtestという文字列だけからなる行を以下のtest.inで置換する。 1 2 3 4 5 とりあえ…

Tokyo Cabinetでキーが重複したレコードを格納する

Tokyo Cabinetの仕様書を見ると、 B+木のデータベースでは、キーが重複する複数のレコードを格納することができます。このデータベースに対しては、ハッシュ表のデータベースと同様に、キーを指定してレコードを格納したり取り出したり削除したりすることが…

イテレータループのマクロ

C++では例えば以下のようなイテレータを使ったループをよく書くわけですが、 for (std::vector<std::string>::iterator it=vec.begin();it!=vec.end();++it) { ・ ・ ・ } なんだか長いので、以下のようにtypedefを使ってちょっとでも短くしたくなります。 typedef std::v</std::string>…

シェルスクリプトのreturn

先週Amazonから届いたスターオーシャン4をやってるのだが、字が小さい。何でだろう?テレビが小さいからか?バトル画面で表示されているHPとかの数字がちゃんと読み取れないくらい小さいので、正直ちょっと困っている。それはそうと今日は、久々にシェルスク…

Lua

地元の本屋に寄った際に「入門Luaプログラミング」を買った。 Luaは、つい最近までは「アプリケーションに組み込むための言語」、「小さくて動作が軽い」ぐらいの認識だったんだけど、実際に使ってみると、これがなかなかいい感じ。言語自体の簡潔さもさるこ…

boost::filesystem

ここのところ、お遊びとか何となくじゃなくて真面目にboostのライブラリ使ってC++のコードを書いてるんですが、改めてこのライブラリはいろんな意味でぶっ飛んでると思った。しかし、boostはfilesytemに限らず、全体的に変態(褒め言葉ですよ)で超便利なんだ…

dtl-0.05

http://code.google.com/p/dtl-cpp/ dtl-0.05をリリースしました。主な変更点は以下の3つです。 unidiffの出力の際の表示順を「削除」→「追加」の順に統一 Unified Formatをデータ構造として扱えるように変更 merge機能の追加 割と大幅に追加・変更されてい…

dtlのpatch関数がLinuxだと落ちる(修正済み)

そういや、ずっと前にParallels Desktop上のUbuntuで動作確認したっきり、Linuxでは動作確認してなかったなあと思いつつ、久々にUbuntuを立ち上げてサンプルプログラムを走らせてみたら、strdiffやintdiff、unidiffに関しては特に問題なかったのだが、fpatch…

Mercurialのブランチとマージ

Mercurialをemacsやzsh、global, その他の設定ファイルの管理だけでなく、ソースコードの管理にも本格的に使うようになったこともあり、ブランチやマージの機能も頻繁に使うようになってきた。このへんの機能を使ってて思うのはやはりCVSやSubversionに比べ…

分割diff

差分が大きく、メモリを大量に消費する場合に対処するため、O(NP)にHirshbergのアルゴリズムを適用しようとするが、うまくいかない。もうちょっと詳しく論文を読む必要性を感じつつ、なんだか疲れたので、気分転換に、記録された経路情報がある一定のサイズ…

dtl

C++なDiffライブラリ、dtlをリリースしました。 http://code.google.com/p/dtl-cpp/ 詳しくは上記のURLのSummaryやサンプルを見ていただければと思いますが、こちらでは上記に載ってないことや今後の方針や課題とかについて書こうと思います。 dtl? Diff Te…

番人

自作diffを少しでも速くするため、番人(sentinel)を試してみた時の話。 ここで言う「番人」とはループ内の条件判定の回数を減らすための特殊なデータを指す。 O(NP)のアルゴリズムを使った典型的なdiffプログラムには 以下のようなループ処理を行う箇所があ…

diffの高速化

Unified Formatで表示できるところまで来たのはいいけど、 六千行ほどのファイルに適用したら、表示されるのに20秒以上かかってしまって 使い物にならないので、そのへんをちょこちょこと直す。 編集距離を求める処理自体はO(NP)だから速いんだけど、 肝心の…

diff with Unified Format

前に作ったO(NP)なdiffのプログラムを元に、 2つのファイルの差分をUnified Formatで表示できるようにしてみた。 とりあえず、以下のe.txtとd.txtの差分を表示してみる。 e.txt a d e c f e a b c d e f g h i d.txt a e c z z d e f a b c d e f g h iこの2…

日付のフォーマット

日付文字列のフォーマット処理みたいなことは仕事柄よくやるんだけど、 そういやCでそういうのをやったことがないことに気付いてちょっとやってみた。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> #define MAX_LENGTH 50 int main(int argc, char *a</sys/stat.h></sys/types.h></time.h></stdlib.h></stdio.h>…

cdb

cdbはdaemontoolsやqmailの作者でもあるdjbこと Daniel J.Bernstein氏によって作成されたデータベースマネージャ。 かなり高速に動作するが、一度追加したものは削除したり、 更新することはできない。(どうしてもやるなら再構築するしかない) 以下、tinycdb…

Boost::serialization & Tokyo Cabinet

Boost::serializationはC++のオブジェクトをシリアライズしてくれるライブラリ。例えば、↓みたいに書くだけでPersonクラスのオブジェクトをシリアライズしてくれる。(ただし、stringやvectorなどをシリアライズするには特別なヘッダファイルが必要) class Pe…

getoptその後

結局、自分でコマンドラインパーサを書くことにした。(id:cubicdaiya:20080707)いざ、自分で書いてみると汎用的に作るのはなかなか難しいのだが、 別に無理して汎用的にしなくてもいいか、と思ったりもする。 とりあえず、今のところこんな感じ。 cmd -v --v…

SESからpatchする

OSC2日目の休憩時間に走り書きした。 narazuya@bokkko% ./diff cbabac abcabba editDistance:5 LCS:caba SES A a A b C c D b C a C b A b C a D c narazuya@bokkko% ↑は前に書いたdiffの出力そのまま。SESはShort Edit Scriptの略で、 片方の文字列からもう…