Windowsのループバック接続帯域を調査

動画像を表示するためのWebアプリを作ることを考えています。 最終的に画像はWebSocketsで転送するつもりですが、まずは生の帯域を知りたいと思いました。 そこで、Windows上のループバック接続の帯域を計測してみました。

iPerfをダウンロードし、 コマンドプロンプトを二つ開いて、それぞれでサーバとクライアントを動作させます。

サーバ側(以下に説明する2回のテストの結果も表示されている):

iperf-3.1.3-win64>iperf3.exe -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 127.0.0.1, port 58130
[  5] local 127.0.0.1 port 5201 connected to 127.0.0.1 port 58131
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   441 MBytes  3.70 Gbits/sec
[  5]   1.00-2.00   sec   509 MBytes  4.27 Gbits/sec
[  5]   2.00-3.00   sec   519 MBytes  4.35 Gbits/sec
[  5]   3.00-4.00   sec   535 MBytes  4.49 Gbits/sec
[  5]   4.00-5.00   sec   561 MBytes  4.71 Gbits/sec
[  5]   5.00-6.00   sec   570 MBytes  4.78 Gbits/sec
[  5]   6.00-7.00   sec   579 MBytes  4.85 Gbits/sec
[  5]   7.00-8.00   sec   570 MBytes  4.78 Gbits/sec
[  5]   8.00-9.00   sec   578 MBytes  4.85 Gbits/sec
[  5]   9.00-10.00  sec   560 MBytes  4.70 Gbits/sec
[  5]  10.00-10.00  sec   933 KBytes  3.96 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.00  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.00  sec  5.29 GBytes  4.55 Gbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 127.0.0.1, port 58146
[  5] local 127.0.0.1 port 5201 connected to 127.0.0.1 port 58147
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   517 MBytes  4.32 Gbits/sec
[  5]   1.00-2.00   sec   535 MBytes  4.49 Gbits/sec
[  5]   2.00-3.00   sec   551 MBytes  4.63 Gbits/sec
[  5]   3.00-4.00   sec   565 MBytes  4.74 Gbits/sec
[  5]   4.00-5.00   sec   596 MBytes  4.99 Gbits/sec
[  5]   5.00-6.00   sec   608 MBytes  5.10 Gbits/sec
[  5]   6.00-7.00   sec   622 MBytes  5.22 Gbits/sec
[  5]   7.00-8.00   sec   621 MBytes  5.21 Gbits/sec
[  5]   8.00-9.00   sec   608 MBytes  5.10 Gbits/sec
[  5]   9.00-10.00  sec   604 MBytes  5.07 Gbits/sec
[  5]  10.00-10.00  sec  1.25 MBytes  3.58 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.00  sec  5.69 GBytes  4.89 Gbits/sec                  sender
[  5]   0.00-10.00  sec  0.00 Bytes  0.00 bits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

クライアントは、転送方向を変えて2回実行します。最初はクライアントからサーバへ、 2番目はサーバからクライアントへ(-Rオプション)。

HTMLのCanvas要素の描画性能を調べてみる

HTMLのCanvas要素にビットマップを描画する場合、どの程度の性能がでるのか、試してみました。

<html>
    <body>
        <script
            src="https://code.jquery.com/jquery-3.2.1.js"
            integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE="
            crossorigin="anonymous"></script>
        <p><div id="time">Time[ms]</div></p>
        <canvas id="canvas" width="1920" height="1080"></canvas>
        <script type="text/javascript">
            $(window).on('load', function(){
                var tm = 0;
                var canvas = $('#canvas').get(0);
                var width = canvas.width;
                var height = canvas.height;
                var ctx = canvas.getContext('2d');
                var imageData = ctx.getImageData(0, 0, width, height);

                var buf = new ArrayBuffer(imageData.data.length);
                var buf8 = new Uint8ClampedArray(buf);
                var data = new Uint32Array(buf);
                var start_ms = performance.now();
                var elapsed_ms;

                var draw = function(){
                    for (var j = 0; j < height; j++){
                        for (var i = 0; i < width; i++){
                            var val = (i+j+tm) & 0xFF;
                            data[j*width+i] =   (255 << 24) |
                                                (val << 16) |
                                                (val << 8) |
                                                val;
                        }
                    }
                    imageData.data.set(buf8);
                    ctx.putImageData(imageData, 0, 0);
                    tm++;
                    if (tm % 60 == 0){
                        var current = performance.now();
                        elapsed_ms = current - start_ms;
                        $("#time").text(elapsed_ms/60.0 + "[ms]");
                        start_ms = current;
                    }
                }
                setInterval(draw, 5);
            });
        </script>
    </body>
</html>

setIntervalに小さめの値を設定することで、できるだけ頻繁にdraw関数での描画が実行されるようにしました。

試してみると、ジッタがありますが、12-15[ms]程度に1回の描画が行われているようです。 試した環境は、Core i7-6500U, Windows 10, Firefox 57.0.2 (64bit)です。 動作中は、Firefoxのプロセスが30%程度のCPU時間を消費し、GPUは55%程度を示しています(タスクマネージャで計測)。

ついにねんがんのRealforceをてにいれたぞ

メインで使っているパソコンをノートからデスクトップに移行したいと思っていますが、 その原因は、UIの部分にあります。ノートのキーボードは最近辛い。

そこで、DRAMはまだ高いので、とりあえずノートをメインにしつつ、 UIだけ改善しようと思い立ち、前々から気になっていた、Realforce 91Uをゲットしました。

キーボードにこだわる人は、割と英字キーボードを選択する人が多い気がしますが、 私は英字でも日本語でも良いタイプです。どちらでもすぐに手が切り替わるので。 プログラミングには英字の方が良いというような言説がありますが、 私は全く無関係だと思っています。

感想

キートップの比較的平らな部分(指が触れる部分)が思ったよりかなり小さい。 最初に触ったときは、これミスタッチ多くない? と思いましたが、いざタイピングしてみると、全く問題ありませんね。

レビューを見てみると、キー入力の音がうるさいというような意見も散見されましたが、 個人的にはこれくらいなら全くうるさく感じませんね。ただ、文字キーの音に対するEnterキーの音が大分違うので、 そこは違和感が少しありますね。

キーストロークはかなり深いですが、底まで打ち込まなくても文字は入力されるようです。 軽く触れる感じで入力するのがよさそうです。

キーボード自体は余計な10キーもなく、コンパクトで良いです。

以下は思い出話

キーの感触から、大昔の学生時代に計算機室にあったX端末(まだ世の中に存在しているんですかね)のキーボードを思い出しました。 X端末のキーボードはもっと軽く感じましたが。まぁ、使い込まれたキーボードだったからかもしれません。確か、高岳製作所の端末でしたね。 Emacsのタイプトレーナーtrrに最適なキーボードだったと記憶しています。 頑張って500を超えたのは懐かしい思い出です。確かサーバはSONYのNEWSだったと記憶していたのですが、 ちょっと調べた感じでは、自分の想像していた筐体サイズのモデルはなさそうでしたので、勘違いかもしれません。 でもMIPSアーキテクチャだったと思うのですが。大学の計算機室のページを見てみても、 過去の計算機については記載されていませんでしたので、真実は分かりませんでした。

すごい脱線でしたが、とりあえず、確かに絶賛されるだけのものではありそうです。 基本的な部分の不満は今のところ皆無です。

画像処理回路の基礎(ラインメモリの構成法)

FPGAで各種画像フィルタを実装するというのは良く行われます。 ちょっと検索した範囲では、フィルタに必要な3x3のデータ等を作るのに必要な回路の構成法について、 詳しく記載されているページを見つけることができませんでした。 FPGA使いには当たり前なのかもしれませんが、あまり画像処理回路に詳しくない場合、 その方法が分かりにくいことも考えられます。

それで、参考までに資料を作成しました。

とにかく、Block RAMの使い方とレイテンシ調整がキモになります。

遂に禁断の両刃剃刀に手を出した

また新しい剃刀を入手しました。

“フェザー ポピュラー 3点セット”

購入したのは、フェザー 両刃ホルダーフェザー ハイステンレスニベアメン センシティブローションの3点です。

(まだローションは使っていません)

今まで、使い捨てタイプの剃刀は、2枚刃や3枚刃、5枚刃といったタイプのものしか使ったことはありませんでした。 最近使用しているタイプのは、捨てるにもプラスティックの本体部も一緒に捨てなければいけません。 案外これがさばるので、もう少しコンパクトにならないかな、と思ったところ、 上記のようなスマートに捨てられるタイプのものがあることを思い出して、購入した次第です。

レビューを見てみると、刃を2枚重ねて使うと良いといったコメントが散見されましたが、 ひとまず初回ということで、正規の1枚使用でトライしてみました。

恐る恐る慎重に剃ってみたので、きちんとそれましたが、力の入れ加減と角度が難しく感じました。 最初は、なんだか刃がちゃんと当たっているのか良くわからない感じでした。でも確かに剃れています。 最近多い3枚刃や, 5枚刃といったものは、面積が広いので、刃が当たっている実感がありますが、 1枚しか肌に接触しないので、ちょっと感覚が違いますね。

流血するかと心配していましたが、慎重に使っている分には、何も問題はありませんでした。 もう少し慣れてきた時が危ないのかもしれませんね。

後になって箱の裏を読んで気が付いたのは、刃は水洗い後に拭いてはいけないそうです。切れ味を長持ちさせるための、 刃先のコーティングが取れないようにするためのようです。水滴が残っていると錆びそうに感じたので、 しっかりタオルで水を取ってしまいました。

特に問題は感じないので、しばらくこれで行ってみようかと思います。

**2017/12/4追記:**本日、初めて刃を交換しました。まだ使えそうではありましたが、 ちょっと切れ味が落ちたと感じたためです。大体2週間くらいは持ちそうです。 このペースだと、10枚消費するのに20週、5カ月弱程度でしょうか。 これで替刃が10枚500円くらいで買えるのですから、かなりコスパは高いと思います。

**2020/5/20追記:**後日、Merkur, メルクールの両刀剃刀も入手しました。 両方を長く使ってきて気づいたのは、フェザーの商品は、プラスチックの部分にどうしても石鹸カスがついてしまうことです。 一方、メルクールは完全に分解でき、全体が金属なのでそのようなことはありません。

“Merkur”

切れ味としては、フェザーの方が角度が少しキツイと思われるため、少し良く剃れる感じがします。 一方メルクールは緩やかで、替刃が鈍くなって来た時の切れ味の劣化をより感じる印象があります。 どちらも良い商品だと思います。

Ryzenでマシンを組みたいな

私はここ15年くらいは、メインのパソコンはノート型を使っています。 これまでに買ったのはThinkPad X20に始まり(学生には高かった. 2000年前後だからもう15年以上か)、 T40系、X200系、Vaio 15インチ(かなり円高のタイミングだったので、今からすれば安く感かった)、 dynabook 13インチなどです。途中でMacBookも2, 3回買ってみたり(結局常用しないのですが)。

ノートだと旅行中も持ち歩けますし、必要なデータがいつも手元にあるというメリットは大きいと思います。

おおむね、小型->大型->小型->大型のように買い替えてきました。今は小型ですが、 もう大型はいらないかな、と思っています。その理由も含めて、徐々に本題に入っていきます。

年を取るにつれて、ノートパソコンのインタフェースに不満を感じるようになってきました。 ノートでの作業に比べると、普通のキーボードとマウスと大型液晶モニタでの作業は楽に感じます。 また、いろいろな開発環境をインストールするので、ここ数年は1TBの2.5インチHDDが搭載できる機種を前提に選んでいます。 最近の薄型ノートだと、M.2しか搭載していなかったりするものも多いですね。また、メモリの拡張性も低かったり。 まだまだ1TBのSSDはそれほど安くはないですしね…

そんなことを考えて、デスクトップに回帰したい気持ちが起きてきました。

Ryzen 5 1600でパーツ選びをしてみました。i5-8400でも良いのですが、 AMDのCPUはこれまで使ったことが無かったので、試してみたいと思いまして。

できるだけ安価で済ませることを考えて選んだパーツが下記になります。 GPGPUは重視しないので、とにかく動けば良しで選んでいます。

部品 型番 価格
GPU GT710-SL-2GD5-BRK [PCIExp 2GB] 4,454
CPU Ryzen 5 1600 23,470
Mem W4U2400PS-8G 17,182
Mother B380M Pro4 9,440
Case BECITE ECB3080B 3,980
Power KRPW-AK650W/88+ 7,106
SSD SSD PLUS SDSSDA-480G-J26 15,969
HDD ST3000DM008 [3TB SATA600 7200] 7,645

上記合計で89,246円(11/7調べ)。さらにケチってSSDを除くと73,277円。 別途キーボードやらは必要ですが。また、OSはWindows10を買っても良いのですが、 ひとまずCentOSかUbuntuでしのごうかと…

Amazonで調べてみたら、750Wの電源KRPW-AK750W/88+が7,445円だったので、こちらの方が良いかもしれません。

自分が各所で調べた範囲だと、i5-8400の方がシングルスレッド性能は10数%程度は良くて、 コア数が効く分野についてはRyzen 5 1600が圧倒する、という印象です。

FMヨコハマの時報キャプチャ(2)

改版したADC基板にて、 再度FMヨコハマの時報信号をキャプチャしてみました。

“84.7MHz time signal”

今回もデータはイーサネットで取得していますが、AliExpressからフェライトコアを入手して、 ケーブルをコアに巻いてコモンモードノイズ除去しています。

前回の基板での時報信号と比べてみると、 ノイズフロアがだいぶ下がって、10dBくらい良くなっているようです。

WinUSBドライバの自動インストール

WindowsにはWinUSBというドライバフレームワーク(?)があります。これを使えば、 自作USBデバイスと通信するドライバを自作する必要なく、 アプリケーションレベルでバルク転送などの通信を行うことができます。

というのは組み込み業界では良く知られていると思います。でも、 比較的最近可能になった裏技(?)についてはあまり知られていないのではないかと思います。

これまでは、WinUSBのドライバをインストールするためにinfファイルを作ったりする必要がありました。 でも実はWindows8以降からは、infファイルさえ必要なく、デバイスを接続するだけでドライバをインストールすることが可能になっています。

つまり、ドライバ署名なども一切気にする必要はないのです。ドライバ署名のチェックを無効にして再起動するという前時代的な作業は不要です。

これを実現するには、USBデバイス側にも少し変更が必要です。具体的には、 Microsoft OSディスクリプタというものを作成し、Windowsからのリクエストに応じて返すようにします。

Microsoft OS descriptorには2種類存在します。

  • 標準USBストリングディスクリプタ。OS string descriptorと呼ばれます。 このディスクリプタにより、デバイスから(次に述べる)OS feature descriptorを取得可能であるとOSが判断します。
  • OS feature descriptor: デバイスは1つまたは複数のOS feature descriptorを持つことができます。

OS feature decriptorを取得するための手順は次のようになります。

  1. まず、WindowsがOS string descriptorを取得するためのコントロール要求を送る
  2. Windowsは有効なOS string descriptorであることを検証する
  3. WindowsはOS string descriptorのbMS_VendorCodeフィールドの情報を用いて、OS feature descriptorを取得する

OS feature descriptorには次の種類があります。

  • Extended Compat ID この情報に基づき、Windowsはどのドライバをロードするかを決定します。
  • Extended Properties
  • Genre これはHIDデバイスによって使用される(予定)。

とりあえず、上記二つのExtended Compat ID, Extended Propertiesのディスクリプタを準備すれば、 ドライバの自動インストールと、GUIDによるアプリケーションからの通信が可能になります。

OS string descriptor

OS string descriptorは標準ストリングディスクリプタの、string index 0xEEに格納されます。 OS string descriptorはデバイスにつき1つのみ持つことができます。

OS string descriptorを取得するために、GET_DESCRIPTORコントロール要求がデバイスに送られます。

使い捨てカミソリ2種を試した

これまでいろいろなカミソリを試してきました。基本的に肌が弱いので、電気カミソリでも、 安全カミソリでも肌荒れを起こしてしまいます。これまでしばらくの間電気カミソリを使ってきましたが、 どうしてもすっきり剃れていない感じがあります。久々に安全カミソリを使ってみようと思い立ち、購入してみました。

購入したのは、Schick Xtreme3Dorco Pace6です。

Xtreme3 パッケージ: “Shick Xtreme3 パッケージ”

Xtreme3 拡大: “Xtreme3 拡大”

Pace6 パッケージ: “Dorco Pace6 パッケージ”

Pace6 拡大: “Pace6 拡大”

どちらも1本あたり100円程度で購入できました。思いつくままに印象を書きます。

Xtreme3

剃りやすいですが、なんだかしっかりそれていない感じもしました。1回できれいに剃るというのではなく、 何度か剃るのが前提のように感じました。3枚刃なので、こんなもんでしょうか。 肌にあまりうまく当たっている感じがしませんでした(これは単に使い方の問題の可能性もあります)。

Pace6

そもそもDorcoというメーカは聞いたことがありませんでしたが、韓国の会社のようですね。 Amazonで割と評価が良かったので試してみました。安いので、さほど懐は痛みませんので。 こちらはさすがに刃の数が多いだけあり、ごっそり剃っている感じがあります。 でも、1剃りで完了とはいきません。大分昔にジレットの5枚刃Fusionプログライドというのを使っていたことがありますが、 それにはさすがに劣る感じもしますが、値段からすればまぁ良いと思いました。

ちなみに、かなりごっつい感じのボディが無駄に感じます。大陸の方はこういうデザインが好きなのでしょうか。

全体として

まだどちらも1本だけ消費してみた感じですが、耐久性は似たり寄ったりでしょうか。自分の場合、 2,3回で使えなくなるということはありませんでしたので、値段からすれば十分ではないでしょうか。

とにかく安いので、旅行中でも電気よりしっかり剃りたいという時には良いと思います。

以前に使ったジレットの5枚刃は、1回でかなり剃り切れる感じがありましたが、その最高の剃り味は2回程度しか 持続しないという印象でした。最高の状態で使い続けたいのであれば、かなりの出費が必要になると思い、 しばらくしてやめてしまったのでした。

ちなみに、剃る時には、シェービングジェルを使っています。 別に石鹸を泡立てても同じ効果かもしれませんが、とりあえずお手軽なので。 でも、最近近所の薬局で、ネット上で評価の高かったシェービングフォームも買ってみました。 現在のジェルが無くなったら試してみます。

でも、自分の場合ジェルを付けていても肌荒れするので、どちらかというと剃った後が重要な気がします。 今は友人からもらった、フタアミンhiローションというのを使っていますが、 大分良いです。無刺激で全くべとつきません。でも結構お高いのですね。どおりで効果があるわけです… 今のが無くなったら、半額くらいのニベアメンでも買ってみようかと思います…

個人的には、メルクール両刃にも興味が出てきました。 自分は慎重に剃るというよりは、かなり適当にやってしまうので、両刃を使うと出血必至かとも思いますが、 コスパが良いのであれば、1回くらいは試してみたいですね。

**2017/11/27追記:**安い両刀剃刀を入手しました。ごみの量が減るので気に入っています(使い捨ては割と本体部がかさばる)。 記事はこちら。 両刀はコスパも高いので、旅行などを別にすれば、もう使い捨ては買わないかもしれません。

FM ADC基板 rev0.2到着

Elecrowに発注していた基板が先日到着しました。今回は、前回と異なり、発送前に確認用の写真を送ってくれました。 実物を見ると、写真より大分小さく感じます。

“基板2種”

小さいほうの基板が、FM帯域のBPF基板です。+5Vを供給します。左側のSMAにアンテナを接続し、 右側のSMAからフィルタ、増幅された信号を出力します。

BPFとADC基板はSMAケーブルで接続します。

大きいほうの基板がADC基板です。左側のSMAはトランスによる差動変換回路も含むFM用入力です。 下側SMAコネクタはシングルエンドのままADCに入力されます。AM信号などの取り込みが可能です。

ADCコネクタは、これまで同様Z-turn boardに接続しますが、 rev0.1基板とは逆側の80pinに接続するように設計しました。

電源、クロック発振も問題無いことを確認しました。

くみ上げた状態で、生信号(サンプリングレート40MHz)をPCで取り込んでFFTした画面が以下になります。

“0-20MHz FFT”

一方、ADC基板に信号を入力しない場合のキャプチャとFFTは以下になります。

“0-20MHz FFT w/o antenna”

これとrev0.1基板での信号も比較してみると、 rev0.1基板ではアンプによる増幅が必ず行われるので、アンテナ未接続時もそれなりのノイズがみられましたが、 今回はADC基板側にはアンプは載っていないので、+2から-1程度の範囲内で信号が取れています。

実際に動作させてみたら、イーサネットケーブルを接続したときと、JTAGケーブルを接続したときで、 ノイズがかなり混入します。それぞれのノイズの周期は異なる感じで、 イーサネットの方はかなりホワイトノイズのように聞こえますが、JTAGケーブルは数Hz程度でノイズが入ってきます。 なかなかノイズ対策は難しいですね… イーサネットは電源線は無いはずですので、ディファレンシャルノイズではなくて、 コモンモードノイズ(参考1, 参考2)が入ってきてしまうのでしょうか?

それと、今回の基板から、BPFとADCの距離を離せるようになったので、距離を色々変えてみましたが、 当然のことながら、離せば離すほど、ノイズは減少します。

というわけで、デバッグ用のケーブル類は一切接続せずに、単体で動作させると、それなりに良い音が得られています。 でも、できればデバッグしながら音も確認したいですので、ちょっと困りました。 JTAGは接続しないでも動作するようにすれば良いとして、データダンプ用のイーサネットはできれば繋いでおきたいです。

2017/9/12追記:イーサネットの代わりに、ZynqをUSBデバイスとして動作させて、USB経由でデータダンプを行えば良いと気づきました。 元々、USB2.0だと480Mbps止まりだけど、イーサだと1Gbpsまで行けるだろうという目論見で、Linuxを動作させてイーサを使用しましたが、 実際のところ1Gbpsの50%も出ていないようです。40MHzで12bitデータを取り込むとなると、480Mbpsとなり、 しっかりチューニングしないと転送は難しそうでした。そういうわけで、現状は一旦DDRメモリに一定量をためてから転送しています。

したがって、USB経由でデータ転送を行ったとしても、現状と使い勝手はほぼ変わらないと考えられます。それに、 USBガジェットとしての動作であれば、わざわざLinuxを使用しないでも、FreeRTOSで十分です。