いろいろバックエンドな人の備忘録

といいつつレイヤーのネタ書いてます。C/C++, Ruby(Rails)、自宅サーバー,PCパーツ,ネットワーク、あとピアノも。

<ピアノ>ノクターンに挑戦してみる

最近テックネタがかけてない。 だって書こうと思ったら すでにすご人たちが書いてくれてるんだもーん。(それでも書くほうがいいという話もあるが)

経緯

ヤバい病気ではないが、そこそこの病気になってしまった兼ね合いもあって、近々ピアノを2ヶ月ほど、会社を10日ほど休むことになった。 しかも、遺伝でも生活習慣でもなく先天的な病気というのだから、こればかりは運悪かった(ある意味よかったとも言える)と思うしかない。

手術したらしばらく手を使えないので、悲壮第2楽章程度までの経験値を減らさないよう今のうちに全力で脳に叩き込んでおく。

曲選択

「ショパンは難しいから趣味にしないほうがいい」

同僚から聞いた言葉。天邪鬼精神満載な私はこう言われたらやりたくなる、悪性なのである。

で、実際にショパンの曲を調べてみるが、まあ確かに難易度が高そうなものがおおい。 とりあえずAmazon Prime Music から聞けるだけ聞いて引けそうなものを選ぶことにした。

たかが1年の経歴(しかも大人になってから)なので弾けそうなものは意外とない。む、たしかにショパンの曲難しいの多いぞ。

エチュード(練習曲)というシリーズがあるらしいが、楽譜を見るととても弾ける気がしない。 ピアノをやる子どもたちは必ず練習曲って名前なのに、全然練習曲じゃねー!! というほど難易度の高めの曲シリーズらしくエチュードは断念。

ノクターンとの出会い

ノクターン op.9-2 はショパンノクターンといえば、この曲というほどポピュラーな曲。 きっかけは島村楽器のホームページで、電子ピアノの弾き比べをしている動画があった。

美しいイントロに惹かれ、早速調べてみると意外と読めた。 さらに運良く、購入した電子ピアノに付属していたおまけの楽譜集にもノクターンの楽譜があった。

ノクターンくらい常識だろ!と言われそうだが、私は恥ずかしながらクラシック曲を常識と言えるレベルまで知らないのである。

所感

練習を始めると、意外と知らない楽譜記号が多く、さらに目パース力もまだまだ低いのでかなりぎこちない練習になっている。

また、子供時代にならった曲の調に 変や嬰シリーズはなかったせいか、 変ホ長調も弾き慣れてないので、なかなか思うように演奏できない。

なので、変ホ長調でドレミファソラシド(この表現が正しいのか知らない。音楽用語では正しくないかも)を弾いて徹底的に耳に覚えさせ、その調で簡単な曲(きらきら星とか)を弾いてみたりして自分のものにする。 これは悲壮第2楽章のときもそうしてた。

まあ、はじめはいつもこんな感じだったような気がするので、そのまま練習をつづてけていくことにする。

<ピアノ>20年程ブランクある人間が1年でどれくらいまで弾けるか

noontage.hateblo.jp

そろそろ1年経つので、たまにはピアノネタを書いてみる。

スペックとバックグラウンド

  • 年齢:20代後半
  • 初ピアノ時期:4歳
  • 習ってた期間:2年以上2年半以下
    • ちょっと怪しい。けど小学生の頃にはもうやってないのは確実。
  • レベル:バイエル終了し、ブルグミュラー数ページやったくらいまで
  • 再開ピアノ時期:2016年6月~今。最後にピアノやってから20年以上経つ。

やめた理由は通っていた先生が亡くなったからで、ピアノ自体は好きなほうであった。 まあ練習が嫌でしょうがない時期もあったりはしたが。

11ヶ月で弾けるようになった曲

弾けるようになった・・・の定義は

  1. 譜面どおり引く
  2. 先生にOKと言われる

としよう。

曖昧だけど、素人が聞けば「弾けてる」といい、音楽歴が長い人が聞けば「いいけど、細かいところが気になる」と言われるくらい。

列挙してみるとそんなにないな・・・。 ごく最初の2週間はここの挙げたも以外を少しやってる(とても簡単なワルツだったような)

練習時間

1日平均 1時間くらいだろうか。長期休みや飲み会などでやってない日もある。

所感

流石にある程度音符は読めるようになったが、音符のパース力(非エンジニア向け>>読む力)は決して高くなく、横棒の沢山ある音符はまだ数えなければならない。 他にはスタッカートやダルセーニョなどをたまに見落として指摘される。

当然、バイエル時代習ってない知らない楽譜もあるので自宅練習時に見落として、レッスン時にしてきされることもある。(装飾記号のターンとか)

<日常ネタ>初めて受けたMRIの感想

以下、特に意味はないがラノベっぽい語り口調で書いてみる。

初詣に行かなかった祟なのか、何年も前のお守りのサブスクリプションが切れてるからなのか体調不良が続いている。 小中学校の頃は体調が悪くて学校休めるやつが少し羨ましいと思うくらい元気だけは取り柄だったはずなのだが。

一応まだ20代なのだがMRI検査を受けることになった。 案の定、検査を受ける人や待合室はお年を召された方が多かったが、自分の次の人は若い女性だったようにまれに若い人でも受ける機会はあるようだ。

待合室で待っている間に、UVB-76のようなブザー音と謎の揺れ、 放射系の設備が多いためか(ちなみにMRI放射線はでないらしい)、深くやたら天井の低い地下という環境もあって段々と気持ちが不安定になっていくのがわかった。

そこそこ待った気がしたが、名前を呼ばれ部屋に入ると不気味な環境に合わない若く美人な看護師さんは俺に着替えるように指示する。 検査着の浴衣っぽいのが 右前 で「あれ、右前って縁起が悪いのでは」と疑問になり調べたかったが、ここは地下3階。しかも強力な地場が出てるためスマホは余裕の圏外。 看護師さんが正しいというので正しいのだろう。(あとでわかった話だが、やはり浴衣は 左前 が正しいらしい)

そう言えば、調べるまで知らなかったのだがMRIって電源を入れてなくても強力な地場になっているらしく、 それを知らない作業員が引っ付く事故が時折あるんだとか。 (ちなみに、停止すると何週間も再稼働に時間がかかるらしい) ということもあって、パンツ一丁(と検査着)に着替えさせられるのは合理的なのだ。

検査が始まる。 押入れやエレベーターなど閉所恐怖症なので閉所恐怖症にチェックを入れていたのだが、 美人な看護師さんはニコットした顔で「大丈夫だとおもいますよ!入ってみてキツかったら考えましょうね」というので、その笑顔を信用することにした。

部屋に入るとメガバンクの金庫のような扉があり、看護師はその扉を開けた。 開けた先には当然大量の万札などあるわけもなくドラム型洗濯機のミュータントみたいな機械がたちそびえていた。 緊張感をなくすためなのか、部屋はホテルのような暖色のライトで照らされていた。

早速、救急車のタンカーのようなベッドに横になり、謎の機械とヘッドホンのようなものが装着されていく。最後に剣道の仮面のようなものが装着され首が固定された。 ゆっくり中に入っていく。随分前のガキの使いみたいにこんなシチュエーションがあったとおもう。

閉鎖感はほぼなかった。というか、剣道の仮面のようなもののせいで視界が狭いので、今いる空間が狭いのかどうかがわからない。 少し経過すると、ブザー音がなりはじめた。いま強力な地場が出ているのだろう。 ああ、引っ張られないところみると、自分の体は金属じゃなかったんだなぁ、生身の肉体だったんだなと当たり前のことを考えながらじっと耐える。

結構うるさい

絶対音感を持っているため、これは ファ# の音だなと音あてゲームをするような感覚で耐えることにした。 時々洗濯機の脱水音のような音も聞こえる。自分はこのあと造影剤を注射され再度検査したが、このルーチンが省略されることもあるらしい。

検査が終わるとあとは会計にいって、帰って良いといわれた。特に注意事項はなかった。 (このあと造影剤の副作用もなかった)

まとめると、

  • 閉鎖感はほぼなかった。自分がやった機械の直径は60cmらしい。
     古い建物のエレベーターのほうがよっぽど閉鎖感ある。
  • とてもうるさい 耳栓必須
  • 不安になるおとなので、予習しておくと良い  (自分はYouTubeで音の予習をしていたために、心の準備はできていた)

www.youtube.com 音量注意

<Windowsネタ>Windows Subsystem for Linux はマルチスレッド対応なのか

Bash はマルチスレッド対応?

Windowsbash が使えるようになってから久しい。 実は mac で事足りていたのであんまり使ったことがなかった。 今回、mac の調子が悪く、新しいものを購入する予算もないので(ピアノ買ったしね・・・)やむを得ず windows マシンで開発することにした。

きっかけは、新しいマシンでいつもやっている rbenv のインストールを行っていたときにCPUファンが周りだし ふとタスクマネージャーを覗いてみると、CPUのクロック数がターボ・ブースト状態(※1)になっていた。

今時のCPUは全コアを高クロックで動作させるのは熱や消費電力の問題があるようで、基本的に限界のクロック数で動いてはいない。 (詳しくはダークシリコン問題等で検索してほしい)

さて、そんなことよりターボ・ブーストがかかっているということは シングルスレッド で限界までCPUを食い尽くしていると見たわけだが これは、rbenv がシングルスレッドの設計なのか、 そもそも、bash.exe (しいては、Windows Subsystem for Linuxは)マルチスレッドに対応しているのかを知りたくなったので実験してみた。

※1シングルスレッドの性能を上げるために熱に余裕があればオーバークロックする機能

  • 6700k の定格は 4GHz だが 4.16GHz にブーストされている

f:id:nrtn:20170220145224p:plain

  • おなじみの rbenv のインストール

f:id:nrtn:20170220164916p:plain

Windows Subsystem for Linuxアーキテクチャ

Windows Subsystem for Linux とタイプするのが面倒になってきたので、以下:WSFL と書く。 WSFLのアーキテクチャは、検索すると沢山でてくるが要約すると システムコールレベルのエミュレーション であるようだ。

よくUbuntuVMが動作していると思われているがそうではないらしい。(私も誤解していた)

f:id:nrtn:20170220153219p:plain

上記の図は簡略図だが、簡潔に書くと Bash.exe が サービスを通じて、WSFL(lxcore.sys等があるようだ) を呼び出し 生成された Linux instance(インスタンス) 内の各Linuxアプリケーションを呼び出しているようだ。 あとは、普通のLinuxと同じく init->bash(シェル)->アプリケーション の順に動作しているよう。 ちなみに、アプリケーションが呼び出したシステムコール類は WSFLを経由して、最終的に Windows APIとして呼ばれる。

また インスタンスはユーザーごとに作成されるようだ。

(上記は筆者の解釈なので誤りがあればご指摘ください)

マルチスレッド対応の計測

で・・・

今回は最終的に Linux instance 内のアプリケーションのマルチスレッドがネイティブのWindowsでマルチスレッドとして動作するかを検証してみたい。

ネイティブのCPUをフルに使っていると判断するのはタスクマネージャーの各スレッド(ここではHTTのスレッド、コアを区別しない)をほぼ使い果たしていたら マルチスレッドに対応している ということにしたいと思う。

テスト

シングルスレッド

シングルスレッドのテストからしてみる。 なんの面白みもない普通の無限ループである。

/* single.c */
#include <stdio.h>

int main()
{
        printf("強制終了しないとおわらないよ♪");
        while(1);
}
gcc single.c -o single.out
./single.out

結果

  • 対象のCPUは 8スレッドなので 1/8スレッド=12.5% になるはずだが、他のプロセスも動作しているので若干それよりは高い

f:id:nrtn:20170220155116p:plain

  • こちらでは、 single.out が 13% と (ほぼ 1/8 スレッド) 専有している

f:id:nrtn:20170220164735p:plain

マルチスレッド

pthread をつかった、こちらも特に面白みのないコード。 CPUのスレッド分(今回は8スレッド)生成し、無限ループするだけ。

/* multi.c */
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define CPU_MAX_THREAD  8

void* task(void *p);

int main()
{
                pthread_t threads[CPU_MAX_THREAD];
                int iret[CPU_MAX_THREAD], ii[CPU_MAX_THREAD];
                for(int i=0; i<CPU_MAX_THREAD; i++) {
                        ii[i] = i;
                        iret[i] = pthread_create(&threads[i], NULL, task, (void*)&ii[i]);
                        pthread_detach(threads[i]);
                }

                getchar();

                exit(0);
}

void* task(void* p)
{
        printf("Thread %d\n",*(int*)p);
        while(1);
}
gcc -pthread multi.c -o omulti.out -std=c99
./omulti.out

結果

  • 各コア100%食い尽くされている。

f:id:nrtn:20170220163903p:plain

スレッドの開始する順番は不定なので連番にはなっていないがバグではない。 (排他制御等を実装しない限り、必ずしもスレッドが作られた順番にスレッドが進まない)

:~$ ./omulti.out
Thread 0
Thread 2
Thread 1
Thread 3
Thread 4
Thread 5
Thread 6
Thread 7
  • 99% 使用されている。(このビューでは 100% になることはないので事実上すべてのCPUを専有している)

f:id:nrtn:20170220164033p:plain

まとめ

ちゃんとマルチスレッドで動作しているようだ。

なんだから改めて見返してみると当たり前のような気がするが、 VMであれば、仮想マシンに割り当てる vCPU などで想像はつくが、カーネルに埋め込まれたエミュレーションレイヤーであったので試してみた。

余談だがタスクマネージャー上では Linux のプロセス名(~.out) でプロセス名が上がっていたが、こちらの詳細やプロパティは表示されなかった。 (何も表示されなかった)

f:id:nrtn:20170220165634p:plain