ときどきの雑記帖 リターンズ

最新ページへのリンク
目次ページへのリンク

前の月へ 2007年6月
次の月へ 2007年8月

ホームへ

2007年07月31日

■_

Rocco の日記 2007-7-30
http://gauc.no-ip.org/wiki.cgi/private?page=Blog%2F2007%2D7%2D30

hnwがやってくれました…

PHP以外全員不正解で書かれている内容ですが、とりあえず awk は C, PHP 
と同じ結果ですね。

awkの言語仕様として決まっているわけではないので、 斎藤さんの見た環境(多分 GNU/Linuxのどれかでしょうが)でそうだからといって awkがそうであると結論付けてはいけません。 実際、

>echo 36893488147419107329|gawk "{printf(\"%21.0f\", $0)}"
 36893488147419111000

こうなる環境もあるんですから。

実際のところ、gawkの場合は

node.c

AWKNUM
r_force_number(register NODE *n)




	if (do_non_decimal_data) {
		errno = 0;
		if (! do_traditional && isnondecimal(cp, TRUE)) {
			n->numbr = nondec2awknum(cp, cpend - cp);
			n->flags |= NUMCUR;
			goto finish;
		}
	}

	errno = 0;
	save = *cpend;
	*cpend = '\0';
	n->numbr = (AWKNUM) strtod((const char *) cp, &ptr);

	/* POSIX says trailing space is OK for NUMBER */
	while (ISSPACE(*ptr))
		ptr++;
	*cpend = save;
finish:
	/* the >= should be ==, but for SunOS 3.5 strtod() */
	if (errno == 0 && ptr >= cpend) {
		n->flags |= newflags;
		n->flags |= NUMCUR;
	} else {
		if (0 && do_lint && ptr < cpend)
			lintwarn(_("can't convert string to float"));
		errno = 0;
	}

	return n->numbr;
}

ということなので、システムのCRTのstrtodと同じ動作になるのは当然といえば当然。

■_ では異議を唱えてみよう

$ php -r 'printf("%21.0f\n",36893488147419107329.0);'
 36893488147419111424
$ perl -e 'printf("%21.0f\n",36893488147419107329.0);'
 36893488147419103232
$ ruby -e 'printf("%21.0f\n",36893488147419107329.0);'
 36893488147419103232
$ python -c 'print "%21.0f" % 36893488147419107329.0;'
 36893488147419111424

265=36893488147419103232の次に大きいIEEE64bit浮動小数点数は 265+213=36893488147419111424です。 仮に、265+212+1=36893488147419107329 を浮動小数点数に丸めるとしたら、 IEEE754を持ち出すまでもなく表現できる中で最も近い浮動小数点数に丸めるのが自然でしょうから、 265+213になるはずです。では実際に試してみましょう。

このあたりの挙動は各言語ともundocumentedな気もしますけど、 Cに素直に渡せば勝手に丸めてくれるものを違う結果にしてしまっているわけですから、 バグと言ってしまって構わない挙動だと言えます。

Cのこの動作が、唯一無二絶対のものであるとする根拠はどこにあるのでしょうか? strtod によれば、

If the subject sequence has the decimal form and at most DECIMAL_DIG (defined in <float.h>) significant digits, the result should be correctly rounded. If the subject sequence D has the decimal form and more than DECIMAL_DIG significant digits, consider the two bounding, adjacent decimal strings L and U, both having DECIMAL_DIG significant digits, such that the values of L, D, and U satisfy L <= D <= U. The result should be one of the (equal or adjacent) values that would be obtained by correctly rounding L and U according to the current rounding direction, with the extra stipulation that the error with respect to D should have a correct sign for the current rounding direction.

DEICMAL_DIGというのはC99で追加された定数で、glibcを使ったシステムだと多分17です。 Sparc上のシステムでは20とかいうのもあるみたいですがまあそれはさておき、 この数を越えた桁数を持つ数値に関しては、 should be one of the (equal or adjacent) values that would be obtained by correctly rounding L and U according to the current rounding direction とはありますが、最近値丸めにしなければならないとはどこにも書いていません。 ですから先の例にあるように DECIMAL_DIGを越えた桁数を文字列化したときに 最近値丸めでないからといって即バグであるという判断を下すことはできないと思います。

また、Pythonに関しては

/**
 * PyOS_ascii_strtod:
 * @nptr:    the string to convert to a numeric value.
 * @endptr:  if non-%NULL, it returns the character after
 *           the last character used in the conversion.
 * 
 * Converts a string to a #gdouble value.
 * This function behaves like the standard strtod() function
 * does in the C locale. It does this without actually
 * changing the current locale, since that would not be
 * thread-safe.
 *

(ry

 *
 * Return value: the #gdouble value.
 **/
double
PyOS_ascii_strtod(const char *nptr, char **endptr)
{

(ry

	if (decimal_point_pos)
	{
		char *copy, *c;

		/* We need to convert the '.' to the locale specific decimal point */
		copy = (char *)PyMem_MALLOC(end - nptr + 1 + decimal_point_len);
		if (copy == NULL) {
			if (endptr)
				*endptr = (char *)nptr;
			errno = ENOMEM;
			return val;
		}

		c = copy;
		memcpy(c, nptr, decimal_point_pos - nptr);
		c += decimal_point_pos - nptr;
		memcpy(c, decimal_point, decimal_point_len);
		c += decimal_point_len;
		memcpy(c, decimal_point_pos + 1, end - (decimal_point_pos + 1));
		c += end - (decimal_point_pos + 1);
		*c = 0;

		val = strtod(copy, &fail_pos);

		if (fail_pos)
		{
			if (fail_pos > decimal_point_pos)
				fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1);
			else
				fail_pos = (char *)nptr + (fail_pos - copy);
		}

		PyMem_FREE(copy);

	}
	else {
		unsigned i = 0;
		if (nptr[i] == '-')
			i++;
		if (nptr[i] == '0' && (nptr[i+1] == 'x' || nptr[i+1] == 'X'))
			fail_pos = (char*)nptr;
		else
			val = strtod(nptr, &fail_pos);
	}

	if (endptr)
		*endptr = fail_pos;

	return val;
}

とあるように、CRTのstrtodを呼び出しておりその動作に依存します。

その辺の設定については C Guide--2.4 float.hhttp://lambda.foldr.org/~michaelw/c99.txt.gz ( http://www.rtems.com/~joel/ISO-C-FDIS.1999-04.txt と同じ?) などにあるように

FLT_ROUNDS
	Defines the way floating-point numbers are rounded.

-1	indeterminable
0	toward zero
1	to nearest
2	toward positive infinity
3	toward negative infinity
       [#5]  All  integer  values  in  the <float.h> header, except
       FLT_ROUNDS, shall be constant expressions suitable  for  use
       in  #if  preprocessing directives; all floating values shall
       be   constant   expressions.    All   except    DECIMAL_DIG,
       FLT_EVAL_METHOD,  FLT_RADIX,  and  FLT_ROUNDS  have separate
       names for all three  floating-point  types.   The  floating-
       point model representation is provided for all values except
       FLT_EVAL_METHOD and FLT_ROUNDS.

       [#6]  The  rounding  mode  for  floating-point  addition  is
       characterized by the value of FLT_ROUNDS:17)

            -1      indeterminable
             0      toward zero
             1      to nearest
             2      toward positive infinity
             3      toward negative infinity

       All other values for FLT_ROUNDS characterize implementation-
       defined rounding behavior.

       [#7] The values of operations  with  floating  operands  and
       values  subject  to  the usual arithmetic conversions and of
       floating constants are evaluated to a format whose range and
       precision may be greater than required by the type.  The use
       of evaluation formats  is  characterized  by  the  value  of
       FLT_EVAL_METHOD:18)

            -1         indeterminable;

             0         evaluate all operations and  constants  just
                       to the range and precision of the type;

             1         evaluate  operations  and  constants of type
                       float and double to the range and  precision
                       of  the  double  type,  evaluate long double
                       operations and constants to  the  range  and
                       precision of the long double type;

             2         evaluate all operations and constants to the
                       range and precision of the long double type.
       All  other  negative values for FLT_EVAL_METHOD characterize
       implementation-defined behavior.

to nearest だけではありません。

またPerlとRubyに関しては使用するコンパイラのCRTにあるstrtodを使わずに 自前のもので処理しているようですので、strtodの仕様に縛られる理由はありません。 一貫性のある処理をしているのなら、それはそれでいいと思いますがどうでしょうか。

Rubyの場合、そこかしこに strtodを呼び出している関数が見つかりますが、 今回の本命は、parse.yのなかにある yylex()から呼び出しているそれでしょう。 strcmpとかstrstrは msvcr71.dllのものを呼び出していますが、 strtodはみあたらないので、多分 missing/strtod.c を使っています (mswin32版の場合。他のシステムではどうかはわかりません)。

Pythonに関してもソースツリーには Python/strtod.c というのが あったりしますが、Windows版のPythonに関してはこれを使っているというのは ないようです(python25dllにmscvrt71.dll内のstrtodへのリンクが見つかる)。

Perlは例によってマクロびしばしなので嫌気がさすくらいですが、 numeric.cにある Perl_my_atof2(pTHX_ const char* orig, NV* value) という関数で処理しています。 ちなみに、InfとかNaNのようなものだけstrtodに投げるというワザを見せてくれます。

    /* punt to strtod for NaN/Inf; if no support for it there, tough luck */

#ifdef HAS_STRTOD
    if (*s == 'n' || *s == 'N' || *s == 'i' || *s == 'I') {
        const char *p = negative ? s - 1 : s;
        char *endp;
        NV rslt;
        rslt = strtod(p, &endp);
        if (endp != p) {
            *value = rslt;
            return (char *)endp;
        }
    }
#endif

    /* we accumulate digits into an integer; when this becomes too
     * large, we add the total to NV and start again */

    while (1) {
	if (isDIGIT(*s)) {
	    seen_digit = 1;
	    old_digit = digit;
	    digit = *s++ - '0';
	    if (seen_dp)
		exp_adjust[1]++;

	    /* don't start counting until we see the first significant
	     * digit, eg the 5 in 0.00005... */
	    if (!sig_digits && digit == 0)
		continue;

	    if (++sig_digits > MAX_SIG_DIGITS) {
		/* limits of precision reached */
	        if (digit > 5) {
		    ++accumulator[seen_dp];
		} else if (digit == 5) {
		    if (old_digit % 2) { /* round to even - Allen */
			++accumulator[seen_dp];
		    }
		}
		if (seen_dp) {
		    exp_adjust[1]--;
		} else {
		    exp_adjust[0]++;
		}
		/* skip remaining digits */
		while (isDIGIT(*s)) {
		    ++s;
		    if (! seen_dp) {
			exp_adjust[0]++;
		    }
		}
		/* warn of loss of precision? */
	    }
	    else {
		if (accumulator[seen_dp] > MAX_ACCUMULATE) {
		    /* add accumulator to result and start again */
		    result[seen_dp] = S_mulexp10(result[seen_dp],
						 exp_acc[seen_dp])
			+ (NV)accumulator[seen_dp];
		    accumulator[seen_dp] = 0;
		    exp_acc[seen_dp] = 0;
		}
		accumulator[seen_dp] = accumulator[seen_dp] * 10 + digit;
		++exp_acc[seen_dp];
	    }
	}
	else if (!seen_dp && GROK_NUMERIC_RADIX(&s, send)) {
	    seen_dp = 1;
	    if (sig_digits > MAX_SIG_DIGITS) {
		++s;
		while (isDIGIT(*s)) {
		    ++s;
		}
		break;
	    }
	}
	else {
	    break;
	}
    }

    result[0] = S_mulexp10(result[0], exp_acc[0]) + (NV)accumulator[0];
    if (seen_dp) {
	result[1] = S_mulexp10(result[1], exp_acc[1]) + (NV)accumulator[1];
    }

    if (seen_digit && (*s == 'e' || *s == 'E')) {
	bool expnegative = 0;

	++s;
	switch (*s) {
	    case '-':
		expnegative = 1;
		/* fall through */
	    case '+':
		++s;
	}
	while (isDIGIT(*s))
	    exponent = exponent * 10 + (*s++ - '0');
	if (expnegative)
	    exponent = -exponent;
    }



    /* now apply the exponent */

    if (seen_dp) {
	result[2] = S_mulexp10(result[0],exponent+exp_adjust[0])
		+ S_mulexp10(result[1],exponent-exp_adjust[1]);
    } else {
	result[2] = S_mulexp10(result[0],exponent+exp_adjust[0]);
    }

    /* now apply the sign */
    if (negative)
	result[2] = -result[2];
#endif /* USE_PERL_ATOF */
    *value = result[2];
    return (char *)s;
}

時間がなくてどういう丸め動作をするのか読めてません。

■_ とはいうもののRubyの場合

Float.ROUNDSという定数があって、それをソース上で見ると

    rb_define_const(rb_cFloat, "ROUNDS", INT2FIX(FLT_ROUNDS));

となっていてかつ

>ruby -e "puts Float::ROUNDS"
1

だったりするのだけど、 実はッ!

ROUNDS

    丸めモード 
       -1: 不定
        0: 0.0 の方向に丸め
        1: 四捨五入
        2: 正の無限大の方向に丸め
        3: 負の無限大の方向に丸め

やっぱりC99のそれとは意味が違っている。 これを仕様の不備と見るかどうかの判断はお任せします(誰に?)。

■_ 世界初のCPU「4004」開発回顧録(15):ITpro

 しびれを切らしたインテルは,ノイス博士がリコーの技術部門の取締役に電話を掛け, 私の渡米を要請した。「名指しで技術者を採るとは何だ!」と怒られたが, 4年間の休職を与えてくれた。ノイス博士からの一本の電話が私のそれからの人生を変えた。 開発者魂に火をつけられ,マイクロプロセッサ開発人生が始まろうとした。 大げさに言うと,司馬遼太郎の小説「花神」の主人公である時代の要求により登場した 大村益次郎に自分自身を重ねた。自分も死ぬのかなと,一抹の不安が頭を横切った。
 1972年11月7日に,ジャンボ機ボーイング747が就航していたが, ハワイ経由でサンフランシコに到着した。7年と5カ月にわたって無我夢中で走り続けた 米国でのマイクロプロセッサ開発人生の幕開きであった。

冒頭に連載のおわりにあたって,そして8080開発への旅立ちとかあるのだけど 今回で最終回?

花神は司馬遼太郎の小説の中でも好きな方の一つだなあ。

■_ Rubyでもうひとつ

2ちゃんねる某スレであった、/a(?=b)?/.match('a') みたいな正規表現のマッチ結果が nilになるのはおかしくね? という話の続き (以前の場所)。

とりあえず鬼車方面(1.9)はおいといて、 1.8.6ではどんな内部表現になっているかというと

>miniruby -e "puts /a(?=b)?/.match('a')"
/exactn/1/a/start_nowidth//4/exactn/1/b/stop_nowidth///on_failure_jump//0/
nil

>miniruby -e "puts /a(?=b)/.match('a')"
/exactn/1/a/start_nowidth//4/exactn/1/b/stop_nowidth///
nil

>miniruby -e "puts /a(?:b)?/.match('a')"
/exactn/1/a/on_failure_jump//5/start_paren/exactn/1/b/stop_paren/
a

とまあこんな感じ。 先読みの幅をゼロにするために start_nowidth/stop_nowidth なんかを積んでいたりしている。 一方先読みでない (?:b)? の方だと、末尾の量指定子 '?' に対応するジャンプコードが 最初の方に入っていたりする。 実際にこれらのコードを emitしている部分を見てみると

regex.c re_compile_pattern(pattern, size, bufp)

	case '=':
	case '!':
	case '>':
	  BUFPUSH(start_nowidth);
	  *stackp++ = b - bufp->buffer;
	  BUFPUSH(0);	/* temporary value */
	  BUFPUSH(0);
	  if (c != '!') break;

	  BUFPUSH(on_failure_jump);
	  *stackp++ = b - bufp->buffer;
	  BUFPUSH(0);	/* temporary value */
	  BUFPUSH(0);
	  break;

	case ':':
	  BUFPUSH(start_paren);
	  pending_exact = 0;
	default:
	  break;
      case '!':
	BUFPUSH(pop_and_fail);
	/* back patch */
	STORE_NUMBER(bufp->buffer+stackp[-1], b - bufp->buffer - stackp[-1] - 2);
	stackp--;
	/* fall through */
      case '=':
	BUFPUSH(stop_nowidth);
	/* tell stack-pos place to start_nowidth */
	STORE_NUMBER(bufp->buffer+stackp[-1], b - bufp->buffer - stackp[-1] - 2);
	BUFPUSH(0);	/* space to hold stack pos */
	BUFPUSH(0);
	stackp--;
	break;

      case '>':
	BUFPUSH(stop_backtrack);
	/* tell stack-pos place to start_nowidth */
	STORE_NUMBER(bufp->buffer+stackp[-1], b - bufp->buffer - stackp[-1] - 2);
	BUFPUSH(0);	/* space to hold stack pos */
	BUFPUSH(0);
	stackp--;
	break;

      case ':':
	BUFPUSH(stop_paren);
	break;

基本的な設計の制約上、トークンを先読みして云々というのは ちと難しい(ひとつくらいならどうにかなるけど)ので、 1.8系列でこの処理を返るのはやっぱり難しいような気がする。 PerlやPythonで動くのに、という向きもあるだろうけど前回も書いたように 幅がないものの繰り返し、というのはちと irregalなものかもしれず。

鬼車のほうはサンプルコードを書いて結果を確認してから 小迫さんに訊いてみよう。 Ruby経由でのあのエラーメッセージはやっぱり変だ。

■_ ○| ̄|_

PCの電源の差込が甘くて、何かの拍子にはずれてしまっていきなり落ちた。 ああセーブしてないデータもあったのに。 今日はもうやめだ~~ッ!

2007年07月30日

■_ 訃報

Yahooのリンクなので数日で無効になるでしょうからあとで適当なところになおします。

“プロレスの神様”として知られ、現在では無我ワールド・プロレスリングの名誉顧問を 務めるカール・ゴッチ(本名カール・イスターツ)さんが29日(米国現地時間) に死亡したことが現地の専門ウェブサイト「レスリング・オブザーバー」 により報じられた。ゴッチさんが亡くなったのは夜9時45分で死因は不明。 82歳だった。

R.I.P.

訃報:プロレスの神様 ゴッチさん死去-訃報:MSN毎日インタラクティブ

■_ Perl 5.9.5

つーことでビルドしてみた(VC7.1使用)。

ばっさり略

All tests successful (1 subtest UNEXPECTEDLY SUCCEEDED), 54 tests and 1010 subtests skipped.
Passed TODO                      Stat Wstat TODOs Pass  List of Passed
-------------------------------------------------------------------------------
../ext/threads/shared/t/stress.t                1    1  1
Files=1457, Tests=184207, 1286 wallclock secs ( 0.00 cusr +  0.00 csys =  0.00 CPU)
        cd ..\win32

ということで昨日書いたことを試してみる。

#!/usr/bin/perl
use strict;
use warnings;

while (<DATA>) {
    s/^(?<select>[ab]),(?<a>.*?),(?<b>.*?)$/$+{$+{select}}/mg;
    print;
}

__END__
a,1234,abcd
b,5678,efgh


実行結果:
1234
efgh

おおっ。 よく読み返してみると、昨日はわしが勘違いしていたもより。 謹んで訂正いたしまする。

参考までに perl -Vの結果

>c:\devel-perl\bin\perl -V
Summary of my perl5 (revision 5 version 9 subversion 5) configuration:
  Platform:
    osname=MSWin32, osvers=5.00, archname=MSWin32-x86-multi-thread
    uname=''
    config_args='undef'
    hint=recommended, useposix=true, d_sigaction=undef
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cl', ccflags ='-nologo -GF -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE 
-DNO_STRICT -DHAVE_DES_FCRYPT  -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS 
-DUSE_PERLIO -DPERL_MSVCRT_READFIX',
    optimize='-MD -Zi -DNDEBUG -O1',
    cppflags='-DWIN32'
    ccversion='13.10.3077', gccversion='', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=10
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf  -libpath:"c:
\devel-perl\lib\CORE"  -machine:x86'
    libpth="C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\lib"
    libs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32
.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_
32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
    perllibs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comd
lg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib
ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
    libc=msvcrt.lib, so=dll, useshrplib=true, libperl=perl59.lib
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug -opt:ref,icf  -
libpath:"c:\devel-perl\lib\CORE"  -machine:x86'


Characteristics of this binary (from libperl):
  Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV
                        PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS
                        PERL_MALLOC_WRAP PL_OP_SLAB_ALLOC USE_ITHREADS
                        USE_LARGE_FILES USE_PERLIO
  Built under MSWin32
  Compiled at Jul 30 2007 10:19:02
  %ENV:
    PERL5LIB="c:\home\perl"
  @INC:
    c:\home\perl
    c:/devel-perl/lib
    c:/devel-perl/site/lib
    .

■_ GNUstep

未来志向のGNUstepベースOSの最新版「Etoile 0.2」がリリース | エンタープライズ | マイコミジャーナル

GNUstepって「OS」ぢゃあねえだろ。と思いつつ本文を読むと

Etoileプロジェクトは28 日、GNUstepベースのデスクトップ環境「Etoile 0.2」を リリースした。動作にはLinuxなどのUNIX系OS上に構築した最新のGNUstep環境にくわえ、 OniGuruma 5.0以降やD-Bus 1.0以降など、機能を依存する外部ライブラリ群が必要。 単独で起動可能なLive-CDの提供も予定されているが、現時点では公開されていない。

ちゃんとデスクトップ環境と書いてあった。 あとここにも鬼車が。

■_ Python 3000 FAQ

Guidoパパのblogより。

http://www.artima.com/weblogs/viewpost.jsp?thread=211200

Q. I want to learn Python. Should I learn Python 2.6 or Python 3.0?

わたしはPythonの勉強をしようと思っています。
そこで、Python 2.6 と Python 3.0のいずれを使えばいいでしょうか?

A. Definitely learn Python 2.x (the latest version out is 2.5). 
I expect it'll be two years before you'll need to learn 
Python 3.0, and the differences aren't that great from a beginner's perspective: 
most of what you'll learn about 2.x will still hold about 3.0.

2.x (最新は2.5です)で決まりですね。
あなたが Python 3.0を学ぶ必要に迫られるには二年くらいかかるんじゃないかと
わたしは思っています。
そして、これら二つの間の違いというものは入門者にとって
あまり重要なものではないのです。
2.xに関してあなたが学ぶであろうことのほとんどが3.0でもそのままになっているでしょう。


Q. If you're killing reduce(), why are you keeping map() and filter()?

あなたはreduce()を殺そうとしているというのに、なぜmap()やfilter()はそのまま
なんですか?


A. I'm not killing reduce() because I hate functional programming; 
I'm killing it because almost all code using reduce() 
is less readable than the same thing written out using a for loop and an 
accumulator variable. On the other hand, map() 
and filter() are often useful and when used with a pre-existing function 
(e.g. a built-in) they are clearer than a list 
comprehension or generator expression. (Don't use these with a lambda though; 
then a list comprehension is clearer and faster.)

関数型プログラミングを嫌っているから reduce()をなくすのではありません。
reduce()を使っているコードのほとんどすべてがforループや accumlator 変数を
使って書かれた同等のものよりも読みにくいからなくすのです。
一方で、map()だとかfilter()は便利なことが多く、既に存在している関数(たとえば
組込みのそれ)を使ったときにはリスト内包(list comprehension)やジェネレータ式
(generator expression)を場合よりもコードが明瞭になります(ただしこれらをlambda
式とともに使ったりしないこと。そうするよりはリスト内包を使った方が明瞭かつ高速
なコードになります)。

Q. Multi-core processors will be standard even on laptops in the near future. 
Is Python 3.0 going to get rid of the GIL 
(Global Interpreter Lock) in order to be able to benefit from this feature?

近い将来には、ラップトップにおいてさえマルチコアプロセッサが当たり前のものと
なるでしょう。Python 3.0は その機能による恩恵を受けるために
GIL (Global Interpreter Lock: ジャイアントロックとかいうやつ?)を取り除こうと
していますか?

A. No. We're not changing the CPython implementation much. Getting rid of the GIL 
would be a massive rewrite of the interpreter because all the internal data 
structures (and the reference counting operations) would have to be made 
thread-safe. This was tried once before (in the late '90s by Greg Stein) and the 
resulting interpreter ran twice as slow. If you have multiple CPUs and you want to 
use them all, fork off as many processes as you have CPUs. (You write your web 
application to be easily scalable, don't you? So if you can run several copies on 
different boxes it should be trivial to run several copies on the same box as 
well.) If you really want "true" multi-threading for Python, use Jython or 
IronPython; the JVM and the CLR do support multi-CPU threads. Of course, be 
prepared for deadlocks, live-locks, race conditions, and all the other nuisances
that come with multi-threaded code.

いいえ。わたしたちはCPythonの実装をそれほど大胆には変えていません。GILを取り除く
ことはインタープリターの大幅な書き直し(massive rewrite)となるでしょう。なぜなら、
すべての内部的データ構造(とリファレンスカウントの操作)をスレッドセーフなものに
しなければならないからです。このことは以前に一度試みられたことがあります('90年代の
終わりにGreg Steinによる)が、それによりインタープリタの速度は半分ほどに低下して
しまったのです(ran twice as slow)。もしあなたが複数のCPUを持っていてそれらすべてを
使いたいのであれば、あなたが持っているCPUと同じ数だけプロセスを fork offしてくださ
い。(あなたは自分のwebアプリケーションを簡単にスケーラブルなものにできますよね。
違いますか? そうすることで、異なる箱で幾つかのコピーを動作させることができたなら
一つの箱の中でそれだけのコピーを走らせるのとたいした違いはありません。もしあなたが
“本当の”マルチスレッディングをPythonで必要としているのなら、JythonかIronPythonを
使ってください。JVMやCLRはマルチCPUによるスレッドをサポートしています。もちろん、
デッドロック、ライブロック(ってなに?)、競合条件などのマルチスレッドなコードに起因
する厄介もの(nuisances)の対処をしなければなりません)


Q. I prefer to use the same source code for 2.x and 3.0; I really don't want to 
have to use the 2to3 source conversion tool. Why can't you make that work?

わたしは2.x向けと3.0向けとで同じソースコードを使いたいと思っています。
しかし 2to3 ソース変換ツールのようなものを使いたくはありません。
なぜ同じコードが動作するようにしてくれなかったんですか?

A. Suit yourself. There intersection of 2.6 and 3.0 is large, but there are 
several things you can't do: you can't use Unicode literals (2.6 only), nor 
bytes literals (3.0 only). The only print syntax that works the same in both 
versions is print(x). When you catch exceptions you can't inspect their values, 
because the 2.6 syntax uses , while 3.0 uses as. You can't use .iterkeys(), but 
.keys() works differently in 2.6 and 3.0. You can't use xrange(), but range() works 
differently. You can't use metaclasses, as the syntax for specifying a metaclass 
is completely changed in 3.0. And so on. Restricting yourself to the intersection 
of the two versions is very painful and limited. We're not introducing backwards 
compatibility syntax in 3.0, because that would defeat the purpose (we've had 
backwards compatibility forever in 2.x, and the whole point of 3.0 is to clean 
up the mess).

自分の手でなんとかしてください。2.6と3.0との共通部分は大きなものです。
しかしながら、いくつかの越えられない壁が存在しています。たとえば、2.6ではUnicode
のリテラルを使うことができませんし、同様に3.0ではバイトリテラルを使うことができま
せん。これら二つのバージョンで共通して動作する出力構文は print(x)だけですが、
例外を捕捉したときにその値をinspectすることはできません。なぜなら、2.6での構文が
使われていて、値を得るには3.0での構文が必要だからです。さらに挙げると、iterkeys()
を使うことができず、.keys()は2.6と3.0とで異なる動作をします。xrange()を使うことは
できず、range()は動作が異なります。3.0においてメタクラスを指定するための構文は
まるっきり変わってしまったのでメタクラスを使うことはできません。
自分自身を二つのバージョンで共通に使えるものだけに縛り付けるのはとても痛みを伴い、
制限が強いものなのです。わたしたちは、3.0において後方互換のための構文(backwards 
compatibility syntax)を導入することはしませんでした。なぜならそうすることによって、
わたしたちの本来の目的である2.xとの互換に縛られずに整理した新しいものを3.0に
持ち込むということが台無しになってしまうからです。

■_ ノートPC

【特別企画】速攻レビュー! 驚異的な駆動時間を誇るノートPC VGN-TZ90NS | パソコン | マイコミジャーナル

しかも重量は、フラッシュメモリとDVDスーパーマルチ、 軽量バッテリーの組み合わせでわずか約1025gを実現。 最大約18時間の驚異的な駆動時間を実現する大容量バッテリーの装着時でも約1315g となっている。

ああ18時間も…ってHDDのときは無理なのかな?

■_ Javaとサロゲートペア

Javaとサロゲートペア とか Vistaとサロゲートペア

java.lang.Stringにもコードポイントに対応したメソッドが追加となっています。 サロゲートペアを含むStringのlength()は文字数とはなりません。 String#length()はUTF-16コード単位での長さを返すという仕様となりました。 サロゲートペアを1文字としてカウントしたい場合は String#codePointCount()を用います。

■_ 読んだ本

こんにちはソフトなプログラム、さようならハードなプログラム
こんにちはソフトなプログラム、さようならハードなプログラム

まあ一言でいうと、融通の利かない、修正が容易にできないようなプログラムを 組まないようにしましょう。そのためには… ということなんですが、幾つか気になったことがありました。 そのうちの一つをご紹介いたしまする。


/* 一般定数 */
#define OK      0
#define NG      -1

/* データ比較の失敗例                                      */
/* NGの示す内容は、                                        */
/* C言語コンパイラは符号付き数値と見なすようです。         */
/* 下記のように、符号なし数値と比較してしまいました。      */
/* C言語コンパイラは、data を符号無しのshortに拡張し、     */
/* NGを符号付きshortに拡張し、両者を比較するように         */
/* コンパイルしました。当然正しい比較が行われませんでした。*/
/* 注: 幾つかのコンパイラのコンパイル結果を比較しました。  */
/*     私の思うとおりに、コンパイルするものもありました。  */

unsigned char data;

if(data==NG){.....}

/* 次のように switch文を書いても結果は同じでした */
unsigned char data;

switch (data) {
        case OK: .....; break;
        case NG: .....; break;
}

/* どうしても符号無し数値と比較しなければならないときは、*/
/* 次のようにすれば予定の比較を行ってくれるようです。    */
/* しかし、キャスティングでのごまかしは後々に悪影響を    */
/* 残します。やってはならないことでしょう。              */

unsigned char data;
if(data == (unsigned char)NG) {......}

/* 本来は、次のようにすべきものでした。*/

char data;
if(data == NG) {....}

えーーー、どうコメントをつけたものやら(^^; ANSI/ISO Cの promotion ruleにもそれ以前の promotion rule にも合致しないですよねえ? >筆者が期待している動作
いや、K&R時の規則には合うのか? → QAC - ANSI C型拡張

K & R では 「符号(unsigned)」 を保持する規則で型拡張していましたが、ANSI C 
標準では「値」を保持する規則で型拡張します。


「符号(unsigned)」を保持する規則:

2 つのうちどちらかのオペランドが符号なしの場合、両方のオペランドとも、“一番簡単
に”計算できる、少なくとも大きな型のオペランドと同じ大きさの符号なしの型に拡張さ
れる。

つまり、(unsigned char型 - int 型) の計算結果は、unsigned int型になります。


「値」を保持する規則:
両方のオペランドとも、2つのオペランドの全ての値を表現できる、一番簡単に計算できる
型に拡張される。

つまり、(unsigned char型 - int 型) の計算結果は、unsigned char型が int 型より狭
い範囲を表現する限りは int型になります。

組込み畑の人のようなのだけど、 関数の戻り値の型が char とか shortばかりってのが気になった。 shortはまあ環境によるとしても、charを返すってのは? あと、「(ソフトウェアの)特許をがんがん出しましょう」ってのもちとねえ…

初版一刷りが2000年ということなのでまあ古い本といえば古い本ですが。 ちょっと他人には薦めにくいです。 いいことも書いてあるんですけどねえ。

■_ メモ(perl 5.9.5 正規表現)

perlre - Perl 正規表現

2007年07月29日

高速化

Matzにっき 経由 [ruby-dev:31312] faster Bignum#to_s

手の上げ手が誰もいないようならやろうと思ってたけど、まずはよかった。 自分のやるべきことはほかにあるのでね (って自分で勝手にそう設定しているだけの話なんだけど)。

よくわからない

  データベースソフトの作り方 -OKWave

個人で、あるソフトを作ろうと思い立ち、いろいろ調べてVisual Studio 2005を購入しました。
僕が作りたいのはデータベース系のアプリケーションプログラムなのですが、どの言語を
使用したらよいのか、又、どうやって作っていってよいのか分かりません。プログラム入
門の本を参考にして、基本設計くらいは出来ています。何かよいアドバイスや、初心者向
けの基本書がありましたら教えてください。


|プログラミング未経験で入門書読みながらの基本設計って、
|コンセプト(こんなものが作りたいなぁ)のことですか?
|ほんとに基本設計ができてるなら、後は画面仕様とか各種チャートとか
|ERとか見ながら実装に落とし込んでいくだけだと思います。
|もしもこういったものがないなら、まずはこれらを作る(設計する)ところからスタートかと。


回答ありがとうございます。

もう少し具体的に申し上げますと、「あるソフト」とは自動車の燃費管理なんかのことです。走行距離や給油量を日時で入力していくと燃費や費用なんかがグラフで分かる、というものです。

僕の言う「基本設計」というのは、上記の燃費を出すために、日付の入力→走行距離の
入力→給油量の入力→燃費計算→グラフ化、みたいな手順のことです。
他にも管理したい項目があって、それらについても同様です。


回答ありがとうございます。
  このソフトは、シェアウエアにしたいと考えています。
まだ早すぎるかもしれませんが、画面のデザインなんかにも見やすい、分かりやすい、
キレイなものにしたいと考えてます。
無謀でしょうか?

えーと…(苦笑)

PASCAL言語の長桁計算 -OKWave
http://okwave.jp/qa3209161.html

PASCAL言語の長桁計算

3のn乗を求める長桁計算はどのようなソースを書けばできるのでしょうか。
説明とともに教えてくれませんか??
けっこう急いでます。

まあ多倍長計算のことを云っているのだろうけど、 すなおに「俺の代わりにソース書いてくれ」って書きゃあいいのに(笑) 夏休みの宿題にしちゃ時期的に早いし、 休み前の課題なら逆に遅いよなあ。何だろう。

phpをある程度習得するまでの期間 -OKWave
http://okwave.jp/qa3208511.html


web業界4ヶ月の者です。

業務でphpを使用しています。現在1ヶ月半ほどphpにてプログラミングをしているのですが、
どうも理解が進みません。
こうやったらこれが実現できるというようなロジックを考えつくまで非常に時間がかかって
しまいます。
ほかの人が3日でできるという簡単なシステムをつくるのに1ヶ月ほど費やしています。

上司曰く、「学生でもできる最低限のレベル」のことができないといった状況です。
phpは非常に簡単な言語だから誰でもわかるとのことなのですが、1ヶ月半やそこらで習得
できるようなものなのでしょうか。
習得できない私はあまりプログラミングをするのに向いていないのでしょうか。
皆様の率直なご意見をお願いいたします。

ちなみに、プログラミング歴は2年でVBをやっていました。一応基本的な知識はあると
思っています。
過去に、10以上の言語をやってきましたが・・・

< 上司曰く、「学生でもできる最低限のレベル」のことができない
< といった

この言い方は大げさでしょう。通常の学生で出来る人はいますが、
圧倒的にその数は少ないですよ。稀と言っても過言では無いでしょう。
例外を引き合いに出すのは卑怯です。

< 習得できない私はあまりプログラミングをするのに向いていない
< のでしょうか。

向き不向きがある、というのがどうも理解出来ませんが。
プロもアマチュアもかなりの数教えてきましたが、やる気の無い人
は、自分が行わない言い訳を何時も持っている、というのを学びま
した。これはプロもアマも問わなかったですね。

私見では、数百万年前には無い職業なので、生まれながらにして合っ
ている人はいないのではないでしょうか。人間は、後天的に合わせる
ことが出来るから人間なのだと思いますけど。

生まれながらにしてこの職業が合っている、という言葉はウソという
か間違いだと思いますね。氏より育ちです。20歳過ぎても、自分で
自分を変えられます。

< 一応基本的な知識はあると思っています。

少なくとも現時点ではこの気持ちを捨てないといけないと思います。
個人的な感想では、BasicがベースのVBは言語としてどうかな?と
思います。


数百年前にどんな職業があったと?w

今現在のVisual BASICが問題あるとするなら、それはBASICをひきずってきた こととはほぼ無関係なんじゃなかろうか。 Street BASICで槍玉に挙げられていたような、 行番号必須でまともな構造化文がないとかいうのはすでに過去の話。

ふとこの質問者にfizzbuzz問題解かせたらどうなるか気になった(笑)

ページの構成をもうちょっと考えるかなあ

小迫さんのところ経由で ハングアップの日々 (2007/07)の7/12分

ときどきの雑記帖 リターンズ -- onigsed, yagrep の作者の日記。
正規表現やスクリプト言語に関する話題など。前から時々見ているが、ページが長すぎて、
Firefox の表示がおかしくなることがあるのが困ったところ。各月のページの最後にある、
前月・次月のページへのリンクが切れているのも気になる。
  

うひ、すみませぬ。

Fxで表示がおかしいというのは長いから、ではなくたぶんXTHMLのタグを 打ち間違っているせいではないかと思います。 が、ここ三ヶ月ばかりは、プログラム片を貼り付けることが多かったりしたので いい加減容量が大きくなっているので、 前半/後半とか上旬/中旬/下旬に分けた方が良かろうと考えています。 そろそろ月変わりなのでちょうど良いか?

リンク切れは最近気がついて直したので今は大丈夫じゃないかなあと。

んでそのそばのエントリに反応してみる。

対応作業中に思ったのだが、もしかして Perl だと、$+{$+{name}} のように、入れ子も
使えるのだろうか。

s/^(?<select>[ab]),(?<a>.*?),(?<b>.*?)$/$+{$+{select}}/mg
上の正規表現に、
a,1234,abcd
b,5678,efgh
というデータを食わすと
1234
efgh
になったりするのだろうか? 仮に Perl でできたとしても、bregonig.dll では対応する 気はないのだが。  Perl 5.8 で確かめてみたところ、${$1} のように、数字による参照を入れ子にするこ とは可能だった。

記述として入れ子にすることは通常のハッシュ変数におけるデリファレンスと 同じことだろうと思われるので、「構文的」には許されるだろうと思います。 しかし、上記の例のような結果にはならないのではないだろうと推測します。

新しい regcomp/regexecを見ている暇はないけど、 5.9.5をビルドして試すくらいはしてみようか。

判断に苦しむ

29日の読売新聞の記事。 一面に載っていたのでYOMIURI オンラインにあるかと思って探してみたら 案の定あった。

経済産業省は28日、自動車メーカー10社と共同で、自動車のエンジンなどを動かす
電子制御装置に組み入れる「基本ソフトウエア(OS)」の開発に乗り出す方針を決めた。
週明けにも発表する。

 パソコンのOSは米マイクロソフトの「ウィンドウズ」が世界を制覇しているが、自
動車では欧州勢が先行している。これまで日本企業はそれぞれが独自開発に取り組んで
きたが、共同開発で、一気に世界標準を狙う。
現在、世界最大手の自動車部品メーカー、独ボッシュの自動車用OS「オーゼック」が、
世界市場の約7割を占め、自動車版の「ウィンドウズ」になりつつある。さらに、
BMWやダイムラー・クライスラーなど欧州勢は共同で、次世代OSの開発に取り組んで
おり、08年には試作品が完成する見込みだ。

 一台の自動車に搭載する電子制御装置の数は1980年代は5個程度だったが、現在
では30個を超えており、一部高級車では100個を超える。自動車の製造原価の2割
程度が電子・電気部品で、エンジンとモーターの切り替えなど複雑な制御が必要なハイ
ブリッド車では5割近くに達する。世界の自動車は約9億台にのぼり、仮に自動車用
OSの標準を日本が握れば、これに適合する部品や応用ソフトなどで商機は飛躍的に
拡大すると期待されている。

あんたらTRONでなめた苦汁をわすれたのか? 何の考えもなしに(おそらくは幾千のプログラマの屍の上に) 作ったって、そしてそれが良いものだったとしても、 標準を握るってのはそれだけじゃダメでしょ?

オーゼックとかいう名前ははじめて聞いた。調べてみよう。 この辺とか?→ 需要が拡大する自動車制御OSを知る

 ● 自動車向けの標準仕様となりつつあるOSEK/VDX

 国内では,トヨタ自動車が1999年からITRON仕様に準拠したリアルタイムOSを一部の車の
エンジン制御に採用しています.一方,欧州では自動車メーカや部品メーカが中心となって
自動車用リアルタイムOSの標準化活動を推進しており,「OSEK/VDX」というプロジェクトが
リアルタイムOSの仕様を提案しています(1995年に仕様書のVer 1.0を公開した).この仕
様は,欧州の自動車メーカで採用されて着実に普及しており,自動車制御の標準OS仕様とな
りつつあります注5.今後は国内においても,部品の国際調達などを目的として,OSEK/VDX
仕様OSが広く浸透することが予想されます.

注5:
OSEK/VDXが提案した仕様は,2004年7月にISO(International Organization for
Standardization;国際標準化機構)の最終ドラフト投票で承認された.訂正がなければ,
3ヵ月以内に国際規格となる予定. 

おいおい相手はもうISOに提出してんじゃん。大丈夫かよ…

Wikipediaにもあった→ OSEK - Wikipedia

2007年07月28日

正規表現

bard: 正規表現POSIX…? こんなことをそれこそググっても、意外とこの手の悩みをWebに記載している人がいないみたいなので、 今エントリしている理由。
これぐらいのことは、皆理解しているのかねぇ。
まぁ結局、なんとか、設定してみて、知り合いのプログラマに見てもらって、修正(解説)してもらって、 無事設定したのだけれど、ここまでよくできているのに。
フィルタリングだけやりにくいなんてねぇ。インタフェースを変えたらいいやん。 それこそ、生成ツールなんてのをWebで稼動させたんだったらそれを使うなり、 設定方法をもすこし一般的な記号(?や*)で設定できるとかさ。

まあ正規表現つーてわかる人も割合としてはそう多くはないと?

GUNDAM THE ORIGIN (2007年9月号掲載分)

「モルトケ」の僚艦の名前が「バターン」というのもなんかむずがゆいな。 「ビスマルク」はベタすぎるにしても「フォン・ヒンデンブルク」とか。

メモ(Perl)

書こう書こうと思いつつ一ヶ月も経ってしまった…

Perlについての質問箱 31箱目 
http://pc11.2ch.net/test/read.cgi/tech/1181500187/188-


188 デフォルトの名無しさん [sage] Date:2007/06/26(火) 00:06:06  ID: Be:
    いろいろためしてみたのですが、
    どうしてもわからないので、ヒントをください。

    WindowsXP で use open でエンコードを指定すると
    ``の結果が以下のように化けします。
    "\x{008a}" does not map to cp932 at sample.pl line 20.
    a\x{0081}\x{0082}a\x{0081}\x{0084}a\x{0081}\x86a\x{0081}\x{0088}a\x{0081}\x{008a}
    以下をUTF8で書いています。

    use utf8;
    use Encode;
    use open IO => ":encoding(cp932)";
    binmode STDIN, ":encoding(cp932)";
    binmode STDOUT, ":encoding(cp932)";
    my $command = 'echo あいうえお';
    my $encoded_command = encode( 'cp932', $command );
    my $result = `$encoded_command`;
    # ↑エラーcp932 "\x86" does not map to Unicode at sample.pl line 15.
    print 'UTF_flag=', utf8::is_utf8( $result ), "\n";
    # ↑UTF_Flag=1:この段階ですでにUTF8フラグ付き。
    my $encoded_result = encode( 'cp932', $result );
    print $encoded_result;

    #ちなみに、以下はどれも正常に表示されます。
    print "あいうえお"; # →正常に表示
    system( $encoded_command ); # →正常に表示
    open( my $in, "$encoded_command|" );
    while( <$in> ){ print }; # → 正常に表示

189 デフォルトの名無しさん [sage] Date:2007/06/26(火) 06:49:14  ID: Be:
    >my $result = `$encoded_command`;
    なんでバッククオートでsystem呼んでるんだ?
    winにはencodeってコマンドあんの? 

190 デフォルトの名無しさん [sage] Date:2007/06/26(火) 07:21:27  ID: Be:
    binmode STDOUT, ":encoding(cp932)";
    してるんだから、そのまま
    print $result;
    すればいいんじゃね? 

191 188 [sage] Date:2007/06/26(火) 07:54:31  ID: Be:
    >>189
    自分の勉強不足のせいか意味がよくわかりません。
    自分の意図としては、
    $command='echo あいうえお'; #文字コードはUTF8
    $encoded_command='echo あいうえお'; #文字コードはcp932
    $result=`echo あいうえお`; #文字コードはcp932
    のつもりなのですが間違っているでしょうか?
    シェル上でencodeコマンドを実行してるつもりはないのですが。

    >>190
    やってみました。
    縺ゅ>縺\x86縺医♀
    と出力されます。 

192 163 [sage] Date:2007/06/26(火) 09:09:27  ID: Be:
    >>187
    はい、サーバ機はWindowsです。 

193 デフォルトの名無しさん [sage] Date:2007/06/26(火) 09:25:32  ID: Be:
    >>191
    そんな長いプログラムではどこがおかしいのかわからないよ。
    もうすこし切り分けしろや。

    たとえば $result = `$encoded_command`; がおかしいと思うのなら、

    echoのかわりになんか引数を適当なファイルに格納するコマンドにして
    引数が思ったとおりに渡されてることを確認

    perlから渡した文字列でなくコマンド自体が固定の文字列を出力
    するようにして$result = `...`で思ったとおり受け取れるかどうか
    を確認

    の2つに分けられるだろ。 

194 デフォルトの名無しさん [sage] Date:2007/06/26(火) 10:01:33  ID: Be:
    openプラグマのマニュアルに

    The "open" pragma serves as one of the interfaces to declare default "layers" (also
    known as "disciplines") for all I/O. Any two-argument open(), readpipe() (aka qx//) and
    similar operators found within the lexical scope of this pragma will use the declared
    defaults.

    という記述があるにもかかわらず、試してみたところ`...`やreadpipeでは
    効かないな。

    #!/usr/bin/perl

    use open IN => ':encoding(sjis)';

    $command = q{perl -e 'print "\x82\xa0\n"'}; # SJISの'あ'

    print `$command`; # ng

    print readpipe($command); # ng

    print do {open my $p, '-|', $command or die; local $/; <$p>;}; # ok

195 デフォルトの名無しさん [sage] Date:2007/06/26(火) 10:45:47  ID: Be:
    $hash_ref->{'Sum(price)'} だろ 

196 デフォルトの名無しさん [sage] Date:2007/06/26(火) 10:46:27  ID: Be:
    すまん、誤爆 

197 デフォルトの名無しさん [sage] Date:2007/06/26(火) 15:19:19  ID: Be:
    >>186
    コマンドラインで動くのだから文法には間違いはないんだろう

    WebサーバーのDocument Rootに印刷ファイルは置いてあるのか?
    まさかクライアント側にあるファイルを印刷しようとはしてないよね

    おそらく板違いの質問のように思うぞ

    補足だが
    KCatchモジュールというのがあるから
    試しにデバッグに使ってみたらどうか 

198 デフォルトの名無しさん [sage] Date:2007/06/26(火) 20:05:27  ID: Be:
    jisx0213の発音記号を含んだ euc-jpのhtmlファイルを、
    発音記号を数値実体参照に変換する方法で
    utf-8に変換するようなモジュールはあるでしょうか。

    use HTML::Entities;
    use Encode (from_to);
    use Encode qw/ decode encode /;

    my $temp="\xa9\xdc"; ←[ae]
    Encode::from_to($temp, "euc-jp","utf8");
    $temp= decode('utf8',$temp);
    $temp= encode_entities($temp);
    print $temp; ←[a]

    ↑euc-jpから実体参照に変換するまでは出来ました。
    これから、euc-jpファイルを読み込んで、utf-8ファイルをだすのには
    どうしたらよいのでしょうか。
    どうかご教示ください。おねがいします。 

199 198 [sage] Date:2007/06/26(火) 20:08:43  ID: Be:
    上のプログラムの最終行は

    print $temp; ←[ & a e l i g ]

    でした。
    2chで実体参照されたのでスペースをひとつずつ空けておきます。 

200 デフォルトの名無しさん [sage] Date:2007/06/26(火) 21:32:23  ID: Be:
    >>191

    use Encode qw ( encode decode from_to is_utf8 );
    sub prt { my $s = shift; printf "%s\n%s\n\n", $s, join " ", unpack("H*", $s) =~ /\w{2}/g; }
    my $s = pack "H*", '82a082a282a482a682a8'; # バイト列 cp932(sjis) の 'あいうえお'
    prt $s;
    from_to $s, "cp932", "utf8"; # バイト列 を cp932 と想定して utf8 へ変換
    prt $s;
    $s =~ s/\x86/\\x86/gio; # 範囲外のコードを置換。0x86 を '\x86' に。  ←余計な動作
    from_to $s, "cp932", "utf8"; # バイト列 を cp932 と想定(実際は utf8 )して utf8 へ変換  ←余計な動作
    prt $s;
    utf8::decode($s); # utf8 フラグを立てる
    printf "is_utf8=%d\n\n", is_utf8 $s;
    $s = encode "cp932", $s; # binmode の自動変換動作
    prt $s;
    __END__

    こんな風に再現出来た。
    use open を指定すると、1回余分にコード変換をやっているみたい。
    ActivePerl の場合、エンコード関係のプラグマは極力使わない方がいいです。
    副作用の範疇に収まらない不具合が多すぎる。

    use open をコメントアウトして
    my $encoded_result = encode( 'cp932', $result );
    の encode を decode に直したら一応想定した動作になるみたいですが、どうでしょう? 

Windows(というか CR LF が行末のもの)はUnicodeで出力しようとしたときに 悲しい結果になる( 0x00 + 0x0d + 0x0a になってしまう)し、 いろいろ問題抱えているよなあ。

某会長

…もう好きにしてください。sigh.

えるだま

ん、来週か。

配信

Python workshop 2007 の動画データの配信が開始された模様。 MS絡みのが公開できないってのはまあそうなのかねえ。 → PythonWorkshop2007 - i-revo labs

本日のお買い物

DOLPHIN☆JET
DOLPHIN☆JET

7月開始の深夜アニメのOP曲の中では「さよなら絶望先生」の曲 (by 大槻ケンヂ)の次に好きだったり。 絶望先生のOP曲は8月下旬発売なんだよなあ。待ち遠しい。
曖昧ネットだーりん
曖昧ネットだーりん

xe-kdoo経由で MYCOM BOOKS - Short Coding ~職人達の技法~ 8/9発売予定と。

Cozy Ozy - ショートコーディング本


内容は、これまで(2005年11月~つい最近まで)積み重ねてきたコード短縮技術のほぼ
すべてと、これから大きく成長してゆく若いプログラマの皆さんへのメッセージです。
一般的に、良い本を書こうと思えば自分の持っているスキルの50%以下の内容にとどめ
ておくべきです。そうでなければ説明が不十分であったり、間違いが出てきてしまう
からです。しかし私はプロのライターではありません。もしかしたらこれが最後のチャ
ンスかもしれませんし、とにかく書きたいことはすべて書くつもりで取り組みました。


第5章は、本来ならば技術系の書籍に必要ないのかもしれない、私の考えや読者の皆
さんに対するメッセージにページを割いています。この書籍を発表するまでに、どれ
だけの人が関わり、どのようなドラマがあったのかを、一つの歴史として残しておき
たいという、私の願いがありました。「Short Coding ~職人達の技法~」は技術書
であり、歴史書でもあり、ショートコーダーそのものでもあります。

一冊の本をきちんと書くことのできなかったわたしにはとても 重く響きます。

DS Heavy

うまいネーミングw

2007年07月27日

バカ征く

頭来たから、これも朝消す。

とあったんでちと無粋かもしれませんが。


今、『ソフトウェア開発 基本 活動』でググってみたん
だけど、オレの書いたのなんてズーッと後のほうになん
ないと引っかかんないのね。いや、それは今日にはじまった
こっちゃないからいいんだけど。でも、前のほうに出て
くるページのどれ1つとしてソフトウェア開発の基本って
いうもんを教えちゃくれないのはどういうわけ?

オレがバカなのか、Googleがバカなのか、それともみんなが
バカなのか、どれなんだ?

ソフトウェア開発 基本 活動 - Google 検索
これは確かに微妙な結果ですねえ。

ソフトウェア開発の基本とは - Google 検索 んー、大差ないか。

~べき

「~すべき」の否定は「~すべきでない」と思ってたんだけど、 「~しないべき」ってのも結構使われてる?

間違ってるとか何とかいうつもりはありません。

■_ 正規表現のPerl拡張

まあPerl5以後の正規表現の拡張はPerlが先鞭をつけたものが大半を占めると 考えられるので、その意味ではPerlを基準に考えるのも一利あるとは思うけど、 ビミョーな記述における動作までリファレンスにすることはないんじゃなかろうか。 そもそもPerlにしても今の(そういった微妙なものの)動作がきちんと策定された 仕様の元に定められたものではないのだから。

ということで

>ruby186 -ve "p(/a(?=b)?/.match('a'))"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
nil


>ruby -ve "p(/a(?=b)?/.match('a'))"
ruby 1.9.0 (2007-07-24 patchlevel 0) [i386-mswin32_71]
0: uninitialized Regexp (TypeError)


Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r  = re.compile(r'a(?=b)?')
>>> r
<_sre.SRE_Pattern object at 0x008D0F80>
>>> r.match('a')
<_sre.SRE_Match object at 0x0093DC28>
>>> r.match('a').group(0)
'a'

鬼車つきRubyのエラーメッセージはなんか変だな。

今日のお届けもの

「笑い男」でお馴染み 「攻殻機動隊 STAND ALONE COMPLEX」 DVD-BOX発売
http://www.akibablog.net/archives/2007/07/stand-alone-complex-070727.html

Amazonで25%引きだったので早々に予約してしまっていた。 25%引きになるくらいだから数は潤沢にあるのかと思ったら、 店によってはもうないところもあるって? 攻殻恐るべし。

Ruby's M17N

The Ruby VM: Episode IV

Matz:

    You can specify the encoding for Ruby scripts by the coding pragma at the head
    of the script. For example, if your script is in UTF-8, try specify

    # coding: utf-8

    that makes all strings and regex literals in the script to be specified UTF-8.
    You can also specify the encoding for IO reading strings via open, e.g.

    open(path, "r:utf-8") do |f|
      line = f.gets
    end

    or by binmode (ala Perl), e.g.

    f = open(path, "r")
    f.binmode(":utf-8")

    The default encoding is binary for ordinary IO, and locale specified encoding
    for STDIN. It should be allowed that encoding conversion at the time of IO
    reading, but the API is not fixed yet. Maybe

    open(path, "r:utf-8<euc-jp")

    that should read EUC-JP data then convert it into UTF-8 and return the
    converted string.

ふむ。 この変換は、システムで抱えている(と期待する)iconvあたりでやるのかな? まあPerlみたいに変換用データを自前で抱えると配布アーカイブが巨大になるしねえ。

アクセスログのりふぁらから発見 なつたん: Verilog 今必要なのはHDL厨

Verilog 1.0の時代、一人くらいHDLとか勧めても良いと思った。CLK単位のレジスタの
遷移が分からなければ、パイプラインもキャッシュも理解できない。HDDやVideoの
コントローラが書けるようになって、はじめてちゃんとした制御ができるとか。

誰も(やりたいと願っている人に対して)それをするなとは云っていないわけで。 逆に少数であってもそれをやってくれる人がいなければ多くの人が困ることになるでしょう。 が、誰も彼もがそれをやらなければならないというのも極論に過ぎるのではないですかね。

ふぃぎあ

とれたて!ほびーちゃんねる - ◎めがっさメイドウェイトレスにょろ♪アルター版『鶴屋さん』登場! :: HOBBY STOCK :: 鶴屋さん メイドVer. (ALTER 涼宮ハルヒの憂鬱)

高さが18センチか…結構大きいな。 しかし、わし「ちゅるやさん」の方が欲しいのだがw (ワンフェスに一日版権のもので出たらしい)

そこで××ですよっ

なつたん: そんな餌に釣られないクマー

あろはさんが極太の釣り針を垂らしている。 初心者が一番最初に学ぶべきプログラミング言語は何か ?

次にCASLの方なのですが、俺様CPUをCOMMET互換で作ろうとして速攻飽きた自分が 言うのもなんですが、学習的では無いと思っています。 CASLIIでは、 C言語の理解を高めるためにアセンブラを勉強しましょう、 みたいな雰囲気が見え隠れしていて、かなり嫌だったりします。本来、 世の中にはアセンブラでしかできないことがあり、 それこそがアセンブラの存在意義なんです。CASLIIはそこがごっそり抜けている。 具体的には、リセット直後の CPUの動き、割り込みの処理、内部割り込みの発生、 プロセッサのモード変更やキャッシュのイネーブル/ディゼーブルetc・・・。 入出力だってマクロにする必要はなくって、外部のコントローラにアクセスさせるか、 内部割り込みを発生させればいいんですよ。説明の手間いっしょでしょ。あと、 いくら頑張っても動く実機がないというのは、最初から 「試験で点を取るために勉強します」になって良くないと思う。

MMIX…も外部インターフェースは決まってないか。 大学時代、ゼミのお手伝いで教授の講義の助手として 下級生のアセンブリ言語の講義を手伝ったことがあるんですが、 内部/外部原因の割り込みでひっかかるひとは少なくなかったですね。 制御が突然ぜんぜん違うところに移るのが容易に理解できなかったようで。

少なくとも「基本情報処理技術者」レベルではなくなってしまうように思われ。 まあ問題を工夫すれば何とかなる?

2007年07月26日

■_

アフタヌーンは置いていないのにIKKIは置いてあるという某コンビニの品揃えは どうかと思った。

■_ Programming Erlang

『Programming Erlang』届いたよ - val it : α → α = fun

先日ここにも書いたように発送されたという連絡は来ましたが ブツはまだわたしの手元には着いていません。 まあ航空便じゃない(多分)しな。

さてそんな『Programming Erlang』ですが、邦訳が出るという話があるようです。 わたしも詳しい状況はよく知りませんし、すくなくともわたしが訳しているのとは関係ありません。 というか誰が訳しているのかも知らない。 なのでいつ出るかもわかりませんし詳しい話はできませんが、まあ、 そう遠くないうちに翻訳は出るんじゃないでしょーか、とだけ言っておきます。

あはははは(乾いて引きつった笑い) いつものパターンくさい喃

さて、わたしのこの本に対する評価というのを書いていなかったように思いますが、 これはかなり良い本だと思いました。 (略) そんなわけで Erlang に興味がなくても読んでみると得るものがあるのではと 思いたくなるくらい。

それは楽しみな。

■_ Dive into python sourcecode

つーことで file オブジェクトに寄り道してみる

PyObject *
PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE *))
{
	PyFileObject *f = (PyFileObject *)PyFile_Type.tp_new(&PyFile_Type,
							     NULL, NULL);
	if (f != NULL) {
		PyObject *o_name = PyString_FromString(name);
		if (o_name == NULL)
			return NULL;
		if (fill_file_fields(f, fp, o_name, mode, close) == NULL) {
			Py_DECREF(f);
			f = NULL;
		}
                Py_DECREF(o_name);
	}
	return (PyObject *) f;
}

PyObject *
PyFile_FromString(char *name, char *mode)
{
	extern int fclose(FILE *);
	PyFileObject *f;

	f = (PyFileObject *)PyFile_FromFile((FILE *)NULL, name, mode, fclose);
	if (f != NULL) {
		if (open_the_file(f, name, mode) == NULL) {
			Py_DECREF(f);
			f = NULL;
		}
	}
	return (PyObject *)f;
}

static PyObject *
file_read(PyFileObject *f, PyObject *args)
{
	long bytesrequested = -1;
	size_t bytesread, buffersize, chunksize;
	PyObject *v;

	if (f->f_fp == NULL)
		return err_closed();
	/* refuse to mix with f.next() */
	if (f->f_buf != NULL &&
	    (f->f_bufend - f->f_bufptr) > 0 &&
	    f->f_buf[0] != '\0')
		return err_iterbuffered();
	if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested))
		return NULL;
	if (bytesrequested < 0)
		buffersize = new_buffersize(f, (size_t)0);
	else
		buffersize = bytesrequested;
	if (buffersize > PY_SSIZE_T_MAX) {
		PyErr_SetString(PyExc_OverflowError,
	"requested number of bytes is more than a Python string can hold");
		return NULL;
	}
	v = PyString_FromStringAndSize((char *)NULL, buffersize);
	if (v == NULL)
		return NULL;
	bytesread = 0;
	for (;;) {
		Py_BEGIN_ALLOW_THREADS
		errno = 0;
		chunksize = Py_UniversalNewlineFread(BUF(v) + bytesread,
			  buffersize - bytesread, f->f_fp, (PyObject *)f);
		Py_END_ALLOW_THREADS
		if (chunksize == 0) {
			if (!ferror(f->f_fp))
				break;
			clearerr(f->f_fp);
			/* When in non-blocking mode, data shouldn't
			 * be discarded if a blocking signal was
			 * received. That will also happen if
			 * chunksize != 0, but bytesread < buffersize. */
			if (bytesread > 0 && BLOCKED_ERRNO(errno))
				break;
			PyErr_SetFromErrno(PyExc_IOError);
			Py_DECREF(v);
			return NULL;
		}
		bytesread += chunksize;
		if (bytesread < buffersize) {
			clearerr(f->f_fp);
			break;
		}
		if (bytesrequested < 0) {
			buffersize = new_buffersize(f, buffersize);
			if (_PyString_Resize(&v, buffersize) < 0)
				return NULL;
		} else {
			/* Got what was requested. */
			break;
		}
	}
	if (bytesread != buffersize)
		_PyString_Resize(&v, bytesread);
	return v;
}
PyTypeObject PyFile_Type = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,
	"file",
	sizeof(PyFileObject),
	0,
	(destructor)file_dealloc,		/* tp_dealloc */
(ry
	(getiterfunc)file_self,			/* tp_iter */
	(iternextfunc)file_iternext,		/* tp_iternext */
	file_methods,				/* tp_methods */
	file_memberlist,			/* tp_members */
	file_getsetlist,			/* tp_getset */
	0,					/* tp_base */
	0,					/* tp_dict */
	0,					/* tp_descr_get */
	0,					/* tp_descr_set */
	0,					/* tp_dictoffset */
	file_init,				/* tp_init */
	PyType_GenericAlloc,			/* tp_alloc */
	file_new,				/* tp_new */
	PyObject_Del,                           /* tp_free */
};
/* A larger buffer size may actually decrease performance. */
#define READAHEAD_BUFSIZE 8192

static PyObject *
file_iternext(PyFileObject *f)
{
	PyStringObject* l;

	if (f->f_fp == NULL)
		return err_closed();

	l = readahead_get_line_skip(f, 0, READAHEAD_BUFSIZE);
	if (l == NULL || PyString_GET_SIZE(l) == 0) {
		Py_XDECREF(l);
		return NULL;
	}
	return (PyObject *)l;
}

/* Used by file_iternext.  The returned string will start with 'skip'
   uninitialized bytes followed by the remainder of the line. Don't be
   horrified by the recursive call: maximum recursion depth is limited by
   logarithmic buffer growth to about 50 even when reading a 1gb line. */

static PyStringObject *
readahead_get_line_skip(PyFileObject *f, int skip, int bufsize)
{
	PyStringObject* s;
	char *bufptr;
	char *buf;
	Py_ssize_t len;

	if (f->f_buf == NULL)
		if (readahead(f, bufsize) < 0)
			return NULL;

	len = f->f_bufend - f->f_bufptr;
	if (len == 0)
		return (PyStringObject *)
			PyString_FromStringAndSize(NULL, skip);
	bufptr = (char *)memchr(f->f_bufptr, '\n', len);
	if (bufptr != NULL) {
		bufptr++;			/* Count the '\n' */
		len = bufptr - f->f_bufptr;
		s = (PyStringObject *)
			PyString_FromStringAndSize(NULL, skip+len);
		if (s == NULL)
			return NULL;
		memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len);
		f->f_bufptr = bufptr;
		if (bufptr == f->f_bufend)
			drop_readahead(f);
	} else {
		bufptr = f->f_bufptr;
		buf = f->f_buf;
		f->f_buf = NULL; 	/* Force new readahead buffer */
		assert(skip+len < INT_MAX);
                s = readahead_get_line_skip(
			f, (int)(skip+len), bufsize + (bufsize>>2) );
		if (s == NULL) {
		        PyMem_Free(buf);
			return NULL;
		}
		memcpy(PyString_AS_STRING(s)+skip, bufptr, len);
		PyMem_Free(buf);
	}
	return s;
}
static PyObject *
file_self(PyFileObject *f)
{
	if (f->f_fp == NULL)
		return err_closed();
	Py_INCREF(f);
	return (PyObject *)f;
}
static PyObject *
file_readlines(PyFileObject *f, PyObject *args)
{
	long sizehint = 0;
	PyObject *list;
	PyObject *line;
	char small_buffer[SMALLCHUNK];
	char *buffer = small_buffer;
	size_t buffersize = SMALLCHUNK;
	PyObject *big_buffer = NULL;
	size_t nfilled = 0;
	size_t nread;
	size_t totalread = 0;
	char *p, *q, *end;
	int err;
	int shortread = 0;

	if (f->f_fp == NULL)
		return err_closed();
	/* refuse to mix with f.next() */
	if (f->f_buf != NULL &&
	    (f->f_bufend - f->f_bufptr) > 0 &&
	    f->f_buf[0] != '\0')
		return err_iterbuffered();
	if (!PyArg_ParseTuple(args, "|l:readlines", &sizehint))
		return NULL;
	if ((list = PyList_New(0)) == NULL)
		return NULL;
	for (;;) {
		if (shortread)
			nread = 0;
		else {
			Py_BEGIN_ALLOW_THREADS
			errno = 0;
			nread = Py_UniversalNewlineFread(buffer+nfilled,
				buffersize-nfilled, f->f_fp, (PyObject *)f);
			Py_END_ALLOW_THREADS
			shortread = (nread < buffersize-nfilled);
		}
		if (nread == 0) {
			sizehint = 0;
			if (!ferror(f->f_fp))
				break;
			PyErr_SetFromErrno(PyExc_IOError);
			clearerr(f->f_fp);
		  error:
			Py_DECREF(list);
			list = NULL;
			goto cleanup;
		}
		totalread += nread;
		p = (char *)memchr(buffer+nfilled, '\n', nread);
		if (p == NULL) {
			/* Need a larger buffer to fit this line */
			nfilled += nread;
			buffersize *= 2;
			if (buffersize > PY_SSIZE_T_MAX) {
				PyErr_SetString(PyExc_OverflowError,
			    "line is longer than a Python string can hold");
				goto error;
			}
			if (big_buffer == NULL) {
				/* Create the big buffer */
				big_buffer = PyString_FromStringAndSize(
					NULL, buffersize);
				if (big_buffer == NULL)
					goto error;
				buffer = PyString_AS_STRING(big_buffer);
				memcpy(buffer, small_buffer, nfilled);
			}
			else {
				/* Grow the big buffer */
				if ( _PyString_Resize(&big_buffer, buffersize) < 0 )
					goto error;
				buffer = PyString_AS_STRING(big_buffer);
			}
			continue;
		}
		end = buffer+nfilled+nread;
		q = buffer;
		do {
			/* Process complete lines */
			p++;
			line = PyString_FromStringAndSize(q, p-q);
			if (line == NULL)
				goto error;
			err = PyList_Append(list, line);
			Py_DECREF(line);
			if (err != 0)
				goto error;
			q = p;
			p = (char *)memchr(q, '\n', end-q);
		} while (p != NULL);
		/* Move the remaining incomplete line to the start */
		nfilled = end-q;
		memmove(buffer, q, nfilled);
		if (sizehint > 0)
			if (totalread >= (size_t)sizehint)
				break;
	}
	if (nfilled != 0) {
		/* Partial last line */
		line = PyString_FromStringAndSize(buffer, nfilled);
		if (line == NULL)
			goto error;
		if (sizehint > 0) {
			/* Need to complete the last line */
			PyObject *rest = get_line(f, 0);
			if (rest == NULL) {
				Py_DECREF(line);
				goto error;
			}
			PyString_Concat(&line, rest);
			Py_DECREF(rest);
			if (line == NULL)
				goto error;
		}
		err = PyList_Append(list, line);
		Py_DECREF(line);
		if (err != 0)
			goto error;
	}
  cleanup:
	Py_XDECREF(big_buffer);
	return list;
}

んーここまでみてもなぜLightCSVより高速なのかわからない…

■_ 今日のUSBデバイス

バッファロー、TurboUSB搭載のポータブルハードディスクに300GBモデル登場 | パソコン | マイコミジャーナル
300GBで4万弱ですか。 ふと、初めて買ったMOドライブ(128MBメディアのみ。SCSI接続)が 10万円くらいしたのを思い出したり。

東芝、32Gバイトの大容量モデルを含むUSBフラッシュメモリ「TransMemory」シリーズ:ニュース - CNET Japan
多分MLCだよねえ。スピードはどうなんだろう? ReadyBoost対応ということならそこそこアクセス速度は出るのか?

価格についてはオープン価格となっている。

まるっきり見当もつかないというのはなあ。 バッファローのアレから考えるとその倍くらい?

impressで紹介記事があった→ 東芝、容量32GBのReadyBoost対応USBメモリ

実売価格は、U2J-001GTが4,000円前後、U2Kシリーズの1GBモデル 「U2K-001GT」が3,000円前後、2GBの「U2K- 002GT」が6,000円前後、 4GBの「U2K-004GT」が12,000円前後、8GBの「U2K-008GT」が24,000円前後、 32GB のU2G-032GTが80,000円前後の見込み。

■_ はやぶさ

【レポート】宇宙研一般公開 - 見えてきた「はやぶさ」後継機、早ければ2010年にも打上げ (1) まずは「はやぶさ」後継機の最新情報 | ホビー | マイコミジャーナル

何日か前にたださんが行ってきたのはこれ?

本日の購入

テレビアニメ『ぼくらの』DVD Vol.1
テレビアニメ『ぼくらの』DVD Vol.1

とりあえず3巻までは買う(ダイチのエピソードが入るところまで)
スカルマン オリジナルサウンドトラック
スカルマン オリジナルサウンドトラック

スカルマン The Skull Man 1 (初回限定版)
スカルマン The Skull Man 1  (初回限定版)

全巻購入特典がライターと云うのは微妙だなあ(タバコはすわんので)。
MOONLIGHT MILE 1stシーズン-Lift off-ACT.2
MOONLIGHT MILE 1stシーズン-Lift off-ACT.2

この間に収録のエピソードの出来を見てからさらに続きを買うかどうか決めよう。
墨攻
墨攻

秒速5センチメートル 特別限定生産版 DVD-BOX
秒速5センチメートル 特別限定生産版 DVD-BOX

今日もまたAmazonからの手紙

ご予約いただいてお ります下記の商品に関し、
予定しておりました当サイト配送センターへの入荷が未だされていないため、
発送が遅れております。お待たせしており、誠に申し訳ございま せん。

継続して商品の手配を進めておりますが、現時点において想定される予定日を目処に
発送予定日を変更させていただいております。

(ry

  Kent Beck (著) "Implementation Patterns"

むーん。 まあ読む時間ないからいいか(^^;

どうなってんだよ

またドーピングで失格だって? > Tour de Fance

2007年07月25日

2 仕様書無しさん sage 2007/04/11(水) 18:52:00 
俺は神なんて信じてないが、地獄の存在は信じるよ。
それははっきりと人の手によって作られて、確かに存在してるんだから。

…野比にな。 

  

■_ 臨時収入

ソフトバンククリエイティブから封書でなにやら届いた。 中身を見ると、どうやら昔監修した本が増刷されるらしく、 それに対する支払い(著作権料とか何とか?)のようだ。 金額的にはそれほどでもないけど(主執筆者じゃないしな(^^;)、 ありがたくいただくことにする。

■_ 瑣末なこと

href="#" onclick の悪習 
http://diary.imou.to/~AoiMoe/2007.07/late.html#2007.07.24_s02


未だに

<a href="#" onclick="...">検索</a>

とか書いているサイトがあるけど、そろそろやめようぜ。

「いまだに」をきちんとこちらの字で書いている人を久しぶりに見たような気がする。

■_ Dive into python sourcecode

Pythonのcsvモジュールの実装を追いかける話のつづき。

113:        PyObject *input_iter;   /* iterate over this for input lines */
781:                lineobj = PyIter_Next(self->input_iter);
827:        Py_XDECREF(self->input_iter);
838:    Py_VISIT(self->input_iter);
847:    Py_CLEAR(self->input_iter);
919:        self->input_iter = NULL;
933:        self->input_iter = PyObject_GetIter(iterator);
934:        if (self->input_iter == NULL) {
static int
Reader_traverse(ReaderObj *self, visitproc visit, void *arg)
{
	Py_VISIT(self->dialect);
	Py_VISIT(self->input_iter);
	Py_VISIT(self->fields);
	return 0;

ひょっとしてvisitorパターンかなカナ?

#ifndef Py_VISIT
#define Py_VISIT(op)							\
        do { 								\
                if (op) {						\
                        int vret = visit((PyObject *)(op), arg);	\
                        if (vret)					\
                                return vret;				\
                }							\
        } while (0)
#endif

わおw

となると、多分 lineobj = PyIter_Next(self->input_iter); が読み取りの実際になるのだろう。 で、while (self->state != START_RECORD); 次のレコードの頭が見つかるまで繰り返すと。 PyIter_Nextはどういうものかというと

Objects/abstract.c
/* Return next item.
 * If an error occurs, return NULL.  PyErr_Occurred() will be true.
 * If the iteration terminates normally, return NULL and clear the
 * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
 * will be false.
 * Else return the next object.  PyErr_Occurred() will be false.
 */
PyObject *
PyIter_Next(PyObject *iter)
{
	PyObject *result;
	assert(PyIter_Check(iter));
	result = (*iter->ob_type->tp_iternext)(iter);
	if (result == NULL &&
	    PyErr_Occurred() &&
	    PyErr_ExceptionMatches(PyExc_StopIteration))
		PyErr_Clear();
	return result;
}

tp_iternextってのが実体は何かというと

static PyTypeObject Reader_Type = {
	PyObject_HEAD_INIT(NULL)
	0,                                      /*ob_size*/
	"_csv.reader",                          /*tp_name*/
	sizeof(ReaderObj),                      /*tp_basicsize*/
	0,                                      /*tp_itemsize*/
	/* methods */
	(destructor)Reader_dealloc,             /*tp_dealloc*/
	(printfunc)0,                           /*tp_print*/
	(getattrfunc)0,                         /*tp_getattr*/
	(setattrfunc)0,                         /*tp_setattr*/
	(cmpfunc)0,                             /*tp_compare*/
	(reprfunc)0,                            /*tp_repr*/
	0,                                      /*tp_as_number*/
	0,                                      /*tp_as_sequence*/
	0,                                      /*tp_as_mapping*/
	(hashfunc)0,                            /*tp_hash*/
	(ternaryfunc)0,                         /*tp_call*/
	(reprfunc)0,                    	/*tp_str*/
	0,                                      /*tp_getattro*/
        0,                                      /*tp_setattro*/
        0,                                      /*tp_as_buffer*/
        Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
		Py_TPFLAGS_HAVE_GC,		/*tp_flags*/
	Reader_Type_doc,                        /*tp_doc*/
        (traverseproc)Reader_traverse,          /*tp_traverse*/
        (inquiry)Reader_clear,                  /*tp_clear*/
        0,                                      /*tp_richcompare*/
        0,                                      /*tp_weaklistoffset*/
        PyObject_SelfIter,		        /*tp_iter*/
        (getiterfunc)Reader_iternext,           /*tp_iternext*/
        Reader_methods,                         /*tp_methods*/
        Reader_memberlist,                      /*tp_members*/
        0,                                      /*tp_getset*/

};

これか

static PyObject *
Reader_iternext(ReaderObj *self)
{
        PyObject *lineobj;
        PyObject *fields = NULL;
        char *line, c;
	int linelen;

	if (parse_reset(self) < 0)
		return NULL;
        do {
                lineobj = PyIter_Next(self->input_iter);
                if (lineobj == NULL) {
                        /* End of input OR exception */
                        if (!PyErr_Occurred() && self->field_len != 0)
                                PyErr_Format(error_obj,
					     "newline inside string");
                        return NULL;
                }
		++self->line_num;

                line = PyString_AsString(lineobj);
		linelen = PyString_Size(lineobj);

                if (line == NULL || linelen < 0) {
                        Py_DECREF(lineobj);
                        return NULL;
                }
                while (linelen--) {
			c = *line++;
			if (c == '\0') {
				Py_DECREF(lineobj);
				PyErr_Format(error_obj,
					     "line contains NULL byte");
				goto err;
			}
			if (parse_process_char(self, c) < 0) {
				Py_DECREF(lineobj);
				goto err;
			}
		}
                Py_DECREF(lineobj);
		if (parse_process_char(self, 0) < 0)
			goto err;
        } while (self->state != START_RECORD);

        fields = self->fields;
        self->fields = NULL;
err:
        return fields;
}

んーここまで見た限りでは、LigthCSVより三倍早い理由と云うのが 見えてこないなあ。

■_ インタプリンタ

CodeZine:あなたが学ぶべき10の現代実用プログラミング言語(概要, 入門)

1つ気になったのですが、「インタプリンタ」 という表記は私にとっては耳慣れないものでした。

そうかなあ、割と良く見かける類の間違いだと思うけど。 「シュミレーション」みたいな。

■_

Rubyの新コミュニティが発足,ビジネス利用ノウハウの集積・共有化を目指す:ITpro

Rubyビジネス・コモンズは,Rubyおよび開発フレームワークRuby on Rails(Rails)をビジネスに利用する際のさまざまなノウハウを集め,共有化することを目的とする。ここでいうノウハウは,「Railsを使ったアプリケーションのパフォーマンスをいかに上げるか」といった技術ノウハウに加えて,「顧客からの要望に対し,Railsを使ってどのようなソリューションを提案できるか」といったビジネス面でのヒントも含まれる。これらのノウハウを参加企業・団体から集め, Rubyビジネス・コモンズのWebサイト や,メーリングリスト,wikiなどを通じて提供していく。

Rubyをビジネスに活用へ、40超の企業が集まり新団体:ITpro http://itpro.nikkeibp.co.jp/article/NEWS/20070724/278166/

■_

This note’s for you » Blog Archive » Efficient JNI programming, part I http://kennke.org/blog/2007/07/20/efficient-jni-programming-part-i/

I often hear the complaint about JNI, that it’s clunky, hard to use, that it has certain overhead, and that it makes programming of native methods for Java hard and slow. Well, I agree that it’s somewhat clunky and hard to use, and the learning curve is probably steep (and the effect of not understanding how JNI and a Java VM works is usually bad performance). This is why I want to write a small series of articles which explains a couple of rules and paradigms which will allow you to get most out of JNI programming.

これはファンへのクリスマスプレゼント?

こんにちは、セブンアンドワイです。いつもありがとうございます。
  ガンダム劇場版3部作のオリジナル音声版がDVDで発売決定しました!

● 機動戦士ガンダム 劇場版メモリアルボックス <期間限定生産>
   14,742円   22%OFF  12月21日発売予定
  http://news03.7andy.jp/?4_7415_236954_1
  富野由悠季総監督監修によるHDプレミアムマスターを採用、
  当時の懐かしい映像がよりハイクオリティになって甦る!

まあ「DVD」でのタマがなくなったといううがった見方もあるか(笑)

vs.

某スレでPHP対Rubyでスレが盛り上がっている。 が、これといって目新しい意見はどちら側からも今のところは出ていないようだ。

2007年07月24日

■_ Amazonさん(.comのほう)のオススメ

例によってメールが来た。 最近 Programming Erlangを買っているのでそのせいらしい。

*Agile Web Development with Rails (Pragmatic Programmers)*
 


by Dave Thomas
Average customer review:

*List Price:* $39.95
*Price:* *$26.37*
*You Save:* $13.58 (34%)


*Dreaming in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and
One Quest for Transcendent Software*
 


by Scott Rosenberg
Average customer review:

*List Price:* $25.95
*Price:* *$17.13*
*You Save:* $8.82 (34%)



*Everyday Scripting with Ruby: For Teams, Testers, and You*
 


by Brian Marick
Average customer review:

*List Price:* $29.95
*Price:* *$19.77*
*You Save:* $10.18 (34%)


*Pattern-Oriented Software Architecture Volume 4: A Pattern Language for
Distributed Computing*
 


by Frank Buschmann
Average customer review:

*List Price:* $50.00
*Price:* *$31.50*
*You Save:* $18.50 (37%)

*Foundations of F#*
 


by Robert Pickering
Average customer review:

*Price:* *$59.99*

	Functional programming (FP) is the future of .NET programming, and F#
is much more than just an FP language. Every professional .NET
programmer needs to learn about FP, and there's no better way to do it
than by learning... Read more




*Pro Django: Web Development Done Right (Pro)*
 


by Adrian Holovaty

*List Price:* $44.99
*Price:* *$29.69*
*You Save:* $15.30 (34%)


*The Reasoned Schemer*
 


by Daniel P. Friedman
Average customer review:

*List Price:* $27.50
*Price:* *$21.88*
*You Save:* $5.62 (20%)


*Programming Firefox: Building Rich Internet Applications with XUL
(Programming)*
 


by Kenneth Feldt
Average customer review:

*List Price:* $59.99
*Price:* *$37.79*
*You Save:* $22.20 (37%)

なかなか興味深いところをオススメしてくれるけど、 全部に手を出すのはちと無理だな。 邦訳が出なさそうなものから…w

■_ ソースコードに潜る(Pythonのcsvモジュール編)

つーことで調べてみました。 が、時間的な余裕がないので例によって五月雨式に結果が出ます。 後で独立したページにまとめられでもしたらいいんですが。

"""
csv.py - read/write/investigate CSV files
"""

import re
from _csv import Error, __version__, writer, reader, register_dialect, \
                 unregister_dialect, get_dialect, list_dialects, \
                 field_size_limit, \
                 QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, \
                 __doc__
from _csv import Dialect as _Dialect

try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO

__all__ = [ "QUOTE_MINIMAL", "QUOTE_ALL", "QUOTE_NONNUMERIC", "QUOTE_NONE",
            "Error", "Dialect", "excel", "excel_tab", "reader", "writer",
            "register_dialect", "get_dialect", "list_dialects", "Sniffer",
            "unregister_dialect", "__version__", "DictReader", "DictWriter" ]

とりあえずは、import csvしたときに最初にくるであろう csv.py です(ソースツリー上では Lib/csv.py)。 re, _csv, StringIO を import しています。 とりあえず(高速であろう?) C版のStringIO(cStringIO)の importを試み、 何らかの理由で importできなければ通常の(?) StringIOをimportすると。 __all__に設定されているのはモジュールが exportするメソッドとか 定数のようですが、excelとか excel_tabってのがあるんですねえ。 まあそっちはとりあえず今回はわき道なのでほっとくとして、

/* csv module */

/*

This module provides the low-level underpinnings of a CSV reading/writing
module.  Users should not use this module directly, but import the csv.py
module instead.

**** For people modifying this code, please note that as of this writing
**** (2003-03-23), it is intended that this code should work with Python
**** 2.2.

*/

#define MODULE_VERSION "1.0"

#include "Python.h"
#include "structmember.h"


/* begin 2.2 compatibility macros */

_csvの本体であろうCによるソースファイル(Modules/_csv.c)。 これは 2.5.1のソースから引っ張ってきたものですが、 MODULE_VERSION が今でも 1.0のままってのはよっぽど安定しているんでしょうか。


static PyObject *
get_dialect_from_registry(PyObject * name_obj)
{
--

static PyObject *
get_string(PyObject *str)
{
--

static PyObject *
get_nullchar_as_None(char c)
{
--

static PyObject *
Dialect_get_lineterminator(DialectObj *self)
{
--

static PyObject *
Dialect_get_escapechar(DialectObj *self)
{
--

static PyObject *
Dialect_get_quotechar(DialectObj *self)
{
--

static PyObject *
Dialect_get_quoting(DialectObj *self)
{
--

static int
_set_bool(const char *name, int *target, PyObject *src, int dflt)
{
--

static int
_set_int(const char *name, int *target, PyObject *src, int dflt)
{
--

static int
_set_char(const char *name, char *target, PyObject *src, char dflt)
{
--

static int
_set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)
{
--

static int
dialect_check_quoting(int quoting)
{
--

static void
Dialect_dealloc(DialectObj *self)
{
--

static PyObject *
dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
--
 */
static PyObject *
_call_dialect(PyObject *dialect_inst, PyObject *kwargs)
{
--
 */
static int
parse_save_field(ReaderObj *self)
{
--

static int
parse_grow_buff(ReaderObj *self)
{
--

static int
parse_add_char(ReaderObj *self, char c)
{
--

static int
parse_process_char(ReaderObj *self, char c)
{
--

static int
parse_reset(ReaderObj *self)
{
--

static PyObject *
Reader_iternext(ReaderObj *self)
{
--

static void
Reader_dealloc(ReaderObj *self)
{
--

static int
Reader_traverse(ReaderObj *self, visitproc visit, void *arg)
{
--

static int
Reader_clear(ReaderObj *self)
{
--

static PyObject *
csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args)
{
--
/* ---------------------------------------------------------------- */
static void
join_reset(WriterObj *self)
{
--
static int
join_append_data(WriterObj *self, char *field, int quote_empty,
		 int *quoted, int copy_phase)
{
--

static int
join_check_rec_size(WriterObj *self, int rec_len)
{
--

static int
join_append(WriterObj *self, char *field, int *quoted, int quote_empty)
{
--

static int
join_append_lineterminator(WriterObj *self)
{
--

static PyObject *
csv_writerow(WriterObj *self, PyObject *seq)
{
--

static PyObject *
csv_writerows(WriterObj *self, PyObject *seqseq)
{
--

static void
Writer_dealloc(WriterObj *self)
{
--

static int
Writer_traverse(WriterObj *self, visitproc visit, void *arg)
{
--

static int
Writer_clear(WriterObj *self)
{
--

static PyObject *
csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args)
{
--
 */
static PyObject *
csv_list_dialects(PyObject *module, PyObject *args)
{
--

static PyObject *
csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs)
{
--

static PyObject *
csv_unregister_dialect(PyObject *module, PyObject *name_obj)
{
--

static PyObject *
csv_get_dialect(PyObject *module, PyObject *name_obj)
{
--

static PyObject *
csv_field_size_limit(PyObject *module, PyObject *args)
{
--

PyMODINIT_FUNC
init_csv(void)
{

ふむ。 とりあえずリーダーから追いかけてみるか

static PyObject *
csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args)
{
	PyObject * iterator, * dialect = NULL;
        ReaderObj * self = PyObject_GC_New(ReaderObj, &Reader_Type);

        if (!self)
                return NULL;

        self->dialect = NULL;
        self->fields = NULL;
        self->input_iter = NULL;
	self->field = NULL;
	self->field_size = 0;
	self->line_num = 0;

	if (parse_reset(self) < 0) {
                Py_DECREF(self);
                return NULL;
	}

	if (!PyArg_UnpackTuple(args, "", 1, 2, &iterator, &dialect)) {
                Py_DECREF(self);
                return NULL;
        }
        self->input_iter = PyObject_GetIter(iterator);
        if (self->input_iter == NULL) {
                PyErr_SetString(PyExc_TypeError, 
                                "argument 1 must be an iterator");
                Py_DECREF(self);
                return NULL;
        }
	self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args);
        if (self->dialect == NULL) {
                Py_DECREF(self);
                return NULL;
        }

	PyObject_GC_Track(self);
        return (PyObject *)self;
}

あー、これって引数はファイル名じゃないんだっけか

Hacking is believing@itoshi.tv - RubyとPythonでCSVをparseする ベンチマーク編
http://itoshi.tv/d/?date=20070715#p01


import sys
import csv

reader = csv.reader(file(sys.argv[1]))

for row in reader:
  print "\t".join(row)

イテレータ周りを調べないとダメか…(続く)

■_ MSF for Agile Software Development Process Guidance

Download details: MSF for Agile Software Development Process Guidance

Brief Description

(Process Guidance Only)
MSF for Agile Software Development is a scenario-driven, context-based, agile 
software development process that utilizes many of the ideas embodied in Team 
System.

まあ興味をひくないようなような気がしないでもないけど、 ダウンロードするのが自爆型のアーカイブ (MSF for Agile Software Development.EXE)ってのはどうよ?

■_ 世界初のCPU「4004」開発回顧録(14)

世界初のCPU「4004」開発回顧録(14):ITpro

4ビット・マイクロプロセッサの電卓への採用により, 16桁の乗算を行うためには17桁目の特殊なプログラムが必要とされた。 ROMの総容量を1Kバイトに抑えるために, 予定していた桁数が16桁から14桁へと減少した。 このことが4ビット・マイクロプロセッサ採用時の唯一の気掛かりであり, 電卓開発時の唯一の心残りであった。今でも電卓開発者としては納得していない。

やっぱり余計に一桁持つんだな。

半導体誕生50周年記念大会には,半導体とマイクロプロセッサの開発者が一堂に集まって, 大勢の懐かしい顔,顔,顔があった。2年ぶりの再会だったが妙に懐かしかった。 しかし,アジアからは,台湾や韓国からの出席者は多かったが, 日本からの出席者はほとんどいなかった。この頃,すでに, 日本は忘れ去られてしまったのだろうか。

んー。

■_ IronRuby

昨日あたりから各所で取り上げられているようですが→ Microsoftが.NET上のRuby実行環境「IronRuby」のソースコードを初公開:ITpro

Lam氏によれば,IronRubyはプレアルファ版の段階ながら, 例外を発生させない場合はマイクロベンチマークでは本家Ruby 1.8.6 に比べ高速であるとしている。ただし, 例外を発生させるとRuby 1.8.6よりも遅くなるという。

からくりはよくわからないけど、CPUでいうところの投機実行みたいなことをしている?

Microsoft Permissive Licenseと呼ぶライセンスで公開している。

シェアードライセンスとはまた違うものと。

Microsoft Permissive License (Ms-PL)

2. Grant of Rights
(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.

3. Conditions and Limitations
(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.

ふむ。

■_

MSDN Online Event - 定期コンテンツ - 明快!.NET Framework クラス ライブラリ

前にも一回書いたような気がするけど、あとラスト一回のようなので改めて。

「明快! .NET Framework クラスライブラリ」では、毎回 1 つのクラスに焦点をあてて紹介します。
便利なプロパティやメソッド、効率よく開発する方法、Visual Basic 6.0 との違いなどを、短時間で理解することができる内容になっています。
コンテンツは毎週追加されるので、コツコツとスタディを継続して、 .NET 力をアップさせてくださいね!

音声による解説(mp3フォーマット)と画像(WMVフォーマット)がある模様。

■_ それは

kinneko@転職先募集中の日記 - シェルスクリプト中でawkにシェル変数を渡す

シェルスクリプト中でawkにシェル変数を渡す

罠にはまる。

なんかエスケープしなくちゃいけないのかと思ったら、一回''の外に出してやる必要があるそうだ。


PERCENTAGE=`awk 'BEGIN{print int('"$USAGE"'/'"$CAPACITY"'*100+0.5)}'`

"は見やすいように入れただけ。なくてもいい。 めんどくさいねぇ...

-vオプションを使ってシェル変数をawkの変数に代入してそれを参照すれば クォーティング地獄にはまらないですむのではないかと (斎藤さんも多分何か書いているだろう :) イマドキのawkなら -v オプションは持っているはず。 あ、でも腐れSolarisならワカランな○| ̄|_

■_ お役所仕事…

 本協議会は、人材育成を推進する場として設置する予定の 「産学人材育成パートナーシップ」の分科会として開催する。主に、 「産業界の求める高度IT人材像と個々の人材に必要なスキルの共有」 「産業界と教育界との知識・スキル体系のすり合わせ」 「産学連携による実践的な人材育成手法のあり方」 「産業界と教育界の人材交流促進策」などを検討する。

 具体的には、産業界から教育界への人事交流を活発にすることで、 ITの現場で必要となる知識や実践スキルと大学の講義内容をより近付ける。 産業界側は、人的および資金面で教育機関をサポートするほか、 IT教育を受けた学生を積極的に採用していくなどの施策を検討していく。

見事なまでに使う側の論理だけだな。

■_ あなたが学ぶべき10の現代実用プログラミング言語

CodeZine:あなたが学ぶべき10の現代実用プログラミング言語(概要, 入門)

毒吐きが数行ありましたが自粛しました。





…しかしCが初級者向けはないだろう。

■_ あとでかく

予定は未定Blog版 - Rubyが嫌いだった理由

そんな自分が今Rubyをやっているのは必要に迫られたからでもなく、将来仕事で使いそうだから、というものでもない。単に、Rubyでプログラムを組むのが楽しいのだ。JavaやC++でプログラムを組むのも楽しいのだが、JavaにはJavaの、C++にはC++の、RubyにはRubyの楽しい部分がある。こういう楽しい部分があるのに、先入観だけで言語を避けてしまうのはとても悲しいことだと思う。

言語を学ぶのは自由だけど、誰かに強制されたり、他の言語と不用意に比べたりするのは違うと思う*4。そして、言語を学ぶ時はその言語に対する先入観はできる限り捨て、自分なりの言語像を作り上げていくのも悪くないと思った。

*1:というか、今相手している人よりも必ず上に立とうとする。 しかもCプログラマとしては凄腕だったから困ったもんだ
*2:羨望が憎悪に・・・とまではいかないが、妬みの様な感情は少なからずあった
*3:その人のために言っておくと、RubyやOO以外の部分に関しては尊敬できる素晴らしい人だった。 Rubyを知らずにいてくれたらよかったのに・・・
*4:あくまで趣味の範囲で。仕事での言語の選定とかは別。

2007年07月23日

■_ 配列とかハッシュ(連想配列)とか

配列というデータ構造を理解するのに壁があるのじゃないかという話で、 ひとつ思い当たることがありました。

例によって某質問掲示板に寄せられる質問なんですが、 ある一連の変数を連番をつけて宣言し、それを PerlとかPHPでいうところの (PHPは違ったか?)シンボリックリファレンスを使って連続的にアクセスしようとする 人が、まあ数としてはそう多くはないと思いますが観察しているとそれなりに でてきます。 コードで示すと

for ($i=1; $<10; i++) {
    ${"$var" . "$i"} = i;
}

のようなものです。 どういう風にプログラミングの森に迷い込んだのか推測はできませんが、 ここまできてなぜ配列を使おうとしないのだろうか? という疑問がこの手の質問を見かけるたびに浮かびます。

■_ オカルト

書こうと思ったけどやめやめ。

■_ 方針変更

することにしたのはいいが、いずれにしろ8月にまにあわなそう… (チラシの裏)

■_ CUPS

CUPSとは:ITpro

途中で Ghostscriptが噛んでいるとは知らなかった。 まあそうでもなきゃあどこで誰がプリンタ用にレンダリングするのという話ではあるけど。

■_

soutaro#nikki()
http://d.hatena.ne.jp/soutaro/20070722/1185087466

そこで気になるのは、もしも計算機の感覚的な理解がラムダ計算な人がいたら、その人にはどういう風に世界が見えるのだろう、ということ。その人が、将来代入や配列を知ったとき、どう思うのか、ということ。

ある程度賢くて、ある程度込み入った概念を理解できる程度に大人で、しかし計算機やプログラミングの物理的な構成については一切イメージを持っていない人、を捕まえてきて、いきなりラムダ計算からプログラミングを教えてみる、というのがやってみたい。現実のプログラミング言語で一番近いのは、Haskellかなぁ(Cleanも?)。Lispはlazyじゃないのでダメ。

■_ ん?

CheckStyle+FindBugsの活用

このコードは致命的な問題を含んでいます。この手の問題もFindBugsで検出する事が出来ます。ちなみに上記コードは以下のように書くべきです。

public class Foo{

	private int[] bar;

	public int[] getBar(){
		if(bar == null){
			//配列を返すメソッドでnullを返さない
			return new int[0];
		}

		//そのまま返すと状態が変更されるのでクローンを返す
		return bar.clone();
	}

	public void setBar(int[] bar){
		if(bar != null){
			//そのまま設定すると外部から内部状態が変更される可能性がある
			bar = bar.clone();
		}

		this.bar = bar;
	}
}

odzさんのところで先週末あたりに見かけたような >nullを返さない (http://d.hatena.ne.jp/odz/20070720/1184948285) ところでreturn new int[0]; で返される 「実体」てのは malloc(0) した領域みたいなものなんだろうか。 仕様をチェックしたいところだけど、ちと調べているひまがないので保留。

Note:
Effective Java (日本語版)の125ページに 「項目27 nullではなく長さゼロ配列を返す」というのがあります。

■_ Parse a CSV

gan2 の Ruby 勉強日記 - RubyでCSVをパースするならLightCSV。でもそれでもPythonには全然敵わない。Hacking is believing@itoshi.tv - RubyとPythonでCSVをparseする ベンチマーク編 とか。

ruby lightcsv.rb         Mouse430_2.na22.annot.csv > /dev/null    21.85s user 2.24s system 99% cpu 24.245 total
ruby       csv.rb         Mouse430_2.na22.annot.csv > /dev/null  556.47s user 2.42s system 98% cpu 9:26.36 total
python pythoncsv.py  Mouse430_2.na22.annot.csv > /dev/null     3.29s user 0.23s system 98% cpu 3.563 total

ふむ。 Pythonのライブラリってはよっぽど高速化のための努力をしていたりするんだろうか? 調べてみよう(こればっか)。

■_ ですよねー

ああ、書き忘れてました。「Excelの達人」育てるくらい
なら、フツーのプログラマ育てりゃいいじゃんね。つか、
いつまでも片手間でITやらすなと。

2007年07月22日

べくた

gawkとか登録してたりするのでvectorから定期的にお知らせとか きてたりするのですが(あー、あそこに登録しているgawkはいい加減 古いのだな、連絡しとかないと)、金曜あたりに来たメール。

ベクターでは、ライブラリの新たなサービスとしてソフトウェアの画像掲載
サービスを開始いたします!

☆サービス開始予定日:2007年8月中旬

画像掲載サービスとは、ソフトウェアの詳細ページにサムネイル画像を掲載
し、ユーザーの方に内容をよりわかり易く伝えることを目的としたサービス
です。
ソフトウェアの詳細ページに掲載されたサムネイル画像をクリックしていた
だくことにより、元のサイズの画像を表示いたします。

本サービスをご利用いただくことにより、ユーザーの方がダウンロード前に
ソフトウェアの内容をより詳しく把握できるため、利用促進の効果が期待で
きます!

んー、コマンドラインから使うような、 ユーザーとは非対話的に処理を行うツールにどういう スクリーンショットをつければいいのだ?(笑)

マテ

Ruby初心者スレッド Part 13 [bbs2chreader]
http://localhost:8823/thread/http://pc11.2ch.net/test/read.cgi/tech/1183115034/l50


getsは引数とれるみたいだけどそうやって使うでつか・・・

    >>319
    神!!!!!!!!!!!!!!!!!!!!!!!!
    ktkr

    >>316
    あとたのしいrubyは読破しています。
    オブ(ryは学校の図書館から借りていました。
    ずっとおれのターンにして借りつづける予定でつ、良い本だと思いまつが

ほかに借りる人がいないかもしれんが、「ずっとおれのターン」 は禁じ手:)

擬人化

  テキストエディタをまったり語ろう ver.23 


89 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 10:47:05  ID:v9YKzDRe0 Be:
    OSたんみたいに、テキストエディタの擬人化はないの?

90 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 12:32:26  ID:yO8Liu8d0 Be:
    サクラたんの一人勝ちの悪寒 

91 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 13:48:57  ID:itqwEaCk0 Be:
    いつもニコニコおがわさん
    屁理屈屋の真魚おじさん
    お金持ちの秀丸社長
    英語ぺらぺらでエグゼクティブなMr.EmEditor
    天才少年GreenPad 

92 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 14:53:34  ID:fn4Rerjc0 Be:
    バイリンガルだけどいつまでたっても勉強中な理系浪人生 Alpha姉ちゃん

    親に放り投げられたけど周囲の支えで食いつないでいる JmEditor

    その隣人で、親子で行方不明→旅から帰ってきた VxEditor

    親の帰りを待つ鍵っ子 萌ディタ 

93 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 15:38:22  ID:v9YKzDRe0 Be:
    秀丸子ちゃん・・・。

94 名無しさん@お腹いっぱい。 [sage] Date:2007/07/22(日) 03:18:40  ID:3BVX+Em90 Be:
    伺かとか作りたまえ。 


「秀丸子」ちゃんに受けた

ちくちく

L'eclat des jours

  木村さんのちくちく遊びだなぁとか思った

まあわたしのガス抜きの一つかと。 生産的でないのは重々承知していますが、 あそこは回答者に対する「批評」とかも書いてはいけないらしいので。 まあ @IT のBBSとか見ると、それはそれで一つの見識かなあ とは思うのですが、嘘とかトンデモが流布するのは座視しがたいというか なんというか。

疑問: ということは、の後の文章は わたしが書いてしかるべきもので(ちくちくつつくだけでは何の意味もない)、 非常にありがたいです。 わたしが書くよりきちんと言葉になっているだろうし。

ちと脱線しますが、上記エントリについたコメントの

経験的にこの絵を描いてもらうには計算機の物理メモリやCPUの動作をある程度
理解してもらう必要があります。
  

というのを読んで、わたしがLispに最初に入門したときに car部とcdr部を縦線で区切った長方形をノートに書いて 一生懸命リスト構造を追いかけたのを思い出しました (同様のことを中村正三郎さんも書いていたような)。

配列に関してはどうだったかなあ、中学高校と友達の「マイコン」 をいじらせてもらってたりしたけど、本格的にプログラミングを 始めたのは大学に入ってからで、FORTRAN77を使った講義と、 教養課程にあった情報関係の講義で並行して勉強したから、 コンピュータ内のからくりを知るより先に、 FORTRANで配列使ったプログラムが課題に出たほうが先だとは思うのだけど、 それほどイメージするのに苦労した記憶はないです。 が、わたしに数学的素養がないのは云うまでもありません :)

ひとつ、積極的に「Cやっとけ」と云うことの根拠を求めるなら、 アルゴリズムの実装のサンプルが豊富に見つかるから。 というのはあるかもしれません。 とはいうものの、 Javaを使ったようなものもそれなりに増えているような感じはありますし、 絶対的なものとは云えないでしょう。 んー、どんな感じなのか出版されている本を調べてみよう…

今日の戦果

つっても「買った」のではなく「読んだ」本。 読まずに積んだままのがたまったので頑張って読んだ。 某ヒゲメガネ氏のようなフォトリーディング(ていうの?)はできないので それなりに時間がかかった。

新書三冊、コミック十冊、A5版型の読み物(コンピュータ関連)二冊。 一番片付けたかった「ローマ人の物語 最終巻」とか 「逆説の日本史 第十三巻」には手を出せず。 げふっ。

メモ

余裕ができたらいずれ買う。 Amazon.co.jp: 文化と国防―戦後日本の警察と軍隊: 本: Peter J.カッツェンスタイン,有賀 誠

2007年07月22日

べくた

ベクターでは、ライブラリの新たなサービスとしてソフトウェアの画像掲載
サービスを開始いたします!

☆サービス開始予定日:2007年8月中旬

画像掲載サービスとは、ソフトウェアの詳細ページにサムネイル画像を掲載
し、ユーザーの方に内容をよりわかり易く伝えることを目的としたサービス
です。
ソフトウェアの詳細ページに掲載されたサムネイル画像をクリックしていた
だくことにより、元のサイズの画像を表示いたします。

本サービスをご利用いただくことにより、ユーザーの方がダウンロード前に
ソフトウェアの内容をより詳しく把握できるため、利用促進の効果が期待で
きます!

んー、コマンドラインから使うような、 ユーザーとは非対話的に処理を行うツールにどういう スクリーンショットをつければいいのだ?(笑)

マテ

Ruby初心者スレッド Part 13 [bbs2chreader]
http://localhost:8823/thread/http://pc11.2ch.net/test/read.cgi/tech/1183115034/l50


getsは引数とれるみたいだけどそうやって使うでつか・・・

    >>319
    神!!!!!!!!!!!!!!!!!!!!!!!!
    ktkr

    >>316
    あとたのしいrubyは読破しています。
    オブ(ryは学校の図書館から借りていました。
    ずっとおれのターンにして借りつづける予定でつ、良い本だと思いまつが

擬人化

  テキストエディタをまったり語ろう ver.23 


89 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 10:47:05  ID:v9YKzDRe0 Be:
    OSたんみたいに、テキストエディタの擬人化はないの?

90 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 12:32:26  ID:yO8Liu8d0 Be:
    サクラたんの一人勝ちの悪寒 

91 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 13:48:57  ID:itqwEaCk0 Be:
    いつもニコニコおがわさん
    屁理屈屋の真魚おじさん
    お金持ちの秀丸社長
    英語ぺらぺらでエグゼクティブなMr.EmEditor
    天才少年GreenPad 

92 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 14:53:34  ID:fn4Rerjc0 Be:
    バイリンガルだけどいつまでたっても勉強中な理系浪人生 Alpha姉ちゃん

    親に放り投げられたけど周囲の支えで食いつないでいる JmEditor

    その隣人で、親子で行方不明→旅から帰ってきた VxEditor

    親の帰りを待つ鍵っ子 萌ディタ 

93 名無しさん@お腹いっぱい。 [sage] Date:2007/07/21(土) 15:38:22  ID:v9YKzDRe0 Be:
    秀丸子ちゃん・・・。

94 名無しさん@お腹いっぱい。 [sage] Date:2007/07/22(日) 03:18:40  ID:3BVX+Em90 Be:
    伺かとか作りたまえ。 


「秀丸子」ちゃんに受けた

2007年07月21日

埋もれている(もしくはつつある)

買うだけ買って読まずに積もれていく本が新書、コミックの類を中心として増大中。 いかんすこしでも片付けていかないと。

ということでコンピュータ関連の本は今週末はお休み(といいつつこれも溜まってるんだよなあ)。

Py3k

えーと何回目だっけ? これで最後。

Other Significant Changes

Just the highlights.

Exception Reform
  • String exceptions are gone (of course).
    文字列を使った例外は(もちろん)なくなりました。
  • All exceptions must derive from BaseException and preferably from Exception.
    すべての例外は BaseExceptionから派生したものでなければならず、 通常は Execptionから派生するのが望ましいです。
  • We're dropping StandardException.
    StandardExceptionはなくなりました。
  • Exceptions no longer act as sequences. Instead, they have an attribute args which is the sequence of arguments passed to the constructor.
    例外はもはやシーケンスのようには振舞わなくなりました。 その代わりに、例外はコンストラクタに引数の並びとして渡される、 属性を表す引数(attribute args)をとるようになりました。
  • The except E,e: syntax changes to except E as e; this avoids the occasional confusion by except E1, E2:.
    except E, e: という構文は except E as e というものに変更されました。 これにより except E1, E2: のときにあったような混乱が防止されます。
  • The variable named after as in the except clause is forcefully deleted upon exit from the except clause.
    except clause の中で使われた変数名は その except clauseから抜け出たときに強制的に削除されます。
  • sys.exc_info() becomes redundant (or may disappear): instead, e.__class__ is the exception type, and e.__traceback__ is the traceback.
    sys.exc_info()は余計なものとなりました。 代わりに、e.__classs__ が 例外の型となり、 e.__traceback がトラックバックとなりました。
  • Additional optional attributes __context__ is set to the "previous" exception when an exception occurs in an except or finally clause; __cause__ can be set explicitly when re-raising an exception, using raise E1 from E2.
    省略可能な、__context__ という属性は ある例外が発生したり、 finally clause があったときに “直前の”例外がセットされます。 using raise E1 from E2 を使って 例外の再送出をするときに、__cause__ を陽に設定することができます。
  • The old raise syntax variants raise E, e and raise E, e, tb are gone.
    raise E, e や raise E, e, tb といった古い構文の例外は削除されました。
Integer Reform
  • There will be only one built-in integer type, named 'int', whose behavior is that of 'long' in Python 2. The 'L' literal suffix disappears.
    整数型はPython 2における 'long'のように振舞う'int'という名前の 組込みのものただ一つになりました。 'L' という接尾辞はなくなりました(disappears)。
  • 1/2 will return 0.5, not 0. (Use 1//2 for that.)
    1/2 の結果は0ではなく0.5になるように変わりました。 以前と同じ結果を得るには 1//2 のようにします。
  • Octal literal syntax changes to 0o777, to avoid confusing younger developers.
    八進リテラルの表記は 0o777のように変更されました。 これは若手開発者の混乱を避けるためのものです。
  • Binary literals: 0b101 == 5, bin(5) == '0b101'.
    二進のリテラル: 0b101 は 5に等しく、 bin(5)は '0b101'に等価です。
イテレータもしくはリストに代わるイテレート可能なもの (Iterators or Iterables instead of Lists)
  • dict.keys() and dict.items() return sets (views, really); dict.values() returns an iterable container view. The iter*() variants disappear.
    dict.keys()とdict.items() は sets(view, really)を返します。 dict.values()は、イテレート可能なコンテナのビューを返します。 iter*()のようなものはなくなりました。
  • range() returns the kind of object that xrange() used to return; xrange() disappears.
    range()は xrange()が返していたようなオブジェクトを返します。 xrange()は廃止されました。
  • zip(), map(), filter() return iterables (like their counterparts in itertools already do).
    zip(), map(), filter()はイテレート可能なもの (すでにあった itertoolsで使われてたもののような)を返します。
Miscellaneous
  • Ordering comparisons (<, <=, >, >=) will raise TypeError by default instead of returning arbitrary results. The default equality comparisons (==, !=, for classes that don't override __eq__) compare for object identity (is, is not). (The latter is unchanged from 2.x; comparisons between compatible types in general don't change, only the default ordering based on memory address is removed, as it caused irreproducible results.)
    順序比較(ordering comparisons: <, <=, >, >=) はデフォルトでは任意の結果を返す代わりにTypeErrorを引き起こします。 等値比較(==, !=, for classes that don't override __eq__) のデフォルト動作は isもしくは is notによってオブジェクトの identity を比較子します。 後者は 2.xからの変更はありません: 互換性を持つ型同士の比較は一般的な意味では変更ありません。 メモリアドレスに基づく順序付けのデフォルトのみ取り除かれました。 これは irreproducible な結果を引き起こすためです。
  • The nonlocal statement lets you assign to variables in outer (non-global) scopes.
    ローカルでない文(nonlocal statement)は その外側にあるスコープ(ただしグローバルではない)での、 変数代入を行います。
  • New super() call:
    Calling super() without arguments is equivalent to super(<this_class>, <first_arg>). It roots around in the stack frame to get the class from a special cell named __class__ (which you can also use directly), and to get the first argument. __class__ is based on static, textual inclusion of the method; it is filled in after the metaclass created the class object (but before class decorators run). super() works in regular methods as well as in class methods.
    新しい super() 呼び出し:
    引数なしの super()の呼び出しは、 super(<this_class>, <first_arg>) と等価なものになりました。 これは __class__ という名前のついた特別なセル (直接呼び出すこともできます) からクラスを得るためのスタックフレームにある根で、 第一引数を得るためにも使われます。 __class__ は静的であることに基づき(based on static)、 メソッドをテキスト的に取り込んでいます。 取り込まれたものはメタクラスがクラスオブジェクトを生成した後 (ただしクラスデコレータ(class decoratorsが実行される前)) に貼り付けられます。 super()は、クラスメソッドの中と同じように通常のメソッド(regular method)の 中でも正しく動作します。
  • Set literals:
    {1, 2, 3} and even set comprehensions: {x for x in y if P(x)} Note that the empty set is set(), since {} is an empty dict!
    集合(Set)のリテラル:
    {1, 2, 3} と set を行う comprehension: {x for x in y if P(x)}。 空の集合は set()であり、{}は空の辞書であることに注意すること!
  • reduce() is gone (moved to functools, really). This doesn't mean I don't like higher-order functions; it simply reflects that almost all code that uses reduce() becomes more readable when rewritten using a plain old for-loop. (Example.)

  • reduce() はなくなりました(実際には functoolsに移されています)。 このことはわたしが高階関数を好まないということを意味するのではありません。 ただ単純に、reduce()を使っているコードのほとんどすべてて 古きよきforループ (plain old for-loop)を使って書き直した方が より読みやすいということを反映しただけです。
  • lambda, however, lives.
    lambdaはまだ生き残っています。それでも。
  • The backtick syntax, often hard to read, is gone (use repr() ), and so is the <> operator (use != ; it was too flagrant a violation of TOOWTDI).
    しばしば読みにくさをもたらす元凶となる backtick(``)構文はなくなりました (代わりにrepr()を使います)。 また、<>演算子も TOOWTDI の原則を破るものであったためなくなっています (!=を使うこと)。
  • At the C level, there will be a new, much improved buffer API, which will provide better integration with numpy. (PEP 3118)
    Cのレベルでは、新しくかつ改良されたバッファ APIがあります。 これは numpyによりよい integrationをもたらすでしょう (PEP 3118)。
Library Reform

I don't want to say too much about the changes to the standard library, as this is a project that will only get under way for real after 3.0a1 is released, and I will not personally be overseeing it (the core language is all I can handle). It is clear already that we're removing a lot of unsupported or simply outdated cruft (e.g. many modules only applicable under SGI IRIX), and we're trying to rename modules with CapWords names like StringIO or UserDict, to conform with the PEP 8 naming standard for module names (which requires a short all-lowercase word).
標準ライブラリに対する変更についてはあまり多くを語りたくはありません。 プロジェクトは 3.0a1が実際にリリースされるまでは進行中のものでしかないからです。 そして、わたしは自分自身でそれを監督しているということもしないでしょう (言語の核で私には手一杯なのです)。 サポートされないものや単に時代遅れとなった代物(outdated cruft: たとえば SGI IRIXでのみ意味があるような多くのモジュールのようなもの)を 取り除くことについてはすでに合意が取れています。 さらに、StringIO や UserDictのような CapWords names 形式の名前を持ったものの名前を変えようとしています。 これは PEP 8にあるモジュールのための標準命名規則に従うためです (すべて小文字の短い単語で構成することを要求しています)。

参考までにPEP 8の該当部分を http://www.oldriver.org/python/pep-0008j.html から。

パッケージ名とモジュール名

      モジュール名には、アンダースコアを含まない短い lowercase を使う。

      モジュール名は、ファイル名に反映される。ところが、ファイルシステム
      によっては、大文字・小文字の区別をしなかったり、長い名前をはしょっ
      てしまうので、モジュール名は短く、かつ、大文字・小文字が違うだけで
      他のモジュール名と衝突しないように、選ぶことが重要である。 これは
      Unixでは問題にならないが、そのソースコードを古い Mac や Windows や 
      DOS に持っていったときに問題となる。

      C や C++で書かれた拡張モジュールがあって、それに伴うPythonモジュール
      が、より高レベル(たとえば、よりオブジェクト指向)なインターフェー
      スを提供するときには、すべて小文字にして先頭にアンダースコアをつけ
      る(たとえば、_socket)。
And Finally

Did I mention that lambda lives? I still get the occasional request to preserve it, so I figured I'd mention it twice. Don't worry, that request has been granted for over a year now.
さて lambda が生きていることについては言及しただろうか? lambdaを生き延びさせてくれという要求を受けることが今でもある。 であればこそ、わたしはここで二度も言及したのです。 ご心配なく。その願いは今から一年以上前に叶っていますよ。

××は燃えているか

OKWave 独学でプログラマーさんになった人にお聞きしたいです

Cを覚えるべき、最初にやるべきと主張する回答者と そうでもないんじゃね? とする別の回答者。 もうちょっと燃え上がってほしいが場所的に無理だろうな(笑)

>「プログラミング言語の全ては、Cを覚えて、
>:あとは他の言語に言い換える(方言のような)感覚」
それは最初に C を覚えた人のセリフです。使わないのであれば C を勉強する必要は
ありません。

やりたいことがあって、それを実装する言語(例えば Perl )がわかっているのであれば、
その言語( Perl )の入門書を適当に 1冊買って、あとは書いたいプログラムを書き始め
ればよろしい。

#####

PHPやPerlのWEB系をやりたいのであれば、C言語は必要ありません。豊富な
PHPやPerlの入門書から入ったほうが良いと思います。
実際に自分でPHPやPerlを使ったWEBサイトを作って、色々なサービスを自分
で作ってみるのが一番良いと思います。
家も建てようと思ってみなければ、なにが分かっていないか見えてこないように、プロ
グラムもまず作ろうとしてみないと見えてこないですよ。

#####


英語の勉強とかで言われるように、「言語を考えてる」時点で理解したとは言えず、
「言語で考えられるように」なって、初めてその先が見えてきます。
そういういみでは、他の方もおっしゃられているようにCに固執する意味はあまりありません。
# 「他のヨーロッパの言語を勉強する上で、英語は知ってるといいよ」とかそんなところ。


####

現場のSEです。
質問者やここを読んだ人が勘違いされると困るので、他の回答とは矛盾しますが私の考え
を提示しておきます。

あなたがプログラマーとしてメシを食って行こうと思っていないなら、他の回答をそのま
ま受け入れて、楽しいアマチュアプログラマー生活を満喫して下さい。
趣味のレベルなら、無理して固苦しい勉強をする必要は全くありません。
作りたいものが作れればそこがゴールです。
七面倒くさい理論やアルゴリズムなどは、プログラミングに対する興味を損なう代物でし
かありません。
自分でゼロから組めなくても、他のコピペで済んでいるなら問題ないと思います。

そうじゃなくて、あなたがウチの業界でメシを食って行こうと志すなら、あるいは
プログラミングの本質を理解し、プログラミング上級者を志すなら、是非C言語で
基本をしっかり勉強して下さい。
はっきり言って、基本をマスターしないうちにJavaやVB、Perlなどでいい加減な感覚を
身に付けてしまった人は、ちょっとやそっとでは矯正が効きません。
そういった人を実際に何人も見て(つまり被害を被って)きましたので。
今では、3年間VBのプログラミングを自己流でやってきているのでプログラミングは
任せて下さいという新人と、プログラミングはこの間の新人研修で生まれて初めて
勉強しましたという新人の2人のうちのどちらかを自分の配下に置いて教育して
行かなければいけなくなったとすると、他の条件が同じなら私は迷わず未経験者を選びます。
知らないことはいくらでも教えられますが、一旦付いてしまった悪癖はそう簡単には
矯正できないからです。
敷居の低い言語は、基本がしっかりできてない人が手を出すと自己流のおかしなやり方に
凝り固まって、取り返しが付かなくなってしまう弊害を常に孕んでいるので注意が必要です。

C言語を系統立てて勉強しようという目的には、下記が最適です。
明解C言語 入門編   柴田望洋

####

ちっと参考意見を付け加えます。
C言語プログラマのすべての意見ではなく私個人の意見としてお聞きください。
#6さんのおしゃるとおりプロになるなら基礎をしっかりとやることに関して
は異論はありません。ぜひ、そうしてほしいです。
VBやPerlは安易な書き方に流れがちで基礎があやふやな場合が多いのも
事実だと思います。

ただ、WEB系のプロになる場合、C言語はまず利用されません。
HTML,XML,JavaScript,Perl,FLASH,PHP,javaなど客先の注文にあわせていろんな言語を
使いこなせる技術が必要です。
その入り口がC言語である必要はないと思います。例えばC++言語の場合は、逆に
C言語に固執している人がやるとオブジェクト指向とは程遠いコーディングになった
りもします。C言語の良いプログラマがC++言語の良いプログラマである保障はあり
ません。
そういう意味で、web系のプログラマはC言語の習得は必要ないと私は思っていま
す。アルゴリズムは、そもそも言語を選ぶものではありませんから、どんな言語のプ
ログラマでも学ぶことができます。
私独自の意見としては、web系で基礎からやるならjavaをお勧めしておきます。

####

> 基本をマスターしないうちにJavaやVB、Perlなどでいい加減な感覚を身に付けて
> しまった人は、ちょっとやそっとでは矯正が効きません。
PerlはまだしもJavaとVBあたりをC言語と一緒にするのはどうかと思いますよ。
構造化言語とオブジェクト指向言語は切り離して考えたほうが良い。
下手に構造化言語に慣れるとオブジェクト指向言語に慣れるのに苦労する。
(VB6までのVBは構造化言語とオブジェクト指向言語としての側面もあり
ちょっと中途半端さがある言語ですけどね。)
だからCをやるよりC++の方がいいでしょう。
もっとも学習としてはC++よりJavaの方がオブジェクト指向言語としての完成度は高い
ですけど

####

Java、VB、Perlは、「初心者に取って敷居が低い言語」の例として挙げたまでで、
これらの言語を否定するつもりは毛頭ありません。
それぞれ長所があり、少なくとも現状はどれも無くてはならない言語です。
上級者がコーディングすれば、どの言語を使っても正しく美しいコードが書けます。

しかし私の経験上、プログラミングの基本が出来ていない状態でこれらの言語に
慣れることは弊害が大きく、注意が必要です。
特に初心者とVBの組み合わせは最悪で、何となく書けてしまうものだから、
全体像がイメージできないままコーディングに突入し、思いつくままダラダラと
コードを書くことになり、そのまま続けていると、どんなに醜いコードを書いても
「動いてるんだからいいじゃないか」と思うようになってしまいます。
(これが頭をよぎるようになると、自分のコーディングセンスが毒されてきたと
自戒する必要があるのですが、初心者にはそれが理解できません。)
必ずそうなる訳じゃないでしょうが、実際そういうプログラマーをこれまで何人も
見てきましたので。

C言語は上記の言語に比べると制約が大きい分、理想から大きく外れることが少なく、
初心者が手を出す言語として最適だ、というのが私の持論です。
これは何も、C言語が優れた言語であるとか、そういう意味ではなく、バランスの
問題です。
最近はどうだか知りませんが大学で好んで教えるPascalは、逆に制約が大き過ぎて
プログラミングが嫌いになってしまう危険性が大きいし、C++はCと比べると
オブジェクト指向の概念が入ってくる分、C言語より習得が難しく、初心者向き
ではありません。

結局、プログラミング上級者への道として私が薦めるのは、
1. C言語で構造化プログラミングをマスターする
2. C++でオブジェクト指向を覚える
3. 他の言語を覚える
というものです。
回り道のようですが、本道から外れる危険が少ない分、むしろ上達は早いと
私は考えます。

####

今から10年前で、かつ時間がたっぷりある人でしたらそれでもいいとは思いますが、
あなたの場合はもう既にやりたいことが明確に決まっていますよね?それなら、Cにそ
れほどこだわる必要はないと思いますけど。

なぜCからなのかというと、それだけ歴史のある古い言語であると同時に、これからも
汎用的に使われていくであろう言語だからです。ここのサイト内でもC&C++のカテは総
質問数が10,000件を突破していますね。(Javaの方は、まだ7,000件も突破していません。)
他の言語に比べて、Cの場合だと専門書数に教育者の数にと、いろいろと有利な点が
あるわけです。


####

なんとなく再度書いてみる。

C 言語をやる必要は“まったくありません”
目の前の問題を解決できる言語を学習して下さい。もちろん、「C言語でも解決できる」
と強弁することも可能ですが、無駄な手間がかかるだけです。

上等なプログラマになることと、学習するプログラミング言語に相関関係はありません。
# 逆に相関関係があるなら、根拠となる研究資料を見たいくらいだ。

  

まあわたしのスタンスは改めて書くまでもないと思いますが、 「C? どうしてもというなら止めないけどやめとけ」です。

今日のAA

  *'``・* 。
       |     `*。
      ,。∩      *
     + (´・ω・`) *。+゜  もうどうにでもなーれ
     `*。 ヽ、  つ *゜*
      `・+。*・' ゜⊃ +゜
      ☆   ∪~ 。*゜
      `・+。*・ ゜

人称

羊堂本舗 脳ざらし紀行

「ミノタウロス」は佐藤版「キャッチャー・イン・ザ・ライ」といった趣きの 作品でした。「キャッチャー・イン・ザ・ライ」が一人称だったかどうか 忘れちゃいましたが。

I thougth what I'd do was ... とか I'd just be the catcher in the rye and all. に代表されるように常にホールデンの一人称ですぅ。 「キャッチャー・イン・ザ・ライ」(村上訳ですよね)が “The Catcher in the rye”と同じ作品なら :)

悪魔城

伝説のバンパイアハンター再び!! 『悪魔城ドラキュラX クロニクル』 / ファミ通.com

多分買っちゃうんだろうけど、なーんかちがうんだよなあ。 PCエンジンのやつもプレイしたけどね。 ディスクシステムwでプレイした初代のあの興奮と感動は戻っては来ないのかもしれない。 と年寄りくさいことを書いてみる。

2007年07月20日

■_ 謎めいている

from えろぺおさんとこ。
にっき(2007-07-20)

class Array
  def hindex
    sort.reverse.inject( 1 ) do |result, item|
      break result if item < result
      result + 1
    end - 1
  end
end

一番内側の end の後ろについている - 1で面食らう人は多そうだ(笑)

■_ Firefox

Firefoxに見切りをつけつつあるので無駄になるかもしれないけどメモ。 Firefox拡張機能(extension)の作り方 — ありえるえりあ

■_ 卓袱台ひっくり返すぞこの×××

MSN相談箱 テキストファイルから指定区域の読み取り

フラグ変数を使うのは良いよ。 でもさ、flag つー名前にするのはどうかと思うよ。

■_ Prolog

理工系でもないのに、Prologを扱う科目をとってしまいました。まったくわかりません。 どうかご教授ください。

「教授」は無理だなw

観光地([笠気不動滝,滝,三重県,紀勢町,'JR柏崎駅',0]).
観光地([飛雪の滝,滝,三重県,紀宝町,'JR新宮駅',0]).
観光地([布引の滝,滝,三重県,白山町,近鉄東青山駅,0]).
観光地([布引の滝,滝,三重県,紀和町,'JR熊野市駅',0]).
観光地([六十尋滝,滝,三重県,宮川村,'JR・近鉄松阪駅',0]).


というデータから、以下の四問が答えを導く道程なのですが意味がまったくわかりません。
どうか教えてやってください。


(問1)

fee0:-観光地([A,B,C,D,E,0]),ppj(A,40),ppj(B,30),write(C),nl,fail.
fee0.


(問2)

g(N) :-line(40),観光地([A,B,C,D,E,F]),F>=1000,ppj(A,30),L is F/100,tab(L),write(*),nl,fail.
g(N).


(問3)

lis(P) :-地域(関西,AREA),観光地([A,B,C,D,E,F]),member(C,AREA),ppj(A,45),ppj(B,30),write(C),nl,fail.
lis(P).


(問4)

klist:-観光地([A,B,C,D,E,F]),check(B).
klist.
check(B) :-d(B),!,fail.
check(B) :-assert(d(B)),tab(10),write(B),nl,fail.

なんか情報が足りないような感じがするのは気のせい?

■_ ××× DIFFERENT

the.codist{} - The Code Less Traveled: Thinking Different In A Uniform World

余裕があったら訳す。

■_ Eiffel

Part4 Eiffelに学ぶ「正しいオブジェクト指向」:ITpro

Eiffelを有名にしたのは,その設計思想を解説した書籍「オブジェクト指向入門」(第1版はアスキー発行,第2版は2006年に翔泳社が発行予定)の功績によるものです。この本は,オブジェクト指向分野におけるロングセラーになっています。Eiffelという言語そのものは,CやJavaなどのメジャーな言語に比べるとずっと無名です。しかし,オブジェクト指向技術に関する議論では参照モデルの一つとしてよく取り上げられ,他の言語に大きな影響を与え続けています。

 例えばEiffelは,Java SE 5でようやくJavaに取り入れられた「Generics(総称)」を当初から導入していました。同様に,Javaの仕様記述を補完するJML(Java Modeling Language)やUMLのモデリング精度を高めるために導入されたOCL(Object Constraint Language)が記述する各種表明(事前条件,事後条件,不変表明)も,Eiffelは言語の機能として最初から持っています。

indexing
 description: "hello object"
 author: "Foo Bar"
 date: "2006/10/01"
 revision: "1.0"

class
 HELLO
 
feature -- Access

 message : STRING is "Hello, Eiffel."

 greeting is
  do
   io.put_string(Current.message)
  end
end

Eiffelのこういう思想は好きなんだよね。 ちと息苦しいかもしれないけど(笑)

■_

「SI業界の悪習,人月と訣別する」---スターロジックが1タスク8万円の “明朗会計”システム構築を開始:ITpro

「1タスクあたり8万円の明瞭な価格体系でシステムを構築する。そして要件はユーザーが決める」 (スターロジック代表取締役兼CEO羽生章洋氏) ---システムインテグレータのスターロジックは7月19日に開催した同社初の単独イベント 「Starlogic Conference 2007」で新しいSIメニューを発表した。 同社が考案した要件定義ツール「マジカ!」やアプリケーション自動生成ツールを組み合わせることで, 定額かつ低額のシステム構築を実現するという。「人月はSI業界の問題の根源。 もう二度と人月商売はしない」(羽生氏)。

しかし人月商売にならざるを得ない理由もあった。最大のものは,要件があいまいなため, 工数が膨らむリスクを,ベンダーが負えなかったからだ。 ユーザーが自分たちで要件をまとめることができればよいが,通常ユーザーにはそのスキルはない。 「であれば,そのためのツールを提供できればIT業界の積年の問題が一挙に解決するのではないか」 (羽生氏)。

 そこでスターロジックが提唱しているのがDIY(Do IT Yourself)という概念だ。 ITはイットではなくアイティである。そのためのツールとして同社は「マジカ!」を考案した。 マジカ!を使い,ユーザーが要件を決めれば価格はほぼ自動的に決まる。 「安くしたければシステム化の対象とするタスク数を減らせばよい。 そもそもの業務自体を無くせば業務改善になる。業務がメタボリックにならずにすむ」 (羽生氏)。

 「今こそユーザーが主役になってほしい。情報システム部門でも経営者でもない。 現場が回ってナンボ。ユーザーを置き去りにしておいて最後にツケを押し付けるようでは ITのメリットは活かせない」と羽生氏は語る。

そこ、「メタボリック」の意味を間違ってつかっとる ○| ̄|_

…もう「そういう意味の日本語」として定着したことでいいよ。

まあそれはともかくとして、面白い試みだとは思います。

2007年07月19日

おや

昨日の今日でこんなメールがAmazonさんから届く。

Greetings from Amazon.com.

We thought you'd like to know that we shipped your items, and that this 
completes your order.  

(ry


The following items have been shipped to you by Amazon.com: 
---------------------------------------------------------------------
Qty      Item                           Price  Shipped  Subtotal
---------------------------------------------------------------------
Amazon.com items (Sold by Amazon.com, LLC):
   1     Programming Erlang: Softwa...   $24.39      1   $24.39

Shipped via Standard Intl Shipping (estimated arrival date: 31-July-2007).

(ry

今月末すか。 まあ今来ても積読直行だけどなっw

■_ 違和感

【識者の一言】「“Excelの達人”の後継者を育成せよ」:ITpro

ところが、若手社員がさほどExcelに思い入れがないため、達人が引退したり異動すると、 企業の現場はExcelシステムを保守できない状況に陥ってしまう。 若手・中堅社員の間でExcel文化が欠落したのは、 世代がガラリと変わったことが影響している。今の20歳代~30歳代の社員は、 小中学生の頃からパソコンを始めとする多機能なツールに触れてきた。 Excelで実現できるようなことは当たり前で、さほど目新しさを感じない。 Excelに興味がないから、深く知ろうと思わず、達人予備軍が増えなかった。
 このままでは将来大きな問題になりかねないが、打つ手はある。 パソコンが当たり前の時代で育った若手・中堅社員はITの素養があるため、 ちゃんと教えれば理解するし、飲み込みのスピードは早い。Excelの達人が指南役となり、 若手・中堅社員にExcelの魅力を正しく伝えることがポイントになる。

まず、公的な標準でもなんでもない Excelにそんなに肩入れしていいの?、 という気がします。

この手の問題は前にもどっかで書かれていた(Excelレガシーでしたっけ?) と思いますが、んな「職場にいる達人」とかに頼るようにしてるのが問題でしょう。 もしExcelでつくったアプリなりシステムなりが業務を遂行する上で 不可欠なものであるのなら、 「達人任せ」なんてのは怖くてできないと思うんだけど。

でもさあ、教えて××とかにExeclマクロ(VBA)で教えてくれとか、 丸投げそのものも結構あるんだよね。 これも「魅力」が伝わってなくて「興味」がないからかな?

■_ 違和感(その2)

兜町にアメリカの電算機がやってきた:1945~1960/Tech総研

 電子計算機の研究を大きく進めたのは、真空管の精度が向上したことだった。 それには、相対性理論で知られるアインシュタインもかかわっていた。 開発チームは衝撃耐度を格段に改善したVT信管を生み出し、 米海軍はそれを砲弾に組み込んだ。  太平洋戦線で日本軍の航空機を無力化したのは、真空管であるとさえいえる。 またオーストラリアのメルボルンに設置されていたPCSセンターは、 零戦をはじめとする日本の軍用機生産数を、ほぼ正確に把握することができた。

ホッパーはその後も海軍にとどまり85年少将に昇進、 86年退役後はディジタル・イクイップメント(DEC)社の顧問となっている。

VT信管のことを過大評価しすぎ。 まあ、レーダー全般に使われたからという解釈であれば まあそういう面はあるかもしれないけどね。

グレース提督は1992年に鬼籍に入っているんだけど (グレース・ホッパー - Wikipedia)、 「となっている」と今でも顧問であるかのような書き方はどうか、 ってDECがねーじゃんw 記事の最初のほうで~1992って書いているのにねえ

■_ Erlang

上のほうで、Programming Erlang が ship されたぞメールが来たとか書きましたが the.codist{} - Here's a Book I Might Even Buy: Programming Erlang

"Programming Erlang" by Joe Armstrong was just published. Since Erlang is one of the languages I find interesting I may even buy a real book, which hasn't happened in a while.

Erlang isn't the solution to all problems by any means but it does have an elegant design for dealing with concurrency. With multicore computers becoming so common that seems like a good thing to know.
Erlangはすべての問題に対して解決策をもたらすものではけしてありません。 並行性を扱うためのエレガントなデザインを有するものです。 マルチコアなコンピューターが一般的なものになるにつれて 知っておくべきものとなるでしょう。

■_ まあそうなんですけどね

神様なんて信じない僕らのために - すべての漢字を取り出す正規表現

totonの日記さんに詳しいようです。

totonの日記 - すべての漢字を取り出す正規表現

totonの日記 - 「すべての漢字を取り出す正規表現」の続き

とはいえぐぐっただけです。

既に2005年に通過されていた模様。

mpt = [re.compile(u'[一-龠]')]

def main():
    target = u'漢字正規表現亜腕一十百千万億兆京'
    for mp in mpt:
        print "pattern = %s, target = %s" % ( mp.pattern.encode('utf-8'), target.encode('utf-8'))
        ml = mp.findall(target)
        for m in ml:
            print '%s' % (m).encode('utf-8'),
        print 
    pass

あーこのパターンどこかで見たなあ。 まあそれはそれでいいんですけど、 忘れてはいけないのはこれが日本以外の規格からきた漢字も その範囲に含んでしまうということです。 それでもよいという条件のもとなら問題ありませんが、決して 「JIS X 0208の第一水準+第二水準」とか、 「JIS X 0208 + JIS X 0213」といったものの集合ではないということに 要注意です。

それから2007年現在の話をすれば、 Vista等々により今後徐々に使われる場面も増えるであろう拡張B領域 (要するにUTF-16で表したときにサロゲートペアを使うような範囲)の文字は この範囲には当然入りません。

しかし、引用元に飛んでいるトラックバックも追いかけてみたけど 誰一人として再検証してないぢゃないか。 今回は大丈夫っぽいけど、こうやって「伝説」が生まれるんだろうな。 ということでPerlで検証プログラムを書いてみますた。 Pythonでもよかったしもっときれいに書くべきなんだろうけど、 そんなに凝ってもしゃーねーじゃんということで。

#!/usr/bin/perl
use strict;
use warnings;

use Encode qw/decode encode from_to/;

my @table;

# sjis(cp932) なら high-byteは0x81 からだけど漢字があるところからスタート
# ShiftJISのエンコーディングで許される最大値まで
# 実際に文字が割り当てられているのはもっと下のところまで
foreach my $high (0x88 .. 0xfc) {
    foreach my $low (0x40 .. 0xfc) {
        # 下位バイトが 0x7f になるキャラクターはない
        next if $low == 0x7f;
        # '亜' までは ひたすらスキップ
        next if $high == 0x88 && $low < 0x9f;

        my $mbchar = chr($high) . chr($low);
        my $uchar  = decode('cp932', $mbchar);

        next if ord($uchar) < 0x4e00;
        next if ord($uchar) > 0x9fff;

        printf "%s %d\n", $mbchar, ord($uchar);
        push @table, [$mbchar, ord($uchar)];
    }
}
#U+xxxx の順で並べ替え
my @sort_by_uorder = sort { $a->[1] <=> $b->[1] } @table;

printf "min = %s %d\n", $sort_by_uorder[ 0][0], $sort_by_uorder[ 0][1];
printf "max = %s %d\n", $sort_by_uorder[-1][0], $sort_by_uorder[-1][1];

実行結果:
min = 一 U+4e00
max = 龠 U+9fa0

ということであっている模様。

きむらさんはすごいなあ。

ありがたく褒め言葉として受け取っておきますが、 わたしより上はたくさんいますので油断禁物です(笑) 大体、一冊の本すらまともに書けなかったんだから○| ̄|_ (結構心の傷になっているらしい) それと、わたしの前回のエントリでつかった範囲の上端は 「黒」の異体字です。 Windows環境で「ShiftJIS」といわれるようなのはそれが一番最後の文字になります。 IBM拡張漢字なので、環境によっては出なかったりするのかもしれません。 一応UTF-8でこのページは書いているので大丈夫かなと思っていたんですが。

もうひとつ

追追記:

re.compile(u'[亜-万]')

とテストで書こうとすると

error: bad character range

と言われてしまう。ううむ。

Unicodeのオーダーだと、 亜 → U+4E9C 万 → U+4E07 なので、 [Z-A]と同じように端点の値の順序が逆転しているのでエラーになってしまうのです。

■_ えーご

英語の完全攻略法 実践編 3──ちょっとした工夫でワンランクアップの英語を手に入れる:ITpro

逆に,英文を和訳する際にいちいち「一つの」とか「いくつかの」を添えて訳すと, 非常に重たくて不自然な日本語になってしまいます。 例えば,I submitted the test report.を訳す時,「試験報告書を提出しました」 というのが自然な日本語であって,「私は,一通の試験報告書を提出しました」 とは言わないのが普通です。
 これを念頭において訳書を読んでみて下さい。時々,「私は」とか「あなたは」, 「一つの」「いくつかの」を手抜きせずに訳出している例に出くわします。 その日本語に違和感を感じるようになったら, あなたの英語力がワンランクアップした証拠です。

自分が訳しているときは必要以上に I とか You とかが日本語 にそのまま出てこないようには気をつけているから、 まあ第一段階はクリアー?(^^;

■_ Ocaml

第12回 「型推論」の実装法:ITpro

わーいOcaml本全然読んでないやー(棒読み)

2007年07月18日

mswin32版Rubyのワイルドカード展開

某スレで盛り上がってますが。

ありゃあ setargv.objの動作に準拠して組んだんじゃなかったかなあ。 ダブルクォートでくくってもその中のワイルドカード('*'とか)を 展開してしまうのは、空白を含むファイル/パス名に対応するためってのは 推測していた人のいた通り。 でも一部だけ囲うってのは思いつかなかったよん♪

D:\home\prog\sed-4.1.4\sed>dir *.c

2005/12/08  09:30               595 ccc.c
2005/12/12  15:21            44,503 compile.c
2005/03/28  15:43            45,856 execute.c
2004/11/10  02:59            15,230 fmt.c
2007/04/03  16:04             7,537 mbc.c
2005/12/06  14:08             1,605 mbcs.c
2005/01/26  02:51             6,487 regexp.c
2007/04/07  01:12             9,679 sed.c

D:\home\prog\sed-4.1.4\sed>dir "*.c"

2005/12/08  09:30               595 ccc.c
2005/12/12  15:21            44,503 compile.c
2005/03/28  15:43            45,856 execute.c
2004/11/10  02:59            15,230 fmt.c
2007/04/03  16:04             7,537 mbc.c
2005/12/06  14:08             1,605 mbcs.c
2005/01/26  02:51             6,487 regexp.c
2007/04/07  01:12             9,679 sed.c

まあそういうことなんでひとつヨロシク。 にしても十年近く前に決めた仕様を今頃つつかれるとは思わなかったわいw

ん、実際にsetargv.obj 組み込んだプログラムで試すと違うな(7.1)。

#include <stdio.h>

int
main(int argc, char *argv[])
{
    int i;
    for (i=0; argv[i]; i++)
        printf("arg %d: %s\n", i, argv[i]);

    return 0;
}

D:\work\t\0718>mmm *.c
arg 0: mmm
arg 1: dummy.c
arg 2: mmm.c

D:\work\t\0718>mmm "*.c"
arg 0: mmm
arg 1: *.c

んー、どうしたもんかいねえ。 一部分だけくくるってのはわかりにくいと思うんだけど。

■_ ひでぇ

日記。 経由 SME、CCCD「レーベルゲートCD2」のネット認証を終了

 株式会社ソニー・ミュージックエンタテインメントは、 ネットワーク認証を利用したコピーコントロールCD「レーベルゲートCD2」において、 ネット機能を使ったPC用楽曲データの複製サービスを2008年3月で終了すると発表した。

これで認証なしで取り込めるのかと思ったら、取り込めなくなるという話。

一枚(二枚組みだけど:))レーベルゲートなCD買って持っているんだよなあ。 まあすでにごにょごにょしてるんですけどね。

■_ 今日のRuby

nmake testの出力がずいぶんと変わっていてびっくり (しばらくやってませんでした)。

E:\ruby-src\ruby-trunk-20070718\win32>nmake test

Microsoft(R) Program Maintenance Utility Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.


test_block.rb .....................................bootstraptest.tmp.rb:5: -- co
ntrol frame ----------
c:0005 p:0011 s:0013 b:0012 l:000004 d:000011 BLOCK  bootstraptest.tmp.rb:5
c:0004 p:0003 s:0009 b:0009 l:000008 d:000008 METHOD bootstraptest.tmp.rb:3
c:0003 p:0013 s:0006 b:0005 l:000004 d:000004 TOP    bootstraptest.tmp.rb:5
c:0002 p:---- s:0003 b:0003 l:000002 d:000002 FINISH :inherited
c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------
---------------------------
DBG> : "bootstraptest.tmp.rb:3:in `m'"
DBG> : "bootstraptest.tmp.rb:5:in `<main>'"
[BUG] Stack consistency error (sp: 13, bp: 12)
ruby 1.9.0 (2007-07-17) [i386-mswin32_71]


This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Fbootstraptest.tmp.rb:5: syntax error, unexpected ',', expecting ')'
  m {|(*,a,b)|}.inspect
           ^
F
test_class.rb .........................................
test_eval.rb .....................
test_exception.rb ..............................
test_flip.rb .
test_flow.rb ...........................................
test_jump.rb ......................
test_literal.rb ................................................................
................................................................................

test_massign.rb ............................
test_method.rb .................................................................
................................................................................
....................................................
test_proc.rb ..................
test_syntax.rb ....................................bootstraptest.tmp.rb:2: warni
ng: class variable access from toplevel
.......................................................
test_thread.rb ...................
#38 test_block.rb:378:in `<top (required)>':

     def m()
       yield
     end
     m {|(v,(*))|}.inspect
  #=> "" (expected "nil")
#39 test_block.rb:387:in `<top (required)>':

     def m()
       yield
     end
     m {|(*,a,b)|}.inspect
  #=> "" (expected "nil")
FAIL 2/694 tests failed
NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1'
Stop.

E:\ruby-src\ruby-trunk-20070718\win32>

えーと [BUG] Stack consistency error (sp: 13, bp: 12) ってのはとってもまずそうなきがするんだけどどうすりゃいいの?

■_ だーーっ

ひでえ見落としをしていたっぽい。 8月に間に合わないかも…

やっぱブツ切りにやってたんではいかんなあ。

■_ 殿、それには落とし穴がありまする

KazzzのJとNのはざまで - [ぁ-ヶ]|[亜-黑]

■[ぁ-ヶ]|[亜-黑]
日本語を検索する場合に使う正規表現。Shift_JISの範囲であればまずこれで足りる。

内部Unicode化されたものに関しては思い通りに行きません。

import java.util.*;
import java.util.regex.*;

class Rangetest {
    public static void main(String[] args) {
        String[] srcs = {"[亜-煕]", "[亜-黑]"};
        String target = "漢字正規表現亜腕一十百千万億兆京";

        for (String src : srcs) {
            Pattern p = Pattern.compile(src);
            Matcher m = p.matcher(target);

            System.out.printf("pattern = %s target=%s\n", src, target);

            while (m.find()) {
                System.out.print(m.group());
            }
            System.out.println("");
        }
    }
}

出力結果:
pattern = [亜-煕] target=漢字正規表現亜腕一十百千万億兆京
漢字正亜十千億兆京
pattern = [亜-黑] target=漢字正規表現亜腕一十百千万億兆京
漢字正規表現亜腕十百千億兆京
using System;
using System.Text.RegularExpressions;

class Rangetest
{
  public static void Main(string[] args)
  {
    string src = "漢字正規表現亜腕一十百千万億兆京";
    string[] pats = {@"[亜-煕]", @"[亜-黑]"};

    foreach (string pat in pats) {
      MatchCollection matches = Regex.Matches(src, pat);

      Console.WriteLine("pattern = {0} target = {1}", pat, src);   

      foreach (Match m in matches) {
        string s = m.Value;
        Console.Write(s);   
      }
      Console.WriteLine("");
    }
  }
}

出力結果:
pattern = [亜-煕] target = 漢字正規表現亜腕一十百千万億兆京
漢字正亜十千億兆京
pattern = [亜-黑] target = 漢字正規表現亜腕一十百千万億兆京
漢字正規表現亜腕十百千億兆京

このように範囲にあると思われるような字が抜けています。 逆に、なんでこの字が。というのが入っていたりするでしょうね。 面倒なので探しませんが(笑)

これは、たとえば [亜-煕] という文字クラスが ShiftJISの0x889f - 0xe086 という範囲ではなく UnicodeのU+4e9c - U+7155 という範囲を表しているためです。 上記の例で漏れた字、たとえば「万」は U+4e07 なので範囲から外れています。

ちなみにこの辺の事情は、gawkやGNU sed、GNU grep、 Pythonなんかでも同じです。Perlも多分そうじゃないかな (utf8フラグ付き文字列に対して)。

■_ Guileがいる

Guile (News)

2007-07-16
We are pleased to announce Guile release 1.8.2. This is the next maintenance release for the 1.8 stable series.

You can find it here:

    ftp://ftp.gnu.org/gnu/guile/guile-1.8.2.tar.gz 

Its SHA1 checksum is

    b5c624b152a45f302e185e20a468a02f2eb73e38 guile-1.8.2.tar.gz 

This is primarily a bugfix release. Please see the NEWS file for a full summary of 
the changes, but here are the highlights:

(ry

*Bugs fixed
(ry

    *Build problems on MinGW fixed

cygwinでセルフビルドできない問題はどうにかなったんだろうか。 あとmingwがサポートされてたのは知らなかったな。 後で試してみよう。

■_ アイデア枯渇

アルファベットの繰り上がり どう書く?org

excelの桁表示は 1桁目はA、2桁目はB、以下C、D、 E…とすすみ、Zの次はAA AB AC…
と続きます。AZの次はBAです。

この表記法で1から100までを表示してください。出力結果は下記のサンプルの「...」の
部分に適切な文字列を埋めたものになります。

A, B, C, ... CU, CV

面白いやり方が思い浮かばなかった ○| ̄|_

■_ ふむう

Geekなぺーじ:ソフトウェアとはガーデニングである

It imparts the reality that you can trade off quality for quantity, but only up 
to a point. You can have a tiny Japanese style garden where every rock and twig 
is given consideration, or you can allow a small amount of weeds. 

(うまく理解できず。「量と質はトレードオフだけど、それも一定値まで」と言っていると
思われますが、日本庭園とのからみが良くわかりませんでした。)

twig は… 1 (通例葉のついていない)細い若枝, 小枝. (from Yahoo辞書)かな? given consideration は(与えられた/置かれている)考慮すべき事柄 とすると、

(一つ前までの内容を受けて) 質と量とを天秤にかけることはできる(trade off)けれども程度の問題であり、 すべての石や枝が良く考えられた末に置かれているような 日本式の小さな庭(tiny Japanse sytle garden)を作ることもできるが (失敗すると?)多少の雑草が茂っているようなことになるよ。

何とはなしに、原著者の日本庭園に対する見方がわかるような気がする(笑) 要はバランスを考えろってこと?

2007年07月17日

■_ futurering?

ttp://blogs.wankuma.com/naka/archive/2007/07/16/85363.aspx

空色の電卓ふゅーちゃりんぐ 

Yahoo!辞書 - feature
featuringとは - はてなダイアリー
とは違うんかなあ…?

■_ だうと

ttp://blogs.wankuma.com/shuujin/archive/2007/07/16/85348.aspx

C++ ってなんでこんなに強力なんだろうね。テンプレートの存在と、あらゆる演算子を
オーバーロードできるせいかしら。いや、C++ を愛する人達の情熱のせいだ!

オーバーロードすることができない演算子は複数あります >C++

■_ (何回目かの)NHKへのお願い

世界初のCPU「4004」開発回顧録(13) --- CPU「4004」を使ったプリンタ付き電卓の開発:ITpro

もう待てなかった。カードリーダーを使って,25枚のプログラム用パンチカードに打ち込んだ 1Kバイトのプリンタ付き電卓用プログラムを読み込ませた。ROMエミュレータに入力した プログラムを読み出して表示すると,すべてのプログラムは正常に格納されていた。
(ry
 一息ついてリセット・ボタンを押した。ところが,リセット・ボタンを放せない。放せば, 結果が出る。結果を早く確かめたいが,ボタンを放すのが怖い。永遠に見なくて良いので あれば見たくなかった。電卓のLSI化を開始して以来の2年間の成果が目前にあった。 成功すれば天国への切符が手に入り,失敗すれば地獄行き切符となる。
 思い切って,リセット・ボタンを放した。電卓が始動し,プログラムがスタートした。 プログラム・カウンタのアドレスを表示しているモニターを見ると, キーボードをスキャンしているプログラムが実行されているようであった。

この場面は電子立国・日本の自叙伝で再現ドラマがありましたね。 にしても

最終的な電卓用プログラムを作成し,1971年3月に完成した。プログラムの総容量は1Kバイト 以内だった。電卓の応用プログラムは約250バイト,電卓向けマクロ命令用プログラムは 約400バイト,電卓向け言語用インタプリタとキーボード制御とプリンタ制御は約350バイト となった。平方根演算機能はオプション機能とした。

1Kバイト以下で電卓プログラムができているのもすごい。 まああんまりでかくてもROMに収まらんわけですが。 あーでもTiny BASICで2Kバイトに収まるとかいうのがあったような。 あれは6502用だったかな? それはさておき

日本の自叙伝のDVD化(この際次世代でも可)か ネットワーク経由でのアーカイブ参照ができるように切にお願いいたしまする。

■_ メモ

粗方知っていることだし、ところどころ突っ込みいれたいところもあるけど 復習の意味をかねてチェックするため。

■_

20年間,セキュリティ・パッチをリリースしたことはありません:ITpro

特にわれわれが誇りとしているのは,「ぜい弱性がゼロ」であるということです。 われわれがこれまで出荷した製品に関して,米国土安全保障省のコンピュータ緊急対応チーム (US-CERT)が認定したぜい弱性の数が「ゼロ」なのです。20年間,セキュリティ・パッチを リリースしたことがありません。
一般に,ユーザー数の多い製品の方が,ぜい弱性が見つかりやすいと言われています。 ぜい弱性が少ないのは,ユーザーが少ないからという側面がありませんか。
 その見方は必ずしも正しくないと思います。というのも,われわれの製品が守っているのは, 政府や軍隊と言った非常に重要な組織だからです。「狙われる危険性」は, 一般ユーザーよりもはるかに高いと言えるでしょう。 そういった組織を守っているにもかかわらず,ぜい弱性はゼロ。その点が, われわれの誇りなのです。

数のマジックはさておくとしても、何か特別なことをやっているのだろうか?

■_ code monkey

まつもとさんのところで数日前に取り上げられたけど、 奥村先生のところでもちょっと気になるものを見かけたのでメモ。

大学でCS(計算機科学)かIT(情報技術)のどちらを専攻すればいいかという問いに対して, 「ITで就ける職ならCSでも就ける。ITで就けないがCS で就ける職はたくさんある」, 「そこそこの工業大学でITを教えているが,4年生でも, Windowsユーザでも簡単にできることができない,ビットとバイトがわからない, 10行のC++やJavaがまともに書けない」などなど。

■_

だだもれ 経由 或曰: ゲームプログラミングについて各分野で60点を取れるくらいの 感じの本

ゲームプログラミングについて各分野で60点を取れるくらいの感じの本が私の知る限りない。幾何、ライブラリ設計、アプリケーション設計、通信、素材管理、ツール、AI、モーション、最適化、デバッグ体制、描画技術、 ハードウェアアーキテクチャ、アルゴリズム、などなどの全分野についてそれなりな知識を得られるような本。

一冊ではなく、既存の書籍をワンセットにしてくれということなら簡単にリストを作れそうです。ゲームプログラミング固有の知識分野は、ほとんど無いと思いますので。

ということで本のタイトルが挙げられていますがちょっと数が多いので 全部を確認したい人はリンク先を見てもらうとして、 一部だけとりあげると

ドラゴンブックが「最適化」で挙げられているのはちょっと首をかしげるけど まあ自分が選んでも同じようなものかなあ。 あ、「プログラミング作法」がないっ(笑) あと、「珠玉のプログラミング」と 「プログラム設計の着想」/「プログラマの打ち明け話」 って同じでない? ベントリーの Programming Pearlsでしょ? (打ち明け話は More ... だったか) それから、The Art of Computer Programmigを読むのには相当気合を入れる必要が あると思います(^^; 素人にはお勧めできない。って自分も全部は読んでなかったり

あ、余裕があったらこの辺も読んでおくといいかもしれない

内容そのものはオススメできても版型が大きくて分厚い本は除外しています。 目の当たりにすると読む気が萎えると思うので(笑) これで値段ももーちょっと安いと勧めやすいのだけどねえ。 3000円オーバーとなるとちょっと…

んーちょっと数多すぎだな。 涙をのんで思い切って数を減らした方が良いかもしれない (数に圧倒されないためにも)。

■_ じゃばすく

FlashとかAirとかあるんで本格的にやりたいところではあるが時間がねーっ
がチェックだけはしておく

■_ 蛇足とは思いますが

蛇足とは思いますが、Integerを使うよりはちと行数は増えますが 例としてはこういうのを使った方が良いのではないかと思います。

import java.lang.*;

public class RefSample {
    class MyObj {
        public int value_;
        
        MyObj(int v) {
            value_ = v;
        }
    }

    void func1(MyObj o) {
        System.out.println("func1 1: hash=" + o.hashCode() + " val=" + o.value_);
        o.value_ *= 2;
        System.out.println("func1 2: hash=" + o.hashCode() + " val=" + o.value_);
    }

    void func2(MyObj o) {
        System.out.println("func2 1: hash=" + o.hashCode() + " val=" + o.value_);
        o = new MyObj(2000);
        System.out.println("func2 2: hash=" + o.hashCode() + " val=" + o.value_);
    }

    void execute() {
        MyObj o =  new MyObj(100);

        System.out.println("main  1: hash=" + o.hashCode() + " val=" + o.value_);
        func1(o);
        System.out.println("main  2: hash=" + o.hashCode() + " val=" + o.value_);
        func2(o);
        System.out.println("main  3: hash=" + o.hashCode() + " val=" + o.value_);
    }

    public static void main(String[] args) {
        RefSample r = new RefSample();
        r.execute();
    }
}

実行結果:
main  1: hash=1671711 val=100
func1 1: hash=1671711 val=100
func1 2: hash=1671711 val=200
main  2: hash=1671711 val=200 ← func1で書き換えた内容がそのまま
func2 1: hash=1671711 val=200
func2 2: hash=11394033 val=2000 ← ハッシュが違う = 違うインスタンス
main  3: hash=1671711 val=200 ← func2を抜けると元のインスタンス

関数内で書き換えた o.value_ の変更はその関数を抜けた後でも有効ですが、 oそのものの書き換えは関数を抜けると消えてなくなると。 図が描けると説明するのにもいいんでしょうけど、 いいソフトを持ち合わせていないのでできませぬ (Visioでやるか?(笑))。

2007年07月16日

諦めずに自らの目標に向かって努力していたら、いつか何かが起こるもんさ。
昔、トレーナーに言われたよ。『お前がキューキュー軋む音を立てて車を走らせて
いたら、きっと誰かがオイルを入れに助けに来てくれる。人生とは、そういうもん
だ』って。

本当にそうさ。でも、いい事を待つだけで、何もしない者のところに幸せは来ない。


“マーベラス” マービン・ハグラー
    

スルー力

わしもスルー力弱い喃。

ガンダムとか

狐の王国 ガンダム好きにボトムズとイデオンが必須なのか?

んー今現在で見ると裾野が広がっていると思うのでまた違うことになると思うのですが、 本放送から映画化されたあたりでリアルタイムではまっていた人たち (わたしもその中の一人になるでしょうが)を見たときに、 同じ監督が携わっている作品であるイデオンや、ザブングル等々にそのまま 流れていった人は少なからずいたと思います(ガンダムほどのめりこんだかどうかは 別として)。ボトムズは…どうなんでしょうね。 これはこれで熱心なファンがついている作品ですが(OVAの新シリーズが始まるそうで)、 監督が違うしどんなもんだろうかという気がしないでもありません。

が、その後ビデオや後続のガンダムシリーズはまったく見ていない。 ボトムズもイデオンもダンバインもザブングルも見ていない。 それどころか映画版すら見てなかった。
どうもガンダムの紛い物という感じがして、 後続シリーズはまったく見る気になれなかったし、 GガンダムやガンダムWに至ってはもはや何者だという感じ。
やはりファーストが好きだからこそ、そんなものは見たくなかったのである。

という気持ちはわからないでもありません(が、自分はガンダムに関しては 映画版のほうが好きだったりします。わたしが好きな台詞の第一に挙げる 「戦いは数だよ、兄貴! 偉そうにふんぞり返る前に勝つための手だてを…」 はTV版にはありませんし(^^; まあスルーしちゃっていいんじゃないですかね。

だからボトムズにもイデオンにも行ってない。それは経路に無かった。

わたしは、イデオンがこれまでの富野作品の中で一番のものだと思っています (注: ブレンパワードとキングゲイナーは未見です)。 が、色々問題があるので(書き出すと長くなるので割愛(^^;) 今から見る人が同じ感想をもてるかどうかははなはだ疑問ではあるのですけど。

Amazonからの手紙

Amaozon (.comのほう)からお手紙着いた♪

Hello from Amazon.com.

We're writing about the order you placed on April 21 2007 13:14 PDT
(Order# xxx-xxxxxx-xxxxxxx). Unfortunately, the release date for the item(s)
listed below has changed, and we need to provide you with a new delivery estimate
based on the new release date:

 Joe Armstrong (Author) "Programming Erlang: Software for a
       Concurrent World" [Paperback]
   Estimated arrival date: 08/08/2007 - 08/17/2007

We apologize for the inconvenience caused by this delay.
  

げーん

正規表現 part 3 
http://pc11.2ch.net/test/read.cgi/tech/1156413899/929-

929 デフォルトの名無しさん [sage] Date:2007/07/15(日) 20:11:02  ID: Be:
    正規表現はxxを含まないというのを書くのに向いてないのに
    なぜ無謀にもやろうとする奴が後をたたないのだろうか...

930 デフォルトの名無しさん [sage] Date:2007/07/15(日) 20:18:39  ID: Be:
    NOT ○○を含む
    で実現すればいいのにねぇ 

931 デフォルトの名無しさん [sage] Date:2007/07/15(日) 21:00:59  ID: Be:
    そうは言っても、ソフトがそれに対応していないとどうにもならんわけで。
    (Janeはどうか知らんが) 

933 デフォルトの名無しさん [sage] Date:2007/07/15(日) 23:38:25  ID: Be:
    素朴な疑問だけど、正規表現に否定がないのはなぜ?

    !(正規表現) で(正規表現)にまっちしない文字列、みたいのが
    あってもよさそうなものじゃないかと思うのですが

936 デフォルトの名無しさん [sage] Date:2007/07/16(月) 00:18:35  ID: Be:
    というか、1文字の入力から状態遷移を繰り返してるから
    入力から遷移先が決まらないものはダメなんじゃねえの 

937 デフォルトの名無しさん [sage] Date:2007/07/16(月) 00:38:03  ID: Be:
    [^hoge] 

938 デフォルトの名無しさん [sage] Date:2007/07/16(月) 00:38:19  ID: Be:
    正規言語の補集合も正規言語だから、!(正規表現)みたいのが
    なくても書けるので不要ということだろうな。でも与えられた
    正規表現が受理する言語の補集合を受理する正規表現を書くのは
    大変なので、そういうシンタックスシュガーがあれば便利かも?


939 デフォルトの名無しさん [sage] Date:2007/07/16(月) 00:47:15  ID: Be:
    grep -v 'regexp' 

940 デフォルトの名無しさん [sage] Date:2007/07/16(月) 00:52:00  ID: Be:
    >>938
    意味がわかりません。 

941 デフォルトの名無しさん [sage] Date:2007/07/16(月) 00:58:26  ID: Be:
    >>940
    自分の無知を偉そうに自慢されても私たちに出来る事は何も有りません 

943 デフォルトの名無しさん [sage] Date:2007/07/16(月) 01:10:31  ID: Be:
    >>941
    小難しい単語並べりゃいいってもんじゃないんだよ。

    >正規言語の補集合も正規言語だから、!(正規表現)みたいのが
    >なくても書けるので不要ということだろうな。

    書いてみろ。

    この作業が酷く大変なら、そういうシンタクスシュガーが無い理由もわかるだろ。 

944 デフォルトの名無しさん [sage] Date:2007/07/16(月) 01:29:25  ID: Be:
    なんちゅう詭弁 

945 デフォルトの名無しさん [sage] Date:2007/07/16(月) 01:29:33  ID: Be:
    >>943
    特定文字列が含まれてるかどうか調べるなら
    if( $pero =~ /kari/ ){print "バーロー\n";}

    含まれていないことを調べるならその補集合で
    if( !($pero =~ /kari/) ){print "ローバー\n";}

    ってことを言っただけでしょ?
    これだけじゃ超えられない表現もいっぱあるけどさ 

946 ・∀・)っ-○◎● [sage] Date:2007/07/16(月) 03:13:12  ID: Be:
    クイックハックでパターンの先頭に1個「!」があれば否定にするようにしたことあったな。
    実現方法は後察しの通り。 

937は何か勘違いしていると思うのでおいといて、 ××というパターンを含まない文字列にマッチするパターンを書くのは 大変というのは確かだと思う (Perl5拡張の否定先読みとか使えばどうにかできないこともないけど)。 素直に、!~ とか -v のように扱える機能を増やしてもらうほうが 良いような気がする。

Operaたん試用中

FirefoxのCPUパワー使いまくり現象がひどくなる一方なので (firebugとかもdisableにしてんだけどなあ)、いい加減頭にきて Operaをインストールしてみた。 ブックマークの取り込みなんかは問題なくできたし、 さくさく反応して気持ちが良い。 が、問題が一つ。

Firefoxのアドオンの、CopyURL+とかMakelinkみたいに 開いているページのURLとタイトルなどを簡単にクリップボードに 取り出せたりはしないんでしょうか? この機能がないとすげーストレスたまるっす(^^;

まあとりあえずはfxと両方つかって比べていこう。

GPLv3へ移行

おくじさんのところより

enbug diary
http://enbug.tdiary.net/20070715.html

ちなみに、GNUでは、特別な事情がない限り、今月中にGPLv3へ完全移行することになっている。

今月中? となるとgawkも移行するんですよね。 3.1.6は GPLv3 ですか。

それを云うのなら

VB vs Delphi @夏厨2006
http://pc11.2ch.net/test/read.cgi/tech/1152851763/125


125 デフォルトの名無しさん  [age] Date:2007/05/17(木) 00:29:17  ID: Be:
    DelphiとVBどっちが優れてるかって?
    そもそもPascalとBasicじゃ~系譜が
    違う言語だし、当然言語仕様も違う訳で
    C・C++と同系列のPascalに対して
    Basicは元々アセンブラ直系でしょ?
    コンパイラ言語の系譜とインタプリタ言語の系譜の違いもあるし
    問題は、言語の優劣では無く、それに携わる人々のスキル的問題
    だと思うのだけど…。
    やっつけプログラマーが多いのは正直VBだと思う。
    MS依存度100%だし…。 
  
  145 デフォルトの名無しさん [sage] Date:2007/07/15(日) 19:46:37  ID: Be:
    >>125
    系列でいったらBASICとPascalが同系列だよ。
    FORTRAN→ALGOL→BASIC&Pascalだからね。
    BASICはコンパイラ言語でもあったからね。

    Cはほら、UNIX文化だからさ。 

146 デフォルトの名無しさん [] Date:2007/07/16(月) 08:17:34  ID: Be:
    違うぞ。 正確には
    FORTRAN→ALGOL58→ALGOL60→Pascal
    FORTRAN→BASIC

    ALGOL60で構造化プログラミングを取り入れて、それをpascalも受けついでいる。

    BASICはFORTRANそのままに基本的に行番号方式だ。
    VBはその点ではBASICではすでに無くなっているのだろう。
    ただ名前のみを利用してるにすぎない。 

Pascalのご先祖様の話をするのなら、 Algol Wのことをちょっとは思い出してください… ALGOL W - Wikipedia, the free encyclopedia

Algol-W is a programming language. It was Niklaus Wirth's proposal for a successor to ALGOL 60 in the ALGOL 68 committee.

call by value/reference

【初心者】Java質問・相談スレッド103【大歓迎】
http://pc11.2ch.net/test/read.cgi/tech/1182896607/638-

638 デフォルトの名無しさん [sage] Date:2007/07/16(月) 05:08:20  ID: Be:
    C++からJavaに引っ越してきたばかりの初心者です。

    class A {
      private int data;                  //外部からは見えない
      private setter(int data) { this.data = data; } //外部からは使えない
      public int getter() { return data; }
    }

    というクラスがあったとき、data は int 型なので、この値が外部からは
    絶対に変更されないことは保証されていると思います(C++と同じ)。
    しかし、これが基本型の int ではなく、一般的なクラスだった場合、
    例えば StringBuffer だったりしたら、外部からでも

      StringBuffer str = getter();
      str.append("hoge");

    みたいにして操作することは可能です(ここはC++と違う)。
    これを防ぐために思いつくのは、getter() で data そのものではなく
    data のコピーを返すことですが、

      public String getter() { return data.toString(); }

    1. これは標準的な方法ですか?
    2. ざっと見たところ、StringBuffer と違って String には
      インスタンスそのものが保持している値を直接書き換える
      関数はないようですが、int と同じように扱っても安全ですか?
    3. StringBuffer.clone() って使えるのが自然なような気がするんですが、
      なんで使えないんですか? 

639 デフォルトの名無しさん [sage] Date:2007/07/16(月) 05:32:15  ID: Be:
    public StringBuffer getter() { return new StringBuffer(data); }
    Stringはimmutable
    StringBufferのclone()はObjectのclone()をオーバーライドしていないのでprotected
    アクセスになりAからはアクセスできない 

640 デフォルトの名無しさん [sage] Date:2007/07/16(月) 05:41:17  ID: Be:
    こんな時間にレスありがとうございます!
    3点ともしっかり理解しました。
    C++についても「分かったつもり」になっていただけの部分が
    だいぶありそうですので、これを機にもう一度見直してみようと思います。
    色々と。 

641 デフォルトの名無しさん [sage] Date:2007/07/16(月) 07:00:07  ID: Be:
    がんがれ 

642 デフォルトの名無しさん [sage] Date:2007/07/16(月) 08:05:31  ID: Be:
    >>638
    こういう方法もよくやる
    class A {
     // 外部から直接アクセス禁止
     private StringBuffer buf = new StringBuffer();
     // 許可するメソッドだけを間接的に公開
     public append(String str) {
      buf.append(str);
     }
    }
    あわせて。>639のようにGetterはコピーして返せばOK 


646 デフォルトの名無しさん [sage] Date:2007/07/16(月) 11:21:11  ID: Be:
    >>638
    javaはcall by referenceが無くていわばreferenceをcall by valueしてる。
    ていうのをとっとと覚えた方が良いと思う。

    むかし、MSにプリミティブのラッパークラスが
    保持してるvalueを書き換える手段がないのは欠陥と非難されたことがあるよ。 

648 デフォルトの名無しさん [sage] Date:2007/07/16(月) 11:25:37  ID: Be:
    BASIC作ってた会社に言われたくない罠 

650 デフォルトの名無しさん [sage] Date:2007/07/16(月) 11:42:08  ID: Be:
    >>648
    作ってないよ。あれは買い取っただけ。 

651 デフォルトの名無しさん [sage] Date:2007/07/16(月) 12:07:30  ID: Be:
    >>650
    ビルゲイツキタ━━━━━━(゚∀゚)━━━━━━ !! 

まあcall by reference と call by value を (なにがしかの)値を書き換えられるかどうかだと覚えているとはまりますよね。 と。

2007年07月15日

HPのPC

バカ征く(7/15)
http://www.jitu.org/~tko/cgi-bin/bakagaiku.rb?bakaid=20070715

注文したHPのPCが届いたんだけどさー。今どき、Debian
入れらんねーPCが売ってるとは思わなかったよ。etchが
古いのかねー。

ataがどうたらでエラーが出てるっぽい。インストーラは
起動するんだけど、CDドライブが認識できない。

ATAがどうたらでちと引っかかったのですが、 HPのPCは最近(ここ一年以内くらい?)になって内蔵の光学ドライブの インターフェースを切り替えています。 最近のものはシリアルATA接続のドライブを使っているので、 その辺インストーラーが対処できていないのかもしれません。 ハードディスクはもっと前から切り替わっていて、しばらくの間 ATAとシリアルATAの両方を持っていました。

某社某部署ではデフォルトのPCがHPのもの(まあ色々型番はありますが)なので 日ごろから相手をすることが多いので参考にでもなれば。

追記:
kernel 起動時のオプションで libata.atapi_enabled=1 をつければ行けるのではないかというアドバイスをいただきました。 もっともわたしはDebian使いでないのでわたしにいただいても 検証できませんでした(^^;

あたらしいパターンかもしれない

C言語なら俺に聞け(入門篇) Part 16
http://pc11.2ch.net/test/read.cgi/tech/1184003625/205-


205 デフォルトの名無しさん [] Date:2007/07/14(土) 18:57:50  ID: Be:
    void abc(引数){
     int i.j;
     処理;
     free(&i);
     free(&j);
    }

    二次元配列に操作をする関数で、関数の終わりに不要になった
    制御変数i,jをfreeしたいと思ってこのように書いたら、エラーになりました。
    なぜエラーになるのか教えてほしいです。

    ちなみにfreeが1つならエラーにはなりませんでした。
    私のイメージでは単に&iでiのポインタを渡したらそこの分だけfreeしてくれる
    と思ってたのですが、もしかするといっぺんにfreeしてしまうのでしょうか。

    あともしかして、再帰的でなければこのようなfreeは不要ですか?

    よろしくお願いします。 

206 デフォルトの名無しさん [sage] Date:2007/07/14(土) 19:01:37  ID: Be:
    free()はmalloc()で割り当てたメモリを解放するのに使うんだから、
    ローカル変数のポインタなんて渡しちゃダメ。
    この場合はfreeなんて必要ない。 

207 デフォルトの名無しさん [sage] Date:2007/07/14(土) 19:12:05  ID: Be:
    >>205
    これは新しい。 

208 デフォルトの名無しさん [sage] Date:2007/07/14(土) 19:18:27  ID: Be:
    >>205
    さすがに変数に使うメモリ空間は自動的に管理してくれるよ^^; 


210 デフォルトの名無しさん [] Date:2007/07/15(日) 01:06:41  ID: Be:
    >>206
    ありがとうございます。
    もし、
    void abc(引数){
     int i.j;
     処理;
     abc(引数);
     後続処理;
    }
    のような場合で、後続処理にi,jが不要で再起前に開放したいと思ったら
    i,jをmallocで確保するしかないということでしょうか?

    またローカル変数のポインタを渡してはならないとありますが、
    int iにおける&iをローカル変数のポインタとすると、
    int *iにおけるiは、なんという名称になるのでしょうか?

    >>208
    ありがとうございます。
    変数に使うメモリ空間は自動的に管理してくれるとありますが、
    ということはfreeは変数以外に用いるということでしょうか?

    よろしくお願いします。 

211 デフォルトの名無しさん [sage] Date:2007/07/15(日) 01:10:39  ID: Be:
    どういう順番でCを勉強したら210みたいな意味不明な思い込みをするようになるんだろう。 

212 デフォルトの名無しさん [sage] Date:2007/07/15(日) 01:17:30  ID: Be:
    具体的な指摘を 

213 デフォルトの名無しさん [sage] Date:2007/07/15(日) 01:40:07  ID: Be:
    >>210
    int *iにおけるiはローカル変数かつint型のポインタ変数

    ポインタとポインタ変数を混同しているな。
    アドレスとポインタ変数に言い換えた方がわかりやすいかもな。

    あとヒープとスタックについて調べてみな。 

214 デフォルトの名無しさん [sage] Date:2007/07/15(日) 02:09:04  ID: Be:

    >>210
    i, jが関数の途中で不要になるから解放したいなんてことは
    C言語の常識ではやらないし、考える必要もないよ。
    関数終了時に勝手に消えてくれるんだから。

    解放を考える必要があるのはmallocつかったときだけ。 

215 デフォルトの名無しさん [sage] Date:2007/07/15(日) 02:13:20  ID: Be:
    まあ、i,jが超でかい構造体で、再帰するたびにメモリ(スタック)使いまくるなら、
    mallocで確保してfreeするのもありかも知れないが、
    i,jがint程度ならそんなことを心配するのは無駄だよ。 

216 デフォルトの名無しさん [sage] Date:2007/07/15(日) 02:23:11  ID: Be:
    再帰呼んだ後に開放しても、再帰から帰ってくるまで開放されないから意味ないけどな 

217 デフォルトの名無しさん [sage] Date:2007/07/15(日) 02:23:39  ID: Be:
    末尾再起ならループに書き換える事も考えてみる。 

218 デフォルトの名無しさん [sage] Date:2007/07/15(日) 02:28:48  ID: Be:
    そんなことはコンパイラに任せる 

219 デフォルトの名無しさん [sage] Date:2007/07/15(日) 03:07:10  ID: Be:
    でもやってくれないコンパイラ案外多いよ… 

本日の着荷

Matzにっきをみて即座にぽちっとなしてしまった洋書 Beautiful Code: Leading Programmers Explain How They Think が来た。 正直執筆者で知っているのは少ないのだけど(^^;、 ぱらぱらと眺めた限りでは面白そう。 連休の残り一日で読むのは無理っ(笑)

PHP4サポート終了

PHP: Hypertext Preprocessor

The PHP development team hereby announces that support for PHP 4 will continue until the end of this year only. After 2007-12-31 there will be no more releases of PHP 4.4. We will continue to make critical security fixes available on a case-by-case basis until 2008-08-08. Please use the rest of this year to make your application suitable to run on PHP 5.

ほぼ一年で移行できるんでしょうかねえ。PHP4しかはいっていない レンタルサーバーとかもそれなりあったりするんでしょうか?

本日の着荷その2

Yotsubato 4 (Yotsubato (Graphic Novels))
Yotsubato 4 (Yotsubato (Graphic Novels))

日々こういうもので英語を勉強している…わけではありません(笑) が、口語での表現を覚えるのにはいいかなあと。 日本語版もありますしね。

彼らが必要なもの

  OKWave セグメンテーション違反


環境はLinux・C言語です。

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

struct book{
    char author[256];
    char title[256];
    char publisher[256];
    int year;
};

int main(void);

int main(void)
{
    FILE *fp1,*fp2;
    struct book data[256]={0},dummy={0};
    char author[256];
    char title[256];
    char publisher[256];
    int year;
    int i=0,j=0;

    fp1=fopen("biblio.txt","r");

    while(fscanf(fp1,"%s,%s,%s,%d\n",&author[0],&title[0],&publisher[0],&year)!=EOF){
        strcpy(&data[i].author[0],author);
        strcpy(&data[i].title[0],title);
        strcpy(&data[i].publisher[0],publisher);
        data[i].year=year;
        i++;
    }
    j=i;
    fclose(fp1);

    while(1){
        for(i=0;i<256;i++){
            if(data[i].year > data[i+1].year){
                dummy=data[i];
                data[i]=data[i+1];
                data[i+1]=dummy;
                break;
            }
        }
        if(i==256) break;
    }

    fp2=fopen("biblio2.txt","w");

    for(i=0;i<j;i++){
        fwrite(&data[i],sizeof(struct book),1,fp2);
    }

    fclose(fp2);
    return(0);
}



以上のソースで、セグメンテーションエラーが出ます。

  問題は while(fscanf(fp1,"%s,%s,%s,%d\n",&author[0],&title[0],&publisher[0],&year)!=EOF){
   の部分だとは思うのですが、どう改善すればいいのかわかりません。

どなたかわかる方お願い致します。

> fp1=fopen("biblio.txt","r");

fp1がNULLになっていたりしませんか?

「Debugging method for Dummies」みたいな本があったら売れるかな?(笑)

低レベルなプログラマを目指すあなたに

実力が低いという意味の低レベルではなく。
トランジスタ技術 (Transistor Gijutsu) 2007年 08月号 [雑誌]
トランジスタ技術 (Transistor Gijutsu) 2007年 08月号 [雑誌]

今月号は半田付け等の作業なしでいじくれる(PCとはUSB接続)PIC基板つきです。 必要なソフトは付録のCD-ROMに収められています。 低レベルな世界をのぞいてみたい方はチャレンジしてみてはどうでしょうか? :)

特集 <夏休み特別企画>楽しいエレクトロニクス工作への誘い・PICで体験する マイコンの世界-マイコン・プログラミングの世界へようこそ!、 付録マイコン基板の動作テストと通信テスト、ソフトウェア開発環境の構築と使用方法、 付録マイコン基板のハードウェアと拡張方法、 dsPICのI/Oポートの概要とプログラミング書き込みの方法、 C言語によるdsPICのプログラミング、

2007年07月14日

…(絶句)

いろいろさまよっていて偶然見かけたもの

サーバーの状態
http://www.hidekik.com/adminpage/dmb.cgi?mode=viewthread&id=55

> 具体的には、「seek DAT 0,0」が「seek DATA 0,0」となっていたことにより未定義の
> ファイルハンドルを操作しそれがデータファイルに反映されていたようです。
> なぜかはわかりませんがそうなってました。

倍々になる仕組みがわかりました。
truncate DAT, 0;
seek DAT 0,0;
とするところで、まずtruncateでファイルサイズが0になります。
ところがseekでファイルハンドルのポインタを0に戻すところが無効なファイルハンドルDATAを
指定しているのでseekが効かず、ポインタがまだファイルの一番最後を指しています。
その後
print DAT @newdata;
としてファイルに書き出しているので@newdataはファイルの一番後ろから書かれることになります。
しかしながらファイルの長さはtruncateによって0になっているのでファイルの最初から
書き出した場所までが何かで埋まってしまいます。この場合エディタでは「^@^@^@」のように見えます。
元々あったファイルの一番最後に新たな内容をほぼ同じ分だけ書き出すのでファイルサイズが
2倍になるのです。
これを繰り返すとファイルのサイズはアクセスする度に倍々になります。

頼むから未定義変数使ってないくらいのチェックはしてから運用してくれ…

タイムリー?

SEって、めっちゃ勉強家だよね?/Tech総研 というのが発表されたその日…

MSN相談箱 プログラミング好きですか?
http://questionbox.msn.co.jp/qa3163639.html

質問者:tomojyuu 	最近まで2年間プログラマー兼SEをしていたものです。

在職中SEはともかくプログラミングがあまり好きではありませんでした。
仕事時間中は集中しましたが、自宅や休日にプログラミング言語の勉強をしませんでした。
する気が起こらないのです。これってやはり好きではないからでしょうか?仕事のためと
はいっても毎日勉強の日々のこの業界でプログラミングを好きではない人はプログラマー
としては致命的でしょうか?技術が足りなくても好きな人のほうが伸びるのでしょうか?
漠然とした質問でわかりずらいですが、貴方様のプログラマーとしての心構えやモチベー
ションを保つ秘訣など教えて下さい。

という質問が出されたり。 しかしな、おまい、「SEはともかく」とかほざく口はどこにある?

ひら - 輝きの源

ある日、”昔、何やってたの?” と聞かれ、前に勤めていた会社名を話したときだ。一瞬で、”仕事 が欲しい正体不明な若者” から ”技術力が高いひらさん” へとアップグレードした。前の会社は ブランド力があったからだ。
この経験は、何とも微妙な気持ちにさせられた。アップグレードできたのは、悪い気持ちではなか った。同時に前に勤めていた会社以上に、自分に評価に値するものが無い、ということを突きつけ られた。頭ではそんなことはわかっていたが、皮膚感覚で自分の無力ぶりを実感。

フリーソフトウェア/オープンソース関連で知った人はそうでもないのですが、 いわゆる「コノ業界」でない人には私の今所属している会社は妙に受けがいいんですよね。 あんまり悪口も云えないから適当に相槌打って済ませたりするんですけど(笑) あーあれか、大学時代からの友人は「コノ業界」でもアレだなあ。 「お前の会社儲かってんだからこの場はお前のおごりにしろ」とか (すげー論理だな、オイ)。

んでまあこういったことは感じることはありますね。 そういうこともあって会社の名刺でない自分のものをつくりてーとかほざいているわけですが。

うわヤベ。

Advanced W-ZERO3[es]予約できたというのは書いたと思いますが、 スペックを一部勘違いしていました。

ウィルコム、無線LAN対応の「Advanced/W-ZERO3[es]」

外部メモリはmicroSDをサポートする。
サポート容量は現在未定。 

microSD一個ももってねーよ(笑) あー、無印W-ZERO3で使っているminiSDに入っている環境を移しとかないといけないのか。

参院選

2007年参院選:唯一神「又吉イエス」が秋葉原で演説

うちの近くでは選挙用ポスターすら見かけませぬ…

んで選挙といえば

村崎▲とにかく、今回の選挙は出馬する候補がみんな、謎すぎる。これで、 さくらパパだのヤンキー先生だの丸山弁護士だのが平気で当選するようなら、 日本はもう終わりかも。こういうことがあるから、オレら、 参議院なんてもういらないんじゃないかって思っちゃうんだよ。

唐沢●実際その通りで、戦前の参議院(貴族院)が衆議院のチェックシステムとして機能し得ていたのは、 選挙を経ない、終身議員や多額納税者といった人たちで成り立っていたからで、要はこの時代、 すでに選挙という民主主義のファシズムの防止機能が必要とみんな分かっていたのね。 皮肉なのは民主主義が弾圧されていた戦前にその機能があって、 民主主義が幅をきかせるようになった戦後にそれが廃止されちゃった。 小泉の郵政民営化のときの騒ぎを思い出せばわかる通り、 衆議院と参議院をイコールの政治の場とみんなカン違いしているから天才・ 小泉にそれを利用されちゃうわけで、ほとんどの国民はこの二つの違いなんて理解してないと思うよ。 だからアホみたいな泡沫候補を受からせてムダ飯食わせることになるだけであって、 衆議院ひとつに絞っちゃったほうが、どれだけ日本の政治がシンプルになるかと。 もちろん、そうなったら新たなチェック機構が必要だろうけどね。

村崎▲もし憲法を改革するんならまず、参議院をなくすことから始めてほしいよな。

国会議員にやらせるのは無理だよなあ。どうする?

Boost本

神保町某書店で購入。 マーフィーの法則本も新しいのが何年かぶりに出ていたので一緒に。 折からの雨でちと表紙がへたってしまった。 しょぼーん。

Boost C++ Librariesプログラミング 第2版
Boost C++ Librariesプログラミング 第2版

xpressive もしっかり載っていた(当然)。 まあこっちもぼちぼちとやっていこう。
21世紀版 マーフィーの法則
21世紀版 マーフィーの法則

なにかアタリはあるだろうか?

2007年07月13日

■_ つぶせどもつぶせども

Microsoft(R) Program Maintenance Utility Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl -O2 -I.. -I../lib -c -DHAVE_CONFIG_H -o regex.obj ../lib/regex.c

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

regex.c
e:\work\src\sed-4.1.4\lib\regexec.c(2450) : warning C4047: '==' : 間接参照のレベルが 'reg_errcode_t *' と 'int' で異なっています。

警告だから後回しでいいやで放っていたのだけど、いい加減気になるので ちょっと調べた。

問題となっている部分は

  do
    {
      int max = mctx->state_log_top;
      int cur_str_idx = re_string_cur_idx (&mctx->input);

      do
	{
          if (++cur_str_idx > max)
            return NULL;
          re_string_skip_bytes (&mctx->input, 1);
	}
      while (mctx->state_log[cur_str_idx] == NULL);

      cur_state = merge_state_with_log (err, mctx, NULL);
    }
  while (err == REG_NOERROR && cur_state == NULL);

の最後の while の条件式で、 err の型が reg_errcode_t * で REG_NOERROR が int。 見てわかる通り、直前の merge_state_with_log にこのポインタを渡しているのだけど、 マテ。 このループの条件式のレベルでは err はかわりっこねーじゃねーか。 問題の merge_state_with_log の中では

          *err = re_node_set_init_union (&next_nodes, table_nodes,
					     log_nodes);

とか

      *err = check_subexp_matching_top (mctx, &next_state->nodes,
					cur_idx);
      if (BE (*err != REG_NOERROR, 0))
	return NULL;

      /* If the next state has back references.  */
      if (next_state->has_backref)
	{
	  *err = transit_state_bkref (mctx, &next_state->nodes);
	  if (BE (*err != REG_NOERROR, 0))
	    return NULL;
	  next_state = mctx->state_log[cur_idx];
	}

とかしているので、どうみても *errの間違いだろう。 ということでもっと新しい gawk 3.1.5g のソースを見ると

  while (*err == REG_NOERROR && cur_state == NULL);

どうみてもバグです(ry ちなみに 3.1.5 のリリース版だと

  while (err == REG_NOERROR && cur_state == NULL);

なのでどこかで直されたのだろう。 面倒なのでバグトラッキングデータベースをあたることはしないけれども (オリジナルそのものの修正が反映された場合があるので、 gawkの記録だけあたっても意味がない)。

つーかさ、もうちょっと警告を真摯に受け止めようよ? 偉そうに人のことは云えないけどさw

■_ 思考実験するプログラマ

from あおきさんのところ

Windows でパイプをつなぎたくなったとする。 それでいて system とかは使わず自力でつなぎたいとする。
なんでパイプをつなぎたいのかってのは人それぞれだが、 「パイプをつながないと死んじゃう病」になったとか、 cmd.exe にプチきれてシェルを書き始めたとか、理由はいろいろ考えられる。
そんなわけで Win32API を調べたりしたんだけど、つなげるだけなら Ruby では IO.popen を使えばいいので IO.popen(["こまんど", "引数"]) と書いとけばいいわけである。あ、第一引数に配列が渡せるのは 1.9 限定だな確か。
ただ、IO.popen で一段はパイプがつなげるのだが、 ls | grep test | less みたいに二段以上になるとどうしたらいいのかわからなくなってしまった。 まあ IO.popen("ls | grep test", "w") とか書くとちゃんとパイプが働くのだけど、 やっぱこう、なんとなく自力でやりたいわけである。
で考えたのが、GetModuleFileName で自分の実行ファイルのパスを得て、 --connect-pipe とか適当な引数をつけて自分を起動して、パイプ接続先コマンドを exec させるという方法。それでなんとなく動いたんだけど、 なんか実にアホな感じである。もっと楽にいけないのかね。というか cmd.exe はどうやってんだ。

Unix(or its variants)のシェルがどうやってるのかは知らないけど (少し前に Artonさんのところで何か見たような記憶はあるが)、 Windowsの場合は大まかに コンソール プロセスを生成して標準ハンドルをリダイレクトする方法 にあるように 入力用、出力用の二つの無名パイプを作る(CreatePipe) → それぞれを起動する子プロセスのための 標準入力、標準出力および標準エラー出力用のハンドルににDuplicateHandle → 得られたリダイレクト用のハンドルを用いて CreateProcess という手順になるので、 複数段のパイプの尻尾から順番にこのハンドルの複写手順を取りながら 必要なプロセスを起動していくのではなかろうかと。 んー cmdline.split('\|').each{|prc| ほげほげ} て感じ?

■_ オシロ

【連載】組み込みエンジニア必須のスキル - オシロの基本を身に着ける (2) オシロスコープの基本的な使い方 | エンタープライズ | マイコミジャーナル

大昔の話ですが、 あるプログラムのデバッグをオシロスコープを駆使してやったことがあります(笑) 別にやりたくてそうしたわけじゃなくて、ほかにプログラムの動作している情報を とる手段がなかったからです。 二度とやりたくねえ(笑)

というか、わたしの時代でさえオシロスコープはほとんど使われなくて、 ロジアナ (→ASCII.jp - アスキー デジタル用語辞典 - ロジックアナライザ, ロジックアナライザ - 通信用語の基礎知識) を主に使ってたんですがまだオシロって現役なんですか? いやまあ使いどころがまるきり一緒というわけでもないですけどね。

■_ Perl 6 Design Minutes for 11 July 2007

use Perl | Perl 6 Design Minutes for 11 July 2007

Damian:
# things are going along ok. Most of the perl6 stuff I've been doing has been
to do with the redesign of pod and the doc facilities with the language.
It's been somewhat contentious.

# in the last week, the main people who are not happy with what I've done have
put out a document indicated what they'd like. I'm digesting that and I'm going
to try to explain how it can be made to fit in with what we already have. I'm
in the process of stealing as much as I can to result in a better whole

Damianせんせー、すごく訳しにくいです(><)。

■_

The GPL and Software as a Service

あとでかく

慧眼ですね

   最近の仕事 - HsbtDiary (2007-07-12)


今日も今日とて PowerPoint と Excel と戯れているうちに一日がおしまい。
やっぱり Microsoft は Microsoft Office 方眼紙 を作るべきだよなあ。

本来の表計算ソフトという枠を超えて使われているわけで、 ニーズはあるのかもしれませんね > Office 方眼紙

Visio + Execel + PowerPoint + Project + …

アレ?

まるで○○のようだ

tkochiの覚え書き - ACPI BIOSの中身 の説明で使われている図を見て 「なんかForthぽくね?」 と思っていたら、 翌日のエントリのコメント欄で soda さんが言及していた。 負けた(笑)

またお前か

  OKWave ファイルの出力先がうまく指定できません。。
  http://okwave.jp/qa3165141.html


今、ファイルの出力先を変更させたいと思っていて、
調べたところ、fp=fopen("フォルダ名/test.txt","wb")
のようにすればよい、というところまでは調べたのですが、

私の場合、ファイル名を、filenameというchar型の変数に入れており、
fp=fopen(filename,"wb")となってます。

これを、fp=fopen("フォルダ名/filename","wb")としてみたのですが、
これではダメでした。
ファイル名の入っている変数はそのまま使いたいのですが、
それでパス指定をする方法ありますでしょうか?


回答 No.4:

  (ry

最後に:
>これを、fp=fopen("フォルダ名/filename","wb")としてみたのですが、
>これではダメでした。
 ↑
 パスの区切り文字として(/)文字ではなくて(¥)文字を使って下さい。
   (/)文字では上手くいきません。
 

だからを書くなと (全角はtypoとして)。

Boost本買えず

Boost C++ Libraries プログラミング 第2版:秀和システム 書籍詳細 を買おうと思ったんだけど、通勤経路の書店では見かけず。 コンピュータ関連書籍新刊一覧 によると、昨日出ているはずなんだがなあ。 オライリーならともかく、この辺の本ならはいる書店なんだけど… 神保町とかアキバとか行かないとダメ?

2007年07月12日

■_ Visual Studio 2008」

ITmedia エンタープライズ:マイクロソフト、「Visual Studio 2008」を発表

またCRTのDLLの名前が変わるんですかねえ。 いっそ自分らで使っているlibc相当のものを書いちゃうとか (むかーし(笑) X68k でgccいじってた連中はそれやったけど)。 もっともそんなマンパワーをどこから持ってくるんだという話だよなあ。

>dumpbin /imports  msvcr71-ruby19.dll | sed -ne "/MSVCR71.dll/,/dll/p"


    MSVCR71.dll
              100CF148 Import Address Table
              10103608 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                  10E _flsbuf
                  29A fclose
                  29D fflush
                   D7 _close
                  2DB localtime
                  225 _vsnprintf
                  163 _isnan
                  2E9 modf
                  282 abort
                  327 vfprintf
                  2A8 fputs
                  2B4 fwrite
                  2C8 isupper
                  28B atoi
                  2D6 isxdigit
                  2C1 isdigit
                  2BE isalnum
                  30E strncmp
                  306 strcmp
                  30F strncpy
                  311 strrchr
                  313 strstr
                  2A5 fopen
                  101 _filbuf
                  2C4 islower
                  10D _finite
                   3A _CIfmod
                   3D _CIpow
                  2A3 floor
                  28F ceil
                  317 strtoul
                   49 _HUGE
                  2AE frexp
                  2D8 ldexp
                  176 _lseeki64
                  119 _fstati64
                   D8 _commit
                  2AD freopen
                  1C3 _pipe
                   C9 _beginthreadex
                  31E time
                  2BC gmtime
                  285 asctime
                  30B strftime
                  21E _unlink
                  1B9 _open
                   AC _access
                   3C _CIlog10
                   39 _CIexp
                   35 _CIatan
                   36 _CIatan2
                   37 _CIcos
                   3E _CIsin
                   41 _CItan
                   33 _CIacos
                   34 _CIasin
                   38 _CIcosh
                   3F _CIsinh
                   42 _CItanh
                   3B _CIlog
                   40 _CIsqrt
                  216 _tzset
                  1FC _strdup
                  1FE _stricmp
                   E9 _dup2
                  105 _fileno
                  202 _strnicmp
                  1FA _strcmpi
                   D5 _chsize
                  12E _getpid
                  1CC _read
                  262 _write
                   D4 _chmod
                   D0 _chdir
                  1E5 _setmode
                   FE _fdopen
                   E8 _dup
                  215 _tzname
                   E6 _daylight
                  21B _umask
                  13C _hypot
                  13F _initterm
                   BB _adjust_fdiv
                   4C __CppXcptFilter
                   F1 _except_handler3
                   6B __dllonexit

strなんちゃら あたりはまあ楽できるとしても、FILE *とるやつはちと面倒か。

■_ 新型PSP

SCEA、スリムで軽い新型PSPを発表。この秋、発売へ

このほかの細かい仕様としては、CPUは1-333MHzの「PSP CPU」、メインメモリが64MB、16:9で480×272/16,770,000色の4.3インチディスプレイ、「IEEE 802.11b」ワイヤレスLAN、USB2.0(mini-B)のUSBポートなど現行機種と変わりはない。

スリム化されたPSP、北米で9月発売 | ホビー | マイコミジャーナル

基本デザインはオリジナル版を受け継いでいるが、33%の軽量化と19%の薄型化を果たし、「1/2ポンド以下の重量と3/4インチ以下の薄さ」としている。同時にバッテリ駆動も向上。またビデオ出力ポートが追加された。

■_ UMPC

【インタビュー】UMPCは将来、500g以下で10万円以下を目指す:日経パソコンオンライン

携帯電話はいつも身につけているが、いわゆる「モバイルノート」は常に持ち歩いているわけではない。Uシリーズは携帯電話と同じように、いつも身につけている存在を目指している。でも、携帯電話とは一線を画すWindowsフルコンパチブルの端末ということだ。

■_ …あのさあ

日本発の「圧倒的」技術を目指す・ラボ探訪(4)楽天技術研究所 インターネット-ネット企業のラボ探訪:IT-PLUS 経由 われらは会社の「特攻隊」――ネット企業のラボ探訪(1)アルプス インターネット-ネット企業のラボ探訪:IT-PLUS

楽天の方はどうでもいいんですが(なげやり)、アルプスの方にあった次の記述が 気になりました。

そういった先進的な取り組みをしているなかでも、「特攻隊」 として新しいサービスを切り開く役目を負っているのが、アルプスラボだ。 アルプスの社員は約170人程度だが、そのうちから7人の希望者が集まった。

ここでいう「特攻隊」ってのは神風のアレだと思うけど、 だとしたらそれが一体どういうものだったのかをもう一度よーーーく調べてみて、 本当にこういう場面で使っていい言葉かどうかをきちんと考えるべきじゃないのかな。 軍事絡みの用語を使うなということではなくて、 新しいサービスを切り開く役目を表せるような 軍事関連の用語は他にもあるでしょうよ、と。

■_ あなたがHaskellでプログラムを書けるとして

果たしてどのレベルですか? → The Evolution of a Haskell Programmer (from Haskellスレ)

えいえんの初級Haskellぷろぐらま なわしは結構前の方でもうわけわからねっす(笑)

■_ コーディングしているヒマがねえ

もう七月も半ばだからプロトタイプなりを出せないとなあ。 三連休頑張るか…

思い出すためにぺたり。

    You can define your own character properties by defining subroutines
    whose names begin with "In" or "Is". The subroutines can be defined in
    any package. The user-defined properties can be used in the regular
    expression "\p" and "\P" constructs; if you are using a user-defined
    property from a package other than the one you are in, you must specify
    its package in the "\p" or "\P" construct.


    The subroutines must return a specially-formatted string, with one or
    more newline-separated lines. Each line must be one of the following:

    *   Two hexadecimal numbers separated by horizontal whitespace (space or
        tabular characters) denoting a range of Unicode code points to
        include.

    *   Something to include, prefixed by "+": a built-in character property
        (prefixed by "utf8::") or a user-defined character property, to
        represent all the characters in that property; two hexadecimal code
        points for a range; or a single hexadecimal code point.

    *   Something to exclude, prefixed by "-": an existing character
        property (prefixed by "utf8::") or a user-defined character
        property, to represent all the characters in that property; two
        hexadecimal code points for a range; or a single hexadecimal code
        point.

    *   Something to negate, prefixed "!": an existing character property
        (prefixed by "utf8::") or a user-defined character property, to
        represent all the characters in that property; two hexadecimal code
        points for a range; or a single hexadecimal code point.

    *   Something to intersect with, prefixed by "&": an existing character
        property (prefixed by "utf8::") or a user-defined character
        property, for all the characters except the characters in the
        property; two hexadecimal code points for a range; or a single
        hexadecimal code point.

■_ 当然

AIRアプリはドラッグ&ドロップでこんなことまで!(1/3) ─ @IT こーゆーのも試している余裕はない。

■_ メモ(MySQL)

えろぺおさんとこ経由 MySQLノウハウ

2007年07月11日

■_ Google Desk Top

わたしもそれなりに使ってはいたのですが(Windows版ね)、 インデクスを作るドライブやディレクトリを指定できないらしく、 そんなに容量を割り振っていないシステムドライブの空き領域を喰いつぶして くれたのでアンインストールしました。

でもタスクマネージャでプロセスを見ると、GoogleDeskTopのものらしい プロセスがいるんですけどぉ(笑)

■_ perldelta - perl v5.9.5 更新情報

をを、やろうかと思ったら既にやった人がッ!! (from オレンジニュース)

ありがたや。

気になるところをチェック。

■_ Glossary of Perl 6 Terms and Jargon / Perl 6

すでに“Jargon”が集められているとは。 Glossary of Perl 6 Terms and Jargon / Perl 6

■_ 誤訳?

Open Tech Press | Linuxカーネル管理者がGPLv3を問題視―― カーネル変更が困難になることを危惧、「カーネル変更には所有権者全員の許可が必要」 と指摘

6月末に正式リリースされたフリー・ソフトウェア・ライセンス規約「GPLv3(General Public License Version 3)」を問題視する声がLinuxカーネルの管理者から上がっている。彼らは、GPLv3の下でLinuxカーネルを変更する際はカーネルの所有権者全員から許可を得る必要があるとしており、同ライセンスはLinuxには適していないと主張している。

GPLv2→GPLv3に移行するには全員の許可(承認)がいるという話ではないのだっけ?

■_ なぜHaskellは広く使われないのか? (Why People Aren't Using Haskell) つづき

The fact that Perl, Python and Ruby have become popular while Haskell has stayed a marginal language is a failure of the Haskell community. The Haskell community has failed to build a useful distribution Haskell, and it has failed to position the language as something that people can use to solve their problems.
Perl, Python, Ruby がポピュラーなものとなったのに対して、 Haskellが未だ marginal language にとどまっているのは Haskellコミュニティの失敗です。 Haskellコミュニティは便利で使いやすい(Haskellの)ディストリを作れませんでした。 そして、Haskellによって自分の問題を解決することができる人たちに対して そのための道具としての言語として提示することに失敗したのです。

People learn a new language when they need to. For example, say you have a file and need to extract lines that contain a string that matches a regular expression. You've heard that you can use one of those scripting languages to do that very easily. So you want to check them out, select one, and solve your initial problem in it and thus get started with that language.
人々は、必要があれば新しい言語を学びます。 たとえば、あるファイルがあってその中からある正規表現にマッチ文字列を含む行を 取り出すという需要があったとします。 あなたは「あ、それスクリプティング言語のどれかを使えば簡単にできるよ」 ということを聞いたことがあるでしょう。そして そういった言語をチェックし、どれか一つを選んでから あなたの initial problem を解決してみて、 その言語を学び始めるでしょう。

If you go to the Perl, Python or Ruby website, you will immediately learn that these languages are good at text manipulation. You will also learn that there is a wealth of libraries for them, for doing anything from text manipulation to serving web pages. All this is usually available in a single distribution for your platform. Just download it and you are ready to go.
もしあなたが、Perl, Python, Ruby のいずれかのwebサイトに行ったのなら、 即座にその言語がテキスト操作に秀でたものであることを知ることでしょう。 また、それらの言語にはライブラリが豊富に存在していて テキスト処理からwebページのサービスまでできることも知ることになります。 これらのことはすべて、あなたの使っているプラットフォームのための ある一つのディストリで通常は可能なことです。 ダウンロードすれば、作業をはじめるための準備は完了です。

Contrast that to the Haskell site which, in a way, mirrors the approach of the Haskell community. It sells you Haskell as a language instead of Haskell as a solution to your problems. There is no standard distribution containing a wealth of libraries for doing snazzy things. And there is an air of staleness: where new versions of these other languages appear frequently, the Haskell community is offering you Hugs98.
それに対してHaskellでは、Haskellコミュニティの対照的なアプローチがあります。 コミュニティはあなたに対して Haskellをあなたの抱えている問題を解決するものではなくて、 ひとつのプログラミング言語として売り込んでいます。 しゃれことをしてくれるようなたくさんのライブラリを含んだ 標準的なディストリもありません。 あるのは air of staleness です: 他の言語は頻繁に新しいバージョンを繰り出しているというのに、 Haskellコミュニティが提示しているのは Hugs98 です。

What can be done about this? First and foremost the Haskell community must make a standard distribution of Haskell that contains enough libraries to be useful. That should include a regular expression library, an Internet protocol library, a library for dealing with standard internet data and encoding, a crypto library, a multimedia library and a GUI library.
ここでできることはなんでしょうか? Haskellコミュニティが 何を置いても第一にやらなければならないのは Haskellの標準的なディストリ、それも 便利なものを十分に集めたライブラリが含まれたものを作り出すことです。 そこには、正規表現ライブラリ、インターネットプロトコルライブラリ、 標準的なインターネット上のデータやエンコーディングを扱うライブラリ、 暗号化(crypto)ライブラリ、マルメディアライブラリ、GUIライブラリ といったものが含まれているべきでしょう。

Next, the Haskell community must step out of its research circles and start publicizing Haskell to the practicing programmers. Write articles in DDJ and similar publications. Publish real-world programs written in Haskell.
Haskellコミュニティはそれにつづいて、 サークルを調べてHaskellの parcticing progammersに対する売り込みを始めます。 DDJやそれに類するメディアに記事を書きます。 Haskellで書かれた real-world なプログラムを公開する… という手順を踏んでいかねばなりません。

Is this a lot of work? Yes. But Perl, Python and Ruby are doing it. If Haskell doesn't do it will remain an obscure language used by "those research types".
これは大変なことでしょうか? はい、そうです。 しかし、Perl, Python, Ruby (のコミュニティ)はそれをやったのです。 もしHaskell(コミュニティ)がこれらのことをしないのなら、 “those research types”によって使われる 奇妙な言語という位置にとどまりつづけることになるでしょう。

■_ 今日の絶望ネタ

2ちゃんねる スレ

書店員の情報交換スレ31
http://anime2.2ch.net/test/read.cgi/csaloon/1180582004/728-


728 マロン名無しさん [sage] Date:2007/07/10(火) 19:26:23  ID:??? Be:
    久米田を追放した小学館が
    絶望先生アニメ化で改造を併売しませんかと
    FAXをおくってくるずうずうしさに

    絶 望 し た !!

729 マロン名無しさん [sage] Date:2007/07/10(火) 19:31:47  ID:??? Be:
    >>728
    マジか…本当ならそれは図々しい

730 マロン名無しさん [sage] Date:2007/07/10(火) 19:34:04  ID:??? Be:
    >>728
    これは良いネタだが……絶望した!!

ずうずうしいというか商魂たくましいというか…

■_ Visitor(デザパタ)

ありがとうございます。 A Little Javaってのは、邦訳がこれですね → Javaとピザとデザインパターン
Javaとピザとデザインパターン

本棚を見ると、Little Schemer (の翻訳本)はありました(笑)

立ち読みで読んだような記憶もありますが、 今はちと入手困難なようで。原書はそうでもない? 良く見たらマーケットプレースでの値段が安いなあ。

結城さんの本というのはこれ?→ 増補改訂版Java言語で学ぶデザインパターン入門
増補改訂版Java言語で学ぶデザインパターン入門

マルチスレッド編てのもあるんですね 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

このシリーズは版型が大きいのだけがちと問題(わたしにとって)。

2007年07月10日

■_ L魂(えるだま)

lethevert is a programmer - LLSpirit: Language Update


Cleanの紹介をすることになりました。

http://ll.jus.or.jp/2007/show/Event/Session

ほう。Cleanはほとんど名前くらいしか知らない状態…

■_ 2ちゃんねるのPrologスレがこの数日大賑わいな件について

あろはさんは書き込みはしないって前に書いてたよなあ。 いろいろ薀蓄が語られていたりして勉強になる。 良くわかってなかったりするんだけどねッw

■_

世界初のCPU「4004」開発回顧録(12) --- CPU「4004」チップの完成:ITpro

パッケージの許容消費電力からくる制限で動作周波数や使用トランジスタ数が 決められることもある。命令は8または16クロックを使い, 平均で0.06MIPS(Million Per Second)の性能を達成した。

通常とは逆の意味で想像ができない世界だな…

■_ Excel資産

読者10人と考えた「Excelレガシー」再生への道:ITpro

ここの職場で楽ができるための努力をするなとはいえないだろうし さてどうしたものか。

某所にもマクロ(VBA)を多用したExcelシートがたくさんあるなりよ。

■_ LGPLv3

GNU Lesser General Public License - GNU Project - Free Software Foundation (FSF)

  1. Additional Definitions.
  2. Exception to Section 3 of the GNU GPL.
  3. Conveying Modified Versions.
  4. Object Code Incorporating Material from Library Header Files.
  5. Combined Works.
  6. Combined Libraries.
  7. Revised Versions of the GNU Lesser General Public License.

Ver2と違って、GPL±x という形になっているから、 どこかしらでGPLv3の解説でもあればなあ。 まあいいや。

■_ 素朴な疑問

人事考査には反映しないが、達成できた社員を表彰し、皆の前で褒める。 賞状や副賞も出す。「達成すれば褒められる」場面をほかの社員が見て、 自分も考えるようになる。これを繰り返すことで、 社員に考える癖を身に付けさせてきた。 「達成が容易なことから目標を決めさせて実行させる。 成功体験を経験させて自信を付けさせることが狙いだった」と酒巻社長は明かす。

 ピカ一運動で表彰したテーマの1つに、パート社員が考えたものを紹介した。 「始業時間が8時の工場で朝6時半に出社する」というものだった。

その1時間30分の時間外手当ってでたの? でてねーだろうなあ。

完全にアウトプットだけで評価するならそれもいいだろうけど、 時間で束縛するのは変わんないしね。

■_ All you need is ...

「汝の隣人を愛せ」という言葉はプログラミングの秘訣なのではないかと密かに思っている。

座布団一枚。 足りない?

■_ 特に深い意味はなかったり

S001	START
	LAD	GR2,0	; accumrator
	LAD	GR3,0	; loop counter
LOOP	LD	GR0, GR2
	SLL	GR0,1		; *2
	LD	GR1, GR0
	SLL	GR0,2		; *8
	ADDA	GR0, GR1	; *10
	LD	GR2, GR0

	LD	GR0, INP, GR3   ; get next char
	SUBA	GR0, ='0'
	ADDA	GR2, GR0
	LAD	GR3, 1, GR3
	CPA	GR3,=3
	JMI	LOOP
	ST	GR2, ANS
	RET
	END
INP	DC	'123'
ANS	DS	1

ちょっと無駄な部分があるけどまあこんなもんだろ。

G(原子力) N(猫) P(パンチ)


from 某ネットラジオ
    

2007年07月09日

■_ Perl6-regex on Perl5-regex

from Pugs: Perl6-regex on Perl5-regex

blogの更新もとんと途絶えたままだけど、Audreyの体調はその後どうなってるんだろうか。 というのはさておき

Following with KindaPerl6 development, and inspired by Yves Orton (demerphq++) 
Perl 5.10 Advanced Regular Expressions, I started working on an implementation 
of Perl6 regex on Perl5 regex.

After some experimentation, I ended up with a prototype program that works in 
Perl 5.8.

The algorithm is now being implemented as an alternate KindaPerl6 backend. It 
can compile some complex patterns already. The command line for the perl5rx 
backend looks like:

$ perl kp6-perl5.pl --perl5rx < examples/token-test.pl | perl -I lib5regex -I lib

The program output is a dump of the resulting Match object.

- Flavio S. Glock (fglock)

えーと、5.10.0で導入される新しい正規表現の拡張をPerl6に持ち込む (implementation of Perl6 regex on Perl 5 regex) ところで、それを Perl 5.8で書けた(works in Perl 5.8)ということ?

メモ: kp6-roadmap

■_ アセンブリ言語とかその辺

らくがきえんじん
http://d.hatena.ne.jp/syd_syd/20070708#p2


今はアマチュアがアセンブラを学ぶ動機ってあるんだろうか。書籍は沢山出ているけれど、
CPUの複雑なパイプライン/キャッシュ等とコンパイラの最適化があいまって高速化のため
にアセンブラを触るやつはきっといないだろう。あ、でも美咲ちゃん本とかそっち方面の
需要はあるか…セキュリティとか。OSを書くのも流行ってるし…(VMWareもあるし)、
やっぱり今の環境のほうが断然良い気がする。書籍やwebページも恐ろしく高度な内容の
ものが沢山出ているしね。インターネットは高速道路。なむなむ。
Knuth: MMIX
http://www-cs-faculty.stanford.edu/~knuth/mmix.html

Why have a machine language?

Many readers are no doubt thinking, ``Why does Knuth replace MIX by another 
machine instead of just sticking to a high-level programming language? Hardly 
anybody uses assemblers these days.''

[“なんだってKnuth御大はMIXを別の機械で置き換えたりしたんだ? 高水準言語を
使うようにするんじゃなくてさ。アセンブラを使ってる奴なんて
イマドキほとんどいねーじゃん" ]

Such people are entitled to their opinions, and they need not bother reading 
the machine-language parts of my books. But the reasons for machine language that 
I gave in the preface to Volume 1, written in the early 1960s, remain valid today:

    * One of the principal goals of my books is to show how high-level constructions
      are actually implemented in machines, not simply to show how they are applied. 
      I explain coroutine linkage, tree structures, random number generation, 
      high-precision arithmetic, radix conversion, packing of data, combinatorial 
      searching, recursion, etc., from the ground up.

    * The programs needed in my books are generally so short that their main points
      can be grasped easily.

    * People who are more than casually interested in computers should have at least
      some idea of what the underlying hardware is like. Otherwise the programs they
      write will be pretty weird.

    * Machine language is necessary in any case, as output of many of the software
      programs I describe.

    * Expressing basic methods like algorithms for sorting and searching in machine
      language makes it possible to carry out meaningful studies of the effects of
      cache and RAM size and other hardware characteristics (memory speed, 
      pipelining, multiple issue, lookaside buffers, the size of cache blocks, etc.)
      when comparing different schemes.


Moreover, if I did use a high-level language, what language should it be? In the 
1960s I would probably have chosen Algol W; in the 1970s, I would then have had to
rewrite my books using Pascal; in the 1980s, I would surely have changed everything
to C; in the 1990s, I would have had to switch to C++ and then probably to Java. 
In the 2000s, yet another language will no doubt be de rigueur. I cannot afford the
time to rewrite my books as languages go in and out of fashion; languages aren't the
point of my books, the point is rather what you can do in your favorite language. My
books focus on timeless truths.

[もしわたしが高水準言語を使っていたならば、どの言語を使うべきでしょうか?
1960年代であればそれは多分Alogl W でしょうし、1970年に入ればそれを
Pascalで書き直し、80年代になったらなったで今度はすべてをCで書き直す。
90年代ではC++に切り替えたのちに多分さらにJavaへと変えたことでしょう。


言語はわたしの本に関しては重要なものではないのです。
重要なのは、あなたが自分の好みの言語で書くことができるもの。なのです。
わたしの本は時代を超えて通用するものを目指しています。
]

Therefore I will continue to use English as the high-level language in TAOCP, and I
will continue to use a low-level language to indicate how machines actually compute.
Readers who only want to see algorithms that are already packaged in a plug-in way, 
using a trendy language, should buy other people's books.

[したがって、TAOCPにおいてわたしは高水準言語として英語を使い続けることになる
でしょうし、同時にどのように機械が演算を行うかを示すのに低水準言語を使い続ける
でしょう。流行の言語(trendy language)を使って、
ちゃっちゃと自分のプログラムに組み入れて使えるような形で書かれている
アルゴリズムが欲しいだけの読者は他の誰かが書いた本を買うべきでしょう。]

未訳のところは折を見て埋めます。

ところで検索しているときにこんなものを発見 → MMIX Options - Using the GNU Compiler Collection (GCC)

3.17.21 MMIX Options

These options are defined for the MMIX: 

流石は gccだ(笑)

■_ GPLv3

フリー・ソフトウェアは単なる『プロプライエタリ・ソフトウェアの代替選択肢』ではない。

意図的にここだけ切り出しているので、時間の余裕のある人は ぜひリンク先で全文をお読みくださいませ。

■_ デザパタ

まつもと直伝 プログラミングのオキテ 第10回:ITpro

どなたか visitor パターンをわたしにもわかるように説明してください。 どの解説書を見ても納得して使えるようになるほど理解できんのです。

■_ Perl 5.9,5

リリースされたらしい → use Perl | Perl 5.9.5 release

注意: 開発者バージョンです

■_ これってば

秀丸エディタスレ Part19
http://pc11.2ch.net/test/read.cgi/software/1181742415/145-

145 名無しさん@お腹いっぱい。 [sage] Date:2007/07/07(土) 19:57:07  ID:ZD67DOF70 Be:
    正規表現で、
    "123"と"456"をこの順に含み、かつ、それらの間に"abc"が無い行
    を検索するにはどうすればよいのでしょうか?
    123.*(?!abc).*456
    で検索しても、
    123abc456
    にもヒットしてしまい、うまくいきませんでした。(ひとつ目の".*"の最長一致
    で、"abc456"全体にヒットしてしまっているのかな?)

    後方一致とかの使い方が、難しくてどうもよくわからない・・・。

146 名無しさん@お腹いっぱい。 [sage] Date:2007/07/07(土) 19:58:42  ID:ZD67DOF70 Be:
    すみません、ちょっと間違えました。

    誤) 後方一致とかの使い方が、難しくてどうもよくわからない・・・。
    正) 後方不一致とかの使い方が、難しくてどうもよくわからない・・・。

147 名無しさん@お腹いっぱい。 [sage] Date:2007/07/07(土) 20:02:07  ID:ZD67DOF70 Be:
    もうひとつ訂正。

    >ひとつ目の".*"の最長一致で、"abc456"全体にヒットしてしまっているのかな?
    は、忘れてください。よく考えたらそんなはず無いですね。


149 名無しさん@お腹いっぱい。 [sage] Date:2007/07/07(土) 23:21:06  ID:vwvMMVP/0 Be:
    >>145
    秀丸の正規表現しらないけど、こんな感じ?
    123([^a].*|.[^b].*|.*[^c])456

150 名無しさん@お腹いっぱい。 [sage] Date:2007/07/07(土) 23:51:45  ID:nevcYrX80 Be:
    >>145
    正規表現で「ある単語を含まない」といった検索はかなり難しい。

    検索:123.*456
    でgrep検索して、出力結果に対して
    検索:^.*123.*abc.*456.*\n
    置換:
    でabcを含む行を削除する方が簡単だと思う。

    >>149
    それは 123.+456 と同じ結果になる。


152 名無しさん@お腹いっぱい。 [sage] Date:2007/07/08(日) 00:07:30  ID:vwvMMVP/0 Be:
    >>150
    >それは 123.+456 と同じ結果になる。
    試してみた?

154 145 [sage] Date:2007/07/08(日) 00:41:06  ID:UwcQzgzm0 Be:
    >>149
    その表現では、
    123abc456
    にはヒットしませんが、
    123あああabcいいい456
    にはヒットしてしまいます。
    (>>145での私の説明が、若干、言葉足らずだったかもしれません)

    >>150
    最近の秀丸は後方不一致や前方不一致の表現が使えるようになっているため、それ
    らを駆使すればできるのかと思っていました。
    私はこのような「不一致」系の表現というのを使った経験が無く、詳しい使い方が
    イマイチわかっていません。私の経験 ・ 知識不足のためにうまく検索できないだけ
    かと思っていたのですが、やはり難しいのですね・・・。

    どうもありがとうございました。


156 名無しさん@お腹いっぱい。 [sage] Date:2007/07/08(日) 03:38:04  ID:xB7cv1240 Be:
    >>145
    123((?!abc).)*456



159 名無しさん@お腹いっぱい。 [sage] Date:2007/07/08(日) 13:34:36  ID:80QyAukn0 Be:
    145じゃないけど
    >>156
    > 123((?!abc).)*456
    うまいなー。感心した

160 145 [sage] Date:2007/07/08(日) 16:52:58  ID:UwcQzgzm0 Be:
    >>156
    おお、で、出来てる(?!スゲェ)

    でも、どうして 123((?!abc).)*456 でいいのかは、なんだかよくわからん・・・。
    ヘルプに載ってる、「後方不一致指定の後ろにさらにパターンを指定すると、両方のAND
    指定という意味になります。」ってやつだと思うけど・・・。

    そんな使い方、いったいどこで覚えたの??

161 名無しさん@お腹いっぱい。 [sage] Date:2007/07/08(日) 16:59:18  ID:57zhO1ot0 Be:
    進研ゼミ

162 名無しさん@お腹いっぱい。 [sage] Date:2007/07/08(日) 17:02:11  ID:oKayWSDf0 Be:
    ((後ろにabcが続かない)任意の1文字)の0文字以上の連続、か
    そうか秀丸でできたのか良い事を知った

163 名無しさん@お腹いっぱい。 [sage] Date:2007/07/08(日) 22:07:43  ID:UwcQzgzm0 Be:
    >>162
    ふむふむ。「 ((後ろにabcが続かない)任意の1文字)の0文字以上の連続 」 ね。
    なるほど。 そう考えると納得できる様な気がします。

    ^((?!abc).)*$ で検索すれば、"abc"を含まない行を探す、なんてことも出来ますね。

    大変勉強になりました。
    回答していただいた皆さん、どうもありがとうございました。

164 名無しさん@お腹いっぱい。 [sage] Date:2007/07/08(日) 22:43:29  ID:QhZAmMX70 Be:
    そんな正規表現もあったのか。
    勉強になった。

これってバッドノウハウのたぐいだよなあ… 多分ほかに手段はないのだろうけどね。

■_ iPhoneバラバラ

【iPhone分解】メイン基板は2枚重ね,隠れていたのはリンゴ印のLSI:ITpro

別のところで操作しているムービーを観たのですけど、そのときの感想も含めて 云えることは、 「思ったよりも幅があるデバイスなのね」ということです。 今わたしの手元にあるW-ZERO3と比べてどのくらいなのかはわかりませんが、 「電話」として使うにはちと幅がありすぎではないかと思います。 まあ「iPhoneはiPhoneであって電話機ではない」のでしょうから、 あまり意味のない指摘でしょうけど。

つーことで今すぐ日本でも発売! なんてことがあっても飛びつきはしないでしょう。 なんとなくアップルって昔から好かんし(Macに転ばないのもその辺が理由。 開発環境としちゃあ良いのでしょうけどねえ…)。

■_ Python 3000 Status Update (その6)

例外のところだけ。

Other Significant Changes(その他の目立った変更)

Just the highlights.
さわりだけ。

Exception Reform (例外の再設計)

  • String exceptions are gone (of course).
    文字列を使った例外は(もちろん)なくなりました。
  • All exceptions must derive from BaseException and preferably from Exception.
    すべての例外は BaseExceptionから派生したものでなければならず、 通常は Execptionから派生するのが望ましいです。
  • We're dropping StandardException.
    StandardExceptionはなくなりました。
  • Exceptions no longer act as sequences. Instead, they have an attribute args which is the sequence of arguments passed to the constructor.
    例外はもはやシーケンスのようには振舞わなくなりました。 その代わりに、例外はコンストラクタに引数の並びとして渡される、 属性を表す引数(attribute args)をとるようになりました。
  • The except E,e: syntax changes to except E as e; this avoids the occasional confusion by except E1, E2:.
    except E, e: という構文は except E as e というものに変更されました。 これにより except E1, E2: のときにあったような混乱が防止されます。
  • The variable named after as in the except clause is forcefully deleted upon exit from the except clause.
    except clause の中で使われた変数名は その except clauseから抜け出たときに強制的に削除されます。
  • sys.exc_info() becomes redundant (or may disappear): instead, e.__class__ is the exception type, and e.__traceback__ is the traceback.
    sys.exc_info()は余計なものとなりました。 代わりに、e.__classs__ が 例外の型となり、 e.__traceback がトラックバックとなりました。
  • Additional optional attributes __context__ is set to the "previous" exception when an exception occurs in an except or finally clause; __cause__ can be set explicitly when re-raising an exception, using raise E1 from E2.
    省略可能な、__context__ という属性は ある例外が発生したり、 finally clause があったときに “直前の”例外がセットされます。 using raise E1 from E2 を使って 例外の再送出をするときに、__cause__ を陽に設定することができます。
  • The old raise syntax variants raise E, e and raise E, e, tb are gone.
    raise E, e や raise E, e, tb といった古い構文の例外は削除されました。

2007年07月08日

そういうからくりだったのですか

日記を書く[・ _ゝ・]はやみずさん - 二分木画像化レシピ

  1. 好きな言語で、二分探索木のプログラムを書く
  2. 二分探索木をトラバースしながら、PostScriptを出力する

なるほどお。と納得。 ところで、これって昔懐かしいNeXTだとディスプレイにそのまま 吐けたりするんですかね? (NeXTの描画システムでは Display PostScriptなるものが使われている)

プログラマとは…

シグルイ風にプログラマを語るスレ
http://pc11.2ch.net/test/read.cgi/prog/1183813526/


1 仕様書無しさん [] Date:2007/07/07(土) 22:05:26  ID: Be:
    それはおよそ一切の流派に
    聞いたことも見たこともない
    奇怪なソースであった

    これは尋常のプログラムではない
    読めぬ…
    ソースコードが全く………

    参考 コミック/シグルイ/名台詞集
    http://internet.kill.jp/wiki/index.php?%A5%B3%A5%DF%A5%C3%A5%AF%2F%A5%B7%A5%B0%A5%EB%A5%A4%2F%CC%BE%C2%E6%BB%EC%BD%B8 

2 仕様書無しさん [] Date:2007/07/07(土) 22:06:45  ID: Be:
    不屈の精神を持ったマにあっては
    自己(おのれ)に与えられた過酷な運命(デスマーチ)こそ
    かえってその若い闘魂 (たましい)を揺さぶり
    ついには… 

3 仕様書無しさん [] Date:2007/07/07(土) 22:13:13  ID: Be:
    (帰宅しようとするPGに)
    「PLはやめよと申しておらぬ」 

4 仕様書無しさん [] Date:2007/07/07(土) 22:29:54  ID: Be:
    腱鞘炎のプログラマはコードを打つことが出来るのか?
    眼病のプログラマはキーに触れることが出来るのか?
    出来る 出来るのだ!

    プログラマはシグルイなり 

5 仕様書無しさん [sage] Date:2007/07/08(日) 00:52:44  ID: Be:
    「プログラマー板などは?」
    「ふさわしかろう」 

6 仕様書無しさん [sage] Date:2007/07/08(日) 00:56:38  ID: Be:
    セリフ集
    http://wikiwiki.jp/shigurui/ 

8 仕様書無しさん [sage] Date:2007/07/08(日) 09:39:35  ID: Be:
    涙が自然に溢れてきた

    おのれの学んでいるVBこそが最強であることを目の当たりにしたから

    いつか自分もたどり着きたい
    理想のプログラマの姿が目の前に輝いているから 

11 仕様書無しさん [] Date:2007/07/08(日) 20:31:38  ID: Be:
    プログラマの命は プログラマの命ならず プロジェクトのものなれば
    プロジェクトのために死場所を得ることこそ武門の誉

    IT社会の完成形は少数のサディストと多数のマゾヒストによって構成されるのだ 

出来る。出来るのだ。

なにを? というツッコミはなしでお願いします :)

イスラム教入門本

買ってみた。

いや、入信はしませんよ? だって、豚肉食えなくなるし、 偶像崇拝もダメだからフィギュアも×だし(笑)。

確か(わたしが尊敬するプログラマの一人であるところの) 青木淳さんはクルアーン(コーランのこと。こちらのほうが原語の発音に近いので 最近はこちらが主流のようです)の日本語訳(とは実は正しくない言い方) を読破されたような書き込みをどこかで見たような記憶がありますが、 そこまで手を出すかはまだわかりません。

商売してもいいけど、金を貸して利息を取るようなことをしてはいけない とか書いてあるというのははじめて知った。

複数言語を学ぶ意味(or 意義)

とりあえず今のうちに書いておこう(笑)

まあ言葉の綾ってのがあるかもしれませんが、 神様なんて信じない僕らのために - 日本語が使えれば英語は簡単にマスターできるのか で書かれていることに同意で、 「マスター」という言葉を軽々しく使いすぎているような気はしますね そりゃあhello, worldに毛の生えたようなレベルのものであれば、 類推は結構効くかもしれないし必要に迫られるまでやらなくても いいものなのかも知れません。

でまあリンク先のリンク先 (予定は未定Blog版 - ひとつの言語が使えるなら、言語の勉強は不要なのか)にある 言語「だけ」じゃなくてほかの勉強もしなさいよ、 ということが言いたかったんだと思う。 ということが真意であったにしても、ちと言い方に問題があると思います。 プログラミングというものは、使うプログラミング言語によって 縛りが入ることがままあるので「他の文化」を知っておくことは 他では得がたい知見を得られることがあります。 それは自分が主に使う言語に応用できるかもしれないしできないかもしれません。 でも応用ができないものであってもまるっきり無駄ということには ならないだろうとわたしは思います。

つかね。噂には聞くものの実物は観たことないのだけど まるでCOBOLのようなJavaプログラムとか、 藤原さんの本のネタにもなったPascalのようなCプログラムとか、 そういうのを量産してしまうのって、 「言語は一つ覚えておけば十分」(一つしか知らない)って 人たちじゃないのかなあ。

そんなことしてたら Dave Thomas に怒られるよ? :)

いいか、君は一軍の安危に関わる情報について確かめもせずに偉そうな口を叩いているのだ。
度し難い。愚劣極まりない。
君が気取った口で自分の賢しらさに酔っている間にも兵は死んでいるのだ。

莫迦者が。


from 佐藤大輔 皇国の守護者 5 英雄たるの代価
    

2007年07月07日

Ada→Javaという話題

むむ。いや、実はあれは mono-hateの日記 - 防衛システム向けリアルタイムVM に対する反応で、 元を正せば同じイベントに対するニュースだったりします。ということである意味必然、なのかな。

ふむ。そういう裏があったのですね。 昨日はリンクを貼り忘れましたが、転載元は ITProの 富士通が防衛分野にJavaを採用したのは「2007年問題」対策だった:ITpro です。私が気がついたこれは微妙に違いますね(Ada→Javaということについては同じですが)。 ってodzさんたちのそれに気がついてなかった。

ぐぐってみると2ちゃんのニュース板でもスレが建つぐらいだったようで。 アンテナひくー。

でAda

詳しくは知りません(笑) 一回か二回か大きな仕様変更だか追加があったように記憶していますが、 ちょっと手を出したのは最初のほうで、 それも当時のパソコン環境ではまともにAdaなんて動かせるわけがありませんので (たしか「サブセット」がAdaの名前を冠することは禁じられてたはず)、 実際にAdaプログラムを組んだことはありません。

とはいうものの、 知ることができた情報からは結構自分好みの言語だなあという印象を持ちました。 C++のSTLで使っているテンプレートのご先祖の汎関数 (generic function)もこれで知りましたし。

その言語仕様の巨大さについては、ジャーゴンファイルのネタにもなっていますね →

Ada: /n./ A Pascal-descended language that has been made mandatory for Department of Defense software projects by the Pentagon. Hackers are nearly unanimous in observing that, technically, it is precisely what one might expect given that kind of endorsement by fiat; designed by committee, crockish, difficult to use, and overall a disastrous, multi-billion-dollar boondoggle (one common description is "The PL/I of the 1980s"). Hackers find Ada's exception-handling and inter-process communication features particularly hilarious. Ada Lovelace (the daughter of Lord Byron who became the world's first programmer while cooperating with Charles Babbage on the design of his mechanical computing engines in the mid-1800s) would almost certainly blanch at the use to which her name has latterly been put; the kindest thing that has been said about it is that there is probably a good small language screaming to get out from inside its vast, elephantine bulk.

there is probably a good small language screaming to get out from inside its vast というのがなんとも。ジャーゴンファイルの書籍版は日本語訳が出ていますが (ハッカーズ大辞典
ハッカーズ大辞典
) 訳文をオープンにはしてくれないだろうなあ。いくらアスキーでも。

あーあるある

この汚いコード、明日までに書き直しちゃえ! - @IT自分戦略研究所

全面的な書き直しではないのですが、入社一年目のときに自分の受け持ちのところを ちょっと修正したらほかに影響が出て大騒ぎを引き起こす羽目になったことがあります。

まあ組み込み(のようなもの)のプログラムで、 RAMの共有領域が厳密にマッピングされていたんですけど ほかの人の領域をいじっちゃってたんですね。

まあ、グローバル変数は怖いよね。という結論です(そうなのか?)。

本日の購入

時空を超えて
時空を超えて

発売日(前日と当日)に渋谷のTSUTAYAにいったけどsold outだったみたいで買えず、 Amazonさんではお届けまで二週間とかなっていたので(今見たら24時間以内になってた) どうしたもんかと思いつつ、渋谷の某アニメショップにいったら最後の一枚を見つけたので逃さず購入。

しかしここ数年はアニメ絡みでないと新しい歌手とかグループに手を出してない喃。

おいおい…

参議院選挙が近いですが、大丈夫かねこの政党は (支持しているわけでもないのでどーでもいいけどなッ)。

初心者のためのプログラミング言語ガイド Part4

593 デフォルトの名無しさん [sage] Date:2007/07/06(金) 15:49:27  ID: Be:
    こないだのサンデープロジェクトで田原総一郎が
    「社保庁のシステムは未だにCOBOLという古い言語使ってるからダメなんだ!!
    斉藤さん(公明党の政調会長)!あなたのような理科系出身の議員がもっと頑張らなきゃ!」
    と言い放ち、それに対して斉藤鉄夫が
    「私も大学でFORTRANを勉強しましたが、それと同じく1960年ぐらいに生まれた
    古い言語ですからね。確かに新しい言語にする必要はありますね。」
    と返してた。

    どんだけー。 

594 デフォルトの名無しさん [sage] Date:2007/07/06(金) 16:10:51  ID: Be:
    COBOLの具体的に何が問題なの?

    名前がカタカタでしか入力できないとか?

    これCOBOL関係あんの? 

595 デフォルトの名無しさん [sage] Date:2007/07/06(金) 16:12:24  ID: Be:
    グローバル変数しかない 

596 デフォルトの名無しさん [sage] Date:2007/07/06(金) 16:42:15  ID: Be:
    COBOLは言語仕様が更新されないから……
    #確か、使用できるデータの文字コードまで厳として決められていたんじゃないか? 

597 デフォルトの名無しさん [sage] Date:2007/07/06(金) 17:53:37  ID: Be:
    >>593
    >確かに新しい言語にする必要はありますね

    もし本当にやろうとすればマミが「年金食った」とかわめき出すに決まっている 

598 デフォルトの名無しさん [sage] Date:2007/07/06(金) 20:42:41  ID: Be:
    >確かに新しい言語にする必要はありますね
    NTTデータの関係者以外には全くメリットがない。 

599 デフォルトの名無しさん [sage] Date:2007/07/06(金) 21:59:37  ID: Be:
    古い言語=枯れ果てた言語=バグがない。
    技術は新しいのが良い訳じゃない。
    ここにいる人達は解っていると思うけど・・・。
    田原は馬鹿なのか?
    まともな科学的理解と発想法を持っていないな。 

600 デフォルトの名無しさん [sage] Date:2007/07/06(金) 22:03:59  ID: Be:
    >>598
    保守できる人が少なくなってくるから、心配にはなってくるな 

601 デフォルトの名無しさん [sage] Date:2007/07/06(金) 22:10:53  ID: Be:
    >>600
    そうするとCOBOL出来る奴が高給取りになるんだよ。

602 デフォルトの名無しさん [sage] Date:2007/07/06(金) 22:13:32  ID: Be:
    いくら高給でも COBOL のプログラムなんて保守したくないけどな。 

603 デフォルトの名無しさん [sage] Date:2007/07/06(金) 23:37:30  ID: Be:
    JCLとPL/SQLに比べればマシ。 


【COBOL】コボラー集まれ!!!【事務処理】


247 デフォルトの名無しさん [] Date:2007/07/06(金) 10:37:54  ID: Be:


    田原いわく、社保庁の不祥事は「COBOLが悪い」のだとさ。(爆笑)
    http://www.nikkeibp.co.jp/style/biz/column/tahara/070705_18th/

    田原のぞっとするほどの無知無学さに喫驚。っていうか、呆れた。

248 デフォルトの名無しさん [] Date:2007/07/06(金) 15:14:19  ID: Be:
    > 彼がいうには、いまだに社保庁のシステムはCOBOLというプログラム言語を使っているという。
    > これは彼が学生時代に使っていたもので、40年も前のものだ。
    > つまりこの年金の問題は、あまりにも古いシステムとハードを使っていることから起きたのだ。
    > なぜこのようなことが起きたのかというと、まさに社保庁は倒産しないからだ。
    > 一般企業ではそんな古いものを使っていれば、数字が無茶苦茶になって倒産するから、
    > 何年かに1回は切り替えている。それを社保庁は、40年も切り替えないできた。

    ヒデー。言語やハードがいくら古かろうが
    コンピュータは寸分の狂いもなく "命令どおり" に動いているというのに・・・
    手持ちの電卓たたいて変な数字が出てきたら誰のミスか?ということを考えなおして欲しい。

249 デフォルトの名無しさん [sage] Date:2007/07/06(金) 20:38:40  ID: Be:
    > なぜこのようなことが起きたのかというと、まさに社保庁は倒産しないからだ。
    うちの病院はもう40年もシステムを継ぎ接ぎ継ぎ接ぎしながら
    使い続け、一円のミスも起こしてませんが・・・・・・・・・・・・・
    COBOLなんですけど・・・ 

250 デフォルトの名無しさん [sage] Date:2007/07/06(金) 23:14:17  ID: Be:
    こんなニュースがあった

    「時効年金」受給申請初日、連絡不手際で一部受理されず
    http://www.yomiuri.co.jp/national/news/20070706it07.htm

    今日から年金の時効を撤廃する法律が施行されたのに、社会保険庁からの
    指示のメールを社会保険事務所の馬鹿が見てなくて「社会保険庁から何も
    聞いておらず、手続きの方法も指示されていません」と言って申請に来た人を
    追い返したそうだ

    こんな馬鹿にはどんなシステム作ってやっても無駄じゃねえのか?

    システム入れ替える前に人を入れ替えろやっ! 

251 デフォルトの名無しさん [sage] Date:2007/07/07(土) 00:00:47  ID: Be:
    倒産しないから何でもアリだな。うらやましすぎる。
    俺に立派な大学を出られる頭脳と財力があったら社保庁入りたい。 

252 デフォルトの名無しさん [sage] Date:2007/07/07(土) 01:00:07  ID: Be:
    未だ多くの(少なくとも国内の)金融機関での勘定系処理はCOBOL。
    なのに、社保庁のCOBOLだけが悪いのかが不明。

    しかし国会議員の無知は怖い。
    システムの移行に2年や4年でできると思っているのか。

    第3次オンライン後、ハード、ソフトを新規で完全にリプレイスした銀行ってどこよ。

253 デフォルトの名無しさん [sage] Date:2007/07/07(土) 14:39:39  ID: Be:
    年金の例の問題がCOBOLのせいだとでも言うのか? 

どういう文脈で件のせりふが出たのか知らないけど、 言語でシステムが規定されるわけではなかろうに。 それに生まれは1950年代でもそのときの仕様そのままに生き延びているわけじゃないんだがなあ。 今回の事件の原因はシステムの構築のあり方そのものにあるにしても、 何を使って構築したかには関係ないんぢゃね? (関連: 決してSEではないhanahiの日記, 年金問題 - @ITクラブ Cafe )

ようつべとかニコ動あたりにないかなあ。

2007年07月06日

■_ 今ここにあるバグ

ということで昨日の続き。

check_node_accept_bytes 2: elem_len=2, char_len=1

ここで、elem_len が2になるのが引き金になっているので なぜそうなっているか追いかけてみる。 elem_len に値を設定しているのは

regexec.c check_node_accept_bytes

  elem_len = re_string_elem_size_at (input, str_idx);

で、re_string_elem_size_atはどうなっているかというと

regex_internal.h:

static int
internal_function
re_string_elem_size_at (const re_string_t *pstr, int idx)
{
#ifdef _LIBC
  const unsigned char *p, *extra;
  const int32_t *table, *indirect;
  int32_t tmp;
# include <locale/weight.h>
  uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);

  if (nrules != 0)
    {
      table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
      extra = (const unsigned char *)
	_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
      indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
						_NL_COLLATE_INDIRECTMB);
      p = pstr->mbs + idx;
      tmp = findidx (&p);
      return p - pstr->mbs - idx;
    }
  else
#endif /* _LIBC */
      {
          wint_t wc;
          
          wc = btowc(pstr->mbs+idx);
          if (wc==WEOF || wc > 0xff)
              return sizeof (wchar_t);
          else
              return 1;
      }
}
#endif /* RE_ENABLE_I18N */

こんな感じ。

実を云うと、なかなか気がつかなかったのだけど btowc の引数が変。 この関数は btowc などにあるように、そのプロトタイプは wint_t btowc(int c);で、引数にとるのは 変換対象の「1バイト」(昇格するのでint で受ける)、 ところが先のプログラム片をよーーーーく見ると

btowc(pstr->mbs+idx);

で、mbsというのは

  /* Store the multibyte string.  In case of "case insensitive mode" like
     REG_ICASE, upper cases of the string are stored, otherwise MBS points
     the same address that RAW_MBS points.  */
  unsigned char *mbs;

こう。で、idxってのはint…

マテ。

それって、btowc にアドレスを渡していることにならないか?

よもやと思いgawkの方もチェックしてみると 微妙にコードは変わっているのだけど、多分同じことをしているあたりで

regexec.c:

  elem_len = re_string_elem_size_at (input, str_idx);
  wc = __btowc(*(input->mbs+str_idx));
regex_intenal.h:

static int
internal_function
re_string_elem_size_at (const re_string_t *pstr, int idx)
{
#ifdef _LIBC
  const unsigned char *p, *extra;
  const int32_t *table, *indirect;
  int32_t tmp;
# include <locale/weight.h>
  uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);

  if (nrules != 0)
    {
      table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
      extra = (const unsigned char *)
	_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
      indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
						_NL_COLLATE_INDIRECTMB);
      p = pstr->mbs + idx;
      tmp = findidx (&p);
      return p - pstr->mbs - idx;
    }
  else
#endif /* _LIBC */
    return 1;
}

としているので同じ問題は抱えていないっぽい。ほぅ。 でも _LIBCでないときに常に1返すのって手抜きぢゃね? まあ Ulrichにしてみれば「知ったことかそんなの」 ということなのだろうけど
ということで

          wc = btowc(*(pstr->mbs+idx));

として修正したところ、flipflopな現象はなくなったようだ。 しっかし、警告くらいしてくれよ~~ >VC

■_ む。(催促する前に)先手を打たれたか

あろはさん曰く

基本的にこういう探索系の問題は Prolog が最強です. というわけで,きむらさんに催促される前に解いておく (笑)

いやあ(笑) 参考書も買ったんで、自分でも挑戦しようかなと思ってたんですが (できるかどうかは別)

ただし,本当に問題をそのまま書いただけだと, 何回も同じ手順を繰り返して無限ループしてしまうので,

あーやっぱり。>無限ループ ってまあこれは Prologに限らんですよね。 ところで複数解がある場合は、 全部見つけるまで頑張ってくれるんじゃなかったんでしょうか >Prolog プログラムの組み方による?

■_ 中の人降臨

なんか知らぬ間にスレが立ち…

【魔法】リリカル☆Lisp【言語】
http://pc11.2ch.net/test/read.cgi/tech/1183396621/l50

1 1 [] Date:2007/07/03(火) 02:17:01  ID: Be:
    萌え。
    Lispに萌え。
    リリカル☆Lispに萌え。
    語れ。

    ~魔法言語 リリカル☆Lisp~
    ttp://lyrical.bugyo.tk/download.html


13 中の人 [sage] Date:2007/07/05(木) 21:43:14  ID: Be:
    いや、俺はスレ立ててないからwwwwww

    >>1
    >リリカル☆Lispに萌え。
    そもそも萌えを狙って作ったんじゃなくて、
    ネタとして作ったんだが。

    >>2
    オメ。

    >>3
    ソースはもうすぐ公開するよ。
    (まあ、汚すぎて読む気がしないだろうがww)

    >>4
    #tや#fだけでSchemeを名乗る方が痛いかと思う。
    Schemeは特定の言語のことを指すんだから仕様を満たしてから名乗るべきで、
    Lispは方言全体のことも指すんだから、この場合Lispと名乗ったほうがいいかと思った。
    まあ、そんなに怒らんどいて。

    >>5
    >(not (equal Lisp (remove call/cc Scheme)))
    >t
    (lispp scheme)
    t
    (commonlispp scheme)
    nil
    だと考えてる。

14 中の人 [sage] Date:2007/07/05(木) 21:44:45  ID: Be:
    >>6
    どういたしまして。

    >>7
    俺自身もスレ立てるほどのものじゃないと思う。

    >>8
    まだ沢山あまってるから買ってくれw

    >>9
    とりあえずお前も買ってくださいw

    >>10
    >(ゲームp '(リリカル☆Lisp))
    nil
    だと思うけど、なんでアトムじゃなくてリストになってるんだ?

    >>11
    生きろ。

    >>12
    (作者p >>9)
    nil

15 デフォルトの名無しさん [sage] Date:2007/07/05(木) 23:26:18  ID: Be:
    なんだその無根拠な Scheme 優位思想は。 Scheme は Lisp より優れているから
    できそこないの Scheme は Scheme を名乗るべきでない?

    Scheme 選民思想をなんとかしろ。どっちが偉いとかじゃねーんだよ。いいか、昔の 
    Scheme にゃ call/cc はなかったがそれでもScheme だった。
    参考にしたのは Scheme なんだろ?

16 中の人 [sage] Date:2007/07/06(金) 00:12:00  ID: Be:
    >>15
    まあ、決め手になったのは響きなんだけど。
    「リリカル☆Scheme」より「リリカル☆Lisp」の方が響きがよくないか?
    文字数的にも4文字くらいの方が収まりがいいし。

    体験版やればわかるけど、第二話で、
    「ここでは、Schemeと呼ばれる方言に似せたものを使うことにしましょう。」
    って書いてるよ。

17 デフォルトの名無しさん [sage] Date:2007/07/06(金) 00:19:10  ID: Be:
    lyrical は絶対固定なのかw
    叙情的な策略家よりも叙情的な舌足らずの方が良かったと…
    響きで言うなら、りりかる☆はすける! の方が良いんじゃネーの

18 中の人 [sage] Date:2007/07/06(金) 00:20:23  ID: Be:
    書き忘れたけど
    >Scheme は Lisp より優れているからできそこないの Scheme は Scheme 
    を名乗るべきでない?
    だれもSchemeの方が優れてるなんていってないぞ。
    もう一度、言うけど、
    「Lispは方言の総称」
    「Schemeは特定の言語」
    だからLispを使ったって>>13に書いてるだろ?

    例えば、tとnilを使うLispインタプリタを書いても、
    「CommonLispです」なんて口が裂けてもいわないだろ?

19 中の人 [sage] Date:2007/07/06(金) 00:28:44  ID: Be:
    >>17
    lyricalは元ネタが「リリカル☆なのは」ってアニメだから。
    だから、読みが三文字が理想で"りすぷ"なら丁度三文字。
    (平仮名なら表記も三文字が理想だけど、これだとLispと伝わりにくい)

    まあ、そもそもインタプリタが完成してからリリカルLisp作ろうと思ったわけで、
    名前の響きから全体を作ったりしたわけじゃないよ。
    あと、俺にはHaskellのインタプリタ書く技量なんかねーよ。

20 デフォルトの名無しさん [sage] Date:2007/07/06(金) 00:54:12  ID: Be:
    >>18
    あーすまんね。
    > Schemeは特定の言語のことを指すんだから仕様を満たしてから名乗るべきで、
    を先に読んだもんでね。

    > 例えば、tとnilを使うLispインタプリタを書いても、「CommonLispです」なんて
    > 口が裂けてもいわないだろ?
    なんでそんな話に?Lisp と Scheme が分裂した時の決定的な相違の一つが T NIL と 
    #t #f (真偽値) の導入で、
    で #t #f で勉強したらその後 Scheme に進むほうが学習者に優しいかなとおもっただけ
    で、もうどうでもいいや。

(`・ω・´)「OK」

21 デフォルトの名無しさん [sage] Date:2007/07/06(金) 03:28:46  ID: Be:
    京大生はホンマ暇人で羨ましいな。 

22 デフォルトの名無しさん [sage] Date:2007/07/06(金) 04:00:08  ID: Be:
    (興奮p (降臨 作者))

    t

    >>14

    >まだ沢山あまってるから買ってくれw

    (注文p '(リリカル☆ Lisp))

    t

    (届いたp '(リリカル☆ Lisp))

    nil

    >なんでアトムじゃなくてリストになってるんだ?

    (cons 'リリカル☆ '(Lisp)) 

23 中の人 [sage] Date:2007/07/06(金) 10:16:35  ID: Be:
    >>21
    (京大生p 中の人)
    nil

    (暇p 中の人)
    t

    (けど本当は結構忙しいのに授業サボり過ぎて単位が危ないのp 中の人)
    t

    どこの大学かは、リリカル☆Lisp本編をやればきっと分かるよ。
    ……京都をよく知ってる人なら。

    >>22
    (届いたp '注文書)
    nil

    べっ、別に感謝なんかしてないんだからね! 

mixiでもトピできてたしなあ(笑) あっちは作者は来てないっぽいけど。

■_ Ada

odzさんが数日前にAda(プログラミング言語のほう)の名前を出してましたが、 西亭新九郎シンクロニシティ?

富士通が防衛分野のシステム開発でリアルタイムJavaの採用を決めた理由は、 いわゆる「2007年問題」対策であることが分かった(関連記事)。 防衛装備品のシステム向けのプログラム言語「Ada」 を使える技術者を確保し続けるのが難しくなっていた。

 防衛関連システムの寿命は民生品に比べて非常に長い。戦闘機、戦車などの防衛装備品は、 配備されてから20年程度使われるものが珍しくない。「組み込みのソフトウエアを含め、 20年使用できるものが求められる」(富士通の梶原好生特機システム事業本部特機プロダクト 事業部先進システム部長)のが、この“市場”の常識だ。システム開発ベンダーの悩みは、 開発言語に関する技術の継承にある。修理用の部品などと異なり、 作り置きはできないからだ。

 防衛分野のシステム開発ではAdaという ISOで標準化されたプログラム言語の使用が一般的だ。 Adaは高信頼性が特徴の言語で、米国防総省が採用したことから、 日本の防衛装備品でも広く使われている。しかし、 Adaは防衛以外の分野で使われることが少ないため 「Adaを使える技術者を育て続けるのは難しい」(梶原部長)のが実情だ。 そこで富士通が目を付けたのがJavaだった。

当然といえば当然なのかもしれませんが、 日本のこの分野でもAda使ってたんですねえ。 Adaは言語仕様が巨大だとかいわれてましたが、 今日的にはそうでもなかったり?

■_ ○| ̄|_

OKWave sledgeのセットアップ

主題の件で質問です。cpanモジュールのロードエラーが度々発生し足りないモジュールを
足しながら対処してきたのですが、下記のエラーの大元が分かりません。

Premature end of script headers: index.cgi
Subroutine Sledge::Registrar::context redefined at Sledge/Pages/Base.pm line 79.
No such file or directory at HelloWorld/Config.pm line 11.
Can't locate object method "new" via package "Template" (perhaps you forgot to
  load "Template"?) at C:/xampp/Sledge-1.11/lib/Sledge/Template/TT.pm line 51.

エラーは、apacheのerror.logです。
ANo.1

No such file or directory at HelloWorld/Config.pm line 11.

とエラーメッセージが出てますのでまずはそこを考えてみては。
HelloWorld/Config.pmがライブラリパスの通っていない場所にあるんでしょう。

そのエラーメッセージをどこをどう読めば、Config.pmの場所の話になるの。 すげー「専門家」もいらしたもので。

■_ ほげほげ_s

strなんとか_s とか fopen_s、入出力(printf/scanfの類) だけじゃなくて、こういうのもあったのね

ロカールを直接できる mbふがふが_l はいいねえ。 でも VC8からじゃあなあ。 乗り換える(7.1→8)か、ポーティング(笑)してしまうか。

■_ 本日のえさ袋

  • ソフトウェア・バリュー・クリエーターを目指せ - @IT自分戦略研究所

    しかし、天野氏は「これからのエンジニアは、技術以外の資質を養っていかなければ、インドや中国の優秀なエンジニアと一緒に仕事をしていくことはできないでしょう。明らかに年収は日本の方が高いのです。日本のエンジニアは、インドのエンジニアと同じようにプログラムを書くのではなく、いかに製品に付加価値を付けられるかという明確な目的意識とそのためのスキルを身に付ける必要があるでしょう」と語る。

  • Perlモジュール/IO::File::CSV - Walrus, Digit.
  • CSVを簡単に扱うためのIO::File拡張モジュール。 CPANにもActiveStateにも登録されていない野良モジュールです。

  • 松下のLet'snoteの新品が、ボーナス特価でなんと4割引の衝撃価格に!:デジタルARENA

    それでいて、Let'snote R6は11万9800円というプライスが付けられている。 通常価格は20万円前後する機種だけに、その4割引となる価格の安さは目を引く。 また、 Let'snote W5は通常価格が24万5000円前後なのに対し、1 5万9800円の値札が付けられていた。

    しくしくしく…

  • Shared nothing parallel programming

    ざっと斜め読みしただけだけど、

    The important challenge is not to allow star developers to write multithreaded code, it is to allow the large army of enterprise developers out there to scale their applications to large amounts of cores. Perhaps tools like PeakStream (purchased by Google) or its remaining competitor,

    この辺が一番のポイント?

  • あとで読む: Why People Aren't Using Haskell

    We have witnessed an amazing rise in popularity of scripting languages in the past few years. Perl, Python and Ruby have become immensely popular. This proves that:
    我々は、過去数年の間にスクリプティング言語が驚くばかりの勢いでその勢力を 増していくのを目撃しました。 Perlや、Python、Rubyは非常にポピュラーなものとなりました。 このことは以下のことを立証しています:

    1. People are willing to learn a new programming language if it will help them solve their problems.
      人は 自分の抱えている問題を解決するのに役立つのなら、 新しい言語を学ぼうという気になるだろう。
    2. People are willing to learn a new programming language with a different, "weird" syntax.
      人は(自分がそれまでに知っていたものとは) 異なる “weird”な構文を持った新しい言語を学ぼうとするだろう。
      注:weird はここで、“風変わりな”とした方が良いのか、 俗語らしい“すばらしい”とするのかちと判断できず。 両方をかけているのかも。
    3. Performance is not a critical factor.
      性能(performance)は最重要な項目ではない。

    So why aren't all these people using Haskell instead of Perl, Python and Ruby? After all, it is a better language.
    では、なぜそういった(スクリプティング言語を使う)選択をした人たちは Perl、Python、RubyではなくHaskellを使うということを (ずっと優れた言語なのに!)選ばなかったのでしょうか? では、なぜそのようなスクリプティング言語を選んだ人たちは まあそれらの言語もよい言語であるとはいえ Perl、Python、RubyではなくHaskellを使うということを選ばなかったのでしょうか?

    つづく。

■_ 今日の納得行かない話

Cとかその影響を受けた言語に、 expr ? true-part : false-part という記述をする演算子があるじゃないですか。 あれを「三項演算子」っていうのに耐えられません。

いやまあ、確かに三項を取る演算子ではあるし、 (三つの項を取る演算子では)唯一のものなので「三項演算子」 といっても紛れはないのかもしれませんが、 それでもなお納得したくない自分がここにいます(笑)

■_ おお、良かった

ソース公開 (リリカル☆Lisp 開発日記)

まずは、実費回収出来ましたこと御礼申し上げます。 赤字にならずにすんで本当に良かったです。

通販期限が迫ってきております。 本当は完成後一回イベントへ持って行ってそこで終了という筋書きだったのですが、 余りにも売れ残りが激くて、通販をしようと言う流れになったのでした。 実費回収も出来ましたし、余り長引かせてもしょうがないので、好き勝手やっておいて 恐縮ですが、この辺りでフェードアウトさせて頂くことにしました。

赤が出ると大変だろうと箱根の関の東側から心配していたのですが、 実費は回収できたということで何より。 こういうバカ(いい意味で;-))な試みで火傷しちゃあ大変ですからね。 後に続く人も出にくくなるだろうし。

■_ あとでかく

神様なんて信じない僕らのために - 日本語が使えれば英語は簡単にマスターできるのか 経由 予定は未定Blog版 - ひとつの言語が使えるなら、言語の勉強は不要なのか http://d.hatena.ne.jp/bleis-tift/20070705/1183636561

2007年07月05日

■_ バグってハ(ry

バグレポートが来ました。今回は sed(非鬼車Ver.)。 いろいろ試してみて、最低限に近いであろう再現パターンと動作は以下の通り。

>printf "abc\tdef\nabc\tdef\nabc\tdef\nabc\tdef\n" | sed -e "s/[^\t][^\t]*/=&=/g"
=abc=   =def=
=abc    def=
=abc=   =def=
=abc    def=

なんだこの動作… flipflopでもついてんのか? glibc の regex ってよくわかんねーんだよなあ。鬱。

だからといって他のならわかるというわけでもないけどねっ

とりあえずいつものようにログをとる

re_search_internall() enter
re_search_internal() 1
re_search_internal: re_search_internal() 1.1 match_kind=6
re_search_internal case6: match_first=0, right_lim=7
re_search_internal() 2
re_search_internal() 2.0
check_matching 1
transit_state: accept_mb
transit_state_mb: 
check_node_accept_bytes: node->type=6
check_node_accept_bytes: 1
check_node_accept_bytes 2: elem_len=2, char_len=1
check_node_accept_bytes: 3
node->type == COMPLEX_BRACKET
cset->nranges=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
transit_state: ch=61
trtable=00000000, word_trtable=00000000, ret=00

(ry

node->type == COMPLEX_BRACKET
cset->nranges=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
create_cd_newstate: constraint=0
transit_state: ch=66
trtable=00378898, word_trtable=00000000, ret=3752c8
cur_state=003752C8
cur_state->halt=1
match_last=7
re_search_internal() 3 nmatch=1
re_search_internall() enter
re_search_internal() 1
re_search_internal: re_search_internal() 1.1 match_kind=6
re_search_internal case6: match_first=0, right_lim=7
re_search_internal() 2
re_search_internal() 2.0
check_matching 1
transit_state: accept_mb
transit_state_mb: 
check_node_accept_bytes: node->type=6
check_node_accept_bytes: 1
check_node_accept_bytes 2: elem_len=1, char_len=1
transit_state: ch=61
trtable=00378490, word_trtable=00000000, ret=3752c8

(ry

check_node_accept_bytes 2: elem_len=1, char_len=1
transit_state: ch=9
trtable=00378898, word_trtable=00000000, ret=00
cur_state=00000000
match_last=3

あからさまになんか違う流れしとるな。同じデータのはずなのに。 もうちょっと潜るのはまた時間が取れてからにしよう。

■_ しくしく

『ひぐらしのなく頃に解』

・東海テレビ
 2007年7月5日(木)27:27

・KBS京都
 2007年7月6日(金)26:30

・サンテレビ
 2007年7月9日(月) 26:10

・チバテレビ
 2007年7月9日(月) 26:10

・テレ玉
 2007年7月9日(月) 25:30

・tvk(テレビ神奈川)
 2007年7月14日(土) 25:30

なぜ一週間以上遅れるの >tvk

前作のOP曲は結構好きだったが、今回はどんなのだろう? (まだ聴いていない)

■_ メモ

引数として受け付ける型として

  • 文字列
  • 範囲
  • 配列?
  • ハッシュ?

できるだけ処理系とは独立した形で、かつ検索効率はそれなりに。

  • ユーザーが自分の望みどおりの形式やオーダーでデータを並べてくれるとは限らない
  • 混在する型をソート? → 型ごとにまとめてはどうか?

■_ ビット列を並べ替え

ビット列の入れ替えについて - MSDN フォーラム

ビット列

 b7 b6 b5 b4 b3 b2 b1 b0

を

 b0 b1 b2 b3 b4 b5 b6 b7

のように入れ替えるプログラムをC言語で作りたいのです。

自分で考えたりネットで検索しても方法が分りません。

どなたがご存じの方、ご教授願いないでしょうか。

8ビットデータだったら、全部表にしてしまってそれ引けばいいんじゃね? 8ビット×256 で256バイト。 それでも大きいってのなら、 4bit+4bitに分割してニブルごとに引くようにすれば16バイト (一ニブルに対し一バイトの割り当てとして)。

この手の話題はHakcker's delight(邦訳: ハッカーのたのしみ)に山盛り載っています。 → ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

検索するとこういうページもある → Bit Twiddling Hacks

■_ 今日の(わたしの)勉強になる

その1 M系列乱数

http://www.nagoya-bunri.ac.jp/~t-ymzm/rand/rand_index.html M系列乱数のはなし http://www.t3.rim.or.jp/~omorita/prog/mrand.html M系列乱数生成法 M系列乱数

乱数も奥が深い。

その2 引きっぱなし法

【コラム】コンピュータアーキテクチャの話 (85) 引き過ぎを戻す必要があるのか? | エンタープライズ | マイコミジャーナル

筆算では、引き過ぎて部分剰余がマイナスになってしまった場合は、商を一つ減らして、 やり直すという手順を踏むが、本当に、戻す必要があるのだろうか?
ある桁で除数Dを引いて、部分剰余がマイナスになっても、 次の桁で除数D(一つ桁がずれているので、値としてはD/2)を足せば、 結果としてD/2を引いたことになる。これは最初の桁では商を1から0に減らし、 次の桁で商を1にするのと同じである。

へえ。云われてみれば。

■_ Emacs

6年ぶりのリリースにふさわしく、Emacs 22.1の変更点のリストは膨大なもので、 プレーンテキストで224KBにもなる。新しい機能の大半は、 このエディタのコア部分にあたる編集機能ではなく、大小の各種モード ― BibTex編集やLispプログラミングなど、特定の作業向けに作られたモジュール ― に追加されている。ただし、すべてのEmacsユーザがその重要性を認めるであろう 改良点も存在する。

新たな機能をEmacsにもたらすのではなく、既存の機能をEmacs的でない方法で 利用できるようにするための変更点もある。例えば、非常によく行われるUI の調整のいくつか(ツールバーの表示/非表示、スクロールバーの位置変更など)は、 「Option」メニューから利用可能になっており、 Emacs本来のカスタマイズモードに 移行するよりもずっと容易に設定の切り換えが行える。

 同様に、切り取り/コピー/貼り付け操作では、従来のキーバインドも健在だが、 Ctrl-cでコピー、Ctrl-vで貼り付けといった操作ができる、 オプションのCUA(Common User Access)モードも用意されている。 また、新しい「ソフトワードラップ(soft word wrap)」は、 改行記号を保存しながらもキーボードのカーソルキーによる移動を容易にしてくれる。 さらに、マクロの記録、再生をそれぞれF3、F4キーで行うこともできる。

Emacsはもーよーわかりません。 あと、Windowsの標準キーバインドが使えるのもなんとも。 Ctrl-cとかContol-xとか潰されると辛いんじゃないの?

■_ やはり

丁稚な日々: 鬼車とIL32LLP64
http://www.garbagecollect.jp/~usa/d/200707a.html#id20070703_P1

_ いやぜんぜん。
鬼車に関して変更したのはこれだけ。
これがsizeof (long) == sizeof (void*) きめうちな箇所だというのなら、むしろわざわざ
typdefしてここだけ直せばいいようにしてあるんだら、十分な配慮がなされていると思う
(少なくともRuby本体と同程度かそれ以上には)。

スレのほうにもレスがついてますが、団子の暴走(?)だったようで。 まあ団子だからなっ(笑)

■_ えさぶくろ

2007年07月04日

■_ 真空の海に帆を揚げて

むーこんなデータ構造があるのかあ。 日本語のアルゴリズム解説本とかで解説が載るのはいつのことやら… (suffix arrayもそうか)

R-tree - Wikipedia, the free encyclopedia
R-tree Portal - Home

tree data structures that are similar to B-trees, but are used for spatial access methods i.e., for indexing multi-dimensional information; for example, the (X, Y) coordinates of geographical data. A common real-world usage for an R-tree might be: "Find all museums within 2 miles of my current location".
The data structure splits space with hierarchically nested, and possibly overlapping, minimum bounding rectangles (otherwise known as bounding boxes).
Each node of an R-tree has a variable number of entries (up to some pre-defined maximum). Each entry within a non-leaf node stores two pieces of data: a way of identifying a child node, and the bounding box of all entries within this child node.

■_ やられた

[動画]RubyがLispから継承したもの、してないもの - @IT情報マネジメント

前回もそうだった(第一回は気がつかなかった)んだけど、 リンク先のページにFx(2.0.0.4)でアクセスしても動画のリンクが見えない (広告のフラッシュは見える)。 IEでみたら動画が埋め込まれてるのがちゃんと見えてるじゃん。 うきーっ

どうもよくわからんがソースを見た感じ、JavaScriptで動画へのリンクを生成しているの?

追記:
どうもこちら側の問題(間に入っている proxyサーバーが影響している?)のようです。 基本的に同じ構成(入れてるアドオンが同じ)の自宅のマシンからアクセスしたところ、 無事に動画のリンクも出てきました。 もっともフラッシュの自動再生をブロックするアドオンを入れているので、 「フラッシュがここにあるぞゴルァ」マークがでただけですけど。

■_ わははは(苦笑)

ささださんのところ経由で→ 桜が咲く頃にふと想ふ ~生涯アマグラマー宣言!!~

IronRuby(Python)の使いどころが分からない
IronXXXX系全てなんですけど,いまいち掴めないですよねー.
特にWindows FormとかVisual Studioで自動生成とかするじゃないですか. そこからPythonやらRubyで書き始めるとなるのは大変かなと.

ふむふむ。

Rails無しのRubyをどう使えばいいのだろう.

えーーっとっ… 釣りぢゃないよね?(^^;

■_ 二分木

「二分木」ってわたしは「にぶんぼく」と大学時代から読んでいるのですが、 皆様におかれましては如何にお読みであらせられますでしょうか? というのはさておき

黎明日記 - 赤黒木可愛いな……経由 日記を書く[・ _ゝ・]はやみずさん日記を書く[・ _ゝ・]はやみずさん - まだまだ引っ張る赤黒木ネタ

赤黒木(red-black tree)ぢゃなくて、AVL木なら苦戦した記憶が(笑) まあやるこたほぼ一緒なんですけどね > 赤黒木とAVL木 STLではたしか赤黒木を使っているのがあったような(map?)。 「まだまだ引っ張る…」の方にあるgifアニメはいいですね。 動作がよくわかる。

余談ですが、今でもB木がどう動いているのか良く理解できていません(苦笑) いや、木の再構成のときにポインタがあちこち動くのはわかるんですけどね 頭の中がこんがらがってどう動いたのかわけがわからなくなるという… AVL木でも2回ひねり(訳語 by 岩谷宏。原語ではdouble-rotate。 メジャーな訳では二重回転とか) で引っかかったよなあ。

■_ やれやれ

>miniruby -e 'p /A/ =~ "\N{LATIN CAPITAL LETTER A}"'
get_codevalue_of_name2: search for 'LATIN CAPITAL LETTER A}'
get_codevalue_of_name: search for 'LATIN CAPITAL LETTER A'
get_codevalue_of_name: found and return 41
0
>miniruby -e 'puts "\N{LATIN CAPITAL LETTER A}"'
get_codevalue_of_name2: search for 'LATIN CAPITAL LETTER A}'
get_codevalue_of_name: search for 'LATIN CAPITAL LETTER A'
get_codevalue_of_name: found and return 41
A
>miniruby -e 'puts /\N{LATIN CAPITAL LETTER A}/ =~ "CBA"'
get_codevalue_of_name2: search for 'LATIN CAPITAL LETTER A}'
get_codevalue_of_name: search for 'LATIN CAPITAL LETTER A'
get_codevalue_of_name: found and return 41
fetch_escaped_value: parse \N escape
fetch_escaped_value: set fake value for \N{LATIN CAPITAL LETTER A}
get_codevalue_of_name: search for 'LATIN CAPITAL LETTER A'
get_codevalue_of_name: found and return 41
2

何とか形になった。 でもこれはあくまでついでで、本命の機能はまだなんだよなあ。 合宿でもして作りこみたい(笑)が、 使用するデータ構造でちょっと悩んでるところがあるから 即コーディングに移れるかというとそうでもない。

■_ Processor温故知新: Video Oral History of Microprocessor at Computer History Museum(2)

Computer History Museumでは,歴史的なコンピュータを,単に展示するだけではなく, システムとして動作するように修復して展示している。すでに,IBM 1401,IBM 1620, DEC PDP-1などが修復されている。シリコンバレーにはIBM,DEC (Digital Equipment Corporation),Sun Microsystems,Intel などの出身者やコンピュータの元利用者が多くいる。 その彼らが,ボランティアとして,楽しみながら,修復を続けている。また, 展示場のガイドにも協力している。

いいですよねえ。こういうの。 つーことで あとでチェック → PDP 1 HANDBOOK

■_ いろいろ

2007年07月03日

■_

「ういまご・はつまご」、正しい読みに決着 - @IT 経由 日国オンライン - JapanKnowledge Select Series

Fxで動かねえ…

まあ有料でもわるかあないとは思うけど、月額で1575円というのは微妙。 そんなにつかわねえだろうしねえ。

■_

mukakenの日記 - Python Workshop the Edge 2007に行ってきました

宮崎県ではPythonで町おこしをしているみたいです。宮崎県はやりますなぁー。

ほう。

■_ え゛?

Matzにっきでも言及がありましたが → [ThinkIT] 第3回:PHPの、その先にあるもの (3/3)

PHPを持ち上げるのは一向に構わないのですが

多くの機能がライブラリ関数で実現できるようになった、という点については 第1回で紹介しました。かつてはプログラムをゴリゴリと書いていたものが、 今は関数を呼びだすだけで済むようになりました。これを突き詰めると、 プログラムのような複雑な「定義」は不要になり、 機能の1つ1つが簡単な記号の並びだけで表現できるようになるでしょう。

このような考え方は何も今にはじまったわけではなく、オブジェクト指向が叫ばれはじめた 1980年代からありました。いわゆる「部品化」です。プログラムは既存の部品 (=オブジェクト)を上手につなぎ合わせるだけでよい、という考え方です。

しかし、現実には上手くいきませんでした。その後Javaの登場でオブジェクト指向が 一気に加速したようにみえましたが、筆者としては大きな成果は生み出されなかったように 感じています。

そこに登場したのがPHPです。

これまで叫ばれ続けてきたにも関わらず、なかなか実現できなかった「部品化」の切り札が、 JavaではなくPHPなのだ、というのが筆者の最近の期待です。 上で述べた「アプリケーション」とは異なる方向かもしれませんが、 オブジェクト指向についての長年の夢をPHPが解決してくれるように感じています。

な ん で そ ん な 結 論 に な る ??

■_ Perl 6

お引越し情報

use Perl | Perl 6 and Parrot wikis move to perlfoundation.org ということで Perl 6 / Perl 6 をブックマーク and RSSリーダーに登録

■_ Let's Boost

前回ビルドしたときには ICUを使うように設定していなかったので再度。 参考ページ → Boost.Regex: Installation

■_ 自習空間

時間貸自習デスクメダリストクラブ

池袋というのがちょっと行くのには微妙なところだけど、一回試してみようかなあ。 せっかくLet's Note買ったんだし。

■_ 興味深い

修正コードから類似バグを検出 - 森崎修司の「どうやってはかるの?」 [ITmedia オルタナティブ・ブログ]

具体的には、バグの修正箇所を検索キーとしてその部分とクローンになっている箇所を 検索することにより、修正しなければならない箇所のチェックに使う。 既にオープンソースのcannaを使った事例について公開されている。 ある企業の協力を得て、今年に入ってから商用開発で開発/保守されている プロジェクトに対してもいくつか適用してみたところ、よい結果が得られている。

■_

あからさまな催促に答えていただきありがとうございます。

全体的に、標準ライブラリが貧弱なのは OCaml 使いなら誰でも感じてることだろうけど、 その他の話に関してはほとんど言いがかりに近い些細な事って気がするね。 どれもこれも、ちょっとした慣れの話であって、 批判に値する事柄というよりは単に好みの問題じゃないのかな。

なるほど。

OCaml の基本的なポリシーには『厳格な型付け (暗黙のキャストなんてもってのほか)』 というのがあると思うんだけど、それを良しとするなら文句を言う筋合いの無い事柄が多い。 逆に良しとしないなら、 OCaml 使うのなんて止めちゃえば?という感じ。 「明示的にキャストしないと int に float が足せない」とか、何言ってんの、 そこが良いんじゃないか、と。

OCamlはまだhello, worldレベルしかわかりませんが、 そういうポリシーは良いと思いますし(だからといっていつでもなんでもOCamlで 片付けるということにはならない/できないでしょうけど)、 「××がいやなら使わなきゃあいいじゃん」というのはごもっとも。

■_ むきー

E:\test-ruby>miniruby -e 'puts "\N{LATIN CAPITAL LETTER A}:\N{LATIN CAPITAL LETTER Z}"'
get_codevalue_of_name2: search for 'LATIN CAPITAL LETTER A}'
get_codevalue_of_name: search for 'LATIN CAPITAL LETTER A'
get_codevalue_of_name: found and return 41
Invalid escape character syntax
puts "\N{LATIN CAPITAL LETTER A}:\N{LATIN CAPITAL LETTER Z}"
                                 ^
get_codevalue_of_name2: search for 'LATIN CAPITAL LETTER Z}'
get_codevalue_of_name: search for 'LATIN CAPITAL LETTER Z'
get_codevalue_of_name: found and return 5a
Invalid escape character syntax

…修正箇所が足りないようだ ○| ̄|_

これで、まつもとさんが既にやってたところだったら泣く(笑)

2007年07月02日

■_ メモ(CASL と CASL IIの違い)

合格CASL - 学習者にやさしいCASLⅡシミュレータ

  1. マクロ命令 RPUSH/RPOP の追加
  2. 汎用レジスタ数の増加(GR0~GR3→GR0→GR7)
  3. フラグレジスタ長の変更(2bit→3bit)
  4. スタックポインタレジスタの専用レジスタ化(GR4→SP)
  5. オーバーフローフラグ(OF)の追加
  6. 論理加算/論理減算命令(ADDL/SUBL)の追加
  7. オーバーフロー時の分岐命令(JOV)追加
  8. スーパーバイザーコール命令(SVC)の追加
  9. NOP命令の追加
  10. 一部の命令のニーモニックや名レコードの変更
    • LEA→LAD
    • ADD→ADDA
    • SUB→SUBA
    • EOR→XOR
    • JPZ→JPL
    • JMP→JUMP
    • PUSH
    • POP
  11. 命令機能の変更
    • LAD: フラグレジスタの値が不変
    • LD: OFがロード前に0になる
    • JPL: フラグレジスタの値が000または001のとき分岐
  12. リテラルの追加
  13. ラベル名長さ制限の緩和(6文字→8文字)
  14. DC擬似命令の扱い
  15. IN/OUTマクロ命令での入出力の大きさの変更(80文字→256文字)
  16. DC擬似命令の扱い
  17. EXITマクロ命令の削除

■_ 考えてみると1.9.1のリリース(予定)まであと半年もないのであった

Hena Hena Nikki ~悔い倒れの日々~(2007-07-01)

Ruby 標準添付ライブラリの CSV パーサが遅い
去年見かけたネタだけど、まさか自分もこの遅さにイライラすることになるとは…。 今回は FasterCSV を使わずに簡単に読み込ませて解決。
やはり Ruby で小物を書くのは楽。今回もかなり手抜きできた。

添付ライブラリの見直しとかせんでいいのだろうか? やっぱリリースマネージャ必要じゃないかなあ、って 今から手を上げる人がいるとも思えんが…

とりあえずRubyKaigi2007でまつもとさんがいっていた来月(8月) リリース予定のサンプルリリースを見てから判断しよう (そのときまでに幾つかパターンを考えておくこと← とど)

■_ Ocaml Sucks

from 各方面

北海道一の岡村オキャムラー である jijixi さんの意見はまだのようだ。

■_ Python Workshop the Edge 2007

あうーいきたかったよぉー

一部分だけ(数十分くらい?)ストリーミングで観ていました。 大学の講義で、シェルの入力画面で python ほげほげ.pyとまで入力しているのに エンターキーを押下することをせず、じーっとそのまま 待っている学生さんがいるということにある意味衝撃を受けました。

Pythonを最も活用している場面を教えて下さい。

    * CG 業界では標準
    * 社内教育。インデントしてくれない新人教育に。

どちらも今日のセミナーに通ずる内容でした。
Pythonのここらへんどうにかしてほしいってところありますか?

    * 日本のユーザが増えて欲しい
    * サードパーティライブラリのレポジトリが欲しい(CPAN のような)
    * 文字コードの扱いをしっかりして欲しい
    * 日本語の書籍をもっと欲しい

■_ OSC 2007 in Hokkaido

一方、OSC 2007 Hokkaido はあれだけ楽しんだのに、絶望した。

だいたい、あれは Conference とは言えないシロモノであった。Meeting とか、同好会とか、
同人会とかその手のものである。8万円も出してわざわざ来るような会ではなかった。
絶望した。

運営に参加しなかった第3者としてここに批評を述べさせていただく。OSC 2007 Hokkaido 
が Conference でないというのは次の3点にある*1:

   1. formal conference と informal conference が同じ場所で行われた
   2. 献本に発表者が群がった
   3. スタッフ/発表者控え室が見当たらなかった

多くの方が勘違いされているようだが、"Conference"という単語には明確な定義がある。 

あと jijixi さんは後ろ姿だけ見た。発表が終わった後、そのまま帰るんじゃなしに、 扉に楔をあてていた jijixi さんはカッコいいと思った。

すばらしい。

諸君、同じやうな事を言はれないやうに、此れ等の本を読んで、とっくりと考へて勉強なさい。

むーさすがに海の向こうはその手の本もたくさんあるんですかねえ… って最後の一冊にはどういう深い意味がっ!?

■_ 回避策?

表計算ソフトは計算が苦手?(第5回):日経パソコンオンライン

また、「ツール」メニューの「オプション」を選ぶと、開く画面の「計算方法」 タブに演算誤差を防ぐオプションが用意されている。「表示桁数で計算する」がそれだ。 オンにすると、セルに表示されている桁数で小数を計算できる。実際は「0.0999…」 のように誤差を含んだ数値でも、セルに表示された「0.1」 として計算や判定が行われるようになるのだ。

お、Excel2000にもあったよ > 表示桁数で計算する。 実際にどういうロジックでそういうことをしているのかがちょっと気になるけど。

■_ わかりやすいコードを作成するための6つの方法

IBM わかりやすいコードを作成するための 6 つの方法 - Japan

  • ヒント 1: 賢い人にならってコメントを付けること
  • ヒント 2: #define をたくさん使うこと。ただしやたらに使うのは禁物です
  • ヒント 3: わかりにくい変数名を使わないこと
  • ヒント 4: エラー・チェックを行うこと。誰にだって間違いはあります
  • ヒント 5: 「Premature optimization is the root of all evil (早まった最適化は諸悪の根源である)」 - Donald Knuth

    まずは簡潔で、機能するコードを書いてください。 最適化でコードを見苦しくする時間は後でいくらだってあります。 正しいコードを作成できたと確信するまで、最適化は行わないでください。

  • ヒント 6: あまりにも賢くなりすぎないこと

■_ あとで読んでできれば何か書く(エモノとも云う)

■_ Python 3000 Status Update (その5)

あともうちょい。

Changes to the Class and Type System

You might have guessed that "classic classes" finally bite the dust. The built-in class object is the default base class for new classes. This makes room for a variety of new features.

"calssic class"が最終的にbite the dust となったかどうか疑問に思う人もいるでしょう。 組み込みクラスオブジェクトは新しいクラスのためのデフォルトのベースクラスです。 これにより、数々の新しい機能を入れ込む余地ができました。

  • Class decorators. These work just like function decorators:

    クラスデコレーター。 これはちょうど関数デコレーターのように働きます。

    @art_deco
    class C:
        ...
    
  • Function and method signatures may now be "annotated". The core language assigns no meaning to these annotations (other than making them available for introspection), but some standard library modules may do so; for example, generic functions (see below) can use these. The syntax is easy to read:

    関数とメソッドのシグネチャは“annotated”なものとなることができるようになりました。 コア言語はこれらのアノテーションに対して何の意味も割り付けません () が、一部の標準ライブラリモジュールでは 割り付けを行っているものがあります(may do so)。 たとえば汎関数(generic functions)はこれを利用することがあります。 その構文は読みやすいものです:

    def foobar(a: Integer, b: Sequence) -> String:
        ...
    
  • New metaclass syntax. Instead of setting a variable __metaclass__ in the body of a class, you must now specify the metaclass using a keyword parameter in the class heading, e.g.:

    新しいメタクラス構文。 クラス本体にある __metaclass_ という変数に設定することによるのではなく、 クラス定義の頭書きでキーワード引数を使ってメタクラスを指定しなければなりません。

    class C(bases, metaclass=MyMeta):
        ...
    
  • Custom class dictionaries. if the metaclass defines a __prepare__() method, it will be called before entering the class body, and whatever it returns will be used instead of a standard dictionary as the namespace in which the class body is executed. This can be used, amongst others, to implement a "struct" type where the order in which elements are defined is significant.

    メタクラスが __prepare__()メソッドを定義していた場合、 そのメソッドはクラス本体に入る前に呼び出されます。 そして、クラス本体が実行された状態での名前空間であるかのように 標準辞書(standard dictionary)の代わりに使用されます。 このメソッドはこの他にも 要素が定義された順番が非常に重要であるような"struct"型 を実装するのにも使用することができます。

  • You can specify the bases dynamically, e.g.:

    ベースクラスを動的に指定することができます。 例を挙げましょう:

    bases = (B1, B2)
    class C(*bases):
        ...
    
  • Other keyword parameters are also allowed in the class heading; these are passed to the metaclass' __new__ method.

    この他のキーワード引数をクラスの頭書き(class heading)で使うことも許されます。 それらはそのメタクラスの __new__ メソッドに渡されます。

  • You can override the isinstance() and issubclass() tests, by defining class methods named __instancecheck__() or __subclasscheck__(), respectively. When these are defined, isinstance(x, C) is equivalent to C.__instancecheck__(x), and issubclass(D, C) to C.__subclasscheck__(D).

    __instancecheck() や __subclasscheck()__ というクラスメソッドを定義することによって、 isinsntac()とかissubclass()によるテストをオーバーライドすることができます。 これらのクラスメソッドが定義されたときには、 isinstance(x, C) は C.__instancecheck__(x)と、 issubclass(D, C) は C.__subclasscheck__(D)と等価になります。

  • Voluntary Abstract Base Classes (ABCs). If you want to define a class whose instances behaves like a mapping (for example), you can voluntarily inherit from the class abc.Mapping. On the one hand, this class provides useful mix-in behavior, replacing most of the functionality of the old UserDict and DictMixin classes. On the other hand, systematic use of such ABCs can help large frameworks do the right thing with less guesswork: in Python 2, it's not always easy to tell whether an object is supposed to be a sequence or a mapping when it defines a __getitem__() method. The following standard ABCs are provided: Hashable, Iterable, Iterator, Sized, Container, Callable; Set, MutableSet; Mapping, MutableMapping; Sequence, MutableSequence; Number, Complex, Real, Rational, Integer. The io module also defines a number of ABCs, so for the first time in Python's history we will have a specification for the previously nebulous concept file-like. The power of the ABC framework lies in the ability (borrowed from Zope interfaces) to "register" a concrete class X as "virtually inheriting from" an ABC Y, where X and Y are written by different authors and appear in different packages. (To clarify, when virtual inheritance is used, the mix-in behavior of class Y is not made available to class X; the only effect is that issubclass(X, Y) will return True.)

    Voluntaryな抽象ベースクラス(ここでのVoluntaryとは 「意志を働かせることのできる, 自決力のある」 とか「自然に起こる, 思わず生じる」か?) もしあなたがたとえばマッピング(mapping)のような振る舞いをするインスタンスを 所有するクラスを定義したいのであれば、abc.Mappingクラスからvoluntuaryに継承することができます。 ある面で、このクラスは便利なミックスイン(useful mix-in)を提供し、旧来の UserDictやDictMixinクラスの機能を置き換えるものです。 もう一方では、このようなABCのシステマチックな使用は 少ない guesswork で正しいこと(right thing)を行う大きなフレームワークを助けます。 Python 2では、オブジェクトに対してそのオブジェクトが __getitem__()メソッドを定義しているときに シーケンスやマッピングをサポートしているものかどうかを問い合わせることが 必ずしも簡単なことではありませんでした。標準のABCは以下のものをサポートしています: Hashable, Iterable, Iterator, Sized, Container, Callable; Set, MutableSet; Mapping, MutableMapping; Sequence, MutableSequence; Number, Complex, Real, Rational, Integer. ioモジュールもまた多くのABCを定義しているので、ファイルのような以前は混乱していた コンセプトに対してしっかりとした仕様(specification)を与えることができるようになりました。 ABCフレームワークの力というものは、 別々の作者によって作成され別々のパッケージに存在しているクラスXとYについて、 "virtually inheriting from" ABC Y であるかのように 具象クラスXを“登録”(register)できるという(Zope interfacesから借りてきた)能力に根ざしたものです (わかりやすさのために、vitural inheritanceが使われた場合、 クラスYのミックスイン動作はクラスXでは使用可能になりません issublcass(X, Y)だけがTrueを返すでしょう)。

  • To support the definition of ABCs which requires that concrete classes actually implement the full interface, the decorator @abc.abstractmethod can be used to declare abstract methods (only in classes whose metaclass is or derives from abc.ABCMeta).

    インターフェースを実際にフルに実装する 具象的なクラス(concrete classes)を必要とするような ABC(抽象ベースクラス)の定義をサポートするために、 @abc.abstractmethod というデコレータを 抽象メソッドを宣言するのに使うことができます (メタクラスを有するクラスの中、もしくはabc.ABCMetaから導出されたクラスの中でのみ 有効です)。

  • Generic Functions. The inclusion of this feature, described in PEP 3124, is somewhat uncertain, as work on the PEP seems to have slowed down to a standstill. Hopefully the pace will pick up again. It supports function dispatch based on the type of all the arguments, rather than the more conventional dispatch based on the class of the target object (self) only.

    汎関数。 この機能のinclusionはPEP 3124の中にあり、確定していない事項です。 該当のPEPに関する作業はスローダウンしているように見受けられます。 願わくばそのペースが回復することを。 ターゲットとなるオブジェクト(self)のクラスのみに基づく よりconventionalなディスパッチではなく、 すべての引数の型に基づく関数ディスパッチをサポートします。

オールスターゲーム(ただしメジャーリーグ)

ドジャースの斎藤隆投手が見事選出されたそうで。 ベイスターズファンとしてはちと複雑な気持ちがしないでもないけど、 おめでとう。 → イチロー、斎藤が出場!松坂は落選 - MLBニュース : nikkansports.com

2007年07月01日

(う)さんが nmake test 通ったと日記に書いていたはずだけど この辺もいじってたのかな?

【ActiveScript】RubyをWindowsで使うスレ【GUI】 [bbs2chreader]
http://localhost:8823/thread/http://pc11.2ch.net/test/read.cgi/tech/1155031689/l50

230 デフォルトの名無しさん [sage] Date:2007/06/28(木) 21:22:32  ID: Be:
    Vista x64 にしたのですが、
    x64 用のバイナリってどこかで配布してないですか? 

231 デフォルトの名無しさん [sage] Date:2007/06/28(木) 21:39:17  ID: Be:
    >>230
    ないと思う。
    いまusaさんがtrunk向けに作業中。
    http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/31060 

232 ・∀・)っ-○◎● [] Date:2007/06/29(金) 03:05:34  ID: Be:
    お荷車がLLP64にまともに対応してないし。 

233 デフォルトの名無しさん [sage] Date:2007/06/29(金) 14:11:40  ID: Be:
    >>232
    そうなの? 具体的にどの辺が? 

236 ・∀・)っ-○◎● [] Date:2007/07/01(日) 17:49:21  ID: Be:
    鬼車はね、sizeof (long) == sizeof (void*) きめうちなんだよな。
    longが32ビットでポインタが64ビットのWin64(x64)のプログラミング
    モデルをまともに想定してない。
  

ひろゆきの例の本

扶桑社の新書で出た例の奴。 ヒゲメガネ;)氏との対談も結構面白く読めた。 あろはさんには名指しで「読んどけ」と云っておこう(笑)
2ちゃんねるはなぜ潰れないのか?
2ちゃんねるはなぜ潰れないのか?

あ、アサマシリンクを踏む必要はまったくないので念のため(笑)

機種変

電話予約が7分ほどでほとんど瞬殺になってしまった Advanced W-ZERO3[es]ですが、アキバのヨドバシで手続きを済ませる ことができました。 実はアキバヨドバシの前に、石○とかいったんですけど、 大々的に宣伝しているくせに「受け付けているのは新規契約だけです」 とつれない返事ばかり。 アキバヨドバシには他のものを買いに行ったのですが、 一回一階でこれまた大々的に宣伝していたので、係員をつかまえて 今使っている初代W-ZERO3から機種変更で買いたいんだけど申し込めるか? と訊ねたところ、「契約の形態によっては契約の変更が必要な場合も あるが、基本的には機種変更での予約も受け付けている」 という返事だったので、早速申し込みますた。 一応7/19(初日)に受け取れるようだけど、さて。

莫迦でも××でも

まあ受け取る側がどう受け取るかの問題ではあるけど、 使わないほうが無用な摩擦は避けられるだろう。

江戸の落語で使われている場面があるとか聞いたことがあるような気がするけど 調べたのは昔のことで覚えてない。

Re: いまさら読んだが、最高に刺激的

もしやと思って確かめてみたら、積読の山の中にあった(苦笑) → Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術

待ち行列での順位を上げておこう(笑)

なきゃあ自分で作りますが

自由ソフトウェアとして公開・配布されている Windowsで使えるエディタコンポーネントの類ってないですかね。 シェアウェアだとあるみたいなんですが、 ソースが公開されてないんじゃどうも。

xyzzyのソースでも参考にして作るしかないかなあ。やっぱし。

続・身の振り方を考える

greentea師匠の反応がいただけたようなので。

バカが征く
http://www.jitu.org/~tko/cgi-bin/bakagaiku.rb?bakaid=20070629

確かに、オープンソースがプログラマ自身の首を絞めてる
側面はあるかもしれません。でも、こうした流れは避け
られないっていうか。ソフトウェアでそれが顕著に目立って
いるだけで、他の分野でもそうなっていくことは十分
考えられますよね。

たとえばサッカーにしても、最初のころは英国、そして
欧州しか競争相手がいなかったけど、それが今じゃ南米や
アフリカといったところも強くなっている。これは
サッカーがコモディティ化したから起きた競争ともいえる
わけです。そうした物事の広まり方が、昔と比べると
格段に早くなってるわけで。それはソフトウェアだけの
話じゃないわけでしょう。

だから結局、ソフトウェアだけの話じゃなくって、競争を
避けるか、それとも負けを覚悟して競争するかしかないん
ですよね。

  
バカが征く
http://www.jitu.org/~tko/cgi-bin/bakagaiku.rb?bakaid=20070630


自分は楽観的に『プログラマが足りてない』っていってる
わけじゃないのね。前よりもドメインの知識が求められる
だろうし、OSSを中心とした汎用品の知識も求められる
だろうし。だから、この『足りてないプログラマ』の像、
これから求められるプログラマ像っていうのは、これ
までの像とは違うかもしれない。その像に合わない人
たちは、インドやどこかの人に置き換わっちゃうかも
しれない。
  

はい。物事には二面性があるわけで、前回のエントリで引用した ものはそろって、ダークサイドよりの話であったわけですが、 わたし自身はそれを悲観しているだけでもありません。

そもそも「これを覚えておけば定年まで安心」なんてものは最初から ありはしないわけですし、マグロや鮫のように、泳ぐのをやめてしまうことは 停滞(=死)ですらあるわけです。 大リーグボール1号が打たれたら2号、2号がダメなら3号とか、 ハイジャンプ魔球がだめなら大回転魔球と あらたなヒッサツワザを編み出すのはそりゃあ大変でしょうが (最後には破滅の音がするかもしれないし)、 今のところはついて行く気はあります。

とはいうものの、多少は楽できたらいいよね。 などというスケベ根性もあったりするわけですが。


前の月へ 2007年6月
次の月へ 2007年8月

ホームへ

ホームへ


Copyright (C) 2007 KIMURA Koichi (木村浩一)
この文書の無断転載はご遠慮ください(リンクはご自由にどうぞ)。

メールの宛先はこちらkbk AT kt DOT rim DOT or DOT jp