2007-04-10
● [プログラミング] 2GBの壁
今更ながら、2年前に導入された職場内のAIXサーバ(32bit)が2GBを超えるファイルの取り扱いに対応していないということで、先週末あたりからバージョンアップを試行中。
Linuxと違ってサポート情報が限られている(というかやっぱりユーザ数が圧倒的に少ない??)ので結構面倒だけど、それでも最近はAIXでもrpmが使えるようになってきたのでまだマシか。
- Apache
- 2GB問題にはversion 2.2.0から対応。まぁこれは普通にconfigureしてmakeしたらそこそこすんなり動いた。
- PHP
- Apacheのバージョンアップに伴って、4系の最新版の version 4.4.6 をインストールしようとするも、make install のスクリプトがおかしい。make でバイナリ (libphp4.so) 自体は生成されるので、cp -p で手でインストール。rpm パッケージ化すると便利かなと一瞬血迷いそうになったけど、httpdなどのいわゆる依存パッケージがrpm管理されていないのにphpだけrpm化するわけにもいかず。
- ユーザ部署からproc_openがおかしいと言われて、見てみるとなんだかproc_openでNULL(相当のモノ)が返ってきている。さんざん悩んだけど、stderrをファイルに接続していて、ファイルのパーミッション不足だということが判明。PHP_FUNCTION(proc_open)のソースまで読んじゃったよ。
- Wget
- version 1.10 から対応。1.10.1 からファイルサイズの表示にlocaleconv関数を使っていて、どうやらlconv->groupingにNULLが返ってきているのにstrdupしようとして、しかもstrdupもNULLを返して…といったバグ(というか単にAIXに対応してないだけ?)があってver 1.10.2を使えない。これもパッチを書いて回避。
- 実はWgetってソフトウェアの名称としてはwgetじゃなくてWgetだって知ってました?
…なんてなことをして、夜の業後を費やしているわけです。 エラーメッセージも並記しておくと後で役に立つかなぁと思うので、またそのうちメモします。
Wgetのパッチはこんな感じ:
diff -rc src.original/ptimer.c src/ptimer.c *** src.original/ptimer.c Wed Jul 6 15:26:18 2005 --- src/ptimer.c Tue Apr 10 11:41:05 2007 *************** *** 173,180 **** { /* If no clock was found, it means that clock_getres failed for the realtime clock. */ ! logprintf (LOG_NOTQUIET, _("Cannot get REALTIME clock frequency: %s\n"), ! strerror (errno)); /* Use CLOCK_REALTIME, but invent a plausible resolution. */ posix_clock_id = CLOCK_REALTIME; posix_millisec_resolution = 1; --- 173,180 ---- { /* If no clock was found, it means that clock_getres failed for the realtime clock. */ ! /* logprintf (LOG_NOTQUIET, _("Cannot get REALTIME clock frequency: %s\n"), ! strerror (errno)); */ /* Use CLOCK_REALTIME, but invent a plausible resolution. */ posix_clock_id = CLOCK_REALTIME; posix_millisec_resolution = 1; Only in src.original: topas.error diff -rc src.original/utils.c src/utils.c *** src.original/utils.c Mon Jun 27 14:12:20 2005 --- src/utils.c Tue Apr 10 11:41:05 2007 *************** *** 1206,1212 **** setlocale (LC_NUMERIC, ""); lconv = localeconv (); cached_sep = xstrdup (lconv->thousands_sep); ! cached_grouping = xstrdup (lconv->grouping); /* Restore the locale to previous setting. */ setlocale (LC_NUMERIC, oldlocale); if (!*cached_sep) --- 1206,1215 ---- setlocale (LC_NUMERIC, ""); lconv = localeconv (); cached_sep = xstrdup (lconv->thousands_sep); ! if (lconv->grouping) ! cached_grouping = xstrdup (lconv->grouping); ! else ! cached_grouping = "\x03"; /* Restore the locale to previous setting. */ setlocale (LC_NUMERIC, oldlocale); if (!*cached_sep)
[ツッコミを入れる]