布団が俺を呼んでいる

丘山大一のぶろぐ

Delphi 戻り値色々

関数の戻り値の指定とその時の戻り値。
適当な実装をした場合、戻り値は不定になるのか? というか不定って何?
というような適当実験。
今回長い。


その1

function TForm1.Hoge: string; 
begin

end; 

実装
無名メソッドではなく、普通のメソッド。
実装は空っぽ。

結果
空文字。


その2

function TForm1.Hoge: string;
begin
  Result := (function : string
             begin

             end)();

  if not Result.IsEmpty then Exit('123');

  Result := (function : string
               begin
                 Result := 'abc';
             end)();
end;

実装
「実装が空っぽ」の無名メソッドを呼び出し、
その時の戻り値が空かどうか調べ、(空でないならExit)
最後まで到達したら無名メソッドで「abc」を返します。

結果
abc

考察
「実装が空っぽ」の無名メソッドであっても、変な値を返すわけではないようです。


その3

function TForm1.Hoge: string;
var
  i : Integer;
begin
  for i := 0 to 1 do
  begin
    Result := (function : string
               begin

               end)();

    if not Result.IsEmpty then Exit('123');

    Result := (function : string
               begin
                 Result := 'abc';
               end)();
  end;
end;

実装
「実装が空っぽ」の無名メソッドを呼び出し、
その時の戻り値が空かどうか調べ、(空でないならExit)
最後まで到達したら無名メソッドで「abc」を返します。
上記をループで2回実行します。

結果
123

考察
デバッグすると分かりますが、一回目のループでのResultは
・Result := 空
・Result := abc
であり、
二回目のループで
・Result := abc のまま!
・Exit句で123 で抜ける
という動作をします。
一個目の無名メソッドが「何もしない何か」あるいは「abcを返す」ようです。


その4

function TForm1.Hoge: string;
var
  i : Integer;
begin
  for i := 0 to 1 do
  begin
    Result := (function : string
               begin
                 Result := '';
               end)();

    if not Result.IsEmpty then Exit('123');

    Result := (function : string
               begin
                 Result := 'abc';
               end)();
  end;
end;

実装
「空文字を返す」の無名メソッドを呼び出し、
その時の戻り値が空かどうか調べ、(空でないならExit)
最後まで到達したら無名メソッドで「abc」を返します。
上記をループで2回実行します。

結果
abc

考察
一個目の無名メソッドで「Result := '';」を明示すれば、きちんと空文字を返すようになり、本体メソッド結果はabcになります。


その5

function TForm1.Hoge: string;
var
  i : Integer;
begin
  for i := 0 to 1 do
  begin
    if i = 1 then
    begin
      Result := (function : string
                 begin

                 end)()
                 +
                (function : string
                 begin

                 end)();
      Exit;
    end;

    Result := (function : string
               begin
                 Result := 'abc';
               end)();
  end;
end;

実装
1回目のループではResult にabcを入れて、
2回目のループで実装が空っぽの無名メソッドの戻り値をくっつけてExit。

結果

考察
ループさせた時の「実装が空っぽ」の無名メソッドは、先ほどみた限りでは「何もしない何か」or「abcを返す」でしたが、今回は「空」が返ってきます。


その6

function TForm1.Hoge: string;
type
  TAct = reference to function : string;
var
  act : TAct;
begin
  act := (function : string
          begin

          end);

  Result := (function : string
             begin
               Result := 'abc';
             end)();
end;

実装
無名メソッドの代入先を宣言してみます。
宣言だけして、使用しません。

結果
abc

考察
まあ当たり前ですね。


その7

function TForm1.Hoge: string;
type
  TAct = reference to function : string;
var
  act : TAct;
begin
  act := (function : string
          begin

          end);

  Result := (function : string
             begin
               Result := 'abc';
             end)();
  Result := act;
end;

実装
無名メソッドの代入先を宣言してみます。
一度別の値を無名メソッドで入れて、
最後に空っぽのメソッドを呼び出します。

結果
abc

考察
またしても「何もしない何か」or「abcを返す」となりました。


その8

function TForm1.Hoge: string;
type
  TAct = reference to function(n :Integer) : string;
var
  act : TAct;
  i : Integer;
begin
  act := (function(n :Integer):string
          begin
            if n = 0 then Exit('あいうえお');
            if n = 1 then Exit;
          end);

  for i := 0 to 1 do
  begin
    Result := act(i);
  end;
end;

実装
引数に応じて戻り値を返す無名メソッドです。
n = 0 の時は「あいうえお」
n = 1 の時は特に戻り値を指定しません。
この無名メソッドをループで2回呼び出します。

結果
あいうえお

考察
2回目の結果が「何もしない何か」or「あいうえおを返す」となりました。


その9

function TForm1.Fuga(n: Integer): string;
begin
  if n = 0 then Exit('あいうえお');
  if n = 1 then Exit;
end;

function TForm1.Hoge: string;
var
  i : Integer;
begin
  for i := 0 to 1 do
  begin
    Result := Fuga(i);
  end;
end;

実装
無名メソッドを止めてみた

結果
あいうえお

考察
2回目の結果が「何もしない何か」or「あいうえおを返す」となりました。


その10

function TForm1.Fuga(n: Integer): string;
begin
  if n = 0 then Exit('あいうえお');
  if n = 1 then Exit;
end;

function TForm1.FugaFuga(n: Integer): string;
begin
  if n = 0 then Exit('かきくけこ');
  if n = 1 then Exit;
end;

function TForm1.Hoge: string;
begin
  Result := Fuga(0);
  Result := FugaFuga(1);
end;

実装
似ている二つのメソッドを実装、呼び出してみた。
引数0の時は戻り値を指定して返す。
引数1の時は戻り値を指定しない。

結果
あいうえお

考察
2回目の結果が「何もしない何か」or「別メソッドの結果を返す」となりました。



というわけで


なんとなくわかると思いますが、
・メソッドの戻り値にはデフォルト値がある(今回はstringなので空文字)
・戻り値を明示しない場合、「何もしない」
・戻り値を明示せず、かつメソッドの戻り値を直参照するとデフォルト値を返す
のような動きをします。
「不定」というのは変な値になることではなく、戻り値として参照できる値を返す、といった結果になるようです。
Resultに格納されているアドレスや関数の呼び出し順序なんかに依存してるんでしょう。たぶん。
(ここにきて超絶適当)

Result を初期化するクセをつけておけばいいというだけの話でした。



OBJECT PASCAL HANDBOOK―マルチデバイス開発ツールDelphiのためのプログラミング言語完全ガイド

新品価格
¥6,480から
(2017/8/16 20:52時点)

Delphi 関数の戻り値の指定方法

代表的なもの、ちょくちょく使われるもの、多分存在すら知られていないもの。

下記のどれでも指定可能

function TForm1.Hoge: string;
begin
  Hoge := 'abc';
  Result := '123';
  Exit('あいうえお');
end; 

Result,Exitでの指定は有名。
関数名で戻り値を指定できるのはあまり知られていないと思う。
見にくくなるだけなので使わないけど。




OBJECT PASCAL HANDBOOK―マルチデバイス開発ツールDelphiのためのプログラミング言語完全ガイド

新品価格
¥6,480から
(2017/8/16 20:52時点)

コミックマーケット C92 参加しました

人生初のコミケでした。
疲れた。
一日目だけなのに疲れるのね。

まずはお詫び

Hololensは持っていきましたが、特に「どう使おう」とか考え��なかったので、(ブースにいらした方に使っていただこうという考えを当初持っていなかった)上手いことお見せすることができませんでした。
いらした方ごめんなさい!!
本当はもっと面白いんです!

言い訳

人が多すぎて、Hololens アプリの設置がしにくいのおおおお(+_+)
ホールが広すぎて、空間認識が上手くいかないのおおおおお(+_+)
Hololens の電池は2時間くらいしかが持たないのおおおおお(+_+)



買ってきたものや貰ってきたもの



+「一人月 Tシャツ」も買いました。
この人https://twitter.com/kowillm曰く、
「一人で一人月って数えられるとは、ホワイトな職場ですね!」
そういう考え方もあるネ!
悲しいけど、残業込みでカウントするから、一人で一人月超カウントできるのよね……。
そう考えると白字のTシャツはホワイトの証だったのかしらん。

あれ、見返してみたら、殆ど業界向けのモノだな?


想像したものと異なるコミケ

行く前までは、コミケは「祭り」の類だと思っていたのですが、どちらかといえば「市場」みたいだと思いました。
ちょっと疑問を抱くところもあり、理解できたところもあり。
なんですが、当ブログの趣旨とは外れる感じなので以下略ということで。



コミックマーケット 92 カタログ

新品価格
¥2,500から
(2017/8/13 23:41時点)

Windows 10 Mobile Windows Update 後の再起動ににかかる時間(10.0.15063.483)

SurfaceとHololensとWindows10 Mobile と……ああUpdateが大変。


今回はこんな感じ

アップデートファイルのダウンロードや更新自体は済。再起動にかかる時間だけです。
合計17分程度で更新が完了しました。
普段よりちょっとだけ時間がかかった感じ。
状況によって時間は大きく前後すると予想されますので、目安の一つとして。


バージョン

端末はNuAns Neoです。
本日時点の各バージョンは、
バージョン:1703
OSビルド:10.0.15063.540
ファームウェアリビジョン番号:1028.020.001.95
ハードウェアリビジョン番号:1.0
無線ハードウェアバージョン:1.0
チップSOCバージョン:8952


届いてしまった(Updateとは関係ない話)

注文したのすっかり忘れてたよ。



後で見ましょ(そして積んでいくパターン)




【Amazon.co.jp限定】コレクター・ユイ DVD-BOX1&2セット(特典:オリジナルB2布ポスター)

新品価格
¥33,480から
(2017/8/9 22:05時点)

コミックマーケット C92 参加します

行くかどうかは知らない。
ここのところ更新がなかったのはだいたいこのイベントのせい。

「東た-14b」らしいです。
コミケ行ったことないから全然想像つかん。



お品書き


値段は未定ですが、
  • DEGARASHI BOOK VOL.1
  • DEGARASHI BOOK VOL.2
  • でがらし BOOK mini
になると思われます。
タイトルあってたっけ? まあ大体あってるでしょ(編集担当のいい加減さよ)
私は3冊全てに名前が出てますが、実質的なデビューは今回の「DEGARASHI BOOK VOL.2」です。
Hololens 開発の超初学者向けの内容を書きました。
なぜ初学者向けかというと私が初学者だからですw
そんな本ですが、よろしければお求めくださいませ。






コミックマーケット 92 カタログ

新品価格
¥2,498から
(2017/8/2 22:33時点)

ブルスク!(NVIDIA)への対応 wushowhide

自分メモ。
ブルスクはいかんともし難い。

トラブル

時間が空いたので、解決したかな~と思ったがダメだった。
やっぱりNVIDIA のグラフィックドライバが入るとBSODする。

対応

wushowhideを使うと、WIndows 10 でもアップデートの一部を止められるようになる。
使い方含め、上記リンクを見てもらうのが一番かと。




背景布 クロマキー 写真撮影用 Happyjoy ブルー 1.6x3m 大サイズ 厚地 青 画像合成

新品価格
¥1,611から
(2017/7/21 21:56時点)

Windows 10 Mobile Windows Update 後の再起動ににかかる時間(10.0.15063.483)

視界の隅で再起動していることに気が付き、慌てて計測開始。


今回はこんな感じ

アップデートファイルのダウンロードや更新自体は済。再起動にかかる時間だけです。
合計15分程度で更新が完了しました。
状況によって時間は大きく前後すると予想されますので、目安の一つとして。


バージョン

端末はNuAns Neoです。
本日時点の各バージョンは、
バージョン:1703
OSビルド:10.0.15063.483
ファームウェアリビジョン番号:1028.020.001.95
ハードウェアリビジョン番号:1.0
無線ハードウェアバージョン:1.0
チップSOCバージョン:8952


私の端末で残っている不具合

Windows 10 Mobile の Minecraft PE、大分前から起動しなくなってしまったのですが、今回も直りませんね。
やっぱりゲーム側の問題なのかな?
Continum も、一日経過すると接続できなくなるという現象があるのですが、こちらも直っていないようです。
(再起動することで再説できるようになるが、超面倒)
Adapter のファームウェアアップデートがあったから期待したんですが・・・・・・。



mouse SimフリーWindowsPhone (Simフリー/Windows10 Mobile/Office Mobile/大画面 6型フルHD/3GBメモリ/保護シート付) MADOSMA Q601

新品価格
¥20,175から
(2017/6/18 00:01時点)

千年戦争アイギス「ア」から始まる特別企画

「ア」から始まる企画です。さてなんでしょう?


回答欄

「アニメ化」


「アルスラーン戦記とのコラボ」


私の反応

「あれー?」


コラボで男キャラを前面に押し出してくるとはな!
2周年記念、3周年記念で、最高レアリティ男キャラを実装してくるだけはありますね。


第二覚醒も来るのか ↓ 持ってないけど(出ないんだけど)。

千年戦争アイギス 白き射手ナナリー 覚醒ver.

新品価格
¥12,096から
(2017/7/5 22:27時点)

Microsoft To-Do が起動しなくなった

なんか解決した。

経緯

Windows 10 Mobile で入力中にクラッシュ。
起動できなくなる(起動しても、勝手に終了してしまう)。
PC側でアプリを起動しても、起動後フリーズ。


対応

Microsoft To-Do はWeb 版もあるので、そちらからアクセスしてみた。
すると問題なし。
翌日になると、Windows 10 Mobile から起動できるようになっていた。
ただし、To-Do リストを見ようとするとフリーズ。
再度Web版の表示と比較すると、アプリ版とTo-Do の表示件数が異なっていることに気がついた。
Web版でTo-Do の一部を削除、完了とさせ、再度Windows 10 Mobile から起動すると、同期され無事に起動できるように。


推測とか

おそらく、クラッシュした際に壊れたデータができてしまい、それをサーバから取得して読み込もうとしてアプリが死んでしまったのかと。
翌日になると起動できるようになったのは、一定時間ごとにクリティカルな問題を持つサーバのデータをクリアするような機構があるから? でしょうか。
そうだとしても、同期にコケていたので、ちと中途半端ですが。
いくつかTo-Do を整理してから動作することを確認したので、どのTo-Doが問題だったのかはわかっていません。
ちゃんと一つずつ調べればよかった。


対策

動かなくなったら、一日待つ+Web版で操作してみよう!




Windows ストアギフトカード 1,000 円 (Windows/Xbox 360で利用可)|オンラインコード版

新品価格
¥1,000から
(2017/6/29 00:04時点)

職場で開発のやり方を色々変えてみた

経緯

要求仕様は漠然とあるものの、社内向けなのか社外向けなのかすら不明という驚くほど適当な仕事が回ってきました。
また、開始当時は自分ひとりのプロジェクト(?)。ただし要求仕様自体は上流工程である程度作られる……という話でした。
また、後からテストメンバが追加される、という話もありました。ていうか自分ひとりでは行き詰ることが目に見えていたので要求しました。
申請が必要な社内リソースは、そもそもお願いしても使わせてもらえませんでした。

さて、上で「プロジェクト(?)」と書いた通り、この仕事プロジェクトとして回すべきものだったのですが、上記の通りものすごく適当な始め方をしました。有体に言ってプロジェクトとしての体をなしていないです。
私が勤めている会社は、完全にトップダウン型で、ボトムアップの意見は全て死ぬという特徴があります。(社内ではPDCAという言葉をよく見かけるのですが、そもそもPの時点で却下されるので何も変化が起きません。変化がないPDCAってすごいなー)
もっとも、よく言えば統制がとれている、ということもできます。その会社組織において、こんな適当なプロジェクトはまたとないチャンスです。
つまり、専任が私一人しかいない=私が担当者 でやりたい放題に近い、というわけでです。
せっかくなので、これまでのやり方を色々変えてみることにしました。


変更点一覧

ソース管理:TFS → GitBucket
連絡: 電話・メール → Teams
仕様書:Excel → Markdown


ソース管理

TFSはGitではなく従来のもの。チェックアウトしてチェックインして……というものです。
主に一人で開発していくため、ソース管理を怠ると
開発マシンの死=ソースの全滅=プロジェクトの死
となりかねません。というわけで、ソース管理は最重要です。
しかし、TFSは管理責任者がいます。責任者の許可がないとプロジェクトを追加できません。そして上記の通り、申請が必要な社内リソースは使わせてもらえませんでした。
というわけで、以前空いているPCに立てたGitBucketを使うことにしました。
これならGitなのでいちいちチェックアウトなんてしなくても快適に開発を進められます。
また、Issue 管理やWikiも使えるので簡単なプロジェクト管理もできます。


連絡

プログラミング中のプログラマにかける電話の数と、バグの数は比例すると私は考えています。
また、要求仕様を作成する人は、本業のプロジェクトを別に持っており、そちらにリソースの大半を食われていました。そのため、打ち合わせや電話はほぼできません。
よって、非同期に連絡がとれる手段が必須となりました。
そこで、リリースされたばかりのTeams を使うことにしました。これを利用するのに申請不要だった、というのも大きな理由です。
さて、この手の「連絡手段」は、放っておくとメールになってしまうのですが、それは全力で止めました。
具体的に言うと、メールの内容は「私的会話」とみなしました。「メールで送った内容なんですが~」と言ってきたら、「メールだったから読んでない。Teams に上げて」と言いました。
サラリーマンとしては非常に良くない態度なのですが、そうしないと勝手にメールを使い始めてしまうので断行しました。
ここまでメールを拒否したのは、
・後から人員が追加される=その人たちに状況を説明する際、過去のメール全てを確認してもらうわけにはいかない
・増減する人員が不明=誰がメールを必要とするのか全く分からない
・メールだとレスポンスが遅すぎる
・特定の人たちだけで交わされるメールを防止する
という問題と狙いがあったためです。
意外なほどに、メール連絡を止めさせるのは難しいのです。

仕様書

個人的にExcel方眼紙はそこまで嫌いではないのですが、Excel で書かれた仕様書は差分比較がしにくい(できないわけではな���が)のが嫌だったので殆どMarkdown に切り替えました。
差分比較ができないがゆえに一番初めのシートが「更新履歴」になっているというのは本当無駄だと思います。しかも更新履歴に漏れ・間違いがあるという。


色々な反発

変化を嫌う人達はたくさんいます。
変化を受け入れないでPDCAとか笑わせるな、と言いたいですが、PDCAを叫ぶ人ほど変化嫌いで規制こそマネジメントだと思っている節があります。

というわけで、まずソース管理はTFSでやらなきゃダメだ、と駄々をこねる人が出てきました。
私も本音では、そこらのパソコンサーバに建てたGitBucketより、専用サーバで運用されているTFSに乗り換えたかったのですが、いかんせん許可がでないので何もできません。
「じゃあ許可とってきてください」でこの件は終了させました。

次に口頭で済ませようとする人たち。
短期的な時間効率では直接、あるいは電話による口頭は最大効率を誇るコミュニケーション手段なのですが、いかんせん話している人たちにしか情報共有されないんですよね。限られたメンバ間でしか成立しないこのやり方は、今様に言えば「場の共有」がされないコミュニケーションになってしまいます。
もちろん、状況によっては口頭でもいいし、ある程度は許容してきたのですが、基本的にはTeams に上げさせるようにしました。これについては、だんだん理解されてきた(あるいは私が強制したので諦めた?)らしく、後半になると「Teams に上げておきます」という人が増えました。

そしてTeams上で「会話をしない」人たち。
「ほげほげ の件なんだけど、おかしくない?」「ほげほげ の件、どうなってる?」と話題を振ってきた後、他のメンバがそれに応えても、ありがとう も 分かりました も何のレスもなく、解決したのかなんなのか分からないというもの。
多分、メール+トップダウン文化の名残なんでしょうが、やたら投げっぱなしにしてくる人がいます。
これに対しては具体的な打ち手が構築できず、最後まで悩まされました。

Git を使おうとしない人たちも困りました。
最近はVSでもGit が使えるので、VSからTFSにアクセスしている人たちは、Gitも利用できるはずなのですが、なぜか頑なにGitを使おうとしませんでした。
Clone して 中を見てもらうだけでも良かったんですが……。それすらやってもらえませんでした。
Markdwon で仕様書も作っていましたが、これも見向きもされませんでした。悲C。

Temas の大失敗

知らなかったというのが最大の理由なんですが、Teams って会話の中にアップロードしたファイルがsharepoint の中で管理されちゃうんですよね。てっきり使い捨ての領域だと思っていたのですが。
例えば、「キャプチャ.png」の画像を二枚上げると、「上書きする? 別管理する?」というように聞いてきます。
これの何が問題って、書きかけの仕様書がTeams の会話にアップロードされて「どうよ~」「どれどれ~」と言っていたら、そのままそこで仕様書が管理されはじめてしまったんですね。
そこは仕様書の置き場所じゃないっちゅうねん。
と言っても後の祭り。一回運用が始まってしまうと、他で管理することは難しく、あっというまに管理できない仕様書が増えました。
Slackの感覚で使っていたので、このTeams の仕様は想定外、かつ極めて不便なものでした。
使い勝手からすると最悪だと思えるのですが、きっとこれはofficeの連携を重視した結果なのでしょうね……


成功したと思える部分

上で散々問題点として挙がったTeams ですが、評判は上々のようです。
「メールより気楽」「メールよりレスポンスが早い」「議論しやすい」など。
やはりメールと比較してどうか、という点がポイントのようです。

GitBucket については、私が使いこなせていない・他メンバに説明しきれなかった面が目立ちましたが、当初の目的は達成されました。仕様書へのアクセスのしやすさ、ではやはりTFSより上であり、後半はなかなかの活躍だったのではないかと思います。


まとめ

一度に色々変えましたが、やはり手を広げすぎた感じはします。
個人的にはやりやすかったですが、他メンバがやりやすかったかというと疑問が残るところでしょう。
説明不足だった点もあって、この辺は反省点です。

また、PしてDしてCした結果、「いいんじゃね?」というところも出てきた今回のチャレンジですが、
「全部止めろ」
というAが(上層部より)さっそくきているようですw
私が勤めている会社は、完全にトップダウン型、ボトムアップの意見は全て死ぬところなので、この展開は予想通りでしたが、やっぱり虚しいものがありますね。



孫社長のむちゃぶりをすべて解決してきた すごいPDCA―――終わらない仕事がすっきり片づく超スピード仕事術

新品価格
¥1,512から
(2017/6/25 20:52時点)