啓文堂書店渋谷店でEffective SQL (amazon US)の翻訳である
Effective SQL (amazon)/John L. Viescas、Douglas J. Steele、Ben G. Clothier著/株式会社クイープ監訳/翔泳社/ISBN 9784798153995/3,780円
を購入。
2017年12月25日
2017年12月22日
[書籍]ベタープログラマ
紀伊國屋書店新宿本店でBecoming a Better Programmer (amazon US)の翻訳である
ベタープログラマ (amazon)/Pete Goodliffe著/柴田芳樹訳/オライリージャパン/ISBN 978-4-87311-820-8/3,240円
を購入。
ベタープログラマ (amazon)/Pete Goodliffe著/柴田芳樹訳/オライリージャパン/ISBN 978-4-87311-820-8/3,240円
を購入。
2017年12月15日
IDE Fix Pack 6.1.2
Andreas HausladenさんのIDE Fix PackがアップデートされてVersion 6.1.2となっています。RAD Studio/Delphi/C++Builder 10.2 Tokyo Release 2 (10.2.2)への対応とバグフィックスとのことです。
IDE Fix Pack 6.1.2 (supports Delphi 10.2.2) | Andy's Blog and Tools
IDE Fix Pack 6.1.2 (supports Delphi 10.2.2) | Andy's Blog and Tools
2017年12月13日
Microsoft Monthly Update 2017/12
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 12 月のセキュリティ更新プログラム
2017 年 12 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 12 月のセキュリティ更新プログラム
2017 年 12 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
RAD Studio/Delphi/C++Builder 10.2 Tokyo Release 2
RAD Studio/Delphi/C++Builder 10.2 TokyoのRelease 2(10.2.2)がリリースされています。
30806 RAD Studio, Delphi, C++Builder 10.2 Release 2 Web Install
30808 RAD Studio, Delphi, C++Builder 10.2 Release 2 ISO
10.2 Tokyo - Release 2 (en)
List of new features and customer reported issues fixed in RAD Studio 10.2 Tokyo Release 2
Delphi 10.2.2 Has Been Released
RAD Studio 10.2.2 Released Today
Delphi/C++Builder 10.2.2におけるHTTPプロトコル関連の改善[JAPAN]
2017/12/18追記: 初期リリースにはバイナリの互換性に問題があった(RSP-19539)ようで、2017/12/17付でインストーラが更新されています(ビルド番号は更新前が1978、更新後が2004となっています)。ビルド番号1978をインストールした場合は、まず1978をアンインストールして、そのあとで2004をインストールする必要があります。またこのとき設定移行ツールは正常に動作しない可能性があります。
30806 RAD Studio, Delphi, C++Builder 10.2 Release 2 Web Install
30808 RAD Studio, Delphi, C++Builder 10.2 Release 2 ISO
10.2 Tokyo - Release 2 (en)
List of new features and customer reported issues fixed in RAD Studio 10.2 Tokyo Release 2
Delphi 10.2.2 Has Been Released
RAD Studio 10.2.2 Released Today
Delphi/C++Builder 10.2.2におけるHTTPプロトコル関連の改善[JAPAN]
2017/12/18追記: 初期リリースにはバイナリの互換性に問題があった(RSP-19539)ようで、2017/12/17付でインストーラが更新されています(ビルド番号は更新前が1978、更新後が2004となっています)。ビルド番号1978をインストールした場合は、まず1978をアンインストールして、そのあとで2004をインストールする必要があります。またこのとき設定移行ツールは正常に動作しない可能性があります。
2017年12月5日
JCLでお手軽に例外発生時のスタックトレースを取る
このアーティクルはDelphi Advent Calendar 2017の5日目の記事です(2年ぶり4回目)。またゆるふぁい#0のLTの内容を元にしています。なお以下の説明は基本的にVCLアプリケーションのお話になります。
Delphiで作成したプログラムを実行中にエラーが発生すると例外が送出されます。
このとき例外の原因になった処理のアドレスは詳細マップファイルを生成しておけばわかります(後述)。しかしエラーが発生した箇所までの実行経路(呼び出し経路)が複雑だったり、Systemユニットにあるような低レベルの関数のように、どこから呼ばれるのかの選択肢が非常に多い箇所でエラーが発生した場合は、単に例外が発生したアドレスがわかるだけでは不十分です。デバッガ上で動作させているのであればDelphiのIDEで例外発生時の呼び出し履歴を見ればよいのですが、客先環境でしか再現しないような場合などでスタックトレースを取ることができれば問題解決の大きな助けになります。そこで簡単にできる方法として、JCL(JEDI Code Library)のJCL Debugを使って例外送出箇所までのスタックトレースを取得してみます(もちろん商用製品のmadExceptやEurekaLogであればもっといろいろなことができるとは思います)。
JCL(JEDI Code Library)はJEDIプロジェクトによるライブラリ群です。ビジュアルコンポーネントのJVCL(JEDI VCL)とともにインストールされていることも多いのではないでしょうか。新たにインストールする場合は、Delphiの複数バージョンがインストールされている環境ではリポジトリ(JCL、JVCL)から取得してインストール、単一のバージョンのみならGetItパッケージマネージャからインストール、Starter SKUであればCC(JCL、JVCL)からバイナリインストーラをダウンロードしてインストール、ということになります(詳細な手順は省略します)。JCLがインストールされると、"メインメニュー"→"プロジェクト"の一番下あたりに"JCL Debug expert"というアイテムが追加されているはずです。
さて、ここまで来れば、必要な手順はたった4つです。プロジェクトを開いておいて、
ステップ1: "JCL Debug expert"の"Generate .jdbg files"を有効("Always enabled"または"Enabled for this project")にします。
ステップ2: "Insert JDBG data into the binary"を有効("Always enabled"または"Enabled for this project")にします。
ステップ3: "メインメニュー"→"プロジェクト"→"オプション"で"プロジェクトオプション"ダイアログを表示し、必要なターゲットを選択("すべての構成 - すべてのプラットフォーム"でいいと思います)して、"Delphiコンパイラ"→"リンク"の"マップファイル, 64ビット Windows, 32ビット Windows, OS X, iOS シミュレータ プラットフォームのみ"を"詳細"に変更します。
ステップ4: "メインメニュー"→"ファイル"→"新規作成"→"その他"で"新規作成"ダイアログを表示して、"Delphiプロジェクト"→"Delphiファイル"から"JCL Exception dialog for Delphi"を選択すると"New exception dialog..."ウィザードが表示されます。ここでPage 1 of 7の"Unit file name"に例外ダイアログのユニット名を入れ、Page 2 of 7の"Sizeable dialog"にチェックして(他の項目はとりあえずデフォルトのままでOK)、"Finish"ボタンをクリックすると例外ダイアログのユニットが作成されます。ただこのままだと表示フォントが英語環境向けなので、プロジェクトで使用しているフォントに合わせたほうがいいと思います(とりあえずフォームをテキスト表示にして"Font.*"の項目を全部削除すればデフォルトになります)。
これでプロジェクトをコンパイルすると確認ダイアログが表示されますが、これは詳細マップを作る設定に変更しますか?という確認なのでそのまま"OK"とします。これでコンパイルされたプログラムを実行すると例外ダイアログが表示されますが、ここで"Details"ボタンをクリックすると、スタックトレースが表示されます。
こんな感じで例外発生までの呼び出し履歴が表示されます。スタックトレースの表示項目はこの場合、左からアドレス、実行ファイル、メソッド、ソースコード内の当該行番号、ユニット名、メソッド先頭からの行オフセットとなっています(リンクされたユニットのデバッグ情報によって表示される項目が異なります)。
JCL Debugを有効にするとプロジェクトファイル(.dpr)の先頭に
また例外ダイアログを使わずログなどに記録するような場合は、
JCL Debugのいいところとしては、無料であること、またJCL/JVCLを入れてあればそれだけで使えることがあげられます。一方でいまいちなところとしては、メインスレッド以外のスレッドを扱うときはTThreadからではなくTJclDebugThreadから派生していないとスタックトレースがとれないこと、リソースDLLで言語切り替えをするプロジェクトでは、言語リソースDLLのコンパイルでいちいちエラーになってJCLの例外ダイアログが表示されること、それ以外にもJCL Debugを有効にしているとIDEでJCLの例外ダイアログが頻繁に表示されること、などがあります。
ところで例外時の(通常の)アドレス表示からソースコードの場所を特定するには、マップファイルを参照します(こちらも詳細がお勧めです)。表示されたアドレスから、マップファイルの先頭にある
のCODEの値、通常は0x00401000を引きます。この値がマップファイル上のアドレス表示の"0001:XXXXXXXX"のXXXXXXXXに相当します。次にマップファイルの"Publics by Value"のリストの"0001:"の部分を上から順に、このアドレスと同じか、より小さく最も近い行を探します。見つかった行が例外を発生させたメソッドになります。さらに詳細マップであれば"Line numbers for"でこのアドレスを探していき、見つかったらそこに書かれているのがユニット(ソースコード)の名前と、行番号になります。
→JclDebugでスタックトレースを取得する(Gist)
Delphiで作成したプログラムを実行中にエラーが発生すると例外が送出されます。
procedure TForm1.Button1Click(Sender: TObject);
var
P: PInteger;
begin
P := nil;
P^ := 42; // EAccessViolation
end;
プログラム上で捕捉されなかった例外(unhandled exception)は、デフォルトの例外の処理としてApplicationオブジェクトで捕捉されてエラーメッセージを表示します。このとき例外の原因になった処理のアドレスは詳細マップファイルを生成しておけばわかります(後述)。しかしエラーが発生した箇所までの実行経路(呼び出し経路)が複雑だったり、Systemユニットにあるような低レベルの関数のように、どこから呼ばれるのかの選択肢が非常に多い箇所でエラーが発生した場合は、単に例外が発生したアドレスがわかるだけでは不十分です。デバッガ上で動作させているのであればDelphiのIDEで例外発生時の呼び出し履歴を見ればよいのですが、客先環境でしか再現しないような場合などでスタックトレースを取ることができれば問題解決の大きな助けになります。そこで簡単にできる方法として、JCL(JEDI Code Library)のJCL Debugを使って例外送出箇所までのスタックトレースを取得してみます(もちろん商用製品のmadExceptやEurekaLogであればもっといろいろなことができるとは思います)。
JCL(JEDI Code Library)はJEDIプロジェクトによるライブラリ群です。ビジュアルコンポーネントのJVCL(JEDI VCL)とともにインストールされていることも多いのではないでしょうか。新たにインストールする場合は、Delphiの複数バージョンがインストールされている環境ではリポジトリ(JCL、JVCL)から取得してインストール、単一のバージョンのみならGetItパッケージマネージャからインストール、Starter SKUであればCC(JCL、JVCL)からバイナリインストーラをダウンロードしてインストール、ということになります(詳細な手順は省略します)。JCLがインストールされると、"メインメニュー"→"プロジェクト"の一番下あたりに"JCL Debug expert"というアイテムが追加されているはずです。
さて、ここまで来れば、必要な手順はたった4つです。プロジェクトを開いておいて、
ステップ1: "JCL Debug expert"の"Generate .jdbg files"を有効("Always enabled"または"Enabled for this project")にします。
ステップ2: "Insert JDBG data into the binary"を有効("Always enabled"または"Enabled for this project")にします。
ステップ3: "メインメニュー"→"プロジェクト"→"オプション"で"プロジェクトオプション"ダイアログを表示し、必要なターゲットを選択("すべての構成 - すべてのプラットフォーム"でいいと思います)して、"Delphiコンパイラ"→"リンク"の"マップファイル, 64ビット Windows, 32ビット Windows, OS X, iOS シミュレータ プラットフォームのみ"を"詳細"に変更します。
ステップ4: "メインメニュー"→"ファイル"→"新規作成"→"その他"で"新規作成"ダイアログを表示して、"Delphiプロジェクト"→"Delphiファイル"から"JCL Exception dialog for Delphi"を選択すると"New exception dialog..."ウィザードが表示されます。ここでPage 1 of 7の"Unit file name"に例外ダイアログのユニット名を入れ、Page 2 of 7の"Sizeable dialog"にチェックして(他の項目はとりあえずデフォルトのままでOK)、"Finish"ボタンをクリックすると例外ダイアログのユニットが作成されます。ただこのままだと表示フォントが英語環境向けなので、プロジェクトで使用しているフォントに合わせたほうがいいと思います(とりあえずフォームをテキスト表示にして"Font.*"の項目を全部削除すればデフォルトになります)。
これでプロジェクトをコンパイルすると確認ダイアログが表示されますが、これは詳細マップを作る設定に変更しますか?という確認なのでそのまま"OK"とします。これでコンパイルされたプログラムを実行すると例外ダイアログが表示されますが、ここで"Details"ボタンをクリックすると、スタックトレースが表示されます。
------------------------------------------------------------------------------
Exception log with detailed tech info. Generated on 2017/11/09 19:39:30.
You may send it to the application vendor, helping him to understand what had happened.
Application title: Project1
Application file: (省略)\Win32\Debug\Project1.exe
------------------------------------------------------------------------------
Exception class: EAccessViolation
Exception message: モジュール 'Project1.exe' のアドレス 005D908C でアドレス 00000000 に対する書き込み違反がおきました。.
Exception address: 005D908C
------------------------------------------------------------------------------
Main thread ID = 2320
Exception thread ID = 2320
------------------------------------------------------------------------------
Exception stack
Stack list, generated 2017/11/09 19:39:30
[005D908C]{Project1.exe} Unit1.TForm1.Button1Click (Line 31, "Unit1.pas" + 2)
[00522143]{Project1.exe} Vcl.Controls.TControl.Click (Line 7442, "Vcl.Controls.pas" + 9)
[00526749]{Project1.exe} Vcl.Controls.TWinControl.WndProc (Line 10160, "Vcl.Controls.pas" + 158)
[0053B254]{Project1.exe} Vcl.StdCtrls.TButtonControl.WndProc (Line 5278, "Vcl.StdCtrls.pas" + 13)
[005268AF]{Project1.exe} Vcl.Controls.DoControlMsg (Line 10229, "Vcl.Controls.pas" + 12)
[00526749]{Project1.exe} Vcl.Controls.TWinControl.WndProc (Line 10160, "Vcl.Controls.pas" + 158)
[005C3E0D]{Project1.exe} Vcl.Forms.TCustomForm.WndProc (Line 4546, "Vcl.Forms.pas" + 209)
[00525D68]{Project1.exe} Vcl.Controls.TWinControl.MainWndProc (Line 9867, "Vcl.Controls.pas" + 3)
[004C590C]{Project1.exe} System.Classes.StdWndProc (Line 17364, "System.Classes.pas" + 8)
[0052685A]{Project1.exe} Vcl.Controls.TWinControl.DefaultHandler (Line 10201, "Vcl.Controls.pas" + 30)
[00526749]{Project1.exe} Vcl.Controls.TWinControl.WndProc (Line 10160, "Vcl.Controls.pas" + 158)
[0053B254]{Project1.exe} Vcl.StdCtrls.TButtonControl.WndProc (Line 5278, "Vcl.StdCtrls.pas" + 13)
[004C590C]{Project1.exe} System.Classes.StdWndProc (Line 17364, "System.Classes.pas" + 8)
------------------------------------------------------------------------------
Call stack for main thread
Stack list, generated 2017/11/09 19:39:30
[773A0C52]{ntdll.dll } ZwGetContextThread
(以下省略)
------------------------------------------------------------------------------
JCL Debugを有効にするとプロジェクトファイル(.dpr)の先頭に
// JCL_DEBUG_EXPERT_GENERATEJDBG ON
// JCL_DEBUG_EXPERT_INSERTJDBG ON
の2行が追加され、リンク時に.mapファイルから.jdbgファイルを生成して、これを実行ファイルに埋め込んでくれます。一方で例外ダイアログではこの.jdbgファイルの情報からスタックトレースに必要な情報を取り出して上記のような表示を行ってくれる、という仕組みです。また例外ダイアログを使わずログなどに記録するような場合は、
unit DumpExceptionStack;
interface
uses
Winapi.Windows,
System.SysUtils,
JclBase, JclDebug;
function DumpLastExceptStackInfoList(const Separator: String = '|'): String;
implementation
function GetStackInfoDescription(const Addr: Pointer): String;
var
Info: TJclLocationInfo;
StartProcInfo: TJclLocationInfo;
OffsetStr: String;
StartProcOffsetStr: String;
FixedProcedureName: String;
UnitNameWithoutUnitscope: String;
begin
OffsetStr := '';
if GetLocationInfo(Addr, Info) = True then
begin
with Info do
begin
FixedProcedureName := ProcedureName;
if Pos(UnitName + '.', FixedProcedureName) = 1 then
begin
FixedProcedureName := Copy(FixedProcedureName,
Length(UnitName) + 2,
Length(FixedProcedureName) - Length(UnitName) - 1);
end
else if Pos('.', UnitName) > 1 then
begin
UnitNameWithoutUnitscope := UnitName;
Delete(UnitNameWithoutUnitscope, 1, Pos('.', UnitNameWithoutUnitscope));
if Pos(UnitNameWithoutUnitscope + '.', FixedProcedureName) = 1 then
begin
FixedProcedureName := Copy(FixedProcedureName, Length(UnitNameWithoutUnitscope) + 2, Length(FixedProcedureName) - Length(UnitNameWithoutUnitscope) - 1);
end;
end;
if LineNumber > 0 then
begin
if (GetLocationInfo(Pointer(TJclAddr(Info.Address) - Cardinal(Info.OffsetFromProcName)), StartProcInfo) = True) and
(StartProcInfo.LineNumber > 0) then
begin
StartProcOffsetStr := Format(' + %d', [LineNumber - StartProcInfo.LineNumber]);
end
else
begin
StartProcOffsetStr := '';
end;
if OffsetFromLineNumber >= 0 then
begin
OffsetStr := Format(' +0x%x', [OffsetFromLineNumber]);
end
else
begin
OffsetStr := Format(' -0x%x', [-OffsetFromLineNumber]);
end;
Result := Format('[0x%p] %s.%s (Line %u, "%s"%s)%s',
[Addr, UnitName, FixedProcedureName, LineNumber, SourceName, StartProcOffsetStr, OffsetStr]);
end
else
begin
OffsetStr := Format(' +0x%x', [OffsetFromProcName]);
if UnitName <> '' then
begin
Result := Format('[0x%p] %s.%s%s', [Addr, UnitName, FixedProcedureName, OffsetStr]);
end
else
begin
Result := Format('[0x%p] %s%s', [Addr, FixedProcedureName, OffsetStr]);
end;
end;
end;
end
else
begin
Result := Format('[0x%p]', [Addr]);
end;
end;
function DumpLastExceptStackInfoList(const Separator: String = '|'): String;
var
I: Integer;
begin
Result := '';
with JclLastExceptStackList do
begin
ForceStackTracing;
for I := 0 to Count - 1 do
begin
Result := Result + GetStackInfoDescription(Items[I].CallerAddr) + Separator;
end;
end;
if Result <> '' then
begin
Delete(Result,Length(Result) - Length(Separator) + 1,Length(Separator));
end;
end;
initialization
// Include(JclStackTrackingOptions, stRawMode);
Include(JclStackTrackingOptions, stStaticModuleList);
JclStartExceptionTracking;
finalization
JclStopExceptionTracking;
end.
このようなユニットをプロジェクトファイルのなるべく先頭のほうでusesしておき、TApplicationEventsコンポーネントのOnExceptionイベントでprocedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
Memo1.Lines.Add(DumpLastExceptStackInfoList(sLineBreak));
end;
というように処理させることもできます。JCL Debugのいいところとしては、無料であること、またJCL/JVCLを入れてあればそれだけで使えることがあげられます。一方でいまいちなところとしては、メインスレッド以外のスレッドを扱うときはTThreadからではなくTJclDebugThreadから派生していないとスタックトレースがとれないこと、リソースDLLで言語切り替えをするプロジェクトでは、言語リソースDLLのコンパイルでいちいちエラーになってJCLの例外ダイアログが表示されること、それ以外にもJCL Debugを有効にしているとIDEでJCLの例外ダイアログが頻繁に表示されること、などがあります。
ところで例外時の(通常の)アドレス表示からソースコードの場所を特定するには、マップファイルを参照します(こちらも詳細がお勧めです)。表示されたアドレスから、マップファイルの先頭にある
Start Length Name Class
0001:00401000 001D3B24H .text CODE
0002:005D5000 0000155CH .itext ICODE
...
→JclDebugでスタックトレースを取得する(Gist)
2017年12月4日
C++17標準規格発行
C++の新しい標準規格であるC++17(C++1z)がISOからISO/IEC 14882:2017として発行されたとのことです。
C++17がISOから発行されました - Faith and Brave - C++で遊ぼう
次の改訂は2020年に予定されているC++2x(C++20)になるようです。C++Builderも早いところC++17をサポートしてほしいものですが、その前にやらなきゃならないことがたくさんありますね…。
C++17がISOから発行されました - Faith and Brave - C++で遊ぼう
次の改訂は2020年に予定されているC++2x(C++20)になるようです。C++Builderも早いところC++17をサポートしてほしいものですが、その前にやらなきゃならないことがたくさんありますね…。
2017年12月1日
2017/12開催のセミナー
- Web Seminar
- Live Seminar
- 2017/12/07 15:00-17:00(JST) 技術セミナー「その方法で大丈夫?今さら聞けないWindows 10ソフトウェア開発」
- 2017/12/13 10:00-17:30(JST) Sencha RAD Mix Tokyo
- Community Event
- 2017/12/19 19:00-21:00(JST) 【初心者歓迎】ゆるふぁい#2 - Delphi のゆる~い集まり(東京都千代田区)
2017/12/19 19:00-20:30(JST) 【誰でも歓迎】ゆるふぁい 松本分室 #2 - Delphi のゆる~い集まり(長野県松本市)
2017年11月15日
Microsoft Monthly Update 2017/11
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 11 月のセキュリティ更新プログラム
2017 年 11 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 11 月のセキュリティ更新プログラム
2017 年 11 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
2017年11月1日
2017/11開催のセミナー
- Web Seminar
- 2017/11/07 21:00-2017/11/08 09:00(JST) CodeRage XII Day 1
- 2017/11/08 21:00-2017/11/09 09:00(JST) CodeRage XII Day 2
- 2017/11/09 21:00-2017/11/10 09:00(JST) CodeRage XII Day 3
- Live Seminar
- 2017/11/21 14:00-17:00(JST) セミナー「Delphi / C++Builder 業務アプリケーション 刷新実践法」
- Community Event
- 2017/11/15 19:00-21:00(JST) 【初心者歓迎】ゆるふぁい#1 - Delphi のゆる~い集まり (東京都千代田区)
- 2017/11/15 19:00-20:30(JST) 【誰でも歓迎】ゆるふぁい 松本分室 #1 - Delphi のゆる~い集まり (長野県松本市)
IDE Fix Pack 6.1.1
Andreas HausladenさんのIDE Fix PackがアップデートされてVersion 6.1.1となっています。Compiler Speed Packの-x-fvsオプションに関する不具合のhotfixとのことです。
2017年10月30日
InterBase 2017 Update 1 Hotfix 1
InterBase 2017 Update 1にHoxfix 1が適用されて再リリースされています。バージョンは13.1.0.284となっています。InterBase 2017 Update 1にはクラッシュする不具合があり、回避策がないとのことで取り下げになっており、InterBase 2017 Update 1 Hotfix 1に置き換えられています(2017/10/30現在でDeveloper/Trial EditionはまだHotfix未適用のもののままのようです)。
30804 InterBase 2017 Update 1 (13.1.0.284) for Windows
30803 InterBase 2017 Update 1 (13.1.0.284) for Linux and macOS
30802 InterBase 2017 Server Ed., Win/Linux/macOS (13.1.0.284, English)
30801 InterBase 2017 Server Ed, Win/Linux/macOS (13.1.0.284, Japanese)
30800 InterBase 2017 ToGo Ed. (13.1.0.284) Win/Linux/macOS/iOS/Android
30738 InterBase 2017 (13.1.0.284) Developer Edition, English
30736 InterBase 2017 (13.1.0.284) Developer Edition, Japanese
Resolved Defects InterBase 2017 Update 1 Hotfix 1: October 2017, bugs fixed in version 2017 Update 1.
InterBase 2017 Update 1 Hotfix 1 is now available for download...
30804 InterBase 2017 Update 1 (13.1.0.284) for Windows
30803 InterBase 2017 Update 1 (13.1.0.284) for Linux and macOS
30802 InterBase 2017 Server Ed., Win/Linux/macOS (13.1.0.284, English)
30801 InterBase 2017 Server Ed, Win/Linux/macOS (13.1.0.284, Japanese)
30800 InterBase 2017 ToGo Ed. (13.1.0.284) Win/Linux/macOS/iOS/Android
30738 InterBase 2017 (13.1.0.284) Developer Edition, English
30736 InterBase 2017 (13.1.0.284) Developer Edition, Japanese
Resolved Defects InterBase 2017 Update 1 Hotfix 1: October 2017, bugs fixed in version 2017 Update 1.
InterBase 2017 Update 1 Hotfix 1 is now available for download...
IDE Fix Pack 6.1
Andreas HausladenさんのIDE Fix PackがアップデートされてVersion 6.1となっています。Compiler Speed PackのオプションをIDEのプロジェクト/コンパイルオプションで指定できるようにして、以下の機能を追加、変更しています。
IDE Fix Pack 6.1 released | Andy's Blog and Tools
- Windows 10 Craetors Update(Version 1703)上でのパフォーマンス上の問題の対応としてDelphi 10.1 Berlinおよびそれ以前のバージョンでDLLの重複インポートを削除する(-x-fdi/デフォルトで有効)
- Borland C++コンパイラの-ffオプションのように浮動小数点演算でfwait命令を削除して演算を高速化する(-x-ff)
- Win32のDelphiコンパイラで仮想メソッドをインタフェース経由で呼び出す場合にXCHG命令を置き換えてCPUが暗黙にロックされるのを避けるような命令を生成する(-x-fvs)
- Win32コンパイラで関数プロローグコードでXCHG命令を置き換える機能(-x-fpr)
- "Compiler64.X86"パッチを小さいいくつかのパッチに分割
- "EditorFocusFix"パッチでドッキングなしのレイアウトでメインフォームがアクティブウィンドウでないときにSetActiveWindowの呼び出しをスキップ
IDE Fix Pack 6.1 released | Andy's Blog and Tools
2017年10月22日
2017年10月11日
Microsoft Monthly Update 2017/10
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 10 月のセキュリティ更新プログラム
2017 年 10 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 10 月のセキュリティ更新プログラム
2017 年 10 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
2017年10月3日
[ebook]Delphi Memory Management For Classic And ARC Compilers
FastSpringで
Delphi Memory Management For Classic And ARC Compilers/Dalija Prasnikar、Neven Prasnikar Jr.著/ePix/ISBN (N/A)/32.50USD
を購入(日本円で税込4,090JPY)。
この本はまだ執筆途中で、First Public Beta Releaseという扱いです。First Editionは2017/10/10予定とのこと。またMemory optimizationsとMemory management toolsの章は後日の無償アップデートで追加されるとのことです。
Delphi Memory Management For Classic And ARC Compilers/Dalija Prasnikar、Neven Prasnikar Jr.著/ePix/ISBN (N/A)/32.50USD
を購入(日本円で税込4,090JPY)。
この本はまだ執筆途中で、First Public Beta Releaseという扱いです。First Editionは2017/10/10予定とのこと。またMemory optimizationsとMemory management toolsの章は後日の無償アップデートで追加されるとのことです。
2017年10月1日
2017/10開催のセミナー
- Web Seminar
- Live Seminar
- 2017/10/19 14:00-17:00(JST) セミナー「Delphi / C++Builder 業務アプリケーション 刷新実践法」
- 2017/10/28 13:00-17:30(JST) Sencha (Ext JS) ハンズオン飯田橋
- Community Event
- 2017/10/31 19:00-21:00(JST) 【初心者歓迎】ゆるふぁい#0 - Delphi のゆる~い集まり
2017年9月29日
IDE Fix Pack 6.0
Andreas HausladenさんのIDE Fix PackがアップデートされてVersion 6.0となっています。RAD Studio/Delphi/C++Builder 10.2.1 Tokyo対応とWindows x64のコンパイル速度の最適化、Delphi 2009のエディタのUTF-8のブロック補完が追加されています。
IDE Fix Pack 6.0 released – dcc64 and 10.2 Update 1 support | Andy's Blog and Tools
IDE Fix Pack 6.0 released – dcc64 and 10.2 Update 1 support | Andy's Blog and Tools
RAD Studio/Delphi/C++Builder 10.2.1 Tokyo iOS 11 Patch
RAD Studio/Delphi/C++Builder 10.2.1 TokyoのPatchがリリースされています。iOS 11への対応と以下の問題の修正、Windows/Linux用を含むPAServerのアップデートが行われているとのことです。
30805 RAD Studio 10.2.1 iOS 11 Patch
Build iOS 11 ready apps with RAD Studio 10.2.1
- [RSP-11653] DTSDKBuild missing from info.plist (version info) iOS builds
- [RSP-18090] Unable to debug to iPad Pro (iOS 10.2) simulator
- [RSP-18813] iOS AdHoc not working with Tokyo 10.2.1
- [RSP-18915] iOS Ad-Hoc Provisioning only works with XCode 8.2
- [RSP-18939] Support all iOS Distribution Types
- [RSP-19101] System status bar IOS 11
30805 RAD Studio 10.2.1 iOS 11 Patch
Build iOS 11 ready apps with RAD Studio 10.2.1
2017年9月26日
InterBase 2017 Update 1
InterBase 2017 Update 1がリリースされています。バージョンは13.1.0.264となっています。新たにWindows 10 Creators UpdateとmacOS 10.11 El Capitan/10.12 Sierra/10.13 High Sierraをサポートし、式インデックスのサポートとGROUP BY/ORDER BYの強化およびいくつかの不具合が修正されています。
30804 InterBase 2017 Update 1 (13.1.0.264) for Windows
30803 InterBase 2017 Update 1 (13.1.0.264) for Linux
30802 InterBase 2017 Server Ed., Win/Linux/macOS (13.1.0.264, English)
30801 InterBase 2017 Server Ed, Win/Linux/macOS (13.1.0.264, Japanese)
30800 InterBase 2017 ToGo Ed. (13.1.0.264) Win/Linux/macOS/iOS/Android
30738 InterBase 2017 (13.1.0.264) Developer Edition, English
30736 InterBase 2017 (13.1.0.264) Developer Edition, Japanese
InterBase 2017 Update 1 Readme (en)
30804 InterBase 2017 Update 1 (13.1.0.264) for Windows
30803 InterBase 2017 Update 1 (13.1.0.264) for Linux
30802 InterBase 2017 Server Ed., Win/Linux/macOS (13.1.0.264, English)
30801 InterBase 2017 Server Ed, Win/Linux/macOS (13.1.0.264, Japanese)
30800 InterBase 2017 ToGo Ed. (13.1.0.264) Win/Linux/macOS/iOS/Android
30738 InterBase 2017 (13.1.0.264) Developer Edition, English
30736 InterBase 2017 (13.1.0.264) Developer Edition, Japanese
InterBase 2017 Update 1 Readme (en)
2017年9月13日
Microsoft Monthly Update 2017/09
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 9 月のセキュリティ更新プログラム
2017 年 9 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 9 月のセキュリティ更新プログラム
2017 年 9 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
2017年9月6日
RAD Studio/Delphi/C++Builder 10.2.1 Tokyo Hotfix for Inherited VCL Form HighDPI Regression
RAD Studio/Delphi/C++Builder 10.2.1 TokyoのHotfixがリリースされています。VCLの継承フォームでDPIスケーリングが行われない問題(RSP-18792)を修正するとのことです。
30798 Hotfix for Inherited VCL Form HighDPI Regression in 10.2.1
Hotfix for Inherited VCL Form HighDPI Regression in 10.2.1 がリリースされました [JAPAN]
30798 Hotfix for Inherited VCL Form HighDPI Regression in 10.2.1
Hotfix for Inherited VCL Form HighDPI Regression in 10.2.1 がリリースされました [JAPAN]
2017年9月1日
2017/09開催のセミナー
- Web Seminar
- 2017/09/22 17:00-18:00(JST) Delphi / C++Builder Starter チュートリアルシリーズ スペシャル
- Live Seminar
- 2017/09/12 14:00-17:00(JST) セミナー「Delphi / C++Builder 業務アプリケーション 刷新実践法」
- 2017/09/21 17:00-19:00(JST) 「RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ」
2017年8月23日
RAD Studio/Delphi/C++Builder 10.2.1 Tokyo iOS Ad Hoc Deployment Patch
RAD Studio/Delphi/C++Builder 10.2.1 TokyoのHotfixがリリースされています。iOS Ad HocアプリケーションをXcode 8.2/8.3.2/8.3.3で作成する場合の問題(RSP-18813)を修正するとのことです。
30797 RAD Studio 10.2.1 iOS Ad Hoc Deployment Patch
RAD Studio 10.2.1 HotFix for iOS AdHoc Deployment
30797 RAD Studio 10.2.1 iOS Ad Hoc Deployment Patch
RAD Studio 10.2.1 HotFix for iOS AdHoc Deployment
2017年8月9日
Microsoft Monthly Update 2017/08
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 8 月のセキュリティ更新プログラム
2017 年 8 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 8 月のセキュリティ更新プログラム
2017 年 8 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
2017年8月8日
RAD Studio/Delphi/C++Builder 10.2 Tokyo Release 1
RAD Studio/Delphi/C++Builder 10.2 TokyoのRelease 1(10.2.1)がリリースされています。
30783 RAD Studio, Delphi, C++Builder 10.2 Release 1 Web Install
30785 RAD Studio, Delphi, C++Builder 10.2 Release 1 ISO
10.2 Tokyo - Release 1 - RAD Studio (en)
List of new features and customer reported issues fixed in RAD Studio 10.2 Tokyo Release 1
RAD Studio 10.2.1 Released Today
RAD Studio 10.2.1をリリース
RAD Studio 10.2 Tokyo Release 1提供開始のご案内 [JAPAN]
Delphi Tokyo Release 1 or 10.2.1 is Now Available
Creators Update BPL Loading Issue and Tokyo Release 1
ただ非常に残念なことに、Andreas HausladenさんのIDE Fix Packは10.2 Tokyoを最後に、これ以降のリリースをサポートしないとアナウンスされており、既に10.2 Tokyo用のダウンロードもできなくなっています。10年近くにわたって非常に有用なソフトウェアを提供してくださったAndreas Hausladenさんに感謝するとともに、このようなパッチがなくてもよいようにIDEの品質向上にEmbarcaderoが注力することを強く望みます(Andreasさんを半年くらいパートタイムで雇用すれば解決するのでは?)。
30783 RAD Studio, Delphi, C++Builder 10.2 Release 1 Web Install
30785 RAD Studio, Delphi, C++Builder 10.2 Release 1 ISO
10.2 Tokyo - Release 1 - RAD Studio (en)
List of new features and customer reported issues fixed in RAD Studio 10.2 Tokyo Release 1
RAD Studio 10.2.1 Released Today
RAD Studio 10.2.1をリリース
RAD Studio 10.2 Tokyo Release 1提供開始のご案内 [JAPAN]
Delphi Tokyo Release 1 or 10.2.1 is Now Available
Creators Update BPL Loading Issue and Tokyo Release 1
ただ非常に残念なことに、Andreas HausladenさんのIDE Fix Packは10.2 Tokyoを最後に、これ以降のリリースをサポートしないとアナウンスされており、既に10.2 Tokyo用のダウンロードもできなくなっています。10年近くにわたって非常に有用なソフトウェアを提供してくださったAndreas Hausladenさんに感謝するとともに、このようなパッチがなくてもよいようにIDEの品質向上にEmbarcaderoが注力することを強く望みます(Andreasさんを半年くらいパートタイムで雇用すれば解決するのでは?)。
2017年8月3日
2017年8月1日
2017/08開催のセミナー
- Web Seminar
- Live Seminar
- 2018/08/01 10:00-17:30(JST) 第34回 エンバカデロ・デベロッパーキャンプ・イン大阪
- 2017/08/03 14:00-17:00(JST) セミナー「Delphi / C++Builder 業務アプリケーション 刷新実践法」
- 2017/08/25 17:00-19:00(JST) 「RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ」
2017年7月28日
第34回エンバカデロ・デベロッパーキャンプ・イン東京
本日10:00から第34回エンバカデロ・デベロッパーキャンプ・イン東京がコングレスクエア中野で行われます。今回もUStreamによるライブ中継が行われます。
- 第34回 エンバカデロ・デベロッパーキャンプ・イン東京
- 【G1】ジェネラルセッション「モダナイゼーションを支援するエンバカデロのRADテクノロジー」
- 【G2】テクニカルセッション「これが定番!RAD Studioで実践する既存システムのモダナイズ」
- 【A3】Delphi/C++テクニカルセッション「既存のVCLアプリでもモバイル活用!簡単マルチデバイス連携術」
- 【B3】テクニカルケーススタディ「Delphi 64bitで実現した大規模VR空間対応の新バージョン『UC-win/Road Ver.12』開発の道のり」
- 【A4】Delphi/C++/InterBaseテクニカルセッション「基幹系だけじゃない!シーン別データベース活用術 - モバイル、デスクトップから多層、クラウドまで、コスト節約と性能実現のキモ」
- 【B4】Delphiテクニカルセッション「Delphiで超高速OpenGL 2D/3D描画 - FireMonkey / VCLコンポーネントで驚きの性能実現」
- 【A5】Delphiテクニカルセッション「クロスプラットフォーム開発で役立つDelphi新機能活用ポイント」
- 【B5】Delphi / C++テクニカルセッション「プロジェクトが大きくなっても慌てない!RAD Studioチーム開発の心得」
- 【G6】ライトニングトーク「共有!みんなの開発事例、開発経験、テクニック」
- 第34回 エンバカデロ・デベロッパーキャンプ・イン大阪
- 【T1】Delphiテクニカルセッション「知って得する!今日から使えるDelphi実践テクニック」
- 【T2】Delphi/C++/InterBaseテクニカルセッション「データベースとデータアクセスを見直そう!シーン別データベース活用実践 - コスト節約と性能実現のキモ」
- 【G3】ジェネラルセッション「モダナイゼーションを支援するエンバカデロのRADテクノロジー」
- 【T4】テクニカルセッション「これが定番!RAD Studioで実践する既存システムのモダナイズ」
- 【T5】Delphi/C++テクニカルセッション「既存アプリをマルチデバイス活用に進化!VCLからのモバイル連携3段活用」
- 【G6】ライトニングトーク「共有!みんなの開発事例、開発経験、テクニック」
2017年7月19日
[書籍][ebook]Expert Delphi
Packt Publishingで注文した
Expert Delphi (amazon US, amazon JP)/Paweł Głowacki著/Packt Publishing/ISBN 9781786460165/49.99USD(Print+eBook)
が配送されてきました(今回の配送もDHL/佐川急便で、インドはチェンナイ(旧マドラス)からの発送でした)。2017/07/11に注文して8日目の到着、49.99USDから20% discountで40.00USD=4,576JPY4,676JPY(暫定、1USD=114.40JPY116.900JPY)でした。
Expert Delphi (amazon US, amazon JP)/Paweł Głowacki著/Packt Publishing/ISBN 9781786460165/49.99USD(Print+eBook)
が配送されてきました(今回の配送もDHL/佐川急便で、インドはチェンナイ(旧マドラス)からの発送でした)。2017/07/11に注文して8日目の到着、49.99USDから20% discountで40.00USD=
2017年7月12日
Microsoft Monthly Update 2017/07
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 7 月のセキュリティ更新プログラム
2017 年 7 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 7 月のセキュリティ更新プログラム
2017 年 7 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
2017年7月7日
2017年7月1日
2017/07開催のセミナー
- Web Seminar
- Live Seminar
- 2017/07/06 16:00-18:00(JST) セミナー「モバイル、クラウド、IoT時代にどう立ち向かう?これからのDBアプリケーション開発」
- 2017/07/28 10:00-18:00(JST) 第34回 エンバカデロ・デベロッパーキャンプ・イン東京
- 2017/07/06 16:00-18:00(JST) セミナー「モバイル、クラウド、IoT時代にどう立ち向かう?これからのDBアプリケーション開発」
2017年6月23日
[書籍]Effective Debugging
紀伊國屋書店新宿本店でEffective Debugging (amazon US)の翻訳である
Effective Debugging (amazon)/Diomidis Spinellis著/黒川利明訳/大岩尚宏技術監修/オライリージャパン/ISBN 978-4-87311-799-7/3,456円
を購入。
Effective Debugging (amazon)/Diomidis Spinellis著/黒川利明訳/大岩尚宏技術監修/オライリージャパン/ISBN 978-4-87311-799-7/3,456円
を購入。
[書籍]改訂新版 C#ポケットリファレンス
紀伊國屋書店新宿本店で
[改訂新版]C#ポケットリファレンス (amazon)/WINGSプロジェクト、土井毅、髙江賢、飯島聡著/山田祥寛監修/技術評論社/ISBN 978-4-7741-9030-3/2,851円
を購入。
[改訂新版]C#ポケットリファレンス (amazon)/WINGSプロジェクト、土井毅、髙江賢、飯島聡著/山田祥寛監修/技術評論社/ISBN 978-4-7741-9030-3/2,851円
を購入。
RAD Studio/Delphi/C++Builder 10.2 Tokyo Android Compatibility Pack
RAD Studio/Delphi/C++Builder 10.2 TokyoのHotfixがリリースされています。以下の新しいバージョンのAndroid上でのテキストの入力の問題(10.1 Berlinでも発生)とレンダリングや性能上の問題(10.2 Tokyoで発生)を修正するとのことです。
30782 Source code for FireMonkey Android Compatibility Patch
RAD Studio 10.2 向け FireMonkey の Android互換性 パッチ [JAPAN]
なおこのHotfixよりも先に30764 April 2017 RAD Studio 10.2 Hotfix for Toolchain Issuesをインストールする必要があるとのことです(30781を適用後に30764を適用した場合、再度30781を適用しなければならない)。
- [RSP-17308] TForm.Close and caFree not Working with Android
- [RSP-17120] caFree not working (Android)
- [RSP-17162] android app made with Tokyo are super slow
- [RSP-17165] TAniIndicator fails to draw correctly on Android
- [RSP-17173] Android Severe painting problems - Worked in Berlin Version
- [RSP-17177] Android Application->OnIdle Failed
- [RSP-17189] Application crash with 'Can not activate current context' exception
- [RSP-17636] Android Painting cannot handle bitmap canvas paints
- [RSP-17652] TListView Performance Degraded when compiled with Tokyo
- [RSP-17654] TImageList saved in Berlin, do not show its imagens in Tokio at runtime in Android.
- [RSP-17663] Delphi 10.2 Tokyo (Mobile platform) - use the FmxObject.AddObject component will occurs image overlay problem
- [RSP-17687] Bitmap is no more displayed on Android 4.1.2 device
- [RSP-17738] Delphi 10.2 Tokyo (Android platform) - TabControl problem
- [RSP-17803] FMX TListBox does not display images
- [RSP-17816] FillText problem on Android
- [RSP-15074] TMemo adds text when clearing Text on Android 6
- [RSP-15775] Android class initialization limitation (segmentation fault)
- [RSP-16149] Android 7 Nougat Using TEdit, pressing return on android keyboard wraps text.
- [RSP-17262] SubClassed FMX TEdit runs on Win32, Not on Android. Seg fault.
- [RSP-16668] App crashes on use of Backspace key in a TEdit
- [RSP-16778] Problem to edit text in tedit and tmemo in Android 6
- [RSP-17232] Duplicate words appear on pressing backspace in an FMX TEdit in android
- [RSP-17546] SubscribeToMessage in Android will crash
- [RSP-17346] Android TEdit and TMemo clipboard copy/cut is not working
- [RSP-16935] Android's TMemo and TEdit Cursor Issue + Suggested Complete Solution
30782 Source code for FireMonkey Android Compatibility Patch
RAD Studio 10.2 向け FireMonkey の Android互換性 パッチ [JAPAN]
なおこのHotfixよりも先に30764 April 2017 RAD Studio 10.2 Hotfix for Toolchain Issuesをインストールする必要があるとのことです(30781を適用後に30764を適用した場合、再度30781を適用しなければならない)。
2017年6月14日
Microsoft Monthly Update 2017/06
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 6 月のセキュリティ リリース
2017 年 6 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 6 月のセキュリティ リリース
2017 年 6 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
2017年6月1日
[書籍]Windows Sysinternals徹底解説 改訂新版
紀伊國屋書店新宿本店でWindows Sysinternals徹底解説の改訂版でTroubleshooting with the Windows Sysinternals Tools, 2nd Edition (amazon US)の翻訳である
Windows Sysinternals徹底解説 改訂新版 (amazon)/Mark Russinovich、Aaron Margosis著/山内和朗訳/日経BP/ISBN 978-4-82229-896-8/5,940円
を購入。
Windows Sysinternals徹底解説 改訂新版 (amazon)/Mark Russinovich、Aaron Margosis著/山内和朗訳/日経BP/ISBN 978-4-82229-896-8/5,940円
を購入。
2017/06開催のセミナー
- Web Seminar
- Live Seminar
- 2017/06/15 14:00-17:00(JST) セミナー「Delphi / C++Builder 業務アプリケーション 刷新実践法」
- 2017/06/22 17:00-19:00(JST) 「RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ」
2017年5月31日
[書籍]Delphi in Depth: FireDAC
Amazon (US)で注文した
Delphi in Depth: FireDAC (CreateSpace, amazon US)/Cary Jensen著/CreateSpace/ISBN 978-1546391272/49.99USD
が配送されてきました(今回の発送地はアメリカ合衆国デラウェア州、配送はUPS i-parcel/佐川急便でした)。2017/05/19に注文して12日目の到着、Dependency Injection In Delphiと合わせてShipping & Handlingが10.97USDで計60.96USD=6,787JPY6,979JPY(暫定、1USD=111.33JPY1USD=114.479JPY)でした。
Delphi in Depth: FireDAC (CreateSpace, amazon US)/Cary Jensen著/CreateSpace/ISBN 978-1546391272/49.99USD
が配送されてきました(今回の発送地はアメリカ合衆国デラウェア州、配送はUPS i-parcel/佐川急便でした)。2017/05/19に注文して12日目の到着、Dependency Injection In Delphiと合わせてShipping & Handlingが10.97USDで計60.96USD=
2017年5月12日
RAD Studio ロードマップ 2017/05
RAD Studioのロードマップの2017/05版が公開されています。
RAD Studio Roadmap May 2017
May 2017 Roadmap Commentary from Product Management
日本語訳もそのうち公開されると思われますが、注目点をいくつかピックアップしておきます。
RAD Studioロードマップ(2017年5月付)
2017/05/22追記: コメントについても日本語訳が公開されています。
製品マネージャからの2017年5月付け製品ロードマップに関するコメント
RAD Studio Roadmap May 2017
May 2017 Roadmap Commentary from Product Management
日本語訳もそのうち公開されると思われますが、注目点をいくつかピックアップしておきます。
- RAD Studio 10.2.1 Tokyoは今年(2017年)半ばくらいにリリース、C++BuilderのLinux Serverサポートを追加
- RAD Studio 10.2.2 Tokyoは2017年末くらいにリリース、AndroidのZ-オーダサポートとWindows 10/WinRT関係の更新、C++のリファクタリングでリネーム機能のサポートとコード補完、コードインサイトの強化といったあたり
- RAD Studio 10.3 コードネーム "Carnival"は2018年で、FMXでAndroidのネイティブコントロールのサポート、LLDBの統合、C++17サポート、Delphiで64bit macOSのサポートの追加、DelphiでNullable型サポートや文法面の強化など
RAD Studioロードマップ(2017年5月付)
2017/05/22追記: コメントについても日本語訳が公開されています。
製品マネージャからの2017年5月付け製品ロードマップに関するコメント
Category:
Around Delphi,
CBuilder,
Delphi 10.2 Tokyo,
Delphi 10.3 Rio,
Embarcadero
at
14:32:00
0
Comments
2017年5月10日
Microsoft Monthly Update 2017/05
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 5 月のセキュリティ更新プログラム (en)
2017 年 5 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
リリース ノート 2017 年 5 月のセキュリティ更新プログラム (en)
2017 年 5 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
2017年5月4日
RAD Studio/Delphi/C++Builder 10.2 Tokyo April 2017 Hotfix for Toolchain Issues
RAD Studio/Delphi/C++Builder 10.2 TokyoのHotfixがリリースされています。デバッガ、C++ RTL、Delphiコンパイラの以下の問題を修正するとのことです。
April 2017 RAD Studio 10.2 Hotfix for Toolchain Issues
RAD Studio 10.2 Hotfix for Toolchain Issues リリース [JAPAN]
- デバッガ
- Android/Linuxで関数を評価するときに例外を投げたりaccess violationが起きるとデバッグ中のアプリケーションが終了してしまうことがある
- AndroidでDelphi文字列に関係するいくつかの問題
- Linuxでほかのユニットで定義されているインライン関数を展開したときに行番号情報がないためにデバッグできない
- iOSとAndroidでレコード型の動的配列を評価しようとするとデバッガがクラッシュする(iOS)またはnilが表示される(Android)
- Linuxでクラスデストラクタをデバッグしようとすると2つのブレークポイントが必要になることがある
- C++ RTL
- [RSP-16394] AV on exit after FreeLibrary: WindowsアプリケーションでLoadLibraryを使用して動的にライブラリをロードしていると終了時にaccess violationが発生することがある
- scanfと関係するメソッド(_sのようなセキュリティ強化版を含む)の不具合で、出力バッファのサイズを超えて入力データで上書きされる
- Delphiコンパイラ
- C++ Windows x64アプリケーションにDelphiユニットを静的にリンクするとリソース文字列が破損する
- [RSP-17138] Win64 compilation stuck at linking: Delphi Windows x64コンパイラが応答しなくなりCPUを100%使用した状態になることがある
April 2017 RAD Studio 10.2 Hotfix for Toolchain Issues
RAD Studio 10.2 Hotfix for Toolchain Issues リリース [JAPAN]
InterBase XE7 Update 7
InterBase XE7 Update 7がリリースされています。バージョンは12.0.7.384となっています。
30768 InterBase XE7 Update 7 (12.0.7.384) for Windows
30769 InterBase XE7 Update 7 (12.0.7.384) for Linux
30770 InterBase XE7 ToGo Edition (12.0.7.384), Win/OSX/iOS/Android
InterBase XE7 Update 7 Readme (en)
解決された不具合 (en)
InterBase XE7 Update 7 – now available
30768 InterBase XE7 Update 7 (12.0.7.384) for Windows
30769 InterBase XE7 Update 7 (12.0.7.384) for Linux
30770 InterBase XE7 ToGo Edition (12.0.7.384), Win/OSX/iOS/Android
InterBase XE7 Update 7 Readme (en)
解決された不具合 (en)
InterBase XE7 Update 7 – now available
2017年5月1日
2017/05開催のセミナー
- Web Seminar
- Live Seminar
- 2017/05/18 17:00-19:00(JST) 「RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ」
- 2017/05/26 14:00-17:00(JST) セミナー「Delphi / C++Builder 業務アプリケーション 刷新実践法」
- 2017/05/30 16:00-18:00(JST) セミナー「モバイル、クラウド、IoT時代にどう立ち向かう?これからのDBアプリケーション開発」
2017年4月17日
[書籍][ebook]プロフェッショナルSSL/TLS
Bulletproof SSL and TLS (amazon US)の翻訳である
プロフェッショナルSSL/TLS/Ivan Ristic著/齋藤孝道監訳/ラムダノート/ISBN 978-4-908686-00-9/5,399円(紙書籍+電子書籍(PDF))、4,860円(電子書籍(PDF)のみ)
を購入。PDFは購入後すぐにダウンロード可能、紙書籍は別途2017/05/10前後に配送(配送費別、540円)とのこと。
2017/05/11追記: 書籍版が配送されてきました(配送は佐川急便でした)。
プロフェッショナルSSL/TLS/Ivan Ristic著/齋藤孝道監訳/ラムダノート/ISBN 978-4-908686-00-9/5,399円(紙書籍+電子書籍(PDF))、4,860円(電子書籍(PDF)のみ)
を購入。PDFは購入後すぐにダウンロード可能、紙書籍は別途2017/05/10前後に配送(配送費別、540円)とのこと。
2017/05/11追記: 書籍版が配送されてきました(配送は佐川急便でした)。
2017年4月12日
Microsoft Monthly Update 2017/04
今日はMicrosoftのセキュリティアップデートの日です。
リリース ノート 2017 年 4 月のセキュリティ更新プログラム (en)
2017 年 4 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
今月からセキュリティ情報の公開は廃止されています。またWindows Vistaの延長サポートが終了となっています。
リリース ノート 2017 年 4 月のセキュリティ更新プログラム (en)
2017 年 4 月のセキュリティ更新プログラム (月例) – 日本のセキュリティチーム
今月からセキュリティ情報の公開は廃止されています。またWindows Vistaの延長サポートが終了となっています。
2017年4月10日
IDE Fix Pack 5.96/DDevExtensions 2.84 for RAD Studio/Delphi/C++Builder 10.2 Tokyo
Andreas HausladenさんのIDE Fix PackがアップデートされてVersion 5.96となっています。RAD Studio/Delphi/C++Builder 10.2 Tokyo対応といくつかの修正が行われています。またDDevExtensions Version 2.84もRAD Studio/Delphi/C++Builder 10.2 Tokyo対応が行われています。
IDE Fix Pack 5.96, DDevExtensions, DFMCheck for Delphi 10.2 | Andy's Blog and Tools
IDE Fix Pack 5.96, DDevExtensions, DFMCheck for Delphi 10.2 | Andy's Blog and Tools
2017年4月1日
2017/04開催のセミナー
- Web Seminar
- Live Seminar
- 2017/04/14 14:00-17:00(JST) セミナー「Delphi / C++ Builder 業務アプリケーション 刷新実践法」
2017年3月23日
RAD Studio/Delphi/C++Builder 10.2 Tokyoリリース
RAD Studio/Delphi/C++Builder 10.2 Tokyoがリリースされています。
RAD Studio 10.2 Tokyo ヘルプ (en)
リリース ノート (en)
インストール ノート (en)
新機能 (en)
RAD Studio 10.2 Tokyo 新機能および不具合修正リスト (en)
30722 RAD Studio, Delphi, C++Builder 10.2 Tokyo Web Install
30724 RAD Studio, Delphi, C++Builder 10.2 Tokyo ISO
30765 Linux libmidas file for RAD Studio, Delphi, C++Builder 10.2
30780 RAD Studio 10.2 Tokyo FireMonkey Accessibility Pack
30752 BDE Installer for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30728 FastReport VCL for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30729 FastReport FMX for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30730 IP*Works for RAD Studio, Delphi 10.2 Tokyo
30731 IP*Works for RAD Studio, C++Builder 10.2 Tokyo
30750 Codesite for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30761 Jedi Code Library Snapshot Binary Installer for 10.2
30762 Jedi Visual Component Library Snapshot Bin-Installer 10.2
GitHub - lynatan/StarterFix: Restore Form Designer Options for Starter edition.
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】C++ コンパイラ 周りの改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】FireDAC、データベース接続周りの改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】RAD Server の改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】IDEまわりの改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】ライブラリ周りの機能など - Qiita
What's New in C++Builder 10.2: Part 1 - The Linker
What's New in C++Builder 10.2: Part 2 - Code Generation
What's New in C++Builder 10.2: Part 3 - Debugging
RAD Studio 10.2 Tokyo ヘルプ (en)
リリース ノート (en)
インストール ノート (en)
新機能 (en)
RAD Studio 10.2 Tokyo 新機能および不具合修正リスト (en)
30722 RAD Studio, Delphi, C++Builder 10.2 Tokyo Web Install
30724 RAD Studio, Delphi, C++Builder 10.2 Tokyo ISO
30765 Linux libmidas file for RAD Studio, Delphi, C++Builder 10.2
30780 RAD Studio 10.2 Tokyo FireMonkey Accessibility Pack
30752 BDE Installer for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30728 FastReport VCL for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30729 FastReport FMX for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30730 IP*Works for RAD Studio, Delphi 10.2 Tokyo
30731 IP*Works for RAD Studio, C++Builder 10.2 Tokyo
30750 Codesite for RAD Studio, Delphi, C++Builder 10.2 Tokyo
30761 Jedi Code Library Snapshot Binary Installer for 10.2
30762 Jedi Visual Component Library Snapshot Bin-Installer 10.2
GitHub - lynatan/StarterFix: Restore Form Designer Options for Starter edition.
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】C++ コンパイラ 周りの改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】FireDAC、データベース接続周りの改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】RAD Server の改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】IDEまわりの改善など - Qiita
【Delphi / C++Builder 10.2 Tokyo 新機能・改善点】ライブラリ周りの機能など - Qiita
What's New in C++Builder 10.2: Part 1 - The Linker
What's New in C++Builder 10.2: Part 2 - Code Generation
What's New in C++Builder 10.2: Part 3 - Debugging
2017年3月22日
ジェネリックスのリストをアルゴリズムを指定してソートする
Delphi 2009で導入されたジェネリックスのコンテナの一つであるTList<T>にはSortメソッドがあり、比較関数としてデフォルト以外のComparer(コンペアラ)も渡すことができるのですが、ソートアルゴリズムそのものはクイックソートしかありません。一般的には平均して性能が出るとされるクイックソートですが、安定ではないこと、苦手な状況が存在することなど、決して万能というわけではありません。ところがTList<T>.Sortは内部で保持しているTArray.Sortにソートを丸投げしており、ソートアルゴリズムを変更することができません。そこでアルゴリズムを指定してTList<T>(およびTObjectList<T: class>)をソートする方法を考えてみました。ただしDelphi 2009のTList<T>にはExchangeメソッドもMoveメソッドも存在していないため、Delphi 2010以降の対応になります。
まずソートを行うためのレコード型と、ソートアルゴリズムを実装するクラスの継承元クラスの宣言です。
→ジェネリックスのリストをアルゴリズムを指定してソートする(Gist)
まずソートを行うためのレコード型と、ソートアルゴリズムを実装するクラスの継承元クラスの宣言です。
{$IF RTLVersion <= 20.00}
{$MESSAGE ERROR 'Need Delphi 2010 or later'}
{$IFEND}
uses
{$IF RTLVersion >= 23.00}
System.Rtti, System.Generics.Defaults, System.Generics.Collections;
{$ELSE}
Rtti, Generics.Defaults, Generics.Collections;
{$IFEND}
type
{ Forward declarations }
TSortAlgorithm<T> = class;
{ TGenericListSorter }
TGenericListSorter = record
private
class function GetComparer<T>(List: TList<T>; const AComparer: IComparer<T>): IComparer<T>; static;
public
class procedure Sort<T: record>(List: TList<T>; Algorithm: TSortAlgorithm<T>;
const AComparer: IComparer<T>{$IF CompilerVersion >= 24.00} = nil{$IFEND}); overload; static;
{$IF CompilerVersion < 24.00}
class procedure Sort<T: record>(List: TList<T>; Algorithm: TSortAlgorithm<T>); overload; static;
{$IFEND}
class procedure Sort<T: class>(List: TObjectList<T>; Algorithm: TSortAlgorithm<T>;
const AComparer: IComparer<T>{$IF CompilerVersion >= 24.00} = nil{$IFEND}); overload; static;
{$IF CompilerVersion < 24.00}
class procedure Sort<T: class>(List: TObjectList<T>; Algorithm: TSortAlgorithm<T>); overload; static;
{$IFEND}
class procedure Sort(List: TList<String>; Algorithm: TSortAlgorithm<String>;
const AComparer: IComparer<String>{$IF CompilerVersion >= 24.00} = nil{$IFEND}); overload; static;
{$IF CompilerVersion < 24.00}
class procedure Sort(List: TList<String>; Algorithm: TSortAlgorithm<String>); overload; static;
{$IFEND}
end;
{ TSortAlgorithm (abstract) }
TSortAlgorithm<T> = class(TObject)
public
class function Instance: TSortAlgorithm<T>; virtual; abstract;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); virtual; abstract;
end;
TGenericListSorterはソートを行うためのレコード型で、overloadされたpublicな3つ(XE2およびそれ以前は6つ、後述)のSortメソッドと、比較を行うコンペアラを決定するためのprivateなGetComparerメソッドを持ちます。Sortメソッドの1つめは値型用(レコード制約)、2つめはクラス型用(クラス制約)、3つめはこのどちらにも含まれない文字列型用です。IComparer<T>にデフォルトパラメータを指定できるのはDelphi XE3以降のため、それ以前のバージョンではコンペアラを指定しないオーバロードをさらに3つ用意しました。またTSortAlgorithm<T>はソートアルゴリズムを実装するためのクラスの継承元になります。実際にソートを行うSortメソッドと、シングルトンなインスタンスを取得するためのInstanceメソッドを持ちます。TGenericListSorterの実装は次のようになります。
class procedure TGenericListSorter.Sort<T>(List: TList<T>; Algorithm: TSortAlgorithm<T>;
const AComparer: IComparer<T>);
var
Comparer: IComparer<T>;
begin
if (List = nil) or (List.Count <= 1) then
begin
Exit;
end;
Comparer := GetComparer<T>(List,AComparer);
Algorithm.Sort(List,Comparer);
end;
{$IF CompilerVersion < 24.00}
class procedure TGenericListSorter.Sort<T>(List: TList<T>; Algorithm: TSortAlgorithm<T>);
var
Comparer: IComparer<T>;
begin
if (List = nil) or (List.Count <= 1) then
begin
Exit;
end;
Comparer := GetComparer<T>(List,nil);
Algorithm.Sort(List,Comparer);
end;
{$IFEND}
class procedure TGenericListSorter.Sort<T>(List: TObjectList<T>; Algorithm: TSortAlgorithm<T>;
const AComparer: IComparer<T>);
var
Comparer: IComparer<T>;
OwnsObjects: Boolean;
begin
if (List = nil) or (List.Count <= 1) then
begin
Exit;
end;
Comparer := GetComparer<T>(List,AComparer);
OwnsObjects := List.OwnsObjects;
try
List.OwnsObjects := False;
Algorithm.Sort(List,Comparer);
finally
List.OwnsObjects := OwnsObjects;
end;
end;
{$IF CompilerVersion < 24.00}
class procedure TGenericListSorter.Sort<T>(List: TObjectList<T>; Algorithm: TSortAlgorithm<T>);
var
Comparer: IComparer<T>;
OwnsObjects: Boolean;
begin
if (List = nil) or (List.Count <= 1) then
begin
Exit;
end;
Comparer := GetComparer<T>(List,nil);
OwnsObjects := List.OwnsObjects;
try
List.OwnsObjects := False;
Algorithm.Sort(List,Comparer);
finally
List.OwnsObjects := OwnsObjects;
end;
end;
{$IFEND}
class procedure TGenericListSorter.Sort(List: TList<String>; Algorithm: TSortAlgorithm<String>;
const AComparer: IComparer<String>);
var
Comparer: IComparer<String>;
begin
if (List = nil) or (List.Count <= 1) then
begin
Exit;
end;
Comparer := GetComparer<String>(List,AComparer);
Algorithm.Sort(List,Comparer);
end;
{$IF CompilerVersion < 24.00}
class procedure TGenericListSorter.Sort(List: TList<String>; Algorithm: TSortAlgorithm<String>);
var
Comparer: IComparer<String>;
begin
if (List = nil) or (List.Count <= 1) then
begin
Exit;
end;
Comparer := GetComparer<String>(List,nil);
Algorithm.Sort(List,Comparer);
end;
{$IFEND}
class function TGenericListSorter.GetComparer<T>(List: TList<T>; const AComparer: IComparer<T>): IComparer<T>;
var
ctx: TRttiContext;
begin
Result := AComparer;
if Result = nil then
begin
Result := ctx.GetType(List.ClassType).GetField('FComparer').GetValue(List).AsType<IComparer<T>>;
end;
end;
Sortメソッドはいずれもコンペアラを確定し、指定されたソートアルゴリズムのインスタンスのSortメソッドを呼び出しています。ただしTObjectList<T>用のオーバロードはソートを行っている間、一時的にOwnsObjectsをFalseに変更しています。これはOwnsObjectsがTrueだと(以下の例のマージソートのように)Items[]に代入を行ったときに、もともと格納されているTのインスタンスを解放してしまうためで、ソートアルゴリズムのクラスで直接ソートを行うのではなく、レコード型TGenericListSorterの3つのオーバロードに処理を分けて、そこから間接的に呼び出すようになっているのはこれが理由です。またGetComparerメソッドはコンペアラが指定されていない(=nil)ときに、TList<T>の持つデフォルトのコンペアラを(RTTIを使って)取得します。
次に実際のソートアルゴリズムを実装したクラスですが、まずコムソートを実装してみます。
type
TCombSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor TCombSort<T>.Destroy;
begin
FInstance.Free;
end;
class function TCombSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure TCombSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
const
SHRINK_FACTOR = 1.247330950103979;
var
Index: Integer;
Gap: Integer;
Swapped: Boolean;
begin
Gap := List.Count;
Swapped := True;
while (Gap > 1) or (Swapped = True) do
begin
if Gap > 1 then
begin
Gap := Trunc(Gap / SHRINK_FACTOR);
end;
if Gap < 1 then
begin
Gap := 1;
end;
Swapped := False;
Index := 0;
while (Gap + Index) < List.Count do
begin
if AComparer.Compare(List.Items[Index],List.Items[Index + Gap]) > 0 then
begin
List.Exchange(Index,Index + Gap);
Swapped := True;
end;
Index := Index + 1;
end;
end;
end;
前述の通り(TGenericListSorterとは異なり)1種類の<T>に対してのみSortを実装すればよいようになっています。またSortメソッド以外にシングルトンなインスタンスを取得するためのInstanceメソッドと、そのインスタンスを解放するためのクラスデストラクタを用意します。これで例えばInteger型のリストに対しては
var
I: Integer;
Value: Integer;
List: TList<Integer>;
begin
List := TList<Integer>.Create;
try
for I := 0 to 999 do
begin
List.Add(Random(100000));
end;
TGenericListSorter.Sort<Integer>(List,TCombSort<Integer>.Instance,TComparer<Integer>.Construct(
function(const Left, Right: Integer): Integer
begin
Result := Left - Right;
end));
for Value in List do
begin
Memo1.Lines.Add(IntToStr(Value));
end;
finally
List.Free;
end
end;
このような形でソートを呼び出すことができます。
同じようにその他のソートアルゴリズムを実装していきます。ノームソートです。
type
TGnomeSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor TGnomeSort<T>.Destroy;
begin
FInstance.Free;
end;
class function TGnomeSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure TGnomeSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
var
Index: Integer;
begin
Index := 0;
while Index < List.Count do
begin
if (Index = 0) or (AComparer.Compare(List.Items[Index],List.Items[Index - 1]) >= 0) then
begin
Index := Index + 1;
end
else
begin
List.Exchange(Index,Index - 1);
Index := Index - 1;
end;
end;
end;
選択ソートです。
type
TSelectionSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor TSelectionSort<T>.Destroy;
begin
FInstance.Free;
end;
class function TSelectionSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure TSelectionSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
var
Index1: Integer;
Index2: Integer;
MinIndex: Integer;
Temp: T;
begin
for Index1 := 0 to List.Count - 2 do
begin
MinIndex := Index1;
Temp := List.Items[MinIndex];
for Index2 := Index1 + 1 to List.Count - 1 do
begin
if AComparer.Compare(List.Items[Index2],Temp) < 0 then
begin
MinIndex := Index2;
Temp := List.Items[MinIndex];
end;
end;
if MinIndex <> Index1 then
begin
List.Move(MinIndex,Index1);
end;
end;
end;
挿入ソートです。
type
TInsertionSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor TInsertionSort<T>.Destroy;
begin
FInstance.Free;
end;
class function TInsertionSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure TInsertionSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
var
Comparer: IComparer<T>;
Index1: Integer;
Index2: Integer;
Temp: T;
begin
for Index1 := 1 to List.Count - 1 do
begin
Temp := List.Items[Index1];
Index2 := Index1 - 1;
while (Index2 >= 0) and (AComparer.Compare(List.Items[Index2],Temp) > 0) do
begin
Index2 := Index2 - 1;
end;
List.Move(Index1,Index2 + 1);
end;
end;
クイックソートです。
type
TQuickSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
class procedure InternalSort(List: TList<T>; Left: Integer; Right: Integer;
const AComparer: IComparer<T>);
class function Partition(List: TList<T>; Left: Integer; Right: Integer;
const AComparer: IComparer<T>): Integer;
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor TQuickSort<T>.Destroy;
begin
FInstance.Free;
end;
class function TQuickSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure TQuickSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
var
Comparer: IComparer<T>;
begin
InternalSort(List,0,List.Count - 1,AComparer);
end;
class procedure TQuickSort<T>.InternalSort(List: TList<T>; Left: Integer; Right: Integer;
const AComparer: IComparer<T>);
var
Pivot: Integer;
begin
if Left < Right then
begin
Pivot := Partition(List,Left,Right,AComparer);
InternalSort(List,Left, Pivot,AComparer);
InternalSort(List,Pivot + 1,Right,AComparer);
end;
end;
class function TQuickSort<T>.Partition(List: TList<T>; Left: Integer; Right: Integer;
const AComparer: IComparer<T>): Integer;
var
Index1: Integer;
Index2: Integer;
Pivot: T;
begin
Pivot := List.Items[(Left + Right) div 2];
Index1 := Left - 1;
Index2 := Right + 1;
while True do
begin
repeat
Index1 := Index1 + 1;
until (AComparer.Compare(List.Items[Index1],Pivot) >= 0);
repeat
Index2 := Index2 - 1;
until (AComparer.Compare(List.Items[Index2],Pivot) <= 0);
if Index1 >= Index2 then
begin
Result := Index2;
Exit;
end;
List.Exchange(Index1,Index2);
end;
end;
ヒープソートです。
type
THeapSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
class procedure BuildHeap(List: TList<T>; const AComparer: IComparer<T>);
class procedure Heapify(List: TList<T>; Index: Integer; Max: Integer;
const AComparer: IComparer<T>);
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor THeapSort<T>.Destroy;
begin
FInstance.Free;
end;
class function THeapSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure THeapSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
var
Index: Integer;
begin
BuildHeap(List,AComparer);
for Index := List.Count - 1 downto 1 do
begin
List.Exchange(0,Index);
Heapify(List,0,Index,AComparer);
end;
end;
class procedure THeapSort<T>.BuildHeap(List: TList<T>; const AComparer: IComparer<T>);
var
Index: Integer;
begin
for Index := (List.Count div 2) - 1 downto 0 do
begin
Heapify(List,Index,List.Count,AComparer);
end;
end;
class procedure THeapSort<T>.Heapify(List: TList<T>; Index: Integer; Max: Integer;
const AComparer: IComparer<T>);
var
Left: Integer;
Right: Integer;
Largest: Integer;
begin
Left := Index * 2 + 1;
Right := Index * 2 + 2;
if (Left < Max) and (AComparer.Compare(List.Items[Left],List.Items[Index]) > 0) then
begin
Largest := Left;
end
else
begin
Largest := Index;
end;
if (Right < Max) and (AComparer.Compare(List.Items[Right],List.Items[Largest]) > 0) then
begin
Largest := Right;
end;
if Largest <> Index then
begin
List.Exchange(Index,Largest);
Heapify(List,Largest,Max,AComparer);
end;
end;
マージソートです。
type
TMergeSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
class procedure InternalSort(List: TList<T>; var Work: array of T;
Left: Integer; Right: Integer;
const AComparer: IComparer<T>);
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor TMergeSort<T>.Destroy;
begin
FInstance.Free;
end;
class function TMergeSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure TMergeSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
var
WorkArea: array of T;
begin
SetLength(WorkArea,List.Count);
try
InternalSort(List,WorkArea,0,List.Count - 1,AComparer);
finally
SetLength(WorkArea,0);
end;
end;
class procedure TMergeSort<T>.InternalSort(List: TList<T>; var Work: array of T;
Left: Integer; Right: Integer;
const AComparer: IComparer<T>);
var
Index1: Integer;
Index2: Integer;
Index3: Integer;
Mid: Integer;
begin
if Left >= Right then
begin
Exit;
end;
Mid := (Left + Right) div 2;
InternalSort(List,Work,Left, Mid, AComparer);
InternalSort(List,Work,Mid + 1,Right,AComparer);
for Index1 := Left to Mid do
begin
Work[Index1] := List.Items[Index1];
end;
Index2 := Right;
for Index1 := Mid + 1 to Right do
begin
Work[Index1] := List.Items[Index2];
Index2 := Index2 - 1;
end;
Index1 := Left;
Index2 := Right;
for Index3 := Left to Right do
begin
if AComparer.Compare(Work[Index1],Work[Index2]) > 0 then
begin
List.Items[Index3] := Work[Index2];
Index2 := Index2 - 1;
end
else
begin
List.Items[Index3] := Work[Index1];
Index1 := Index1 + 1;
end;
end;
end;
シェルソートです。
type
TShellSort<T> = class(TSortAlgorithm<T>)
protected
class var
FInstance: TSortAlgorithm<T>;
class procedure InternalSort(List: TList<T>; Gap: Integer;
const AComparer: IComparer<T>);
public
class destructor Destroy;
class function Instance: TSortAlgorithm<T>; override;
class procedure Sort(List: TList<T>; const AComparer: IComparer<T>); override;
end;
class destructor TShellSort<T>.Destroy;
begin
FInstance.Free;
end;
class function TShellSort<T>.Instance: TSortAlgorithm<T>;
begin
if FInstance = nil then
begin
FInstance := Self.Create;
end;
Result := FInstance;
end;
class procedure TShellSort<T>.Sort(List: TList<T>; const AComparer: IComparer<T>);
var
Gap: Integer;
begin
Gap := List.Count div 2;
while Gap > 0 do
begin
InternalSort(List,Gap,AComparer);
Gap := Gap div 2;
end;
end;
class procedure TShellSort<T>.InternalSort(List: TList<T>; Gap: Integer;
const AComparer: IComparer<T>);
var
Index1: Integer;
Index2: Integer;
begin
for Index1 := Gap to List.Count - 1 do
begin
Index2 := Index1 - Gap;
while Index2 >= 0 do
begin
if AComparer.Compare(List.Items[Index2 + Gap],List.Items[Index2]) > 0 then
begin
Break;
end;
List.Exchange(Index2,Index2 + Gap);
Index2 := Index2 - Gap;
end;
end;
end;
Instanceメソッドとクラスデストラクタを毎回書かなければならないことを除けば、ソートのコードを1つ書くだけで値型に対するTList<T>(TList<String>を含む)、クラスに対するTObjectList<T>のどちらであってもソートを行うことができます。→ジェネリックスのリストをアルゴリズムを指定してソートする(Gist)
2017年3月15日
DELPHI / C++BUILDER 0315 IN TOKYO
本日13:30から次期RAD Studio/Delphi/C++Builder(10.2 Tokyo)のお披露目となるDELPHI / C++BUILDER 0315 IN TOKYOが東京ミッドタウン・カンファレンスで行われます。UStreamによる中継も行われます。
レセプションも含め終了しました。参加者、関係者の皆さん、お疲れさまでした。
今日のアバウトなまとめ
レセプションも含め終了しました。参加者、関係者の皆さん、お疲れさまでした。
今日のアバウトなまとめ
- RAD Studio/Delphi/C++Builderの次期バージョンは"10.2 Tokyo"で、2017/03/28販売開始予定
- 主な新機能はLinux(Intel x64)サポート(C++Builderは次のアップデートにあたる"10.2.1"でサポート)
- LinuxサポートはEnt SKU以上が必要(Add-on Packなどは今のところなし)
- 勉強会やりましょう
2017年3月9日
InterBase 2017リリース
InterBase 2017(13.0.0.129)がリリースされています。現時点(2017/03/09)でDeveloper EditionとServer Edition(トライアル版)のみダウンロード可能です。ODSは17になっています。
30748 InterBase 2017 Server Ed., Windows/Linux (13.0.0.129, Japanese)
30749 InterBase 2017 Server Ed., Windows/Linux (13.0.0.129, English)
30736 InterBase 2017 (13.0.0.129) Developer Edition, Japanese
30738 InterBase 2017 (13.0.0.129) Developer Edition, English
30756 InterBase 2017 ToGo Ed., Windows/Linux/macOS/iOS/Android
Readme - InterBase (en)
InterBase 2017 の新機能 - InterBase(en)
InterBase 2017 - Now available • DelphiABall
2017/03/10追記: Server Editionもダウンロードできるようになっています。
2017/03/24追記: ToGo Editionもダウンロードできるようになっています。
30748 InterBase 2017 Server Ed., Windows/Linux (13.0.0.129, Japanese)
30749 InterBase 2017 Server Ed., Windows/Linux (13.0.0.129, English)
30736 InterBase 2017 (13.0.0.129) Developer Edition, Japanese
30738 InterBase 2017 (13.0.0.129) Developer Edition, English
30756 InterBase 2017 ToGo Ed., Windows/Linux/macOS/iOS/Android
Readme - InterBase (en)
InterBase 2017 の新機能 - InterBase(en)
InterBase 2017 - Now available • DelphiABall
2017/03/10追記: Server Editionもダウンロードできるようになっています。
2017/03/24追記: ToGo Editionもダウンロードできるようになっています。
2017年3月7日
Adobe Reader(X以降)で指定したファイルの指定したページを開く
以前Adobe Acrobat/Readerで指定したPDFファイルの指定したページを開く方法について書きましたが、コメントでおかぽんさんからAdobe Reader X以降ではこの方法が使えなくなっているとの指摘をいただきました。
調べてみると、Actobat/ReaderのVersion 10(X)以降で、DDEのサービス名が Acroview + [A|R] + <MajorVersion> に変更されたことが原因とのことです。というわけでこれに対応してみました。
おかぽんさん、情報ありがとうございました。
→Adobe Reader(X以降)で指定したファイルの指定したページを開く(Gist)
...DDEを使った方法ですが、Acrobat X から、DDEのサービス名が変更されています。...
uses
{$IF RTLVersion >= 23.00}
Winapi.Windows, System.SysUtils, System.Win.Registry, System.AnsiStrings,
Vcl.DdeMan;
{$ELSE}
Windows, SysUtils, Registry, {$IFDEF UNICODE}AnsiStrings, {$ENDIF}DdeMan;
{$IFEND}
function GetAcrobatPathname: String;
begin
with TRegistry.Create do
begin
try
RootKey := HKEY_CLASSES_ROOT;
OpenKeyReadOnly('Software\Adobe\Acrobat\Exe');
try
Result := AnsiDequotedStr(ReadString(''),'"');
finally
CloseKey;
end;
finally
Free;
end;
end;
end;
procedure OpenPDF(const Filename: String; Page: Integer);
const
CDdeCommand: AnsiString = '[DocOpen("%s")][DocGoTo(NULL,%d)]';
var
Macro: AnsiString;
Pathname: String;
ServiceName: String;
MajorVersion: Integer;
AcrobatType: String;
begin
Macro := {$IFDEF UNICODE}{$IF RTLVersion >= 23.00}System.{$IFEND}AnsiStrings.{$ENDIF}
Format(CDdeCommand,[Filename,Page - 1]);
Pathname := GetAcrobatPathname;
ServiceName := 'Acroview';
MajorVersion := GetFileVersion(Pathname) shr 16;
if MajorVersion >= 10 then
begin
if CompareText(ExtractFileName(Pathname),'AcroRd32.exe') = 0 then
begin
AcrobatType := 'R';
end
else
begin
AcrobatType := 'A';
end;
ServiceName := ServiceName + Format('%s%d',[AcrobatType,MajorVersion]);
end;
with TDdeClientConv.Create(nil) do
begin
try
ConnectMode := ddeManual;
ServiceApplication := ChangeFileExt(Pathname,'');
SetLink(ServiceName,'Control');
if (OpenLink or ((MajorVersion >= 15) and OpenLink)) = True then
begin
ExecuteMacro(PAnsiChar(Macro),False);
CloseLink;
end;
finally
Free;
end;
end;
end;
Acrobat/Readerの実行ファイルの場所をレジストリの"HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe"から取得し、SysUtils.GetFileVersionで問い合わせたバージョン情報の上位16ビット(メジャーバージョン)とファイル名からサービス名を組み立て、DDEをTDdeClientConv.OpenLinkで呼び出してTDdeClientConv.ExecuteMacroでマクロ実行することでファイルを開きページを移動する、という手順になります。またAcrobat/Reader DCの場合TDdeClientConv.OpenLinkの内部でWinExec(en)を使用して起動した直後にDdeConnect(en)を呼び出すと失敗するようなので、リトライするようにしています。おかぽんさん、情報ありがとうございました。
→Adobe Reader(X以降)で指定したファイルの指定したページを開く(Gist)
2017年3月5日
[書籍][ebook]Dependency Injection In Delphi
Leanpubで
Dependency Injection In Delphi (amazon US)/Nick Hodges著/Leanpub/ISBN 978-1941266229(printed), ISBN 978-1-941266-19-9(ebook)/29.99USD(printed), 29.99USD(ebook)
を購入(LearnpubのebookはPDF/EPUB/MOBI形式をダウンロード可能)。
2017/05/31追記: Amazon (US)で書籍版が購入可能になっています。ということでDelphi in Depth: FireDACと一緒に注文したDependency Injection In Delphiの書籍版が配送されてきました。29.99USD=3,433JPY(1USD=114.479JOY、配送料は含まず)ということになりました。
Dependency Injection In Delphi (amazon US)/Nick Hodges著/Leanpub/ISBN 978-1941266229(printed), ISBN 978-1-941266-19-9(ebook)/29.99USD(printed), 29.99USD(ebook)
を購入(LearnpubのebookはPDF/EPUB/MOBI形式をダウンロード可能)。
2017/05/31追記: Amazon (US)で書籍版が購入可能になっています。ということでDelphi in Depth: FireDACと一緒に注文したDependency Injection In Delphiの書籍版が配送されてきました。29.99USD=3,433JPY(1USD=114.479JOY、配送料は含まず)ということになりました。
2017年3月1日
2017/03開催のセミナー
- Web Seminar
- 2017/03/06 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第7回 Delphi「オブジェクト指向」/C++「オブジェクト指向」
- 2017/03/13 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第8回 Delphi「作ってみよう Delphiの部」
- 2017/03/27 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第9回 C++「作ってみよう C++の部」
- Live Seminar
- 2017/03/15 13:30-20:00(JST) DELPHI / C++BUILDER 0315 IN TOKYO
- 2017/03/28 17:00-19:00(JST) 「RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ」
2017年2月24日
[書籍]Optimized C++
紀伊國屋書店新宿本店でOptimized C++ (amazon US)の翻訳である
Optimized C++ (amazon)/Kurt Guntheroth著/黒川利明訳/島敏博技術監修/オライリージャパン/ISBN 978-4-87311-792-8/4,320円
を購入。
Optimized C++ (amazon)/Kurt Guntheroth著/黒川利明訳/島敏博技術監修/オライリージャパン/ISBN 978-4-87311-792-8/4,320円
を購入。
2017年2月22日
2017年2月18日
2017年2月15日
Microsoft Monthly Update 2017/02 is canceled
今日はMicrosoftのセキュリティアップデートの日、の予定だったのですが、
とのことで、更新プログラムのリリースは延期になっています。この後のリリーススケジュールは現時点(2017/02/15)で未定とのことです。
2017/02/16追記: 2017/02のセキュリティ更新プログラムはキャンセルとなった模様です。
Adobe Flash Playerには既知のセキュリティホールが存在していますので、Windows 8.1/10、Windows Server 2012/2012R2/2016、Windows RT 8.1上のInternet ExplorerおよびEdgeではFlash Playerを無効化するか、代替のwebブラウザを使用することを強くお勧めします。
2017/02/22追記: IE/EdgeのAdobe Flash Playerの更新プログラムがリリースされています。
Adobe Flash Player の脆弱性を修正するセキュリティ更新プログラムを定例外で公開 – 日本のセキュリティチーム
マイクロソフト セキュリティ情報 MS17-005 - 緊急 Adobe Flash Player のセキュリティ更新プログラム (4010250)
we discovered a last minute issue that could impact some customers and was not resolved in time for our planned updates today.
After considering all options, we made the decision to delay this month’s updates.
とのことで、更新プログラムのリリースは延期になっています。
2017/02/16追記: 2017/02のセキュリティ更新プログラムはキャンセルとなった模様です。
3 月の月例セキュリティ更新プログラム公開 (2017 年 3 月 14 日 (米国日付)) の一部として更新プログラムを配信する予定です。
2017/02/22追記: IE/EdgeのAdobe Flash Playerの更新プログラムがリリースされています。
Adobe Flash Player の脆弱性を修正するセキュリティ更新プログラムを定例外で公開 – 日本のセキュリティチーム
マイクロソフト セキュリティ情報 MS17-005 - 緊急 Adobe Flash Player のセキュリティ更新プログラム (4010250)
2017年2月1日
[書籍]なっとく!アルゴリズム
紀伊國屋書店新宿本店でGrokking Algorithms (amazon US)の翻訳である
なっとく!アルゴリズム (amazon)/Aditya Bhargava著/株式会社クイープ監訳/翔泳社/ISBN 9784798143354/2,700円
を購入。
なっとく!アルゴリズム (amazon)/Aditya Bhargava著/株式会社クイープ監訳/翔泳社/ISBN 9784798143354/2,700円
を購入。
[書籍]プログラミング作法
紀伊國屋書店新宿本店でThe Practice of Programming (amazon US)の翻訳である
プログラミング作法 (amazon)/Brian W. Kernighan、Rob Pike著/福崎俊博訳/KADOKAWA/ISBN 978-4-04-893052-9/3,024円
を購入。
プログラミング作法 (amazon)/Brian W. Kernighan、Rob Pike著/福崎俊博訳/KADOKAWA/ISBN 978-4-04-893052-9/3,024円
を購入。
2017/02開催のセミナー
- Web Seminar
- 2017/02/06 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第3回 Delphi「条件とループ」/C++「条件とループ」
- 2017/02/13 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第4回 Delphi「FunctionとProcedure(関数と手続き)」/C++「関数の作り方」
- 2017/02/20 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第5回 Delphi「配列とレコード」/C++「配列と構造体」
- 2017/02/27 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第6回 Delphi「文字列とオブジェクト」/C++「文字列とオブジェクト」
- Live Seminar
- 2017/02/03 14:00-17:00(JST) セミナー「Delphi / C++ Builder 業務アプリケーション 刷新実践法」
- 2017/02/10 17:00-19:00(JST) セミナー「RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ」
2017年1月12日
RAD Studio/Delphi/C++Builder 10.1 Berlin Hotfix 11 Jan 2017
RAD Studio 10.1 BerlinのHotfixがリリースされています。macOS 10.12 Sierra上でのデプロイ/デバッグの問題(RSP-16322)、macOS 10.12 Sierra上のiOS Simulatorでの実行/デバッグの問題(RSP-16368)、iOS 10上での32ビットアプリケーションのデバッグの問題(RSP-16324)を修正するものです。
30680 RAD Studio 10.1 Berlin Hotfix: 11 Jan 2017
Debugger Hotfix for macOS Sierra and the iOS Simulator
macOS Sierra および iOS Simulator 向けの Debugger Hotfix がリリースされました [JAPAN]
30680 RAD Studio 10.1 Berlin Hotfix: 11 Jan 2017
Debugger Hotfix for macOS Sierra and the iOS Simulator
macOS Sierra および iOS Simulator 向けの Debugger Hotfix がリリースされました [JAPAN]
2017年1月11日
2017年1月1日
2017/01開催のセミナー
- Web Seminar
- 2017/01/23 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第1回 Delphi「シューティングゲームのプログラム」/C++「シューティングゲームのプログラム」
- 2017/01/26 16:00-17:30(JST) Webセミナー「RAD Studio 10.1 Berlin Update 2 Anniversary Edition 新機能ガイド」
- 2017/01/30 17:00-17:50(JST) Delphi / C++Builder Starter チュートリアルシリーズ シーズン2『プログラミング言語をやさしく覚えよう』第2回 Delphi「変数と型」/C++「変数と型」
- Live Seminar
登録:
投稿 (Atom)