2010年7月21日

ネットワークアダプタの情報を取得する(IPv4)

ネットワークアダプタの情報を取得するにはGetAdaptersInfoを使用します。取得した情報はIP_ADAPTER_INFO構造体に格納されますが、複数のネットワークアダプタが存在する場合は戻値がERROR_BUFFER_OVERFLOWになり、第2パラメータのpOutBufLenに必要なサイズがバイト単位で返されるので、領域を再確保して再びGetAdaptersInfoを呼び出す必要があります。この場合はIP_ADAPTER_INFO構造体のNextがNULLになるまでたどっていくことになります。
まずこれらのIPヘルパAPIや構造体を定義します。
uses
  Windows, SysUtils;

const
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  {$EXTERNALSYM MAX_ADAPTER_DESCRIPTION_LENGTH}
  MAX_ADAPTER_NAME_LENGTH        = 256;
  {$EXTERNALSYM MAX_ADAPTER_NAME_LENGTH}
  MAX_ADAPTER_ADDRESS_LENGTH     = 8;
  {$EXTERNALSYM MAX_ADAPTER_ADDRESS_LENGTH}

  MIB_IF_TYPE_OTHER     = 1;
  {$EXTERNALSYM MIB_IF_TYPE_OTHER}
  MIB_IF_TYPE_ETHERNET  = 6;
  {$EXTERNALSYM MIB_IF_TYPE_ETHERNET}
  MIB_IF_TYPE_TOKENRING = 9;
  {$EXTERNALSYM MIB_IF_TYPE_TOKENRING}
  MIB_IF_TYPE_FDDI      = 15;
  {$EXTERNALSYM MIB_IF_TYPE_FDDI}
  MIB_IF_TYPE_PPP       = 23;
  {$EXTERNALSYM MIB_IF_TYPE_PPP}
  MIB_IF_TYPE_LOOPBACK  = 24;
  {$EXTERNALSYM MIB_IF_TYPE_LOOPBACK}
  MIB_IF_TYPE_SLIP      = 28;
  {$EXTERNALSYM MIB_IF_TYPE_SLIP}

type
  time_t = Longint;
  {$EXTERNALSYM time_t}

  PIP_MASK_STRING = ^IP_MASK_STRING;
  {$EXTERNALSYM PIP_MASK_STRING}
  IP_ADDRESS_STRING = record
    S: array [0..15] of AnsiChar;
  end;
  {$EXTERNALSYM IP_ADDRESS_STRING}
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  {$EXTERNALSYM PIP_ADDRESS_STRING}
  IP_MASK_STRING = IP_ADDRESS_STRING;
  {$EXTERNALSYM IP_MASK_STRING}

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  {$EXTERNALSYM PIP_ADDR_STRING}
  _IP_ADDR_STRING = record
    Next: PIP_ADDR_STRING;
    IpAddress: IP_ADDRESS_STRING;
    IpMask: IP_MASK_STRING;
    Context: DWORD;
  end;
  {$EXTERNALSYM _IP_ADDR_STRING}
  IP_ADDR_STRING = _IP_ADDR_STRING;
  {$EXTERNALSYM IP_ADDR_STRING}

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  {$EXTERNALSYM PIP_ADAPTER_INFO}
  _IP_ADAPTER_INFO = record
    Next: PIP_ADAPTER_INFO;
    ComboIndex: DWORD;
    AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of AnsiChar;
    Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of AnsiChar;
    AddressLength: UINT;
    Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
    Index: DWORD;
    Type_: UINT;
    DhcpEnabled: UINT;
    CurrentIpAddress: PIP_ADDR_STRING;
    IpAddressList: IP_ADDR_STRING;
    GatewayList: IP_ADDR_STRING;
    DhcpServer: IP_ADDR_STRING;
    HaveWins: BOOL;
    PrimaryWinsServer: IP_ADDR_STRING;
    SecondaryWinsServer: IP_ADDR_STRING;
    LeaseObtained: time_t;
    LeaseExpires: time_t;
  end;
  {$EXTERNALSYM _IP_ADAPTER_INFO}
  IP_ADAPTER_INFO = _IP_ADAPTER_INFO;
  {$EXTERNALSYM IP_ADAPTER_INFO}

function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
                         var pOutBufLen: ULONG): DWORD; stdcall;
  external 'iphlpapi.dll' Name 'GetAdaptersInfo';
  {$EXTERNALSYM GetAdaptersInfo}
そして
type
  TAdapterType = (atUnknown,
                  atOther,
                  atEthernet,
                  atTokenRing,
                  atFDDI,
                  atPPP,
                  atLoopback,
                  atSLIP,
                  atWLAN);

  TEnumAdapterInfoFunc = function (const AdapterName: String;
                                   const Description: String;
                                   const HardwareAddress: String;
                                   AdapterIndex: Integer;
                                   AdapterType: TAdapterType;
                                   DhcpEnabled: Boolean;
                                   const IPAddress: String;
                                   const Mask: String;
                                   const Gateway: String;
                                   const DHCPServer: String;
                                   Data: Pointer): Boolean;

procedure EnumAdapterInfo(Func: TEnumAdapterInfoFunc; Data: Pointer);

  function FormatHardwareAddress(Ptr: PIP_ADAPTER_INFO): String;
  var
    Index: Integer;
  begin

    Result := '';

    for Index := 0 to Ptr^.AddressLength - 1 do
    begin
      Result := Result + Format('%02.2X-',[Ptr^.Address[Index]]);
    end;

    if Result <> '' then
    begin
      Delete(Result,Length(Result),1);
    end;

  end;

var
  pAdapterInfo: PIP_ADAPTER_INFO;
  Ptr: PIP_ADAPTER_INFO;
  pOutBufLen: ULONG;
  RetVal: DWORD;
  AdapterIndex: Integer;
  AdapterName: String;
  Description: String;
  HardwareAddress: String;
  AdapterType: TAdapterType;
  IPAddress: String;
  NetMask: String;
  Gateway: String;
  DHCPServer: String;
begin

  pOutBufLen := SizeOf(IP_ADAPTER_INFO);
  pAdapterInfo := AllocMem(pOutBufLen);
  try
    RetVal := GetAdaptersInfo(pAdapterInfo,pOutBufLen);
    if RetVal = ERROR_BUFFER_OVERFLOW then
    begin
      FreeMem(pAdapterInfo);
      pAdapterInfo := AllocMem(pOutBufLen);
      RetVal := GetAdaptersInfo(pAdapterInfo,pOutBufLen);
    end;

    if RetVal <> NO_ERROR then
    begin
      Exit;
    end;

    Ptr := pAdapterInfo;
    while Ptr <> nil do
    begin
      AdapterName := Trim(String(Ptr^.AdapterName));
      Description := Trim(String(Ptr^.Description));
      HardwareAddress := FormatHardwareAddress(Ptr);
      AdapterIndex := Ptr^.Index;
      case Ptr^.Type_ of
        MIB_IF_TYPE_OTHER:
        begin
          AdapterType := atOther;
        end;

        MIB_IF_TYPE_ETHERNET:
        begin
          AdapterType := atEthernet;
        end;

        MIB_IF_TYPE_TOKENRING:
        begin
          AdapterType := atTokenRing;
        end;

        MIB_IF_TYPE_FDDI:
        begin
          AdapterType := atFDDI;
        end;

        MIB_IF_TYPE_PPP:
        begin
          AdapterType := atPPP;
        end;

        MIB_IF_TYPE_LOOPBACK:
        begin
          AdapterType := atLoopback;
        end;

        MIB_IF_TYPE_SLIP:
        begin
          AdapterType := atSLIP;
        end;

        71:
        begin
          AdapterType := atWLAN;
        end;

        else
        begin
          AdapterType := atUnknown;
        end;
      end;

      IPAddress  := String(Ptr^.IpAddressList.IpAddress.S);
      NetMask    := String(Ptr^.IpAddressList.IpMask.S);
      Gateway    := String(Ptr^.GatewayList.IpAddress.S);
      if Ptr^.DhcpEnabled = 0 then
      begin
        DHCPServer := '';
      end
      else
      begin
        DHCPServer := String(Ptr^.DhcpServer.IpAddress.S);
      end;

      if Assigned(Func) then
      begin
        if Func(AdapterName,Description,HardwareAddress,AdapterIndex,
                AdapterType,Ptr^.DhcpEnabled <> 0,IPAddress,NetMask,
                Gateway,DHCPServer,Data) = False then
        begin
          Break;
        end;
      end;

      Ptr := Ptr^.Next;
    end;

  finally
    FreeMem(pAdapterInfo);
  end;

end;
とします。Delphi 2009以降の無名メソッド(anonymous method)を使用する場合はこんな感じに。
type
  TAdapterType = (atUnknown,
                  atOther,
                  atEthernet,
                  atTokenRing,
                  atFDDI,
                  atPPP,
                  atLoopback,
                  atSLIP,
                  atWLAN);

  TEnumAdapterInfoFunc = reference to
    function (const AdapterName: String;
              const Description: String;
              const HardwareAddress: String;
              AdapterIndex: Integer;
              AdapterType: TAdapterType;
              DhcpEnabled: Boolean;
              const IPAddress: String;
              const Mask: String;
              const Gateway: String;
              const DHCPServer: String): Boolean;

procedure EnumAdapterInfo(Func: TEnumAdapterInfoFunc);

  function FormatHardwareAddress(Ptr: PIP_ADAPTER_INFO): String;
  var
    Index: Integer;
  begin

    Result := '';

    for Index := 0 to Ptr^.AddressLength - 1 do
    begin
      Result := Result + Format('%02.2X-',[Ptr^.Address[Index]]);
    end;

    if Result <> '' then
    begin
      Delete(Result,Length(Result),1);
    end;

  end;

var
  pAdapterInfo: PIP_ADAPTER_INFO;
  Ptr: PIP_ADAPTER_INFO;
  pOutBufLen: ULONG;
  RetVal: DWORD;
  AdapterIndex: Integer;
  AdapterName: String;
  Description: String;
  HardwareAddress: String;
  AdapterType: TAdapterType;
  IPAddress: String;
  NetMask: String;
  Gateway: String;
  DHCPServer: String;
begin

  pOutBufLen := SizeOf(IP_ADAPTER_INFO);
  pAdapterInfo := AllocMem(pOutBufLen);
  try
    RetVal := GetAdaptersInfo(pAdapterInfo,pOutBufLen);
    if RetVal = ERROR_BUFFER_OVERFLOW then
    begin
      FreeMem(pAdapterInfo);
      pAdapterInfo := AllocMem(pOutBufLen);
      RetVal := GetAdaptersInfo(pAdapterInfo,pOutBufLen);
    end;

    if RetVal <> NO_ERROR then
    begin
      Exit;
    end;

    Ptr := pAdapterInfo;
    while Ptr <> nil do
    begin
      AdapterName := Trim(String(Ptr^.AdapterName));
      Description := Trim(String(Ptr^.Description));
      HardwareAddress := FormatHardwareAddress(Ptr);
      AdapterIndex := Ptr^.Index;
      case Ptr^.Type_ of
        MIB_IF_TYPE_OTHER:
        begin
          AdapterType := atOther;
        end;

        MIB_IF_TYPE_ETHERNET:
        begin
          AdapterType := atEthernet;
        end;

        MIB_IF_TYPE_TOKENRING:
        begin
          AdapterType := atTokenRing;
        end;

        MIB_IF_TYPE_FDDI:
        begin
          AdapterType := atFDDI;
        end;

        MIB_IF_TYPE_PPP:
        begin
          AdapterType := atPPP;
        end;

        MIB_IF_TYPE_LOOPBACK:
        begin
          AdapterType := atLoopback;
        end;

        MIB_IF_TYPE_SLIP:
        begin
          AdapterType := atSLIP;
        end;

        71:
        begin
          AdapterType := atWLAN;
        end;

        else
        begin
          AdapterType := atUnknown;
        end;
      end;

      IPAddress  := String(Ptr^.IpAddressList.IpAddress.S);
      NetMask    := String(Ptr^.IpAddressList.IpMask.S);
      Gateway    := String(Ptr^.GatewayList.IpAddress.S);
      if Ptr^.DhcpEnabled = 0 then
      begin
        DHCPServer := '';
      end
      else
      begin
        DHCPServer := String(Ptr^.DhcpServer.IpAddress.S);
      end;

      if Assigned(Func) then
      begin
        if Func(AdapterName,Description,HardwareAddress,AdapterIndex,
                AdapterType,Ptr^.DhcpEnabled <> 0,IPAddress,NetMask,
                Gateway,DHCPServer) = False then
        begin
          Break;
        end;
      end;

      Ptr := Ptr^.Next;
    end;

  finally
    FreeMem(pAdapterInfo);
  end;

end;
なおIP_ADAPTER_INFO構造体のTypeの値として無線LANの場合の定義がMIB_IF_TYPE_...にはありませんが、実際には71が格納されるようです。
またIPv6(Windows XP以降)の場合はGetAdaptersAddressesを使用する必要があります。

2010年7月20日

参加しているドメインまたはワークグループの種類と名前を取得する

前回のNetWkstaGetInfoを使用する方法ではNTドメイン(AD)に参加しているのかワークグループに参加しているのかを知ることができませんでした。そこでNetGetJoinInformation(ja)で参加しているNTドメインまたはワークグループの名前と参加ステータスを取得してみます。ここでもNetWkstaGetInfoで取得したドメインまたはワークグループの名前の領域はNetApiBufferFree(ja)で解放する必要があることに注意が必要です。
まずこれらのネットワーク管理APIと列挙を定義します。
uses
  Windows;

type
  NET_API_STATUS = DWORD;
  {$EXTERNALSYM NET_API_STATUS}

  _NETSETUP_JOIN_STATUS = (NetSetupUnknownStatus = 0,  // The status is unknown.
                           NetSetupUnjoined,           // The computer is not joined.
                           NetSetupWorkgroupName,      // The computer is joined to a workgroup.
                           NetSetupDomainName);        // The computer is joined to a domain.
  {$EXTERNALSYM _NETSETUP_JOIN_STATUS}
  NETSETUP_JOIN_STATUS  = _NETSETUP_JOIN_STATUS;
  {$EXTERNALSYM NETSETUP_JOIN_STATUS}
  PNETSETUP_JOIN_STATUS = ^NETSETUP_JOIN_STATUS;
  {$EXTERNALSYM PNETSETUP_JOIN_STATUS}
  TNetsetupJoinStatus   = NETSETUP_JOIN_STATUS;

const
  NERR_Success = 0;
  {$EXTERNALSYM NERR_Success}

function NetGetJoinInformation(lpServer: PWideChar;
                               var lpNameBuffer: PWideChar;
                               BufferType: PNETSETUP_JOIN_STATUS): NET_API_STATUS; stdcall;
  external 'netapi32.dll' Name 'NetGetJoinInformation';
  {$EXTERNALSYM NetGetJoinInformation}

function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall;
  external 'netapi32.dll' Name 'NetApiBufferFree';
  {$EXTERNALSYM NetApiBufferFree}
あとはこれを呼び出すだけです。
function GetNetworkJoinInformation(var NetworkName: String;
                                   var Status: TNetsetupJoinStatus): Boolean;
var
  Buffer: PWideChar;
begin

  if NetGetJoinInformation(nil,Buffer,@Status) <> NERR_Success then
  begin
    Result := False;
    Exit;
  end;

  NetworkName := Buffer;

  NetApiBufferFree(Buffer);

  Result := True;

end;

2010年7月16日

プログラミングの魔導書 予約受付開始

プログラミングの魔導書 ~Programmers' Grimoire~ Vol.1の予約受付が始まっています。

株式会社ロングゲート - 製品案内

ただいま予約受付中
予約期間は 2010年8月6日(金) までとなります。
完全受注生産のため、書籍版については予約でのみご購入いただけます。
PDF版につきましては、予約終了後でも購入可能です。

書籍版 1,500円(税込・送料別)
PDF版 1,000円(税込)
書籍+PDFセット 2,000円(税込・送料別)

書籍版は2010/08/06までに予約しないと入手不能になる(それ以降はPDFのみになる)とのことです。

元ねたは江添さん本の虫: 新しいプログラミング雑誌の発行アキラさん[Grimoire]「プログラミングの魔導書」予約開始! - Faith and Brave - C++で遊ぼう

参加しているドメインまたはワークグループの名前を取得する

現在参加しているNTドメインまたはワークグループの名前を取得するにはNetWkstaGetInfo(ja)を使用します。NetWkstaGetInfoで取得した構造体(WKSTA_INFO_100WKSTA_INFO_101WKSTA_INFO_102)はNetApiBufferFree(ja)で解放する必要があることに注意が必要です。
まずこれらのネットワーク管理APIや構造体を定義します。
uses
  Windows;

type
  NET_API_STATUS = DWORD;
  {$EXTERNALSYM NET_API_STATUS}

  PWKSTA_INFO_100 = ^WKSTA_INFO_100;
  {$EXTERNALSYM PWKSTA_INFO_100}
  _WKSTA_INFO_100 = record
    wki100_platform_id: DWORD;
    wki100_computername: PWideChar;
    wki100_langroup: PWideChar;
    wki100_ver_major: DWORD;
    wki100_ver_minor: DWORD;
  end;
  {$EXTERNALSYM _WKSTA_INFO_100}
  WKSTA_INFO_100 = _WKSTA_INFO_100;
  {$EXTERNALSYM WKSTA_INFO_100}

  PWKSTA_INFO_101 = ^WKSTA_INFO_101;
  {$EXTERNALSYM PWKSTA_INFO_101}
  _WKSTA_INFO_101 = record
    wki101_platform_id: DWORD;
    wki101_computername: PWideChar;
    wki101_langroup: PWideChar;
    wki101_ver_major: DWORD;
    wki101_ver_minor: DWORD;
    wki101_lanroot: PWideChar;
  end;
  {$EXTERNALSYM _WKSTA_INFO_101}
  WKSTA_INFO_101 = _WKSTA_INFO_101;
  {$EXTERNALSYM WKSTA_INFO_101}

  PWKSTA_INFO_102 = ^WKSTA_INFO_102;
  {$EXTERNALSYM PWKSTA_INFO_102}
  _WKSTA_INFO_102 = record
    wki102_platform_id: DWORD;
    wki102_computername: PWideChar;
    wki102_langroup: PWideChar;
    wki102_ver_major: DWORD;
    wki102_ver_minor: DWORD;
    wki102_lanroot: PWideChar;
    wki102_logged_on_users: DWORD;
  end;
  {$EXTERNALSYM _WKSTA_INFO_102}
  WKSTA_INFO_102 = _WKSTA_INFO_102;
  {$EXTERNALSYM WKSTA_INFO_102}

const
  NERR_Success = 0;
  {$EXTERNALSYM NERR_Success}

function NetWkstaGetInfo(servername: PWideChar; level: DWORD;
                         var bufptr: PByte): NET_API_STATUS; stdcall;
  external 'netapi32.dll' Name 'NetWkstaGetInfo';
  {$EXTERNALSYM NetWkstaGetInfo}

function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall;
  external 'netapi32.dll' Name 'NetApiBufferFree';
  {$EXTERNALSYM NetApiBufferFree}
今回はローカルコンピュータのNTドメイン/ワークグループ名があれば十分なので、servernameにNULLを、levelに100を指定してWKSTA_INFO_100構造体を取得し、wki100_langroupに格納されている文字列を取り出します。
function GetNTDomainName: String;
var
  Ptr: PWKSTA_INFO_100;
begin

  Result := '';
  if NetWkstaGetInfo(nil,100,PByte(Ptr)) <> NERR_Success then
  begin
    Exit;
  end;

  Result := Ptr^.wki100_langroup;
  NetApiBufferFree(Ptr);

end;
ただしこの方法ではNTドメインに参加しているのかワークグループに参加しているのかを知ることができないので、NetGetJoinInformationを使用する方法をお勧めします。

元ねたはDelphiDabbler.comGet the network computer and domain names

Nick HodgesがEmbarcaderoを退職

RAD StudioのR&DマネージャだったNick Hodgesさんがエンバカデロ・テクノロジーズを退職したというニュースが飛び込んできました。

Good luck Nick « Delphi Haven
Embarcadero Discussion Forums: Nick Hodges blog doesn't exist in ...

ForumのRobert Loveさんの発言によれば、I was notified today that Nick no longer works at Embarcardero.とのことです。

ForumにEmbarcadero Discussion Forums: Changes for Nick ...というスレッドが立っています。There have been some rumors floating around, and I wanted to set things straight.
I was let go by Embarcadero on Monday. This wasn't my decision.
ということだそうです。

2010/07/19追記: Nick Hodges | A man's got to know his limitationsができています。"Nick, thank you for your all works, and good luck!"

2010年7月15日

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

第17回エンバカデロ・デベロッパーキャンプは2010年09月15日に開催されます。時期的にRAD Studio 2011の話が出てくるのでしょうか。今回はエンバカデロ・テクノロジーズ 製品担当副社長("Senior Vice President of Marketing and Product Management")のMichael Swindellさんがいらっしゃるようです。

2010/09/07追記: 一部のセッションがUstreamで配信されるそうです。詳細は当日(2010/09/15)にデベロッパーキャンプのページで確認してくださいとのこと。

2010/09/09再追記: http://www.embarcadero.com/jp/landing-pages/developer-camp-liveでストリーミングが配信されるとのことです。

2010/09/10再々追記: Team Japanに情報が追加されています。

Team Japan » 第17回 エンバカデロ・デベロッパーキャンプ情報(その1) - 会場へのアクセス
Team Japan » 第17回 エンバカデロ・デベロッパーキャンプ情報(その2) - ライブ配信

2010年7月14日

Microsoft Monthly Update 2010/07

今日はMicrosoftのセキュリティアップデートの日です。
MS10-042
MS10-043
MS10-044
MS10-045

実行環境のアーキテクチャを取得する

実行環境のアーキテクチャはGetSystemInfo(ja)で取得したSYSTEM_INFO構造体のwProcessorArchitectureで知ることができるはずです。ところが実際には32bitのアプリケーションからは64bit版WindowsでもwProcessorArchitectureがPROCESSOR_ARCHITECTURE_INTEL(0)となってしまいます。GetSystemInfoの説明をよく見るとTo retrieve accurate information for an application running on WOW64, call the GetNativeSystemInfo function.ということでGetNativeSystemInfoを使用する必要があるようです。GetNativeSystemInfoはWindows XP/Server 2003以降でしか使えませんので、それ以前の環境ではGetSystemInfoを使用します。
uses
  Windows;

const
  PROCESSOR_ARCHITECTURE_AMD64   =     9;   // x64 (AMD or Intel)
  PROCESSOR_ARCHITECTURE_IA64    =     6;   // Intel Itanium Processor Family (IPF)
  PROCESSOR_ARCHITECTURE_INTEL   =     0;   // x86
  PROCESSOR_ARCHITECTURE_UNKNOWN = $FFFF;   // Unknown architecture

type
  TGetSystemInfoFunc = procedure (var lpSystemInfo: TSystemInfo); stdcall;

function GetProcessorArchitecture: Word;
var
  SI: TSystemInfo;
  GetSystemInfoFunc: TGetSystemInfoFunc;
begin

  FillChar(SI,SizeOf(SI),0);

  { Call GetNativeSystemInfo or GetSystemInfo }
  @GetSystemInfoFunc := GetProcAddress(GetModuleHandle(kernel32),
                                       'GetNativeSystemInfo');
  if Assigned(GetSystemInfoFunc) = True then
  begin
    GetSystemInfoFunc(SI);
  end
  else
  begin
    GetSystemInfo(SI);
  end;

  Result := SI.wProcessorArchitecture;

end;

2012/07/07追記: Delphi XE2以降であればSystem.SysUtilsユニットのTOSVersion.Architectureで実行環境のアーキテクチャを知ることができます。ねた元はZarko GajicさんのIs Your 32bit Delphi Applications Running On x86 (Win 32) OR x64 (Win 64)?

2010年7月13日

コンピュータ名を取得する

一時ファイル名の一部として使うなど、コンピュータ名を取得したい状況というのはそれなりにあると思います。そこでまずGetComputerName(ja)でNetBIOS名を取得してみます。
uses
  Windows, SysUtils;

function GetComputerName: String;
var
  Size: DWORD;
begin

  { Adjust buffer size }
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result,Size);

  { Get computer name }
  if Windows.GetComputerName(PChar(Result),Size) = False then
  begin
    RaiseLastOSError;
  end;
  SetLength(Result,Size);

end;
次にGetComputerNameEx(ja)(Windows 2000以降であれば使用可能)でDNSホスト名や完全修飾DNS名を取得してみます。まずはWindows.pasにGetComputerNameEx(W)と第1パラメータのCOMPUTER_NAME_FORMATの定義がWindows.pasに存在しない(Delphi 2010にはあるのかな?)ので用意します。
type
{$Z4}
  _COMPUTER_NAME_FORMAT = (ComputerNameNetBIOS,
                           ComputerNameDnsHostname,
                           ComputerNameDnsDomain,
                           ComputerNameDnsFullyQualified,
                           ComputerNamePhysicalNetBIOS,
                           ComputerNamePhysicalDnsHostname,
                           ComputerNamePhysicalDnsDomain,
                           ComputerNamePhysicalDnsFullyQualified,
                           ComputerNameMax);
  {$EXTERNALSYM _COMPUTER_NAME_FORMAT}
  COMPUTER_NAME_FORMAT  = _COMPUTER_NAME_FORMAT;
  {$EXTERNALSYM COMPUTER_NAME_FORMAT}
  TComputerNameFormat   = COMPUTER_NAME_FORMAT;

function GetComputerNameExW(NameType: COMPUTER_NAME_FORMAT; lpBuffer: PWideChar;
                            var nSize: DWORD): BOOL; stdcall;
  external kernel32 name 'GetComputerNameExW';
  {$EXTERNALSYM GetComputerNameExW}
そしてこれを
uses
  Windows, SysUtils;

function GetComputerNameEx(NameType: TComputerNameFormat): String;
var
{$IFDEF Unicode}
  Buffer: String;
{$ELSE}
  Buffer: WideString;
{$ENDIF}
  Size: DWORD;
begin

  { Adjust buffer size }
  Size := 0;
  GetComputerNameExW(NameType,nil,Size);
  SetLength(Buffer,Size);

  { Get computer name }
  if GetComputerNameExW(NameType,PWideChar(Buffer),Size) = False then
  begin
    RaiseLastOSError;
  end;
  SetLength(Buffer,Size);
  Result := Buffer;

end;
という形で呼び出します。1回目のGetComputerNameExではlpBufferをNULLに、nSizeを0にすることでバッファに必要なサイズ(終端のNUL文字を含む)を取得し、2回目のGetComputerNameExで実際のコンピュータ名を取得するのですが、GetComputerNameExA(ANSI版)ではlpBufferをNULLにしても正常にバッファサイズを取得できないため、GetComputerNameExW(Unicode版)を使用しています。

2010年7月10日

[書籍]アプレンティスシップ・パターン

有隣堂 ヨドバシAKIBA店

アプレンティスシップ・パターン (amazon)/Dave H. Hoover、Adewale Oshiney著/柴田 芳樹訳/オライリージャパン/ISBN 978-4-87311-460-6/2,310円

を購入。

2010年7月8日

2nd anniversary

さすがに今年は覚えてました。とはいえここのところ内容がいまいちですね。この1年間のエントリは155件(2009/07/07-2010/07/02)。そろそろDelphi 2011の話が出始めると思われるので、今年も追いかけていきたいと思っています。

2010年7月2日

David Iが日本にきているらしい

David IことDavid Intersimoneさんが日本に来ていて懇談会をやっているようです(プレス関係かな?)。詳しくはTwitterのハッシュタグ#davidiembarcadero_jpCYonezawaあたりで。どうせならustreamあたりで生中継でもどうでしょう?

2010/07/04追記: builder by ZDNetの2010/06/18の開発環境の整備とクロスプラットフォームに注力--エンバカデロが新たな製品戦略 - builder by ZDNet Japanという記事にMalcolm Grovesさんの発言として7月には、CodeGear製品のチーフエバンジェリストを務めるDavid Intersimone(David I)氏が来日し、開発ツールに関する詳細な説明を行うことも明らかにした。あるので、週明けにはまた発表かインタビューがあるのではないでしょうかありますが、藤井さんDavid I プライベートで日本へによれば今回はほぼプライベートだったようです。今月中にまた来るってことでしょうか。

2010/07/05追記: 藤井さんの記事に従って2010/07/04追記分の記述を修正しました。アメリカ合衆国ではこの週末は独立記念日でお休みなんですね。

2010年6月18日

QC Windowsクライアント

EmbarcaderoのQC(QualityCentral)にアクセスするには基本的にwebからか専用クライアントを使用することになります。Embarcadero純正のWindows GUIクライアントはQCのメインページから最新版(2010/06/18現在でVer1.0.1.41、2009/10/17が最新)がダウンロードできますが、この他にJED SoftwareのJeremy NorthさんによるQC webサービスを使用した高機能なQC Plus(最新版は1.0.5.656)というクライアントがあります。複数のレポートを同時に開くことができたり色々便利そうです。

元ねたはJohn KasterさんBehind the Screen » EDN Tip #3: Keeping your QualityCentral windows client current

2010/06/26追記: QC Plus1.1.4.121に更新されています。

2010/09/23追記: QC Plusが1.1.6.145に更新されています。

2010年6月9日

2010年6月2日

プログラミングの魔導書 創刊

以前から一部で話題になっていたC++のプログラミング雑誌がついに創刊されるようです。

株式会社ロングゲート - 製品案内

ユーザーの力によって際限なく進化するプログラミング言語C++。
2010年のいま、C++はどこにいるのか
『プログラミングの魔導書 ~Programmers' Grimoire~
Vol.1 「Construct the World, C++」 』
書籍版は一般の流通ルートには乗らないということなので通信販売で申し込む必要があるようです(環境に優しくないかもしれないけどPDF版は体に合わないので)。

元ねたはA7Mさん新雑誌:プログラミングの魔導書 - C++Builder好きの秘密基地江添さん本の虫: プログラミング雑誌、もうすぐ販売

2010年5月18日

[書籍]リコールを起こさないソフトウェアのつくり方

啓文堂書店の渋谷店

組込みプレスSelectionシリーズ リコールを起こさないソフトウェアのつくり方 (amazon)/酒井由夫著/技術評論社/ISBN 978-4-7741-4216-6 (ISBN 4774142166)/2,814円

を購入。ISO/IEC/JIS T 62304絡み(Appendixだけだけど)で買ったけど、内容はなかなか充実していると思う。タイトルがよければもっと売れるのではないかな?一般論としてタイトルは編集サイドで決めるらしいけど。

2010年5月12日

第19回ソフトウェア開発環境展(SODEC)

第19回ソフトウェア開発環境展(SODEC)にいってきました。もちろんエンバカデロさんのブースにもいきました(サクラ?)。
しかし会社を空けると仕事の連絡が来るの法則により、くわしく書いている暇がありません。そのうち何か加筆するかもしれません…。
SODECやESECなど今回の一連の展示会にいかれる方は混雑度が全然違いますので午前中からにすることをお勧めします(12:10-12:20のスペシャルセッションでは米澤さんを拝見することもできますし(って自分は某社のデモを見ていて見逃したんですけど))。

Microsoft Monthly Update 2010/05

今日はMicrosoftのセキュリティアップデートの日です。
MS10-030
MS10-031

2010年5月11日

RAD Studio Roadmap

RAD Studio/Delphi/C++Builderのロードマップが更新されています。

RAD Studio, Delphi and C++Builder Roadmap
RAD Studio, Delphi, C++Builder, Delphi Prism のロードマップについて

注目ポイントは、Project "Fulcrum"はWindows/MacOS Xのクロスプラットフォームで、Linuxサポートが別途Project "Wheelhouse"(操舵室)に分離された(=2011には当初含まれない可能性もある?)こと、64bit版コマンドラインコンパイラのプレビュー版が2011/1H(2011年01月から06月)にリリースされること、Project "Commodore"およびProject "Chromium"については従来の方針が維持されている(="次の次"扱いのまま)こと、あたりでしょうか。

2010年5月10日

Fulcrum(次期Delphi/C++Builder)フィールドテスト

Fulcrum(次期Delphi/C++Builder)のフィールドテスト参加者の募集が始まっています。

Delphi "Fulcrum" フィールドテストプログラムのご案内

さらに今回は、マルチプラットフォームサポートを重要なフォーカスとしているため、複数バージョンの Windowsプラットフォームのほかに、Mac OS X、Linuxの主要なディストリビューションをテスト環境として利用できる方を募集します。
ということで、Delphi/C++Builder 2011はWindows/MacOS X/Linuxのクロスプラットフォームになるようです。

興味はあるものの、まだ手元にUnicode Readyじゃないライブラリが残っていたり、MacOS X/Linuxには縁がない、などの理由でたぶん参加しないような気がします。

2010年5月6日

エンバカデロがSODECに出展

2010/05/12-14に東京ビッグサイトで行われるSODEC(第19回ソフトウェア開発環境展)にエンバカデロが出展するとのことです。

5/12~5/14 第19回ソフトウェア開発環境展(SODEC)

ミニシアターセッション(10分間)では『AjaxフレームワークでカンタンWeb開発』、『開発環境のTCOを46%削減!ツールクラウドとは?』、『あなたのDBは本当に大丈夫? ― 誰もが知りたいその信頼度』が10分の休憩を置いてローテーションして、スペシャルセッションとして『SPECIAL! DBモデリング ― ボトムアップからのアプローチ』(12:10-12:20)と『SPECIAL! DBパフォーマンスチューニングの概要と評価』(16:00-16:10)が間に挟まるようです。SODECもずいぶん(5年くらい?)ご無沙汰してたけど、久しぶりに行こうかな…。

エンバカデロの新しいロゴ

Embarcadero Technologiesのコーポレートロゴが新しいものに変更されるそうです。

Team Japan » エンバカデロのロゴが変わります。

既にTopページのロゴも置き換わっています。まぁ前のロゴよりは新しいロゴほうがスマート(というかシンプル?)だとは思います。

2010年4月26日

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

ジュンク堂書店の新宿店で

アルゴリズムクイックリファレンス (amazon)/George T. Heineman、Gary Pollice、Stanley Selkow著/黒川利明、黒川洋訳/オライリージャパン/ISBN 978-4-87311-428-6 (ISBN 4873114284)/3,360円

を購入。

2010/05/06追記: コードリポジトリはここ、ErrataはAlgorithms in a Nutshell Confirmed Errata | O'Reilly Media

2010年4月14日

[書籍]正規表現クックブック

ジュンク堂書店の新宿店で

正規表現クックブック (amazon)/Jan Goyvaerts、Steven Levithan著/長尾高弘訳/オライリージャパン/ISBN 978-4-87311-450-7 (ISBN 4873114500)/4,410円

を購入。

Microsoft Monthly Update 2010/04

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

2010年4月13日

C++0xのlambda

C++0xで導入予定のlambda(ラムダ、無名関数)についての江添さん(=hitoさん)による解説。

本の虫: lambda 完全解説
本の虫: シンタックスシュガーとしてのlambdaの解説
本の虫: named lambdaが必要な理由

lambdaとは名前のない(名前を付ける必要がない)データ(参照またはコピーでキャプチャされたもの)と関数の組み合わせ、つまりその場で定義されて呼び出される関数オブジェクトのこと…という理解でいいのかな?Delphiの無名メソッドreference toはC++0xのstd::functionの代替表現と考えればいいのでしょうかね。

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

RAD Studio/Delphi/C++Builder 2010のHotfix 2がリリースされています。
  • Delphiオプションのタイプライブラリで[SafeCall呼び出しの割り当て]および[ソースの更新]オプションが表示されない。
  • CPP32.EXE 存在するドライブのボリューム名が9文字を超えている場合に、プリプロセッサで処理されたファイルに出力されるC++ソースファイルが常に小文字になる。
  • フィルタの使用時に発生するDataSnap通信の問題。
の3点を修正するものです。

RAD Studio 2010 Hotfix 2 リリースノート
27671 Hotfix 2 for RAD Studio 2010 (Delphi and C++Builder 2010)

2010年4月9日

Firebird 2.0.6 Release Candidate 1リリース

Firebird 2.0.6 Release Candidate 1がリリースされました。2.1/2.5の開発で発見された不具合がバックポートされたようです。

Firebird File Repositories (download)
Firebird 2.0.6 Release Candidate 1 Release Notes

2010年3月30日

Delphiのメモリマネージャ

Delphiのメモリマネージャには大きく分けて
  • Delphi 2.0-2005の標準メモリマネージャ
  • Delphi 2006以降の標準メモリマネージャ
  • カスタムメモリマネージャ
があります(Win16は気にしないってことで)。Delphi 2.0-2005の標準メモリマネージャはWin32初期の(あまりリソースが潤沢でなかった)環境に合わせて作られており、小さいメモリブロックの割当と解放を繰り返すと空きメモリの断片化が生じたり、パフォーマンスがあまりよくないなどの欠点が指摘されてきました。一方でDelphiのRTLではメモリマネージャの置き換え(カスタムメモリマネージャ)が当初(Delphi 2.0)から考慮されており、このメカニズムを利用してこれらの問題点を改善しようというオープンソースプロジェクトがFastMMです。Delphi 2006(C++Builder 2010)ではこの成果を取り入れて新しい(FastMMベースの)メモリマネージャが採用されました。Delphi 2006(C++Builder 2010)以降でも依然としてFastMMは使用可能で、標準の新しいメモリマネージャでは省略されている詳細レポート機能などを使用することでメモリリークの発生状況をより詳細に報告させることができます。またカスタムメモリマネージャとしてはFastMMの他に中村さんのNkMM(DHGLに付属)などもあります。NkMMの詳細については

Delphi Graphic Secrets Know-how & Libraries (amazon)/中村拓男著/ソフトバンククリエイティブ(ソフトバンク パブリッシング)/ISBM 978-4797319224 (ISBN 4-7973-1922-4)/3,129円

のp.202-204のNOTE"Delphiのメモリ管理の大きな問題点"を参照してください(Delphi Graphic Secretsは復刊ドットコムで2010/03/30現在41票となっています)。

FastMMやDelphi 2006以降の標準メモリマネージャについては以下のURLが参考になります。

Borland Developer Studio 2006の新しいメモリマネージャ - by Pierre le Riche
Delphiアプリケーションのメモリリーク検出法
某所 - 新しいメモリマネージャの仕組み
FastMMの導入

またDelphi 2.0の標準メモリマネージャについては

Inside Delphi (amazon)/Ray Lischner著/光田秀訳/アスキー/ISBN 978-4756119513 (ISBN 4-7561-1951-4)/9,240円

の"第19章 ヒープの秘密"に詳細な解説があります。

2010年3月18日

IDE Fix Pack 3.01 for Delphi 2010リリース

Andreas HausladenさんIDE Fix Pack for Delphi/C++Builder 2010がアップデートされてVersion 3.01になっています。Delphi 2010版のみの更新で、リリース時の手違いによるものとのことです。

Andy’s Blog and Tools » IDE Fix Pack 3.01 for RAD Studio 2010

2010年3月17日

IDE Fix Pack 3.0リリース

Andreas HausladenさんのIDE Fix Pack (for Delphi/C++Builder 2007/2009/2010)がアップデートされてVersion 3.0になっています。

Andy’s Blog and Tools » IDE Fix Pack 3.0 released

2010年3月16日

[書籍]Delphi 2010 Handbook

2010/03/06の発売時に注文したMarco CantuさんDelphi 2010 Handbook書籍版が今日(2010/03/16)配送されてきました。さていつ読み終わることやら。
ちなみに先日のデベロッパーキャンプで藤井さんはDelphi 2010 Handbookはたぶん翻訳されないようなことを言ってました。まぁこんなご時世なので致し方ないかとは思います。

2010年3月12日

第16回 エンバカデロ・デベロッパーキャンプ 2日目

b-mobileでもLive Meetingの専用クライアントなら辛うじて動作する模様(音声なしで画像のみですけど)。
  • [2A]Delphiテクニカルセッション「Delphi 2010 言語の新機能」
    Davidさんのセッションスタート。会場でも音声状態がよくないですね(通訳さんのものを含めて)。まぁスライドを見てればいいって話ですか。英語ですけど。

  • [2B]テクニカルセッション「ソフトウェア・アーキオロジー- もしあなたが100万行のコードの引き継ぎをすることになったらどうしますか?」
    Michaelさんのセッションでもやはり音声状態がよろしくないですね。archeology(archaeology)は考古学、という言葉です。引き継いだコードは発掘した遺物のように全く未知の状態から順番に解明していく必要がある、というような比喩でしょうか。

  • Live Meetingは接続できてもイメージが来ない…b-mobileだめか。接続し直して復帰。会場内の音声も多少は改善されたかな。

  • [2C]Delphi/C++テクニカルセッション「正しいGUIの作り方 - 重い処理でGUIが固まるのを防ぐ」
    高橋さんのセッションでスレッドの内部変数のアクセスは何らかの排他処理が必要、という部分はクリティカルセクション、System.TMonitor(ja)(Delphi 2010 2009 or later)、InterlockedExchangeAddのようなInterlocked系APIなど。クリティカルセクションについては以下の問題に注意。ってQC73347は"Cannot Fix"でClosedになってますね。It is not Delphi's issue. って話じゃないと思うんだけど。
    Team Japan » InitializeCriticalSectionEx
    早くもサンプルコードが公開されています(15:56)。
    Team Japan » サンプルコードを用意しました: 【2C】 Delphi/C++テクニカルセッション

  • 昼食時間が…。

  • [2D]スペシャルスポンサーセッション「Delphi, UC-win/Road SDKによるVRアプリケーション開発事例」
    宮本さんのセッションは3Dの絵がぬるぬる動く感じが出なかったのが残念。パッケージを使ったシステムの拡張という面で非常に興味深い。書籍も出すようです。

  • [2E]Delphiコミュニティセッション「インストーラ対決一本勝負!」
    インストーラ対決で、山本さんがInstallAwareを扱っていますが、具体的なところをもっと知りたい人はとりあえずここを読んでおくべき。ちなみに奇特なってのは山本さんの表現ですから。
    ちっぷす
    インストーラでシリアル番号の認証をしたりするのであればInstall Shield Express(113,400JPY)かInstallAware Developer(1,499USD=135,900JPY)が必要です。またInno Setupでは[Code] セクションでイベント関数 CheckSerial を記述している場合には、シリアル番号入力欄が表示される。ということで可能なようです。
    Inno Setup 日本語 デベロッパーズガイド: ウィザードページ(ダイアログ)について

  • [2F]Delphiテクニカルセッション「Delphiでキカイを制御する - アプリケーションの設計とテクニック」
    高木さんのセッションは機器不調のためディレイ中(15:11)。始まりました(15:17)。説明で使用しているソースコード(ライブラリ)は後日イマジオムさんのwebページで公開されるとのこと。TCommandQueueやSynchronizeは無名関数やジェネリクスを応用したら更にいろんなことができるかも。って早っ。25分も巻いて終わりました。

  • [2G]クロージング~抽選会
    クロージングセッションには藤井さんとJasonさんが登場。Tシャツありがとうございます。QueryPerformanceCounterとか呼んでますね、このコード。ん?TThreadPoolってどこのもんでしょう?これ(Allen Bauerさんの解説)かな?どうもマルチスレッドで素数を計算するようなプログラムのような気がする…。どっちかというと.NETなのかな?

無事終了。みなさまお疲れさまでした。会場を提供していただいたフォーラムエイトさま、コンセントがあって助かりました。

2010/03/17追記: プレゼンテーション資料がダウンロードできるようになっています。

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

2010/03/18追記: ビデオもダウンロード/リプレイできるようになっています(要登録)。またアンケートも実施されています。そういえばアンケートやらなかったな、とは思っていました。

第16回 エンバカデロ・デベロッパーキャンプ ビデオ視聴/ダウンロード
第16回 エンバカデロ・デベロッパーキャンプ アンケート

2010年3月11日

第16回 エンバカデロ・デベロッパーキャンプ 1日目

会場は20人弱、中継は同時に最大140人くらいですかね(藤井さんによれば合計で200人くらいとのこと)。b-mobileでLive Meetingに参加するのはちょっと難しいみたいです。Javaのクライアント(Web Access)は動作しないし、Office Live Meetingクライアントはダウンロードできないし。期限が切れたらauかDoCoMoにするか?(仕事の都合上僻地で使えないWiMaxは選択肢に入らない)
  • [1A]イントロダクションセッション「デベロッパーキャンプを2倍楽しむ方法・新企画のご紹介」
    堀江さん頑張れ。Delphi and C++Builder Application Showcaseに日本発のものがないということでなにやら企画中とのことです。でもうちみたいに委託だとお客さんに無断で、というわけにはいかないわけでねぇ。

  • [1B]C++チュートリアルセッション「C++Builder 5/6ユーザと初心者のためのC++Builder 2010入門」
    個人的にはPadding/Marginsプロパティの意味がわかったのが収穫(C++Builder使いじゃないもので)。

  • [1C]Delphiチュートリアルセッション「Delphi 7ユーザと初心者のためのDelphi 2010入門」
    細川さんのセッションは音声トラブルのため遅延中…(14:40)。直ったのかな?リスタート(14:44)。

  • 一応各セッションは5分前終了のような雰囲気だけど、会場にいると明示的な休憩がなくてちょっと不便かも。

  • [1D]グランドオープニングセッション「エンバカデロ製品戦略 ソフト開発者・DB管理者のための真に自由なIT環境」
    Jasonさんの"What's Next?"ではToolCloud、Commodore、Fulcrum、InterBaseに言及あり。

  • [1E]Delphiテクニカルセッション「Delphiでの文字コードのハンドリングについて 」
    富永さんのセッションで出てくるWindowsのCodePageの一覧。
    Code Page Identifiers (Windows)
    新しいIPAexフォントではJIS0213:2004制定時に字体変更された文字の旧字体を異体字として収容とのこと。
    IPAフォントのダウンロード || OSS iPedia
    IPAフォントリリースノート || OSS iPedia

  • [1F]C++テクニカルセッション「C++言語のパワーとRAD/ビジュアルアプリケーション開発の活用」
    JasonさんのC++BuilderのセッションはC++0x draft準拠機能、Boostの正規表現、新しいTDirectoryクラス、デバッガのビジュアライザ、スレッドのデバッグ機能などのデモ。


1日目は無事終了。[1B][1F]を見ていて思ったのは、C++BuilderはVSユーザのなかでもC++を使いたいんだけどC++/CLIはありえない、かといってMFCはいまさら、という人にフォーカスしてアピールするといいのでは、ということ。そのためにはC++0xなどの標準準拠度の向上やBoostのようなライブラリへの積極的な対応が重要なのではないでしょうか。

2010年3月10日

Microsoft Monthly Update 2010/03

今日はMicrosoftのセキュリティアップデートの日です。
MS10-016
MS10-017

2010年3月6日

Delphi 2010 Handbook (書籍版)出版

Marco CantuさんDelphi 2010 Handbookの書籍版がAmazon(US)から発売されました。全318ページで、定価は43.50USD(3,930JPY)ですが、現時点(2010/03/06)では34.25USD(3,095JPY)のディスカウントが設定されています。またDelphi/C++Builder/RAD Studio 2010の登録ユーザはEDNのCodeCentralからPDF形式のものをダウンロードできるようになっています。

元ねたはDelphi 2010 Handbook on Amazon, Developer Network

2010/03/17追記: Delphi/C++Builder/RAD Studio 2010の登録ユーザ向のDelphi 2010 HandbookとTMS Smooth Controls Packの無償ダウンロードについての記事がEDNに追加されています。

Delphi 2010, C++Builder 2010 および RAD Studio 2010 の登録ユーザーの方へ、 2つの無償ダウンロードの提供

2010/03/27追記: Amazon(JP)での取り扱いを確認しました。4,956円で配送料無料ですし、日本語で注文できるので、こちらのほうがいいかもしれません。

Amazon.co.jp: Delphi 2010 Handbook: A Guide to the New Features of Delphi 2010; Upgrading from Delphi 2009: Marco Cantu: 洋書

元ねたはDelphi 2010 Handbook in Europe

2010年3月1日

[書籍]プログラマのための文字コード技術入門

ジュンク堂書店の新宿店で

WEB+DB PRESS plusシリーズ プログラマのための文字コード技術入門/矢野啓介著/技術評論社/ISBN 978-4-7741-4164-0/2,709円

を見かけたので購入。

2010年2月23日

Delphi 2010 Handbook (PDF版)出版

Marco CantuさんDelphi 2010 Handbookが完成してPDF版(28.00USD/2,474JPY)が発売されました。書籍版(43.50USD/約3,970JPY)は来週くらいにCreateSpaceから、その後数週間でAmazonなどでも入手可能になるようです。
またPDF版をDelphi 2010登録ユーザ向にEmbarcaderoから無償でダウンロードできるように交渉中とのことです。

元ねたはDelphi 2010 Handbook Released

2010/03/01追記: Delphi 2010 Handbook In Printによると書籍版(print on demand)がCreateSpaceで発売になっています。

2010年2月17日

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

第16回 エンバカデロ・デベロッパーキャンプ前回予告されたとおりにウェブセミナー形式(Mircosoft Live Meeting)で2010年03月11日-12日の2日間で開催されます。今回は中継が可能になったということでDavid Intershimoneさん(エンバカデロ・テクノロジーズ チーフエヴァンジェリスト)、Jason Vokesさん(エンバカデロ・テクノロジーズ テクノロジー&インターナショナルマーケティング シニアディレクタ)、富永英明さん(有限会社エイブル)といった豪華布陣です(あっいつものみなさんが豪華じゃない、という意味ではありません)。
再放送が可能になれば時間や日付が合わない人も見られるようになっていいと思います。

2010/03/05追記: ライブ会場に行きます。仕事はいいのか…?

2010年2月10日

Microsoft Monthly Update 2010/02

今日はMicrosoftのセキュリティアップデートの日です。
MS10-003
MS10-004
MS10-005
MS10-006
MS10-007
MS10-008
MS10-009
MS10-010
MS10-011
MS10-012
MS10-013
MS10-014
MS10-015

Delphi 2010におけるREST

Marco CantuさんによるDelphi 2010を使用したRESTの扱いに関するホワイトペーパが翻訳、公開されています。また解説ビデオ(英語)も公開されています。

Rad Studio 2010 in Action JP Marco
「Delphi 2010におけるREST」ホワイトペーパーダウンロード

元ねたはMarco CantuさんDelphi REST White Paper in Japanese

2010年2月9日

Firebird 2.5 Release Candidate 2リリース

firebirdsql.orgのサーバクラッシュの影響で遅れていたFirebird 2.5のRelease Candidate 2ですが、やっとリリースされました。

Firebird File Repositories (download)
Firebird 2.5 Release Notes

2010年2月8日

一定時間ユーザ入力がないことを検知する

一定時間ユーザがPCの操作が行わなかったことを検知するにはGetLastInputInfo(ja)で最後に操作したタイミング(LASTINPUTINFO構造体のdwTime)と現在のGetTickCount(ja)の値(いずれもmsec単位)を比較します。注意点としてはGetLastInputInfoはシステム全体ではなく現在のセッションのユーザ入力のみを扱うというところでしょうか。
このサンプルではボタンをクリックしてポーリングを開始した後でユーザ入力(キーボード、マウス操作)が10秒間発生しなかったときにメッセージダイアログを表示します。またポーリング毎に前回からユーザ入力が発生していない場合はLabel1に表示しているGetTickCountの表示をclRedに変更しています。
procedure TForm1.Button1Click(Sender: TObject);
begin

  Timer1.Enabled := True;
  Button1.Enabled := False;

  FLastTick := 0;
  Timer1Timer(Sender);

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  LII: TLastInputInfo;
begin

  FillChar(LII,SizeOf(LII),0);
  LII.cbSize := SizeOf(LII);
  if GetLastInputInfo(LII) = False then
  begin
    Exit;
  end;

  Label1.Caption := 'Last user input: ' + IntToStr(LII.dwTime);
  if FLastTick <> LII.dwTime then
  begin
    Label1.Font.Color := clWindowText;
    FLastTick := LII.dwTime;
  end
  else
  begin
    Label1.Font.Color := clRed;
  end;

  if (GetTickCount - LII.dwTime) > (10 * MSecsPerSec) then
  begin
    Timer1.Enabled := False;
    Button1.Enabled := True;
    MessageDlg('Detect for input idle (10 seconds).',
               mtInformation,[mbOk],0);
    Label1.Caption := '';
  end;

end;
別解としてSetWindowsHookEx(ja)にWH_KEYBOARD_LL(ja)/WH_MOUSE_LL(ja)を指定して低レベルフックをかけ、フック関数内でGetTickCountの値を取得、というものも考えられますが、
  1. DelphiのIDEから実行するとデバッガでブレークしたときにやたらに時間がかかる。
  2. Windows XPのVisual Style(Luna)とマウスの低レベルフックの相性が悪く(どちらかというとLunaの不具合)、フォームの最小化、最大化ボタンをクリックしたときに極端に反応が悪くなる。
という問題があるため、こちらはあまりお勧めできません。

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

2010/03/03 18:00-19:00(JST) 3/3 - Webセミナー「DB Optimizerによるデータベース パフォーマンスチューニングの概要と評価方法」
2010/03/24 18:00-19:00(JST) 3/24 - Webセミナー「DBArtisan チュートリアル」

2010年1月28日

RAD Studio/C++Builder 2010 Hotfix 1

RAD Studio/C++Builder 2010のHotfix 1がリリースされています。QC79954のCコマンドラインプリプロセッサの不具合を修正するものです。

RAD Studio 2010 (C++Builder 2010) 用 Hotfix1
27567 Hotfix 1 for RAD Studio 2010 (C++Builder 2010)

2010/02/02追記: EDNの日本語の記事が出たのでリンクを差し替えました。

2010年1月27日

Fulcrum

Allen BauerさんThe Oracle at Delphi » Requiem for the {$STRINGCHECKS xx} directive…によれば、従来"Project X"と呼ばれていた(現在開発中のMac/Linuxクロス対応)次期RAD Studioのコードネームは"Fulcrum"だそうです(さっそく"Fulcrumだって?Mig-29かよ"というツッコミが入っていますが)。それにしてもCommodoreはいずこへ…。
ちなみに本題である$STRINGCHECKSコンパイラディレクティブ(日本語ページはない)というのは、Delphi 2009/2010でUnicodeStringがデフォルトになった一方でC++Builderでは(Stringではなく)明示的にAnsiStringが使用されてきたため、この間を取り持つ変換処理を挿入するかどうかを指定するためもの(プロジェクトオプションのコンパイラオプションでデフォルトを指定可能)。Fulcrumではこれが廃止される(無視されるようになる)、というお話みたいです。

2010年1月22日

WindowsのサービスからGUIを持つプロセスを起動

Windows Vista/7ではセッション0の分離が行われたため、単純にサービスからGUIプロセスを起動できなくなりました。そこで
  1. Win32APIのWtsGetActiveConsoleSessionID関数で現在ログオンしているユーザのセッショントークンを取得。
  2. サービス(SYSTEMアカウント上で動作している)のプロセスのユーザトークンを取得。
  3. ユーザトークンを複製。
  4. ログオンユーザのセッションを複製したトークンに設定。
  5. 複製したトークンを使用してWin32APIのCreateProcessAsUser(ja)関数でプロセスを起動。
という手順を踏み、サービスからGUIを持つプロセスを起動する方法を説明した記事。興味深い。とりあえずメモ。

From Zero To One » Blog Archive » How to start a GUI process from service, under Windows Vista/7

Microsoft OOB Update 2010/01

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

2010年1月21日

RAD Studio/Delphi/C++Builder 2010 Update 4/5適用後のTTimerの振る舞いについて

Team Japanの高橋さんの

Team Japan » TTimerコンポーネント

によれば、TTimerのSetEnabled(True)の実装がRAD Studio/Delphi/C++Builder 2010 Update 4/5適用で変更され、これに伴なってメインスレッド以外のスレッドからTTimerをスタートしようとするとうまくいかないという報告があるようです。

QC81256: Changing TTimer.Enabled from thread does not work anymore since Update 4 for Delphi 2010
QC80376: RAD Studio 2010 IdTCPServer1Execute Error (After latest updates)

2010年1月19日

RAD Studio/Delphi/C++Builder 2009 Hotfix 3

RAD Studio/Delphi/C++Builder 2009のHotfix 3がリリースされています。IntraWebでUTF-8のWebRequestの内容を解析するTUTF8ContentParserの中国語(繁字体)マルチバイト文字の処理の問題を解決するようです(高橋さんによれば従来サポートでのみ配布していたものが正式公開になったようです)。IntraWebを10.0.21に更新した上でUTF8ContentParser.pasをプロジェクトフォルダに配置してリンク対象にし、かつ実行時パッケージを使用しないようにする、という変則的なものです。

Delphi/C++Builder/RAD Studio 2009用 Hotfix 3
27563 Hotfix 3 for Delphi 2009 and C++Builder 2009
Team Japan » Delphi/C++Builder 2009向けHotfix 3 for IntraWeb 10

なおこの問題は最新のRAD Studio/Delphi/C++Builder 2010では発生しない(The problem does not occur in the latest 2010 version.)とのことです。

2010/01/20追記: IntraWeb 10.0.21についてはTeam Japanのこちらの記事も参考になります。

Team Japan » IntraWeb Ver10.0.21 がリリースされました

2010/01/25追記: EDNの日本語の記事が出たのでリンクを差し替えました。

2010年1月13日

Microsoft Monthly Update 2010/01

今日はMicrosoftのセキュリティアップデートの日です。
MS10-001

2010年1月7日

2010/01開催のウェブセミナー

2010/01/14 18:00-19:00(JST) 1/14 - Webセミナー「詳細!DataSnap」
2010/01/21 17:00-18:00(JST) 1/21 - Webセミナー「エンバカデロ・テクノロジーズによるツール・クラウド All-Access」Replay download
2010/01/27 18:00-19:00(JST) 1/27 - Webセミナー「DB Optimizerによるデータベース パフォーマンスチューニングの概要と評価方法」

時間があれば…。

2010/01/14追記: 「詳細!DataSnap」は気がついたら終わっていた。だめじゃん…。

2010/01/26追記: うぅむ、時間がない…。

2010/02/25追記: 2010/01/21分のリプレイのリンクを追加しました。

2009年12月25日

TTouchKeyboardのハッキング

Chris BensenさんによるDelphi 2010の新機能の一つ、タッチキーボードのhackについての解説です。

Hacking the TTouchKeyboard Part Iではまずキーボードレイアウトの名称の一覧を取得し、この名称からキーボードレイアウトをロードします。

Hacking the TTouchKeyboard Part IIでは取得したキーボードレイアウトをXMLで読み書きする、というサンプルプログラムが紹介されています(タッチキーボードとは直接関係ない部分だからか説明省略です)。

Hacking the TTouchKeyboard Part IIIでは逆にXML表現のキーボードレイアウトをコンパイルしてリソースとしてリンクすることができる形式に変換するキーボードレイアウトコンパイラが紹介されています。

Hacking the TTouchKeyboard Part IVではXML表現のキーボードレイアウトファイルの各要素が説明されています。

(以下追記予定)

2009年12月24日

2009年12月23日

IDE Fix Pack 2.9リリース

Andreas HausladenさんのIDE Fix Pack (for Delphi/C++Builder 2007/2009/2010)がアップデートされてVersion 2.9になっています。

Andy’s Blog and Tools » New IDE Fix Pack 2.9

2009年12月18日

Windows Vista以降のOSでgsecがサービス動作のFirebirdに接続できないとき

Windows Vista以降のOSにFirebirdをインストールし、サービスとして動作させた後に、ユーザを作成するためにgsecでサーバに接続しようとするとローカルプロトコルが動作せずにエラーになることがあります。この場合は一旦Firebirdのサービス("Firebird Guardian"か、存在しなければ"Firebird Server")を停止し、firebird.confの

# IpcName = 
となっている行を

IpcName = Global\FIREBIRD
としてFirebirdを起動するとローカルプロトコルが正常に動作し、gsecで接続できるようになります(Firebird 2.x)。Firebird 1.5では

IpcName = Global\FirebirdIPI
とします。

元ねたはキムラデービーブログ | [IBDeveloper] FirebirdはWindows Vistaの上で動作しますか?設定ファイル(aliases.conf/firebird.conf)のリファレンス - Firebird WikiDoes Firebird work on Windows Vista or Windows 7?あたり。

RAD Studio/Delphi/C++Builder 2007 informal, unofficial fix for Windows 7

RAD Studio/Delphi/C++Builder 2007をWindows 7の64bit版で動作させるとデバッガで例外が発生してしまう問題(RAD Studio/Delphi/C++Builder 2009ではHotfix 2で修正されていた)の私的で非公式な修正をChris Hesikさんがリリースしています。

Chris’ CodeGear Debugger Blog » RAD Studio 2007 informal, unofficial fix available: Windows 7 problem addressed
ID: 27521, RAD Studio 2007 Debugger Fix for Windows 7

内容的にはOlaf Monienさんのバイナリパッチと同等のものに加えて、いくつかのWindows 7環境における問題のfixを含んでいるようです。なおThis fix has not been tested at all, and it is not supported in any way by Embarcadero. If it works for you, great… if not, you’ve been warned.(超訳:この修正は完全にテストされてはおらず、エンバカデロによりサポートされません。あなたの環境で動作すれば素晴らしい…んですが、もし駄目だったとしても、警告しましたよ)だそうです。

また(もうないとは思いますが)新しいアップデートがリリースされた場合はこのファイル(bordbk105N.dll)を元のものに戻すか、削除後に修復セットアップしてからアップデートを適用する必要があると思われるので注意が必要です。

2009年12月15日

RAD Studio/Delphi/C++Builder 2010 Update 4, Update 5, Boost Library Update

RAD Studio/Delphi/C++Builder 2010のUpdate 4, Update 5 (database pack), Boost Library Updateがリリースされています。2009/11/13にwithdrawとなったUpdate 2, Update 3, Boost Updateの修正に加えてそのほかの修正も行われているとのことです。

27492 Update 4, 5 & Boost Lib for RAD Studio, Delphi & C++Builder 2010
リリース ノート: Delphi 2010 および C++Builder 2010 Update 4、Update 5(データベース パック)、Boost Library Update

2009年12月14日

Delphi 2010 Handbook続報

Marco CantuさんによればDelphi 2010 Handbookは大体完成して2010/01末には書籍として販売されるようです。また新たな試みとして全体を3部に分割してPDFで月曜日(2010/12/14)から先行販売するそうです。今回は日本語訳の動きはないのですかね。

Delphi 2010 Handbook Almost Ready

2009/12/15追記: 予告どおりPDF版のPart 1が9.80USD(846JPY)で発売されました。Part 2、Part 3は15日の間隔でリリースされるそうです。

Delphi 2010 Handbook Part 1 PDF Available

2009年12月12日

Firebird 2.5 Release Candidate 1リリース

新しいスレッディングアーキテクチャを採用し、新たにSuperClassicが追加されたFirebird 2.5のRelease Candidate 1がリリースされています。RCはもう一度予定されているようです。

Firebird File Repositories (download)
Firebird 2.5 Release Notes

2009年12月10日

[書籍]Firebird徹底入門

ジュンク堂書店の新宿店で

Firebird徹底入門/木村明治はやしつとむ坂井恵著/翔泳社/ISBN 978-4798119632/3,990円

を買ってきました。結構分厚いですね。表紙は残念ながら焼き鳥ではありません。

2009年12月9日

Microsoft Monthly Update 2009/12

今日はMicrosoftのセキュリティアップデートの日です。
MS09-069
MS09-070
MS09-071
MS09-072
MS09-073
MS09-074

2009年12月6日

DelphiSpeedUp 2.8/IDE Fix Pack 2.8リリース

Andreas HausladenさんDelphiSpeedUpがアップデートされてVersion 2.8になっています。Delphi/C++Builder 6/7/2005/2006/2007のデバッガのステップイン([F7]キー)の動作が改善されています(Delphi 5についてはSorry Delphi 5 users, but I can’t support you anymoreとのこと)。
またIDE Fix Pack (for Delphi/C++Builder 2009/2010)もアップデートされてVersion 2.8になっています。上記のデバッガのステップインの問題のほかに、呼び出し履歴(call Stack)とローカル変数(local variables)の表示更新を不必要に行わないようにし、Delphi/C++Builder 2010のオブジェクトインスペクタで[F1]キーが効かない問題も修正されます。

Andy’s Blog and Tools » DelphiSpeedUp 2.8 and IDE Fix Pack 2.8 released

2009年12月4日

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

RAD Studio/Delphi/C++Builder 2009のHotfix 2がリリースされています。Windows 7の64bit版におけるデバッガの問題など3点の不具合を修正するものです。RAD Studio/Delphi/C++Builder 2007用のhotfixもお願いしたいところです。

Hotfix 2 for Delphi, C++Builder and RAD Studio 2009
27476 Hotfix 2 for Delphi 2009 and C++Builder 2009

2009/12/18追記: Chris HesikさんによるRAD Studio/Delphi/C++Builder 2007用のUnofficial, informal fixがリリースされました。

2009年12月2日

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

スピーカの皆さん、関係者の皆さん、懇親会に参加したみなさん、おつかれさまでした。David.Iさんも下手な説明ともっと下手な英語でくだらない話を聞いていただいてありがとうございました。

ずっと放置状態でしたが、ここまでで出ていない情報をいくつか。

G1(オープニングセッション)
  • 来年(2010年)は従来のような“リアル”なデベロッパーキャンプは2回(東京、大阪)にして、“バーチャル”なものをもう2回程度、というように考えている。 by 藤井さん
    »“バーチャル”なら、参加者はもちろんセッションスピーカも“リアル”ではなかなか来てもらえないような人(たとえばMarco CantuさんとかDEKOさんとか)にも出てもらいやすくなる、と。ただしwebセミナーの“盛り上がらなさ”感などを考えるとある程度の聴衆は必要かも、とか、時間帯は色々な意見があって難しい(webセミナーでも時間帯の希望はばらついていたそうで)、とか、時間差をつけての録画の再配信って、とか、一度小規模な形で試してみるか、とか、うまくいくようにするには考えなければいけないことがたくさんありますね、なんてお話もさせていただきました(番外編で)。

G2(コミュニティトーク)
  • Project Xでは(KylixのようにIDEを移植するのは難しいので)クロス開発、リモートデバッグの形態になる。
  • VCLのWindows 7対応は(Windows 7とDelphi 2010のリリースのタイミングの関係から)まだ不足しているので今後対応を進めていきたい。
  • Unicodeの扱いが難しいのは新しいやり方になれるしかない。
    »Unicodeの扱いは.NETでのサポート範囲に留まり、独自のアプローチはあまり考えていない、というようなニュアンス。
  • マルチコアをよりうまく使うようなもの(文法的なものやライブラリなど)は現在開発中の新しいコンパイラで考えたい。
  • 分散処理へのアプローチはDataSnapで。
  • クラウドコンピューティングについては未だ業界標準が存在していないのでなんとも。
    »コンポーネントでサポートするような方向性はありかもしれない。


2009/12/15追記: セッション資料がダウンロードできるようになっています。またはやしさんによるストリーミングビデオも見られるようになっています。

第15回 エンバカデロ・デベロッパーキャンプ - 資料ダウンロード
第15回エンバカデロ・デベロッパーキャンプ | Tomneko blog

2009/12/24追記: G1「Delphi/C++Builderの今そして未来」のセッションビデオが公開されています。またG1/G2関係の情報を追加しました。

セッションビデオ「Delphi/C++Builderの今そして未来」

2009年11月30日

FlameRobin

はやしさんの"Firebird RDBMS 傾向と対策1"を見ていたらFlameRobinというFirebirdの管理ツールが紹介されていました。Firebird日本ユーザ会からダウンロードできる日本語版は0.8.3ですが、公式のsorceforgeでは最新が0.9.3となっています。

Firebird RDBMS 傾向と対策シリーズ無償公開

今はなきPSネットワークから出ていたFirebird RDBMS 傾向と対策(全4巻)をPDF化したものをはやしさんが公開してくださっています(焼き鳥本出版記念?)。

Firebird RDBMS傾向と対策 ◁ TomnekoSoft.com
Firebird Books :: Firebird関連の本・書籍の紹介

内容はFirebird 1.0ベースですが、それを念頭においておけばInterBase/Firebirdのユーザにとって有益なものだと思います。

2009年11月25日

Direct2Dのデバッグについて

Chris Bensenさんによると、Intelのグラィックドライバの問題で、(Delphi/C++Builder 2010の新機能である)Direct2Dをデバッグしようとするとデバッガの動作が非常に遅くなる現象が確認されています。これはDelphi/C++Builder固有の問題ではなく、Visual Studioでも発生するとのことで、NVIDIAのビデオカードを使えば問題ないようです。

Chris Bensen: Debugging Direct2D

Firebird徹底入門発売決定

はやしさんからアナウンスがあった焼き鳥本ですが、2009/12/09に翔泳社から発売されるようです。

Firebird徹底入門(amazon.co.jp)/木村明治、はやしつとむ、坂井恵著/翔泳社/ISBN 978-4798119632/3,990円

2009年11月20日

InterBase Roadmap

InterBaseのロードマップが公開されています。2009年にリリースされたInterBase SMP 2009ではセキュリティと暗号化にフォーカスしていましたが、2010/09にリリースを計画しているInterBase SMP 2011では
  • Windows x64版の追加
  • データベースクラウド
  • パスワード暗号の強化
  • Windows 7サポート
  • エンバカデロのデータベースツールによるサポート
が行われるようです。また将来的(2011年以降)には
  • ストアドプロシージャのデバッグ機能
  • ユニバーサルトリガ
  • チューニングを行うためのSQLヒント
  • より大きいインデックスキー
  • クライアント/サーバプロトコルの最適化
も計画されているようです。

InterBase Roadmap

2009/11/24追記: 日本語のInterBaseのロードマップが公開されています(ロードマップそのものは英語のままですが)。

2009年11月12日

Webセミナー Delphi/C++Builder 2010 - タッチプログラミング

11/12 - Webセミナー「Delphi/C++Builder 2010 - タッチプログラミング」
無事に終了しました。次はDirect2Dとかやってほしいですね。

RAD Studio/Delphi/C++Builder 2010 Update 2, Update 3, Boost Library Update

RAD Studio/Delphi/C++Builder 2010のNovember 2009 Update(Update 2/Update 3/Boost Library Update)がリリースされています。

27438 November 2009 Update for RAD Studio, Delphi & C++Builder 2010
リリースノート: Delphi 2010 および C++Builder 2010 Update 2、Update 3(データベース パック)、C++Builder 2010 Boost Update

またDavid DeanさんがC++Builder 2010のBoostライブラリのサポート状況を更新しています。

David Dean » C++Builder 2010 Boost support (Update)

2009/11/13追記: November 2009 Update(Update 2/Update 3/Boost Library Update)は現時点でwithdrawとなった模様です。A7Mさんが指摘しているWindows 7 x64上でのライセンスの認識の問題が原因でしょうか。
Keep seeing registration dialog after Rad Studio 2010Update 2 & 3 installed

2009/11/14追記: we are working on a fix that will cover everyoneだそうです。
Nick Hodges » Blog Archive » The Coming RAD Studio Update

2009年11月11日

Microsoft Monthly Update 2009/11

今日はMicrosoftのセキュリティアップデートの日です。
MS09-063
MS09-064
MS09-065
MS09-066
MS09-067
MS09-068

2009年11月10日

Webセミナー Delphi/C++Builder 2010 - dbExpress/DataSnap開発手法

11/10 - Webセミナー「Delphi/C++Builder 2010 - dbExpress/DataSnap開発手法」
無事終了です。参加して気が付いたことを。
  • Office Live Meetingのクライアントに参加者として表示されるのは登録時の"名"(Firstname)の部分なので要注意(日本向きな仕様ではありませんが、しょせんMSですから)。
  • webクライアント(Live Meeting Web Access)だと音声が出ないので、Office Live Meetingクライアントを使用しましょう。
  • 質問は回答が行われるまで新しいものを出せません(質問を修正することは可能)。

今回説明に使ったPPTファイルはそのうちにPDF化してダウンロードできるようにしていただけるということです(できればサンプルソースもお願いしたいところです)。

2009/11/11追記: セミナー中に出た質問についての情報がTeam Japanに掲載されています。

Team Japan » DataSnap 2010 と HTTPS

Firebird 2.5レビュー

近日(?)公開予定のFirebird 2.5についてはやしさんOSC 2009 Tokyo/Fallで講演したときの資料を公開しています。Firebird 2.5の目玉機能であるSuper Classic Serverについての説明やWindows/Linux上でのMySQL/PostgreSQLとのパフォーマンス比較など、なかなか興味深い資料です。

TomnekoSoft.com :: Firebird RDBMSの情報
Firebird2.5がやってきた!~MySQL、PostgreSQLとのパフォーマンス比較~ ◁ TomnekoSoft.com

また2009/12/上旬には翔泳社から木村明治さん、はやしつとむさん、坂井恵さんの共著で"Firebird徹底入門"が発売されるとのことです。Firebird=焼き鳥、ですか。

2009年11月9日

JVCL 3.39リリース

JVCL(JEDI Visual Component Library)がアップデートされてVersion 3.39(JCL Version 2.1.1)になっています。

Browse JEDI VCL for Delphi Files on SourceForge.net

2009年11月5日

第15回エンバカデロ・デベロッパーキャンプ日程決定

第15回エンバカデロ・デベロッパーキャンプは2009年12月02日に東京国際フォーラムのホールD1、会議室G502/G510で開催されます。今回はDavid Iさん(エンバカデロ・テクノロジーズ チーフエバンジェリスト)がいらっしゃるとのことです。

2009/11/20追記: 番外の懇親会は前回と同じところだそうです。こういうのは好き嫌いが分かれるところですが。
Team Japan » 第15回デベロッパーキャンプ番外セッション - 懇親会場決まりました

2009/11/27追記: EDNにアーティクルが追加されています。
第15回 エンバカデロ・デベロッパーキャンプ
デベロッパーキャンプ番外セッション 「デベロッパートーク BOF」

2009/11/30追記: 会場のホールD1(ホールDの1F)、会議室G502(ブロックGの5Fの北端)、会議室G510(ブロックGの5Fの南端)は相互に離れているとのことです。セッション間の移動には注意が必要ですね。また、はやしさんがUstreamによる中継を企画しているそうです。
Team Japan » いよいよ12月2日開催、デベロッパーキャンプ
第15回エンバカデロ・デベロッパーキャンプ Usream配信

2009年10月30日

RAD Studio/Delphi/C++Builder 2010 Help Update 1

RAD Studio/Delphi/C++Builder 2010のHelp Update 1がリリースされています(予定よりも1ヶ月遅れのような気がしますが)。

27420 Help Update 1 for RAD Studio, Delphi & C++Builder 2010
Delphi 2010 および C++Builder 2010 Help Update 1
Known Problems in the Help - RAD Studio

2009年10月22日

C++Builder 2009ファーストガイド完結

2009/07から10回に分けて公開されてきたC++Builder 2009ファーストガイドが無事に完結しました。執筆者の皆さん、おつかれさまでした。

2009年10月21日

MDIアプリケーションにおけるリボンコントロールの不具合の回避

リボンコントロールをメインフォームに使用したMDIアプリケーションでは、MDI子フォームを最大化すると子フォームのリストア/クローズボタンがメインフォーム上の不正な位置に描画されてしまう、という不具合があり、QualityCentralにも報告されています(QC67835QC70321QC73386)。この問題を修正するコンポーネントをJED Softwareさんが公開しています(近日中にCodeCentralにも投稿予定とのこと)。

jed-software.com » Blog Archive » VCL Ribbon MDI Fix

2009年10月15日

第14回エンバカデロ・デベロッパーキャンプ セッションビデオ

2009年09月02日に大阪で開催された第14回エンバカデロ・デベロッパーキャンプのミガロの吉原さんのテクニカルセッション(T6)のビデオが公開されています。

セッションビデオ「知って得する!現役ヘルプデスクが答えるDelphiテクニカルエッセンス4.0」

2009年10月14日

C++処理系のC++0xサポート状況

主要なC++処理系のC++0xサポート状況をまとめたページが2ちゃんねるのC++0xスレッドで紹介されていました(結構前の話ですが)。

C++0xCompilerSupport - Stdcxx Wiki

これを見るとC++Builder 2009の対応状況はまあまあといったところでしょうか。最もアグレッシブなのはgccで、次がIntel C++、VC++とC++Builderはどっちもどっちな感じです。

アプリケーションの多重起動を禁止するのにglobal atomを使用するのは適切ではない

アプリケーションの多重起動を禁止するでは多重起動禁止にmutexを利用しましたが、別解としてatomの一種であるglobal atomを利用する、という方法も(あまり主流ではないにしても)出回っているようです。しかしGlobalAddAtom(ja)で追加したglobal atomは明示的にGlobalDeleteAtom(ja)で削除しなければ自動的に消滅することはありません。このためアプリケーションが何らかの理由で異常終了してしまうと再実行することができなくなってしまいます。実際にプロジェクトソースを
program Project2;

uses
  Windows,
  SysUtils,
  Messages,
  Forms,
  Unit2 in 'Unit2.pas' {Form2};

{$R *.RES}

const
  { Atom name }
  CAtomName: String = '{7B0C8E12-F168-4DA4-89C9-E4C86BE404FE}';

var
  AppAtom: ATOM;
  Wnd: HWnd;
  AppWnd: HWnd;
begin

  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  if GlobalFindAtom(PChar(CAtomName)) <> 0 then
  begin
    { Search main form }
    Wnd := FindWindow(PChar('TForm2'),nil);  // Class name of the main form
    if Wnd = 0 then
    begin
      Exit;
    end;

    { Bring foreground and activate }
    SetForegroundWindow(Wnd);

    { Get window handle of TApplication }
    AppWnd := GetWindowLong(Wnd,GWL_HWNDPARENT);
    if AppWnd <> 0 then
    begin
      Wnd := AppWnd;
    end;

    { Restore if iconized }
    if IsIconic(Wnd) then
    begin
      SendMessage(Wnd,WM_SYSCOMMAND,SC_RESTORE,-1);
    end;

    Exit;
  end;

  AppAtom := GlobalAddAtom(PChar(CAtomName));
  try
    Application.CreateForm(TForm2, Form2);
    Application.Run;

  finally
    GlobalDeleteAtom(AppAtom);
  end;

end.
として一つ目のインスタンスを実行し、強制的に終了してから二つ目のインスタンスを実行してみましたが、GlobalFindAtom(ja)で有効なglobal atomが取得できてしまい、ログオフ/再起動を行うまでプログラムは有効に起動できません。ということでアプリケーションの多重実行を禁止するのにglobal atomを使用するのは不適切である(global atomの用途として適切ではない)、という結論に達しました。

元ねたはTrial Delphi Programs: Allow Only One Application Execution Per Windows Session

Microsoft Monthly Update 2009/10

今日はMicrosoftのセキュリティアップデートの日です。
MS09-050
MS09-051
MS09-052
MS09-053
MS09-054
MS09-055
MS09-056
MS09-057
MS09-058
MS09-059
MS09-060
MS09-061
MS09-062

2009年10月8日

Firebird 1.5.6リリース

Firebird 1.5系列の最終版となる(予定の)Firebird 1.5.6がリリースされています。

Firebird File Repositories(download)
Firebird 1.5.6 Release Notes

タッチアプリケーションのデモ

Cris Bensenさんが先日のCodeRage 4で使用したタッチアプリケーションのデモについて説明しています。

Touch Demo Part IではまずフォームにDirect2Dサーフェースを用意します。WM_ERASEBKGNDメッセージハンドラではバックグラウンドの消去をしないようにして、オーバライドしたPaintでダミーの描画を、同じくオーバライドしたResizeでDirect2Dサーフェースのリサイズを行うようにします。

Touch Demo Part IIでは1秒あたりの描画フレーム数を計測、描画する処理を追加して、10msec毎に再描画を発生させます。

Touch Demo Part IIIではタッチした位置をグラフィカルに表示するためのTGlowSpotとそのリストを用意して、これらをPaintで描画するようにします。WM_TOUCHメッセージハンドラでタッチしたポイント(複数)に対応したTGlowSpotを生成するようにして、最後にRegisterTouchWindowUnregisterTouchWindowでこのフォームでWM_TOUCHメッセージが発生するようにします。

Touch Demo Part IVではイナーシャ(inertia/慣性)をサポートするためにTGlowSpotに_IManipulationsEvents COMインタフェースを追加してその処理を行わせ、最後にマウス動作をタッチ動作に統合します。

デモはこれで完成、ということでソースコードがCodeCentralで公開されています。

27469 Touch Demo

2009/11/20追記: Part IVの内容を追加しました。

2009年10月1日

RAD Studio 2009対応 TeeChart Standard 8.05アップデート

RAD Studio 2009対応 TeeChart Standard 8.05アップデートがリリースされています。RAD Studio 2010に含まれるものと同等になるようです。

RAD Studio 2009対応 TeeChart Standard 8.05アップデート
27339 TeeChart Standard 8.05 for RAD Studio 2009
Release Notes

Asphyre Sphinx

Delphi/C++Builderで2D/3Dグラフィックを扱うためのライブラリとしてはOpenGLのラッパであるGLSceneがメジャーどころですが、Stack Overflowを眺めていたらAsphyre Sphinxというフレームワークを見つけました(ライセンスはMPL 1.1)。Delphi 2006/Turbo Delphi/Delphi 2007対応(Delphi 2009/2010対応はまだ)で、DirectX 7/DirectX 9/OpenGLをサポートしているとのことです。

元ねたはStack Overflow3D graphics in Delphi/Native TForm GUIs