プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

Opacity vs Transparency

f:id:puni-o:20210405094012j:plain

正しい使い方ってあるんですかね?

以下ではどちらも率(0~100%)という扱いで書きます

Opacity

100%で丸見えで0%で完全に見えなくなります。不透明度という訳でいいんじゃないでしょうか

Transpareny

100%でスケスケで0%で見え見えです。いわゆる透明度ですね

身の回りのスケ具合

<Rectangle Opacity="0.5"/>
{opacity:0.5;}

f:id:puni-o:20210405095338p:plain

  • Office

f:id:puni-o:20210405095543p:plain

まとめ

私の世界では透過度を設定=Opacityだったのですが、まさかのOfficeがTransparencyMicrosoftには裏切られた気分です(Officeでそんな設定いじらないし)

どちらがいいのかはよくわかりません。グーグル先生も私には教えてくれませんでした。 ひょっとしてソフト作っていない人たちにはTransparencyの方が普通だったりするんでしょうか

教えて!エロい人!!

オーバーフローなんかの話

f:id:puni-o:20210401100232j:plain

※画像はイメージです

新年度ですし、軽いネタでも

オーバーフローって聞くとわくわくする一部の方もいると思います。 とくにスタックオーバーフローはゲームのやりこみ勢にとっては格好のおもちゃでしょう。 Final Fantasy 6の52回全滅バグなんて有名ですね

ですが今回はスタックではなく桁あふれの方です

static void Main(string[] args)
{
    _itemCount = 255;
    AddItem();
    Console.WriteLine($"Item:{_itemCount}"); // Item:0
}

static byte _itemCount;
static void AddItem()
{
    _itemCount++;
}

上のコードはC#ですが、まぁ言語はなんでもいいですね。_itemCountが255 (byteの最大値) の時に _itemCountをインクリメントすると桁あふれを起こして0になっちゃうという、上限値チェックしろよという突っ込み多数なんだけどゲームでいまだにたまに見かけるやつです

桁あふれってどういうことかは、まぁググってください

1111 1111 + 0000 0001 = 1 0000 0000

みたいな感じでしょーか

逆のパターン

先ほどは増やした結果減ってしまいましたが、逆も当然あります

static void Main(string[] args)
{
    _itemCount = 0;
    SubItem();
    Console.WriteLine($"Item:{_itemCount}"); // Item:255
}

static byte _itemCount;
static void SubItem()
{
    _itemCount--;
}

こんな感じで減らす処理を呼んでアイテム数を255に増やしてみました

さて、この現象をなんと呼んでいますか?

これをオーバフローの逆(?)だからアンダーフローと呼んでいるとアンダーフロー警察に指摘されます。これは負のオーバーフローと呼ばれる現象です。上限値超えて下限値になるのもその逆もどっちもオーバーフロー(桁あふれ)です

アンダーフロー

ではアンダーフローはどういうことなのかというと

var f = 1e-45f;
Console.WriteLine($"{f == 0}");  // False
f = 1e-46f;
Console.WriteLine($"{f == 0}");  // True

こういうやつのことです。この例ではffloat(4byteの浮動小数点)で、1×10^-46 (10のマイナス46乗)くらいまで行くと0と同じ値になってしまいます。詳しく知りたい人はググってください

まとめ

こういう単語かっこいい(?)ので使いたくなりますが、正しく使わないと「はぁ?(。´・ω・)?」みたいな感じになるので注意した方がいいです

んで、何が言いたかったかというと新年度ということは4月ということで1年の四分の一が終わってしまったということです。まぁ月は上限値が12なのであと9回インクリメントすると1に戻るから安心ですけど

Azure Functions の設定が変わったり変わらなかったりする件

Azure Portalの構成で設定値を変更しても、すぐにその設定でFunctionsが動くとは限らないよ、というお話です

準備

関数

[FunctionName("QueueFunction")]
public static async Task Run([QueueTrigger("myqueue-items", Connection = "")]string myQueueItem, ExecutionContext context, ILogger log)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(context.FunctionAppDirectory)
        .AddEnvironmentVariables()
        .Build();

    var setting = config["SETTING"];

    log.LogInformation($"Queue trigger function processed: {setting} ({context.InvocationId})");

    var client = new HttpClient();
    await client.GetAsync("https://localhost/heavyapi");
}

Visual StudioのテンプレートにQueueTriggerで動く関数を追加します

最後のclient.GetAsync()は10秒応答を返さないWebAPI作ってそれを呼び出すようにしておきました (重い処理やっているつもり)

設定

PortalのFunctionsの構成で

f:id:puni-o:20210326160814j:plain

こんな感じに設定しておけばログに設定値が出るはずですね

動かしてみる

Queueに何個か突っ込んでログを確認してみます

f:id:puni-o:20210326161001j:plain

App Insightsで見るとちゃんとログがでています

設定を変更しながら試してみる

  • Portalで設定変更
  • Functions再起動 (設定変更時に聞かれるので)
  • 間髪入れずに20個くらいQueueに入れる

をSETTING=1から順番に試してみます

設定が反映されない?

SETTINGを 2 -> 3 にして再起動した後試したところこうなりました

f:id:puni-o:20210326161912j:plain

ログは時刻で降順で、上のスクショでは一番下と下から二番目の間に設定変更と再起動が入っています

一つ目のログは3が出ていて予想通りだったのですが、その上が2となっていて変更前の値をログに出しています

ずっと変更前の値というわけではなく、しばらくすると3が出るようになります

f:id:puni-o:20210326162215j:plain

まとめ

ということで Functionsの構成で指定したアプリケーション設定は再起動したからと言って即時反映されるわけではないようです。多分設定をキャッシュしているのかな?(調べる元気はないです

接続文字列的なの変えて再起動して確認したのにちゃんと変わっていない?とか思ったら少し待つといいと思います

今は Azure App Configurationを使う(のかな?)ので関係ないのかもしれませんけど

docs.microsoft.com