12月2008

行数を数えるプログラム

ちょっとソースコードの行数を数えるプログラムが欲しかったので、適当に作りました。Windowsじゃ使い物にならないかもしれません。

引数に与えたファイルの行数と、それらを合計した行数を表示します。

int countLine( const char *filename );

int main( int argc, char *argv[] )
{
	int i;
	int count;
	int total = 0;

	for ( i = 1; i < argc; i++ ) {
		count = countLine( argv[i] );
		if ( count >0 ) {
			printf( "%s...%dn", argv[i],  count);
			total += count;
		}
	}

	printf( "total...%dn", total );
	return 0;
}

int countLine( const char *filename )
{
	int c;
	int count = 1;
	FILE *fs = fopen( filename, "r" );
	if ( fs == NULL ) return 0;

	while ( (c = fgetc( fs )) != EOF ) {
		if ( c == 'n' ) count++;
	}

	fclose( fs );
	return count;
}

使用例:

overtaker-no-ibook-g4:desktop lifeaether$ ./line.out gameengine/*.cpp
gameengine/GEAnimation.cpp...135
gameengine/GEAnimationView.cpp...69
gameengine/GECore.cpp...123
gameengine/GEFontResource.cpp...48
gameengine/GEFps.cpp...51
gameengine/GEGridView.cpp...177
gameengine/GEImageChipView.cpp...105
gameengine/GEImageResource.cpp...82
gameengine/GEImageView.cpp...77
gameengine/GELineMoveAnimation.cpp...71
gameengine/GEMisc.cpp...109
gameengine/GERectView.cpp...27
gameengine/GEResource.cpp...55
gameengine/GEResourceLoader.cpp...76
gameengine/GERichRectView.cpp...66
gameengine/GETextView.cpp...129
gameengine/GEToLua.cpp...45
gameengine/GEToLuaGlueCode.cpp...2021
gameengine/GEView.cpp...245
gameengine/GEWindow.cpp...109
gameengine/main.cpp...60
total...3880

客観的なデータとして、ソースコードの行数というのは、プログラムについて詳しく知らない方に向けて話す時に、役立ちそうな気がします。

私のiPhoneの使い方

iPhoneを購入した夏から、すっかり季節も巡って冬となり、手もかじかむ寒さとなりましたが、手の中のiPhoneがその寒さに負けないくらい暖かさを放っています。iPhoneの熱はまだまだ収まりそうもありません。

iPhone購入前、私はiPhoneをどれだけ活用できるかを検討した結果、毎日乗っている電車の往復で2時間近くの時間、ここでしかiPhoneをフルに活用する時間はないだろう、と考えていました。なぜなら、その他の時間には、ほとんど自由にPCにアクセスできるので、わざわざiPhoneでウェブを見たりする必要がないからです。全く予想通りであったことは、間もなくして分かるわけですが、実は最近になって、このただの2時間を想像以上に活用できていることを実感してきています。

購入当初、実はあまり電車でiPhoneを使ってませんでした。せいぜい電車に乗っている半分の時間でウェブブラウズをしていたくらいです。そして、これくらいの使い方が、購入前に考えていた使い方と、ちょうど一致していたように思えます。

それからしばらく経ち、ちょうどNetNewsWireによるRSSリーダーを導入した辺りからでしょうか。通常、帰宅してからブラウジングしていたウェブサイトを、帰宅途中で見回ってしまう、というスタイルが確立されつつありました。具体的には、Yahoo!,ITMedia,Hatena,Pathtraq,CNet,…まあ、このあたりです。あとは、RSSを消化します。これによって、帰宅してからのウェブブラウジングの時間が、大幅に減ったと考えられますが、残念ながら比較できるデータは残ってません。おそらく、これによって帰宅してからの時間が少々増えたと考えることができます。

また、カレンダーは購入当初から活用はしていました。ただ最初は、明らかに決まりきった1日の予定しか入力していなかったのですが、最近は、ちょっとした用事でもカレンダーに書き込むようになってきている気がします。そして最近、ようやく自分にぴったりのTouchTodoと呼ばれるToDo管理アプリケーションが現れました。まだ試験的に使ってるところですが、これでようやくToDoリストもiPhoneに任せることができそうです。これらカレンダー、ToDoも、主に電車に乗っている時間に整理を行います。はっきり言って、まだまだ紙とペンの方が明らかに扱いやすいと思うので、暇な電車の時間を利用して一括して整理整頓をします。

さらに余った時間は、つい最近リリースされた、産経新聞を読む時間に回したりします。ウェブだけから情報を得ていると、偏ってる気もするので、ちょうどいい感じです。その他にも、LadioTouchでウェブラジオを視聴したり、PhotoShareで写真を楽しんだり、SkyBookで青空文庫を読んだり、もちろん音楽は常に流していますが、動画もたまに見ます。ただ動画を見る環境として電車は最悪ですが。

と、こんな感じで、iPhone一台で、電車の乗車中にたくさんのことができるようになります。購入当初は、せいぜいSafariとiPodでしたが、成長しつつあるiPhoneアプリケーションのおかげで、電車の中が別世界に変わってしまったようです。私は電車に乗車中の暇な時間をiPhoneタイムにしていますが、他の方々はどんなときにiPhoneを活用しているのでしょうね。

IPv4枯渇時計を設置してみた

IPv4枯渇時計というブログパーツを見つけて、ちょっと前にIPv6の話をしたこともあったので、右のサイドバーに設置してみました。

直線的にアドレスがなくなっていくわけではないので、単純にあと2,3年で枯渇してしまうというわけではないと思いますが、どちらにしろ減って行く一方です。

IPv6への移行は、あと何年後に本格的に始まるのでしょうか。せっかくなので、この前書いた、IPv6対応のHTML取得プログラムでも掲載しておきます。

Windowsの場合は、先頭でUSING_WINSOCKをdefineしてコンパイルしてください。

#include <stdio.h>
#include <string.h>

#ifdef USING_WINSOCK

#include <winsock2.h>
#include <ws2tcpip.h>

#else

#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>

#endif

#define MAX_RECV 65536
#define DEFAULT_REQUEST "GET / HTTP/1.0rnrn"
#define DEFAULT_FAMILY AF_UNSPEC

int main( int argc, char *argv[] ) {
	char *hostname = NULL;
	char *request = DEFAULT_REQUEST;
	int   family   = DEFAULT_FAMILY;

	struct addrinfo hints;
	struct addrinfo *infos;
	int error;

	int s; // ソケット
	int n, tmp; //受信,送信したバイト数
	char receive[MAX_RECV]; //受信したデータを格納する場所
	int i;

#ifdef USING_WINSOCK
	struct WSAData wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif

	// 引数処理
	for ( i = 1; i < argc; i++ ) {
		if ( strcmp(argv[i], "-ipv4") == 0 ) {
			family = AF_INET;
		} else {
			if ( !hostname ) hostname = argv[i];
		}
	}

	// アドレス(ソケット情報)を取得
	memset(&hints, 0, sizeof( struct addrinfo ));
	hints.ai_family = family;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE;

	error = getaddrinfo(hostname, "http", &hints, &infos);
	if ( error ) {
		fprintf(stderr, "Failed to getaddinfo.n");
		fprintf(stderr, "%sn", gai_strerror(error));
		return 1;
	}

	// ソケットを作成
	s = socket(infos->ai_family, SOCK_STREAM, 0);
	if ( s == -1 ) {
		fprintf(stderr, "Failed to socket.n");
		freeaddrinfo(infos);
		return 1;
	}

	// サーバーへ接続 (サーバーのソケットへ接続)
	if ( connect(s, infos->ai_addr, infos->ai_addrlen) ) {
		fprintf(stderr, "Failed to connect.n");
		freeaddrinfo(infos);
	}
	freeaddrinfo(infos);

	// HTTPリクエストの送信
	n = 0;
	while ( n < strlen(request) ) {
		tmp = send(s, &request[n], strlen(request) - n, 0);
		if ( tmp == -1 ) {
			fprintf(stderr, "Failed to send.n");
			return 1;
		}
		n += tmp;
	}

	// データを受信
	do {
		n = recv(s, receive, MAX_RECV, 0);
		if ( n == -1 ) {
			fprintf(stderr, "Failed to recv.n");
			return 1;
		}
		printf(receive);
	} while ( n != 0);

#ifdef USING_WINSOCK
	shutdown(s, SD_BOTH);
	closesocket( s );
	WSACleanup();
#else
	shutdown(s, SHUT_RDWR);
	close(s);
#endif

	return 0;
}

WordPressのテンプレート作るなら

ブログを週1更新にしようと思ったものの、なぜか不定期よりも週1の方が続かなそうなので、以前の不定期に戻そうかと思いつつ、久しぶりに本の紹介をしてみます。本のカテゴリがあったことを、自分でも忘れてました。

Webプロフェッショナルのための黄金則 WordPressテンプレートタグ虎の巻 (Web Designing Books) Webプロフェッショナルのための黄金則 WordPressテンプレートタグ虎の巻 (Web Designing Books)
エ・ビスコム・テック・ラボ

毎日コミュニケーションズ 2008-08-22
売り上げランキング : 16476

Amazonで詳しく見る by G-Tools

WordPressの簡単なカスタマイズの仕方から、テンプレートの作り方、さらにAPIのリファレンスまでついている本です。テンプレートを1から自作したい時に、手元に欲しくなる本です。

そんなわけで、後で暇な時にこのブログのテーマを作る時に購入しようと思います。