ブログ

割とコンピュータよりの情報をお届けします。

TakeMe

WinPython 3.7.4はVSCode付もある

最近はWinPythonの配布ファイルの名前の付け方がわからなくてZeroを選ぶようにしていた.

ところが,最近の配布ファイルを見ているといつのころからなのか不明だが,Visual Studio Codeのポータブル版が同梱されたファイルがある.

このVisual Studio CodeはWinPythonと同様USBメモリなどリムーバブルメディアから起動できるようになっている.
Pythonのデバッグ設定関係もセットされていた.(最初の利用時には構成の追加で選択が必要)
Visual Studio Code日本語が必要なら,「Japanese Language Pack for Visual Studio Code」を追加すればよい.

PythonのデバッグにIDLEを使用していたが,ブレイクポイントの設定などでVSCodeの方がよく使用するIDEに似ていて便利かもしれない.

ただし,WinPythonの配布ファイルサイズは結構大きくなってきている.ファイルを展開して準備するまでの時間は相当要する.

≫ 続きを読む

2019/09/29 コンピュータ   TakeMe
タグ:Python

Live ChartsでScatter Plotに線が付かない仕様 Vol. 2

前回の記事ではX, Yのデータを含むモデルを新たに起こしているが,x, yだけなら標準ではObservablePointも使用できるので一部訂正

つまり,ObservablePointを使うと,前回のXYPointModelはわざわざつけなくて良い.
ChartValuesはListでもよいらしいが確認していない.
実はこの例では以下のようにデータグリッドを追加するとデータグリッド上での変更がチャートに反映されるということになっている.
<DataGrid ItemsSource="{Binding listXYPoint}" FontSize="20"/>
まあ使うかどうかはべつですが

using MahApps.Metro.Controls;
using LiveCharts;
using LiveCharts.Wpf;
using LiveCharts.Configurations;
using LiveCharts.Defaults;

namespace LiveChartsTEST
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : MetroWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            ChartData cd = new ChartData();

            var sc = new SeriesCollection()
            {
                new LineSeries
                {
                    LineSmoothness = 0,
                    Values = cd.listXYPoint
                }
            };

            cd.seriesCollection = sc;
            this.DataContext = cd;
        }

        public class ChartData
        {
            public SeriesCollection seriesCollection { get; set; }
            public ChartValues<ObservablePoint> listXYPoint { get; set; } = new ChartValues<ObservablePoint>();
            public ChartData()
            {
                for (int i = 0; i < 10; i++)
                {
                    listXYPoint.Add(new ObservablePoint(i, i * i));
                }
            }
        }
    }
}

≫ 続きを読む

2019/09/09 コンピュータ   TakeMe
タグ:WPF

Live ChartsでScatter Plotに線が付かない仕様

Live Charts WPFを使い始めた.
Line ChartとScatter Plotはそれぞれあるが,どうしてだろう 2つを組み合わせて使用する方法が書いていない.

Live Chartsに関してGitHubで質問が上がっていた.
https://github.com/Live-Charts/Live-Charts/issues/737
結局のところ2019年初の段階で 質問にまともに答えていないのだ.

ところが,現在Tutorial and Examples (https://lvcharts.net/App/examples/v1/wpf/Date%20Time)がようやく追い付いてきたようだ.サンプルではDateTimeを横軸に設定しているが,doubleに置き換えることは当然可能である.例えば以下のように行う(MahAppsも一緒に使っているが必須ではないのはご存じの通りです).

using MahApps.Metro.Controls;
using LiveCharts;
using LiveCharts.Wpf;
using LiveCharts.Configurations;

namespace LiveChartsTEST
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : MetroWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            ChartData cd = new ChartData();

            var xypointConfig = Mappers.Xy<XYPointModel>()
                .X(model => model.ValueX)
                .Y(model => model.ValueY);

            var sc = new SeriesCollection(xypointConfig)
            {
                new LineSeries
                {
                    Values = new ChartValues<XYPointModel>
                    {
                        new XYPointModel
                        {
                            ValueX = 0,
                            ValueY = 5
                        },
                        new XYPointModel
                        {
                            ValueX = 10,
                            ValueY = 9
                        }
                    }
                }
            };

            cd.seriesCollection = sc;
            this.DataContext = cd;
        }

        public class ChartData
        {
            public SeriesCollection seriesCollection { get; set; }
        }

        public class XYPointModel
        {
            public double ValueX { get; set; }
            public double ValueY { get; set; }
        }
    }
}

XAMLについて以下のようにしておくなど 必要かも

<lvc:CartesianChart Series="{Binding seriesCollection}" LegendLocation="Bottom" />

≫ 続きを読む

2019/09/08 コンピュータ   TakeMe
タグ:WPF

screenコマンド

アップデートの実行中やMondo Rescueのバックアップ中に運悪くSSHのセッションが切れることが多発した.
多くの場合には,安全に復帰できるがシステムをいじっている途中に切れるとコマンドの実行まで切られてしまい少し怖い.
Mondo Rescueなどはやり直しになってしまう.

アップデートの実行中やMondo アーカイブのバックアップ中に運悪くSSHのセッションが切れることが多発したがコマンドの実行まで切られてしまい少し怖かった.このような場合には,screenコマンドを使えばよいらしい.
いったんscreenコマンドを実行すると仮想のセッションが作られる.この中でコマンドを実行するとSSHの接続が切れても仮想セッションにくっついているのでコマンドが停止されることはない.

≫ 続きを読む

2019/09/08 コンピュータ   TakeMe

「Wi-Fi + 赤外線 + 温度湿度センサ ホームIoT 「ESP-IR+TPH Monitor」」のサンプルからカスタマイズ

「Wi-Fi + 赤外線 + 温度湿度センサ ホームIoT 「ESP-IR+TPH Monitor」」のサンプル「ESP-IR+TPH Monitorをブラウザから制御」から派生を考えていた.

割と簡単に変更できる.IRの最大登録数が足りないと思っていて,
WebPageHandler.hの以下のようにしてみた.

class WebPageHandler{
private:
  static const uint8_t irPageIndex = 12;   // IRページの最大登録数
}

登録数が12に増えていいのだが画面がはみ出ると使いにくい.
横方向の分配はcol-xs-6ふたつをcol-xs-3とcol-xs-9に変更で調整できる.

データをとって,HTTPで上位サーバに送信するように準備していたが,
SSLもできるがESP32でない分使える暗号化の種類に制限がある.最近 弱さが指摘された暗号化しか選べない.
厳しい.

≫ 続きを読む

2019/09/07 コンピュータ   TakeMe

「Wi-Fi + 赤外線 + 温度湿度センサ ホームIoT 「ESP-IR+TPH Monitor」」を買ってみた

面白そうだったのでSWITCH SCIENCEで「Wi-Fi + 赤外線 + 温度湿度センサ ホームIoT 「ESP-IR+TPH Monitor」」を買ってみた.

この「Wi-Fi + 赤外線 + 温度湿度センサ ホームIoT 「ESP-IR+TPH Monitor」」という商品自体は,電子工作キット風の商品で,販売はSWITCH SCIENCEでも行っているが,サポートなどはそちらでは行っていない.完成品もある.

電子工作キットを扱ったことのある人なら分かるが,初めての人はこれだけを購入しても何もできない.初めての人は以下のものも買った方がよい...

  • Wi-Fi + 赤外線 + 温度湿度センサ ホームIoT 「ESP-IR+TPH Monitor」

  • ACアダプタ

  • FTDI USBシリアル変換アダプター Rev.2
  • ジャンパワイヤ(オス~メス)
  • USB2.0ケーブル(A-microBタイプ)

さらに,Arduinoケースもあった方が良いかもしれない.

私は結局 集めるのに1週間かかった.

≫ 続きを読む

2019/08/05 コンピュータ   TakeMe

Scipyのinterpolateはデータの外側へも広げられる

Scipyのinterpolateはデータの外側へも広げられることを知った.
fminなどを使用していると,引数が意図しない範囲に行って補間が失敗して止まることがあるのだが,未然に防ぐことができる.

scipyのinterpolateは今まで使ったことがなかったが,事前にx, yの2つの数値列を与えておくと補間するための関数を返してくれるという仕様になっている.この関数として返すという仕様がfminなどで使うときの便利さにつながる.
さらに,interpolateはデータの範囲が超えたときにエラーにしない仕様がある.例えば以下のような例である

# -*- coding: utf-8 -*-
import numpy as np
import scipy as scipy
from scipy.optimize import fmin
from scipy import interpolate
import matplotlib
import matplotlib.pyplot as plt

x = np.linspace(0, 100, num=1001, endpoint=True);
y = np.zeros(x.shape);

for i in range(y.shape[0]):
    if i < 500 and i > 50:
        y[i] = 1;
f4 = scipy.interpolate.interp1d(x, y, 'cubic', fill_value='extrapolate')
xi = np.linspace(-100, 200, num=121)

plt.plot(x, y, linewidth='3');
plt.plot(xi, f4(xi))
plt.grid(True)

plt.savefig('20190727test.png', format='png', dpi=100)
plt.show();

さらに数値最小化の追加の例までついかすると例えば以下のようになる.

# -*- coding: utf-8 -*-
import numpy as np
import scipy as scipy
from scipy.optimize import fmin
from scipy import interpolate
import matplotlib
import matplotlib.pyplot as plt

x = np.linspace(0, 100, num=1001, endpoint=True);
y = (x - 40) ** 2

f2 = scipy.interpolate.interp1d(x, y, 'cubic', fill_value='extrapolate')

minimum = scipy.optimize.fmin(f2, 1)

xi = np.linspace(-100, 200, num=121)

plt.plot(x, y, linewidth='3');
plt.plot(xi, f2(xi))
plt.plot(minimum, f2(minimum), '+')
plt.grid(True)

plt.savefig('20190727test2.png', format='png', dpi=100)
plt.show();

導関数を使わない数値最小化ならこれらでもよいが,微分係数を使って勾配を下に下らせるように最適化を目指すアルゴリズムを使用したい場合には,計算が増えてしまう.そこで,UnivariateSplineというものもある.まず上の置き換えだけなら,

from scipy.interpolate import UnivariateSplie
f2 = scipy.interpolate.UnivariateSpline(x, y, s=0, ext=0)

にするだけである.さらにf2.derivatives()なるものが使えるようになる
f2.derivatives(minimum)は[ほぼ0, ほぼ0, 2, ほぼ0]になるはず.順にf2の補間結果,1次微分係数,2次微分係数,...

≫ 続きを読む

2019/07/27 コンピュータ   TakeMe
タグ:Python

Pythonのsounddeviceその2

Pythonでnumpyの信号をスピーカーから出力するのはどうすればよいのかを探していると,sounddeviceというのが見つかった.
これを使って前は少し遊んでみるた
sounddeviceにはplayrecという関数があって再生と録音を同時にできる.

音を入力出力する例としては,sd.playrec(z, samplerate=fs, channels=1)に変えるだけである.
下の例ではz2が録音されたデータの列になっている.

注意すべき点は,秒単位ではタイミングがずれることである.タイミング関係は使用している環境や負荷によるかもしれない.
import numpy as np
import sounddevice as sd
import matplotlib.pyplot as plt

fs = 44100
fbase = 4000;
t = np.linspace(0, 44099, num=44100, endpoint=False);
z = 0.2 * np.sin(t * 2 * np.pi * (fbase)) + 0.2 * np.sin(t * 2 * np.pi * (fbase + 1)) + 0.2 * np.sin(t * 2 * np.pi * (fbase + 2)) + 0.2 * np.sin(t * 2 * np.pi * (fbase + 3));

z2 = sd.playrec(4 * z, fs, channels=1)#sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait()

sd.play(z2, fs);
# 表示
Fz = np.fft.fft(z2) / z2.shape[0] * 2; # 折り返すのでパワーが2分の1になっている.
Fz[0] = Fz[0] / 2; # 平均成分は折り返さない.
Fz_abs = np.abs(Fz);

freq = np.fft.fftfreq(len(z), d=1.0/fs);
tim = np.arange(0, z2.shape[0]) * 1.0 / fs;
plt.figure(1)
plt.subplot(211);
plt.plot(tim, z2);

plt.subplot(212);
plt.plot(freq, Fz_abs * 1e6);
plt.xlim([0, 20000])

plt.show();


 

参考: sounddeviceでPythonを使って録音する

≫ 続きを読む

2019/07/21 コンピュータ   TakeMe
タグ:Python

Python numpyでFFTを実行する.周波数軸はどうしたら2

以前の記事「Python numpyでFFTを実行する.周波数軸はどうしたら」ではlinspaceを使って周波数リストを出力していたが,numpy.fft.fftfreqでもよい.

以下のようになる.実は,折り返しが始まった周波数より上はnumpy.fft.fftfreqで作った方が正しい.というのはlinspaceで周波数リストを作ると折り返しは再現されないのだ.
fftfreqで作成すると絶対値だけは周波数を再現する.負符号で折り返しを表現する.

import numpy as np
import matplotlib.pyplot as plt

# 例の信号を作成
t = np.linspace(0.001, 4, 4000);
z = 0.1 + 0.2 * np.sin(t * 10 * 2 * np.pi) + 0.2 * np.sin(t * 33 * 2 * np.pi);

# サンプリング周波数
fsmp = 1 / (t[1] - t[0]);
# 解析時間
t_len = t.max() - t.min();

Fz = np.fft.fft(z) / z.shape[0] * 2; # 折り返すのでパワーが2分の1になっている.
Fz[0] = Fz[0] / 2; # 平均成分は折り返さない.
Fz_abs = np.abs(Fz);

freq = np.linspace(0, fsmp - 1/(t_len + t[1] - t[0]), num=len(t));
freq2 = np.fft.fftfreq(len(t), d=1.0/fsmp);

plt.figure(1)
plt.plot(freq, freq2 - freq);

plt.show();

≫ 続きを読む

2019/07/15 コンピュータ   TakeMe

Pythonのsounddevice

Pythonでnumpyの信号をスピーカーから出力するのはどうすればよいのかを探していると,sounddeviceというのが見つかった.
これを使ってこの後 仕事で少し遊んでみることにした...

音を出力する例としては以下のようになる.
zがnumpy.arrayでこの例では正弦波の重ね合わせになっている.

import numpy as np
import sounddevice as sd

fs = 44100

t = np.linspace(0, 44099, num=44100, endpoint=False);
z = 0.2 * np.sin(t * 2 * np.pi * 11000) + 0.2 * np.sin(t * 2 * np.pi * 11001) + 0.2 * np.sin(t * 2 * np.pi * 11002) + 0.2 * np.sin(t * 2 * np.pi * 11003) + 0.2 * np.sin(t * 2 * np.pi * 11004) + 0.2 * np.sin(t * 2 * np.pi * 11005);
sd.play(z, fs)

この例は再生だけなので後で,録音も以下のように行える.

import numpy as np
import sounddevice as sd

fs = 44100

duration = 5  # seconds
z2 = sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait()

sd.play(z2, fs); # 録音したものを再生

参考: sounddeviceでPythonを使って録音する

≫ 続きを読む

2019/07/14 コンピュータ   TakeMe