【T9】テクニカルセッション

17Th
Developer Camp

Delphi/C++BuilderでiOS/Macアプリを作ろう！

エンバカデロ・テクノロジーズ
エヴァンジェリスト 高橋智宏
1

アジェンダ• OS Xで動的ライブラリ(.dylib)

デモ– Delphiで作成して、Delphiアプリから呼び出し– C++Builderで作成して、C++Builderアプリから呼び出し• SQLite3 を利用する

デモ– C++BuilderでOS X内蔵のSQLite3を利用する• OpenCL を利用する

デモ– C++BuilderでOS X内蔵のOpenCLを利用する• OS XでSOAPクライアントを作成する

デモ– Win32/Win64のSOAPサーバーからのTClientDataSetを受信して、FireMonkeyのStringGridに表示• Update 4 で新たに追加されたFireMonkey向けモデモ
バイルコネクタ– iOS(4.x, 5.0)から、FreePascal向けプロキシでDataSnapを呼び出す
2• 注意点あり

17Th
Developer CampOS Xで動的ライブラリ(.dylib)

13Delphiで作成• lib[プロジェクト名].dylib が生成される– 共有メモリマネージャ(ShareMemユニット,BORLNDMM.DLL)は無い

4

Delphiアプリから呼び出し• external ‘xxxx.dylib’;• 配置ウィザードで.dylibファイルを追加

5

C++Builderで作成• [プロジェクト名].dylib が生成される– 共有メモリマネージャ(MEMMGR.LIB,BORLNDMM.DLL)は無い• int32_t, char16_t などの型(stdint.h)を使いましょう– MacOS Xでは、wchar_t は 4バイト(32bit) です!!

6

C++Builderアプリから呼び出し• #pragma link ‘xxxx.dylib’• 配置ウィザードで.dylibファイルを追加

7

17Th
Developer Camp

SQLite3 を利用する

28

/usr/include/sqlite3.h , /usr/lib/libsqlite3.dylib• [ツール]-[オプション]-[環境オプション]-[リモートプロファイル]-[リモートパス]– 必要に応じて、.h と .dylib をPAServerからインポート• [ローカルファイルキャッシュの更新]を忘れずに!

9データベースファイルの作成またはオープン• #include <sqlite3.h>• #pragma link ‘libsqlite3.dylib’• sqlite3_open: 作成またはオープン• sqlite3_close: クローズ

10

テーブルの作成 および 行のINSERT• C++BuilderのUnicodeString型(1文字16ビット)を使用– 一部、UTF8String型(UTF8Encode関数)を使用• テーブルの存在確認– システムテーブルにSELECT文を実行• sqlite3_get_table / sqlite3_free_table• テーブルの作成– sqlite3_exec で CREATE TABLE文を実行• 行のINSERT– パラメータ付きクエリ (例: …=:param …)– char16_t版の関数を利用• sqlite3_prepare16 / sqlite3_reset: SQL文の準備• sqlite3_bind_text16: 文字列パラメータのセット• sqlite3_step: SQL文の実行• sqlite3_finalize: SQL文の後始末

11テーブルの作成 および 行のINSERT (続き)12

SELECT文で行を検索• sqlite3_step とその戻り値で結果セットをイテレート– SQLITE_ROW: 行がある
– SQLITE_DONE: 行が無くなった• sqlite3_column_text16 でカレント行の文字列を取得– 戻り値の型を char16_t* 型にするのを忘れずに!!
– C++BuilderのUnicodeString型に変換する

13

17Th
Developer Camp

OpenCL を利用する

3

14

OpenCL on Snow Loepard, Lion
• OpenCL とは?
– 出典: wikipedia• C++Builder XE2 がサポートしている OS X
10.6.x, 10.7.x には、OpenCL が標準搭載
15

OpenCL,OpenGL - /System/Library/Frameworks• [ツール]-[オプション]-[環境オプション]-[リモートプロファイル]-[リモートパス]– フレームワークとして OpenCL と OpenGL をインポート• OpenGL も忘れずに!!
• 必要なヘッダとライブラリが利用できるようになります16

GPUに送り込むカーネルコードを定義• コンパイル前のカーネルコードを文字列で定義– C言語的なコードを書きます• char配列でもファイルでもOK– float値を2乗して、結果を入れて返す: y[i] = x[i] * x[i];17計算用の初期値, GPUに接続, コードのコンパイル• アプリ(ホスト)側で計算用の初期値(配列)を準備– この配列の値をGPU(デバイス)にコピーして渡します• 1個のGPU(デバイス)に接続して、コードをコンパイル– OpenCLでは、GPUではなくCPUを利用することも可18

GPUで使用するパラメータの作成• パラメータ用の配列をGPU内に作成して、そこにアプリ(ホスト)側の配列をコピーする• 計算結果を格納する配列をGPU内に作成• 計算用の配列のサイズも渡しておく

19

GPUで計算実行, 結果を取得して確認, 後始末• GPU内の複数の計算ユニットで並列実行– clFinish関数で実行終了を待ち合わせ• clEnqueueNDRangeKernel関数は非同期で実行される• 計算結果の配列をGPUからホストにコピー– clEnqueueReadBuffer関数で取得（読み込みが終わるまで待たされる）– 試しに、CPUの計算結果とGPUの計算結果を比較する• 作成したリソース群を解放
20

17Th
Developer CampOS XでSOAPクライアントを作成する

421

作成するサンプルシステムの目標・設計• SOAPサーバー– Win32(またはWin64)のDelphi(またはC++Builder)で作成– スタンドアロン(.exe)サーバー– ポート番号 8080
– TClientDataSetを返すメソッドをクライアントに公開• ただし、TClientDataSetそのものではなく、XML化した文字列(string)を採用• SOAPクライアント– MacOS X向けFireMonkeyアプリケーション• Delphi または C++Builder で作成– WSDLからSOAPクライアント用プロキシを生成• Windows版およびMacOS X版で共通!!
– サーバーから取得したTClientDataSetをTStringGridに表示
22

SOAPサーバー – データモジュールを用意• [ファイル]-[新規作成]-[その他]-[Delphiプロジェクト]-[Webサービス]-[SOAP
サーバーアプリケーション]– サンプルのSOPAサーバーインターフェースを作成• サービス名は Employee• [ファイル]-[新規作成]-[その他]-[Delphiプロジェクト]-[Delphiファイル]-[データモジュール]– TClientDataSet を配置– [項目の設定]でフィールドを追加• TIntegerField– FieldName は id

• TWideStringField– FieldName は fullname23クライアントに公開するメソッド• function getEmployeeDataSetXML: string; stdcall;– interface と 実装class を編集• [サービス名]Intf.pas• [サービス名]Impl.pas• TClientDataSetのXMLDataプロパティでXML表現を取得

24

SOAPクライアント – WSDLをインポート• [ファイル]-[新規作成]-[その他]-[Delphiプロジェクト]-[Webサービス][WSDLインポータ]– FireMonkeyフォームからクライアントプロキシユニットを参照• FireMonkeyフォーム上に、以下を配置– TButton– TClientDataSet– TStringGrid• [項目エディタ]で項目(TStringColumn)の追加– Id– fullname

25

SOAPクライアント – TClientDataSetを復元• TClientDataSetのXMLDataプロパティにXML表現をセットするだけ

26

17Th
Developer Camp

5

Update 4 で新たに追加された
iOS/FireMonkey向け
モバイルコネクタ27

Update 4 をインストールすると…
• iOS FireMonkey(FreePascal)向けのモバイルコネクタがリポジトリフォルダに追加される– …¥RAD Studio¥9.0¥ObjRepos¥ja[en]¥dsrest¥connectors¥• freepascal_ios42 フォルダ: iOS 4.2以降• freepascal_ios50 フォルダ: iOS 5.0向け• DataSnap RESTサーバーのプロジェクト– DelphiのWebModule用ユニットのuses(例: WebModuleUnit1.pas)• Datasnap.DSProxyFreePascal_iOS– C++BuilderのWebModule用ユニットの.h(例: WebModuleUnit1.h)• #include <Datasnap.DSProxyFreepascal_iOS.hpp>– プロジェクトのproxyフォルダにモバイルコネクタ(必要があればコピー)• サーバーを起動してWebブラウザまたは専用ツールを起動– http://server[:port]/proxy/freepascal_ios42.zip– http://server[:port]/proxy/freepascal_ios50.zip– DSProxy.pasが自動生成される

28

モバイルコネクタをクライアントで利用する• モバイルコネクタ用の.pasファイル 15個 をプロジェクトに追加

接続先を指定デフォルトのプロトコルはhttpDataSnapサーバーへの接続
サーバーメソッドの呼び出し

DataSnap特有の例外
DBXException

29

Windows上で実行すると…
• モバイルコネクタでサーバーメソッドの呼び出しをテストする– Windows上では、メソッドの呼び出し時に例外が発生する仕様• XcodeとiPhoneシミュレータでのデバッグが必須

30日本語などのUnicode文字列が化けて送信される• Update 4 に付属する DSRESTConnection.pas の不具合
– QC#103021• http://qc.embarcadero.com/wc/qcmain.aspx?d=103021• uses句 と EncodeUrlNS2関数 に加筆修正を施してください– 予め、リポジトリ内のファイル自体を書き換えておくと便利

31

iPhoneシミュレータ上で実行• 予め、ターミナルからiPhoneシミュレータのプロセスをUTF-8で起動しておく(日本語などの文字化け対策)– QC#101418• http://qc.embarcadero.com/wc/qcmain.aspx?d=101418$ export LANG=ja_JP.UTF-8$ cd /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone¥
Simulator.app/Contents/MacOS$ ./iPhone¥ Simulator• Xcodeでビルドして起動!!

32

17Th
Developer Camp

Q&A

33