2013年2月13日

Microsoft Monthly Update 2013/02

今日はMicrosoftのセキュリティアップデートの日です。
MS13-009
MS13-010
MS13-011
MS13-012
MS13-013
MS13-014
MS13-015
MS13-016
MS13-017
MS13-018
MS13-019
MS13-020

2013年2月2日

2013年1月28日

[書籍]SQLアンチパターン

MARUZEN&ジュンク堂書店 渋谷店SQL Antipatterns (amazon)の翻訳である

SQLアンチパターン (amazon)/Bill Karwin著/児島修訳/和田卓人、和田省二監訳/オライリージャパン/ISBN 978-4-87311-589-4/3,360円

を購入。

RAD Studio/Delphi/C++Builder XE3 Help Update 3

RAD Studio/Delphi/C++Builder XE3 Update 2の一部としてRAD Studio/Delphi/C++Builder XE3のHelp Update 3がリリースされています。ただしRAD Studio/Delphi/C++Builder XE3 Update 2をインストールする前にHelp Update 2もアンインストールしておかないとヘルプが更新されないようです。また現時点(2013/01/28)で日本語のReadme(リリースノート)も公開されていないようです。

リリース ノート: Delphi XE3 および C++Builder XE3 Help Update 3 - RAD Studio XE3 (en)

元ねたは新井さんtweet

2013/02/17追記: 日本語のリリースノートが公開されました。

2013/02/28追記: RAD Studio/Delphi/C++Builder XE3のHelp Update 3が単独でもリリースされています。

29324 Help Update 3 for Delphi, C++Builder and RAD Studio XE3

2013年1月25日

RAD Studio/Delphi/C++Builder XE3 Update 2

RAD Studio/Delphi/C++Builder XE3のUpdate 2がリリースされています。

29294 Update 2 for Delphi, C++Builder and RAD Studio XE3
29291 Delphi XE3 and C++Builder XE3 ISO (includes Update 2)

RAD Studio XE3/Delphi XE3/C++Builder XE3 Update 2

XE3 Update 2 のリリース ノート - RAD Studio XE3 (en)

RAD Studio XE3(Delphi XE3/C++Builder XE3) Update 2 における不具合修正リスト (en)

2013/01/28追記: RAD Studio/Delphi/C++Builder XE3 Update 2にはHelp Update 3が含まれています。Update 1およびHelp Update 1/2をアンインストールしてから改めてUpdate 2をインストールする必要があります。

2013年1月15日

Microsoft OOB Update 2013/01

Microsoftの定例外のセキュリティアップデートがリリースされています。
MS13-008

2013年1月12日

Firebirdロードマップ(2013/01)

Firebirdのロードマップが更新されています。

Firebird: Roadmap

てきとうな要約:
  • 2.0 - 2.0.7(2012/04)が最終版で今後更新されることはない。
  • 2.1 - 2.1.5(2012/06)が最新版で、年1回のメンテナンスサイクルでのリリースが宣言されている。次のリリース(2.1.6)は2013年のQ3を予定。
  • 2.5 - 2.5.2(2012/11)が最新版で、バグフィックスを最優先で行っており、年2回のメンテナンスサイクルでのリリースが宣言されている。次のリリース(2.5.3)は2013年のQ2を予定。
  • 3.0 - 次のマイルストーンリリースで、現在鋭意開発中。α1リリースを2013年のQ1に計画。キーポイントは以下の通り。
    • 新しい認証サブシステム、構成サブシステムを含む、改訂されたアーキテクチャ
    • 共有ページキャッシュを備えた(SMP/マルチコアと親和性のある)スケーラブルなマルチスレッドエンジン
    • 新しいシステムテーブル、モニタテーブルを備えた新しいODS(Version 12)
    • JavaやC++などによる外部ストアドプロシージャ、トリガ、関数
    • 作り直されたオプティマイザと新しいデータアクセスメソッド
    • セキュリティの強化
    • さまざまなSQL拡張
    ただし最終的な機能セットについてはまだ合意に至っていない。

2013年1月9日

Microsoft Monthly Update 2013/01

今日はMicrosoftのセキュリティアップデートの日です。
MS13-001
MS13-002
MS13-003
MS13-004
MS13-005
MS13-006
MS13-007

2012年12月25日

[書籍]デバッグの理論と実践

MARUZEN&ジュンク堂書店 渋谷店Why Programs Fail, 2nd Editionの翻訳である

デバッグの理論と実践 (amazon)/Andreas Zeller著/今田昌宏、大岩尚宏、竹田香苗、宮原久美子、宗形紗織訳/中田秀基監訳/オライリージャパン/ISBN 978-4-87311-593-1/3,360円

を購入。

2012年12月24日

[eBook]Parallel Programming with OmniThreadLibrary

LeanpubでPrimoz GabrijelcicさんによるDelphi上のマルチスレッドライブラリOmniThreadLibrary(OTL)の解説書である

Parallel Programming with OmniThreadLibrary/Primoz Gabrijelcic著/Leanpub/30.00USD

を購入(PDF/EPUB/MOBIをダウンロード可能)。

この本は現在も執筆中で、状況はThe Delphi Geek: Parallel Programming with OmniThreadLibrary – Current Statusで確認できます。現時点(2012/12/24)ではだいたい半分ちょっとまで書き進んだ感じです。

2012年12月19日

IDE Fix Pack 5.2

Andreas HausladenさんIDE Fix Pack 2009-XE2がアップデートされてVersion 5.2になっています。Delphi 2009用のIDE Fix PackがWindows 8上でクラッシュする問題が修正されています(Delphi 2009以外のものは5.1のままです)。

IDE Fix Pack 5.2 for Delphi 2009 – Windows 8 fix | Andy's Blog and Tools

2012年12月12日

2012年12月10日

RAD Studio/Delphi/C++Builder XE3 Update 1

RAD Studio/Delphi/C++Builder XE3のUpdate 1がリリースされています。

28984 Delphi XE3 and C++Builder XE3 ISO (includes Update 1)
28985 Delphi XE3 and C++Builder XE3 ISO (includes Update 1)

Update 1 for RAD Studio XE3, Delphi XE3 and C++Builder XE3
RAD Studio XE3/Delphi XE3/C++Builder XE3 Update 1

RAD Studio XE3(Delphi XE3/C++Builder XE3) Update 1 における不具合修正リスト (en)

C++Builder 64 ビット Windows 版のリリース ノート - RAD Studio XE3 (en)
リリース ノート: Delphi XE3 および C++Builder XE3 Help Update 2 - RAD Studio XE3 (en)

C++Builder XE3のWindows x64版に関係するオンラインヘルプの項目:2013/01/21追記: XE3 Update 1にはXE3 Help Update 2が含まれているようです。関連リンクを追加しました。

OVERFLOWCHECKS/RANGECHECKSオプションの効果

このアーティクルはDelphi Advent Calendar 2012に参加しています(7日ぶり2回目)。

Delphiにはオーバフローチェックと範囲チェックというコンパイラオプションがあります。

オーバーフローのチェック(Delphi) - RAD Studio XE3
範囲チェック - RAD Studio XE3

いずれもプロジェクトオプションのコンパイラで指定するか、{$OVERFLOWCHECKS ON|OFF}{$RANGECHECKS ON|OFF}で任意の範囲に対して指定することができます。しかしデフォルトの状態ではどちらもOFFなので、ONにした場合の

オーバーフローのチェックを有効にすると,プログラムは遅くなり,またいくらか大きくなるため,{$Q+} はデバッグにのみ使用してください。

範囲チェックを有効にすると、プログラムの処理速度が遅くなり、サイズも多少大きくなります。

が実際にどのようなことを示しているのかを知っている人は意外に少ないのではないでしょうか。そこでこれらのオプションによるペナルティがどのようなものなのかを確認してみます(Delphi XE2/Windows x86/Debugビルドで検証)。

まず{$OVERFLOWCHECKS ON}(短縮形{$Q+})です。
var
  a: Integer;
  b: Integer;
  c: Integer;
begin
{$OVERFLOWCHECKS ON}
  a := $44444444;
  b := $44444444;
  c := a + b;
{$OVERFLOWCHECKS OFF}
end;
このコードは以下のように展開されます。

Unit1.pas.36: a := $44444444;
0051139C C745F844444444   mov [ebp-$08],$44444444
Unit1.pas.37: b := $44444444;
005113A3 C745F444444444   mov [ebp-$0c],$44444444
Unit1.pas.38: c := a + b;
005113AA 8B45F8           mov eax,[ebp-$08]
005113AD 0345F4           add eax,[ebp-$0c]
005113B0 7105             jno $005113b7
005113B2 E8BD39EFFF       call @IntOver
005113B7 8945F0           mov [ebp-$10],eax
赤で示した2行が{$OVERFLOWCHECKS ON}で追加される命令になります。直前のadd命令の結果、OF(overflow flag)がセットされていればIntOver(System.pasのprocedure _IntOver)を呼び出して例外EIntOverflowが生成されます。{$OVERFLOWCHECKS ON}とすることで、特定の整数算術演算(+,-,*,Abs,Sqr,Succ,Pred,Inc,および Dec)毎にこのコードが追加で生成される、ということのようです。

一方{$RANGECHECKS ON}(短縮形{$R+})ですが、これには配列および文字列の添字のチェックとスカラ型/部分範囲型変数への代入時の範囲チェックの2つの効果があります。まず添字のチェックですが、ちょっとわかりづらいので{$RANGECHECKS OFF}のものと両方を並べてみます。
var
  s: String;
  c: Char;
begin
  s := 'TEST';
  c := s[6];
{$RANGECHECKS ON}
  c := s[6];
{$RANGECHECKS OFF}
end;
このコードは以下のように展開されます。

Unit1.pas.52: c := s[6];
00511464 8B45F8           mov eax,[ebp-$08]
00511467 668B400A         mov ax,[eax+$0a]
0051146B 668945F6         mov [ebp-$0a],ax
Unit1.pas.54: c := s[6];
0051146F B806000000       mov eax,$00000006
00511474 8B55F8           mov edx,[ebp-$08]
00511477 48               dec eax
00511478 85D2             test edx,edx
0051147A 7405             jz $00511481
0051147C 3B42FC           cmp eax,[edx-$04]
0051147F 7205             jb $00511486
00511481 E8E638EFFF       call @BoundErr
00511486 40               inc eax
00511487 668B4442FE       mov ax,[edx+eax*2-$02]
0051148C 668945F6         mov [ebp-$0a],ax
{$RANGECHECKS OFF}の場合は単に文字列の格納されているアドレスに添字-(1*SizeOf(Char))を足した場所にアクセスしているだけですが、{$RANGECHECKS ON}では空文字列かどうかのチェック(赤字)と文字列長以内かどうかのチェック(青字)が行われていることを含め、添字の一時的なデクリメント(文字列の添字が1オリジンなので)など、結構複雑な処理が行われていることがわかります(こちらは例外ERangeErrorが生成されます)。

最後に部分範囲型の変数への代入を見てみます。
type
  TSubInt = 8..15;
var
  a: TSubInt;
  b: TSubInt;
  c: TSubInt;
begin
{$RANGECHECKS ON}
  a := 8;
  b := 8;
  c := a + b;
  a := 9;
  b := 8;
  c := a - b;
{$RANGECHECKS OFF}
end;
加算と減算の両方を確認してみます。

Unit1.pas.69: a := 8;
005114D8 C645FB08         mov byte ptr [ebp-$05],$08
Unit1.pas.70: b := 8;
005114DC C645FA08         mov byte ptr [ebp-$06],$08
Unit1.pas.71: c := a + b;
005114E0 33C0             xor eax,eax
005114E2 8A45FB           mov al,[ebp-$05]
005114E5 33D2             xor edx,edx
005114E7 8A55FA           mov dl,[ebp-$06]
005114EA 03C2             add eax,edx
005114EC 83C0F8           add eax,-$08
005114EF 83F807           cmp eax,$07
005114F2 7605             jbe $005114f9
005114F4 E87338EFFF       call @BoundErr
005114F9 83C008           add eax,$08
005114FC 8845F9           mov [ebp-$07],al
Unit1.pas.72: a := 9;
005114FF C645FB09         mov byte ptr [ebp-$05],$09
Unit1.pas.73: b := 8;
00511503 C645FA08         mov byte ptr [ebp-$06],$08
Unit1.pas.74: c := a - b;
00511507 33C0             xor eax,eax
00511509 8A45FB           mov al,[ebp-$05]
0051150C 33D2             xor edx,edx
0051150E 8A55FA           mov dl,[ebp-$06]
00511511 2BC2             sub eax,edx
00511513 83C0F8           add eax,-$08
00511516 83F807           cmp eax,$07
00511519 7605             jbe $00511520
0051151B E84C38EFFF       call @BoundErr
00511520 83C008           add eax,$08
00511523 8845F9           mov [ebp-$07],al
加算、減算とも計算後に一時的に部分範囲の最小値を引いて、部分範囲におさまっているかどうかのチェックを行い(赤字)、改めて最小値を足す(青字)など、これもまた複雑な処理になっています。

ということで、オーバフローチェックはFLAGSレジスタのOFを検査するだけなので比較的ペナルティは小さく、オーバフローを検出したい状況では積極的にONにしても問題なさそうです。一方範囲チェックは範囲の最小値が0でないと処理が複雑になることもあり、明示的に必要な範囲チェックのコードを記述したほうがいいような気もします。