ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

Delphi 開発環境で欲しかったモノが出そろってきた

どゆこと?

以前、Rad Studio 勉強会にて以下のような発表したんですよ。

www.slideshare.net

で、導入したいなーってことで以下3つがありました。

  1. ソースコードの分析
  2. テストコード実行の簡略化
  3. Git との統合

で、このうち2つが揃った! って話です!!

続きを読む

REST.JSON での直列化

JSON の色々を調査中で、その一環として見つかったので書きます。
こんな書き方すると各方面の方に怒られますが、手続き的に。

procedure TForm1.JSON;
var
  PersonList: TList<TPerson>;
  JsonObj: TJSONObject;
begin
  PersonList := nil;
  JsonObj := nil;

  try
    PersonList := TObjectList<TPerson>.Create();
    PersonList.Add(TPerson.Create());
    PersonList.Last.Name := 'Alice';
    PersonList.Last.EMail := 'Alice@wonderland.org';


    PersonList.Add(TPerson.Create());
    PersonList.Last.Name := 'Bob';
    PersonList.Last.EMail := 'Bob@wonderland.org';


    JsonObj := TJSON.ObjectToJsonObject(PersonList);
    Memo1.Lines.Clear();
    Memo1.Lines.Add(JsonObj.GetValue('items').ToString)

  finally
    FreeAndNil(JsonObj);
    FreeAndNil(PersonList);
  end;
end;

で、実行したやつを整形した奴が、以下になります。

[
    {
        "eMail": "Alice@wonderland.org", 
        "name": "Alice"
    }, 
    {
        "eMail": "Bob@wonderland.org", 
        "name": "Bob"
    }
]

Memo1.Lines.Add(JsonObj.GetValue('items').ToString) としているのは、データ以外の物もくっついてくるから。

Memo1.Lines.Add(JsonObj.ToString) にすると、以下の通り。

{
    "items": [
        {
            "eMail": "Alice@wonderland.org", 
            "name": "Alice"
        }, 
        {
            "eMail": "Bob@wonderland.org", 
            "name": "Bob"
        }
    ], 
    "listHelper": [
        2
    ], 
    "ownsObjects": true
}

総合すると、使えないことないけどやりやすいかと言われると微妙、という所。
Delphi のアプリケーションだけでやりとりするならともかく、他言語が絡んでくると items 以外は邪魔だし・・・

まぁ、REST.* のパッケージ多めなので、その辺含めて要確認ですな。

参考
Building Delphi Classes from JSON • DelphiABall

ガチガチに緊張しながら Scala Matsuri 2016 の LT で発表した

やるんだよね(ニッコリ) と再三再四背中を押していただいての発表と相成りました。
生放送で流れると当日確認してさらに死にかける罠。

内容はこんな感じ

1行もコード無し!!!
ええやん、軽めのやつがあっても…
でもやってよかったかな。
かなりガチ勢が多かったのですし、ドワンゴの方が半数ですし、ゆるい内容もあっていいでしょう。
うん、そう思おう。

本編まとめはまた別途。

2015年歳末棚卸し

Twitter 見ながらふりかえり。

なんか、色々積もり積もったものを頑張った1年だったかなぁ、と感じます。
特に CI 環境については、なんでできないんだろうを一つ一つ潰して、やっとできるようになったので、
結構感慨深くあります。*1

Podcast やブログ記事を見ながら、そうそうや違うんじゃね、と自分の意見も強く持てるようになりました。
この辺は新しい課に異動したことによる恩恵ですね。同じく課員となった方や同じプロジェクトを進めている方が僕と違う観点をもってられるので、とてもありがたいです。
どうしても技術よりになるところを、製品としてどうなのかと諌めてもらっている感じがします。

で、来年はもうちょっとコードを出していきます。
関数型も勉強していいところとかも見えてきたので、その辺を反映したコードを出す感じですかね。
この間の RadStudio 勉強会で LT した内容も、関数型を受けての出力なので。

最後に、来年はバグに当たらない年がいいかなぁ…

*1:そういやブログに書くって言って、書いてない…

DevLOVE現場甲子園2015『西日本大会』に参加してきた

devlove-kansai.doorkeeper.jp

ということで、行ってきました。
かるい気持ちの参加*1ではあったんですが、とてもタメになる会になりました。いやー、よかった。

今年のテーマは「現場のDiff」ということで、改善した差分や立場の差分、考え方の差分についての発表がありました。

以下感想です。

*1:会場は弊社ですた。裏方をちょっとやったり

続きを読む

Delphi の IFuture やら ITask やら

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, System.Threading,
  System.Generics.Collections, System.Classes;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
    function GetRandomInt(): IFuture<Integer>;
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  TTask.Run(
    procedure
    var
      Tasks: array[0..4] of ITask;
      ValueStrs: array[0..4] of string;
      ii: Integer;
      Sum: Integer;
    begin

      for ii := 0 to 4 do
      begin
        Tasks[ii] := GetRandomInt().Start;
      end;

      TTask.WaitForAll(Tasks);

      Sum := 0;
      for ii := 0 to 4 do
      begin
        Sum := Sum + IFuture<Integer>(Tasks[ii]).Value;
        ValueStrs[ii] := IFuture<Integer>(Tasks[ii]).Value.ToString();
      end;

      TThread.Synchronize(nil,
        procedure
        begin
          ShowMessage(string.Join(' + ', ValueStrs) + ' = ' +  Sum.ToString());
        end
      );
    end
  );
end;

function TForm1.GetRandomInt: IFuture<Integer>;
begin
  Result := TTask.Future<Integer>(
    function: Integer
    begin
      Result := Random(100);
      Sleep(Result * 100);
    end
  );
end;

end.

一応出来たけどさ・・・
無名関数が多すぎ。
あと型推論ジェネリクス書かなくて良くなるともうちょいマシかな。

function TForm1.GetRandomInt: IFuture<Integer>;
begin
  Result := TTask.Future(
    function: Integer
    begin
      Result := Random(100);
      Sleep(Result * 100);
    end
  );
end;

これとかエラーになるけど、前後見たら普通に補ってくれてもー、とちと思ってしまう。

Delphi 10 Seattle Professional 買ったった。お値段なんと・・・

持ってなかったんです。

会社のライセンスと社内のPCだけで色々頑張ってました。
だって高いんですよ・・・

今回の購入金額、17万5千円
何気に今までの人生の中で、5本の指に入る購入金額な気がする・・・
XE8 だと、13万ぐらいだったんですけどねー。
ライセンスがどうのであがりましたね。
買収されたけどこの辺どうなるんでしょう。ちょっと不安。

何はともあれ、買ったからには本腰入れてやりますとも。
直近は Rad Studio 勉強会のネタ作り。

rad-studio-osaka.doorkeeper.jp

あ、Rust も勉強中だよ!

与太話

www.embarcadero.com

おもーい公式サイトなんですけどさらにはた迷惑なことに、一部リンクがアメリカ経由っぽいんですよね・・・
以下流れ

アメリカサーバーへリクエスト  
  ↓  
2~4秒後、レスポンスで 303 が返ってくる  
  ↓  
jp へアクセス  
  ↓  
2から4秒後ページ表示完了  

日本サイトだけってわけじゃあなくて、アメリカ以外全部そうなんだよなぁ・・・
誰に言えばいいのやら。