Memo

出典: やる気向上作戦

KnowledgeBase


目次

CPANによるoutdatedパッケージのアップデート

perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'

(61)Connection refused: connect to listener on 0.0.0.0:80

Apach2のログファイルに、こんなエラーが大量出現。 httpd.confの

Listen 80

Listen globalIPAddress:80

に変更することで解決。Jail環境特有の問題か?

nucleus on PHP5.0.5

  • BLOG.php
  • ADMIN.php
  • install.php

に、Fatal error: Only variables can be passed by referenceを起こす場所が存在。

http://forum.nucleuscms.org/viewtopic.php?t=7772&sid=3dc22c296ca6b43f3101b47684b8562f を参照。

PHP5.1, PHP5.0.5, PHP4.4.0 へのアップグレード時の注意点

  • Fatal error: Only variables can be passed by reference が頻発!
  • 引数参照渡しの関数に、別の関数の出力をそのまま渡したりすると起こる。
  • 解決方法は、値を一旦変数に格納してから、引数参照渡しの関数に与えること。

MySQL4.1覚書

  • client, mysqld, mysql, mysqldumpそれぞれに、default-chracter-set=utf8追加。
  • 既存アプリとの互換性のために、mysqldに、init-connect=SET NAMES utf8追加。

NetGenesis OPTG5に割り当てられたWAN側IPアドレスを取得するスクリプト

#!/bin/sh
STATUSPAGE=`curl -s -s --user ユーザ名:パスワード http://192.168.0.1/jp/jp-pppoecontrol.html | nkf -e`
echo -n $STATUSPAGE | sed -e "s/.*取得した自IPアドレス<\/TD><TD>:<\/TD><TD>
\([[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\)<\/TD><\/TR>.*/\1/"

Antのxsltで「javax.xml.transform.TransformerConfigurationException: translet クラスXXXをロードできませんでした」なるエラーが出る場合

Xalan-JをダウンロードしてCLASSPATHを通す。

StreamTranscoderでcircular bufferがunderflowする場合

src/libtranscoder/transcurl.cppを修正。

cbuffer_init(XXX, chunkSize * 20);
cbuffer_init(XXX, 8192 * 20);

と記述されている部分を探し(複数存在)、第二引数をより大きな値に変更 (chunkSize * 100など)。

Debian Sarge上のDCCホームディレクトリ

/var/lib/dccがホームディレクトリ。

spamassassinと併用する場合、/etc/spamassassin/local.cfに

dcc_home /var/lib/dcc

と記述

SQLite3.1.3をWindowsでコンパイル

コンパイルエラーはstrcasecmp()のせい。

if( strcasecmp(zTable,"sqlite_sequence")!=0 ){
  fprintf(p->out, "%s;\n", zSql);
} else {
  fprintf(p->out, "DELETE FROM sqlite_sequence;\n");
}

if( _stricmp(zTable,"sqlite_sequence")!=0 ){
  fprintf(p->out, "%s;\n", zSql);
} else {
  fprintf(p->out, "DELETE FROM sqlite_sequence;\n");
}

に(VCの場合)。_stricmp()がない場合はsqlite3StrICmpを参考にするべし

スレッドセーフなUTCとローカル時刻の差(バイアス)の取得

UN*Xでは一般に、以下のようなテクニックが知られている。

time_t t;
struct tm tmlocal, tmutc;
time(&t);
return (
    (long long)mktime(gmtime_r(&t, &tmutc))
    - (long long)mktime(localtime_r(&t, &tmlocal))
);

ところが、Windowsではgmtime、localtimeのスレッドセーフ版がないため、上記テクニックを使えない。

※ 2005/2/15追記 上は全くの嘘です。少なくとも、VCのマルチスレッド版ランタイムを リンクすれば、localtimeもgmtimeもスレッドセーフ版の関数にすりかわります。

Win32APIを叩けばこんな感じで算出可能。

TIME_ZONE_INFORMATION tzinfo;
memset(&tzinfo, 0, sizeof(tzinfo));
DWORD dwResult = GetTimeZoneInformation(&tzinfo);
if (TIME_ZONE_ID_DAYLIGHT == dwResult) {
    return (long long)(tzinfo.Bias+tzinfo.DaylightBias) * 60;
} else {
    return (long long)(tzinfo.Bias+tzinfo.StandardBias) * 60;
}

lvをServices for UN*X 3.5でビルド

  • ./configure
  • MakefileのCFLAGSから、-DHAVE_SIGVEC を削除
  • console.c の、line 425~427をさっくり削除。具体的には以下三行
  ttyNew.c_cc[ VDISCARD ] = -1;
  ttyNew.c_cc[ VMIN ] = 1;
  ttyNew.c_cc[ VTIME ] = 0;
  • make

SFUのLANGは標準的な形式でないため、lvが漢字をまともに表示してくれない。

alias lv='LANG=ja_JP.SJIS lv -Os'

なるエイリアスを定義しておくと便利。

Content-EncodingがgzipのHTTPメッセージボディを、Zlibでデコードする手順

gzio.c内に参考となるコードあり。 大まかな手順としては、

  1. zipのヘッダをスキップ(gzio.cのcheck_header参照)
  2. inflateInit2のwindowBitsに負の値を与えて呼び出す(deflateヘッダのパースをスキップする)
  3. は普通にinflateでデコード

プログラム内から起動したプロセスのstdinにデータを流す手順

  1. STARTUPINFOに、STARTF_USESTDHANDLESを指定する
  2. CreatePipeで作成するプロセスのstdout, stderr, stdinに接続するパイプを作る
  3. STARTUPINFOの、hStdInput, hStdOutput, hStdErrorに上記ハンドルを入れる。
  4. CreateProcess関数を、bInheritHandles=TRUEで呼び出す
  5. パイプを使って、入出力を行う
  6. (重要)nkfやchasenなどの標準入力をバイナリモードに切り替えずに読み込むフィルタプログラムを起動する場合、必ず相手の標準入力に接続されたパイプに、0x1a(EOFコード)を書き込まなければならない。これをしないと、相手は入力の終端を検出できず、いつまでたっても終了しない。
  7. FlushFileBuffers関数を使って、バッファリングされているデータをフラッシュ
  8. DisconnectNamedPipeを呼び出し、パイプの接続を解除する
  9. CloseHandleでハンドルを後始末

MPEG4ip 0.9.9をWindowsでコンパイルする際の注意点-もう1.0がリリースされてるっての

  • 開けないdspは改行文字がLF。CRLFに直すと開ける。
  • VC6からVC7以降のプロジェクトファイルに変換した場合、Xvid_stに含まれるasmファイルのカスタムビルドステップコマンドラインが不正になる。-o の後のダブルクォーテーションを修正せよ。また、nasm.exeにオプション→VC++ディレクトリ→実行可能ファイルでパスを通せ。
  • SDLのdx5audio.cに、パッチマージ時のゴミが一箇所ある。エラー行の末尾の+以降。消すべきなのかどうかは判断つかず。
  • ISO MPEG4エンコーダのストリーム関連ヘッダが古い形式。#include <iostream.h>等を#include <iostream> に変更し、using namespace std;を追加すべし。

TCHARと_TCHARについて

TCHARは、windows.hで定義され、プリプロセッサシンボル UNICODE が定義されている場合は WCHAR, 定義されていない場合は CHAR にマップされる。 同じく window.h にて、LPCTSTR, LPTSTR が、それぞれ const TCHAR*, TCHAR* として定義されている。

一方_TCHARは tchar.h で定義され、プリプロセッサシンボル _UNICODE が定義されている場合は wchar_t, 定義されていない場合は char にマップされる。

一般に TCHAR はWin32 APIで用いられ、_TCHARは Microsoft C Runtime Libraryで用いられることに注意。プログラムをユニコード環境でコンパイルする場合は、あらかじめ文字型をWCHAR, wchar_tに統一するか、あるいは UNICODE, _UNICODEの両方を定義することが望ましい。

個人用ツール