ソモサン

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

GW 読書強化週間!

の予定だった

GW の間に積み本消化してやるぜ!といきごんでいたのです。
ところがどっこい、読み切れたのは2冊でした。

その紹介と感想をば。

エッセンシャル スクラム

精神的ダメージを多分に負いました。GW 中でなければ読み切れなかった気がしますw
スクラムについてのこうあるべき、なぜなら~をざらっと知れたので読んでよかったかなーって所です。 で、やっぱり3役に求められるスキルセットは各々だいぶちがうな、ってのが明確になりました。
この辺の責任境界はしっかりした方がいいんでしょうね。

あとですね、政治のにほいがそこはかとなく…
というのも、結構なページを割いて、経営レベルでのスクラム的な方法論や組織論への言及があったからです。
この辺のレベル感は DDD でも近しいものがありました。戦術と戦略やったと思います。
スクラムで定義されているのは戦術レベルまでやけど、戦略レベルやってるところも多いし書いとくねーてかんじです。
政治は分からないです。

技術的負債という皆大好きなワードもありました。
かくいう僕もがっつり読んだんですが、考え方は良いなーってところです。 スケジュールを詰めれば、その詰めた分だけの負債をコード上で背負うわけで。 で、利子ついた負債の返済額と遅延コストを比較してどうのってやつです。

いずれにしても、僕自身開発一辺倒な輩なので視点を広げる意味ではよかったです。

闘うプログラマー

こいつはだいーぶ積んでましたな。
Windows NT なんてばかでかいもの作ればそらもう紆余曲折あるわけですが、そいつの開発記です。bash on Windows に思いをはせながら読みました。
で、すっごい人間くさい話でした。おそらく、登場人物の誰がしかに自分を重ねるでしょうし、周りの誰かも重なるでしょう。

僕はこうでした。ネタバレになるので、詳細ははしょります。

読んでる途中

数学パズル

自分の劣化具合に愕然としているところ。ちょくちょく解いてます。Rustで。

マダマダイッパイ

エッセンシャル スクラムは内容的にも分量的にもきつかたです。 次のときにはうすめの本から手を出します。
ただ、祝日がとおいんだよなぁ…

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;

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