(2016/09/01~)
2016/09/07

Delphi / C++Builder 10.1 Berlin Starter Edition 無料 DL 期限迫る

Delphi / C++Builder 10.1 Berlin Starter Edition が無料 DL 可能なのは 9/9 までですよ! 9/15 までですよ!(延長されました) いつまでなんでしょうね...とりあえずずっと無償 DL 可能のようです!

後で後悔しないように、まずは下の記事を読んでみましょう。

Delphi / C++Builder 10.1 Berlin Starter Edition の無償版の権利を確保しておくには?

インストールが面倒で後日やりたい事もあるでしょうが、今回の無償版の場合には製品登録していないとそれができない可能性があります。

Embarcadero の登録製品一覧

どちらも登録されていなければ、9/10 以降に Starter Edition をインストールしてもアクティベーションが通らない可能性があります (ライセンスキーがあったとしても、です)。

9/9 までに Starter Edition をインストールする予定がない、あるいはそれができない場合には無償版の権利を確定させておきましょう

  1. EDN にアカウント登録する。
  2. プロモーションページで DL する (Delphi / C++Builder)。インストーラは同じなので、片方は途中で DL をキャンセルしても構わない。
  3. 使用許諾コードの登録ページへ行く。
  4. メールで送られてきたシリアルナンバー (ライセンスキー) を入力し、登録キーには 1234567 を入力して [次へ] ボタンを押す。
  5. "Email アドレス" に有効なメールアドレス (EDN に登録したもの) を入力して、[登録] ボタンを押す。
  6. EDN の登録製品一覧に製品が登録されているか確認する。

    先の登録でメールが送られてくるが無視して構わない (添付の使用許諾ファイルはデタラメなので、むしろ破棄したほうがいい)。

常識的に考えてシリアルナンバーを入手できていれば 9/10 以降にインストールしても大丈夫だとは思うのですが、今回は期間限定の変則プロモーションなのでどうなるかわかりません。9/9 までに Starter Edition をインストールできない方は上記手順で保険をかけておくといいかもしれません (5分も掛からないので駆け込みにも有効です)。

なお上記手順を行った場合、登録ユーザダウンロードで各種ファイルを事前に取得できます...インストーラだったり Object Pascal Handbook だったり。言うまでもない事ですが、Starter Edition を9/9 までにインストールするのが最も確実な権利確保の方法です (^^;A


2016/09/09

Delphi / C++Builder 10.1 Berlin Starter Edition に入れておけばよさげなもの

今北産業の人は...

このページと先月の雑談のページTogetter のまとめを読みましょう。無償 DL は今日までなんだ...急げえぇぇぇ!!


2016/09/11

Delphi 6 Personal と Turbo Explorer と 10.1 Berlin Starter Edition の違い

ざっくり言うと...

Windows 文字コード VCL ソースコード FireMonkey コンポーネントインストール 複数パーソナリティ 商用利用
Delphi 6 Personal 2000 / Me 対応 ANSI × × 不可
Turbo Explorer XP 対応 ANSI × × 標準では不可能 可能
10.1 Berlin
Starter Edition
Windows 10 対応 Unicode × なぜか可能 年 $1000 以内
で可能

無償版 DL エクステンド!

無償版 DL が 2016/09/15 まで延長されました!

何らかの理由でブラウザの地域や言語が "日本/日本語" 以外の場合、キャンペーン終了のページに飛ばされるかもしれません。そんな場合にはスマホでアクセスしてみてください。

Delphi Starter プロモーション C++Builder Starter プロモーション

インストーラをスマホから PC へ移動する方法が分からなくても大丈夫です。後で送られてくるメールにインストーラへのリンク先が書いてありますので PC で再 DL しましょう。


2016/09/18

Delphi / C++Builder 10.1 Berlin Starter Edition がずっと無償で DL できるようになったかもしれない!

プロモーションページを見てみると...

日本だけかな?と思ったら...

英語ページからも期限の記述が消えています (英語ページでは 9/10 以降、製品ページにリダイレクトされるようになっていました)。少なくとも現状では無期限で無償 DL 可能なようです。

どうやら Starter 版は (期限なしで) 無償になったようです。こっそりと (?) こんなブログが。


2016/09/23

RAD Studio 10.1 Berlin Update 1 リリース

RAD Studio 10.1 Berlin Update 1 がリリースされています。エンバカさんのブログが詳しいです!

Update 1 の適用にはアンインストールが必要なので、あらかじめ設定移行ツールで環境をバックアップしておくといいでしょう (Berlin は XE 10 と表示されるので注意!)。Starter Edition の Web インストーラも Update 1 対応になっています。

C++ Boot Camp

先日行われた C++Builder Boot Camp のブログです。

ビデオはこちらから。

Delphi Boot Camp

先日行われた Delphi Boot Camp のブログです。

ビデオはこちらから。


2016/09/24

Delphi らしい for ループの書き方 (嘘)

こんな記事を見かけまして...

その中に "Swift らしい for ループの書き方" ってのがありました。以下のようなコードです。

for i in 0 ..< 10 {
  print("i: \(i)")
}

まぁ...Delphi でも似たようなのは書けますよね。

var
  i: Integer;
begin
  for i in [0..9do
    Writeln(i);
end;    

でも、これは列挙型なので 0..255 つまり、正の数で 255 までしか回せません。イマイチ使えませんね。

記事を読み進めていくと、for のコレクションに stride() 関数が使えるとあります。

for i in stride(from: 0, to: 10, by: 2) {
  print("i: \(i)")
}

「これは確かに便利かも!」そう思って Delphi で同等の関数を書いてみようと思いました。そしてできたのがこちらです。

uses
  ..., Types;

function Stride(from: Integer; through: Integer; by: Integer = 1): TIntegerDynArray;
var
  i, Cnt: Integer;
  Direction: Boolean;
begin
  SetLength(result, 0);
  Cnt := 0;
  // 方向 from < through で順方向 (True)
  Direction := (from <= through);
  // 無限ループになる場合には抜ける
  if by = 0 then
    Exit;
  case Direction of
    True:
      if by < 0 then Exit;
  else
      if by > 0 then Exit;
  end;
  // 開始値
  i := from;
  // 大まかな配列を確保
  SetLength(result, (Abs(through - from) div Abs(by)) + 1);
  // ループ
  while true do
    begin
      if (Direction and (i > through)) or
         ((not Direction) and (i < through)) then
        Break;
      result[Cnt] := i;
      Inc(Cnt);
      Inc(i, by)
    end;
  SetLength(result, Cnt);
end;

この関数を使えば、

var
  i: Integer;
begin
  // 0..10
  for i in Stride(010do
    Writeln(i);

  // -10..10
  for i in Stride(-1010do
    Writeln(i);

  // 0..100 Step 3
  for i in Stride(01003do
    Writeln(i);

  // 10..0 (downto)
  for i in Stride(100, -1do
    Writeln(i);
end;    

このような記述が可能になる...のですが。この関数はコンテナに Integer の動的配列 (TIntegerDynArray) を使ってるので、ループの数だけ Integer の器が必要になってしまいます。1,000 回ループで 4,000 Bytes 必要になり、ループが増えるとメモリ使用量もガンガン増える...なんてアホらしい。

コレクションを計算で返せれば無駄にメモリを食う事はないので、高度なレコード型でコンテナを作ってみる事にしました。

unit uStride;

interface

uses
  SysUtils, Types;

type
  TStrideEnumerator = class;

  TStride  = record
  private
    Ffrom: Integer;
    Fthrough: Integer;
    Fby: Integer;
    FDirection: Boolean;
  public
    constructor Create(from: Integer; through: Integer; by: Integer = 1);
    function GetEnumerator: TStrideEnumerator;
  end;

  TStrideEnumerator = class
    Container: TStride;
    Index: Integer;
  public
    constructor Create(AContainer : TStride);
    function GetCurrent: Integer;
    function MoveNext: Boolean;
    property Current: Integer read GetCurrent;
  end;

implementation

{ TStride }

constructor TStride.Create(from, through, by: Integer);
begin
  Ffrom := from;
  Fthrough := through;
  Fby := by;
  FDirection := (Ffrom <= Fthrough);
end;

function TStride.GetEnumerator: TStrideEnumerator;
begin
  Result := TStrideEnumerator.Create(Self);
end;

{ TStrideEnumerator }

constructor TStrideEnumerator.Create(AContainer: TStride);
begin
  inherited Create;
  Container := AContainer;
  Index := -1;
end;

function TStrideEnumerator.GetCurrent: Integer;
begin
  Result := Container.Ffrom + (Index * Container.FBy)
end;

function TStrideEnumerator.MoveNext: Boolean;
var
  dValue: Integer;
begin
  result := False;
  if (Container.Fby = 0then
    Exit
  else
    begin
      dValue := Container.Ffrom + ((Index + 1) * Container.FBy);
      case Container.FDirection of
        True:
          if (Container.FBy < 0or (dValue > Container.Fthrough) then
            Exit;
      else
          if (Container.FBy > 0or (dValue < Container.Fthrough) then
            Exit;
      end;
    end;
  result := True;
  Inc(Index);
end;

end.

この unit を uses に加えると、

var
  i: Integer;
begin
  // 0..10
  for i in TStride.Create(010do
    Writeln(i);

  // -10..10
  for i in TStride.Create(-1010do
    Writeln(i);

  // 0..100 Step 3
  for i in TStride.Create(01003do
    Writeln(i);

  // 10..0 (downto)
  for i in TStride.Create(100, -1do
    Writeln(i);
end;    

こんな記述が可能になります (swift の Stride で to ではなく through を使ったのと同等です...多分)。ネストしたループとかでもメモリリークは起こらないハズです。普通の for to do / for downto do の方が高速でメモリも消費しないとは思いますけれど、こんな書き方ができても面白いですよね。「俺ならもっとエレガントにやれるぜ!」ってなテクニックや情報をお持ちの方は出し惜しみせずに教えてくださいお願いします m(_ _)m

See Also:

続・Delphi らしい for ループの書き方 (嘘)

油断してたら、らいなタンさんからリプが。

Pythonのrange関数もどきDelphi版。for i in Range(10)で0..9のループ、for i in Range(0,9,2)で0,2,4...となる感じ。 @ht_deko さんに触発されて発掘w https://t.co/dbInTKGiV0

— Lyna (@lynatan) 2016年9月24日

なるホド!もう一回関数でラッピングしてやれば使い勝手がよくなるのか!

unit uStride;

interface

uses
  SysUtils, Types;

type
  TStrideEnumerator = class;

  TStride  = record
  private
    Ffrom: Integer;
    Fthrough: Integer;
    Fby: Integer;
    FDirection: Boolean;
  public
    constructor Create(from: Integer; through: Integer; by: Integer = 1);
    function GetEnumerator: TStrideEnumerator;
  end;

  TStrideEnumerator = class
    Container: TStride;
    Index: Integer;
  public
    constructor Create(AContainer : TStride);
    function GetCurrent: Integer;
    function MoveNext: Boolean;
    property Current: Integer read GetCurrent;
  end;

  function Stride(from: Integer; through: Integer; by: Integer = 1): TStride; // 追記

implementation

{ 追記: BEGIN }
function Stride(from, through, by: Integer): TStride;
begin
  Result := TStride.Create(from, through, by);
end;
{ 追記: END }

{ TStride }

constructor TStride.Create(from, through, by: Integer);
begin
  Ffrom := from;
  Fthrough := through;
  Fby := by;
  FDirection := (Ffrom <= Fthrough);
end;

function TStride.GetEnumerator: TStrideEnumerator;
begin
  Result := TStrideEnumerator.Create(Self);
end;

{ TStrideEnumerator }

constructor TStrideEnumerator.Create(AContainer: TStride);
begin
  inherited Create;
  Container := AContainer;
  Index := -1;
end;

function TStrideEnumerator.GetCurrent: Integer;
begin
  Result := Container.Ffrom + (Index * Container.FBy)
end;

function TStrideEnumerator.MoveNext: Boolean;
var
  dValue: Integer;
begin
  result := False;
  if (Container.Fby = 0then
    Exit
  else
    begin
      dValue := Container.Ffrom + ((Index + 1) * Container.FBy);
      case Container.FDirection of
        True:
          if (Container.FBy < 0or (dValue > Container.Fthrough) then
            Exit;
      else
          if (Container.FBy > 0or (dValue < Container.Fthrough) then
            Exit;
      end;
    end;
  result := True;
  Inc(Index);
end;

end.

こうしちゃえば、最初の関数版みたいに書ける、と。

var
  i: Integer;
begin
  // 0..10
  for i in Stride(010do
    Writeln(i);

  // -10..10
  for i in Stride(-1010do
    Writeln(i);

  // 0..100 Step 3
  for i in Stride(01003do
    Writeln(i);

  // 10..0 (downto)
  for i in Stride(100, -1do
    Writeln(i);
end;    

@ht_deko まあ僕の場合ネタ元のPythonがfor i in range(10)みたいな書き方でそれを真似てただけなので、使い勝手まで考えてそうなってたかは怪しいところですが…w

— Lyna (@lynatan) 2016年9月24日

勉強になります!


2016/09/27

エンバカデロ、Delphi/C++Builder Starter Editionの 無期限無料版を公開、ダウンロード提供開始

エンバカデロ・テクノロジーズ (本社:米国テキサス州オースティン、日本法人:東京都文京区、日本法人代表:藤井 等、以下 エンバカデロ)は、Delphi/C++Builder のスターター開発者向け統合開発環境である Delphi 10.1 Berlin Starter Edition および C++Builder 10.1 Berlin Starter Edition の有償販売を終了し、無期限の無料版として2016年9月27日より公開しました。

そういう事で Starter Edition は公式に無期限無償となりました \(^o^)/

Starter Edition のざっくりとした情報は以下にあります。

エンバカさんの各種情報や問い合わせ先です。

トップページから辿れば当サイトからも Delphi の情報を探すことができるかと思います。


この雑談に対するご意見ご感想等ありましたら Delphi Forum までどうぞ。

 BACK   古いのを読む   新しいのを読む