tag:blogger.com,1999:blog-31968259120207301292024-03-13T12:56:19.855+09:00Owl's perspectiveとりあえず Embarcadero RAD Studio/Delphi/C++Builder 関係のあれやこれや。コードのハイライトは現在行われていません。ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.comBlogger1494125tag:blogger.com,1999:blog-3196825912020730129.post-7409011840933644052024-03-13T12:54:00.001+09:002024-03-13T12:54:23.226+09:00Microsoft Monthly Update 2024/03今日はMicrosoftのセキュリティアップデートの日です。<BR />
<a href="https://msrc.microsoft.com/update-guide/releaseNote/2024-Mar">2024 年 3 月のセキュリティ更新プログラム - リリース ノート - セキュリティ更新プログラム ガイド - Microsoft</a><BR />
<a href="https://msrc.microsoft.com/blog/2024/03/202403-security-update/">2024 年 3 月のセキュリティ更新プログラム (月例) | MSRC Blog | Microsoft Security Response Center</a><BR />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-21193686276549297852024-03-04T23:59:00.026+09:002024-03-05T09:38:16.576+09:00[書籍]Expert Delphi - Second Edition<A HREF="https://www.amazon.co.jp/">Amazon(JP)</A>で注文した<br />
<br />
<a href="https://www.packtpub.com/product/expert-delphi-second-edition/9781805121107">Expert Delphi - Second Edition</a> (<a href="https://www.amazon.com/gp/product/1805121103">Amazon US</a>, <a href="https://www.amazon.co.jp/dp/1805121103">Amazon JP</a>)/<A HREF="https://www.marcocantu.com/">Marco Cantù</A>、<A HREF="https://github.com/pglowack">Paweł Głowacki</A>著/Packt Publishing/ISBN 9781805121107/7,596JPY(printed)<BR />
<br />
が配送されてきました。2024/03/02に注文して2日目の到着でした(日本国内でのプリントオンデマンドでした)。ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-7749415294640568492024-03-01T00:00:00.009+09:002024-03-01T00:00:00.247+09:002024/03開催のセミナー<ul><li>Web Seminar<ul><li>2024/03/12 17:00-17:45(JST) <a href="https://www.embarcadero.com/jp/events-japan/webinar/developers-tv">「Delphi 29歳バースディ!私のDelphi推しプレゼン」 - エンバカデロ・デベロッパーTV(2024年3月12日)</a></LI></UL></LI>
<li>Live Seminar<ul><li></LI></UL></LI>
<li>Community Event<ul><li></LI></UL></LI></UL>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-52293935559119756782024-02-14T09:13:00.001+09:002024-02-14T09:13:15.030+09:00Microsoft Monthly Update 2024/02今日はMicrosoftのセキュリティアップデートの日です。<BR />
<a href="https://msrc.microsoft.com/update-guide/releaseNote/2024-Feb">2024 年 2 月のセキュリティ更新プログラム - リリース ノート - セキュリティ更新プログラム ガイド - Microsoft</a><BR />
<a href="https://msrc.microsoft.com/blog/2024/02/202402-security-update/">2024 年 2 月のセキュリティ更新プログラム (月例) | MSRC Blog | Microsoft Security Response Center</a><BR />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-24946139661009043552024-02-07T23:59:00.032+09:002024-02-14T10:36:02.340+09:00RAD Studio/Delphi/C++Builder 12 Athens Patch 1RAD Studio/Delphi/C++Builder 12 AthensのPatch 1がリリースされています。多数の不具合修正が含まれています。<DEL>現時点(2024/02/08)では(やっと復旧した)GetItからのみダウンロード、インストールすることができます。</DEL>2024/02/10現在でGetItまたはポータルサイトからダウンロード、インストールすることができます。またwebインストーラもPatch 1適用済のみものがダウンロードできるようになっています。<br />
<br />
<a href="https://my.embarcadero.com/#downloadDetail/1701">RAD Studio 12.0 Patch 1</a><br />
<a href="https://my.embarcadero.com/#downloadDetail/1702">RAD Studio, Delphi, C++Builder 12.0 Inline with Patch 1 Web Install</a><br />
<br />
なおオリジナルのwebインストーラからインストールした場合はPatch 1がインストールされているかどうかにかかわらず、IDEのツール→機能の管理で言語やターゲットプラットフォームなどを追加することはできず、一旦アンインストール後にPatch 1適用済のwebインストーラからインストールし直す必要があるため注意が必要です。<br />
<br />
<a href="https://blogs.embarcadero.com/ja/rad-studio-12-athens-patch-1-available-ja/">RAD Studio 12 Athens Patch 1 のリリース</a> (<a href="https://blogs.embarcadero.com/rad-studio-12-athens-patch-1-available/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/getit-update-additional-rad-studio-12-getit-packages-are-now-available-ja/">GetIt アップデート: RAD Studio 12 向けのGetItパッケージインストールが利用可能に!</a> (<a href="https://blogs.embarcadero.com/getit-update-additional-rad-studio-12-getit-packages-are-now-available/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/getit-update-rad-studio-12-getit-online-installation-is-now-available-ja/">GetItアップデート: RAD Studio 12 GetIt オンラインインストールが利用可能に!</a> (<a href="https://blogs.embarcadero.com/getit-update-rad-studio-12-getit-online-installation-is-now-available/">en</a>)<br />
<br />
2024/02/10追記: Patch 1がポータルサイトからダウンロードできるようになったこととオリジナルのwebインストーラからインストールした場合の注意事項を追記しました。ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-23798860432822930372024-02-01T00:00:00.010+09:002024-02-27T11:52:59.302+09:002024/02開催のセミナー<ul><li>Web Seminar<ul><li><DEL>2024/02/20 17:00-17:45(JST) <a href="https://www.embarcadero.com/jp/events-japan/webinar/developers-tv">「Delphi 29歳バースディ!私のDelphi推しプレゼン」 - エンバカデロ・デベロッパーTV(2024年2月)</a></DEL> 2024/03/12に延期</LI></UL></LI>
<li>Live Seminar<ul><li></LI></UL></LI>
<li>Community Event<ul><li></LI></UL></LI></UL>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-82904019897224865182024-01-12T09:02:00.003+09:002024-02-17T09:58:37.366+09:00Firebird 5.0Firebird 5.0がリリースされています。ODSバージョンは13.1になっています。<br />
<br />
<a href="https://firebirdsql.org/en/news/firebird-5-0-0-is-released/">Firebird: Firebird 5.0 is released</a><br />
<a href="https://firebirdsql.org/en/firebird-5-0/">Firebird: Firebird 5.0.0</a><br />
<a href="https://firebirdsql.org/file/documentation/release_notes/html/en/5_0/rlsnotes50.html">Firebird 5.0 Release Notes</a> (<A HREF="https://firebirdsql.org/file/documentation/release_notes/Firebird-5.0.0-ReleaseNotes.pdf">PDF</A>)<br />
<a href="https://firebirdsql.org/file/documentation/html/en/refdocs/fblangref50/firebird-50-language-reference.html">Firebird 5.0 Language Reference</a> (<A HREF="https://firebirdsql.org/file/documentation/pdf/en/refdocs/fblangref50/firebird-50-language-reference.pdf">PDF</A>)<br />
<br />
Detailed New Features of Firebird 5<ul><li><a href="https://ib-aid.com/en/articles/detailed-new-features-of-firebird-5-part-1-improvements-in-optimizer">Detailed New Features of Firebird 5. Part 1: Improvements in Optimizer</a></li>
<li><a href="https://ib-aid.com/en/articles/detailed-new-features-of-firebird-5-part-2-sql">Detailed New Features of Firebird 5. Part 2: SQLs</a></li>
<li><a href="https://ib-aid.com/articles/detailed-new-features-of-firebird-part-3-using-new-clause-skip-locked">Detailed New Features of Firebird, Part 3: Using new clause SKIP LOCKED</a></li>
<li><a href="https://ib-aid.com/en/articles/detailed-new-features-of-firebird-5-part-4-parallel-features-backup-restore-sweep-creation-of-indices">Detailed New Features of Firebird 5, Part 4: Parallel Features: backup/restore/sweep, creation of indices</a></li>
<li><a href="https://ib-aid.com/en/articles/detailed-new-features-of-firebird-5-part-5-better-compression-cache-of-compiled-statements-and-more">Detailed New Features Of Firebird 5, Part 5: Better compression, cache of compiled statements, and more</a></li>
<li><a href="https://ib-aid.com/articles/parallel-reading-of-data-in-firebird">Parallel Reading Of Data In Firebird</a></li></ul>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-64085041060714399392024-01-10T08:34:00.001+09:002024-01-10T08:34:54.352+09:00Microsoft Monthly Update 2024/01今日はMicrosoftのセキュリティアップデートの日です。<BR />
<a href="https://msrc.microsoft.com/update-guide/releaseNote/2024-Jan">2024 年 1 月のセキュリティ更新プログラム - リリース ノート - セキュリティ更新プログラム ガイド - Microsoft</a><BR />
<a href="https://msrc.microsoft.com/blog/2024/01/202401-security-update/">2024 年 1 月のセキュリティ更新プログラム (月例) | MSRC Blog | Microsoft Security Response Center</a><BR />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-33118155459080108432024-01-01T00:00:00.008+09:002024-02-03T21:17:58.391+09:002024/01開催のセミナー<ul><li>Web Seminar<ul><li>2024/01/30 17:00-17:45(JST) <A HREF="https://www.embarcadero.com/jp/events-japan/webinar/developers-tv">新年事始め!三浦珠美の「挑戦!はじめてのDelphi」 - エンバカデロ・デベロッパーTV(2024年1月)</A><UL><LI><A HREF="https://www.youtube.com/watch?v=1sXiwCycGe8">Replay (1/1)</A></LI></UL></LI></UL></LI>
<li>Live Seminar<ul><li></LI></UL></LI>
<li>Community Event<ul><li></LI></UL></LI></UL>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-21789050693084913442023-12-27T17:31:00.000+09:002023-12-27T17:31:03.366+09:00文字列の表示幅を取得する<a href="/2023/12/split-string-into-grapheme-clusters.html">前回</a>は<A HREF="https://skia4delphi.org/">Skia4Delphi</A>のISkUnicodeを使って文字列を書記素クラスタ(grapheme cluster)に分割する方法を扱いましたが、(等幅フォントでの表記を前提として)文字列が何文字分の幅を占めるのか(いわゆる"表示幅")を取得するためには、それぞれの書記素クラスタ(の基底文字)がいわゆる"半角幅"(halfwidth、1/2 Em)なのか"全角幅"(fullwidth、1 Em)なのかを知る必要があります(Emは文字の高さを基準にした単位で、1/2 Emは高さの半分の文字幅、1 Emは高さと同じ文字幅になる、という意味)。これに関するUnicodeの規格が<A HREF="https://unicode.org/reports/tr11/">Unicode Standard Annex #11 East Asian Width</A>(UAX #11)になります。<br />
<br />
UAX #11では既存の実装に配慮して、文字をその占める幅によって<UL><LI>Fullwidth("F"/全角)</LI>
<LI>Halfwidth ("H"/半角)</LI>
<LI>Wide ("W"/広)</LI>
<LI>Narrow ("Na"/狭)</LI>
<LI>Ambiguous ("A"/曖昧)</LI>
<LI>Neutral ("N"/中立)(Not East Asian)</LI></UL>に分類しています。"F"は全角英数などUnicodeの規格上"FULLWIDTH"とされるもの、"H"は半角カナなど"HALFWIDTH"とされるもの、"W"はJISの漢字や東アジアの組版専用の句読点など文字幅が1 Emで扱われてきたもの、"Na"は半角英数など"F"や"W"に対応する全角文字が存在するもの、"A"はJISのギリシャ文字やキリル文字のように東アジアでは文字幅が1 Emで扱われるもの、"N"はそれ以外のもの、となり、"F"と"W"は全角幅、"H"、"Na"、"N"は半角幅として扱います。ここで問題になるのが"A"で、これは組版の文脈(≒使われるフォント)によって、全角幅か半角幅かのどちらかになります(例えばギリシャ文字やキリル文字はMS Gothicのような日本語のフォントでは全角幅に、Consolasのような欧文のフォントでは半角幅になる)。<br />
<br />
では実際にどの文字(コードポイント)がどの分類になるのか、ですが、これはUnicodeデータベースの一部として<A HREF="https://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt">https://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt</A>にリストされています。基本的にこれを何らかの形で配列化しておいて参照すればいいのですが、Unicode(UCS4)で扱えるコードポイントは最大でU+0000からU+10FFFFの1,114,112個あり、単純にテーブル化すると約1MBになってしまいます。しかしプレーン4~13は未割当で定義も存在しません(この場合はデフォルトで"N"である(<q>All code points, assigned or unassigned, that are not listed explicitly are given the value "N".</q>)と明記されています)。そこで今回はプレーン毎に分割して、フルマッピングするプレーンと1つの値で代表させるプレーン、という形で領域を節約した実装を考えてみます。<br />
<br />
まずはUAX #11で規定されている分類を列挙型として定義し、レコードヘルパでそれぞれに対応する文字幅を返すようにします。
<pre name="code" class="brush:delphi">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;</pre>
ここでクラスプロパティTEastAsianWidth.EastAsianは"A"の扱いを決めるもので、Trueなら東アジアの組版(フォントが日本語など)、Falseなら欧文の組版(フォントが欧文)であることを示します。<br />
次にEastAsianWidth.txtをテーブル化します。まずそれぞれのプレーンを格納するテーブルのレコード型と、このテーブルへのポインタと代表値をセットにしたレコード型を定義します。
<pre name="code" class="brush:delphi">type
TPlaneData = packed record
public
Data: array [0..65535] of Byte;
end;
PPlaneData = ^TPlaneData;
TPlane = record
PlaneDefault: Byte;
PlaneData: PPlaneData;
end;</pre>
このTPlaneの配列(0..16)を今回はEastAsianWidth.txtから生成しますが、とりあえず仮に
<pre name="code" class="brush:delphi">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));</pre>
こんな定数定義があるものとします。これを使用する形でレコードヘルパTEastAsianWidthHelperにクラスメソッドGetEastAsianWidthを追加します。
<pre name="code" class="brush:delphi">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;</pre>
クラスメソッドGetEastAsianWidthでは、プレーン毎のテーブルがあればそこから、テーブルがなければ代表値を取得し、列挙型TEastAsianWidthとして返します。<br />
<br />
あとはUnicodeのバージョンアップに簡単に追随できるようにするために、EastAsianWidth.txtから上記のテーブル部分を自動生成する処理を別ユニットに作っていきます。<br />
<br />
まず読み込んだプレーン毎のデータを格納するレコード型と、関係するメソッド(初期化、値の指定、代表値だけでテーブルを省略可能かどうかの判定)を用意します。
<pre name="code" class="brush:delphi">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;</pre>
これを使ってUCS4のコード範囲全体を扱うレコード型を用意します。
<pre name="code" class="brush:delphi">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;</pre>
あとはEastAsianWidth.txtを解析して値を格納し、テーブル化するメソッドを用意します。
<pre name="code" class="brush:delphi">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;</pre>
レコード型TEastAsianWidthPropertiesはサイズが大きく、デフォルトの設定ではスタックオーバフローするため、<A HREF="https://docwiki.embarcadero.com/Libraries/ja/System.New">New</A>/<A HREF="https://docwiki.embarcadero.com/Libraries/ja/System.Dispose">Dispose</A>でヒープ上に確保するようにしています。読み込んだEastAsianWidth.txtの各行が
<div class="codebox"><pre><code>0000..001F ; N # Cc [32] <control-0000>..<control-001F>
0020 ; Na # Zs SPACE</code></pre></div>このようになっているものを、正規表現で複数指定、単独指定のどちらかのパターンにマッチングさせて、コードポイント(の範囲)と属性を取り込んでテーブルに格納し、最後にテーブルの内容をDelphiのコードの一部として出力しています。<br />
<br />
このConvertEastAsianWidthを使ってEastAsianWidth.txtをEastAsianWidth.incとして変換したら、上記のTPlaneの配列部分を
<pre name="code" class="brush:delphi">const
{$I 'EastAsianWidth.inc'}</pre>
と置き換えれば完成です。<br />
<br />
これで前回のサンプルにチェックボックスを1つ追加して、
<pre name="code" class="brush:delphi">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;</pre>
こんな感じで全体の文字数を得ることができるようになります。チェックボックスのチェック状態で"á̂̃̄"のWが変化するのがわかりますね。<br />
<br />
誰ですか、絵文字が混ざると意味がないじゃないか、とかいう人は!そう、絵文字が<A HREF="https://en.wikipedia.org/wiki/Zero-width_joiner">ZWJ</A>(ゼロ幅接合子)を使ってグリフを増やすようになったあたりから、実際にレンダリングしてみないとどのくらいの表示幅になるのかはわからなくなっているのです。<br />
<br />
最終的なプロジェクト全体を<A HREF="https://github.com/owlsperspective/GraphemeClusterSample">GitHub</A>に上げてあります。今後Unicodeのバージョンが上がっても、更新されたEastAsianWidth.txtを取り込むことで最新のものに準拠することができます。<br />
<br />
参考: <a href="https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85">東アジアの文字幅 - Wikipedia</a><br />
ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-91053004708313068772023-12-25T00:00:00.017+09:002023-12-25T00:12:38.532+09:00文字列を書記素クラスタで分割するこのアーティクルは<a href="https://qiita.com/advent-calendar/2023/delphi">Delphi Advent Calendar 2023</a>の25日目の記事です(12日ぶり11回目)。<br />
<br />
<A HREF="http://unicode.org/main.html">Unicode</A>の世界では、1つの"文字"(書記素、grapheme)が1つのコードポイント(code point)で表されるとは限りません。サロゲートペアとか結合文字とか絵文字とか、文字列に入っているものがどれくらいの"文字数"になっているのかを知るのは意外に難しい話です。<br />
現在一般的と考えられる方法として、<UL><LI>ICU( International Components for Unicode、<A HREF="https://icu.unicode.org/">https://icu.unicode.org/</A>)を使う</LI><LI>正規表現で"\X"でマッチする</LI><LI>Unicodeの規格(<A HREF="https://unicode.org/reports/tr29/">Unicode Standard Annex #29</A>)を元に自前で実装するr</LI></UL>がありますが、ICUはインタフェースがUTF-8ベースでDelphiからは使いにくく、Delphiの正規表現ライブラリはPCRE(1) 8.45ベースでだいぶ古くてUnicodeの新しいバージョンには対応していません(<A HREF="https://quality.embarcadero.com/browse/RSP-42524">RSP-42524</A>)。また自前での実装は相当面倒なうえに、Unicodeのバージョンアップに追従していくのが大変です。<br />
ところがDelphi 12で標準サポートされた<A HREF="https://github.com/skia4delphi/skia4delphi">Skia4Delphi</A>では簡単に文字列を書記素クラスタで分割できるようになりました(ICUを取り込んでいるようです)。試しに正規表現(PCRE)による分割と比較してみましょう。<br />
なおDelphi 11 Alexandriaおよびそれ以前のバージョンではSkia4Delphiをインストールする必要があります(現時点(2023/12)の最新は<A HREF="https://github.com/skia4delphi/skia4delphi/releases/tag/v6.0.0">6.0.0</A>)。<br />
<br />
新規プロジェクトを作成し、フォーム(フォントサイズを大きめにしておくと結果が見やすくなります)にTEditを1つ、TButtonを2つ、結果表示のためのTMemoを1つ配置します。またプロジェクトツールウィンドウでプロジェクトを右クリック→Skiaを有効化を選択して、実行ファイルと同じ場所にsk4d.dllが配置されるようにします。<br />
usesにSystem.Skiaを追加し、フォームのOnShowイベントで
<pre name="code" class="brush:delphi">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;</pre>
とEdit1.Textにサンプル文字列を設定し、Button1のOnClickイベントで
<pre name="code" class="brush:delphi">procedure TForm1.Button1Click(Sender: TObject);
begin
for var Match in TRegEx.Matches(Edit1.Text,'\X') do
begin
Memo1.Lines.Add(Match.Value);
end;
end;</pre>
Button2のOnClickイベントで
<pre name="code" class="brush:delphi">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;</pre>
とします。では実行してみましょう。まず正規表現です。<br />
<div class="codebox"><pre><code>𠮷
野
屋
の
コ
ピ
ペ
å
á̂̃̄
😭
🤷
🏽
♀️
👨
👩
👧
👦
👩
🏽
💻
🇯🇵
</code></pre></div>(Windows上の表示とは若干異なります)<br />
正規表現による分割では絵文字の<A HREF="https://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E5%B9%85%E6%8E%A5%E5%90%88%E5%AD%90">ZWJ(ゼロ幅接合子)</A>による結合はうまく処理できないようです。これはPCRE 8.45がだいぶ古いバージョンで、最新のUnicodeに対応できていないことが原因と考えられます。<br />
<br />
次にSkia4Delphiです。<br />
<div class="codebox"><pre><code>𠮷
野
屋
の
コ
ピ
ペ
å
á̂̃̄
😭
🤷🏽♀️
👨👩👧👦
👩🏽💻
🇯🇵
</code></pre></div>
一方でSkia4Delphiによる分割は正しく処理できていますね。ちなみにWindowsでは国旗の絵文字は絵文字としてではなくRegional indicator symbol2文字での表現になるようです(サンプル最後の"🇯🇵"が"JP"となる)。<br />
<br />
書記素クラスタによる分割は文字列のレンダリングに必須なためSkia(Skia4Delphi)に実装されていると考えられますが、プログラムで書記素クラスタによる分割が必要になるのは(帳票などで)文字列がどのくらいの幅を占めるかを知りたいときではないでしょうか。そのためには書記素クラスタによる分割だけでなく、<A HREF="https://unicode.org/reports/tr11/">Unicode Standard Annex #11 East Asian Width</A>も必要になります。これはDelphi標準の<A HREF="http://docwiki.embarcadero.com/Libraries/ja/System.Character">System.Characterユニット</A>にもSkia4Delphiにも実装されておらず、<A HREF="https://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt">EastAsianWidth.txt</A>を取り込んで自前で実装する必要があります。これについては後日別のアーティクルで扱うことにします。<br />
<br />
Skia4Delphを使って見やすくしたバージョンを<A HREF="https://gist.github.com/owlsperspective/6d163ff95d4493942757941528777498">Gist</A>に上げてあります。
ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-38213122518452510112023-12-13T10:30:00.001+09:002023-12-13T10:30:05.523+09:00Microsoft Monthly Update 2023/12今日はMicrosoftのセキュリティアップデートの日です。<BR />
<a href="https://msrc.microsoft.com/update-guide/releaseNote/2023-Dec">2023 年 12 月のセキュリティ更新プログラム - リリース ノート - セキュリティ更新プログラム ガイド - Microsoft</a><BR />
<a href="https://msrc.microsoft.com/blog/2023/12/202312-security-update/">2023 年 12 月のセキュリティ更新プログラム (月例) | MSRC Blog | Microsoft Security Response Center</a><BR />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-28985588887338594172023-12-13T00:00:00.009+09:002023-12-13T00:23:21.328+09:00TSqidsEncodingで文字列を難読化するこのアーティクルは<a href="https://qiita.com/advent-calendar/2023/delphi">Delphi Advent Calendar 2023</a>の12日目の記事です(2日ぶり10回目)。<br />
<br />
<A HREF="/2023/12/introduce-tsqidsencoding.html">前回</A>はDelphi 12 Athensで導入された<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding">TSqidsEncoding</A>を普通に使ってみましたが、TSqidsEncodingにはTArray<Integer>を扱うoverloadがあり、今回はそれを使って文字列を難読化してみます。<br />
とはいっても、単にDelphiの文字列(UTF-16)の1文字を単純にUInt16(=Word)として扱うだけです。<br />
<pre name="code" class="brush:delphi">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<Integer>;
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<Integer>;
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;
</pre>
文字列の難読化としてXORやROT13などがよく使われますが、このほうがまだましな気がしますね。ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-12999631730453313142023-12-10T00:00:00.003+09:002023-12-22T16:45:39.040+09:00TSqidsEncodingで数値と短縮IDを相互変換するこのアーティクルは<a href="https://qiita.com/advent-calendar/2023/delphi">Delphi Advent Calendar 2023</a>の10日目の記事です(1年ぶり9回目)。<br />
<br />
Delphi 12 Athensで数値と短縮IDを相互変換する<A HREF="https://sqids.org/">Sqids</A>を実装した<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding">TSqidsEncoding</A>が追加されました。<br />
Sqidsはあくまで難読化であって暗号化ではないので、内容を隠すことはできませんが、ID番号などをそのまま見せるよりはまし、というような場合に有効です。<A HREF="https://sqids.org/">Sqidsの公式サイト</A>では、適しているケースとして
<UL><LI>短縮リンク<UL><LI>URLで安全に使用できる</LI></UL></LI>
<LI>イベントID<UL><LI>衝突しないエンコード/デコード</LI></UL></LI>
<LI>ワンタイムパスワード<UL><LI>短く問題のあるワードを含まない</LI></UL></LI></UL>
適していないケースとして
<UL><LI>機密データ<UL><LI>暗号化されるわけではない</LI></UL>
<LI>ユーザID<UL><LI>デコードすることでユーザ数が漏洩する</LI></UL></LI></UL>
を挙げています。<br />
<br />
使用方法は簡単で、エンコードするには
<pre name="code" class="brush:delphi">uses
..., System.NetEncoding.Sqids;
var
Sqids: TSqidsEncoding;
begin
Sqids := TSqidsEncoding.Create;
try
Edit2.Text := Sqids.Encode(Edit1.Text);
finally
Sqids.Free;
end;
end;
</pre>
デコードするには
<pre name="code" class="brush:delphi">var
Sqids: TSqidsEncoding;
begin
Sqids := TSqidsEncoding.Create;
try
Edit3.Text := Sqids.DecodeToStr(Edit2.Text);
finally
Sqids.Free;
end;
end;
</pre>
とするだけです。Sqidsのソースは数値ですが、エンコードでは<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding.Encode">Inreger、TArray<Integer>、Stringを受け取るoverload</A>が用意されています(Stringは単独またはカンマ区切りの数値表現)。<br />
またデコードはTArray<Integer>を返すもの(<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding.Decode">Decode</A>)、Integerを返すもの(<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding.DecodeSingle">DecodeSingle</A>/<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding.TryDecodeSingle">TryDecodeSingle</A>)、Stringを返すもの(<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding.DecodeToStr">DecodeToStr</A>)が用意されています。<br />
さらに<A HREF="https://docwiki.embarcadero.com/Libraries/en/System.NetEncoding.TSqidsEncoding.Create">コンストラクタ</A>にエンコード用の文字列を渡すことで生成される文字列をカスタマイズすることもできます。<br />
<br />
2023/12/22追記: 公式のblogにもSqidsの使いかたの記事が出ました。<br />
<a href="https://blogs.embarcadero.com/ja/sqids-integration-with-rad-server-and-standalone-library-ja/">Sqids: RAD Serverとの統合およびスタンドアロンライブラリ</a> (<a href="https://blogs.embarcadero.com/sqids-integration-with-rad-server-and-standalone-library/">en</a>)<br />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-7317646006889261182023-12-01T23:59:00.003+09:002024-01-12T10:05:17.897+09:002023/12開催のセミナー<ul><li>Web Seminar<ul><li>2023/12/19 17:00-17:45(JST) <a href="https://www.embarcadero.com/jp/events-japan/webinar/developers-tv">RAD Studio 12を掘り下げる - エンバカデロ・デベロッパーTV(2023年12月)</a><UL><LI><A HREF="https://www.youtube.com/watch?v=IDE5fzc2css">Replay (1/1)</A></LI></UL></LI></UL></LI>
<li>Live Seminar<ul><li></LI></UL></LI>
<li>Community Event<ul><li></LI></UL></LI></UL>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-55944387407839239152023-11-15T09:38:00.002+09:002023-11-15T09:49:31.776+09:00Microsoft Monthly Update 2023/11今日はMicrosoftのセキュリティアップデートの日です。<BR />
<a href="https://msrc.microsoft.com/update-guide/releaseNote/2023-Nov">2023 年 11 月のセキュリティ更新プログラム - リリース ノート - セキュリティ更新プログラム ガイド - Microsoft</a><BR />
<a href="https://msrc.microsoft.com/blog/2023/11/202311-security-update/">2023 年 11 月のセキュリティ更新プログラム (月例) | MSRC Blog | Microsoft Security Response Center</a><BR />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-39219205426772343692023-11-09T11:25:00.001+09:002023-11-09T11:25:45.153+09:00Firebirdロードマップ(2023/11)<A HREF="https://firebirdsql.org/en/news/firebird-4-0-4-sub-release-is-available/">Firebird 4.0.4がリリース</A>されましたが、<a href="https://firebirdsql.org/">Firebird</a>のロードマップも更新されています。<br />
<br />
<a href="https://firebirdsql.org/en/roadmap/">Firebird: Roadmap</a><br />
<br />
適当な要約
<ul><li>Firebird 2.0 - 2012年に開発終了。最新版は2012年04月の<a HREF="https://www.firebirdsql.org/en/firebird-2-0/">2.0.7</A>。</LI>
<li>Firebird 2.1 - 2014年に開発終了。最新版は2014年12月の<a HREF="https://www.firebirdsql.org/en/firebird-2-1/">2.1.7</A>。</LI>
<li>Firebird 2.5 - 2019年に開発終了。最新版は2019年06月の<a HREF="https://www.firebirdsql.org/en/firebird-2-5/">2.5.9</A>。</LI>
<li>Firebird 3.0 - 安定版。最新版は2023年08月の<a HREF="https://www.firebirdsql.org/en/firebird-3-0-11/">3.0.11</A>で、半年ごとの更新、次回(3.0.12)は2024年第2四半期内を予定。</LI>
<li>Firebird 4.0 - 安定版。最新版は2023年11月の<A HREF="https://www.firebirdsql.org/en/firebird-4-0-4/">4.0.4</A>で、四半期ごとの更新、次回(4.0.5)は2024年第2四半期内を予定。</LI>
<li>Firebird 5.0 - 2021年05月に開発開始、2023年03月に最初のベータ版(<a href="https://www.firebirdsql.org/en/firebird-5-0-0-beta1/">5.0.0 Beta 1</a>)をリリース。</LI></UL>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-2612752947383984172023-11-09T11:17:00.001+09:002023-11-09T11:17:20.715+09:00Firebird 4.0.4<a HREF="https://www.firebirdsql.org/">Firebird</A> 4.0.4がリリースされています。<br />
<br />
<a href="https://www.firebirdsql.org/en/firebird-4-0-4/">Firebird: Firebird 4.0.4</a><br />
<a href="https://www.firebirdsql.org/file/documentation/release_notes/html/en/4_0/rlsnotes40.html">Firebird 4.0.4 Release Notes</a> (<A HREF="https://www.firebirdsql.org/file/documentation/release_notes/Firebird-4.0.4-ReleaseNotes.pdf">PDF</A>)<br />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-44104868603445408942023-11-08T10:51:00.018+09:002024-02-13T15:00:20.178+09:00RAD Studio/Delphi/C++Builder 12 AthensリリースRAD Studio/Delphi/C++Builder 12 Athensがリリースされています。<br />
<br />
<a href="https://docwiki.embarcadero.com/RADStudio/Athens/ja/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8">RAD Studio 12 Athens ヘルプ</a> (<a href="https://docwiki.embarcadero.com/RADStudio/Athens/en/Main_Page">en</a>)<br />
<a href="https://docwiki.embarcadero.com/RADStudio/Athens/ja/%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9_%E3%83%8E%E3%83%BC%E3%83%88">リリース ノート</a> (<a href="https://docwiki.embarcadero.com/RADStudio/Athens/en/Release_Notes">en</a>)<br />
<a href="https://docwiki.embarcadero.com/RADStudio/Athens/ja/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_%E3%83%8E%E3%83%BC%E3%83%88">インストール ノート</a> (<a href="https://docwiki.embarcadero.com/RADStudio/Athens/en/Installation_Notes">en</a>)<br />
<a href="https://docwiki.embarcadero.com/RADStudio/Athens/ja/%E6%96%B0%E6%A9%9F%E8%83%BD">新機能</a> (<a href="https://docwiki.embarcadero.com/RADStudio/Athens/en/What%27s_New">en</a>)<br />
<a href="https://docwiki.embarcadero.com/RADStudio/Athens/e/index.php/New_features_and_customer_reported_issues_fixed_in_RAD_Studio_12.0">New features and customer reported issues fixed in RAD Studio 12.0</a><br />
<a href="https://docwiki.embarcadero.com/PlatformStatus/en/Main_Page">Platform Status</a><br />
<br />
ポータルサイトからダウンロード可能です<br />
<DEL><a href="https://my.embarcadero.com/#downloadDetail/1610">RAD Studio, Delphi, C++Builder 12.0 Web Install</a></DEL><br />
<a href="https://my.embarcadero.com/#downloadDetail/1702">RAD Studio, Delphi, C++Builder 12.0 Inline with Patch 1 Web Install</a><br />
<a href="https://my.embarcadero.com/#downloadDetail/1611">RAD Studio, Delphi, C++Builder 12.0 ISO</a><br />
<a href="https://my.embarcadero.com/#downloadDetail/1609">BDE for RAD Studio 12.0</a><br />
<a href="https://my.embarcadero.com/#downloadDetail/1661">Embarcadero General Packages Download for RAD Studio 12.0</a><br />
<br />
<a href="https://blogs.embarcadero.com/ja/announcing-the-availability-of-rad-studio-12-athens-ja/">『RAD Studio 12 Athens』の提供開始</a> (<a href="https://blogs.embarcadero.com/announcing-the-availability-of-rad-studio-12-athens/">en</a>)<br />
<br />
<a href="https://blogs.embarcadero.com/ja/whats-coming-in-delphi-and-cbuilder-libraries-ja/">Delphi/C++Builderライブラリに関する今後の展望</a> (<a href="https://blogs.embarcadero.com/whats-coming-in-delphi-and-cbuilder-libraries/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/delphi-supports-android-api-33-via-yukon-beta-ja/">Android API 33サポートはRAD Studio 12ベータ(Yukon)で実施</a> (<a href="https://blogs.embarcadero.com/delphi-supports-android-api-33-via-yukon-beta/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/yukon-beta-blog-delphi-language-modernizing-string-literals-ja/">Delphi言語: 文字列リテラルのモダナイゼーション</a> (<a href="https://blogs.embarcadero.com/yukon-beta-blog-delphi-language-modernizing-string-literals/">en</a>)<br />
<a href="https://blogs.embarcadero.com/clang-v15-compiler-support-coming-to-cbuilder-12/">Clang v15 compiler support coming to C++Builder 12</a><br />
<a href="https://blogs.embarcadero.com/ja/multi-device-icon-generator-ja/">RAD Studio 12ベータ情報: マルチデバイスに対応したアイコンジェネレータ</a> (<a href="https://blogs.embarcadero.com/multi-device-icon-generator/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/yukon-beta-blog-nativeint-as-a-weak-alias-ja/">RAD Studio 12ベータ情報: 弱いエイリアスの導入による「NativeInt」の対応</a> (<a href="https://blogs.embarcadero.com/yukon-beta-blog-nativeint-as-a-weak-alias/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/win64-clang-toolchains-in-rad-studio-12-ja/">RAD Studio 12のWin64 Clangツールチェーン</a> (<a href="https://blogs.embarcadero.com/win64-clang-toolchains-in-rad-studio-12/">en</a>)<br />
<a href="https://blogs.embarcadero.com/yukon-beta-blog-c-and-visual-assist-in-rad-studio-12-0/">[Yukon Beta Blog] C++ and Visual Assist in RAD Studio 12.0</a><br />
<a href="https://blogs.embarcadero.com/ja/3-x-12-vcl-enhancements-in-delphi-12-ja/">Delphi 12における3 x 12 VCLの機能強化</a> (<a href="https://blogs.embarcadero.com/3-x-12-vcl-enhancements-in-delphi-12/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/3-x-12-firemonkey-and-android-enhancements-in-delphi-12-ja/">Delphi 12における3 x 12 FireMonkeyとAndroidの機能強化</a> (<a href="https://blogs.embarcadero.com/3-x-12-firemonkey-and-android-enhancements-in-delphi-12/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/3-x-12-rtl-data-and-internet-enhancements-in-delphi-12-ja/">Delphi 12における3 x 12 データ、インターネット、RTLの機能強化</a> (<a href="https://blogs.embarcadero.com/3-x-12-rtl-data-and-internet-enhancements-in-delphi-12/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/3-x-12-ide-installer-and-delphi-language-enhancements-in-delphi-12-ja/">Delphi 12における 3 x 12 IDE、インストーラー、Delphi 言語の機能強化</a> (<a href="https://blogs.embarcadero.com/3-x-12-ide-installer-and-delphi-language-enhancements-in-delphi-12/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/zxing-delphi-zebra-crossing-demo-updated-for-rad-studio-12-android-and-ios-ja/">Delphi 12向けに更新されたZXingデモアプリ(Android 13と iOS 17で動作済み)を公開</a> (<a href="https://blogs.embarcadero.com/zxing-delphi-zebra-crossing-demo-updated-for-rad-studio-12-android-and-ios/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/rad-studio-12-questions-and-answers-ja/">ウェビナーへ寄せられたRAD Studio 12 に関するQ&A</a> (<a href="https://blogs.embarcadero.com/rad-studio-12-questions-and-answers/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/sqids-integration-with-rad-server-and-standalone-library-ja/">Sqids: RAD Serverとの統合およびスタンドアロンライブラリ</a> (<a href="https://blogs.embarcadero.com/sqids-integration-with-rad-server-and-standalone-library/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/gorgeous-new-premium-app-styles-for-rad-studio-12-free-with-your-subscription-ja/">RAD Studio 12向けに新しいプレミアムスタイルを提供</a> (<a href="https://blogs.embarcadero.com/gorgeous-new-premium-app-styles-for-rad-studio-12-free-with-your-subscription/">en</a>)<br />
<a href="https://blogs.embarcadero.com/ja/delphi-cbuilder-12-skia-support-ja/">Delphi / C++Builder 12のSkiaサポートで表現力豊かなUIを構築</a><br />
<br />
<a href="https://github.com/Embarcadero/RADStudio12Demos">GitHub - Embarcadero/RADStudio12Demos: Delphi and C++Builder Demos for Embarcadero RAD Studio version 12</a><br />
<br />
2024/02/10追記: インストーラが<A HREF="/2024/02/radstudio-12-athens-patch-1.html">Patch 1</A>を含むものに差し替えられています。またBDEおよびEmbarcaderoが提供する主要なパッケージのローカルGetItパッケージもポータルサイトからダウンロードできるようになっています。ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-2038472845587636192023-11-01T00:00:00.009+09:002023-12-04T10:30:37.440+09:002023/11開催のセミナー<ul><li>Web Seminar<ul><li>2023/11/13 16:00-17:00(JST) <a href="https://www.embarcadero.com/jp/events-japan/webinar/developers-tv">RAD Studio 12特集 - エンバカデロ・デベロッパーTV(2023年11月)</a></a><UL><LI><A HREF="https://www.youtube.com/watch?v=jkJFi5OIV2Q">Replay (1/1)</A></LI></UL></LI></UL></LI>
<li>Live Seminar<ul><li></LI></UL></LI>
<li>Community Event<ul><li></LI></UL></LI></UL>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-7474302230012013472023-10-19T23:59:00.001+09:002023-10-20T09:58:55.895+09:00[書籍]C++ソフトウェア設計<a HREF="https://store.kinokuniya.co.jp/store/shinjuku-main-store/">紀伊國屋書店新宿本店</A>で<a href="https://www.oreilly.com/library/view/c-software-design/9781098113155/">C++ Software Design</a> (<a href="https://www.amazon.com/dp/1098113160">Amazon US</a>)の翻訳である<br />
<br />
<a href="https://www.oreilly.co.jp/books/9784814400454/">C++ソフトウェア設計</a> (<a href="https://www.amazon.co.jp/dp/4814400454">Amazon</a>)/<A HREF="https://github.com/igl42">Klaus Iglberger</A>著/千住治郎訳/オライリー・ジャパン/ISBN 978-4-8144-0045-4/4,400円<br />
<br />
を購入。ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-28875602837417171362023-10-17T09:51:00.006+09:002023-10-17T12:00:10.116+09:00InterBase 2020 Update 5InterBase 2020 Update 5がリリースされています。バージョンは14.5.0.864となっています。<br />
<br />
<a href="https://docwiki.embarcadero.com/InterBase/2020/en/InterBase_2020_Update_5_Readme">Release Notes for InterBase 2020U5 - InterBase</a><br />
<a href="https://docwiki.embarcadero.com/InterBase/2020/en/What%27s_New_in_InterBase_2020_Update_5">What's New in InterBase 2020 Update 5 - InterBase</a><br />
<a href="https://docwiki.embarcadero.com/InterBase/2020/en/Resolved_Defects">Resolved Defects - InterBase</a><br />
<br />
<a href="https://blogs.embarcadero.com/ja/embarcadero-interbase-2020-update-5-released-ja/">Embarcadero InterBase 2020 Update 5 のリリース</a> (<a href="https://blogs.embarcadero.com/embarcadero-interbase-2020-update-5-released/">en</a>)ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-54499457679995276782023-10-11T09:43:00.001+09:002023-10-11T09:43:47.601+09:00Microsoft Monthly Update 2023/10今日はMicrosoftのセキュリティアップデートの日です。<BR />
<a href="https://msrc.microsoft.com/update-guide/releaseNote/2023-Oct">2023 年 10 月のセキュリティ更新プログラム - リリース ノート - セキュリティ更新プログラム ガイド - Microsoft</a><BR />
<a href="https://msrc.microsoft.com/blog/2023/10/202310-security-update/">2023 年 10 月のセキュリティ更新プログラム (月例) | MSRC Blog | Microsoft Security Response Center</a><BR />ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-20406759030871549922023-10-02T23:59:00.022+09:002023-10-03T09:43:42.264+09:00[書籍]より正確な見積を作るための本<a HREF="https://store.kinokuniya.co.jp/store/shinjuku-main-store/">紀伊國屋書店新宿本店</A>で<br />
<br />
<a href="https://www.shuwasystem.co.jp/book/9784798070735.html">より正確な見積を作るための本</a> (<a href="https://www.amazon.co.jp/dp/4798070734">Amazon</a>)/<A HREF="https://sl-inc.co.jp/company/company01/">牧石幸士</A>著/秀和システム/ISBN 9784798070735/2,750円<br />
<br />
を購入。ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0tag:blogger.com,1999:blog-3196825912020730129.post-67049519218285253082023-10-01T00:00:00.005+09:002023-10-18T14:32:33.830+09:002023/10開催のセミナー<ul><li>Web Seminar<ul><li>2023/10/31 17:00-17:45(JST) <a href="https://www.embarcadero.com/jp/events-japan/webinar/developers-tv">Web API再入門!RAD Serverを使おう - エンバカデロ・デベロッパーTV(2023年10月)</a><UL><LI>Replay (1/1)</LI></UL></LI></UL></LI>
<li>Live Seminar<ul><li></LI></UL></LI>
<li>Community Event<ul><li></LI></UL></LI></UL>ふーhttp://www.blogger.com/profile/13451109687277076013noreply@blogger.com0