続・RAD Studio 10.2.2 Tokyo Starterをちょっとだけいじってみた。

今度はJCLとJVCLのインストールに挑戦。

JCLとJVCLはGetItからダウンロード・インストールできるのだけど、JVCLはパッケージがインストールされない。

コンパイル済みのバイナリがあるのだけど、こっちもこっちで同じ。

・30761 Jedi Code Library Snapshot Binary Installer for 10.2
http://cc.embarcadero.com/Item/30761

・30762 Jedi Visual Component Library Snapshot Bin-Installer 10.2
http://cc.embarcadero.com/Item/30762

仕方ないので、JVCLは上記インストーラーの展開先から手動でインストール。
以下の手順で(多分)問題なし。

  1. C:\DelphiComponents\JVCL\packages\D25 Packages.groupprojをオープン
  2. プロジェクトグループから以下のパッケージを削除
    • JvDotNetCtrls
    • JvDotNetCtrlsDesign
    • JvDB
    • JvDBDesign
  3. 「プロジェクトマネージャ」から「全てをビルド」
  4. バイナリは、C:\Users\Public\Documents\Embarcadero\Studio\19.0\Bplにできるので、これらを[コンポーネント| パッケージのインストール]でインストール。

ただし、このままだとC++Buiderから使えないので、各プロジェクトオプションの[Delphiコンパイラ|出力 - C/C++]のC/C++ 出力ファイルの生成を「すべての C++Builder ファイル (パッケージ ライブラリを含む) を生成」に設定。

f:id:A7M:20180103213121p:plain

今日はここで力尽きた。やっぱり、Pro以上じゃないと駄目かな…。

RAD Studio 10.2.2 Tokyo Starterをちょっとだけいじってみた。

はてなダイアリーからはてなブログに移行しての第一弾。
ここ数年放置状態だったけど、これからは更新頻度が上がるはず。

ということで、RAD Studio 10.2.2 Tokyoのレビューのような物。

しかし、まぁ、立ち上げていきなりdark themeで立ち上がって驚いた。

f:id:A7M:20180101141449p:plain

Visual Studio CodeとかAtomのようなモダンなエディタの配色がこんな感じだから、その辺のトレンドに合わせてきたのかな。

C++コンパイラLLVM 3.3.1がベース。

f:id:A7M:20180101151458p:plain

 Boostは最初からインストールされているのでは無く、NuGetのようにGetItからダウンロード。バージョンは2013年11月リリースの1.55。流石に旧コンパイラは無理だけど、せめてCLANGベースのは追随して欲しい。物は試しと1.66のビルドに挑戦したけどコンパイラがお亡くなりになったので断念。

折角だからアプリをビルドしてみたら以下のメッセージが表示。

MSBuildToolsPath is not specified for the ToolsVersion "14.0" defined at "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0", or the value specified evaluates to the empty string.
[致命的エラー] MSBuildToolsPath is not specified for the ToolsVersion "14.0" defined at "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0", or the value specified evaluates to the empty string.

どうも、64bitOSでレジストリの MSBuildの値に不整合があるみたい。

support.embarcadero.com

素直に当該部分(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0)を削除すればサクッと動作。

f:id:A7M:20180101153254p:plain

 JVCLのようなサードパーティーコンポーネントはどうなったのかは次のネタで。

 

 

第5回 Delphi talksに参加してきた

この手のイベントに参加するのは本当に久しぶり。楽しい時間を過ごせました。
LTのネタは諸事情により2年3ヶ月ほど塩漬け状態な、コードフォーマッタープラグインネタ。

あまり役に立たない、昨日使用したプレゼンを公開します。
ちなみに、プラグインそのもの(RAD Studio XE用)はhttp://a7m.sakura.ne.jp/APPS/UncrustifyRS_1.00.7zにて公開中。ソースはMPLで配布しているので、ご自由にお使いください。ビルドし直せばXE4とかでも動くはず。(多分)
デブキャンでネタにしたOpen Tools APIについてはここで公開しています。

UnicodeからShift-JISへの変換、どうする?

なし崩し的にDelphi Advent Calendar 2012に記事を書く羽目になった件について。(ぉぃ
まぁ、実業務でのちょっとした覚え書きな件もあるので、いい機会だし久しぶりに更新してみる。

ここ数年でプログラミング環境はUnicodeを意識せざるを得なくなった。DBのエンコーディングUTF-8であることなんて良くあること。コードを書く側としてはエンコーディング変換とかはフレームワークの類いがよろしくやってくれるから余り気にする必要は無いはず。
それに、C++11でUnicodeリテラルが導入されたから、こんな感じで、いろいろアレなことが出来る。

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include <tchar.h>

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    UnicodeString str(U"\u264aジェミニ\u264aの黄金聖闘士ご来席!\u264aジェミニ\u264aの黄金聖闘士ご来席!");
    ShowMessage(str);
    return 0;
}

こいつを実行するとこんな感じで、しっかりと星座記号が出力される。

アプリケーションの内部はUnicodeだけど、それを加工してCSVに吐き出す場合、お客さんはUTF-8UTF-16なんてことは、わけわかめな世界であることが多々あることなので、要件定義として「CSVファイルのエンコーディングはShiftーJISとすること」ってのが追加されているはず。

VCLUnicodeからShiftーJISに変換する場合、素直にUnicodeStringからAnsiStringにキャストするのが定番と言えば定番。
以下のコードを追加して、Shift-JISに無い文字を出力するとどうなるか?

    AnsiString sjStr(str);
    printf("%s",  sjStr.c_str());

こんな感じで、コンソールに「?」マークとして出力される。

結果をodでダンプすると、こんな感じ。

0x3fなので、文字としてはShift-JISに存在しない文字は「?」に変換される。

でも、お客さんは「?」じゃ気に入らない。他の文字にしてくれとなるとどうするか?例えば、「_」(アンダースコア)にしてくれとか。
「s/?/_/g」じゃ駄目だよね?元々あった「?」までも置換されてしまう。

そんな場合は仕方ないので、WideCharToMultiByte APIを直呼びをする。

int _tmain(int argc, _TCHAR* argv[])
{
    UnicodeString str(U"\u264aジェミニ\u264aの黄金聖闘士ご来席!\u264aジェミニ\u264aの黄金聖闘士ご来席!");
    ShowMessage(str);

    // 変換出来無かった場合のデフォルトの文字(スペースに変換)
    const char* DefStr = " ";

    // バッファのサイズを取得
    int BufferSize = ::WideCharToMultiByte(932, 0, str.c_str(), -1, NULL, 0, DefStr, NULL);
    std::unique_ptr<char[]> szBuffer(new char[BufferSize]);

    // 文字列の変換
    int ret = ::WideCharToMultiByte(932, WC_NO_BEST_FIT_CHARS, str.c_str(), -1, szBuffer.get(), BufferSize, DefStr, NULL);

    printf("%s",  szBuffer.get());
}

でも、こいつには罠があって、変換できなかった文字に下駄文字(「〓」)のような全角文字は指定できない模様。その場合はどうしよう…。1文字単位でWideCharToMultiByteを呼び出してlpUsedDefaultCharの値をチェックするしか無いかも。

追記:
Delphiのコードが無い。ん〜!? なんのことかな フフフ…

clang 3.1をWindowsで使ってみた

次期C++BuilderのC++コンパイラがLLVM/clangになる*1というので、早速いじってみた。

まずはインストール。現時点でWindows上でclangを動かすにはmingwが必要とのことで、まずはmingwのインストール。

  1. http://sourceforge.net/projects/mingw/files/Installer/mingw-get/catalogue/からDownload mingw-get-inst-20120426.exeをクリック。
  2. ダウンロードしたインストーラーを実行してmingwをインストール。

続いて、LLVMのインストール。LLVMのダウンロードページからWindows用のバイナリをダウンロード。
ダウンロードしたアーカイブを解凍して、mingwのインストール先に上書き。
以上で、Windows上でclangがインストールされる。

コンパイルは以下の感じ。ネタはC++11でサポートされたラムダ式を使ってFizzBuzz問題を解いてみる。

#include <tchar.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>

class CFizzBazz {

private:
  class Incl {
  public:
    Incl() : m_cnt(1) {
    }
    int operator() () {
      return m_cnt++;
    }
  private:
    int m_cnt;
  };

public:
  CFizzBazz(int max) {
    std::vector<int> v;
    std::generate_n(std::back_inserter(v), max, Incl());
    std::for_each(v.begin(), v.end(), [](int num) {
      if (num % 3 == 0 && num % 5 == 0) {
        std::cout << "FizzBazz";
      } else if (num % 3 == 0) {
        std::cout << "Fizz";
      } else if (num % 5 == 0) {
        std::cout << "Bazz";
      } else {
        std::cout << num;
      }
      std::cout << std::endl;
    });
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  CFizzBazz fizzBazz(_ttoi(argv[1]));
  return 0;
}

スタートメニューから[MinGW|MinGW Shell]を選択してコマンドラインシェルを起動。
コマンドラインから以下を入力。

$ clang -std=c++11 fizzbuzz.cpp -o fizzbuzz.exe -lstdc++

clangの最大の特徴として、エラーメッセージが非常に見やすいってのがある。C++の欠点としてテンプレートとか使うとエラーメッセージがわけわかめになるのがあるけど、それが解消されている。C++11の準拠度もかなり高い感じだし、古いコンパイラを捨てて、clangに移行するのはいい決断ではないかと。

*1:もしかして、DelphiのバックエンドもLLVMになるとか?

第21回エンバカデロデベロッパーキャンプに行ってきた

ある意味、ネタ満載の楽しい「キャンプ」でした。まとめるのが面倒なので、箇条書き。

  • C++Builder使いにとっては、今年は俺のターン!!
  • お、俺はデモの神にそそのかされて無理矢理失敗させられたんだって感じで、最高のタイミングでデモの神が降臨するなwwwwwwww まぁ、おいらも何度も経験しているし。
  • FastReportはかなり使える。帳票の類いを自前で書いていた身としては、このツールあればそんなに苦労しなくて済んだのに。
  • Firemonkeyが楽しすぎる件についてwww
  • うん、IP eachableな環境を整えないと…。Wifi Pocketに寄生させていただきました。ありがとうございます。<(_ _)>
  • 今朝は「地獄のミサワ」状態wwwwww
  • えーと、ぼく、でるふぁいぜんぜんわからないから、ごうかくてんみまんでもいいよね。
  • ええ、そうですか。Mac MiniをIYHしないといけないのか。オゼゼが全くないのに。orz

追記:
おいらの愛機たるHPのDV7-6100だと、デフォの状態ではFiremonkeyが動かない。orz
どうもGPU切り替え機能が悪さをしている模様。
対応策としてBIOSGPUを常時有効状態にするか、デフォでGPUを使用するアプリにRAD StudioそのものとFiremonkey使用の自作アプリを追加すればOK。
さらには、HP製のPCに環境変数"PLATFORM"が定義されているので環境変数絡みの問題を解決しないと、ビルドが出来ないので要注意。