- キット各種完売。
- msBerryDAC改造情報
2008/05/05(月)【Linux/FreeBSD】 ファイル名の文字コード変換ツール
Linux/FreeBSDやその他Unixにおいてファイル名の文字コードをEUC-JPからUTF-8(またはその逆)に変更したいとき、良い方法がありませんでした。
この変更を自動的に行うPerlスクリプトです。
2008/03/28(金)Subversionの設定メモ
リポジトリ管理にもっぱら Subversion を使っているのですが、管理方法などを細かいことを忘れてしまうので、備忘録メモです。
Apacheの設定
svn のリポジトリを http で管理する場合、Apacheにモジュールを組み込む必要があります。
LoadModule dav_module libexec/mod_dav.so LoadModule dav_fs_module libexec/mod_dav_fs.so LoadModule dav_svn_module libexec/mod_dav_svn.so LoadModule authz_svn_module libexec/mod_authz_svn.so
svnを動作させたいディレクトリを指定し、次のように記述します。
<Location /repo-dir> DAV svn SVNPath /var/www/svndata/repo-dir </Location>
このとき、/repo-dir/ がsvnリポジトリとして扱われ、/repo-dir/ 以下の管理情報はすべて /var/www/svndata/repo-dir に置かれます。
また /repo-dir/ という実ディレクトリ(www内)が存在すると問題が起こります。
SVNPathで指定したディレクトリに実際にリポジトリを作成します。このリポジトリデータは www 権限で読み書きできる必要があります。
# svnadmin create /var/www/svndata/repo-dir # chown -R www:www /var/www/svndata/repo-dir
リポジトリのディレクトリ分け
これまでの設定により http://svn.duummy.dom/repo-dir は1つのSubversionリポジトリとして機能します。Subversionによって /repo-dir の仮想的なファイルシステムがすべて作られるようになります。
ずっと勘違いをしていたのですが、あるプログラムを開発するとき、/repo-dir 自体を1つのプログラムソース全体として管理していました。
- repo-dir/
- Makefile
- main.c
しかし、この状況ではブランチといったプロジェクトの分岐が不可能になってしまいます。
これを次のような形で行えば、この中には自由にディレクトリやファイルを作ることができ、コピー等も自在に行えます。
- repo-dir/
- prog-current/
- Makefile
- main.c
- prog-stable/
- Makefile
- main.c
- prog-current/
リポジトリというのは単なる管理単位で、その中のいかなるサブディレクトリでも、そのサブディレクトリ単位でチェックアウトやインポートなどが実効できます。実際、複数のプロジェクトからなる大きな1つのプロジェクトは、このようなディレクトリ分けをうまく使うことで管理されます。
補足
これはリポジトリの概念を解説しただけで、コメントで頂いたとおり下のようにするのが一般的です(必ずしも従う必要はありませんが)。詳しくは参考資料をご覧ください。
- trunk ……現在開発中のもの
- branches ……ブランチを納めるディレクトリ
- branch1
- branch2
- tags ……タグをつけてリリース版などをおく場所*1
- Version 1.xxxx
リポジトリの登録とコピー
登録は(通常)手元にあるファイルを import によりリポジトリに登録します。
$ svn import local-dir http://svn.duummy.dom/repo-dir/prog-current
今登録したリポジトリをマスターとして使用しますので、(面倒でも)一度リポジトリから手元のディレクトリにコピーする必要があります。
$ svn checkout http://svn.duummy.dom/repo-dir/prog-current
リポジトリを分岐(ブランチ)させたいときは、同一リポジトリ内でコピーします。
$ svn copy http://svn.duummy.dom/repo-dir/prog-current http://svn.duummy.dom/repo-dir/prog-stable
クライアント側の操作
一度チェックアウトしてしまえば、あとは簡単です。チェックアウトしたディレクトリに移動し(prog-current/等)て操作します。
最新のソースに追従 $ svn update 変更箇所をリポジトリに反映 $ svn ci -m "チェックインのメモ" 特定ファイルの変更を破棄 $ svn revert file.c ファイル/ディレクトリを削除 $ svn delete file.c ファイル/ディレクトリを追加 $ svn add file.c 差分表示 $ svn diff リビジョン指定して差分表示(13とローカルのもの) $ svn diff -r13 リビジョン指定して差分表示(11と12) $ svn diff -r11:12 作業コピーのブランチ切り替え $ svn switch http://svn.duummy.dom/repo-dir/prog-stable
参考資料
- Subversion メモ (Welcome to Masahiro Takagi's Homepage)
- Subversionでバージョン管理
2008/01/15(火)WindowsですべてのインターフェイスからUDPブロードキャスト
要:winsock2
INTERFACE_INFO if_list[20]; unsigned long ifsize; if (WSAIoctl(sock, SIO_GET_INTERFACE_LIST, 0, 0, &if_list, sizeof(if_list), &ifsize, 0, 0) == SOCKET_ERROR) throw("Failed Interface List"); int if_num = ifsize / sizeof(INTERFACE_INFO); for (int i=0; i<if_num; i++) { sockaddr_in *adr_ip, *adr_net; adr_ip = (sockaddr_in *)&if_list[i].iiAddress; adr_net = (sockaddr_in *)&if_list[i].iiNetmask; sockaddr.sin_addr.s_addr = adr_ip ->sin_addr.s_addr; sockaddr.sin_addr.s_addr &= adr_net->sin_addr.s_addr; sockaddr.sin_addr.s_addr |= ~(adr_net->sin_addr.s_addr); // strcpy(s,inet_ntoa(sockaddr.sin_addr)); sendto(sock, "Find", 4, 0, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr)); }