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もダウンロードできるようになっています。

2017年3月7日

Adobe Reader(X以降)で指定したファイルの指定したページを開く

以前Adobe Acrobat/Readerで指定したPDFファイルの指定したページを開く方法について書きましたが、コメントでおかぽんさんからAdobe Reader X以降ではこの方法が使えなくなっているとの指摘をいただきました。

...DDEを使った方法ですが、Acrobat X から、DDEのサービス名が変更されています。...
調べてみると、Actobat/ReaderのVersion 10(X)以降で、DDEのサービス名が Acroview + [A|R] + <MajorVersion> に変更されたことが原因とのことです。というわけでこれに対応してみました。
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、配送料は含まず)ということになりました。

2017年3月1日

2017/03開催のセミナー

2017年2月24日

[書籍]Optimized C++

紀伊國屋書店新宿本店Optimized C++ (amazon US)の翻訳である

Optimized C++ (amazon)/Kurt Guntheroth著/黒川利明訳/島敏博技術監修/オライリージャパン/ISBN 978-4-87311-792-8/4,320円

を購入。

2017年2月22日

Microsoft OOB Update 2017/02

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

2017年2月18日

2017年2月15日

Microsoft Monthly Update 2017/02 is canceled

今日はMicrosoftのセキュリティアップデートの日、の予定だったのですが、

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/15)で未定とのことです。

2017/02/16追記: 2017/02のセキュリティ更新プログラムはキャンセルとなった模様です。

3 月の月例セキュリティ更新プログラム公開 (2017 年 3 月 14 日 (米国日付)) の一部として更新プログラムを配信する予定です。

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)

2017年2月1日

[書籍]なっとく!アルゴリズム

紀伊國屋書店新宿本店Grokking Algorithms (amazon US)の翻訳である

なっとく!アルゴリズム (amazon)/Aditya Bhargava著/株式会社クイープ監訳/翔泳社/ISBN 9784798143354/2,700円

を購入。

[書籍]プログラミング作法

紀伊國屋書店新宿本店The Practice of Programming (amazon US)の翻訳である

プログラミング作法 (amazon)/Brian W. KernighanRob Pike著/福崎俊博訳/KADOKAWA/ISBN 978-4-04-893052-9/3,024円

を購入。

2017/02開催のセミナー

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]

2017年1月11日

2016年12月26日

[書籍]アルゴリズムクイックリファレンス 第2版

啓文堂書店 渋谷店Algorithms in a Nutshell, 2nd Edition (amazon US)の翻訳である

アルゴリズムクイックリファレンス 第2版 (amazon)/George T. HeinemanGary Pollice、Stanley Selkow著/黒川利明、黒川洋訳/オライリージャパン/ISBN 978-4-87311-785-0/3,888円

を購入。

2016年12月21日

RAD Studio/Delphi/C++Builder 10.1 Berlin Debugger Hotfix for iOS

RAD Studio 10.1 BerlinのHotfixがリリースされています。iOS 10上でiOS 32ビットアプリケーションをデバッグするときの問題を修正するもののようです。

30673 Debugger Hotfix for 10.1 Berlin for iOS 32-bit debugging

2017/01/12追記: このhotfix(30673)は新しいhotfix(30680 RAD Studio 10.1 Berlin Hotfix: 11 Jan 2017)に含まれているため、30680のhotfixのみを適用すればOKです。

2016年12月18日

[書籍]やさしく学べるMySQL運用・管理入門

紀伊國屋書店新宿本店

やさしく学べるMySQL運用・管理入門 (amazon)/山崎由章、梶山隆輔著/インプレス/ISBN 9784295000198/2,808円

を購入。

2016年12月9日

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

本日10:00から第33回エンバカデロ・デベロッパーキャンプEBiS 303カンファレンススペースで行われます。今回もUStreamによるライブ中継が行われます。

2016年12月1日

2016/12開催のセミナー

2016年11月24日

RAD Studio/Delphi/C++Builder 10 Seattle November 2016 Update

RAD Studio/Delphi/C++Builder 10 SeattleのNovember 2016 Updateがリリースされています。有効なアップデートサブスクリプションが必要です。

30663 November 2016 Seattle Update Subscription Update

Fall 2016 XE8 and 10 Seattle Updates - Embarcadero Community

RAD Studio/Delphi/C++Builder XE8 October 2016 Update

RAD Studio/Delphi/C++Builder XE8のOctober 2016 Updateがリリースされています。有効なアップデートサブスクリプションが必要です。また事前にDecember 2015 Updateを適用しておく必要があります。

30662 October 2016 XE8 Update Subscription Update

Fall 2016 XE8 and 10 Seattle Updates - Embarcadero Community

2016年11月23日

[書籍]Cクイックリファレンス 第2版

ブックファースト新宿店C in a Nutshell, 2nd Edition (amazon US)の翻訳である

Cクイックリファレンス 第2版 (amazon)/Peter Prinz、Tony Crawford著/黒川利明訳/島敏博技術監修/オライリージャパン/ISBN 978-4-87311-781-2/4,968円

を購入。

2016年11月16日

[書籍]MVVM in Delphi

Apressで注文した

MVVM in Delphi (amazon US)/John Kouraklis著/Apress/ISBN 978-1-4842-2213-3/26.99EUR

が配送されてきました(今回の発送地は日本(大日本印刷が発送代行)、配送は西濃運輸でした)。2016/11/09に注文して7日目の到着、26.99EUR=3,005JPY3,173JPY(暫定、1EUR=111.35JPY1EUR=117.562JPY)でした。

2016年11月9日

2016年11月3日

[書籍]新装版 達人プログラマー

紀伊國屋書店新宿本店The Pragmatic Programmer (amazon US)の翻訳であり、ピアソンエデュケーション版(amazon)の改稿版である

新装版 達人プログラマー (amazon)/Andrew HuntDavid Thomas著/村上雅章訳/オーム社/ISBN 978-4-274-21933-7/3,456円

を購入。

2016年11月1日

2016/11開催のセミナー

2016年10月25日

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

第33回エンバカデロ・デベロッパーキャンプはいつもとは逆順ですが東京と大阪のダブル開催で、2016年12月09日(東京)および2016年12月13日(大阪)に開催されます。

開催概要

2016年10月17日

InterBase XE7 Update 6 Hotfix 1

InterBase XE7 Update 6 Hotfix 1がリリースされています。バージョンは12.0.6.379となっています。対象はAndroidのみで、FireDAC+IBLite/IBGoドライバを使用したプログラムがOpenSSLがらみでGoogle Playにリジェクトされる問題(RSP-15985)に対応するものです。

30630 InterBase XE7 Update 6, Hotfix 1 (12.0.6.379) for Android

2016年10月12日

Microsoft Monthly Update 2016/10

今日はMicrosoftのセキュリティアップデートの日です。
MS16-118
MS16-119
MS16-120
MS16-121
MS16-122
MS16-123
MS16-124
MS16-125
MS16-126
MS16-127

今月(2016/10)からWindows 7/Windows 8.1の更新プログラムがWindows(Security Only Quality UpdateまたはSecurity Monthly Quality Rollup)と.NET Framework(Security UpdateまたはSecurity and Quality Rollup)についてロールアップモデルに移行しています。Officeも2013以降は基本的にClickOnceですので、Windows 7/Windows 8.1/Windows 10については個別の更新プログラムを適用するのはWord/Excel ViewerやCompatibility Packなど限られたものだけになります。複数の更新プログラムをまとめることについては以前失敗して元に戻したりしていますが、EOL(Windows 7 SP1:2020/01/14、Windows 8.1:2023/01/10)まで大きなトラブルがないことを願いたいものです。

参考:
Windows 7 および Windows 8.1 のサービス モデルをさらにシンプルに – 日本のセキュリティチーム
Windows 7 および Windows 8.1 のサービス モデル変更についての追加情報 – 日本のセキュリティチーム
.NET Framework 用の月例のロールアップの導入について – 日本のセキュリティチーム

2016年10月1日

2016/10開催のセミナー

2016年9月28日

2016年9月19日

RAD Studio/Delphi/C++Builder 10.1 Berlin Update 1

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

30615 Delphi and C++Builder 10.1 Berlin ISO (includes Update 1)
30613 RAD Studio 10.1 Berlin Web Install (including Update 1)

Subscription Update 1 - RAD Studio (en)

RAD Studio 10.1 Berlin Subscription Update 1 における不具合修正リスト (en)

RAD Studio Berlin 10.1 Update 1 Available
10.1 Berlin Subscription Update 1 の入手方法
RAD Studio Berlin 10.1 Update 1 提供開始![JAPAN]
Berlin10.1 Update1 へのアップデート手順 [JAPAN]

RAD Studio Berlin Update1 では macOS Sierra や iOS10 向けアプリのビルドに対応しました [JAPAN]
RAD Studio10.1 Berlin Update1 で iPhone7Plus 向けにアプリケーションのビルドを行ってみる [JAPAN]
Berlin 10.1 Update 1 追加機能:Listview - DynamicAppearance 使用時のオートフィルター検索ボックス対応
BERLIN 10.1 UPDATE 1 追加機能:iOS上でのTGrid の iOS ネイティブプラットフォームレンダリング対応 [JAPAN]
BERLIN 10.1 UPDATE 1 追加機能:IoTデバイス向けの新しいコンポーネントが追加されました [JAPAN]

Update 1の適用はRTMのアンインストール後の再インストールになります。移行ツール(Migration Tool, migrationtool.exe)を使用して現在の設定を移行することが推奨されています。また有効なUpdate Subscriptionが必要です(Starter SKUの扱いはよくわかりませんが)。

2016年9月14日

2016年9月11日

2016年8月31日

[書籍]組込みソフトウェア開発のための構造化プログラミング

紀伊國屋書店新宿本店

組込みソフトウェア開発のための構造化プログラミング (amazon)/SESSAME WG2著/翔泳社/ISBN 9784798147611/2,700円

を購入。

[書籍]C++プライマー 第5版

紀伊國屋書店新宿本店C++ Primer, 5th Edition (amazon (US))の翻訳である

C++プライマー 第5版 (amazon)/Stanley B. Lippman、Josée LaJoie、Barbara E. Moo著/株式会社クイープ訳/神林靖監訳/翔泳社/ISBN 9784798143002/8,424円

を購入。

2016年8月15日

[書籍]EPUB戦記

紀伊國屋書店新宿本店

EPUB戦記 (amazon)/小林龍生著/慶應義塾大学出版会/ISBN 978-4-7664-2363-1/3,240円

を購入。

2016年8月10日

Microsoft Monthly Update 2016/08

今日はMicrosoftのセキュリティアップデートの日です。
MS16-095
MS16-096
MS16-097
MS16-098
MS16-099
MS16-100
MS16-101
MS16-102
MS16-103

2016年7月14日

[書籍][eBook]Delphi Cookbook Second Edition

Packt Publishingで注文した

Delphi Cookbook - Second Edition (amazon US, amazon JP)/Daniele Teti著/Packt Publishing/ISBN 9781785287428/34.99GBP(Print+eBook)

が配送されてきました(今回の配送はDHL/佐川急便で、インドはチェンナイ(旧マドラス)からの発送でした)。2016/07/01に注文して13日目の到着、49.99USD=5,141JPY(暫定、1USD=102.84JPY)5,205JPY(1USD=104.121JPY)でした。

Embarcadero BCC32C C++コンパイラ 10.1

もうかなり長いことWindowsで動作する無償のC++コンパイラといえばBorland C++ Compiler 5.5(.1)でしたが、C++11(C++0x)はおろかC++98にも完全には対応できておらず、最近はVisual StudioのExpress版やCommunity版に取って代わられた感がありました。しかしC++Builder XE3でC++コンパイラにオープンソースのClang/LLVMが採用されたこともあり、C++コミュニティへのコミットメントの意味でも無償版の登場が待たれていました[要出典]。過去のいくつかの失敗の結果としてBorland/CodeGear/Embarcaderoは無償版に対して非常にネガティブでしたが、2015年のIDERAによる買収で状況が変わったようで、ついに最新のWindows/x86のC++コマンドラインコンパイラ(BCC101、C++Builder 10.1 Berlin相当)が"Free C++ Compiler(C++Compiler - 無料版)"として公開されました(ダウンロードにはEDN(Embarcadero Developer Network)の登録が必要です)。

C++ Compiler - Embarcadero Website

制限事項としては
  • Clang/LLVM 3.3.1ベースなのでC++14/C++17にはほとんど対応していない(Clang/LLVMの標準準拠状況はcpprefjpコンパイラの実装状況を参照)
  • ターゲットがWindows/x86に限定されている(C++Builder 10.1 BerlinではWindows/x64、OSX、iOS、Androidもサポートされている)
  • IDEがない(コマンドラインコンパイラなので)
  • ソースコードがついていない(DinkumwareのSTLヘッダはある)
  • デバッガがない(BCC 5.5.1には一応あった)
  • VCL/FMXやデータベース関係のライブラリが含まれていない
といったところです(C++14/C++17対応はよ)。

元ねたはついこの間EmbarcaderoのC++プロダクトマネージャになったDavid MillingtonさんのA new edition of our free C++ compiler

2016年7月13日

Microsoft Monthly Update 2016/07

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

2016年7月5日

2016年7月1日

2016/07開催のセミナー

2016年6月24日

[書籍]SQL 第2版

紀伊國屋書店新宿本店

SQL 第2版 (amazon)/ミック著/翔泳社/ISBN 9784798144450/2,030円

を購入。

2016年6月23日

RAD Studio/C++Builder 10.1 Berlin June 2016 Beta Hotfix

RAD Studio 10.1 BerlinのBeta Hotfixがリリースされています。RAD ServerとEMSでISAPIを使う場合のライセンスの問題を修正するものとのことです。

30582 June 2016 RAD Studio 10.1 Berlin Beta Hotfix for RAD Server

2016年6月13日

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

本日10:00から第32回エンバカデロ・デベロッパーキャンプ品川シーズンテラスカンファレンスで行われます。今回もUStreamでライブ中継が行われます。またセッション資料は10:00からダウンロード可能になるとのことです。

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

  • 【T1】Delphi/C++テクニカルセッション「今どきのUXを実現するためのRAD Studio新機能活用テクニック」
  • 【T2】Delphiテクニカルセッション「開発者が知りたいDelphi実践テクニック!明日から使えるテクニック集」
  • 【G3】ジェネラルセッション「エンタープライズ開発サポートを強化するエンバカデロの開発ツール戦略」
  • 【T4】Delphi/BeaconFenceケーススタディセッション「ビーコンで位置検出!BeaconFenceによる館内ナビシステム構築事例」
  • 【T5】Delphi/C++テクニカルセッション「RAD Studio 10.1 Berlinで始めるIoTアプリケーション構築」
  • 【T6】Delphiテクニカルセッション「RAD Studioアプリケーションとバックエンドシステムを接続する」
  • 【G7】ライトニングトーク「共有!みんなの開発事例、開発経験、テクニック」

2016年6月1日

2016/06開催のセミナー

  • Web Seminar
  • Live Seminar
    • 2016/06/02 14:00-16:00(JST) ビーコンによる位置検出活用勉強会
    • 2016/06/10 10:00-17:30(JST) 第32回 エンバカデロ・デベロッパーキャンプ・イン大阪
    • 2016/06/13 10:00-18:00(JST) 第32回 エンバカデロ・デベロッパーキャンプ・イン東京
    • 2016/06/24 13:30-15:30(JST) ビーコンによる位置検出活用勉強会(丸紅情報システムズ株式会社大阪支店)

2016年5月30日

IDE Fix Pack 5.95

Andreas HausladenさんIDE Fix PackがアップデートされてVersion 5.95となっています。RAD Studio/Delphi/C++Builder 10.1 Berlin対応といくつかの新しいパッチが追加されています。

IDE Fix Pack 5.95 for Delphi 10.1 Berlin | Andy's Blog and Tools

DDevExtensions 2.84

Andreas HausladenさんDDevExtensionsがアップデートされてVersion 2.84となっています。RAD Studio 10.1 Berlinへの対応とちょっとした機能追加が行われています。

DDevExtensions and DFMCheck for 10.1 Berlin | Andy's Blog and Tools

ちなみにAndreas Hausladenさんが休暇から戻ったらGoogle+とメールはIDEFixPackの10.1 Berlin対応のリクエストで一杯だったとのこと。

2016年5月24日

[書籍]C#プログラマーのための基礎からわかるLINQマジック!

紀伊國屋書店新宿本店

C#プログラマーのための基礎からわかるLINQマジック! (amazon)/山本康彦著/技術評論社/ISBN 978-4-7741-8094-6/3,110円

を購入。

[書籍]OBJECT PASCAL HANDBOOK

紀伊國屋書店新宿本店Object Pascal Handbook (CreateSpace, Amazon US)の翻訳である

OBJECT PASCAL HANDBOOK (amazon)/Marco Cantu著/エンバカデロ・テクノロジーズ訳/藤井等監訳/カットシステム/ISBN 978-4-87783-401-2/6,480円

を購入。

2016年5月17日

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

第32回エンバカデロ・デベロッパーキャンプは恒例となった大阪と東京のダブル開催で、2016年06月10日(大阪)および2016年06月13日(東京)に開催されます。

開催概要

2016年5月11日

2016年5月1日

2016/05開催のセミナー

  • Web Seminar
  • Live Seminar

2016年4月28日

RAD Studio/C++Builder 10.1 Berlin April 2016 Hotfix

RAD Studio 10.1 BerlinのHotfixがリリースされています。30530はDataSnapサーバでクライアントから変更の適用または表示の更新を要求すると"Invalid variant type conversion"でエラーになる問題の修正、30531はAndroid 6.0.1のSamsung Galaxy 6 Edgeでデバッグができない問題([RSP-14033] [Debugger | Android]. Can't debug on SAMSUNG GALAXY S7 EDGE with Android 6.0.1)の修正とのことです。

30530 April 2016 RAD Studio 10.1 Berlin Hotfix for DataSnap
30531 April 2016 RAD Studio 10.1 Berlin Hotfix for Samsung Galaxy

2016年4月19日

Firebird 3.0

Firebird 3.0がリリースされています。

Firebird: Firebird 3.0 is released
Firebird: Firebird 3.0.0
Firebird 3.0 Release Notes (PDF)

RAD Studio/Delphi/C++Builder 10.1 Berlinリリース

RAD Studio/Delphi/C++Builder 10.1 Berlinがリリースされています。

エンバカデロ、マルチデバイス向けビジュアル開発ツールの新リリース「RAD Studio 10.1 Berlin」を本日より販売開始

RAD Studio Berlin ヘルプ (en)
リリース ノート (en)
インストール ノート (en)
新機能 (en)

RAD Studio 10.1 Berlin における不具合修正リスト (en)

30510 RAD Studio 10.1 Berlin ISO (incl. Delphi and C++Builder)

30500 FastReport VCL 5 for RAD Studio, Delphi, C++Builder 10.1 Berlin
30501 FastReport FMX for RAD Studio, Delphi and C++Builder 10.1 Berlin
30499 IP*Works for C++Builder 10.1 Berlin
30498 IP*Works for Delphi 10.1 Berlin
30521 RAD Studio 10.1 Berlin FireMonkey Accessibility Pack
30522 BDE Installer for RAD Studio, Delphi, C++Builder 10.1 Berlin

30492 VCL Premium Styles Pack for RAD Studio 10.1 Berlin
30491 FireMonkey Premium Styles Pack for RAD Studio 10.1 Berlin

30553 Jedi Code Library Snapshot Binary Installer for 10.1 Berlin
30554 Jedi Visual Component Library Snapshot Bin-Installer 10.1 Berlin

2016/05/02追記: web(GetIt)インストーラからインストールすると、新規作成でDelphiプロジェクトのActiveXが表示されないという問題が報告されています。

Where is the ActiveX Project Type for Delphi 10.1 Berlin?

レジストリに誤った値が書き込まれるのが原因のようで、 HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\18.0\Known IDE Packages\Delphi の $(BDS)\Bin\delphicompro240.bpl のデータが"__(Untitled)"となっているものを他と同様に"(Untitled)"に変更すればいいようです。

2016/06/15追記: 2016/06/14付でFastReport FMXが更新されたようです。

2016年4月14日

[書籍][オンデマンド版]ハッカーのたのしみ

紀伊國屋書店 新宿南店Hacker's Delight (informIT, amazon(US))の翻訳である

[オンデマンド版]ハッカーのたのしみ (amazon)/Henry S. Warren, Jr.著/滝沢徹、鈴木貢、赤池英夫、葛毅、藤波順久、玉井浩訳/エスアイビー・アクセス/ISBN 978-4-434-20159-2/3,672円

を購入。

なお原著のほうは2012年に2nd Edition (informIT, amazon(US))が出ているようです。また日本語版の出版元であるエスアイビー・アクセスのwebページはIIJ4Uのサービス終了に伴い参照できなくなっています(アーカイブ)。発売元の星雲社はこのご時勢にwebページを持っていない(wikipedia)という昔気質の会社のようですし、オンラインの情報があまりなくてもったいない感じの本ですね…。

2016年4月13日

Microsoft Monthly Update 2016/04

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

2016年4月1日

[書籍]プリンシプル オブ プログラミング

紀伊國屋書店 新宿本店

プリンシプル オブ プログラミング (amazon)/上田勲/秀和システム/ISBN 978-4-7980-4614-3/2,376円

を購入。

2016/04開催のセミナー

  • Web Seminar
    • 2016/04/13 15:00-15:30(JST) RAD Skill Sprint Webセミナー「RADとOOPを混在させる場合のヒント」
    • 2016/04/27 17:00-20:45(JST) New Highlights of RAD Studio / Delphi / C++Builder
      • 17:00-18:00(JST) 「プレオープンセッション」
      • 18:00-20:00(JST) 「New Highlights of RAD Studio / Delphi / C++Builder」
      • 20:00-20:45(JST) 「RAD Studio新リリースを語る」
      • 20:45-21:00(JST) 「クロージング」
  • Live Seminar

2016年3月9日

Microsoft Monthly Update 2016/03

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

2016/03/13追記: 2016/03/11にMS16-036が追加されています。

2016年3月4日

RAD Studio/C++Builder 10 Seattle AQTime Hotfix

RAD Studio 10 SeattleのHotfixがリリースされています。RAD Studio/Delphi/C++Builder 10 SeattleでAQTimeを使用している場合の問題を修正するものです。

30489 RAD Studio Deployment hotfix for 10 Seattle (Beta)

Firebird 3.0 Release Candidate 2

Firebird 3.0 Release Candidate 2がリリースされています。

Firebird: Firebird 3.0 Release Candidate 2 is available for testing
Firebird: Firebird 3.0 Release Candidate 2
Firebird 3.0 Release Notes

2016年3月1日

2016/03開催のセミナー

2016年2月26日

Windowsがサーバ版かどうかを調べる

プログラムが動作している環境(Windows)がサーバ版かどうかを調べたいことがまれにあります(WMIでサーバ版Windowsではサポートされていない項目の問い合わせをするときなど)。RTLのソースをちょっと覗いてみたところ、Win32APIのGetVersionEx (ja)関数で取得したOSVERSIONINFOEX構造体のwProductTypeがVER_NT_WORKSTATIONかどうかで判断できるようなのですが、GetVersionEx関数のRemarksにはVerifyVersionInfo (ja)関数を使ったほうがパフォーマンス上望ましい、と書いてあるようなので、VerifyVersionInfo関数(とそのパラメータを組み立てるためにVerSetConditionMask関数の組み合わせ)で実現してみました。
function IsWindowsServer: Boolean;
var
  OSVI: TOSVersionInfoEx;
  ConditionMask: UInt64;
begin

  FillChar(OSVI,SizeOf(TOSVersionInfoEX),0);
  OSVI.dwOSVersionInfoSize := SizeOf(OSVI);
  OSVI.wProductType := VER_NT_WORKSTATION;

  ConditionMask := VerSetConditionMask(0,VER_PRODUCT_TYPE,VER_EQUAL);

  Result := not (VerifyVersionInfo(OSVI,VER_PRODUCT_TYPE,ConditionMask));

end;
OSVERSIONINFOEX構造体を初期化後、wProductTypeにVER_NT_WORKSTATIONを格納し、これに対応する条件マスク(VER_PRODUCT_TYPEがVER_EQUAL)をVerifyVersionInfoで作成してVerifyVersionInfoで問い合わせて、結果がFalse(wProductTypeがVER_NT_WORKSTATION以外)ならサーバ版Windows、という判定です。

Windowsがサーバ版かどうかを調べる(Gist)

2016年2月12日

RAD Studio/Delphi/C++Builder XE7 December 2015 Update

RAD Studio/Delphi/C++Builder XE7のDecember 2015 Updateがリリースされています。有効なアップデートサブスクリプションが必要です。

30477 December 2015 XE7 Update Subscription Update

10 Seattle アップデートサブスクリプション加入ユーザー向け「December 2015 XE7 Update Subscription Update」

RAD Studio/Delphi/C++Builder XE8 December 2015 Update

RAD Studio/Delphi/C++Builder XE8のDecember 2015 Updateがリリースされています。有効なアップデートサブスクリプションが必要です。

30476 December 2015 XE8 Update Subscription Update

10 Seattle アップデートサブスクリプション加入ユーザー向け「December 2015 XE8 Update Subscription Update」

2016年2月10日

2016年2月9日

RAD Studio 2016 ロードマップ

RAD Studioのロードマップは1年くらい前に更新されてそのままになっていました。2015年05月のデベロッパーキャンプのときにMarco Cantuさんに『ロードマップの更新は?』と聞いたところ、『モバイル関係の流れが速いのでロードマップを出すのは難しい』という回答でした(それは困る、とは伝えましたが)。しかし2015年秋のIDERAによる買収によって路線の修正が行われ、2016年01月にロードマップを更新する、というAtanas Popovさんの発言もあり、1月末くらいからどうなってるの?という声も出ていましたが、やっとロードマップが更新されました。

Embarcadero RAD Studio 2016 Product Approach and Roadmap

以下今後のリリースに関する適当な要約:
  • 2016年春リリースのコードネーム"Big Ben"のキーテーマは"品質、最初のユーザ体験と導入"で、新しいインストーラとGetItによりインストールの柔軟性とインストール時間の短縮を図る。2016年のリリースに以下の機能を含めるためチームは作業をしている。
    • VCLとFMXの両方でフォームデザイナをセパレート/フロート可能に
    • C++に関するリファクタリング
    • FireUIアプリケーションプレビュー(IDEのフォームデザイナであらゆるターゲット上でのプレビュー)
    • Firemonkeyの拡張
      • アドレス帳/コンタクトコンポーネント
      • スタイルデザイナとリストビューアイテムデザイナ
      • 多くの機能、リストビューのタッチアニメーション、グリッドの改善、Windowsのアクセラレータキーのサポート、フォント拡張、その他
    • マルチデバイスデザイナの改善
        デバイス上のフォームデザイナプレビュー
      • Android Wearスタイルと新しいFireUIビュー
    • IoT (Internet of Things)
      • Bluetooth LEサポートの拡張
      • そのままでもカスタムでもIoTスマートデバイス、センサ、ウェアラブルを簡単に使えるAPIコンポーネントであるIoT接続フレームワーク
      • Bluetooth LEおよびZ-Waveデバイスをサポートするコンポーネント
      • ThingPoint(EMS機能を拡張するIoTデバイスのためのエンタープライズなアクセスポイント)
    • Windows/VCL
      • Windows 10のBluetooth LEサポートを含むWinRTブリッジの改善
      • DirectX 12サポート
    • Delphiコンパイラおよび言語
      • すべてのプラットフォーム上でUtf8Stringをネイティブサポート
      • Windowsなど非ARCプラットフォーム上でのweak/unsafeインタフェース参照のサポート
    • すべてのプラットフォームでC++ Clang 3.3に移行
    • FireDACドライバ更新(Oracle、DB2、InterBase、SQLite、Advantage)
  • その次の2016年秋リリースのコードネーム"Godzilla"ではDelphi/C++BuilderアプリケーションがLinux上で動くようになる。夏にはDelphi for Linuxのテクニカルプレビューを出すのでぜひフィードバックしていただいて、可能な限り安定して強固なものにしていきたい。秋のリリースを目標としているものは以下の通り。
    • WebBrokerによるApacheモジュールとDataSnap/EMSサポート
    • FireDACによるLinuxデータベースアクセス
    • IoTサポートを含むコンソールアプリケーションのLinuxプラットフォームサポート
    • 公式にはUbuntu ServerとRedHat Enterpriseをサポート(これ以外のディストリビューションの公式サポートは需要に応じて広げてゆく)
    • WindowsベースのIDEとクロスコンパイラ、PAServer経由のデプロイとデバッグ
    • LinuxコンパイラはIntel 64ビットサーバ用で、LLVMベースのARCサポート
  • Linuxサポートの後についてはさらに以下のようなものを考えている。
    • IDEのUIの改善とスタイル
    • すべてのC++コンパイラをより新しいClangベースのものに更新
    • パッケージマネージャおよびインストーラとしての両方でGetItの更なる改善
    • 新しいWindows 10のVCLコンポーネント
    • Firemonkeyのネイティブコントロールの更なる改善
    • Windows 10 Centennialサポート(MicrosoftによるCentennial ユニバーサルWindowsプラットフォームブリッジのリリース待ち)
    • 将来のiOSおよびAndroidのバージョンのサポート

公式の日本語訳も出ました(つか負けた)。

Embarcadero RAD Studio 2016年の製品アプローチとロードマップ

2016年2月5日

整数の中で立っているビットの数を数える

それほど機会が多いわけではありませんが、整数の中で立っているビットの数を数えたいということがあります。C++であればstd::bitsetcountを使えば一発ですが、残念ながらDelphiでは符号なし整数型のヘルパ(TByteHelper/TWordHelper/TCardinalHelper/TUInt64Helper)を含め、標準ではそのような機能がありません。でちょっと検索してみたところ、population countあるいはHamming weightというキーワードが浮かんできました。最近のCPUには専用の命令(x86だとSSE4.2以降のPOPCNT)がありますが、移植性などを考慮して、Delphiで実装してみました。とはいってもCで書かれたものをそのままDelphiに置き換えただけです。詳細や原理については○×つくろーどっとコムさんのその17 ビット演算あれこれ中村実さんのビットを数える・探すアルゴリズムなどを、またx86/x64のPOPCNT命令との比較についてはtakesakoさんのx86x64 SSE4.2 POPCNTあたりを参照してください。
function PopulationCount(Value: UInt8): Integer;
begin

  Value := (Value and $55) + ((Value shr 1) and $55);
  Value := (Value and $33) + ((Value shr 2) and $33);
  Value := (Value and $0F) + ((Value shr 4) and $0F);
  Result := Value;

end;

function PopulationCount(Value: UInt16): Integer;
begin

  Value := (Value and $5555) + ((Value shr 1) and $5555);
  Value := (Value and $3333) + ((Value shr 2) and $3333);
  Value := (Value and $0F0F) + ((Value shr 4) and $0F0F);
  Value := (Value and $00FF) + ((Value shr 8) and $00FF);
  Result := Value;

end;

function PopulationCount(Value: UInt32): Integer;
begin

  Value := (Value and $55555555) + ((Value shr  1) and $55555555);
  Value := (Value and $33333333) + ((Value shr  2) and $33333333);
  Value := (Value and $0F0F0F0F) + ((Value shr  4) and $0F0F0F0F);
  Value := (Value and $00FF00FF) + ((Value shr  8) and $00FF00FF);
  Value := (Value and $0000FFFF) + ((Value shr 16) and $0000FFFF);
  Result := Value;

end;

function PopulationCount(Value: UInt64): Integer;
begin

  Value := (Value and $5555555555555555) + ((Value shr  1) and $5555555555555555);
  Value := (Value and $3333333333333333) + ((Value shr  2) and $3333333333333333);
  Value := (Value and $0F0F0F0F0F0F0F0F) + ((Value shr  4) and $0F0F0F0F0F0F0F0F);
  Value := (Value and $00FF00FF00FF00FF) + ((Value shr  8) and $00FF00FF00FF00FF);
  Value := (Value and $0000FFFF0000FFFF) + ((Value shr 16) and $0000FFFF0000FFFF);
  Value := (Value and $00000000FFFFFFFF) + ((Value shr 32) and $00000000FFFFFFFF);
  Result := Value;

end;
整数の中で立っているビットの数を数える(Gist)

2020/06/01追記: Delphi 10.4 Sydneyでは標準関数(かつ組み込みルーチン(en))としてCountLeadingZeros32(先頭の(MSBからの)連続している0の数/32bit整数)、CountLeadingZeros64(先頭の(MSBからの)連続している0の数/64bit整数)、CountTrailingZeros32(末尾のの(LSBからの)連続している0の数/32bit整数)、CountTrailingZeros64(末尾のの(LSBからの)連続している0の数/64bit整数)、CountPopulation32(1になっているビットの数/32bit整数)、CountPopulation64(1になっているビットの数/64bit整数)が追加されました。これらの関数はコンパイラによってインラインで展開されるため、System.pasなどに定義がありません。またこれらの関数は現時点ではヘルプ上に記述がありません。

2016年2月1日

2016年1月13日

Microsoft Monthly Update 2016/01

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

2016年1月1日

2016/01開催のセミナー

2015年12月30日

RAD Studio/C++Builder 10 Seattle Update 1 VCL AppAnalytics Hotfix

RAD Studio 10 Seattle Update 1のHotfixがリリースされています。RAD Studio/Delphi/C++Builder 10 SeattleのUpdate 1適用後のVCL AppAnalyticsアプリケーションでサーバとの接続の問題を修正するものです。

30457 10 Seattle Update 1 VCL AppAnalytics Hotfix

2016/02/17追記: 2016/02/16付で更新されています。Pro SKU適用時の問題を解決することのことです。

10 Seattle アップデートサブスクリプション加入ユーザー向け「10 Seattle Update 1 VCL AppAnalytics Hotfix」の更新

2015年12月16日

RAD Studio/C++Builder 10 Seattle Hotfix for iOS 9.2

RAD Studio 10 SeattleのHotfixがリリースされています。RAD Studio/C++Builder 10 SeattleでターゲットがiOS 9.2のときにコンパイルエラーが発生する不具合を修正するものです。

30456 10 Seattle iOS 9.2 C++ Hotfix - December 2015

Team Japan » 10 Seattle 向け「10 Seattle iOS 9.2 C++ Hotfix - December 2015」

明示はされていませんが、RTM、Update 1のどちらにも適用可能と思われます。またアップデートサブスクリプションの加入とは関係なくダウンロードできます。

2015年12月14日

要素数が256を超える集合型を作る

このアーティクルはDelphi Advent Calendar 2015の14日目の記事です(3年ぶり3回目)。

Delphiの特徴的な型として集合型というものがあります。これは基底型となる列挙型部分範囲型の組み合わせを保持できるというもので、C言語のビットフィールドに相当するものですが、各種演算子などが用意されており、非常に便利な言語機能です。しかし集合型にはその基底型の要素数が256以下、正確には順序値として0から255まで、という制約があります。しかし状況によっては256要素を超えるような、あるいは基底型で負値となるものを含むような集合型が欲しいということがあります。そこで既存の集合型になるべく近い形で実装してみることにします。ただしDelphiのジェネリックスはC++のテンプレートとは実装が異なり文法的制約が厳しい(というか値型にはほぼ使えない)ため、ジェネリックスによる汎用の実装ではなく個別の実装になってしまいます。また本来の集合型と同様に使えるよう、参照型(クラスによる実装)ではなく値型である高度なレコード型による実装とします。

まず基底型となる列挙型を定義します。
type
  TFoo = (Foo0 = -1,
          Foo1,
          Foo2,
          Foo3,
          Foo4,
          Foo5,
          FooMax = 256);
順序値が-1から256なのでこれを基底型とする集合型を定義すると
type
  TFooSet = set of TFoo;  // Error: E2028 Sets may have at most 256 elements
(当然ですが)エラーになります。では代替となる高度なレコード型を定義していきます。
const
  BYTE_BIT = 8;  //  Number of bits in byte

type
  TFooSet = record
  private
    FData: array [0..((Ord(High(TFoo)) - Ord(Low(TFoo)) + 1 + (BYTE_BIT - 1)) div BYTE_BIT) - 1] of Byte;
  public
    procedure   Empty;
    function    IsEmpty: Boolean;
  end;

procedure TFooSet.Empty;
begin

  FillChar(FData[0],SizeOf(FData),0);

end;

function TFooSet.IsEmpty: Boolean;
var
  Offset: Integer;
begin

  Result := False;

  for Offset := Low(FData) to High(FData) do
  begin
    if FData[Offset] <> 0 then
    begin
      Result := True;
      Exit;
    end;
  end;

end;
FDataは基底型に対応したビット列を実際に格納する領域で、Emptyはその領域を0クリアするメソッド、IsEmptyはビット列が全て0となっているかどうかをチェックするメソッドです。

次に基底型に対応する要素を追加、削除するメソッド(Include、Exclude)です。単独の要素、複数の要素(array of)のどちらにも対応します。
type
  TFooSet = record
  private
    ...
    class procedure CalcOffsets(Value: TFoo; var AOffset: Integer; var ABit: Byte); static;
  public
    ...
    procedure   Include(Value: TFoo); overload;
    procedure   Include(const Values: array of TFoo); overload;
    procedure   Exclude(Value: TFoo); overload;
    procedure   Exclude(const Values: array of TFoo); overload;
  end;

procedure TFooSet.Include(Value: TFoo);
var
  Offset: Integer;
  Bit: Byte;
begin

  CalcOffsets(Value,Offset,Bit);
  FData[Offset] := FData[Offset] or Bit;

end;

procedure TFooSet.Include(const Values: array of TFoo);
var
  Value: TFoo;
begin

  if Length(Values) > 0 then
  begin
    for Value in Values do
    begin
      Include(Value);
    end;
  end;

end;

procedure TFooSet.Exclude(Value: TFoo);
var
  Offset: Integer;
  Bit: Byte;
begin

  CalcOffsets(Value,Offset,Bit);
  FData[Offset] := FData[Offset] and (not Bit);

end;

procedure TFooSet.Exclude(const Values: array of TFoo);
var
  Value: TFoo;
begin

  for Value in Values do
  begin
    Exclude(Value);
  end;

end;

class procedure TFooSet.CalcOffsets(Value: TFoo; var AOffset: Integer; var ABit: Byte);
var
  RelPos: Integer;
begin

  RelPos  := Ord(Value) - Ord(Low(TFoo));
  AOffset := RelPos div BYTE_BIT;
  ABit    := 1 shl (RelPos mod BYTE_BIT);

end;
CalcOffsetsは基底型の要素がどのビット位置に割り当てられているのかを計算します。

次は基底型の要素が含まれているかどうかを調べるInメソッドです。Inは予約語のため"&"で修飾します。
type
  TFooSet = record
    ...
  public
    ...
    function    &In(Value: TFoo): Boolean;
  end;

function TFooSet.&In(Value: TFoo): Boolean;
var
  Offset: Integer;
  Bit: Byte;
begin

  CalcOffsets(Value,Offset,Bit);
  Result := (FData[Offset] and Bit) <> 0;

end;

あとは何らかの形で文字列化できないと不便なので、16進文字列化するToStringと16進文字列からレコード型に値を入れるParseを用意します。
type
  TFooSet = record
    ...
  public
    ...
    function    ToString(ZeroSuppression: Boolean = True): String;
    class function Parse(const Value: String): TFooSet; static;
  end;

function TFooSet.ToString(ZeroSuppression: Boolean): String;
var
  Index: Integer;
  Len: Integer;
  Offset: Integer;
begin

  Result := '';

  for Offset := Low(FData) to High(FData) do
  begin
    Result := IntToHex(FData[Offset],2) + Result;
  end;

  if ZeroSuppression = True then
  begin
    Index := 1;
    Len := Length(Result);
    while (Index < Len) and (Result[Index] = '0') do
    begin
      Index := Index + 1;
    end;

    if Index > 1 then
    begin
      Delete(Result,1,Index - 1);
    end;
  end;

end;

class function TFooSet.Parse(const Value: String): TFooSet;
var
  Offset: Integer;
  S: String;
begin

  Result.Clear;

  S := StringOfChar('0',(SizeOf(Result.FData) * 2) - Length(Value)) + Value;

  for Offset := Low(Result.FData) to High(Result.FData) do
  begin
    Result.FData[Offset] := StrToInt('$' + Copy(S,(SizeOf(Result.FData) * 2) - (Offset * 2) - 1,2));
  end;

end;

必要な処理はこれで概ね揃いましたが、まだ既存の集合型と同じように使う、というわけにはいきません。そこで演算子オーバロードを用意します。集合型に対応する演算子には"+"(和集合)、"-"(差集合)、"*"(積集合)、"<="(サブセット)。">="(スーパーセット)、"="(等しい)、"<>"(等しくない)、"in"(メンバかどうか)の8つがあります。まず基底型の配列からの暗黙的な型キャストを行うImplicitと、"+"(class operator Add)、"-"(class operator Subtract)、"*"(class operator Multiply)の3つの演算子オーバロードです。
type
  TFooSet = record
    ...
  public
    ...
{$IF CompilerVersion>=24.00}
    class operator Implicit(const Values: array of TFoo): TFooSet;
{$IFEND}
    class operator Add(const lvalue: TFooSet; const rvalue: TFooSet): TFooSet; overload;
{$IF CompilerVersion>=28.00}
    class operator Add(const lvalue: TFooSet; const rvalue: array of TFoo): TFooSet; overload;
{$IFEND}
    class operator Subtract(const lvalue: TFooSet; const rvalue: TFooSet): TFooSet; overload;
{$IF CompilerVersion>=28.00}
    class operator Subtract(const lvalue: TFooSet; const rvalue: array of TFoo): TFooSet; overload;
{$IFEND}
    class operator Multiply(const lvalue: TFooSet; const rvalue: TFooSet): TFooSet; overload;
{$IF CompilerVersion>=28.00}
    class operator Multiply(const lvalue: TFooSet; const rvalue: array of TFoo): TFooSet; overload;
{$IFEND}
  end;

{$IF CompilerVersion>=24.00}
class operator TFooSet.Implicit(const Values: array of TFoo): TFooSet;
begin

  Result.Clear;
  Result.Include(Values);

end;
{$IFEND}

class operator TFooSet.Add(const lvalue: TFooSet; const rvalue: TFooSet): TFooSet;
var
  Offset: Integer;
begin

  Result.Clear;

  for Offset := Low(Result.FData) to High(Result.FData) do
  begin
    Result.FData[Offset] := lvalue.FData[Offset] or rvalue.FData[Offset];
  end;

end;

{$IF CompilerVersion>=28.00}
class operator TFooSet.Add(const lvalue: TFooSet; const rvalue: array of TFoo): TFooSet;
var
  Value: TFoo;
begin

  Result := lvalue;

  for Value in rvalue do
  begin
    Result.Include(Value);
  end;

end;
{$IFEND}

class operator TFooSet.Subtract(const lvalue: TFooSet; const rvalue: TFooSet): TFooSet;
var
  Offset: Integer;
begin

  Result.Clear;

  for Offset := Low(Result.FData) to High(Result.FData) do
  begin
    Result.FData[Offset] := lvalue.FData[Offset] and (not rvalue.FData[Offset]);
  end;

end;

{$IF CompilerVersion>=28.00}
class operator TFooSet.Subtract(const lvalue: TFooSet; const rvalue: array of TFoo): TFooSet;
var
  Value: TFoo;
begin

  Result := lvalue;

  for Value in rvalue do
  begin
    Result.Exclude(Value);
  end;

end;
{$IFEND}

class operator TFooSet.Multiply(const lvalue: TFooSet; const rvalue: TFooSet): TFooSet;
var
  Offset: Integer;
begin

  Result.Clear;

  for Offset := Low(Result.FData) to High(Result.FData) do
  begin
    Result.FData[Offset] := lvalue.FData[Offset] and rvalue.FData[Offset];
  end;

end;

{$IF CompilerVersion>=28.00}
class operator TFooSet.Multiply(const lvalue: TFooSet; const rvalue: array of TFoo): TFooSet;
begin

  Result := lvalue * TFooSet(rvalue);

end;
{$IFEND}
ここで明示的な型キャストを行うExplicitを用意しなかったのは、"TFooSet([Foo0,Foo2])"の"[Foo0,Foo2]"の部分がarray of TFooではなくset of TFooと解釈されてしまいコンパイルエラー(E1012)となる問題を解決できなかったためです。また同様の理由からImplicitはXE3以降、Add/Subtract/Multiplyの2番目のoverload(右項がarray of TFoo)はXE7以降のみ有効です。

次に"<="(class operator LessThanOrEqual)。">="(class operator GreaterThanOrEqual)、"="(class operator Equal)、"<>"(class operator NotEqual)、"in"(class operator In)です。
type
  TFooSet = record
    ...
  public
    ...
    class operator LessThanOrEqual(const lvalue: TFooSet; const rvalue: TFooSet): Boolean; overload;
    class operator GreaterThanOrEqual(const lvalue: TFooSet; const rvalue: TFooSet): Boolean; overload;
    class operator Equal(const lvalue: TFooSet; const rvalue: TFooSet): Boolean; overload;
    class operator NotEqual(const lvalue: TFooSet; const rvalue: TFooSet): Boolean; overload;
    class operator In(lvalue: TFoo; const rvalue: TFooSet): Boolean;
  end;

class operator TFooSet.LessThanOrEqual(const lvalue: TFooSet; const rvalue: TFooSet): Boolean;
var
  Offset: Integer;
begin

  for Offset := Low(lvalue.FData) to High(lvalue.FData) do
  begin
    if (lvalue.FData[Offset] and rvalue.FData[Offset]) <> lvalue.FData[Offset] then
    begin
      Result := False;
      Exit;
    end;
  end;

  Result := True;

end;

class operator TFooSet.GreaterThanOrEqual(const lvalue: TFooSet; const rvalue: TFooSet): Boolean;
var
  Offset: Integer;
begin

  for Offset := Low(lvalue.FData) to High(lvalue.FData) do
  begin
    if (lvalue.FData[Offset] and rvalue.FData[Offset]) <> rvalue.FData[Offset] then
    begin
      Result := False;
      Exit;
    end;
  end;

  Result := True;

end;

class operator TFooSet.Equal(const lvalue: TFooSet; const rvalue: TFooSet): Boolean;
var
  Offset: Integer;
begin

  for Offset := Low(lvalue.FData) to High(lvalue.FData) do
  begin
    if (lvalue.FData[Offset] xor rvalue.FData[Offset]) <> 0 then
    begin
      Result := False;
      Exit;
    end;
  end;

  Result := True;

end;

class operator TFooSet.NotEqual(const lvalue: TFooSet; const rvalue: TFooSet): Boolean;
begin

  Result := not (lvalue = rvalue);

end;

class operator TFooSet.In(lvalue: TFoo; const rvalue: TFooSet): Boolean;
begin

  Result := rvalue.&In(lvalue);

end;
ここでclass operator LessThanOrEqual/GreaterThanOrEqual/Equal/NotEqualにAdd/Subtract/Multiplyのようにarray of TFooを第2パラメータ(右項)とするものを用意しなかったのもExplicitと同様の理由です。

これでTFooSetに対する演算子も一通り揃いました。残るはfor-inループ構造への対応です。必要なものはfor 文を使用するコンテナの繰り返しにあるように、Booleanを返し次の値を指し示すMoveNextメソッドとコレクションに含まれる値を返すCurrentプロパティとを持つようなクラス、インタフェース、レコードのいずれかを返すGetEnumeratorメソッド、ということになります。ここではネストした形でクラスを定義します。
type
  PFooSet = ^TFooSet;
  TFooSet = record
  private
    type
      TEnumerator = class(TObject)
      private
        FContainer: PFooSet;
        FIndex: Integer;
        function GetCurrent: TFoo;
      public
        constructor Create(Container: PFooSet);
        function MoveNext: Boolean;
        property Current: TFoo
                   read GetCurrent;
      end;
  public
    ...
    function GetEnumerator: TEnumerator;
  end;

function TFooSet.GetEnumerator: TEnumerator;
begin

  Result := TEnumerator.Create(@Self);

end;

constructor TFooSet.TEnumerator.Create(Container: PFooSet);
begin

  inherited Create;

  FIndex := Ord(Low(TFoo)) - 1;
  FContainer := Container;

end;

function TFooSet.TEnumerator.MoveNext: Boolean;
begin

  while (FIndex < Ord(High(TFoo))) do
  begin
    FIndex := FIndex + 1;
    if TFoo(FIndex) in FContainer^ then
    begin
      Result := True;
      Exit;
    end;
  end;

  Result := False;

end;

function TFooSet.TEnumerator.GetCurrent: TFoo;
begin

  Result := TFoo(FIndex);

end;
これでTFooSetに対して通常の集合型のように"+"、"-"、"*"のような演算や"="、"<>"のような比較、for..inによる要素の取り出しを行うことができるようになりました。 同様にすることで部分範囲型で値が0..255に収まらないようなものを基底型とするような集合型も実装することができます。 →要素数が256を超える列挙型の集合型(Gist)値範囲が0..255に収まらない部分範囲型の集合型(Gist)

2015年12月10日

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

本日10:00から第31回エンバカデロ・デベロッパーキャンプが新宿NSビルのスカイカンファレンスで行われます。セッション資料は

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

からダウンロードできます。またUStreamで全セッションのライブ中継も行われます。

  • 【T1】テクニカルセッション「VCL ユーザーのためのFireMonkey入門」
  • 【G2】ジェネラルセッション「Bigger、Stronger、Focused - エンバカデロ+アイデラで推進される開発者へのコミットメント」
  • 【G3】プロダクトショーケース「エンバカデロの開発ツール最前線」
  • 【T4】テクニカルケーススタディ「『カラオケの鉄人』店舗で、クーポン作成 - DTP並みの印刷システム実現の手法」
  • 【T5】Delphi/C++テクニカルセッション「リモートクライアントから帳票出力 - FastReportサーバーアプリ実装法」
  • 【T6】テクニカルケーススタディ「iPod Touchによる工場内のモバイル化 - 鋼材品質証明と基幹システム連携」
  • 【G7】ライトニングトーク「共有!みんなの開発事例、開発経験、テクニック」

2015年12月9日

Microsoft Monthly Update 2015/12

今日はMicrosoftのセキュリティアップデートの日です。
MS15-124
MS15-125
MS15-126
MS15-127
MS15-128
MS15-129
MS15-130
MS15-131
MS15-132
MS15-133
MS15-134
MS15-135

2015年12月4日

RAD Studio 10 Seattle Update 1 Hotfix

RAD Studio 10 Seattle Update 1のHotfixが2件リリースされています。1件目はIDEが使っているModernThemeのメモリ/GDIリソースリーク(RSP-13023)を修正するものです

30453 10 Seattle Update 1 ModernTheme Hotfix - December 2015

2件目はC++/Clangのローカライズ時の不具合(詳細不明)を修正するものです。

30454 10 Seattle Update 1 C++ Clang FR/DE/JA Hotfix


Team Japan » 10 Seattle アップデートサブスクリプション加入ユーザー向け「10 Seattle Update 1 C++ Clang FR/DE/JA Hotfix」
2 Hot-Fixes for 10 Seattle Update 1