2013年12月26日

[書籍]詳説 Cポインタ

MARUZEN&ジュンク堂書店 渋谷店Understanding and Using C Pointers (amazon)の翻訳である

詳説 Cポインタ (amazon)/Richard Reese著/菊池彰訳/オライリージャパン/ISBN978-4-87311-656-3/2,310円

を購入。

2013年12月25日

[書籍][ebook]プログラミングの魔導書 〜Programmers' Grimoire〜 vol.3

プログラミングの魔導書 ~Programmers’ Grimoire~ vol.3が発売されて、PDF版のダウンロードが可能になりました。

プログラミングの魔導書 ~Programmers’ Grimoire~ vol.3/ロングゲート/ISBN978-4-9905296-4-2(書籍版)、ISBN978-4-9905296-5-9(PDF版)/1,500円(書籍版)、1,000円(PDF版)

書籍版の受付は既に終了しており、現時点(2013/12/25)ではPDF版のみが購入可能です。

次号vol.4のサブタイトルは「The Art of Chaos ~混沌の秘訣~」とのこと。

2014/01/09追記: 書籍版が配送されてきました。

RAD Studio/Delphi/C++Builder XE5 Update 2 Hotfix 3

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

29675 Hotfix 3 for RAD Studio XE5 and Delphi XE5 Update 2

2013/12/27追記: TJPEGImage.Drawがスレッドセーフではないという問題があり、これを修正したJpeg.pasを再コンパイルするのに必要な.objファイル、ということのようです(QC#55871QC#108747QC#111209)。 %ProgramFiles%\Embarcadero\RAD Studio\12.0\source\vcl\jpg\obj あたりに配置するのがよさそうです。

2013年12月14日

[書籍]プログラミングC# 第7版

ブックファースト 新宿店Programming C# 5.0 (amazon)の翻訳である

プログラミングC# 第7版 (amazon)/Ian Griffiths著/鈴木幸敏、風間一洋、木村英一、黒川利明、頃末和義、佐藤嘉一、出葉義治、西山博泰、稲垣達夫訳/オレイリージャパン/ISBN978-4-87311-650-1/5,040円

を購入。

RAD Studio/Delphi/C++Builder XE5 Update 2 Hotfix 1/2

RAD Studio/Delphi/C++Builder XE5 Update 2のHotfix 1/2がリリースされています。Hotfix 1はDelphi/iOSデバイス用のライブラリファイル(libibtogo.a/libmidas.a/libpcre.a/libsqlib.a)が不足している問題、Hotfix 2はC++Bulder用のヘッダファイル(xmlutil.hpp)が不足している問題をそれぞれ解決します。

29667 Hotfix 1 for RAD Studio XE5 and Delphi XE5 Update 2
29668 Hotfix 2 for RAD Studio XE5, C++Builder XE5 Update 2

Team Japan » Delphi XE5 / C++Builder XE5 Update 2 および Hotfix 1, Hotfix 2 がリリースされました

2013年12月12日

IDE Fix Pack 5.4.1

Andreas HausladenさんIDE Fix Pack 2009-XE5がアップデートされてVersion 5.4.1になっています。RAD Studio XE5 Update 2でのコンパイラの変更に対応しているとのことです。

IDE Fix Pack 5.4.1 – Support for XE5 Updater 2 | Andy's Blog and Tools

2013年12月10日

第27回エンバカデロ・デベロッパーキャンプ

本日10:00から第27回エンバカデロ・デベロッパーキャンプが御茶ノ水ソラシティのソラシティカンファレンスセンターで行われます。セッション資料は

ダウンロード | デベロッパーキャンプ

からダウンロードできます。またUStreamで全セッションの中継が予定されています。

印刷されたセッション資料がないということはノートPCのバッテリが厳しいということでもあります。充電スペースがほしいなぁ。Cのほうの部屋の一番後ろに充電用のスペースが用意されてました。ありがたいですね。

ということで全セッション、懇親会とも無事に終了しました。セッションスピーカ、参加者、関係者の皆さん、おつかれさまでした。エンバカデロ・テクノロジーズさんは今週末お引っ越しとのことで大変なようですが、来週(2013/12/18)には迷惑を顧みずエンバカデロさん新オフィス見学会とDelphi 2013 忘年会などというものも企画されています。

2013/12/20追記: セッション資料がダウンロードできるようになっています。

第27回 エンバカデロ・デベロッパーキャンプ資料ダウンロード

2013/12/24追記: セッションリプレイの公開が始まっています。
  • 第27回 エンバカデロ・デベロッパーキャンプ - YouTube
  • 【C1】Delphi/C++チュートリアルセッション「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」
  • 【B1】Delphi/C++テクニカルセッション「誰でも始められるカンタンFireMonkey 3D入門」
  • 【C2】Delphiテクニカルセッション「基礎から学ぶビジュアルAndroidアプリ開発。今日からあなたもAndroidデベロッパー」
  • 【B2】Delphiテクニカルセッション「Delphiのマイグレーションを行うのであれば、これだけは知っておこう!」
  • 【G3】ジェネラルセッション「マルチ言語に広がるエンバカデロのマルチデバイス開発ソリューション」
  • 【C4】C++テクニカルセッション「C++Builderでモバイル開発にトライ!ベータ評価レポート」
  • 【B4】Delphi/C++テクニカルセッション「DataSnapユースケース研究 - 多層技術の概要と最適化、実践テクニック」
  • 【C5】モバイルセッション「PC向け開発からモバイル開発へ!実践モバイルファースト」
  • 【B5】C++テクニカルセッション「マルチデバイスプラットフォームを意識したC++アプリケーション設計」
  • 【G6】ライトニングトーク「共有!みんなの開発事例、開発経験、テクニック」

2013年12月3日

RAD Studio/Delphi/C++Builder XE5 Hotfix 2

RAD Studio/Delphi/C++Builder XE5のHotfix 2がリリースされています。Android上でアクセント付きの大文字が正しく描画されない問題とTListBoxGroupHeaderでドイツ語のß(U+00DF)を使用するとEArgumentOutOfRangeExceptionがraiseされる問題が修正されるとのことです。

29644 Hotfix 2 for RAD Studio XE5, Delphi XE5 and C++Builder XE5

2013年12月1日

2013/12開催のウェブセミナー

2013/12開催のウェブセミナーはありません。

2013年11月22日

RAD Studio/C++Builder XE4 Hotfix 2

RAD Studio/C++Builder XE4のHotfix 2がリリースされています。Mac OS X 10.9 SDK上でFMX/C++アプリケーションのコンパイルに失敗する問題を解決するものです(XE5のHotfix 1と同じ問題でしょうか?)。

29627 Hotfix 2 for C++Builder and RAD Studio XE4

Team Japan » C++Builder XE4 Update1向け「Hotfix2 for OS X 10.9(Mavericks)」

2013年11月15日

DDevExtensions 2.8

Andreas HausladenさんDDevExtensionsがアップデートされてVersion 2.8になっています。RAD Studio XE5対応とバグフィックスが含まれています。

DDevExtensions 2.8 released (2009-XE5) | Andy's Blog and Tools

2013年11月13日

Microsoft Monthly Update 2013/11

今日はMicrosoftのセキュリティアップデートの日です。
MS13-088
MS13-089
MS13-090
MS13-091
MS13-092
MS13-093
MS13-094
MS13-095

2013年11月11日

第27回エンバカデロ・デベロッパーキャンプ開催決定

第27回エンバカデロ・デベロッパーキャンプは2013年12月10日に開催されます。

エンバカデロ・デベロッパーキャンプ | ホーム

今回はRAD StudioプロダクトディレクタのJohn Thomas(JT@Embarcadero)さんがいらっしゃるとのことです。目玉はC++BuilderのiOS/Android対応でしょうか。全体としてモバイル関係の比率が高い感じです。

2013年11月6日

RAD Studio/C++Builder XE5 Hotfix 1

RAD Studio/C++Builder XE5のHotfix 1がリリースされています。Mac OS X 10.9 SDK上でFMX/C++アプリケーションをコンパイルするときの問題を解決するものです。

Hotfix 1 for RAD Studio and C++Builder XE5 now available

29621 Hotfix 1 for RAD Studio and C++Builder XE5

2013年11月2日

IDE Fix Pack 5.4

Andreas HausladenさんIDE Fix Pack 2009-XE5がアップデートされてVersion 5.4になっています。RAD Studio XE5対応のほか、いくつかのバグフィックスとコンパイラの最適化が含まれているとのことです。

IDE Fix Pack 5.4 for 2009-XE5 released | Andy's Blog and Tools

2013年10月17日

2013年10月9日

Microsoft Monthly Update 2013/10

今日はMicrosoftのセキュリティアップデートの日です。
MS13-080
MS13-081
MS13-082
MS13-083
MS13-084
MS13-085
MS13-086
MS13-087

2013年9月30日

[書籍]世界測地系と座標変換

Amazon.co.jpで注文した

世界測地系と座標変換 (amazon)/飛田幹男著/日本測量協会/ISBN978-4-88941-014-3/1,600円

が配送されてきました(堺配送センター発で今回の配送は日本郵政)。

2013年9月13日

第26回エンバカデロ・デベロッパーキャンプ

本日10:00から第26回エンバカデロ・デベロッパーキャンプが東京ビッグサイトの会議棟6Fで行われます。今回もハンズオンのセッション(B4)を除く全てのセッションがUStreamで中継されるとのことです。

全セッション、懇親会とも無事終了しました。セッションスピーカの皆さん、参加者、関係者の皆さん、おつかれさまでした。

2013/09/18追記: セッション資料がダウンロードできるようになっています。

第26回 エンバカデロ・デベロッパーキャンプ資料ダウンロード

2013/09/24追記: セッションリプレイの公開が始まっています。
  • 【A1】Delphiチュートリアルセッション「Windows開発者のためのFireMonkeyモバイル開発入門」
  • 【B1】HTML5テクニカルセッション「オフラインで"待ちなし"、 500倍を超えるアクセスパフォーマンス!」
  • 【A2】Delphi/C++Builderテクニカルセッション「はじめてのFireDAC」
  • 【B2】C++Builderテクニカルセッション「いまどきのC++開発をもっと楽にする3つの武器」
  • 【G3】ジェネラルセッション「マルチデバイス開発を強化するエンバカデロのRADテクノロジー」
  • 【G3】ジェネラルセッション(後半戦)「アプリソムリエお薦めアプリ、Delphiならどう作る?教えて高橋さん!」
  • 【A4】テクニカルケーススタディ「RAD Studioによるマルチデバイス開発への道」
  • 【B4】Delphi iOSワークショップ「アプリソムリエと作るDelphi iOSアプリ」
  • 【A5】Delphi/C++Builderテクニカルセッション「脱Windows XPから一気にマルチデバイス対応を目指す実践テクニック」
  • 【G6】クロージングアプリソムリエと語るモバイル開発への取り組み」

2013年9月11日

RAD Studio/Delphi/C++Builder XE5リリース

RAD Studio/Delphi/C++Builder XE5が正式にリリースされたようです。

エンバカデロ、AndroidおよびiOS向けネイティブ開発をサポートしたRAD Studio XE5を本日より販売開始 | Press Releases
Embarcadero Launches RAD Studio XE5 with True Native Android and iOS Support, Allowing Developers to Reach the Largest Addressable Mobile Markets

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

29543 Delphi XE5 and C++Builder XE5 ISO
29546 RAD Studio XE5 HTML5 Builder ISO

29525 AQtime for Delphi XE5, C++Builder XE5, and RAD Studio XE5
29526 IP*Works for Delphi XE5 29707 IP*Works for Delphi XE5 Update 2
29527 IP*Works for C++Builder XE5 29706 IP*Works for C++Builder XE5 Update 2
29549 Jomitech PlatinumGrid Lite Pack for HTML5 Builder XE5
29524 FastReport FMX - Embarcadero Edition for XE5
29598 FireMonkey Premium Style Pack 3 for RAD Studio XE5 FireMonkey Premium Style Pack for RAD Studio XE5 (v4 Oct 2013) (Team Japan » FireMonkey Premium Style Pack 3 for RAD Studio XE5 が公開されました)
29613 InfoPower for Delphi FireMonkey (2013/12/11更新あり) 29712 InfoPower FM for RAD Studio, Delphi and C++Builder XE5 Update 2
29610 Mida Converter for RAD Studio, Delphi and C++Builder XE5
29645 Documentation Insight Express for RAD Studio XE5
29695 FastReport 4 VCL - Embarcadero Edition for XE5
29708 TeeChart Lite for RAD Studio, Delphi, C++Builder XE5 Update 2

29548 iOS 7 Style Update for Delphi XE5 and RAD Studio XE5 (Delphi XE5およびRAD Studio XE5向け iOS 7スタイルアップデート / Using the iOS 7 Update for XE5)
29701 Android 4.4 KitKat Style for RAD Studio and Delphi XE5 (Team Japan » KitKat(4.4.x)専用のFireMonkeyスタイルを試す)
29716 FireDAC.Phys.IBBase Patch for XE2 Update2 参考: FireDACでFireBirdへ接続時、入力する文字数によってエラーが発生する症状について
29772 Updated REST Debugger

29769 AQtime 8.20 Standard update

Delphi® XE5 および C++Builder® XE5 オンライン ヘルプ (en)
XE5 のリリース ノート (en)

2013/12/11追記: InfoPower for Delphi FireMonkeyが更新されているとのことです。

Team Japan » ボーナスパック - InfoPower社のFireMonkeyコンポーネント集

2014/01/17追記: Fast Report 4 VCLがダウンロードできるようになっています。

2014/01/30追記 IP*WorksがUpdate 2対応版に更新されています。

2014/02/01追記: TeeChart LiteとInfoPower FireMonkeyがUpdate 2対応版に更新されています。

Team Japan » RAD Studio XE5(Delphi/C++Builder) Update2向け、サードパーティライブラリ更新版

2014/02/04追記: FireDAC.Phys.IBBaseのパッチが公開されています。

2014/02/24追記: REST Debuggerが更新されています。またAQtime 8.20 Standard updateも公開されています。

Microsoft Monthly Update 2013/09

今日はMicrosoftのセキュリティアップデートの日です。
MS13-067
MS13-068
MS13-069
MS13-070
MS13-071
MS13-072
MS13-073
MS13-074
MS13-075
MS13-076
MS13-077
MS13-078
MS13-079

2013年8月22日

Win32APIのSetPriorityClass関数でプロセスの優先順位を指定する

実行中のプロセスの優先順位クラス (Priority class)を取得/設定するにはWin32APIのGetPriorityClass関数 (en)およびSetPriorityClass関数 (en)を使用します。このとき自プロセスの優先順位クラスを指定するのであればGetCurrentProcess関数 (en)で取得した擬似ハンドルを使用することができます(他のプロセスの優先順位クラスの場合、PROCESS_SET_INFORMATIONアクセス権を持ったプロセスハンドルが必要です)。

まずBELOW_NORMAL_PRIORITY_CLASSとABOVE_NORMAL_PRIORITY_CLASSの定義を追加します。
{$IF RTLVersion < 24}
const
  BELOW_NORMAL_PRIORITY_CLASS = $00004000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
  ABOVE_NORMAL_PRIORITY_CLASS = $00008000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
{$IFEND}
フォームに優先順位クラスを表示するComboBox(StyleはcsDropDownList)と優先順位クラスを取得、設定するButtonを配置し、フォームのOnCreateイベントでComboBoxに優先順位クラスの表示文字列と値を格納します。
procedure TForm1.FormCreate(Sender: TObject);
begin

  with ComboBox1.Items do
  begin
    BeginUpdate;
    try
      Clear;
      AddObject(Format('%s (0x%8.8X)',['IDLE',IDLE_PRIORITY_CLASS]),
                TObject(IDLE_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['BELOW_NORMAL',BELOW_NORMAL_PRIORITY_CLASS]),
                TObject(BELOW_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['NORMAL',NORMAL_PRIORITY_CLASS]),
                TObject(NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['ABOVE_NORMAL',ABOVE_NORMAL_PRIORITY_CLASS]),
                TObject(ABOVE_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['HIGH',HIGH_PRIORITY_CLASS]),
                TObject(HIGH_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['REALTIME',REALTIME_PRIORITY_CLASS]),
                TObject(REALTIME_PRIORITY_CLASS));

    finally
      EndUpdate;
    end;
  end;

end;
自プロセスの優先順位クラスを取得して表示します。
{$WARN SYMBOL_PLATFORM OFF}

procedure TForm1.Button1Click(Sender: TObject);
var
  PriorityClass: DWORD;
  I: Integer;
begin

  PriorityClass := GetPriorityClass(GetCurrentProcess);

  with ComboBox1 do
  begin
    for I := 0 to Items.Count - 1 do
    begin
      if DWORD(Items.Objects[I]) = PriorityClass then
      begin
        ItemIndex := I;
        Exit;
      end;
    end;

    ItemIndex := -1;
  end;

end;
今度は選択された優先順位クラスを自プロセスに設定します。
procedure TForm1.Button2Click(Sender: TObject);
var
  PriorityClass: DWORD;
begin

  with ComboBox1 do
  begin
    if ItemIndex < 0 then
    begin
      Exit;
    end;

    PriorityClass := DWORD(Items.Objects[ItemIndex]);
    Win32Check(SetPriorityClass(GetCurrentProcess,PriorityClass));
  end;

end;
Windowsにおけるスケジューリングのメカニズムは非常に複雑で、優先順位が実行中に動的に変更されるなど、単純に優先順位クラスなどで決まるわけではありません。このあたりをきちんと理解するためにはAdvanced Windows 第5版 上 (amazon)の"7.8 スレッドの優先度"、"7.9 優先度クラスの概要"、"7.10 プログラミングの優先度"やインサイドWindows 第6版 上 (amazon) の"5.7 スレッドのスケジューリング"などを読むことをお勧めします。

GetPriorityClassとSetPriorityClassで優先順位クラスを取得/設定する (Gist)

2013年8月21日

CreateProcessで優先順位を指定してプログラムを起動する

優先順位クラス (Priority class)を指定してプロセスを起動するにはWin32APIのCreateProcess関数 (en)の第6パラメータ(dwCreationFlags)に優先順位クラスを指定します。

Delphi XE2およびそれ以前のバージョンではWindows.pasにBELOW_NORMAL_PRIORITY_CLASSとABOVE_NORMAL_PRIORITY_CLASSが定義されていないので、まずこれらを定義します。
{$IF RTLVersion < 24}
const
  BELOW_NORMAL_PRIORITY_CLASS = $00004000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
  ABOVE_NORMAL_PRIORITY_CLASS = $00008000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
{$IFEND}
フォームにEditとComboBox、Buttonをひとつずつ配置し、フォームのOnCreateイベントでEditとComboBoxに値を格納します。
procedure TForm1.FormCreate(Sender: TObject);
begin

  Edit1.Text := '%windir%\notepad.exe';

  with ComboBox1.Items do
  begin
    BeginUpdate;
    try
      Clear;
      AddObject(Format('%s (0x%8.8X)',['IDLE',IDLE_PRIORITY_CLASS]),
                TObject(IDLE_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['BELOW_NORMAL',BELOW_NORMAL_PRIORITY_CLASS]),
                TObject(BELOW_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['NORMAL',NORMAL_PRIORITY_CLASS]),
                TObject(NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['ABOVE_NORMAL',ABOVE_NORMAL_PRIORITY_CLASS]),
                TObject(ABOVE_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['HIGH',HIGH_PRIORITY_CLASS]),
                TObject(HIGH_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['REALTIME',REALTIME_PRIORITY_CLASS]),
                TObject(REALTIME_PRIORITY_CLASS));

    finally
      EndUpdate;
    end;
  end;

  with ComboBox1 do
  begin
    ItemIndex := Items.IndexOfObject(TObject(NORMAL_PRIORITY_CLASS));
  end;

end;
優先順位を指定してプロセスを起動します。
{$WARN SYMBOL_PLATFORM OFF}

procedure TForm1.Button1Click(Sender: TObject);
var
  ApplicationName: String;
  CreationFlags: DWORD;
  StartupInfo: TStartupInfo;
  ProcessInformation: TProcessInformation;
  Length: Integer;
begin

  Length := ExpandEnvironmentStrings(PChar(Edit1.Text),nil,0);
  SetLength(ApplicationName,Length);
  ExpandEnvironmentStrings(PChar(Edit1.Text),PChar(ApplicationName),Length);
  UniqueString(ApplicationName);

  with ComboBox1 do
  begin
    if ItemIndex < 0 then
    begin
      Exit;
    end;

    CreationFlags := DWORD(Items.Objects[ItemIndex]);
  end;

  FillChar(StartupInfo,SizeOf(StartupInfo),0);
  StartupInfo.cb := SizeOf(StartupInfo);

  FillChar(ProcessInformation,SizeOf(ProcessInformation),0);

  Win32Check(CreateProcess(PChar(ApplicationName),nil,nil,nil,False,
                           CreationFlags,nil,nil,
                           StartupInfo,ProcessInformation));

  CloseHandle(ProcessInformation.hProcess);
  CloseHandle(ProcessInformation.hThread);

end;
ここではEditに入力された起動対象プログラムに%windir%などの環境変数を使用することを前提としているため、Win32APIのExpandEnvironmentStrings関数 (en)で展開しています。

優先順位クラスを指定してプロセスを起動する (Gist)

2013年8月20日

コマンドプロンプトのSTARTコマンドで優先順位を指定してプログラムを起動する

プログラムを実行するときに、そのプロセスの優先順位クラス (Priority class)を外部から指定するには、コマンドプロンプト(cmd.exe)のSTARTコマンドを使用します。

start /<PriorityClass> <program>
ここで/<PriorityClass>には

/REALTIME
REALTIME_PRIORITY_CLASS (リアルタイム/24)
/HIGH
HIGH_PRIORITY_CLASS (高/13)
/ABOVENORMAL
ABOVE_NORMAL_PRIORITY_CLASS (通常以上/10)
/NORMAL
NORMAL_PRIORITY_CLASS (通常/8)
/BELOWNORMAL
BELOW_NORMAL_PRIORITY_CLASS (通常以下/6)
/LOW
IDLE_PRIORITY_CLASS (低/4)
を指定可能です(括弧内の数字は同一の優先順位クラス内の相対的な優先順位を表す優先順位レベル (Priority level)をTHREAD_PRIORITY_NORMALに指定したときのベースプライオリティ)。

2013年8月18日

2013年8月14日

Microsoft Monthly Update 2013/08

今日はMicrosoftのセキュリティアップデートの日です。
MS13-059
MS13-060
MS13-061
MS13-062
MS13-063
MS13-064
MS13-065
MS13-066

2013年8月13日

列挙型と列挙子名(文字列)または整数の相互変換(ジェネリックス版)

しばらく前にジェネリックス版の列挙型と列挙子名の相互変換について書きましたが、これを多少改善してみました。まず整数から列挙値への変換を追加しました(GetEnumValueのInteger引数版)。整数から列挙値への変換は普通は型キャストですませてしまいますが、これだと(デフォルトの設定である){$RANGECHECKS OFF}の状態で範囲外の値が格納されることを防げないため、列挙型の最小値、最大値の確認を行うようにしています。あとはエラーが発生したときに例外を生成するのではなく戻値で区別する関数(Try...)を追加しました。
uses
  TypInfo, SysUtils, SysConst;

type
  TEnumHelper = record
    class function TryGetEnumName<T: record>(Value: T; out S: String): Boolean; static;
    class function GetEnumName<T: record>(Value: T): String; static;
    class function TryGetEnumValue<T: record>(const Name: String; out Enum: T): Boolean; overload; static;
    class function GetEnumValue<T: record>(const Name: String): T; overload; static;
    class function TryGetEnumValue<T: record>(Value: Integer; out Enum: T): Boolean; overload; static;
    class function GetEnumValue<T: record>(Value: Integer): T; overload; static;
  end;

class function TEnumHelper.TryGetEnumName<T>(Value: T; out S: String): Boolean;
var
  P: PTypeInfo;
  IValue: Integer;
begin

  Result := False;
  S := '';

  P := TypeInfo(T);
  if (P = nil) or (P^.Kind <> tkEnumeration) then
  begin
    Exit;
  end;

  IValue := 0;
  Move(Value,IValue,SizeOf(T));
  S := TypInfo.GetEnumName(P,IValue);
  Result := True;

end;

class function TEnumHelper.GetEnumName<T>(Value: T): String;
var
  P: PTypeInfo;
  IValue: Integer;
begin

  P := TypeInfo(T);
  if (P = nil) or (P^.Kind <> tkEnumeration) then
  begin
    raise EInvalidOpException.CreateRes(@SVarNotImplemented);
  end;

  IValue := 0;
  Move(Value,IValue,SizeOf(T));
  Result := TypInfo.GetEnumName(P,IValue);

end;

class function TEnumHelper.TryGetEnumValue<T>(const Name: String; out Enum: T): Boolean;
var
  P: PTypeInfo;
  IValue: Integer;
begin

  Result := False;
  Enum := Default(T);

  P := TypeInfo(T);
  if (P = nil) or (P^.Kind <> tkEnumeration) then
  begin
    Exit;
  end;

  IValue := TypInfo.GetEnumValue(P,Name);

  with GetTypeData(P)^ do
  begin
    if (IValue < MinValue) or (IValue > MaxValue) then
    begin
      Exit;
    end;
  end;

  Move(IValue,Enum,SizeOf(T));
  Result := True;

end;

class function TEnumHelper.GetEnumValue<T>(const Name: String): T;
var
  P: PTypeInfo;
  IValue: Integer;
begin

  Result := Default(T);

  P := TypeInfo(T);
  if (P = nil) or (P^.Kind <> tkEnumeration) then
  begin
    raise EInvalidOpException.CreateRes(@SVarNotImplemented);
  end;

  IValue := TypInfo.GetEnumValue(P,Name);

  with GetTypeData(P)^ do
  begin
    if (IValue < MinValue) or (IValue > MaxValue) then
    begin
      raise ERangeError.CreateRes(@SRangeError);
    end;
  end;

  Move(IValue,Result,SizeOf(T));

end;

class function TEnumHelper.TryGetEnumValue<T>(Value: Integer; out Enum: T): Boolean;
var
  P: PTypeInfo;
begin

  Result := False;
  Enum := Default(T);

  P := TypeInfo(T);
  if (P = nil) or (P^.Kind <> tkEnumeration) then
  begin
    Exit;
  end;

  with GetTypeData(P)^ do
  begin
    if (Value < MinValue) or (Value > MaxValue) then
    begin
      Exit;
    end;
  end;

  Move(Value,Enum,SizeOf(T));
  Result := True;

end;

class function TEnumHelper.GetEnumValue<T>(Value: Integer): T;
var
  P: PTypeInfo;
begin

  Result := Default(T);

  P := TypeInfo(T);
  if (P = nil) or (P^.Kind <> tkEnumeration) then
  begin
    raise EInvalidOpException.CreateRes(@SVarNotImplemented);
  end;

  with GetTypeData(P)^ do
  begin
    if (Value < MinValue) or (Value > MaxValue) then
    begin
      raise ERangeError.CreateRes(@SRangeError);
    end;
  end;

  Move(Value,Result,SizeOf(T));

end;
こんな感じで使います。
var
  S: String;
begin

  if TEnumHelper.TryGetEnumName(0,S) = True then  // Error (0 is not enumeration)
  begin
    Label1.Caption := S;
  end
  else
  begin
    Label1.Caption := '(Error)';
  end;

  S := TEnumHelper.GetEnumName(taLeftJustify);  // taLeftJustify -> 'taLeftJustify'
  Label2.Caption := S;

  S := TEnumHelper.GetEnumName(False);  // False -> 'False'
  Label3.Caption := S;

end;
元ねたはDelphi XE2 Foundations

列挙型と列挙子名(文字列)または整数の相互変換(ジェネリックス版) (Gist)

2013年8月7日

CopyFileExを無名メソッドで使う

前回はWin32APIのCopyFileEx関数 (en)でファイルをコピーする処理を作成しましたが、Delphi 2009以降ではやはりコールバックを無名メソッドで記述したいところです。ということでCopyFileExの無名メソッド版です。

まず無名メソッドの定義から。
type
  TCopyProgressCallbackFunc = reference to function
                                (TotalFileSize: Int64;
                                 TotalBytesTransferred: Int64;
                                 StreamSize: Int64;
                                 StreamBytesTransferred: Int64;
                                 dwStreamNumber: DWORD;
                                 dwCallbackReason: DWORD;
                                 hSourceFile: THandle;
                                 hDestinationFile: THandle): DWORD;
無名メソッドは実際にはコンパイラが自動的に生成する(メンバにメソッドInvokeだけを持つ)TInterfacedObjectの派生クラスのインスタンスなので、これをCopyFileEx関数の第4パラメータ(lpData)経由でコールバック関数に渡して、そこから無名メソッドを呼び出せばいい…はずなのですが、無名メソッドそのままだとどうやってもうまくいかないので、無名メソッドをレコード型の変数に格納してそのアドレスを受け渡すようにします。そのレコード型の定義は
type
  TCopyProgressCallbackRec = record
    FCallback: TCopyProgressCallbackFunc;
  end;
  PCopyProgressCallbackRec = ^TCopyProgressCallbackRec;
となります。このレコード型のポインタ(PCopyProgressCallbackRec)を使い、CopyFileEx関数のコールバックでは
function CopyProgressFunc(TotalFileSize: Int64;
                          TotalBytesTransferred: Int64;
                          StreamSize: Int64;
                          StreamBytesTransferred: Int64;
                          dwStreamNumber: DWORD;
                          dwCallbackReason: DWORD;
                          hSourceFile: THandle;
                          hDestinationFile: THandle;
                          lpData: Pointer): DWORD; stdcall;
var
  PCallback: PCopyProgressCallbackRec;
begin

  PCallback := PCopyProgressCallbackRec(lpData);
  Result := PCallback^.FCallback(TotalFileSize,
                                 TotalBytesTransferred,
                                 StreamSize,
                                 StreamBytesTransferred,
                                 dwStreamNumber,
                                 dwCallbackReason,
                                 hSourceFile,
                                 hDestinationFile);

end;
と無名メソッドを呼び出すようにします。あとはコールバックとして無名メソッドを受け取るファイルコピー関数を作成します。
procedure CopyFile(const ExistingFileName: String; const NewFileName: String;
                   FailIfExists: Boolean; NoBuffering: Boolean;
                   Callback: TCopyProgressCallbackFunc);
var
  Canceled: BOOL;
  CopyFlags: DWORD;
  CallbackRec: TCopyProgressCallbackRec;
begin

  Canceled := False;

  CopyFlags := 0;
  if FailIfExists = True then
  begin
    CopyFlags := CopyFlags or COPY_FILE_FAIL_IF_EXISTS;
  end;
  if (NoBuffering = True) and CheckWin32Version(6,0) then
  begin
    CopyFlags := CopyFlags or COPY_FILE_NO_BUFFERING;
  end;

  CallbackRec.FCallback := Callback;
  Win32Check(CopyFileEx(PChar(ExistingFileName),PChar(NewFileName),
             @CopyProgressFunc,@CallbackRec,@Canceled,CopyFlags));

end;
前回同様にフォーム上にコピー元ファイル名とコピー先ファイル名を入力するためのEditを2つとコピー開始/コピー中断のButton、途中経過表示用のLabelを配置して、コピー開始のButtonのOnClickイベントとコピー中断のButtonのOnClickイベントを記述します。
procedure TForm1.Button1Click(Sender: TObject);
begin

  FAborted := False;

  Button1.Enabled := False;
  try
    CopyFile(Edit1.Text,Edit2.Text,True,True,
             function (TotalFileSize: Int64;
                       TotalBytesTransferred: Int64;
                       StreamSize: Int64;
                       StreamBytesTransferred: Int64;
                       dwStreamNumber: DWORD;
                       dwCallbackReason: DWORD;
                       hSourceFile: THandle;
                       hDestinationFile: THandle): DWORD
             var
               TBT: Extended;
               TFS: Extended;
             begin
               TFS := TotalFileSize;
               TBT := TotalBytesTransferred;

               if (TotalFileSize = 0) or (TotalBytesTransferred = 0) then
               begin
                 Label1.Caption := '';
               end
               else
               begin
                 Label1.Caption := Format('%.0n / %.0n bytes',[TBT,TFS]);
               end;

               Result := PROGRESS_CONTINUE;

               Application.ProcessMessages;
               if FAborted = True then
               begin
                 FAborted := False;
                 if MessageDlg('ファイルコピーを中断しますか?',
                               mtConfirmation,[mbYes,mbNo],0) = mrYes then
                 begin
                   Result := PROGRESS_CANCEL;
                 end;
               end;
             end);

  finally
    Button1.Enabled := True;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

  FAborted := True;

end;
ここではコピー中止のButtonをクリックすると中断するかどうか確認するダイアログを表示するようにしています。

Win32APIのCopyFileExのコールバックから無名メソッドを呼び出す (Gist)

2013年8月5日

CopyFileExを使う

DelphiでファイルをコピーするときはWin32APIのCopyFile関数 (en)か、これをラッピングした(System.)IOUtilsのTFile.Copyなどを使うのが普通ですが、大きめのファイルだったり遅いデバイスだったり、あるいはその両方で、ファイルコピーに5秒以上かかるとWindowsに"応答なし"と判断されてしまうことになります。ファイルコピーを別スレッドで行ってもよいのですが(TFile.DoCopyの実装を見る限りPOSIX環境ではこれしかなさそう)、Windows環境であればWin32APIのCopyFileEx関数 (en)を使い、コールバック関数内でApplication.ProcessMessagesを呼び出すことでこの問題を回避することができます。ではまず(Winapi.)Windows.pas上のCopyFileExの定義を見てみましょう。
type
  TFNProgressRoutine = TFarProc;

function CopyFileEx(lpExistingFileName, lpNewFileName: LPWSTR;
  lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool;
  dwCopyFlags: DWORD): BOOL; stdcall;
コールバック関数の型はTFNProgressRoutine=TFarProcと定義されていますが、TFarProcはというと、
TFarProc = Pointer;
となっており、やる気のなさ満点です(間違っちゃいないけど)。そこでまずCopyProgressRoutineコールバック関数 (en)の定義から用意します。
type
  TCopyProgressRoutine = function (TotalFileSize: Int64;
                                   TotalBytesTransferred: Int64;
                                   StreamSize: Int64;
                                   StreamBytesTransferred: Int64;
                                   dwStreamNumber: DWORD;
                                   dwCallbackReason: DWORD;
                                   hSourceFile: THandle;
                                   hDestinationFile: THandle;
                                   lpData: Pointer): DWORD; stdcall;
これを使ってCopyFileEx関数を再定義します。
function CopyFileEx(lpExistingFileName: PChar;
                    lpNewFileName: PChar;
                    lpProgressRoutine: TCopyProgressRoutine;
                    lpData: Pointer;
                    pbCancel: PBool;
                    dwCopyFlags: DWORD): BOOL; stdcall; external kernel32
{$IFDEF UNICODE}
                    name 'CopyFileExW';
{$ELSE}
                    name 'CopyFileExA';
{$ENDIF}
{$EXTERNALSYM CopyFileEx}

これらの定義を使ってファイルをコピーしてみましょう。まずフォーム上にコピー元ファイル名とコピー先ファイル名を入力するためのEditを2つとコピー開始のButton、途中経過表示用のLabelを配置します。
{$WARN SYMBOL_PLATFORM OFF}
const
  COPY_FILE_NO_BUFFERING = $00001000;

function CopyProgressFunc(TotalFileSize: Int64;
                          TotalBytesTransferred: Int64;
                          StreamSize: Int64;
                          StreamBytesTransferred: Int64;
                          dwStreamNumber: DWORD;
                          dwCallbackReason: DWORD;
                          hSourceFile: THandle;
                          hDestinationFile: THandle;
                          lpData: Pointer): DWORD; stdcall;
var
  TBT: Extended;
  TFS: Extended;
begin

  TFS := TotalFileSize;
  TBT := TotalBytesTransferred;

  with TObject(lpData) as TForm1 do
  begin
    if (TotalFileSize = 0) or (TotalBytesTransferred = 0) then
    begin
      Label1.Caption := '';
    end
    else
    begin
      Label1.Caption := Format('%.0n / %.0n bytes',[TBT,TFS]);
    end;
  end;

  Application.ProcessMessages;

  Result := PROGRESS_CONTINUE;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Canceled: BOOL;
  CopyFlags: DWORD;
begin

  Button1.Enabled := False;
  try
    Canceled := False;

    CopyFlags := COPY_FILE_FAIL_IF_EXISTS;
    if CheckWin32Version(6,0) then
    begin
      CopyFlags := CopyFlags or COPY_FILE_NO_BUFFERING;
    end;

    Win32Check(CopyFileEx(PChar(Edit1.Text),PChar(Edit2.Text),
               CopyProgressFunc,Self,@Canceled,CopyFlags));

  finally
    Button1.Enabled := True;
  end;

end;
これでファイルのコピー中に途中経過を表示できるようになります。またApplication.ProcessMessagesを呼び出すことでWindowsに"応答なし"と判定されることもなくなります(ただしイベントハンドラへの再入には十分注意が必要です)。

ここでは大きいファイルをコピーすることを想定しているため、Windows Vista以降ではdwCopyFlagsにCOPY_FILE_NO_BUFFERINGを追加指定しています(COPY_FILE_NO_BUFFERINGには功罪両面ありますが)。またファイルの上書きを許す場合はCopyFlagsにCOPY_FILE_FAIL_IF_EXISTSではなくて0を指定します(CopyFlagsにCOPY_FILE_FAIL_IF_EXISTSを指定したときにコピー先ファイルが存在しているとCopyFileExの戻値は0となり、GetLastError (en)はERROR_FILE_EXISTSを返します)。

さらにコピーの途中でキャンセルできるようにしてみます。フォームにキャンセル用のButtonと、privateメンバにBoolean型のフィールドFAbortedを追加します。
function CopyProgressFunc(TotalFileSize: Int64;
                          TotalBytesTransferred: Int64;
                          StreamSize: Int64;
                          StreamBytesTransferred: Int64;
                          dwStreamNumber: DWORD;
                          dwCallbackReason: DWORD;
                          hSourceFile: THandle;
                          hDestinationFile: THandle;
                          lpData: Pointer): DWORD; stdcall;
var
  TBT: Extended;
  TFS: Extended;
begin

  TFS := TotalFileSize;
  TBT := TotalBytesTransferred;

  with TObject(lpData) as TForm1 do
  begin
    if (TotalFileSize = 0) or (TotalBytesTransferred = 0) then
    begin
      Label1.Caption := '';
    end
    else
    begin
      Label1.Caption := Format('%.0n / %.0n bytes',[TBT,TFS]);
    end;

    Result := PROGRESS_CONTINUE;

    Application.ProcessMessages;
    if FAborted = True then
    begin
      Result := PROGRESS_CANCEL;
    end;
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Canceled: BOOL;
  CopyFlags: DWORD;
begin

  FAborted := False;

  Button1.Enabled := False;
  try
    Canceled := False;

    CopyFlags := COPY_FILE_FAIL_IF_EXISTS;
    if CheckWin32Version(6,0) then
    begin
      CopyFlags := CopyFlags or COPY_FILE_NO_BUFFERING;
    end;

    Win32Check(CopyFileEx(PChar(Edit1.Text),PChar(Edit2.Text),
               CopyProgressFunc,Self,@Canceled,CopyFlags));

  finally
    Button1.Enabled := True;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

  FAborted := True;
  
end;
こんな感じです。コールバック関数がPROGRESS_CANCELを返してファイルコピーをキャンセルしたときはCopyFileExの戻値は0(エラー)となり、GetLastErrorはERROR_REQUEST_ABORTEDを返します。

さて、Delphi 2009以降でコールバックといえば無名メソッド、という連想が働きますが、それはまた次回

Win32APIのCopyFileExのコールバックを受け入れる (Gist)

2013年7月10日

Microsoft Monthly Update 2013/07

今日はMicrosoftのセキュリティアップデートの日です。
MS13-052
MS13-053
MS13-054
MS13-055
MS13-056
MS13-057
MS13-058

2013年7月8日

5th anniversary

さて、あっという間に5周年がやってきました。この1年間(2012/07/08-2013/07/07)のエントリは101で、週平均2.0を切るという惨憺たる状況でした(去年の冬くらいから先週まで仕事が立て込み続けた、というのが主な要因です、と言い訳してみる)。続いてアクセス解析の統計情報から月別ページビュー(PV)を。

2012/07: 7,528
2012/08: 7,352
2012/09: 7,855
2012/10: 6,810
2012/11: 6,781
2012/12: 6,427
2013/01: 5,326
2013/02: 4,907
2013/03: 5,117
2013/04: 6,456
2013/05: 6,635
2013/06: 6,319
2012/07-2013/06合計: 77,513

去年から約7%のダウンと、エントリ数の割にはそれほど下がっておらず、やや不思議な感じです(いつもご覧いただいているみなさまのおかげですね)。ページ別ではこの一年もWindowsのSNP(Scalable Networking Pack)を無効にするが約10%とトップですが、なぜか最近ダミーのDwmapi.dllを作成するが(3%程度ながら)PVを増やしています。どう見てもあまりいい理由ではなさそうですが…。
国別では日本、アメリカ合衆国、ロシア、ドイツ、フランスとなぜかヨーロッパ諸国からのアクセスが地道に増えているようです。

今年はここまでiOS対応で盛り上がってきましたがそれも一段落して、今年後半のAndroid対応(とiOS 7.0対応)がいつどのような形で実現するのかが焦点になりそうです。またLLVM化されたNEXTGENコンパイラについても注視が必要だと思われます。LLVMといえばC++11に続くC++14も規格化が近づいてきており、こちらも注目です。

2013年6月21日

[書籍]きつねさんでもわかるLLVM

ブックファースト 渋谷文化村通り店

きつねさんでもわかるLLVM (impress) (amazon)/柏木餅子風薬著/インプレスジャパン/ISBN978-4-8443-3415-6/2,520円

を購入。この本はもともと"薄い本"(3日で出来るLLVMきつねさんとおぼえるLLVM)だったのが達人出版会からの電子書籍(きつねさんでもわかるLLVM)、そして薄くない普通の本へと出世した、なかなか稀有な本です。

2013年6月12日

2013年6月7日

DDevExtensions 2.7

Andreas HausladenさんDDevExtensionsが久しぶりにアップデートされてVersion 2.7になっています。またDDevExtensionsの機能を説明したPDFも用意されています。

DDevExtensions 2.7 for 2009-XE4 released | Andy's Blog and Tools

2013年5月27日

2013年5月15日

Microsoft Monthly Update 2013/05

今日はMicrosoftのセキュリティアップデートの日です。
MS13-037
MS13-038
MS13-039
MS13-040
MS13-041
MS13-042
MS13-043
MS13-044
MS13-045
MS13-046

2013年5月2日

2013年4月23日

[書籍]Delphiで簡単iOSアプリプログラミング

エンバカデロ・テクノロジーズさんから

Delphiで簡単iOSアプリプログラミング (amazon)/細川淳著/エンバカデロ・テクノロジーズ監修/カットシステム/ISBN978-4-87783-310-7/2,730円

を頂きました(会社用はあとで購入します)。お手伝いを始めたときは間に合うのかと疑問でしたが、細川さんの睡眠時間をたっぷりと吸い取って無事に完成に漕ぎ着けました。もう少しいろいろアイデアとか出せればよかったのですが。ともあれ出版おめでとうございます。

第25回エンバカデロ・デベロッパーキャンプ

本日10:00から第25回エンバカデロ・デベロッパーキャンプが御茶ノ水ソラシティのソラシティカンファレンスセンターで行われます。今回はすべてのセッションがUStreamで中継されるとのことです。

開場が多少遅れたようですが、まもなく開始になります。

セッション開始です。B側(Ch.2)のUStreamは不調のようです(午前中はC側、Ch.1のみの中継になるとのことです)。

UStreamのCh.2も復活したようです。

全セッション、懇親会とも無事終了しました。参加者、セッションスピーカ、関係者のみなさん、おつかれさまでした。

2013/05/07追記: セッション資料がダウンロードできるようになっています。

第25回 エンバカデロ・デベロッパーキャンプ - セッション資料ダウンロード

またセッションリプレイがYouTubeにアップロードされています。
  • 【C1】Delphi/iOSチュートリアルセッション 「Delphi for iOS開発ファーストステップ」
  • 【B1】Delphi/C++Builderテクニカルセッション 「マルチデバイスに対応できるDBアクセス形態を作るには?実践テクニック」
    • Replay (1/2)
    • Replay (2/2)
  • 【C2】Delphi/iOSテクニカルセッション 「モバイル開発始めるなら今でしょ!Delphi iOSアプリ開発講座」
  • 【B2】Delphi/C++Builderテクニカルセッション 「BDEアプリを最新へ – FireDACによる移行」
  • 【G3】ジェネラルセッション 「エンバカデロ・プロダクトアップデート」
  • 【C4】テクニカルケーススタディ 「森羅万象を視覚化する慶應義塾大学 藤代研究室での活用例 ~ FireMonkeyによる3DCGアプリ開発テクニック」
  • 【B4】 Delphi/C++Builderテクニカルセッション 「Web/モバイル系アプリでの帳票を考える」
    • Replay (1/2)
    • Replay (2/2)
  • 【C5】 Delphi/C++Builderテクニカルセッション 「Delphi/C++Builder MVVMアプローチ ~ VCL / FireMonkeyでもどんと来い!」
    • Replay (1/2)
    • Replay (2/2)
  • 【B5】 Delphi/C++Builderテクニカルセッション 「VCLユーザーのためのFireMonkey入門」
  • 【G6】 ライトニングトーク 「共有!みんなの開発事例、開発経験、テクニック」
    • Replay (1/2)
    • Replay (2/2)

2013年4月22日

InterBase XE3 Update 2

InterBase XE3 Update 2がリリースされています。バージョンは11.0.2.539となっています。2013/04/26にToGo Editionを除き差し替えとなり、バージョンは11.0.2.540に更新されています。高橋さん、情報ありがとうございます。

InterBase XE3 Update 2 Readme (en)
Team Japan » InterBase XE3 Update 2 がリリースされました
InterBase XE3 Update 2 is now available

29381 InterBase XE3 Update 2 (11.0.2.540) for Windows, English and Japanese
29382 InterBase XE3 Update 2 (11.0.2.539) ToGo Edition, Windows/MacOSX

29395 InterBase XE3 (11.0.2.540) Developer Edition, English
29396 InterBase XE3 (11.0.2.540) Developer Edition, Japanese

29383 InterBase XE3 Server Edition for Windows (11.0.2.540, English)
29384 InterBase XE3 Server Edition for Windows (11.0.2.540, Japanese)

RAD Studio/Delphi/C++Builder XE4リリース

RAD Studio/Delphi/C++Builder XE4が正式にリリースされたようです。

Delphi Insider: Announcing RAD Studio XE4, Delphi XE4 and C++Builder XE4

エンバカデロ、iPhone/iPadアプリのネイティブ開発を実現したマルチデバイス開発ツールRAD Studio XE4を世界同時発表 | Press Releases
RAD Studio XE4(Delphi XE4/C++Builder XE4) における不具合修正リスト (en)

RAD Studio XE4
RAD Studio XE4 製品ラインナップ
RAD Studio XE4 Q&A

29388 Delphi XE4 and C++Builder XE4 ISO
29392 Delphi XE4 and C++Builder XE4 ISO
29389 RAD Studio XE4 Install from the Web
29390 Delphi XE4 Install from the Web
29391 C++Builder XE4 Install from the Web

29369 FireDAC (iOS only) for RAD Studio and Delphi XE4 Pro with Mobile
29371 IP*Works for Delphi XE4
29372 IP*Works for C++Builder XE4
29373 AQtime for Delphi XE4, C++Builder XE4, and RAD Studio XE4
29408 InterBase Express (IBX) for RAD Studio, Delphi, C++Builder XE4
29441 FireMonkey Premium Style Pack 2 for RAD Studio XE4
29442 TMS Cloud Pack Components for iOS for Delphi and RAD Studio XE4
29443 Mida Embarcadero XE4 Edition VCL to FireMonkey Converter

ただしRAD Studioに含まれるHTML5 BuilderがXE4にバージョンアップしたかどうかは今のところ不明です(機能一覧を見る限りではXE3のままのようです)。またPrismは事前の情報通りRAD Studioから外れています。

2013/05/01追記: リリースパッケージに含まれていなかったInterBase Express(IBX)がダウンロードできるようになっています。

RAD Studio XE4, Delphi XE4, C++Builder XE4 用 InterBase Express (IBX) が公開されました
InterBase Express (IBX) now available for RAD Studio XE4, Delphi XE4, C++Builder XE4

2013/06/08追記: TMS Cloud Pack Components for iOSおよびMida Embarcadero XE4 Editionのリンクを追加。TMS Cloud Pack Components for iOSは2013/06/30までに購入したユーザ限定です。

2013/06/10追記: FireMonkey Premium Style Pack 2のリンクを追加(XE4 Update 1が必要なので要注意)。また「RAD Studio XE4発売記念キャンペーン」追加特典の入手方法によると、TMS Cloud Pack Components for iOSだけではなく、Mida Embarcadero XE4 EditionとFireMonkey Premium Style Pack 2についても2013/07/15までにダウンロードする必要があるとのこと。

2013年4月18日

RAD Studio XE4情報

いよいよ来週の第25回エンバカデロ・デベロッパーキャンプ(2013/04/23)とそれに続くRAD Studio XE4 Product Announcement Webinar(2013/04/24)でRAD Studio XE4が発表になるようですが、これに関連していくつか情報が出てきています。
  • iOSサポートの追加
    • ターゲットプラットフォームにiOSデバイスとiOSシミュレータが追加される。
    • iOSサポートはXE2に比べて充実したものになる。
    • FireDACもiOS上でサポートされる。
  • 新しいDelphiコンパイラ
    • ARMコンパイラは(おそらくLLVMベースの)新しいものになる。
    • GC(Garbage Collection)ではなくARC(Automatic Reference Counting)がサポートされる。
    • ARCはDelphiのインタフェースのように参照カウントで生存期間を管理する。
    • ARCでは[Weak]属性を付加することで参照カウントに影響を与えないweak referenceが用意される(これにより循環参照により参照カウントが0にならない状況を回避できる)。
    • ARCではDisposeOfメソッドを呼び出すことで明示的にオブジェクトのデストラクタを呼び出すことができる。後方互換性のためWin/MacではDisposeOfはFreeを呼び出す。一方iOSではFreeはデストラクタを呼び出さなくなり、代わりに参照をnilにセットするようになる。FreeAndNilも同様。
    • これらはiOSデバイスとiOSシミュレータ(と次のAndroid)のみで、Win/Macには適用されない。Win/Macでこれらをいつどのように適用するのかについてはまだ検討段階。
    • ARCの詳細はhttp://docwiki.embarcadero.com/RADStudio/XE4/ja/Delphi_%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB_%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%A7%E3%81%AE%E8%87%AA%E5%8B%95%E5%8F%82%E7%85%A7%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88を参照。
  • InterBase for iOS
    • おそらくiOS上で動作するInterBaseがリリースされる。
  • PrismがRAD Studioに含まれなくなる
    • RemObjectsによるOxygeneとして単独製品のみになり、Embarcaderoとのパートナーシップは解消される。
    • PrismはOxygene for .NETとなり、Oxygene for Java (and Android)、Oxygene for Mac and iOS (codename "Nougat")と並んでラインナップされる。
  • iOSサポートがadd-onの形でも提供される
    • おそらくEnt/Arc SKU以外のSKUにiOSサポートは含まれず、Pro SKUに対してはDatasnapやFireDACのようにadd-onの形で提供されるらしい。
元ねたはAndreano LanusseさんDelphi XE4 official announcement | Andreano Lanusse、RemObjectsのmarc hoffmanさんのPrism XE4, Where Art Thou? | RemObjects Blogs

2013/04/19追記: XE4の価格に関する"リーク"が発見されたようです。Chris RollistonさんDelphi XE4 pricing | Delphi Havenからリンクされているプロモーションビデオ(ロシア語)によると、
  • Starter SKU: 199USD(実質149USD)(従来通りWindows x86のみでWindows x64/Mac OS/iOSは含まれず)
  • Pro SKU: 新規購入が999USD、XE3からのiOSを含まないアップグレードが49USD、XE3からのiOSを含むアップグレードが499USD、2010/XE/XE2からのアップグレードが549USD、C/S add-onが499USD
  • Ent SKU: 新規購入が2,499USD、XE3からのアップグレードが499USD、2010/XE/XE2からのアップグレードが1,499USD
  • Ult SKU: 新規購入が3,499USD、XE3からのアップグレードが499USD、2010/XE/XE2からのアップグレードが2,199USD
  • Arc SKU: 新規購入が3,999USD、XE3からのアップグレードが499USD、2010/XE/XE2からのアップグレードが2,499USD
となっています。日本では価格政策が異なるためそのまま1USD=100JPY換算で価格設定されるのかどうかは不明ですが、参考にはなりそうです。

2013/04/20追記: XE4のオンラインヘルプが公開状態になっています。
2013/04/22追記: どうやらPro SKUにはiOS開発が含まれず、別途"Mobile Add-On Pack for Delphi XE4 Professional"を購入することになるようです。

2013年4月10日

Microsoft Monthly Update 2013/04

今日はMicrosoftのセキュリティアップデートの日です。
MS13-028
MS13-029
MS13-030
MS13-031
MS13-032
MS13-033
MS13-034
MS13-035
MS13-036

2013/04/12追記: MS13-036のうち2823324の更新プログラムにはWindowsの起動あるいは特定のプログラムの実行でSTOPエラーが発生する不具合が発見されており、2823324の更新プログラムをアンインストールすることを推奨するとのことです。

MS13-036 2823324 適用後の問題について - 日本のセキュリティチーム - Site Home - TechNet Blogs
You receive an Event ID 55 or a 0xc000021a Stop error in Windows 7 after you install security update 2823324

2013/04/30追記: MS13-036のうち2823324の更新プログラムに替わる新しい2840149の更新プログラムがリリースされています。2823324のアンインストール後に2840149のインストールを行うことが推奨されています。

MS13-036 2823324 適用後の問題について (2) – 再提供の開始 - 日本のセキュリティチーム - Site Home - TechNet Blogs

2013年4月3日

[書籍]Head First C

ブックファースト 渋谷文化村通り店Head First C (amazon)の翻訳である

Head First C (amazon)/David Griffiths、Dawn Griffiths著/木下哲也訳/中田秀基監訳/オライリージャパン/ISBN978-4-87311-609-9/3,780円

を購入。

2013年3月25日

Firebird 2.5.2/2.1.5 Security Update 1

Firebird Ver2.5.2 Security Update 1 (Build 26540)およびVer2.1.5 Security Update 1 (Build 18497)がリリースされています。

Firebird: Firebird 2.5.2 Security Update 1
Release Notes (PDF)

Firebird: Firebird 2.1.5 Security Update 1
Release Notes (PDF)

認証されていないユーザから特別に加工されたパケットを送りつけることでスタックオーバフローが発生し、Firebirdを実行しているユーザ上でリモートからのコード実行が可能になるセキュリティホールが報告されており、これに対応するものです。信頼できないネットワークからのアクセスを受けるような状況ではアップデートを考慮すべきかと思われます。

2013年3月13日

第25回エンバカデロ・デベロッパーキャンプ開催決定

第25回エンバカデロ・デベロッパーキャンプは2013年04月23日に開催されます。

エンバカデロ・デベロッパーキャンプ | ホーム
【4/23開催】第25回エンバカデロ・デベロッパーキャンプ

今回はiOS版とFireDACでしょうか。現在セッションスピーカを絶賛募集中です。

2013/03/26追記: セッション概要その他が発表されて参加登録が開始になっています。今回はAP担当シニアディレクタのMalcolm Grovesさんがいらっしゃるようです。また【C4】テクニカルケーススタディで中山さんが初登場です。なお例によってライトニングトークのスピーカも絶賛募集中です。あ、懇親会は学生さん無料になってます。

Microsoft Monthly Update 2013/03

今日はMicrosoftのセキュリティアップデートの日です。
MS13-021
MS13-022
MS13-023
MS13-024
MS13-025
MS13-026
MS13-027

2013年3月1日

[書籍] Unicode IVS/IVD入門

ブックファースト 渋谷文化村通り店

Unicode IVS/IVD入門 (amazon)/田丸健三郎、小林龍生著/日経BP/ISBN978-4-82229-483-0/2,625円

を購入。

2013/05/16追記: 小林さんも認めていらっしゃるとおり、結構校正が甘くて微妙なところがあるのですが、NAOIさんがこの本の内容などについての補足をまとめてくださっていますので、この本を読む方はこちらも目を通しておくことを強くお勧めします。

IVS本へのツッコミ・まとめ - Mac OS Xの文字コード問題に関するメモ
IVS本に容赦なく突っ込みまくるNAOIさん - Togetter

2013/03開催のウェブセミナー

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著/児島修訳/和田卓人、和田省二監訳/オライリージャパン/ISBN978-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