« 2009年8月 | メイン | 2009年10月 »

2009年9月

2009年9月26日 (土)

IE8のダウンロードをブロック

まだまだ信頼できないので、IE8のダウンロード通知(アップデート通知)をブロックした。

Microsoftから「Internet Explorer 8 自動配布の無効化ツールキット (Blocker Toolkit)」をダウンロード。このツールは64ビット版でも動作可能。

解凍したファイルの中から、以下のコマンドを実行

IE80Blocker.cmd /B

パラメータは以下のとおり。再開したい場合は、/Uオプションで解除。

/B ・・・Blocks distribution

/U ・・・Unblocks distribution

このコマンドはレジストリに以下のキーを追加する。

Registry key

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Setup\8.0

Key value name

DoNotAllowIE80、DoNotOfferIE80RTM

詳しくはツールに添付のIE80BlockerHelp.htm を参照(英語)。

2009年9月15日 (火)

VC++2005、fatal error LNK1120: 外部参照 2 が未解決です。

VC++2005 File I/Oのサンプル。ifstreamバージョン

新規プロジェクト作成後、追記

#include "stdafx.h"

#include <stdio.h>

#include<iostream>

#include <fstream>

#include <Windows.h> // for messagebox

using namespace System;

using namespace std;

char Sentences[10][128];

int main(array<System::String ^> ^args)

{

ifstream fin;

int i;

fin.open(".\\ReadMe.txt");

if(fin.fail()){

//WinAPIのMessageBox

::MessageBox(NULL,"ファイルをオープンできません","caption", MB_OK);

fin.close();

return 1;

}

i = 0;

while(!fin.eof()){

fin.getline(&Sentences[i][0], 80);

i++;

if (i == 10) break; // Read 10 lines

}

fin.close();

return 0;

}

ここで注意。

MessageBoxで以下のようなエラーが出る場合の対処法。

dummy.obj : error LNK2028: 未解決のトークン (0A000028) "extern "C" int __stdcall MessageBoxA(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBoxA@@$$J216YGHPAUHWND__@@PBD1I@Z) が関数 "extern "C" int __cdecl MessageBox(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PBD1I@Z) で参照されました。

dummy4.exe : fatal error LNK1120: 外部参照 2 が未解決です。

プロジェクトのプロパティを開く

 リンカ項目->入力->「追加の依存ファイル」->...クリック

 「親またはプロジェクトの規定値から継承」にチェック

OK->OKをクリック

CLRプログラムの場合、継承なし $(NOINHERIT) になっていてuser32.lib がリンクされないかららしい。

今日は2度も遭遇してしまった。

サンプルどおりに記述しているのに、Sentencesバッファにデータが読み込まれない場合の確認方法。

プロジェクトのプロパティを開く

 構成プロパティから全般を選択

 共通言語ランタイムサポート が 「共通言語ランタイムサポート(/clr)」 になっていること。「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」 になっていたら変更。

 OKをクリック

2009年9月 8日 (火)

/etc/cron.daily/prelink Abortedとなる

<環境> CentOS4 + prelink 0.3.3-1.EL4

8/24にprelinkがバージョンアップされて以来、8/25以降のcronのログに以下のエラーが出ていた。

/etc/cron.daily/prelink: line 47: xxxx Aborted /usr/sbin/prelink -av $PRELINK_OPTS >>/var/log/prelink.log 2>&1

prelinkは共有ライブラリ(shared library)をリンクしたプログラムの起動時間を短縮するため、プログラムからリンク情報を取り出し、事前にシンボル名やパスなどを解決し、ライブラリを仮想メモリ空間に配置しておくプログラム。

プログラムやライブラリのアップデートのたびprelinkしなおさなければならないため、毎日1回cronで実行されている。

ところが、8/24に次のバージョンのprelinkにアップデートされ、このエラーが吐き出されるようになった。当然prelinkも実行されない。

/var/log/yum.log

Aug 24 05:44:56 Updated: prelink.i386 0.3.3-1.EL4

/var/log/prelink.log を見ると、以下のようなコマンドを実行してAbortしている。

/usr/sbin/prelink -av -mR -f

Prelinking /usr/X11R6/lib/xscreensaver/hypertorus

/usr/sbin/prelink: /usr/X11R6/lib/xscreensaver/hypertorus: Cannot prelink against non-PIC shared library /usr/X11R6/lib/libGL.so.1

Prelink failed with return value 134

non-PIC shared library がprelinkできない、というのは既知の問題としてgentooのサイトに掲載されている。だが、今までもこれで問題なく動作完了していたし、もう1台のサーバーでは同じバージョンのprelinkが正常に動作しているので原因は他にありそうだ。

* libGL.soは、xorg-x11-Mesa-libGL に含まれており、デフォルトでX11に含まれているものはshared library ではないためprelinkできない。

すべてのprelinkをいったん元の状態に戻す。

http://www.astro.phys.s.chiba-u.ac.jp/~oda/html/linux_memo/linux_04_memo/linux_oct/prelink-howto.xml.html

# prelink -uma

/usr/sbin/prelink: /usr/local/lib/libpcre.so.0.0.1 is not present in any config file directories, nor was specified on command line

/usr/sbin/prelink: /usr/local/lib/libpcreposix.so.0.0.0 is not present in any config file directories, nor was specified on command line

/usr/sbin/prelink: /usr/local/pgsql/lib/libpq.so.5.0 is not present in any config file directories, nor was specified on command line

/usr/sbin/prelink: /usr/local/lib/libfreetype.so.6.3.11 is not present in any config file directories, nor was specified on command line

期待するパスにライブラリが存在しないといっているが、実際には存在している。ただ、とにかく何かまずいことになっているのだろう。これについては、別途rkhunterでチェックする。

この後、再度prelinkを実行

# /etc/cron.daily/prelink

(実際には、以下のコマンドを実行している。)

# /usr/sbin/prelink -av -mR -f

Prelinking /usr/X11R6/lib/xscreensaver/hypertorus

Abortせずに実行完了 lol

正常動作したようなので、あとはWatch

以下、prelinkのオプション。詳しくは man prelinkで。

オプション

内容

-R

ライブラリのアドレス順序がランダムになる buffer overflowに対するセキュリティ対策

-a

すべてのバイナリをprelink

-f

すでにprelinkされているバイナリも再度prelinkする 依存しているライブラリが変更された場合は、prelinkの上書きとなる

-m

仮想メモリ空間を確保

-u

prelinkしたバイナリやライブラリをprelinkする前の状態に戻す

* 全システムをprelinkするには最低50MBのフリースペースが必要

* position independent version libGL.soをインストールするか、libGL.soにパッチをあてれば、non-PIC shared library がprelinkできない問題は解決できる。

* 上記でだめなら、prelink -u を実行する

詳しくは、Gentoo Linux Prelinkガイド

2009年9月 7日 (月)

WebalizerでTruncating oversized・・・

<環境> CentOS 4.x, 5.x

たまにLogwatchにこんなWarningが吐き出されている。

/etc/cron.daily/00webalizer:

Warning: Truncating oversized request field [3009]

cronで1日に1回、webalizerがApacheのアクセスログを解析しているが、この時URIがあまりに長いと、このWarningを吐くようだ。

不正アクセスなどで長いURIが指定されることは実際あるし、Apacheでは255より長いURIへのアクセスは 403エラーになる(なぜか414ではなく)。

Forbidden

You don't have permission to access LOOO・・ONGURI

on this server

もしLogwatchのWarningがわずらわしい場合は、cronでのwebalizer実行時に、ReallyQuiet オプション (-Q コマンドラインスイッチ)をつければよい。

または、/etc/webalizer.conf を以下のように変更

#ReallyQuiet no

ReallyQuiet yes

ただし、

エラーメッセージ(この場合、エラーや警告すべてを含む)を非表示にさせると、webalizerのレポートがアップデートされなくなってしまった場合のエラーもキャッチ出来なくなる。また、webalizer.conf で指定したオプションは、コマンドラインから上書き指定できない。

詳しくは、The Webalizer を参照

2009年9月 2日 (水)

VBAで文字列を数値に変換

VBAでcsvファイルから読み込んだデータが、Excel2007でテキストと認識された。

csvファイルには、以下のように文字列と数値が混じっている。

name, 30, 73.2

このため、平均値を求めるAVERAGE関数やCOUNT関数、SUM関数などで値が0とみなされたり、数値データがないとみなされ"#DIV/0!" とエラー表示されてしまう。

確かにセルをみると、「'30」ではなく「30」と入力されているのに、左寄せになっている。文字とみなされている証拠だ。

以下、VBAでの回避方法

Range("A3:B10").Select '変換したいセルを選択

For Each XCell In Selection

If (xCell.Value) Then

xCell.Value = xCell.Value

End If

Next xCell

Selection.NumberFormat = "General" ' 書式を標準に設定

その他、文字列を数値に変換する方法は以下などを参考に

Microsoft サポートオンライン Excel で文字列を数値に変換する方法

2010年3月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

My Favorite Songs

  • My foolish heart
    Bill Evans Trio: Waltz for Deby (★★★★★)