2015年8月12日

2015年8月5日

IDE Fix Pack 4.4 for Delphi 2007 Windows 10 Edition

Andreas HausladenさんのIDE Fix Pack for Delphi 2007のWindows 10対応版がリリースされています。Windows 7およびそれ以前では4.4を、Windows 8/8.1では4.3を、Windows 10では4.4 Windows 10 Editionを、というようにWindowsのバージョンによって対応が分かれているので注意が必要です。

IDE Fix Pack 4.4 for Delphi 2007 – Windows 10 Edition | Andy's Blog and Tools

2015年8月4日

IDE Fix Pack 5.93

Andreas HausladenさんのIDE Fix PackがアップデートされてVersion 5.93となっています。今回はWindows 10対応(Windows 10が関数アライメントのパディングにNOPではなくINT3を使うことに対応)だけとのことです。

IDE Fix Pack 5.93 – Windows 10 support | Andy's Blog and Tools

2015年8月1日

2015/08開催のセミナー

2015年7月15日

2015年7月8日

7th anniversary

この1年間(2014/07/08-2015/07/07)のエントリは71で、週平均1.4弱でした。相変わらずお知らせばっかりでしたね。続いてアクセス解析の統計情報から月別ページビュー(PV)を。

2014/07: 4,460
2014/08: 4,002
2014/09: 4,259
2014/10: 4,087
2014/11: 3,752
2014/12: 3,876
2015/01: 3,500
2015/02: 3,431
2015/03: 4,314
2015/04: 4,882
2015/05: 4,209
2015/06: 4,434

2014/07-2015/06合計: 49,206

ついに50,000PV/yearを切ってしまいましたが、最近だと書籍関係のまとめが好評のようです。

最近のDelphi関係の話題といえばやはりアップデートサブスクリプションの導入でしょう。開発ツールに(売り切りではなく)いわゆるサブスクリプションモデルは適合しにくいと思うんですけれども、そのあたりは(いかにもアメリカンにアバウトな感じで)修正しながら、ということになるようです。現状のアップデートサブスクリプションモデルのもとでは、アップデートサブスクリプションに入るか、入らないのであれば使いたいバージョンの次のバージョンが出たところでアップグレードする(買ったバージョンではなく直前のバージョンを使う)、ということになるでしょうか。歪んでますねぇ。

ここのところ仕事もオーバフロー寸前のところで動いていてなかなか記事も書けないのですが、直近では久しぶりに新規の案件が入ってXE8にアップグレードしましたし、新たにDataSnapを本格的に使うので、このあたりでまたアウトプットを出していければと思っています。あとは名古屋でやるという勉強会的なイベントに行ければいいなぁ。また1年間お付き合いください。

2015年7月1日

2015/07開催のセミナー

2015年6月24日

DataSnapサーバまとめ

DataSnapサーバを作るにあたって、ヘルプのDataSnap アプリケーションの開発あたりに載っていなかったり、載っていても気をつけたほうがいいと個人的に思ったことをまとめました(ユニットやクラス、あるいはそのリンクはDelphi XE8のものです)。
  • サーバメソッドでサポートされているデータ型

  • クラスインスタンスのマーシャリング/アンマーシャリング

    • Delphiのオブジェクト(クラスインスタンス)は、基本的に送信側でTJSONMarshalのMarshalメソッドでTJSONValueにマーシャリング(変換)したものを送信し、受信側では受信したTJSONValueをTJSONUnMarshalのUnmarshalメソッドでアンマーシャリング(逆変換)して元のクラスのインスタンスに戻します(アンマーシャリングの結果の型はTObjectなのでasで本来のクラスにキャストします)。
    • クラスインスタンスのリスト(TObjectListやTObjectList<T>)はそのままではマーシャリング/アンマーシャリングできないため、
      var
        Values: TJSONArray;
        Item: TFoo;
        List: TObjectList<TFoo>;
      begin
        ...
        for Item in List do
        begin
          Values.AddElement(Marshal.Marshal(Item));
        end;
      
      のようにそれぞれの要素をマーシャリングしたものをTJSONArrayにAddElementメソッドで追加していって、そのTJSONArrayを受け渡して、
      var
        Values: TJSONArray;
        Item: TJSONValue;
        List: TObjectList<TFoo>;
      begin
        ...
        for Item in Values do
        begin
          List.Add(UnMarshal.Unmarshal(Item) as TFoo);
        end;
      
      TJSONArrayのItems[]プロパティ(またはenumerator)で取り出したJSONValueをアンマーシャリングする、という方法が考えられます。
    • RTL経由で適切にシリアライズできないようなクラスのメンバを扱う場合は、マーシャラ(TJSONMarshal)およびアンマーシャラ(TJSONUnMarshal)に特定の型またはメンバに対応する変換/逆変換処理をRegisterConverter、RegisterReverterで登録して処理させる、ということになります。詳細はユーザー オブジェクトのシリアル化を参照。

  • TJSONValueとその派生クラスについて

    • DelphiでJSON形式の値を扱うときにはTJSONValueの派生クラスを使用します。
      • TJSONNullはJSONのnull値に対応します。
      • TJSONFalse/TJSONTrueはJSONの真偽値(false/true)に対応します。
      • TJSONStringはJSONの文字列値に対応します。
      • TJSONNumberはJSONの数値(整数、浮動小数点数)に対応します。
      • TJSONArrayはJSONの配列("JSON形式の値"の配列)に対応します。
      • TJSONObjectはJSONのオブジェクト("文字列のキーと値のペア"の順序付けされていない集合)に対応します。"文字列のキーと値のペア"はTJSONPairとして実装されています。ペアはAddPairメソッドで追加し、逆に文字列のキーからペアを取り出すにはGetメソッドを使用します。

  • サーバクラスのインスタンスのライフサイクルについて

  • セッションの管理について

    • サーバメソッド内でセッションを取得するときはTDSSessionManager.GetThreadSessionメソッドを使用します。またセッションに関する操作にはSessionIdが必要になります。詳細はサーバー側セッション管理を参照。
    • 全てのセッションに対して処理を行いたいときはTDSSessionManagerのForEachSessionメソッドを使用して、
      TDSSessionManager.Instance.ForEachSession(
          procedure (const Session: TDSSession)
          begin
            //
          end);
      
      とします。
    • セッションごとにデータを保持させたいときは、TDSSessionのPutObject、GetObject、HasObject、RemoveObjectの各メソッドで特定のキー(文字列)と結びつける形でTObjectのインスタンスの保持、取得、問い合わせ、削除ができます。保持させたデータはセッションが所有しており、セッションが破棄されるときに解放されます。
    • セッションが生成、破棄されるごとに処理を行いたい場合はTDSSessionManagerのシングルトンインスタンスであるInstanceのAddSessionEventでイベント(イベントハンドラや無名メソッド)を登録します(RemoveSessionEventで登録を削除することもできます)。
      TDSSessionManager.Instance.AddSessionEvent(
          procedure(Sender: TObject;
                    const EventType: TDSSessionEventType;
                    const Session: TDSSession)
          begin
            case EventType of
              SessionCreate:
              begin
                // Session is created
              end;
      
              SessionClose:
              begin
                // Session is closed
              end;
            end
          end);
      

  • 重量コールバック(クライアントコールバック)の管理

    • TDSCallbackTunnelManagerのAddTunnelEvent、RemoveTunnelEventメソッドでトンネルおよびコールバックの登録、解除を通知するコールバック関数を登録、解除できます。
      TDSCallbackTunnelManager.Instance.AddTunnelEvent(
          procedure(Sender: TObject; const EventItem: TDSCallbackTunnelEventItem)
          begin
            case EventItem.EventType of
              TunnelCreate:
              begin
                // Tunnel is created
              end;
      
              TunnelClose:
              begin
                // Tunnel is closed
              end;
      
              TunnelClosedByServer:
              begin
                // Tunnel is closed by user
              end;
      
              CallbackAdded:
              begin
                // Callback is added
              end;
      
              CallbackRemoved:
              begin
                // Callback is removed
              end;
            end;
          end);
      

  • TCP/IP接続を監視

2015/06/25追記: Mat DeLongさんとJim Tierneyさんのブログを参考に一部の項目を追加。

2015年6月19日

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

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

30278 General Update 1 for RAD Studio, Delphi, and C++Builder XE8
30282 Subscription Update 1 for RAD Studio, Delphi, and C++Builder XE8

30284 Delphi and C++Builder XE8 ISO (includes Subscription Update 1)

30304 Boost for RAD Studio & C++Builder XE8 Subscription Update 1

XE8 Update 1 のリリース ノート - RAD Studio (en)

RAD Studio XE8, Delphi XE8, C++Builder XE8 の Subscription Update 1における不具合修正リスト
Subscription Update 1 Fix List for RAD Studio XE8, Delphi XE8, and C++ Builder XE8

XE8からはUpdate Subscriptionに加入しているかどうかで受け取れるバグフィックス、アップデートが異なる、ということになりましたが、XE8 Update 1もGeneral Update 1とSubscription Update 1で内容に差があります。General Update 1には" Community toolbar"、"iOS 8 simulator fix"、"Several files missing from the initial XE8 delivery"のみが含まれ、"Favorites in welcome page"、"Fast search of Bluetooth LE devices"、"Improved robustness of IDE productivity features"、"Improvements in multi-device previews"はSubscription Update 1のみ、となっています。

2015/07/08追記: C++Builder XE8のBoost 1.39用のヘッダファイルの更新(30304)が追加されています。

2015年6月10日

2015年6月1日

2015/06開催のセミナー

2015年5月21日

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

本日10:00から第30回エンバカデロ・デベロッパーキャンプ・イン東京がベルサール新宿グランドコンファレンスセンターで行われます。セッション資料は

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

からダウンロードできるようになる予定です(2015/05/21 10:00以降)。またUStreamで全セッションの中継が予定されています(CH1がG/Fセッション、CH2がEセッション)。

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

2015/05/25追記: 早くもセッションリプレイの公開が始まっています。
  • 【G1】ケーススタディセッション ユーザーショーケース「C++Builderを用いたマルチOS対応一般コンシューマ向けスマートフォンアプリ開発事例」
  • 【G2】ジェネラルセッション「IoT時代のマルチデバイス開発環境」
  • 【F3】テクニカルセッション「業務システムにモバイルを!実践エンタープライズモバイル開発プロジェクト」
  • 【E3】Delphi/C++テクニカルセッション「移行プロジェクトでもモバイル開発でも必須!今からでも間に合うデータモジュール活用法」
  • 【F4】Delphi/C++テクニカルセッション「RAD Studio XE8 の新機能とその活用法」
  • 【E4】Delphi/C++テクニカルセッション「今さら聞けない!? FireDAC入門 ~ オンメモリーデータベース編」
  • 【F5】Delphi/C++テクニカルセッション「RAD Studioで始めるモバイル開発 ~ コンポーネントで簡単入門!勘所も押さえよう」
  • 【E5】Delphiテクニカルセッション「DelphiによるEnterpriseアプリケーション開発 ~ 当社パッケージの内部構造、開発方法ご紹介」
  • 【G6】ライトニングトーク「共有!みんなの開発事例、開発経験、テクニック」
2015/05/27追記: セッション資料がダウンロードできるようになっています。

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