- Web Seminar
- 2024/03/12 17:00-17:45(JST) 「Delphi 29歳バースディ!私のDelphi推しプレゼン」 - エンバカデロ・デベロッパーTV(2024年3月12日)
- Live Seminar
- Community Event
2024年3月1日
2024/03開催のセミナー
2024年2月14日
2024年2月7日
RAD Studio/Delphi/C++Builder 12 Athens Patch 1
RAD Studio/Delphi/C++Builder 12 AthensのPatch 1がリリースされています。多数の不具合修正が含まれています。現時点(2024/02/08)では(やっと復旧した)GetItからのみダウンロード、インストールすることができます。2024/02/10現在でGetItまたはポータルサイトからダウンロード、インストールすることができます。またwebインストーラもPatch 1適用済のみものがダウンロードできるようになっています。
RAD Studio 12.0 Patch 1
RAD Studio, Delphi, C++Builder 12.0 Inline with Patch 1 Web Install
なおオリジナルのwebインストーラからインストールした場合はPatch 1がインストールされているかどうかにかかわらず、IDEのツール→機能の管理で言語やターゲットプラットフォームなどを追加することはできず、一旦アンインストール後にPatch 1適用済のwebインストーラからインストールし直す必要があるため注意が必要です。
RAD Studio 12 Athens Patch 1 のリリース (en)
GetIt アップデート: RAD Studio 12 向けのGetItパッケージインストールが利用可能に! (en)
GetItアップデート: RAD Studio 12 GetIt オンラインインストールが利用可能に! (en)
2024/02/10追記: Patch 1がポータルサイトからダウンロードできるようになったこととオリジナルのwebインストーラからインストールした場合の注意事項を追記しました。
RAD Studio 12.0 Patch 1
RAD Studio, Delphi, C++Builder 12.0 Inline with Patch 1 Web Install
なおオリジナルのwebインストーラからインストールした場合はPatch 1がインストールされているかどうかにかかわらず、IDEのツール→機能の管理で言語やターゲットプラットフォームなどを追加することはできず、一旦アンインストール後にPatch 1適用済のwebインストーラからインストールし直す必要があるため注意が必要です。
RAD Studio 12 Athens Patch 1 のリリース (en)
GetIt アップデート: RAD Studio 12 向けのGetItパッケージインストールが利用可能に! (en)
GetItアップデート: RAD Studio 12 GetIt オンラインインストールが利用可能に! (en)
2024/02/10追記: Patch 1がポータルサイトからダウンロードできるようになったこととオリジナルのwebインストーラからインストールした場合の注意事項を追記しました。
2024年2月1日
2024/02開催のセミナー
- Web Seminar
2024/02/20 17:00-17:45(JST) 「Delphi 29歳バースディ!私のDelphi推しプレゼン」 - エンバカデロ・デベロッパーTV(2024年2月)2024/03/12に延期
- Live Seminar
- Community Event
2024年1月12日
Firebird 5.0
Firebird 5.0がリリースされています。ODSバージョンは13.1になっています。
Firebird: Firebird 5.0 is released
Firebird: Firebird 5.0.0
Firebird 5.0 Release Notes (PDF)
Firebird 5.0 Language Reference (PDF)
Detailed New Features of Firebird 5
Firebird: Firebird 5.0 is released
Firebird: Firebird 5.0.0
Firebird 5.0 Release Notes (PDF)
Firebird 5.0 Language Reference (PDF)
Detailed New Features of Firebird 5
- Detailed New Features of Firebird 5. Part 1: Improvements in Optimizer
- Detailed New Features of Firebird 5. Part 2: SQLs
- Detailed New Features of Firebird 5, Part 3: Using new clause SKIP LOCKED
- Detailed New Features of Firebird 5, Part 4: Parallel Features: backup/restore/sweep, creation of indices
- Detailed New Features Of Firebird 5, Part 5: Better compression, cache of compiled statements, and more
- Detailed New Features Of Firebird 5, Part 6: Profiling
- Parallel Reading Of Data In Firebird
2024年1月10日
2024年1月1日
2024/01開催のセミナー
- Web Seminar
- 2024/01/30 17:00-17:45(JST) 新年事始め!三浦珠美の「挑戦!はじめてのDelphi」 - エンバカデロ・デベロッパーTV(2024年1月)
- Live Seminar
- Community Event
2023年12月27日
文字列の表示幅を取得する
前回はSkia4DelphiのISkUnicodeを使って文字列を書記素クラスタ(grapheme cluster)に分割する方法を扱いましたが、(等幅フォントでの表記を前提として)文字列が何文字分の幅を占めるのか(いわゆる"表示幅")を取得するためには、それぞれの書記素クラスタ(の基底文字)がいわゆる"半角幅"(halfwidth、1/2 Em)なのか"全角幅"(fullwidth、1 Em)なのかを知る必要があります(Emは文字の高さを基準にした単位で、1/2 Emは高さの半分の文字幅、1 Emは高さと同じ文字幅になる、という意味)。これに関するUnicodeの規格がUnicode Standard Annex #11 East Asian Width(UAX #11)になります。
UAX #11では既存の実装に配慮して、文字をその占める幅によって
では実際にどの文字(コードポイント)がどの分類になるのか、ですが、これはUnicodeデータベースの一部としてhttps://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txtにリストされています。基本的にこれを何らかの形で配列化しておいて参照すればいいのですが、Unicode(UCS4)で扱えるコードポイントは最大でU+0000からU+10FFFFの1,114,112個あり、単純にテーブル化すると約1MBになってしまいます。しかしプレーン4~13は未割当で定義も存在しません(この場合はデフォルトで"N"である(
まずはUAX #11で規定されている分類を列挙型として定義し、レコードヘルパでそれぞれに対応する文字幅を返すようにします。
次にEastAsianWidth.txtをテーブル化します。まずそれぞれのプレーンを格納するテーブルのレコード型と、このテーブルへのポインタと代表値をセットにしたレコード型を定義します。
あとはUnicodeのバージョンアップに簡単に追随できるようにするために、EastAsianWidth.txtから上記のテーブル部分を自動生成する処理を別ユニットに作っていきます。
まず読み込んだプレーン毎のデータを格納するレコード型と、関係するメソッド(初期化、値の指定、代表値だけでテーブルを省略可能かどうかの判定)を用意します。
このConvertEastAsianWidthを使ってEastAsianWidth.txtをEastAsianWidth.incとして変換したら、上記のTPlaneの配列部分を
これで前回のサンプルにチェックボックスを1つ追加して、
誰ですか、絵文字が混ざると意味がないじゃないか、とかいう人は!そう、絵文字がZWJ(ゼロ幅接合子)を使ってグリフを増やすようになったあたりから、実際にレンダリングしてみないとどのくらいの表示幅になるのかはわからなくなっているのです。
最終的なプロジェクト全体をGitHubに上げてあります。今後Unicodeのバージョンが上がっても、更新されたEastAsianWidth.txtを取り込むことで最新のものに準拠することができます。
参考: 東アジアの文字幅 - Wikipedia
UAX #11では既存の実装に配慮して、文字をその占める幅によって
- Fullwidth("F"/全角)
- Halfwidth ("H"/半角)
- Wide ("W"/広)
- Narrow ("Na"/狭)
- Ambiguous ("A"/曖昧)
- Neutral ("N"/中立)(Not East Asian)
では実際にどの文字(コードポイント)がどの分類になるのか、ですが、これはUnicodeデータベースの一部としてhttps://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txtにリストされています。基本的にこれを何らかの形で配列化しておいて参照すればいいのですが、Unicode(UCS4)で扱えるコードポイントは最大でU+0000からU+10FFFFの1,114,112個あり、単純にテーブル化すると約1MBになってしまいます。しかしプレーン4~13は未割当で定義も存在しません(この場合はデフォルトで"N"である(
All code points, assigned or unassigned, that are not listed explicitly are given the value "N".)と明記されています)。そこで今回はプレーン毎に分割して、フルマッピングするプレーンと1つの値で代表させるプレーン、という形で領域を節約した実装を考えてみます。
まずはUAX #11で規定されている分類を列挙型として定義し、レコードヘルパでそれぞれに対応する文字幅を返すようにします。
type
TEastAsianWidth = (Neutral, // N
Fullwidth, // F
Halfwidth, // H
Wide, // W
Narrow, // Na
Ambiguous); // A
TEastAsianWidthHelper = record helper for TEastAsianWidth
private
const
Width: array [Boolean,TEastAsianWidth] of Integer =
((1, // Neutral
2, // Fullwidth
1, // Halfwidth
2, // Wide
1, // Narrow
1), // Ambiguous (same as Neutral)
(1, // Neutral
2, // Fullwidth
1, // Halfwidth
2, // Wide
1, // Narrow
2)); // Ambiguous (same as Fullwidth)
private
class var
FEastAsian: Boolean;
public
function GetWidth: Integer; overload; inline;
class property EastAsian: Boolean read FEastAsian write FEastAsian;
end;
function TEastAsianWidthHelper.GetWidth: Integer;
begin
Result := Width[FEastAsian,Self];
end;
ここでクラスプロパティTEastAsianWidth.EastAsianは"A"の扱いを決めるもので、Trueなら東アジアの組版(フォントが日本語など)、Falseなら欧文の組版(フォントが欧文)であることを示します。次にEastAsianWidth.txtをテーブル化します。まずそれぞれのプレーンを格納するテーブルのレコード型と、このテーブルへのポインタと代表値をセットにしたレコード型を定義します。
type
TPlaneData = packed record
public
Data: array [0..65535] of Byte;
end;
PPlaneData = ^TPlaneData;
TPlane = record
PlaneDefault: Byte;
PlaneData: PPlaneData;
end;
このTPlaneの配列(0..16)を今回はEastAsianWidth.txtから生成しますが、とりあえず仮に
const
Plane0: TPlaneData = (Data: (
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
...
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00));
Plane0Default = $00;
Plane1Default = $00;
...
Plane16Default = $00;
Planes: array [0..16] of TPlane =
((PlaneDefault: Plane0Default; PlaneData: @Plane0),
(PlaneDefault: Plane1Default; PlaneData: nil),
...
(PlaneDefault: Plane16Default; PlaneData: nil));
こんな定数定義があるものとします。これを使用する形でレコードヘルパTEastAsianWidthHelperにクラスメソッドGetEastAsianWidthを追加します。
uses
System.SysUtils, System.RTLConsts;
type
TEastAsianWidthHelper = record helper for TEastAsianWidth
public
...
class function GetEastAsianWidth(C: UCS4Char): TEastAsianWidth; static;
end;
class function TEastAsianWidthHelper.GetEastAsianWidth(C: UCS4Char): TEastAsianWidth;
var
PlaneNum: Integer;
Plane: TPlane;
B: Byte;
begin
PlaneNum := (C shr 16) and $FFFF;
if (PlaneNum < Low(Planes)) and (PlaneNum > High(Planes)) then
begin
raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange);
end;
Plane := Planes[PlaneNum];
if Plane.PlaneData <> nil then
begin
B := Plane.PlaneData^.Data[C and $FFFF];
end
else
begin
B := Plane.PlaneDefault;
end;
Result := TEastAsianWidth(B);
end;
クラスメソッドGetEastAsianWidthでは、プレーン毎のテーブルがあればそこから、テーブルがなければ代表値を取得し、列挙型TEastAsianWidthとして返します。あとはUnicodeのバージョンアップに簡単に追随できるようにするために、EastAsianWidth.txtから上記のテーブル部分を自動生成する処理を別ユニットに作っていきます。
まず読み込んだプレーン毎のデータを格納するレコード型と、関係するメソッド(初期化、値の指定、代表値だけでテーブルを省略可能かどうかの判定)を用意します。
type
TPlaneData = record
Table: array [$0000..$FFFF] of Byte;
procedure Init;
procedure Fill(StartIndex: UInt16; EndIndex: UInt16; Data: Byte);
function IsAllSame: Boolean;
end;
procedure TPlaneData.Init;
var
I: Integer;
begin
for I := Low(Table) to High(Table) do
begin
Table[I] := 0; // 'Neutral'
end;
end;
procedure TPlaneData.Fill(StartIndex: UInt16; EndIndex: UInt16; Data: Byte);
var
I: Integer;
begin
for I := StartIndex to EndIndex do
begin
Table[I] := Data;
end;
end;
function TPlaneData.IsAllSame: Boolean;
var
I: Integer;
B: Byte;
begin
B := Table[Low(Table)];
for I := Low(Table) + 1 to High(Table) do
begin
if Table[I] <> B then
begin
Result := False;
Exit;
end;
end;
Result := True;
end;
これを使ってUCS4のコード範囲全体を扱うレコード型を用意します。
type
TEastAsianWidthProperties = record
Planes: array [0..16] of TPlaneData;
procedure Init;
end;
PEastAsianWidthProperties = ^TEastAsianWidthProperties;
procedure TEastAsianWidthProperties.Init;
var
I: Integer;
begin
for I := Low(Planes) to High(Planes) do
begin
Planes[I].Init;
end;
end;
あとはEastAsianWidth.txtを解析して値を格納し、テーブル化するメソッドを用意します。
uses
System.Classes, System.SysUtils, System.RegularExpressions, System.SysConst;
function SymbolToEastAsianWidth(const S: String): Byte;
const
EastAsianWidthSymbols: array [0..5] of String =
('N',
'F',
'H',
'W',
'Na',
'A');
begin
for Result := Low(EastAsianWidthSymbols) to High(EastAsianWidthSymbols) do
begin
if EastAsianWidthSymbols[Result] = S then
begin
Exit;
end;
end;
raise EConvertError.CreateRes(@SRangeError);
end;
procedure ConvertEastAsianWidth(Input, Output: TStrings);
var
PEAWP: PEastAsianWidthProperties;
RegEx1: TRegEx;
RegEx2: TRegEx;
Match: TMatch;
I: Integer;
S: String;
Position: Integer;
StartCodePoint: String;
EndCodePoint: String;
Name: String;
Plane: UInt16;
CPLow: UInt16;
CPLow2: UInt16;
PlaneDefault: Byte;
begin
New(PEAWP);
try
PEAWP^.Init;
RegEx1 := TRegEx.Create('([0-9A-Fa-f]{4,6})[.][.]([0-9A-Fa-f]{4,6})\s*[;]\s*(.{1,2})\s*');
RegEx2 := TRegEx.Create('([0-9A-Fa-f]{4,6})\s*[;]\s*(.{1,2})\s*');
for I := 0 to Input.Count - 1 do
begin
S := Input.Strings[I];
Position := Pos('#',S);
if Position > 0 then
begin
Delete(S,Position,Length(S));
end;
S := Trim(S);
if S = '' then
begin
Continue;
end;
Match := RegEx1.Match(S);
if Match.Success = True then
begin
StartCodePoint := Match.Groups[1].Value;
EndCodePoint := Match.Groups[2].Value;
Name := Match.Groups[3].Value;
end
else
begin
Match := RegEx2.Match(S);
if Match.Success = True then
begin
StartCodePoint := Match.Groups[1].Value;
EndCodePoint := StartCodePoint;
Name := Match.Groups[2].Value;
end;
end;
if Match.Success = True then
begin
Plane := (StrToInt64('$' + StartCodePoint) shr 16) and $FFFF;
if Plane <= 16 then
begin
CPLow := (StrToInt64('$' + StartCodePoint)) and $FFFF;
CPLow2 := (StrToInt64('$' + EndCodePoint)) and $FFFF;
PEAWP^.Planes[Plane].Fill(CPLow,CPLow2,Ord(SymbolToEastAsianWidth(Name)));
end;
end;
end;
for Plane := Low(PEAWP^.Planes) to High(PEAWP^.Planes) do
begin
Output.Add(Format(' { Plane%d }',[Plane]));
if PEAWP^.Planes[Plane].IsAllSame = False then
begin
Output.Add(Format(' Plane%d: TPlaneData = (Data: (',[Plane]));
S := '';
for I := Low(PEAWP^.Planes[Plane].Table) to High(PEAWP^.Planes[Plane].Table) do
begin
if (I mod 16) = 0 then
begin
S := ' ';
end;
S := S + Format('$%.02X,',[PEAWP^.Planes[Plane].Table[I]]);
if (I mod 16) = 15 then
begin
if I = High(PEAWP^.Planes[Plane].Table) then
begin
Delete(S,Length(S),1);
S := S + '));';
end
else
begin
S := S + ' ';
end;
S := S + Format(' // U+%.4X',[(Plane shl 16) or (I and $FFF0)]);
Output.Add(S);
S := '';
end;
end;
PlaneDefault := 0;
end
else
begin
PlaneDefault := PEAWP^.Planes[Plane].Table[0];
end;
Output.Add(Format(' Plane%dDefault = $%.2X;',[Plane,PlaneDefault]));
Output.Add('');
end;
Output.Add(' { Plane data table }');
Output.Add(' Planes: array [0..16] of TPlane =');
for Plane := Low(PEAWP^.Planes) to High(PEAWP^.Planes) do
begin
if PEAWP^.Planes[Plane].IsAllSame = True then
begin
S := Format(' (PlaneDefault: Plane%dDefault; PlaneData: nil),',[Plane]);
end
else
begin
S := Format(' (PlaneDefault: Plane%dDefault; PlaneData: @Plane%d),',[Plane,Plane]);
end;
if Plane = Low(PEAWP^.Planes) then
begin
S[5] := '(';
end
else if Plane = High(PEAWP^.Planes) then
begin
Delete(S,Length(S),1);
S := S + ');';
end;
Output.Add(S);
end;
finally
Dispose(PEAWP);
end;
end;
レコード型TEastAsianWidthPropertiesはサイズが大きく、デフォルトの設定ではスタックオーバフローするため、New/Disposeでヒープ上に確保するようにしています。読み込んだEastAsianWidth.txtの各行が
0000..001F ; N # Cc [32] <control-0000>..
0020 ; Na # Zs SPACE このようになっているものを、正規表現で複数指定、単独指定のどちらかのパターンにマッチングさせて、コードポイント(の範囲)と属性を取り込んでテーブルに格納し、最後にテーブルの内容をDelphiのコードの一部として出力しています。このConvertEastAsianWidthを使ってEastAsianWidth.txtをEastAsianWidth.incとして変換したら、上記のTPlaneの配列部分を
const
{$I 'EastAsianWidth.inc'}
と置き換えれば完成です。これで前回のサンプルにチェックボックスを1つ追加して、
procedure TForm1.Button2Click(Sender: TObject);
var
SkUnicode: ISkUnicode;
L: Integer;
TotalL: Integer;
W: Integer;
TotalW: Integer;
begin
TEastAsianWidth.EastAsian := CheckBox1.Checked;
SkLabel1.Words.Items[0].Caption := Edit1.Text;
Memo1.Lines.Clear;
SkLabel2.Words.Clear;
TotalL := 0;
TotalW := 0;
SkUnicode := TSkUnicode.Create;
for var S in SkUnicode.GetBreaks(Edit1.Text,TSkBreakType.Graphemes) do
begin
L := Length(S);
W := TEastAsianWidth.GetEastAsianWidth(Char.ConvertToUtf32(S,0)).GetWidth;
Memo1.Lines.Add(S + Format(' (L=%d,W=%d)',[L,W]));
SkLabel2.Words.Add(S + sLineBreak);
TotalL := TotalL + L;
TotalW := TotalW + W;
end;
Memo1.Lines.Add(Format('Total: L=%d, W=%d',[L,W]));
end;
こんな感じで全体の文字数を得ることができるようになります。チェックボックスのチェック状態で"á̂̃̄"のWが変化するのがわかりますね。誰ですか、絵文字が混ざると意味がないじゃないか、とかいう人は!そう、絵文字がZWJ(ゼロ幅接合子)を使ってグリフを増やすようになったあたりから、実際にレンダリングしてみないとどのくらいの表示幅になるのかはわからなくなっているのです。
最終的なプロジェクト全体をGitHubに上げてあります。今後Unicodeのバージョンが上がっても、更新されたEastAsianWidth.txtを取り込むことで最新のものに準拠することができます。
参考: 東アジアの文字幅 - Wikipedia
2023年12月25日
文字列を書記素クラスタで分割する
このアーティクルはDelphi Advent Calendar 2023の25日目の記事です(12日ぶり11回目)。
Unicodeの世界では、1つの"文字"(書記素、grapheme)が1つのコードポイント(code point)で表されるとは限りません。サロゲートペアとか結合文字とか絵文字とか、文字列に入っているものがどれくらいの"文字数"になっているのかを知るのは意外に難しい話です。
現在一般的と考えられる方法として、
ところがDelphi 12で標準サポートされたSkia4Delphiでは簡単に文字列を書記素クラスタで分割できるようになりました(ICUを取り込んでいるようです)。試しに正規表現(PCRE)による分割と比較してみましょう。
なおDelphi 11 Alexandriaおよびそれ以前のバージョンではSkia4Delphiをインストールする必要があります(現時点(2023/12)の最新は6.0.0)。
新規プロジェクトを作成し、フォーム(フォントサイズを大きめにしておくと結果が見やすくなります)にTEditを1つ、TButtonを2つ、結果表示のためのTMemoを1つ配置します。またプロジェクトツールウィンドウでプロジェクトを右クリック→Skiaを有効化を選択して、実行ファイルと同じ場所にsk4d.dllが配置されるようにします。
usesにSystem.Skiaを追加し、フォームのOnShowイベントで
正規表現による分割では絵文字のZWJ(ゼロ幅接合子)による結合はうまく処理できないようです。これはPCRE 8.45がだいぶ古いバージョンで、最新のUnicodeに対応できていないことが原因と考えられます。
次にSkia4Delphiです。
一方でSkia4Delphiによる分割は正しく処理できていますね。ちなみにWindowsでは国旗の絵文字は絵文字としてではなくRegional indicator symbol2文字での表現になるようです(サンプル最後の"🇯🇵"が"JP"となる)。Unicodeの世界では、1つの"文字"(書記素、grapheme)が1つのコードポイント(code point)で表されるとは限りません。サロゲートペアとか結合文字とか絵文字とか、文字列に入っているものがどれくらいの"文字数"になっているのかを知るのは意外に難しい話です。
現在一般的と考えられる方法として、
- ICU( International Components for Unicode、https://icu.unicode.org/)を使う
- 正規表現で"\X"でマッチする
- Unicodeの規格(Unicode Standard Annex #29)を元に自前で実装するr
ところがDelphi 12で標準サポートされたSkia4Delphiでは簡単に文字列を書記素クラスタで分割できるようになりました(ICUを取り込んでいるようです)。試しに正規表現(PCRE)による分割と比較してみましょう。
なおDelphi 11 Alexandriaおよびそれ以前のバージョンではSkia4Delphiをインストールする必要があります(現時点(2023/12)の最新は6.0.0)。
新規プロジェクトを作成し、フォーム(フォントサイズを大きめにしておくと結果が見やすくなります)にTEditを1つ、TButtonを2つ、結果表示のためのTMemoを1つ配置します。またプロジェクトツールウィンドウでプロジェクトを右クリック→Skiaを有効化を選択して、実行ファイルと同じ場所にsk4d.dllが配置されるようにします。
usesにSystem.Skiaを追加し、フォームのOnShowイベントで
procedure TForm1.FormShow(Sender: TObject);
begin
Edit1.Text := #$20BB7 + '野屋のコピペ' +
#$00E5 + #$00E1 + #$0302 + #$0303 + #$0304 +
#$1F62D +
#$1F937 + #$1F3FD + #$200D + #$2640 + #$FE0F +
#$1F468 + #$200D + #$1F469 + #$200D + #$1F467 + #$200D + #$1F466 +
#$1F469 + #$1F3FD + #$200D + #$1F4BB +
#$1F1EF + #$1F1F5;
end;
とEdit1.Textにサンプル文字列を設定し、Button1のOnClickイベントで
procedure TForm1.Button1Click(Sender: TObject);
begin
for var Match in TRegEx.Matches(Edit1.Text,'\X') do
begin
Memo1.Lines.Add(Match.Value);
end;
end;
Button2のOnClickイベントで
procedure TForm1.Button2Click(Sender: TObject);
var
SkUnicode: ISkUnicode;
begin
SkUnicode := TSkUnicode.Create;
for var S in SkUnicode.GetBreaks(Edit1.Text,TSkBreakType.Graphemes) do
begin
Memo1.Lines.Add(S);
end;
end;
とします。では実行してみましょう。まず正規表現です。𠮷
野
屋
の
コ
ピ
ペ
å
á̂̃̄
😭
🤷
🏽
♀️
👨
👩
👧
👦
👩
🏽
💻
🇯🇵
(Windows上の表示とは若干異なります)正規表現による分割では絵文字のZWJ(ゼロ幅接合子)による結合はうまく処理できないようです。これはPCRE 8.45がだいぶ古いバージョンで、最新のUnicodeに対応できていないことが原因と考えられます。
次にSkia4Delphiです。
𠮷
野
屋
の
コ
ピ
ペ
å
á̂̃̄
😭
🤷🏽♀️
👨👩👧👦
👩🏽💻
🇯🇵
書記素クラスタによる分割は文字列のレンダリングに必須なためSkia(Skia4Delphi)に実装されていると考えられますが、プログラムで書記素クラスタによる分割が必要になるのは(帳票などで)文字列がどのくらいの幅を占めるかを知りたいときではないでしょうか。そのためには書記素クラスタによる分割だけでなく、Unicode Standard Annex #11 East Asian Widthも必要になります。これはDelphi標準のSystem.CharacterユニットにもSkia4Delphiにも実装されておらず、EastAsianWidth.txtを取り込んで自前で実装する必要があります。これについては後日別のアーティクルで扱うことにします。
Skia4Delphを使って見やすくしたバージョンをGistに上げてあります。
2023年12月13日
TSqidsEncodingで文字列を難読化する
このアーティクルはDelphi Advent Calendar 2023の12日目の記事です(2日ぶり10回目)。
前回はDelphi 12 Athensで導入されたTSqidsEncodingを普通に使ってみましたが、TSqidsEncodingにはTArray<Integer>を扱うoverloadがあり、今回はそれを使って文字列を難読化してみます。
とはいっても、単にDelphiの文字列(UTF-16)の1文字を単純にUInt16(=Word)として扱うだけです。
前回はDelphi 12 Athensで導入されたTSqidsEncodingを普通に使ってみましたが、TSqidsEncodingにはTArray<Integer>を扱うoverloadがあり、今回はそれを使って文字列を難読化してみます。
とはいっても、単にDelphiの文字列(UTF-16)の1文字を単純にUInt16(=Word)として扱うだけです。
uses
..., System.NetEncoding.Sqids;
type
TSqidsEncodingHelper = class helper for TSqidsEncoding
public
function EncodeFromString(const AStr: String): String;
function DecodeToString(const AHash: String): String;
end;
function TSqidsEncodingHelper.EncodeFromString(const AStr: String): String;
var
Values: TArray;
I: Integer;
begin
SetLength(Values,Length(AStr));
for I := 0 to Length(AStr) - 1 do
begin
Values[I] := UInt16(AStr[I + 1]);
end;
Result := Encode(Values);
end;
function TSqidsEncodingHelper.DecodeToString(const AHash: String): String;
var
Values: TArray;
I: Integer;
begin
Values := Decode(AHash);
SetLength(Result,Length(Values));
for I := 0 to Length(Result) - 1 do
begin
Result[I + 1] := Char(Values[I]);
end;
end;
文字列の難読化としてXORやROT13などがよく使われますが、このほうがまだましな気がしますね。
2023年12月10日
TSqidsEncodingで数値と短縮IDを相互変換する
このアーティクルはDelphi Advent Calendar 2023の10日目の記事です(1年ぶり9回目)。
Delphi 12 Athensで数値と短縮IDを相互変換するSqidsを実装したTSqidsEncodingが追加されました。
Sqidsはあくまで難読化であって暗号化ではないので、内容を隠すことはできませんが、ID番号などをそのまま見せるよりはまし、というような場合に有効です。Sqidsの公式サイトでは、適しているケースとして
使用方法は簡単で、エンコードするには
またデコードはTArray<Integer>を返すもの(Decode)、Integerを返すもの(DecodeSingle/TryDecodeSingle)、Stringを返すもの(DecodeToStr)が用意されています。
さらにコンストラクタにエンコード用の文字列を渡すことで生成される文字列をカスタマイズすることもできます。
2023/12/22追記: 公式のblogにもSqidsの使いかたの記事が出ました。
Sqids: RAD Serverとの統合およびスタンドアロンライブラリ (en)
Delphi 12 Athensで数値と短縮IDを相互変換するSqidsを実装したTSqidsEncodingが追加されました。
Sqidsはあくまで難読化であって暗号化ではないので、内容を隠すことはできませんが、ID番号などをそのまま見せるよりはまし、というような場合に有効です。Sqidsの公式サイトでは、適しているケースとして
- 短縮リンク
- URLで安全に使用できる
- イベントID
- 衝突しないエンコード/デコード
- ワンタイムパスワード
- 短く問題のあるワードを含まない
- 機密データ
- 暗号化されるわけではない
- ユーザID
- デコードすることでユーザ数が漏洩する
使用方法は簡単で、エンコードするには
uses
..., System.NetEncoding.Sqids;
var
Sqids: TSqidsEncoding;
begin
Sqids := TSqidsEncoding.Create;
try
Edit2.Text := Sqids.Encode(Edit1.Text);
finally
Sqids.Free;
end;
end;
デコードするには
var
Sqids: TSqidsEncoding;
begin
Sqids := TSqidsEncoding.Create;
try
Edit3.Text := Sqids.DecodeToStr(Edit2.Text);
finally
Sqids.Free;
end;
end;
とするだけです。Sqidsのソースは数値ですが、エンコードではInreger、TArray<Integer>、Stringを受け取るoverloadが用意されています(Stringは単独またはカンマ区切りの数値表現)。またデコードはTArray<Integer>を返すもの(Decode)、Integerを返すもの(DecodeSingle/TryDecodeSingle)、Stringを返すもの(DecodeToStr)が用意されています。
さらにコンストラクタにエンコード用の文字列を渡すことで生成される文字列をカスタマイズすることもできます。
2023/12/22追記: 公式のblogにもSqidsの使いかたの記事が出ました。
Sqids: RAD Serverとの統合およびスタンドアロンライブラリ (en)
2023年12月1日
2023/12開催のセミナー
- Web Seminar
- 2023/12/19 17:00-17:45(JST) RAD Studio 12を掘り下げる - エンバカデロ・デベロッパーTV(2023年12月)
- Live Seminar
- Community Event
2023年11月15日
2023年11月9日
Firebirdロードマップ(2023/11)
Firebird 4.0.4がリリースされましたが、Firebirdのロードマップも更新されています。
Firebird: Roadmap
適当な要約
Firebird: Roadmap
適当な要約
- Firebird 2.0 - 2012年に開発終了。最新版は2012年04月の2.0.7。
- Firebird 2.1 - 2014年に開発終了。最新版は2014年12月の2.1.7。
- Firebird 2.5 - 2019年に開発終了。最新版は2019年06月の2.5.9。
- Firebird 3.0 - 安定版。最新版は2023年08月の3.0.11で、半年ごとの更新、次回(3.0.12)は2024年第2四半期内を予定。
- Firebird 4.0 - 安定版。最新版は2023年11月の4.0.4で、四半期ごとの更新、次回(4.0.5)は2024年第2四半期内を予定。
- Firebird 5.0 - 2021年05月に開発開始、2023年03月に最初のベータ版(5.0.0 Beta 1)をリリース。
2023年11月8日
RAD Studio/Delphi/C++Builder 12 Athensリリース
RAD Studio/Delphi/C++Builder 12 Athensがリリースされています。
RAD Studio 12 Athens ヘルプ (en)
リリース ノート (en)
インストール ノート (en)
新機能 (en)
New features and customer reported issues fixed in RAD Studio 12.0
Platform Status
ポータルサイトからダウンロード可能です
RAD Studio, Delphi, C++Builder 12.0 Web Install
RAD Studio, Delphi, C++Builder 12.0 Inline with Patch 1 Web Install
RAD Studio, Delphi, C++Builder 12.0 ISO
BDE for RAD Studio 12.0
Embarcadero General Packages Download for RAD Studio 12.0
『RAD Studio 12 Athens』の提供開始 (en)
Delphi/C++Builderライブラリに関する今後の展望 (en)
Android API 33サポートはRAD Studio 12ベータ(Yukon)で実施 (en)
Delphi言語: 文字列リテラルのモダナイゼーション (en)
Clang v15 compiler support coming to C++Builder 12
RAD Studio 12ベータ情報: マルチデバイスに対応したアイコンジェネレータ (en)
RAD Studio 12ベータ情報: 弱いエイリアスの導入による「NativeInt」の対応 (en)
RAD Studio 12のWin64 Clangツールチェーン (en)
[Yukon Beta Blog] C++ and Visual Assist in RAD Studio 12.0
Delphi 12における3 x 12 VCLの機能強化 (en)
Delphi 12における3 x 12 FireMonkeyとAndroidの機能強化 (en)
Delphi 12における3 x 12 データ、インターネット、RTLの機能強化 (en)
Delphi 12における 3 x 12 IDE、インストーラー、Delphi 言語の機能強化 (en)
Delphi 12向けに更新されたZXingデモアプリ(Android 13と iOS 17で動作済み)を公開 (en)
ウェビナーへ寄せられたRAD Studio 12 に関するQ&A (en)
Sqids: RAD Serverとの統合およびスタンドアロンライブラリ (en)
RAD Studio 12向けに新しいプレミアムスタイルを提供 (en)
Delphi / C++Builder 12のSkiaサポートで表現力豊かなUIを構築
GitHub - Embarcadero/RADStudio12Demos: Delphi and C++Builder Demos for Embarcadero RAD Studio version 12
2024/02/10追記: インストーラがPatch 1を含むものに差し替えられています。またBDEおよびEmbarcaderoが提供する主要なパッケージのローカルGetItパッケージもポータルサイトからダウンロードできるようになっています。
RAD Studio 12 Athens ヘルプ (en)
リリース ノート (en)
インストール ノート (en)
新機能 (en)
New features and customer reported issues fixed in RAD Studio 12.0
Platform Status
ポータルサイトからダウンロード可能です
RAD Studio, Delphi, C++Builder 12.0 Inline with Patch 1 Web Install
RAD Studio, Delphi, C++Builder 12.0 ISO
BDE for RAD Studio 12.0
Embarcadero General Packages Download for RAD Studio 12.0
『RAD Studio 12 Athens』の提供開始 (en)
Delphi/C++Builderライブラリに関する今後の展望 (en)
Android API 33サポートはRAD Studio 12ベータ(Yukon)で実施 (en)
Delphi言語: 文字列リテラルのモダナイゼーション (en)
Clang v15 compiler support coming to C++Builder 12
RAD Studio 12ベータ情報: マルチデバイスに対応したアイコンジェネレータ (en)
RAD Studio 12ベータ情報: 弱いエイリアスの導入による「NativeInt」の対応 (en)
RAD Studio 12のWin64 Clangツールチェーン (en)
[Yukon Beta Blog] C++ and Visual Assist in RAD Studio 12.0
Delphi 12における3 x 12 VCLの機能強化 (en)
Delphi 12における3 x 12 FireMonkeyとAndroidの機能強化 (en)
Delphi 12における3 x 12 データ、インターネット、RTLの機能強化 (en)
Delphi 12における 3 x 12 IDE、インストーラー、Delphi 言語の機能強化 (en)
Delphi 12向けに更新されたZXingデモアプリ(Android 13と iOS 17で動作済み)を公開 (en)
ウェビナーへ寄せられたRAD Studio 12 に関するQ&A (en)
Sqids: RAD Serverとの統合およびスタンドアロンライブラリ (en)
RAD Studio 12向けに新しいプレミアムスタイルを提供 (en)
Delphi / C++Builder 12のSkiaサポートで表現力豊かなUIを構築
GitHub - Embarcadero/RADStudio12Demos: Delphi and C++Builder Demos for Embarcadero RAD Studio version 12
2024/02/10追記: インストーラがPatch 1を含むものに差し替えられています。またBDEおよびEmbarcaderoが提供する主要なパッケージのローカルGetItパッケージもポータルサイトからダウンロードできるようになっています。
2023年11月1日
2023/11開催のセミナー
- Web Seminar
- 2023/11/13 16:00-17:00(JST) RAD Studio 12特集 - エンバカデロ・デベロッパーTV(2023年11月)
- Live Seminar
- Community Event
2023年10月19日
[書籍]C++ソフトウェア設計
紀伊國屋書店新宿本店でC++ Software Design (Amazon US)の翻訳である
C++ソフトウェア設計 (Amazon)/Klaus Iglberger著/千住治郎訳/オライリー・ジャパン/ISBN 978-4-8144-0045-4/4,400円
を購入。
C++ソフトウェア設計 (Amazon)/Klaus Iglberger著/千住治郎訳/オライリー・ジャパン/ISBN 978-4-8144-0045-4/4,400円
を購入。
2023年10月17日
InterBase 2020 Update 5
InterBase 2020 Update 5がリリースされています。バージョンは14.5.0.864となっています。
InterBase 2020 Update 5 リリースノート - InterBase (en)
InterBase 2020 Update 5 の新機能 - InterBase (en)
Resolved Defects - InterBase
Embarcadero InterBase 2020 Update 5 のリリース (en)
InterBase 2020 Update 5 リリースノート - InterBase (en)
InterBase 2020 Update 5 の新機能 - InterBase (en)
Resolved Defects - InterBase
Embarcadero InterBase 2020 Update 5 のリリース (en)
2023年10月11日
2023年10月2日
2023年10月1日
2023/10開催のセミナー
- Web Seminar
- 2023/10/31 17:00-17:45(JST) Web API再入門!RAD Serverを使おう - エンバカデロ・デベロッパーTV(2023年10月)
- Live Seminar
- Community Event
2023年9月13日
2023年9月4日
[書籍]ルールズ・オブ・プログラミング
紀伊國屋書店新宿本店でThe Rules of Programming (Amazon US)の翻訳である
ルールズ・オブ・プログラミング (Amazon)/Chris Zimmerman著/久富木隆一訳/オライリー・ジャパン/ISBN 978-4-8144-0041-6/3,080円
を購入。
ルールズ・オブ・プログラミング (Amazon)/Chris Zimmerman著/久富木隆一訳/オライリー・ジャパン/ISBN 978-4-8144-0041-6/3,080円
を購入。
2023年9月1日
2023/09開催のセミナー
- Web Seminar
- 2023/09/26 17:00-17:45(JST) Delphiモバイル開発ファーストステップ Part 5 「パーミッション編」- エンバカデロ・デベロッパーTV(2023年9月)
- Live Seminar
- Community Event
2023年8月21日
[書籍]改訂第3版Windowsコマンドプロンプトポケットリファレンス[上][下]
紀伊國屋書店 新宿本店でWindowsコマンドプロンプトポケットリファレンス、[改訂新版]Windowsコマンドプロンプトポケットリファレンスの三訂版である
[改訂第3版]Windowsコマンドプロンプトポケットリファレンス[上] (Amazon)/山近慶一著/技術評論社/ISBN 978-4-297-13723-6/3,520円
[改訂第3版]Windowsコマンドプロンプトポケットリファレンス[下] (Amazon)/山近慶一著/技術評論社/ISBN 978-4-297-13725-0/3,520円
を購入。
[改訂第3版]Windowsコマンドプロンプトポケットリファレンス[上] (Amazon)/山近慶一著/技術評論社/ISBN 978-4-297-13723-6/3,520円
[改訂第3版]Windowsコマンドプロンプトポケットリファレンス[下] (Amazon)/山近慶一著/技術評論社/ISBN 978-4-297-13725-0/3,520円
を購入。
2023年8月9日
2023年8月5日
Firebird 4.0.3/3.0.11
Firebird 4.0.3および3.0.11がリリースされています。
Firebird: Firebird 4.0.3
Firebird 4.0.3 Release Notes (PDF)
Firebird: Firebird 3.0.11
Firebird 3.0.11 Release Notes (PDF)
Firebird: Firebird 4.0.3
Firebird 4.0.3 Release Notes (PDF)
Firebird: Firebird 3.0.11
Firebird 3.0.11 Release Notes (PDF)
2023年8月1日
2023/08開催のセミナー
- Web Seminar
- 2023/08/29 17:00-17:45(JST) Delphiモバイル開発ファーストステップ Part 4 「実践編」- エンバカデロ・デベロッパーTV(2023年8月)
- Live Seminar
- Community Event
2023年7月28日
[書籍]Code Better in Delphi
Amazon(JP)で注文した
Code Better in Delphi (Amazon US, Amazon JP)/Alister Christie著/ISBN 979-8832851082/6,236JPY(printed)
が配送されてきました。2023/07/26に注文して2日目の到着でした(日本国内でのプリントオンデマンドなのかな?でした)。
Code Better in Delphi (Amazon US, Amazon JP)/Alister Christie著/ISBN 979-8832851082/6,236JPY(printed)
が配送されてきました。2023/07/26に注文して2日目の到着でした(日本国内でのプリントオンデマンド
2023年7月12日
2023年7月10日
[書籍]オブジェクト設計スタイルガイド
紀伊國屋書店新宿本店でObject Design Style Guide (Amazon US)の翻訳である
オブジェクト設計スタイルガイド (Amazon)/Matthias Noback著/田中裕一訳/オライリー・ジャパン/ISBN 978-4-8144-0033-1/3,520円
を購入。
オブジェクト設計スタイルガイド (Amazon)/Matthias Noback著/田中裕一訳/オライリー・ジャパン/ISBN 978-4-8144-0033-1/3,520円
を購入。
2023年7月1日
2023/07開催のセミナー
- Web Seminar
- 2023/07/25 17:00-17:45(JST) 「Delphiモバイル開発ファーストステップ Part 3 - コンポーネントを機能させる」- エンバカデロ・デベロッパーTV(2023年7月)
- Live Seminar
- Community Event
2023年6月14日
2023年6月12日
2023年6月1日
2023/06開催のセミナー
- Web Seminar
- 2023/06/08 16:00-16:45(JST) Webセミナー「データ分析が必要!その時どうする?開発者のためのBIツール活用入門」
- 2023/06/27 17:00-17:45(JST) 「Delphi / C++Builder マイグレーションの新常識」 - エンバカデロ・デベロッパーTV(2023年6月)
- Live Seminar
- Community Event
2023年5月10日
2023年5月1日
2023/05開催のセミナー
- Web Seminar
- 2023/05/30 17:00-17:45(JST) 「Delphiモバイル開発 UI設計ファーストステップ」- エンバカデロ・デベロッパーTV(2023年5月)
- Live Seminar
- Community Event
2023年4月14日
2023年4月12日
RAD Studio/Delphi/C++Builder 11.3 Alexandria Patch 1
RAD Studio/Delphi/C++Builder 11.3 AlexandriaのPatch 1がリリースされています。REST関係とデバッガなどの不具合修正が含まれています。現時点(2023/04/12)ではGetItからのみGetItまたはポータルサイトからダウンロード、インストールすることができます。
RAD Studio 11.3 Patch 1
またローカルヘルプファイルも更新されているとのことです。こちらはRAD Studio Product Documentationで言語を選択してOffline CHM Help/Offline Libraries CHM Helpをダウンロードし、展開したファイルをインストール先に上書きすればよいようですできますが、単純に上書きすることはできないようです。
RAD Studio 11.3 Alexandria Patch 1 のリリース (en)
2023/04/27追記: Patch 1を含む更新されたRAD Studio 11.3のインストーラが公開されています。
RAD Studio 11.3 Patch 1
またローカルヘルプファイルも更新されているとのことです。こちらはRAD Studio Product Documentationで言語を選択してOffline CHM Help/Offline Libraries CHM Helpをダウンロード
RAD Studio 11.3 Alexandria Patch 1 のリリース (en)
2023/04/27追記: Patch 1を含む更新されたRAD Studio 11.3のインストーラが公開されています。
2023年4月1日
2023/04開催のセミナー
- Web Seminar
- 2023/04/25 17:00-17:45(JST) 「Delphiモバイル開発ファーストステップ」- エンバカデロ・デベロッパーTV(2023年4月)
- Live Seminar
- Community Event
2023年3月28日
Firebirdロードマップ(2023/03)
Firebird 5.0 Beta 1がリリースされましたが、Firebirdのロードマップも更新されています。
Firebird: Roadmap
適当な要約
Firebird: Roadmap
適当な要約
- Firebird 2.0 - 2012年に開発終了。最新版は2012年04月の2.0.7。
- Firebird 2.1 - 2014年に開発終了。最新版は2014年12月の2.1.7。
- Firebird 2.5 - 2019年に開発終了。最新版は2019年06月の2.5.9。
- Firebird 3.0 - 安定版。最新版は2022年06月の3.0.10で、半年ごとの更新、次回(3.0.11)は2023年第1四半期内を予定。
- Firebird 4.0 - 安定版。最新版は2022年08月の4.0.2で、四半期ごとの更新、次回(4.0.3)は2023年第1四半期内を予定。
- Firebird 5.0 - 2021年05月に開発開始、2023年03月に最初のベータ版(5.0.0 Beta 1)をリリース。
2023年3月15日
2023年3月9日
2023年3月1日
2023/03開催のセミナー
- Web Seminar
- 2023/03/01 01:00-02:00(JST) See What's New in RAD Studio 11.3 Alexandria
- 2023/03/10 01:00-02:00(JST) Q&A Round Table: RAD Studio 11.3 Release
- 2023/03/28 17:00-17:45(JST) 「RAD Studio 11.3 深堀情報!今月はLANSA TV同時配信で」- エンバカデロ・デベロッパーTV(2023年3月)
- Live Seminar
- Community Event
2023年2月28日
RAD Studio/Delphi/C++Builder 11 Alexandria Release 3 (11.3)
RAD Studio/Delphi/C++Builder 11 AlexandriaのRelease 3 (11.3)がリリースされています。インストールには有効なUpdate Subscriptionが必要です。Registered Products Portalからダウンロードできます。
RAD Studio, Delphi, C++Builder 11.3 ISO
RAD Studio, Delphi, C++Builder 11.3 Web Install
RAD Studio, Delphi, C++Builder 11.3 ISO (inline)
RAD Studio, Delphi, C++Builder 11.3 Web Install (Inline)
RAD Studio, Delphi, C++Builder 11.3 ISO (2024 rebuild)
RAD Studio, Delphi, C++Builder 11.3 Web Install (2024 rebuild)
11 Alexandria - Release 3
New features and customer reported issues fixed in RAD Studio 11.3
List of publicly reported bugs fixed in 11.3
RAD Studio 11.3 Alexandria リリースのお知らせ (en)
RAD Studio 11.3へアップデートを行う際のご注意
11.3の新機能: TControlListコントロールで複数アイテムが選択可能に! (en)
RAD Studio 11.3 新機能ウェビナー(日本語吹替版)Part 1 - YouTube
RAD Studio 11.3 新機能ウェビナー(日本語吹替版)Part 2 - YouTube
RAD Studio 11.3 新機能ウェビナー(日本語吹替版)Part 3 - YouTube
2023/04/27追記: インストーラがPatch 1を含むものに差し替えられました。
新しいRAD Studio 11.3 Inline Buildのご案内 (en)
2024/02/21追記: GetItサーバの更新に伴ってインストーラが更新されました。
GetItアップデート: RAD Studio 11のGetItオンラインインストール、DelphiおよびC++Builder Community Editionが利用可能に! (en)
RAD Studio, Delphi, C++Builder 11.3 Web Install (2024 rebuild)
11 Alexandria - Release 3
New features and customer reported issues fixed in RAD Studio 11.3
List of publicly reported bugs fixed in 11.3
RAD Studio 11.3 Alexandria リリースのお知らせ (en)
RAD Studio 11.3へアップデートを行う際のご注意
11.3の新機能: TControlListコントロールで複数アイテムが選択可能に! (en)
RAD Studio 11.3 新機能ウェビナー(日本語吹替版)Part 1 - YouTube
RAD Studio 11.3 新機能ウェビナー(日本語吹替版)Part 2 - YouTube
RAD Studio 11.3 新機能ウェビナー(日本語吹替版)Part 3 - YouTube
2023/04/27追記: インストーラがPatch 1を含むものに差し替えられました。
新しいRAD Studio 11.3 Inline Buildのご案内 (en)
2024/02/21追記: GetItサーバの更新に伴ってインストーラが更新されました。
GetItアップデート: RAD Studio 11のGetItオンラインインストール、DelphiおよびC++Builder Community Editionが利用可能に! (en)
2023年2月27日
[書籍]データベース速攻入門
紀伊國屋書店新宿本店で
データベース速攻入門 (Amazon)/堀内康夫、徳尾秀敬、とみたまさひろ、株式会社リブセンス、村田太、成田優隆、福本誠、大津桜子、藤本正比古、廣山豊、吉村守、杉江伸祐、杉山ジョージ、中村昌登著/技術評論社/ISBN 978-4-297-13362-7/2,420円
を購入。
データベース速攻入門 (Amazon)/堀内康夫、徳尾秀敬、とみたまさひろ、株式会社リブセンス、村田太、成田優隆、福本誠、大津桜子、藤本正比古、廣山豊、吉村守、杉江伸祐、杉山ジョージ、中村昌登著/技術評論社/ISBN 978-4-297-13362-7/2,420円
を購入。
[書籍]プログラマー脳
紀伊國屋書店新宿本店でThe Programmer's Brain (Amazon US)の翻訳である
プログラマー脳 (Amazon)/Felienne Hermans著/水野貴明訳/水野いずみ監訳/秀和システム/ISBN 9784798068534/3,300円
を購入。
プログラマー脳 (Amazon)/Felienne Hermans著/水野貴明訳/水野いずみ監訳/秀和システム/ISBN 9784798068534/3,300円
を購入。
2023年2月15日
2023年2月13日
[書籍]C#クックブック
紀伊國屋書店新宿本店でC# Cookbook (Amazon US)の翻訳である
C#クックブック (Amazon)/ Joe Mayo著/鈴木幸敏訳/オライリー・ジャパン/ISBN 978-4-8144-0018-8/3,960円
を購入。
C#クックブック (Amazon)/ Joe Mayo著/鈴木幸敏訳/オライリー・ジャパン/ISBN 978-4-8144-0018-8/3,960円
を購入。
2023年2月1日
[書籍]Good Code, Bad Code
紀伊國屋書店新宿本店でGood Code, Bad Code (Amazon US)の翻訳である
Good Code, Bad Code (Amazon)/Tom Long著/秋勇紀、高田新山訳/山本大祐監訳/秀和システム/ISBN 9784798068169/3,960円
を購入。
Good Code, Bad Code (Amazon)/Tom Long著/秋勇紀、高田新山訳/山本大祐監訳/秀和システム/ISBN 9784798068169/3,960円
を購入。
2023/02開催のセミナー
- Web Seminar
- 2023/02/14 08:50-16:00(CST) DelphiCon 2023 Day 1
- 2023/02/15 08:50-17:00(CST) DelphiCon 2023 Day 2
- 2023/02/16 08:50-16:00(CST) DelphiCon 2023 Day 3
- 2023/02/28 17:00-17:45(JST) 「Delphi 28回目のバースディ」 - エンバカデロ・デベロッパーTV(2023年2月)
- Live Seminar
- Community Event
2023年1月29日
[書籍][ebook]プログラマーのためのCPU入門
ラムダノートで
プログラマーのためのCPU入門 (Amazon)/Takenobu Tani著/ラムダノート/ISBN 978-4-908686-16-0/3,740円(紙書籍+電子書籍(PDF))、3,520円(電子書籍(PDF)のみ)
を購入して、書籍版が配送されてきました。
プログラマーのためのCPU入門 (Amazon)/Takenobu Tani著/ラムダノート/ISBN 978-4-908686-16-0/3,740円(紙書籍+電子書籍(PDF))、3,520円(電子書籍(PDF)のみ)
を購入して、書籍版が配送されてきました。
2023年1月11日
2023年1月1日
2023/01開催のセミナー
- Web Seminar
- 2023/01/31 17:00-17:45(JST) 「Delphiの関数構文を極めよう」 - エンバカデロ・デベロッパーTV(2023年1月)
- Live Seminar
- Community Event
2022年12月22日
ユーザを偽装してSYSTEMサービスからネットワークリソースにアクセスする
このアーティクルはDelphi Advent Calendar 2022の22日目の記事です(20日ぶり8回目)。
以前WNetAddConnection2を使って他のPCのネットワーク共有にアクセスする方法について書きましたが、これをサービスから実行するとWNetAddConnection2が時々エラー1312(ERROR_NO_SUCH_LOGON_SESSION)になる、という現象が発生します。調べてみたところ、サービスの場合はSystemではなくNetworkServiceで動作していないとこのような状態になるようです(常にエラーになるわけではなく、成功したりエラーになったりという感じ)。もちろんサービスをNetworkServiceで実行すればネットワークアクセスでエラーになることはないのですが、ローカルコンピュータに対するアクセスがUsersグループ相当に制限されてしまいます(サービスで使用する(Local)System/LocalService/NetworkServiceアカウントについてはWindowsテクニカルドキュメント(旧MSDN)のService User Accounts、LocalService Account、NetworkService Account、LocalSystem Accountや@ITのWindowsのサービスで使用される「System」「Local Service」「Network Service」アカウントとは?:Tech TIPSを参照)。
そこでSystemアカウントで動作するサービスから実行することを前提に、ネットワークリソースにアクセスするときだけNetworkServiceアカウントに偽装するようにしてみます。
まずLogonUserでNetworkServiceとしてログインし、返されたトークンハンドルでImpersonateLoggedOnUserを呼び出すことでユーザを偽装します。
切断するときはまずWNetCancelConnection2を呼び出した後で、RevertToSelfで偽装を解除し、CloseHandleでトークンハンドルをクローズすることでログオフします。
以前WNetAddConnection2を使って他のPCのネットワーク共有にアクセスする方法について書きましたが、これをサービスから実行するとWNetAddConnection2が時々エラー1312(ERROR_NO_SUCH_LOGON_SESSION)になる、という現象が発生します。調べてみたところ、サービスの場合はSystemではなくNetworkServiceで動作していないとこのような状態になるようです(常にエラーになるわけではなく、成功したりエラーになったりという感じ)。もちろんサービスをNetworkServiceで実行すればネットワークアクセスでエラーになることはないのですが、ローカルコンピュータに対するアクセスがUsersグループ相当に制限されてしまいます(サービスで使用する(Local)System/LocalService/NetworkServiceアカウントについてはWindowsテクニカルドキュメント(旧MSDN)のService User Accounts、LocalService Account、NetworkService Account、LocalSystem Accountや@ITのWindowsのサービスで使用される「System」「Local Service」「Network Service」アカウントとは?:Tech TIPSを参照)。
そこでSystemアカウントで動作するサービスから実行することを前提に、ネットワークリソースにアクセスするときだけNetworkServiceアカウントに偽装するようにしてみます。
まずLogonUserでNetworkServiceとしてログインし、返されたトークンハンドルでImpersonateLoggedOnUserを呼び出すことでユーザを偽装します。
const
LOGON32_LOGON_NEW_CREDENTIALS = 9;
{$EXTERNALSYM LOGON32_LOGON_NEW_CREDENTIALS}
var
LogonUserUser: String;
LogonUserDomain: String;
LogonUserLogonType: DWORD;
LogonUserLogonProvider: DWORD;
hToken: THandle;
begin
{ Logon as 'NetworkService' user }
LogonUserUser := 'NetworkService';
LogonUserDomain := 'NT AUTHORITY';
LogonUserLogonType := LOGON32_LOGON_NEW_CREDENTIALS;
LogonUserLogonProvider := LOGON32_PROVIDER_DEFAULT;
if LogonUser(PChar(LogonUserUser),PChar(LogonUserDomain),nil,
LogonUserLogonType,LogonUserLogonProvider,hToken) = False then
begin
RaiseLastOSError;
end;
{ Impersonate }
if ImpersonateLoggedOnUser(hToken) = False then
begin
RaiseLastOSError;
end;
これでこの後WNetAddConnection2で接続を試みるときにSystemアカウントではなくNetworkServiceアカウントであるかのように扱われます。切断するときはまずWNetCancelConnection2を呼び出した後で、RevertToSelfで偽装を解除し、CloseHandleでトークンハンドルをクローズすることでログオフします。
{ Revert impersonation }
if RevertToSelf() = False then
begin
RaiseLastOSError;
end;
{ Loggoff }
CloseHandle(hToken);
hToken := INVALID_HANDLE_VALUE;
なおプロセス上で複数のスレッドが動作している場合(特にサービス)など、同一の共有リソース('\\<computername>\<sharename>')に対してWNetAddConnection2をネストして呼び出すとERROR_ALREADY_ASSIGNEDでエラーになります。これを防ぐには同一の共有リソースに対してWNetAddConnection2/WNetCancelConnection2が1回ずつ呼び出されるように、接続している共有リソースをプロセス全体で適切に管理する必要もあります。
2022年12月14日
2022年12月5日
2022年12月2日
InterBase 2020 Update 4
InterBase 2020 Update 4がリリースされています。バージョンは14.4.0.804となっています。
InterBase 2020U4 リリースノート - InterBase (en)
InterBase 2020 Update 4 の新機能 - InterBase (en)
Resolved Defects - InterBase (en)
Embarcadero InterBase 2020 Update 4 のリリース (en)
InterBase 2020U4 リリースノート - InterBase (en)
InterBase 2020 Update 4 の新機能 - InterBase (en)
Resolved Defects - InterBase (en)
Embarcadero InterBase 2020 Update 4 のリリース (en)
レコード型のフィールドのオフセットを取得する
このアーティクルはDelphi Advent Calendar 2022の2日目の記事です(3年ぶり7回目)。
Delphiのレコード型(Cの構造体に相当)は、スタックに配置することができるということ以外にも、特定のメモリレイアウトを定義することができることから、固定長ファイルや指定されたメモリ上のデータを解釈するために使われることがあります。このような場合に、定義したレコード型の特定のフィールドのオフセットが(主にデバッグ用に)欲しくなったりするのですが、Delphiには(
delphi - Get Position of a struct var AKA Offset of record field - Stack Overflow
Delphi: Offset of record field - Stack Overflow
ではちょっと試してみましょう。まずレコード型とそのポインタ型を定義します。
しかし最初に書いたように、特定の(外部で規定された)メモリレイアウトに簡単にアクセスできるようにするためにレコード型を使用する、という目的を考えると、レコード型には
逆アセンブルを見ると、コンパイラは各メンバのオフセットを知ってて
ところで、
このようなことから、レコード型を使用するときは、
なお
Delphiのレコード型(Cの構造体に相当)は、スタックに配置することができるということ以外にも、特定のメモリレイアウトを定義することができることから、固定長ファイルや指定されたメモリ上のデータを解釈するために使われることがあります。このような場合に、定義したレコード型の特定のフィールドのオフセットが(主にデバッグ用に)欲しくなったりするのですが、Delphiには(
SizeOfはあるのに)C/C++のoffsetofマクロ(stddef.h)のようなものが存在しません(RSP-39559)。そこで軽く検索してみたところStack Overflowにそのものずばりな投稿がありました。delphi - Get Position of a struct var AKA Offset of record field - Stack Overflow
Delphi: Offset of record field - Stack Overflow
ではちょっと試してみましょう。まずレコード型とそのポインタ型を定義します。
type
TFoo1 = record
Bar: Boolean;
Baz: Double;
Qux: array [0..8] of Byte;
Quux: Integer;
end;
PFoo1 = ^TFoo1;
これでprocedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(Format('TFoo1: SizeOf=%d',[SizeOf(TFoo1)]));
Memo1.Lines.Add(Format('TFoo1.Bar: offset=%d',[NativeUInt(@(PFoo1(nil)^.Bar))]));
Memo1.Lines.Add(Format('TFoo1.Baz: offset=%d',[NativeUInt(@(PFoo1(nil)^.Baz))]));
Memo1.Lines.Add(Format('TFoo1.Qux: offset=%d',[NativeUInt(@(PFoo1(nil)^.Qux))]));
Memo1.Lines.Add(Format('TFoo1.Quux: offset=%d',[NativeUInt(@(PFoo1(nil)^.Quux))]));
end;
のように、nilをレコード型へのポインタにキャスト→フィールドを参照→そのアドレスを取得→整数に変換とすることで、そのフィールドのオフセット値を取得できます(アドレスと同じサイズの符号なし整数はNativeUInt型)。では実行してみましょう。TFoo1: SizeOf=32
TFoo1.Bar: offset=0
TFoo1.Baz: offset=8
TFoo1.Qux: offset=16
TFoo1.Quux: offset=28
Delphiのレコード型のデフォルトのアライメントマスクに従って配置されていることがわかります(TFoo1.QuuxのオフセットがDelphiのデフォルトのフィールドのアライメント(構造体アライメント)の8バイトに従った32ではなく、型(Integer)のサイズである4バイトで28になっていることに注意)。しかし最初に書いたように、特定の(外部で規定された)メモリレイアウトに簡単にアクセスできるようにするためにレコード型を使用する、という目的を考えると、レコード型には
packedを指定して、明示的にパディングするような場合が多いと思われます。ではレコード型をpacked recordにしてみましょう。type
TFoo2 = packed record
Bar: Boolean;
Baz: Double;
Qux: array [0..8] of Byte;
Quux: Integer;
end;
PFoo2 = ^TFoo2;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Add(Format('TFoo2: SizeOf=%d',[SizeOf(TFoo2)]));
Memo1.Lines.Add(Format('TFoo2.Bar: offset=%d',[NativeUInt(@(PFoo2(nil)^.Bar))]));
Memo1.Lines.Add(Format('TFoo2.Baz: offset=%d',[NativeUInt(@(PFoo2(nil)^.Baz))]));
Memo1.Lines.Add(Format('TFoo2.Qux: offset=%d',[NativeUInt(@(PFoo2(nil)^.Qux))]));
Memo1.Lines.Add(Format('TFoo2.Quux: offset=%d',[NativeUInt(@(PFoo2(nil)^.Quux))]));
end;
実行してみます。TFoo2: SizeOf=22
TFoo2.Bar: offset=0
TFoo2.Baz: offset=1
TFoo2.Qux: offset=9
TFoo2.Quux: offset=18
意図通り、すべてのフィールドがパディングされることなく並んでいることがわかります。逆アセンブルを見ると、コンパイラは各メンバのオフセットを知ってて
nil(=0)に加算しているので、最初からこれをもらう方法があれば…とは思います。また上記のStack Overflowの2番目の投稿にはRTTIを使った方法も紹介されていますが、RTTIのテーブルでループを回しながら文字列の比較をする必要があるため、それに比べればnilを使った方法のほうが優れていると考えられます。ところで、
packedを指定せずデフォルトのアライメントマスクに従って配置された場合、順序型はそのサイズでアライメントされる、との記述があります。つまりtype
TFoo3 = record
Bar: array [0..8] of Byte;
Baz: Boolean;
Qux: array [0..8] of Byte;
end;
PFoo3 = ^TFoo3;
のように1バイトアライメントされている配列のフィールドの次に1バイトの順序型のフィールドがあると、デフォルトのアライメントの8バイトに従ったパディングが行われることなく、連続した配置になる、ということになります(逆も同じ)。procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Lines.Add(Format('TFoo3: SizeOf=%d',[SizeOf(TFoo3)]));
Memo1.Lines.Add(Format('TFoo3.Bar: offset=%d',[NativeUInt(@(PFoo3(nil)^.Bar))]));
Memo1.Lines.Add(Format('TFoo3.Baz: offset=%d',[NativeUInt(@(PFoo3(nil)^.Baz))]));
Memo1.Lines.Add(Format('TFoo3.Qux: offset=%d',[NativeUInt(@(PFoo3(nil)^.Qux))]));
end;
実行してみると、TFoo3: SizeOf=19
TFoo3.Bar: offset=0
TFoo3.Baz: offset=9
TFoo3.Qux: offset=10
と、確かにその通りになっています。またDelphi 2007までは型仕様が共通のフィールド(A, B: Extended;のように複数のフィールドが","で並べられて同じ型が指定されているフィールド)は暗黙にpackedとなる、という仕様も存在していました(いま知りました)。このようなことから、レコード型を使用するときは、
packedを指定せず完全にコンパイラにお任せにして特定のメモリレイアウトを必要としないようにするか、packedを指定してパディングも明示的に配置して特定のメモリレイアウトになるようにコーディングするか、どちらかにするべきだと考えられます(この結論そのものは当たり前すぎるものですが)。なお
packedを指定してメモリレイアウトを完全に自分で制御する場合など、定義したレコード型が正しいサイズになっているかどうかは{$IF SizeOf(TFoo2) <> 22}
{$MESSAGE ERROR 'SizeOf(TFoo2) is not 22 bytes.'}
{$IFEND}
のようにコンパイル時にチェックすることができます(Delphi 11.2 Alexandriaだとこれを書いた瞬間にLSPで判定が行われるため、{$MESSAGE}の行がエラー表示になるか淡色表示になるかでわかりますが)。
2022年12月1日
2022/12開催のセミナー
- Web Seminar
- 2022/12/27 17:00-17:45(JST) 「年末年始はプログラミングの基礎技術を高めよう!Delphiのストリームを使う」 - エンバカデロ・デベロッパーTV(2022年12月)
- Live Seminar
- Community Event
2022年11月9日
2022年11月1日
2022/11開催のセミナー
- Web Seminar
- 2022/11/29 17:00-17:45(JST) 「新オフィスから生中継!アイデラグループ3社の活動に迫る」 - エンバカデロ・デベロッパーTV(2022年11月)
- Live Seminar
- Community Event
2022年10月17日
2022年10月12日
2022年10月5日
RAD Studio/Delphi/C++Builder 11.2 Alexandria Patch 1
RAD Studio/Delphi/C++Builder 11.2 AlexandriaのPatch 1がリリースされています。iOSシミュレータおよびカメラコンポーネント、バルーンヘルプコンポーネントなどの不具合の修正が含まれています。またWindows x64のライブラリパスが正しくない問題についても対応策が示されています。GetItまたはポータルサイトからダウンロード、インストールすることができます。
RAD Studio 11.2 Patch 1
RAD Studio 11.1 Alexandria Patch 1 のリリース (en)
RAD Studio 11.2 Patch 1
RAD Studio 11.1 Alexandria Patch 1 のリリース (en)
2022年10月1日
2022/10開催のセミナー
- Web Seminar
- 2022/10/20 17:00-17:45(JST) 「10月の配信は20日(木)!キーコンポーネントの使い方を極めよう」 - エンバカデロ・デベロッパーTV(2022年10月)
- Live Seminar
- Community Event
2022年9月14日
2022年9月8日
RAD Studio/Delphi/C++Builder 11 Alexandria Release 2 (11.2)
RAD Studio/Delphi/C++Builder 11 AlexandriaのRelease 2 (11.2)がリリースされています。インストールには有効なUpdate Subscriptionが必要です。Registered Products Portalからダウンロードできます。
RAD Studio, Delphi, C++Builder 11.2 ISO
RAD Studio, Delphi, C++Builder 11.2 Web Install
11 Alexandria - Release 2 (en)
New features and customer reported issues fixed in RAD Studio 11.2
List of publicly reported bugs fixed in 11.2
RAD Studio 11.2 製品機能一覧
RAD Studio 11.2 Alexandria リリースのお知らせ (en)
RAD Studioの次期アップデートでサポート予定のDelphi iOS Simulatorについて (en)
RAD Studio New Release: What’s Coming in 11.2
RAD Studio 11.2の新機能プレビュー:MarkdownのサポートとHelpInsightの改善 (en)
Coming in 11.2: the Little Things that make Big Quality
RAD Studio 11.2向けのEmbarcadero GetItパッケージダウンロード (en)
RAD Studio, Delphi, C++Builder 11.2 ISO
RAD Studio, Delphi, C++Builder 11.2 Web Install
11 Alexandria - Release 2 (en)
New features and customer reported issues fixed in RAD Studio 11.2
List of publicly reported bugs fixed in 11.2
RAD Studio 11.2 製品機能一覧
RAD Studio 11.2 Alexandria リリースのお知らせ (en)
RAD Studioの次期アップデートでサポート予定のDelphi iOS Simulatorについて (en)
RAD Studio New Release: What’s Coming in 11.2
RAD Studio 11.2の新機能プレビュー:MarkdownのサポートとHelpInsightの改善 (en)
Coming in 11.2: the Little Things that make Big Quality
RAD Studio 11.2向けのEmbarcadero GetItパッケージダウンロード (en)
2022年9月5日
[書籍]インサイドWindows 第7版 下
紀伊國屋書店新宿本店でインサイドWindows 第6版 下の改訂版(ではもはやないかも)でWindows Internals, Part 2, 7th Edition (Amazon US)の翻訳である
インサイドWindows 第7版 下 (Amazon)/Andrea Allievi、Mark E. Russinovich、Alex Ionescu、David A. Solomon著、山内和朗訳/日経BP/ISBN 9784296080205/8,800円
を購入。上巻(Part 1)が刊行されて4年超、おめでとうございます。
インサイドWindows 第7版 下 (Amazon)/Andrea Allievi、Mark E. Russinovich、Alex Ionescu、David A. Solomon著、山内和朗訳/日経BP/ISBN 9784296080205/8,800円
を購入。上巻(Part 1)が刊行されて4年超、おめでとうございます。
2022年9月1日
2022/09開催のセミナー
- Web Seminar
- 2022/09/27 17:00-17:45(JST) 「特集!RAD Studio 11.2の新機能」 - エンバカデロ・デベロッパーTV(2022年9月)
- Live Seminar
- Community Event
2022年8月12日
2022年8月10日
2022年8月1日
2022/08開催のセミナー
- Web Seminar
- 2022/08/30 17:00-17:45(JST) 「エンバカデロ、アイデラグループの新オフィス準備」 - エンバカデロ・デベロッパーTV(2022年8月)
- Live Seminar
- Community Event
2022年7月15日
RAD Studio/C++Builder 11 Alexandria C++Builder Code Insight Update (11.1.5)
RAD Studio/Delphi/C++Builder 11 AlexandriaのC++Builder Code Insight Update (11.1.5)がリリースされています。IDEのC++Builder関係の機能の品質改善が行われています。Delphiのみを使用しているユーザにはインストールは推奨されていません。インストールには有効なUpdate Subscriptionが必要です。Registered Products Portalからダウンロードできます。
RAD Studio, C++Builder 11.1.5 ISO
RAD Studio, C++Builder 11.1.5 Web Install
What's New in 11.1.5 - RAD Studio
RAD Studio/C++Builder 11.1.5 Alexandria リリースのお知らせ (en)
RAD Studio, C++Builder 11.1.5 ISO
RAD Studio, C++Builder 11.1.5 Web Install
What's New in 11.1.5 - RAD Studio
RAD Studio/C++Builder 11.1.5 Alexandria リリースのお知らせ (en)
2022年7月13日
2022年7月4日
[書籍]現代暗号技術入門
紀伊國屋書店新宿本店でReal-World Cryptography (Amazn US)の翻訳である
現代暗号技術入門 (Amazon)/David Wong著/高橋聡訳/日経BP/ISBN 9784296080199/3,740円
を購入。
現代暗号技術入門 (Amazon)/David Wong著/高橋聡訳/日経BP/ISBN 9784296080199/3,740円
を購入。
2022年7月1日
2022/07開催のセミナー
- Web Seminar
- 2022/07/26 17:00-18:00(JST) 夏休み特集「実アプリで役立つDelphi TIPS選」 - エンバカデロ・デベロッパーTV(2022年7月)
- Live Seminar
- Community Event
2022年6月27日
[書籍]図解即戦力 UMLのしくみと実装がこれ1冊でしっかりわかる教科書
紀伊國屋書店新宿本店で
図解即戦力 UMLのしくみと実装がこれ1冊でしっかりわかる教科書 (Amazon)/株式会社フルネス 尾崎惇史著/技術評論社/ISBN 978-4-297-12866-1/2,640円
を購入。
図解即戦力 UMLのしくみと実装がこれ1冊でしっかりわかる教科書 (Amazon)/株式会社フルネス 尾崎惇史著/技術評論社/ISBN 978-4-297-12866-1/2,640円
を購入。
2022年6月21日
[書籍][ebook]Delphi Thread Safety Patterns
Luluで注文した
Delphi Thread Safety Patterns/Dalija Prasnikar、Neven Prasnikar Jr.著/FastSpring/64.50USD(printed+ebook)
が配送されてきました(今回の配送はFedEx/日本郵政で、アメリカ合衆国のニューヨーク市ジャマイカからの発送でした)。2022/06/02に注文して19日目の到着、ebookとのセットで書籍の分が50.00USDのところ25.00USD+7.94USD(shipping)=32.94USD、書籍とebookの合計で65.39USD=8,691JPY(1USD=132.934JPY)でした。現時点(2022/06/21)ではまだAmazonなどでの扱いはなく、書籍で入手したい場合はebookとのセットのみになります。
2022/10/18追記: 各国のAmazonでの扱いが始まったとのことです。日本のAmazonでも購入可能(8,084JPY)になっています。なおAmazon USでは49.95USDです。円安め…。
Delphi Thread Safety Patterns/Dalija Prasnikar、Neven Prasnikar Jr.著/FastSpring/64.50USD(printed+ebook)
が配送されてきました(今回の配送はFedEx/日本郵政で、アメリカ合衆国のニューヨーク市ジャマイカからの発送でした)。2022/06/02に注文して19日目の到着、ebookとのセットで書籍の分が50.00USDのところ25.00USD+7.94USD(shipping)=32.94USD、書籍とebookの合計で65.39USD=8,691JPY(1USD=132.934JPY)でした。現時点(2022/06/21)ではまだAmazonなどでの扱いはなく、書籍で入手したい場合はebookとのセットのみになります。
2022/10/18追記: 各国のAmazonでの扱いが始まったとのことです。日本のAmazonでも購入可能(8,084JPY)になっています。なおAmazon USでは49.95USDです。円安め…。
2022年6月15日
現在実行している環境(プロセッサアーキテクチャ)を調べる
Windowsの実行環境としては、現時点(2022年06月)でx86(32bit)版、x64(64bit)版、ARM版があります。一方でDelphiがサポートするターゲットプラットフォームにはWindows 32ビット(x86)、Windows 64ビット(x64)があります。組み合わせとして、x86のプログラムはx86、x64、ARMのいずれでも、またx64のプログラムはx64、ARM(Windows 11のみ)で動作します。逆に動作しない組み合わせはx64のプログラムとx86、ARM(Windows 10)ということになります(Delphiではいまのところ作れませんが、ARMのプログラムはx86/x64では動作せず、ARM版でのみ動作します)。これはWindowsのWOW64(エミュレータ)やDynamic Binary Translator(JIT)によるもので、後方互換性を極めて重視するMicrosoftらしいよくできた仕組みです。これによりWindows上で動作するプログラムは実行環境のことをあまり気にしなくてもよいのですが、まれに(ターゲットプラットフォームではなく)実行環境によって動作を変えたい、ということがあります。
実行環境を調べるにはいくつかの方法がありますが、IsWow64Process2() を使わずにWowA64を検出する · GitHubによると、Windows 10 Version 1511以降であればWin32APIのIsWow64Process2を、それ以前(Windows XP/Vista/7/8/8.1/10 Version 1507(RTM))であればWin32APIのGetNativeSystemInfoを使うのがよいようです(Windows 2000ではGetSystemInfo)。それでは実装してみましょう。
実行環境を調べるにはいくつかの方法がありますが、IsWow64Process2() を使わずにWowA64を検出する · GitHubによると、Windows 10 Version 1511以降であればWin32APIのIsWow64Process2を、それ以前(Windows XP/Vista/7/8/8.1/10 Version 1507(RTM))であればWin32APIのGetNativeSystemInfoを使うのがよいようです(Windows 2000ではGetSystemInfo)。それでは実装してみましょう。
type
{$SCOPEDENUMS ON}
TProcessorArchitecture = (x86, // Intel x86
x64, // AMD64/Intel 64
ARM); // ARM
TIsWow64Process2Func = function (hProcess: THandle; var ProcessMachine: USHORT; var NativeMachine: USHORT): BOOL; stdcall;
TGetSystemInfoFunc = procedure (var lpSystemInfo: TSystemInfo); stdcall;
const
IMAGE_FILE_MACHINE_ARM64 = $AA64;
function GetProcessorArchitecture: TProcessorArchitecture;
var
IsWow64Process2Func: TIsWow64Process2Func;
ProcessMachine: USHORT;
NativeMachine: USHORT;
GetSystemInfoFunc: TGetSystemInfoFunc;
SI: TSystemInfo;
begin
{ Use IsWow64Process2 on Windows 10 Version 1511 or later }
@IsWow64Process2Func := GetProcAddress(GetModuleHandle(kernel32),'IsWow64Process2');
if Assigned(IsWow64Process2Func) = True then
begin
if IsWow64Process2Func(GetCurrentProcess,ProcessMachine,NativeMachine) = True then
begin
case NativeMachine of
IMAGE_FILE_MACHINE_I386:
begin
Result := TProcessorArchitecture.x86;
Exit;
end;
IMAGE_FILE_MACHINE_AMD64:
begin
Result := TProcessorArchitecture.x64;
Exit;
end;
IMAGE_FILE_MACHINE_ARM64:
begin
Result := TProcessorArchitecture.ARM;
Exit;
end;
end;
end;
end;
{ Use GetNativeSystemInfo (Windows XP or later) or GetSystemInfo (Windows 2000) }
FillChar(SI,SizeOf(SI),0);
@GetSystemInfoFunc := GetProcAddress(GetModuleHandle(kernel32),'GetNativeSystemInfo');
if Assigned(GetSystemInfoFunc) = True then
begin
GetSystemInfoFunc(SI);
end
else
begin
GetSystemInfo(SI);
end;
if SI.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64 then
begin
Result := TProcessorArchitecture.x64;
end
else
begin
Result := TProcessorArchitecture.x86;
end;
end;
IsWow64Process2、GetNativeSystemInfo、GetSystemInfoの順にフォールバックして情報を取得するようになっています。
2022年6月10日
[書籍]Head Firstデザインパターン 第2版
紀伊國屋書店新宿本店でHead Firstデザインパターンの改訂版で、Head First Design Patterns, 2nd Editionの日本語訳である
Head Firstデザインパターン 第2版 (Amazon)/ Eric Freeman、Elisabeth Robson著/木下哲也訳/佐藤直生監訳/オライリージャパン/ISBN 978-4-87311-976-2/5,280円
を購入。
Head Firstデザインパターン 第2版 (Amazon)/ Eric Freeman、Elisabeth Robson著/木下哲也訳/佐藤直生監訳/オライリージャパン/ISBN 978-4-87311-976-2/5,280円
を購入。
2022年6月9日
2022年6月1日
2022/06開催のセミナー
- Web Seminar
- 2022/06/28 17:00-17:45(JST) 「IE終了、Delphiアプリの対応は?」 - エンバカデロ・デベロッパーTV(2022年6月)
- Live Seminar
- Community Event
2022年5月27日
RAD Studio/Delphi/C++Builder 11.1 Alexandria Windows 11 Win32 Debugging Patch
RAD Studio/Delphi/C++Builder 11.1 AlexandriaのWindows 11 Win32 Debugging Patchがリリースされています。Windows 11上でWin32アプリケーションをデバッグしているときにスレッド待機チェーンの問題で1分程度のフリーズが発生することがある問題に対応します。リモートデバッグを使用している場合はPAServerを更新する必要があります。現時点(2022/05/27)でGetIt経由でインストールすることができます。
RAD Studio 11.1向け 「Windows 11 Win32 Debugging Patch」のリリース (en)
また長らくリリースが遅れていたRAD Studio 11/11.1 Alexandria用のIDE pluginの(Parnassus) BookmarksとNavigatorもGetItからインストールできるようになっています(有効なサブスクリプションが必要)。
RAD Studio 11向けプラグイン「 BookmarksならびにNavigator」の リリースのお知らせ (en)
RAD Studio 11.1向け 「Windows 11 Win32 Debugging Patch」のリリース (en)
また長らくリリースが遅れていたRAD Studio 11/11.1 Alexandria用のIDE pluginの(Parnassus) BookmarksとNavigatorもGetItからインストールできるようになっています(有効なサブスクリプションが必要)。
RAD Studio 11向けプラグイン「 BookmarksならびにNavigator」の リリースのお知らせ (en)
2022年5月11日
2022年5月1日
2022/05開催のセミナー
- Web Seminar
- 2022/05/31 17:00-17:45(JST) 「作成したモバイルアプリを実機で動かす」 - エンバカデロ・デベロッパーTV(2022年5月)
- Live Seminar
- Community Event
2022年4月28日
RAD Studio/Delphi/C++Builder 11.1 Alexandria Patch 1
RAD Studio/Delphi/C++Builder 11.1 AlexandriaのPatch 1がリリースされています。macOSのPAServerではPython 2.7が必要になります。GetItまたはポータルサイトからダウンロード、インストールすることができます。
RAD Studio 11.1 Patch 1
RAD Studio 11.1 Alexandria Patch 1 のリリース (en)
RAD Studio 11.1 Patch 1
RAD Studio 11.1 Alexandria Patch 1 のリリース (en)
2022年4月25日
2022年4月21日
InterBase 2020 Update 3
InterBase 2020 Update 3がリリースされています。バージョンは14.3.0.707となっています。
InterBase 2020 Update 3 リリース ノート - InterBase (en)
InterBase 2020 Update 3 の新機能 - InterBase (en)
Resolved Defects - InterBase (en)
Embarcadero InterBase 2020 Update 3 のリリース (en)
InterBase 2020 Update 3 リリース ノート - InterBase (en)
InterBase 2020 Update 3 の新機能 - InterBase (en)
Resolved Defects - InterBase (en)
Embarcadero InterBase 2020 Update 3 のリリース (en)
2022年4月13日
2022年4月1日
2022/04開催のセミナー
- Web Seminar
- 2022/04/26 17:00-17:45(JST) 「ゴールデンウィークはプログラミングをしよう」 - エンバカデロ・デベロッパーTV(2022年4月)
- Live Seminar
- Community Event
2022年3月30日
[書籍] OBJECT PASCAL HANDBOOK Delphi 11 Edition
紀伊國屋書店新宿本店でOBJECT PASCAL HANDBOOKの改訂版で、OBJECT PASCAL HANDBOOK Delphi 11 Alexandria Editionの日本語訳である
OBJECT PASCAL HANDBOOK Delphi 11 Edition (Amazon)/Marco Cantù著/エンバカデロ・テクノロジーズ訳/藤井等監訳/カットシステム/ISBN 978-4-87783-521-7/8,800円
を購入。
OBJECT PASCAL HANDBOOK Delphi 11 Edition (Amazon)/Marco Cantù著/エンバカデロ・テクノロジーズ訳/藤井等監訳/カットシステム/ISBN 978-4-87783-521-7/8,800円
を購入。
2022年3月16日
RAD Studio/Delphi/C++Builder 11 Alexandria Release 1 (11.1)
RAD Studio/Delphi/C++Builder 11 AlexandriaのRelease 1 (11.1)がリリースされています。インストールには有効なUpdate Subscriptionが必要です。Registered Products Portalからダウンロードできます。
RAD Studio, Delphi, C++Builder 11.1 ISO
RAD Studio, Delphi, C++Builder 11.1 Web Install
11 Alexandria - Release 1 - RAD Studio (en)
New features and customer reported issues fixed in RAD Studio 11.1
List of publicly reported bugs fixed in 11.1 - RAD Studio
RAD Studio 11.1 Alexandriaリリースのお知らせ (en)
RAD Studio 11.1とWindows PEセキュリティフラグ (en)
RAD Studio, Delphi, C++Builder 11.1 ISO
RAD Studio, Delphi, C++Builder 11.1 Web Install
11 Alexandria - Release 1 - RAD Studio (en)
New features and customer reported issues fixed in RAD Studio 11.1
List of publicly reported bugs fixed in 11.1 - RAD Studio
RAD Studio 11.1 Alexandriaリリースのお知らせ (en)
RAD Studio 11.1とWindows PEセキュリティフラグ (en)
2022年3月9日
2022年3月1日
2022/03開催のセミナー
- Web Seminar
- 2022/03/22 17:00-17:45(JST) 「RAD Studio 11.1 Alexandriaリリース」 - エンバカデロ・デベロッパーTV(2022年3月)
- Live Seminar
- Community Event
登録:
投稿 (Atom)