2016年11月27日日曜日

パノラマ

 先日、景色のいい片田舎を散歩しました。
 実際に目で見る景色は、いつだってテレビより壮大です。そこで、どのくらい壮大なのか少し考えてみました。

 半径1[m]の球の中心にいる人間を想像してみます。
 半径1[m]の球の表面積は、4 x pi x 1[m] x 1[m] = 12.56 [m^2]です。人間が一度に見られる視界の範囲は、個人差があると思いますが、球の表面の1/8としてみます。すると、人間の全視界は、1.57[m^2]です。

 球の内側に40インチのテレビがあるとします (40インチのテレビを1[m]しか離れずに見るのは近い気もしますが)。40インチのテレビの大きさは、88.6[cm] x 49.8[cm]、だそうです。この面積は、0.44[m^2]です。この面積は、先ほどの全視界と比べると30%くらいです。

 単純に面積を比較すると、40インチのテレビでは実際の目で見る景色にはかなわないようです。壁一面をテレビにするくらいでないと足りなさそうです。

 高画面化や3D化など、今でもテレビの技術革新は進んでいます。ですが、実際に自分の目で見た景色には、テレビに勝るものがあります。自分の目で見て感じることをもっと大事にしようと思った次第です。

2016年11月20日日曜日

日々に数学

 一人暮らしの私は、毎週、部屋の掃除をします。

 掃除をしないと、ホコリはたまり続けます。洗濯機の奥など掃除しづらいところは、いつの間にか大量のホコリがたまっていたりします。ホコリは増えることはあっても、掃除をしない限り、減ることはありません。

 ホコリの増加は、「単調に増加する数列は無限大に発散する」という数学を連想させます。ホコリもいつか無限大(?)に発散するでしょう。
 数学はとても家庭的です。 (^o^)



 話は変わりますが、昨今、日銀は2%の物価上昇率の目標値を設定しています。2%の上昇率なら、10年で1.2倍、30年で1.8倍、100年で7.2倍です。物価も減少することなく増加するなら、いつか無限大に発散します。
 経済の予想が正しくないことは多いですが、数学の予想は絶対に正しいです。





2016年11月6日日曜日

ウィルスバスターズ

 インターネットにつながった監視カメラが、ウィルス攻撃の対象になっているという記事を読みました。

 身の回りの家電製品をネットワークでつなごうというIOTが流行っていますが、家電がネットワークにつながるということは、ウィルスによる攻撃を受ける可能性があるということです。ということは、家電にもウィルス対策が必要です。

 自動車にも冷蔵庫にもエアコンにもウィルスバスター。家電もときどきウィルススキャン。ウィルス対策していない自動車は危険なので走行禁止。
 IOTを推進しようとしている方々はそういう未来を期待しているのでしょうか?

 IOTに反対するわけではありませんが、せっかくネットワークにつながった家電がウィルススキャンでフリーズしたら笑い話にしかならないと思いました。


2016年10月30日日曜日

C#でMIDI その0

 私の趣味の一つはプログラミングです。最近のWindowsにはC#のコンパイラがついているので、いろいろ遊べます。

 今回はC#を使ってMIDIのプログラミングをしてみようと思います。

 プログラミングをするには、当然、予備知識が必要です。たいていはGoogle先生とかWikipedia先生に訊けば分かります。

 とりあえず、手始めにMIDIファイルの構造を以下にまとめてみます。

 次回以降が実際のソースコードです。まぁ、百聞は一見に如かずで、ソースコードを見た方が分かりやすいかもしれません。

参考URL
MIDI
SMF 
C#
Windows API


==================================================
MIDIファイルの構造 (SMF, Standard Midi File)
<HeaderChunk> + <TrackChunk> + <TrackChunk> ...

MIDIファイルには複数のフォーマットがある (SMF0, SMF1, SMF2)
SMF0 : TrackChunkは1つ
SMF1 : TrackChunkは複数 (1つのTrackには1つのChannelが対応, 最初のTrackにはテンポなどの情報だけ入れる(コンダクタトラック))
SMF2 : 使われていないらしいので省略
==================================================
<HeaderChunk>
ChunkID            4bytes, "MThd"
ChunkSize          4bytes, Big Endian, 6
FormatType         2bytes, Big Endian, 0 or 1
NumberOfTracks     2bytes, Big Endian, SMF0なら1
TimeDivision       2bytes, Big Endian

TimeDivisionについて
(1) bit15が0の場合(0*** **** **** ****)
4分音符の分割数 (48, 96, 960, etc)
4分音符の実際の時間は、MidiEventのMetaEventで設定可能 (デフォルトは0.5sec)

(2) bit15が1の場合(1aaa aaaa bbbb bbbb)
1aaa aaaaが1秒間のフレーム数 (-24, -25, -29, -30)
bbbb bbbbが1フレームの分解能 (4, 8, 10, 80, 100, etc)

(1)を使うことが多い
なお、MIDIでは最小時間単位をtickという
==================================================
<TrackChunk>
ChunkID            4bytes, "MTrk"
ChunkSize          4bytes, Big Endian
Data               MidiEventの配列

MidiEventには、ChannelEvent , SystemEvent, MetaEventの3種類がある(最初の1byteで区別する)

variable(可変長)について
最上位bitが1なら、次の1byteもデータと見なす
(1xxx xxxx 1yyy yyyy 0zzz zzzz) は (xxx xxxx yyy yyyy zzz zzzz)を意味する
最大4bytes (データは最大で28bits)
==================================================
<ChannelEvent>
DeltaTime      variable, Big Endian, 直前のMidiEventからの時間 (tick単位)
EventType      1byte, 0x80-0xEF
Param1         1byte
Param2         1byte, EventTypeによっては存在しない

0x 8n kk vv    3bytes, Note Off
0x 9n kk vv    3bytes, Note On
0x An kk vv    3bytes, Note Aftertouch
0x Bn cc dd    3bytes, Controller
0x Cn pp       2bytes, Program Change
0x Dn vv       2bytes, Channel Aftertouch
0x En ll mm    3bytes, Pitch Bend

n      4bits, 0-15,  Channel Number
kk     1byte, 0-127, Note Number
vv     1byte, 0-127, Velocity
cc     1byte, 0-127, Controller Type
dd     1byte, 0-127, Controller Value
pp     1byte, 0-127, Program Number
ll     1byte, 0-127, Pitch Value
mm     1byte, 0-127, Pitch Value

ChannelEventでは、同じChannelEventが連続するときは、2回目以降が省略可能 (Running Status)
1つのChannelには1つの楽器を対応させる (n=9はパーカッションに固定されている) (SMF1なら1つのTrackが1つのChannel、1つの楽器に対応する)
ControllerについてはWikipedia etcを参照
Program NumberについてはWikipedia etcを参照
llとmmは2つで1つのパラメータ(0-16383、8192のときはPitchの変更なし)
ll=0xxxxxxx, mm=0yyyyyyyは、yyyyyyyxxxxxxxを意味する(Little Endian)
==================================================
<SystemEvent>
DeltaTime      variable, Big Endian, 直前のMidiEventからの時間 (tick単位)
EventType      1byte, 0xF0 or 0xF7
DataLength     variable, Dataのサイズ(byte単位)
Data

Dataが長い場合は、複数のSystem Eventにすることもある(送信エラーも起こりうる)
Dataの最初なら、System EventはF0で始める
分割されたDataの途中なら、System EventはF7で始める(variableは分割されたDataのサイズ)
Dataの最後にはF7を付ける (variableにはF7の1byteも含める)
==================================================
<Meta Event>
DeltaTime      variable, Big Endian, 直前のMidiEventからの時間 (tick単位)
EventType      1byte, 0xFF
MetaEventType  1byte, 種類はたくさんある
DataLength     variable, Dataのサイズ(byte単位)
Data

0x FF 00    シーケンス番号  (Dataは2bytes)
0x FF 01    テキスト
0x FF 02    著作権
0x FF 03    シーケンス名
0x FF 04    楽器名
0x FF 05    歌詞
0x FF 06    マーカー
0x FF 07    キューポイント
0x FF 20    MIDIチャンネルプリフィックス    (Dataは1byte)
0x FF 21    ポート指定  (Dataは1byte。非標準。)
0x FF 2F    トラック終端    (必須。Dataは0byte)
0x FF 51    テンポ      (Dataは3bytes)  4分音符の秒数(usec単位) デフォルトは500000usec
0x FF 54    オフセット  (Dataは3bytes)  hr mn se fr ff  0-23, 0-59, 0-59, 0-30, 0-99の値をとるらしい
0x FF 58    拍子        (Dataは4bytes)  4/4拍子とか
0x FF 59    調号        (Dataは2bytes)  シャープ、フラット、長調、短調
0x FF 7F    シーケンサー特定メタイベント
==================================================
参考URL
http://ja.wikipedia.org/wiki/General_MIDI
http://www.midi.org/techspecs/midimessages.php
==================================================



失われない情報

 インターネットで調べものをしていると、「最新」と書かれた5年前の記事を見つけたりします。

 「当時は最新だったのだろうなぁ」と思いつつ、「紛らわしいから、最新なんて書くなよ」と思うわけです。

 古い記事だとすぐに気づいたときはいいですが、読み終わってから気づくと、少し「イラッ」とします。

 インターネット上の情報はなかなか消えません。簡単にコピペできるので、消したつもりの情報が、いつの間にかどこかに転載されているなんてことも起こり得ます。

 だからこそ、情報を書く側は、いつの情報かを記録すべきだし、情報を読む側は、いつの情報かに注意すべきだと思います。

 ちなみにこのブログの記事はアップロードされた日付に従っているはずです。

失われる情報

 先日、スマホに入れていた写真のデータが消えてしまいました。

 知らずに操作ミスをしたのかもしれません。USBメモリの代わりにサイズの大きなファイルをコピーしていたのが悪かったのかもしれません。気づいた時には消えていました。

 スマホのデータの復元方法を調べて、慌てて試してみましたが、データは見つかりませんでした。すでに別のデータが上書きされてしまったのかもしれません。データが復旧できることもありますが、復旧できないこともあります。

 無くなった写真は、近所を散歩したときの写真とか、メモ代わりの写真とか、どうでもいい写真だったはずです。ですが、今となっては分かりません。大事な写真があったかもしれないと思うと、ちょっと落ち込みました。

 どんなデータも失われる可能性があります。少なくとも、大事なデータはきちんとバックアップしておこうと思った次第です。

2016年7月10日日曜日

Windows10

 Windows10にアップグレードしました。

 世間では、半ば強制的なアップグレードが問題になっていますが、今後のサポート期間のことを考えると、アップグレードしておいて損はないと思います。

 アップグレードした感想ですが、特に使い勝手が悪い訳でもなく、不満はありません。少し気になったのは、スマホなどと同じく現在位置などの情報を勝手に使うみたいなので、設定に注意が必要ということです。アップグレードの通知より、個人情報を勝手に使う方が問題な気がします。

 今回のアップグレードには少し苦労しました。
 5年くらい使っているパソコンで、いらないデータがたまっていたので、まずはOSを再インストールするところから始めました。

 適当にデータをバックアップして、Windowsを再インストール。そこまでは何も問題なかったのですが、次に各種ドライバをインストールしようとしたら、設定ファイルが見つからないとかで、インストールできませんでした。メーカーのインストールCDなのに、です。ドライバがおかしいので、ディスプレイの表示が変だったり、USB3.0が使えなかったり、インターネットにつながらなかったり。「えっ・・・、どうしよ?」って感じでした。
 結局、スマホを使って、メーカーサイトからドライバをダウンロード、それをインストールして、なんとか使えるようになりました。ほっと一息。

 で、次にWindowsの更新をしようとしたら、6時間経っても終わらず・・・。インターネットで調べてみると、「Windowsの更新用のプログラム」の更新をマニュアルで実行すれば良いらしいと分かり、なんとか更新も終わらせられました。ほっと二息。

 ここからようやくWindows10のアップグレードを始めて、なんとか終了。結局、丸1日以上かかりました。「ふぅー。PC動いてよかったー!」て感じです。

 私は、パソコンのスキルについて、ど素人ではないつもりです。ですが、それでもパソコンを使いこなすのには苦労します。今回のアップデートなんかは、私が素人だったらできなかったでしょう。

 私の会社の年配の方は、Excelの使い方で既につまずいています。昔のExcelは使えたけど、バージョンが上がって機能についていけなくなったみたいです。

 今の時代、パソコンが使えるのは当たり前のことのようですが、気を抜いていると技術はいつの間にか変化してしまいます。技術の変化に対応するため、勉強し続けないといけないと思った次第です。