OneDrive +100 の契約終了に関するお知らせ のメールについて

Microsoftから microsoft-noreply@microsoft.com のメールアドレスで「OneDrive +100 の契約終了に関するお知らせ」というメールが届いた。ヘッダーを確認すると

SPF: PASS(IP: 209.85.220.41)。詳細
DKIM:   'PASS'(ドメイン: microsoft.com)詳細
DMARC:  'PASS' 詳細

なので本物のメールのよう。詳細を見ても

f:id:onsanai:20211019212027p:plain

確かに本物で、書かれているリンクも正しい。しかし、そのリンク先から「定期請求を有効にする」をしようとすると

もう一度実行してください
弊社側で問題が発生しました。現在、すべてのデータを表示できません。 しばらく時間をおいてからやり直してみてください。

f:id:onsanai:20211019212339p:plain

と出る。Google先生に聞いてもラチが開かないのでツイッター先生に聞くとどうも「OneDrive Standalone 100GB」という名前に変わるだけらしい。

f:id:onsanai:20211019212455p:plain

また、移行中らしく元の+100の100GBと新しいStandaloneの100GBが合わさって200GBのストレージがあるように見えている。

f:id:onsanai:20211019212602p:plain

しっかし、分かりにくいメールだな。

Python scipyで離散データの内挿 interpolate 積分 integrateを使ってみる

# サンプルデータを取得
import urllib.request
with urllib.request.urlopen("https://gitlab.com/gifuescan/atima_rangeenergy/-/raw/1e7c7d1432c302d0705a5ea9fe40d696ec468e54/splines_emul_1.41/BeamZ1_TargetZ6.txt") as web_file:
    data = web_file.read()
    with open("BeamZ1_TargetZ6.txt", mode='wb') as local_file:
        local_file.write(data)

import numpy as np
data = np.loadtxt("BeamZ1_TargetZ6.txt")

内挿は簡単でデータ点を詰めて関数を取得する。kindは‘linear’, ‘nearest’などが使えるが、今回は'cubic'にした。

# 内挿する関数
from scipy import interpolate
f = interpolate.interp1d(data.T[0], data.T[1], kind='cubic')
print(f(0.5))

以下、内挿の関数やデータは全く使わない。 積分(Cumulatively integrate)も同じくデータ点を詰めて初期値を与えるだけである。dEdx[MeV cm2/g]の逆数をエネルギー[MeV]で積分するとRange[g/cm2]が得られるので、

#dE/dxとEnergyからRangeを数値計算の積分で求める
from scipy import integrate
Energy = data.T[0]
dEdx = data.T[1]/1000.0
Range = integrate.cumtrapz(1.0/dEdx, Energy, initial=0)

描画をしておく

#描画
import matplotlib.pyplot as plt
plt.plot(Energy, data.T[2], 'r.', label="Original")
plt.plot(Energy, Range, 'b-', label="Integral")
plt.xscale("log")
plt.xlabel("Energy [MeV]")
plt.yscale("log")
plt.ylabel(r"Range [mg/cm2]")
plt.legend()     
plt.show()

import matplotlib.pyplot as plt
plt.plot(Energy[1:], (Range[1:]/data.T[2][1:]-1)*100, 'b-')
plt.xscale("log")
plt.xlabel("Energy [MeV]")
plt.ylim(-0.1,0.1)
plt.ylabel("Difference [%]")
plt.grid(True)
plt.show()

f:id:onsanai:20211011153813p:plain

f:id:onsanai:20211011153823p:plain

多少の誤差はあるが概ね積分がうまくいっているようだ。

C# Windows フォームアプリケーションで別スレッドからUIを操作する方法

この記事は、Windows フォームアプリケーション (.NET Framework)の話です。 Windows WPFアプリ (.NET Framework) の場合

HeavyTask_Error だと

System.InvalidOperationException: '有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'Othersbutton' がアクセスされました。'

というエラーが出る。

正しくUIを操作するには、HeavyTask_Fixed のように修正する。delegate に対して Invoke で呼び出せばよい。

//エラーが出る
Othersbutton.Enabled = false; 

//修正後 {内は複数行でも可}
Invoke(new Action(() => { Othersbutton.Enabled = false; })); 

コード全体は以下の通り

using System;
using System.Threading.Tasks;
using System.Windows.Forms;
<200b>
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        bool stop = false;
        public Form1()
        {
            InitializeComponent();
        }
        void HeavyTask_Error()
        {
            Othersbutton.Enabled = false;
            for (int i = 0; i < 30; i++)
            {
                System.Threading.Thread.Sleep(100);
                if (stop) break;
                label1.Text = i.ToString();
            }
            if (stop)
            {
                label1.Text = "Stop!";
            }
            else
            {
                label1.Text = "Completed!";
            }
            Othersbutton.Enabled = true;
        }
        void HeavyTask_Fixed()
        {
            Invoke(new Action(() => { Othersbutton.Enabled = false; }));
            for (int i = 0; i < 30; i++)
            {
                System.Threading.Thread.Sleep(100);
                if (stop) break;
                Invoke(new Action(() => { label1.Text = i.ToString(); }));
            }
            if (stop)
            {
                Invoke(new Action(() => { label1.Text = "Stop!"; }));
            }
            else
            {
                Invoke(new Action(() => { label1.Text = "Completed!"; }));
            }
            Invoke(new Action(() => { Othersbutton.Enabled = true; }));
        }
        private void StartError_Click(object sender, EventArgs e)
        {
            stop = false;
            Task.Run(() => HeavyTask_Error());
        }
        private void StartFixed_Click(object sender, EventArgs e)
        {
            stop = false;
            Task.Run(() => HeavyTask_Fixed());
        }
        private void Stop_Click(object sender, EventArgs e)
        {
            stop = true;
        }
    }
}

f:id:onsanai:20210924105130p:plain

検索用 thread forms

Python: 非対称な誤差の計算をモンテカルロシミュレーション法で計算する

Asymmetric uncertainties in measurements: SOAD a Python package based on Monte Carlo Simulations

https://aip.scitation.org/doi/abs/10.1063/1.5135421

という論文があったので使ってみた。数学的に正しいかどうかは確認していない

Githubソースコードは公開されている

github.com

Gitでcloneする

git clone https://github.com/kiyami/soad.git
cd soad

python setup.py install でインストールだが、README.mdがUTF-8で記述されてるのにエンコーディングが設定されていないので、setup.pyの5行目を以下のように変更する

#with open("README.md", "r") as fh:
with open("README.md", "r", encoding="utf-8") as fh:

インストール

python setup.py install

サンプルコードを実行してみる

from soad import AsymmetricData as asyd
a = asyd(10.0, 1.0, 1.2, N=10000, confidence=1.0)
b = asyd(15.0, 2.4, 2.1, N=10000, confidence=1.0)
c = a * b
print(c)
c.plot_data_and_pdf(show=True, save=False)
c.plot_log_likelihood(show=True, save=False)

出てくる絵は次の通り

f:id:onsanai:20210922110909p:plain

f:id:onsanai:20210922110928p:plain

C# Windows WPFアプリで別スレッドからUIを操作する方法

この記事は、Windows WPFアプリ (.NET Framework)の話です。 Windows フォームアプリケーション (.NET Framework) の場合

HeavyTask_Error だと

System.InvalidOperationException: 'このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。'

というエラーが出る。

正しくUIを操作するには、HeavyTask_Fixed のように修正する。Dispatcher.BeginInvoke でデリゲートを非同期に実行している。

//エラーが出る
Othersbutton.IsEnabled = false;

// 修正後 {内は複数行でも可} awaitなので関数の属性にもawaitを付ける
await Dispatcher.BeginInvoke(new Action(() =>{ Othersbutton.IsEnabled = false; }));

コード全体は以下の通り

using System;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        bool stop = false;
        public MainWindow()
        {
            InitializeComponent();
        }
        void HeavyTask_Error()
        {
            Othersbutton.IsEnabled = false;
            for (int i = 0; i < 30; i++)
            {
                System.Threading.Thread.Sleep(100);
                if (stop) break;
                label1.Text = i.ToString();
            }
            if (stop)
            {
                label1.Text = "Stop!";
            }
            else
            {
                label1.Text = "Completed!";
            }
            Othersbutton.IsEnabled = true;
        }
        delegate void MethodInvoker();
        async Task HeavyTask_FixedAsync()
        {
            await Dispatcher.BeginInvoke(new Action(() =>{ Othersbutton.IsEnabled = false; }));
            for (int i = 0; i < 30; i++)
            {
                System.Threading.Thread.Sleep(100);
                if (stop) break;
                await Dispatcher.BeginInvoke(new Action(() => { label1.Text = i.ToString(); }));
            }
            if (stop)
            {
                await Dispatcher.BeginInvoke(new Action(() => { label1.Text = "Stop!"; }));
            }
            else
            {
                await Dispatcher.BeginInvoke(new Action(() => { label1.Text = "Completed!"; }));
            }
            await Dispatcher.BeginInvoke(new Action(() => { Othersbutton.IsEnabled = true; }));
        }
        private void StartError_Click(object sender, RoutedEventArgs e)
        {
            stop = false;
            Task.Run(() => HeavyTask_Error());
        }
        private void StartFixed_Click(object sender, RoutedEventArgs e)
        {
            stop = false;
            Task.Run(() => HeavyTask_FixedAsync());
        }
        private void Stop_Click(object sender, RoutedEventArgs e)
        {
            stop = true;
        }
    }
}

f:id:onsanai:20210924110422p:plain