えくせるぱわー

本を6割弱読み終えました.知らなかったExcelの技を知れるし,実践的統計学の教本としてもなかなかイケてます.今まで使ったことなかったけど今後使っていこうと思った関数,列挙してみる.

  • DEVSQ:変動(偏差の二乗和)算出
  • FORECAST:線形近似曲線の予測値算出
  • MODE.MULT:最頻値算出
  • MROUND:指定の倍数での切り上げ/切り捨て
  • OFFSET:指定のセル範囲返却
  • RANDBETWEEN:指令の整数範囲の乱数生成
  • STANDARDIZE:指定の平均,標準偏差をもとに標準化する
  • SUMPRODUCT:内積算出

他の技としては,既成の散布図に対し「形式を選択して貼り付け」で系列を追加するとか便利.

あと,ソルバーアドインって何なんだろうと思っていたのですが,これ,特定の条件を満たす値を逆算する的なものなのね.これで主成分分析の係数を算出するとか,なかなかなるほどと思いました.

実務で使えそうなのは,分析ツールの回帰分析.今まではLINEST関数で係数出して,掛けて足してとやっていたのですが,掛けて足さずともFORECAST関数でさくっと済ませるってことでまず感動.で,分析ツールの結果の見方とか載ってて嬉しい.補正R2は0.5以上,有意FとP-値は0.05以下にするってのを押さえておくだけでも,一味違う感じ.|t|は説明変数の影響度を表しているとか,賢さ上がるわ.

せんだらけ

某デバイスと通信するiOSアプリのテストをしました.開発機はMacのノートPCですが,普段使いはWindowsのノートPCです.ノートPCなのに,線だらけになりました.

結線図

75cm角のこたつテーブルにノートPCを2台並べただけで幅をほぼ使い切ります.バッテリーがなくなりそうなので,それぞれ電源コンセントから給電.同様に会社のネットワークへ繋ぐためのiPhoneもWindowsPCから給電.iOSアプリはMac上のシミュレータで動かし,それと某デバイスとの間の通信は無線ですけど,某デバイスの内部状態を確認するためにWindowsPCと結線.そんなこんなでこんな感じ.某デバイスはマイクロUSB,iPhoneはライトニング,MacはUSB Type-Cと,インターフェイスもいろいろで,一部アダプタを挟んだりしています.

終業後の片付け,こんなにかとちょっと疲れちゃいました.

がぞーしょり

久しぶりに趣味でプログラミング.6年前にもやりましたが,毎日撮っている自分の顔をタイムラプス的な動画にしようかと.同じく毎日撮っている新聞の一面記事も,隣に出そうかと.毎週撮っている室内の様子も並べようかと.画像を組みつつ,影やコントラストを補正しようかと.

4箇月前,会社ノートPCを持ち帰らず予期せぬテレワークに突入した際,自宅PCへVisual Studio 2017をインストールました.しかし,C++/CLIはインストールしていなかった様子.これ使いたい.ついでに不要なコンポーネントを削除しました.必要なコンポーネントだった様子.改めてインストールしました.なんやねん.

撮った写真,殆んどがRawデータなので,それをJPEG化するバッチ.の前に,昔の写真はあっちの外付HDDとかこっちの外付HDDに収まっているので,それを引っ張り出してあれやこれ.そんなことにだいぶ時間がかかりました.9年前から撮り溜めているので,5の付く日の写真だけを繋ぐことにしようかね.1箇月につき3枚,9年だと300枚くらいか.3fpsで1分40秒の動画か.丁度良さそう.

で,楽しい画像処理.普通の業務でもやっているいろいろトライアル.楽しいわ.納得する出来栄えにまだ至っておらず,もっともっと捏ねる所存.

ぽちったのきた

意外と早く届きました.約350ページで2cm厚と,読み応えあります.3000円は伊達じゃありません.ビジネス統計スペシャリストを受検するかどうかは決めかねていますが,いつもの試験勉強よろしく,進捗を載せておきましょう.習慣的にちゃんと読むようにね.

ISBN978-4-8156-0113-3

Windows10 1903

昨日もつまらないことでつまりましたが,今日もつまりました.

最近,Windows10 Proの1809から1903に更新されたのですが,それから調子が悪いです.午後のWeb会議後,ここいらでいっちょ,再起動しとこうかと思ったが最後,再起動していますのクルクルが終わりません.ご臨終を恐れて電源ボタン長押しは控え,放置しました.

仕方ない,その間はMacBookでiOS向けのライブラリの改修をやろう.そのためにまず仕様書等を確認しよう,と思いましたが,資料は会社のファイルサーバにあります.会社のファイルサーバへアクセスするには,仮想プライベートネットワーク(VPN)に繋ぐ必要があります.VPNに繋ぐためには,設定ファイルとそれなりのアプリをインストールする必要があります.その辺の手順は,会社のイントラネットに載っています.会社のイントラネットを見るためには,VPNに繋ぐ必要があります.あれ?

基本的にはWindowsのノートPCしか使わないので,MacBookでのVPN接続は考えていませんでした.面倒臭いけど,今後のことも考えて,セットアップしておくか.一応念のためにWindowsのノートPCを確認.うん,まだクルクルしてる.

で,どうするか.緊急避難的にVPN接続できるようにしていた私用PCを起こそう.手順書や設定ファイルをダウンロードしました.さて,これをどうやってMacBookへ持っていくか.あいにく,MacBookにはUSB TypeCの穴しかありません.私用PCからFirestorage経由でどっこいしょしました.手順書に沿ってセットアップ.会社のファイルサーバから無事,仕様書等を入手できました.

次,ライブラリが扱うデータファイルを調べたい.このファイルは,これまた持ち帰ってきたハンディ端末に入っています.吸い出すにはマイクロSDカードが必要.こんなこともあろうかと,マイクロSDカードとそれをSDカードにするアダプタを持ち帰っていました.やったね.が,待て.MacBookにはUSB TypeCの穴しかありません.一応念のためにSDカードリーダの付いたWindowsのノートPCを確認.うん,まだクルクルしてる.また私用PCの出番ですね.Firestorage経由でどっこいしょ.セキュリティっつーかガバナンス的になんか良くないな.

そんなこんなで今日は閉店.WindowsのノートPCはまだクルクルしています.Web会議明けから2時間半経ちますよ.仕方ない,電源ボタン長押しじゃ.強制終了後,念のため起動確認.うん,無事でなにより.じゃ,普通にシャットダウン.

…も終わりませんでした.10分くらいずっとクルクル.だめぽ.再び強制終了.保守メニューからver1809へ復旧させました.これでとりあえずちゃんとシャットダウンするようになりました.

もしかしたら,ver1903に更新している最中,VPNを繋いだり切ったりしたことで,中途半端に更新されたんじゃないかな,と思ってみる.今度は気を付けよう.

ところで,自宅の私用PCはとっくにver1909なんですけど,これってWindows10 Homeだからかしら.それとも会社のWindows10 Proの方はグループポリシー的な何かで抑制されてたりするのかしら.

SHFB

昨日もつまらないことでつまりましたが,今日も躓きました.

C言語で書いたメソッドのインターフェイスや処理内容を仕様書にまとめるにあたり,保守性を上げるため,ソースコードにXMLコメントの形で書くことにしました.ま,常套手段でしょう.それをCHM形式にするため,Sandcastle Help File Builderをインストールし,実行しました.しかし,正しく出力されません.summaryタグなどがmissingになります.

なしてか.XMLにはsummaryタグとかちゃんと出力されています.スペル間違いもなさそう.C言語はC#と違い,Visual Studioのエディタで「///」と打っても「/// <summary>」と補完されないので,微妙に非対応な感じもしますが,ちゃんとXMLを作るビルドオプションもあるし,ちゃんとCHM形式にできていました.会社のデスクトップPCに入っているSHFBとバージョンが違うけど,それが原因なのか? うーむ.この手の調査,相変わらず苦手で時間かかっちゃうのよね.

ようやく原因判明.ネイティブなC言語ではSHFBがうまく動かないみたい.試しにマネージな感じに,具体的にはC++/CLIのクラスライブラリにしてみたら,ちゃんと行けました.もしかしたら過去に試して成功したときも,C++/CLIだったのかも.

だとして,CHM形式のファイルを作るためだけに,本番のネイティブCとは別のダミーC++/CLIプロジェクトへわざわざコピペする運用,どうなの? 折角XMLコメントちゃんと書いたので,とりあえず今回はこれで押して参りますが.

てれびでんわ

ママンから先日,緊急事態宣言云々からの最近どーよLINEが来ました.快調だったり不調だったりを繰り返していますが,先方心配性なので,「震災後のような食欲減退の沈みモード」と暈して返しました.

そしたら今日,最近どーよLINE電話が来ました.いつものように,8割方向こうが話してました.そーいやテレワークでWeb会議する際,映像も流してみたりしてるなと思い,折角だから動画通話してみました.これで安心か.向こうはママンの他,だいぶ前に疎開していた妹と姪も顔出してきました.はいはい,伯父ちゃんですよー.もう1歳9箇月.知らぬ間に喋る言葉,増えてるみたい.

思えば,未来に来たもんです.私が子供の頃,TV電話なんて夢の技術でしたよ.便利な世の中になりました.インターネットや携帯電話のない時代,もう思い出せません.

いじでもりもでせん

Bitmap形式のファイルならフルスクラッチで読み書きできます.透明度情報を持った静止画といったら普通,PNG形式でしょうけど,自前ライブラリへ組み込みたいので,32bitsBitmap形式にすることにしました.

この素材,ゆくゆくはお客様から頂くものですが,開発用に適当なものを用意したい.会社にいるならPhotoshopを使ってあっちゅー間に作れます.しかし生憎,今日はテレワーク.どうしたものか.会社の人に連絡し,Photoshopが入っている私のデスクトップPCの電源を入れてもらい,リモートデスクトップで操作する手があります.でも,今後のことを考えると,会社からテレワーク用に持ってきているノートPCでも,類似の操作ができるのが望ましい.ということで,意地でもリモデせずにやっつけようと画策しました.

まず,先日知ったPhotoperaというWebサービスを試しました.ブラウザ上でPhotoshopみたいなことができる無料のサービスです.移動のときは「V」,自動選択のときは「W」など,慣れたショートカットが使えないのが辛い.ショートカットキーが使える風の表示なんだけどな.Edgeブラウザだと駄目なのか.IEでも駄目でした.もうワンチャン,Chromeをインストールして試したら成功.ヨカタ.が,残念.ショートカットは行けても,アルファチャネルを付けられても,それを32bitsBitmap形式で保存することができませんでした.

次,有名なGIMP.以前から使ってみたいと思ってはいたのですが,Photoshopがある身でわざわざ手を出すまで至っていませんでした.ダウンロードしてインストール.ショートカットとかチャネル操作とかいろいろがなかなか慣れませんでしたが,調べながらなんとかできました.ヨカタ.

最後におまけ.GIMPで作った32bitsBitmap,読み込んでいろいろ操作して出力した画像を見ると,何か表示がズレています.そもそも想定どおりの32bitsBitmapになっているのか.とかいろいろ調査.なるほど,GIMPで出力されたBitmapは,BITMAPFILEHEADERとBITMAPINFOHEADERの後,画素データが始まる前に変なデータ領域があるのね.bfOffBits視てちゃんとした位置から読むようにして解決.やれやれ.

おぼえられない

久しぶりに触っているJavaで諸々調査.試したいことを試すのに,しょーもないところからいちいちいぐぐらないといけないのが悲しい.int型をTextViewに表示するのどうやるの?とか,ディレクトリパスとファイル名を繋げるのどうやるの?とか,テキストファイルの出力ってどうやるの?とか.

らんだむ

PCとTVをオーディオケーブルで繋ぎ,アニメの主題歌や挿入歌をキャプチャし,歌詞を手打ちし,アーカイブするのが趣味?のはず?です.始めたのは恐らく23年前,高専に入学し,初めてのPCを買い,周りの連中の影響でアニヲタイズした頃です.現時点では約7600曲が溜まっています.

一覧をExcelファイルで管理しています.このExcelのマクロで,以下3種類のデータを更新・生成しています.

  • 歌詞HTML(ヘッダの曲名等を更新)やMP3へリンクするHTML(番組名等含む表形式)
  • コレクションしているリストのHTML(ホームページ掲載用)
  • PC操作中にBGMとしてランダム再生するプレイリスト

■プレイリスト生成ロジック改良

今回,プレイリスト生成のロジックを改良しようと思い立ちました.現在は,プレイリストに追加するかどうかを示すフラグの列を設け,そこが「O」になっているMP3ファイルのパスのみをプレイリストへ出力するようにしています.このフラグは,ホームページへ掲載するリストHTMLを更新するタイミングで,1年以上前の曲を「X」に変える運用にしています.これにより,直近1年の曲のみが再生されることになります.

アニソン管理ファイル
アニソン管理ファイル

しかし,たまにはもっと昔の曲と再会し,懐かしくなりたいなと.そこで,以下の要領でピックアップした曲をプレイリストへ出力したいと思います.

  • 直近6箇月は全て登録する.
  • それ以前は古いほど少なく,新しいほど多くなるような割合でランダムに採用する.
  • 全部で1000曲をプレイリストへ出力する.

■収録日の一覧化

そのためにはまず,収録日を一覧化する必要があります.大量なので,いちいち調べて手入力するのは非現実です.それだけで心折れちゃう.いろいろ思案した結果,MP3ファイルの最終更新日をピックアップすれば良いのではと.こんな単純なことに,なかなか思い至れませんでした.灯台下暗し.

マクロでの実装は簡単.最終更新日というか,ファイルの新しさが知りたいので,最古のデータを0とした月数を算出するようにしましょう.

Const AGE_ORIGIN As Integer = 2002 * 12 + 3
Dim fso As New FileSystemObject
Dim f   As File
Dim age As Integer
Set f = fso.GetFile("xxx.mp3")
age = Year(f.DateLastModified) * 12 + Month(f.DateLastModified) - AGE_ORIGIN

VBAがあまりに久しぶりすぎて,参照するライブラリ名「Microsoft Scripting Runtime」を思い出せませんでした.最古のデータは2002年3月で団子状になっていました.MP3なるものが出回り始めたこの頃,Wave(PCM)から一気にまとめて変換したんでした.これだとそれ以前の収録日情報が不正確になりますが,そこまでの精度は不要でしょう.

■加重ランダム採用

難しいのは,新しさに応じた重みでランダム抽出する方法です.VBAのRndメソッドが返す0以上1未満の乱数は,一様分布に従うものだと思います.これをどう活用するか.三つの方法を考えました.以下の5曲が候補に残っていて,そこから3曲を選ぶ例で説明したいと思います.

  • 曲A:月数1
  • 曲B:月数1
  • 曲C:月数2
  • 曲D:月数2
  • 曲E:月数4

■加重ランダム採用方法#1

最初に考えたのは,乱数を一つ算出し,それに対応する積算月数の曲を採用する,というのを繰り返す方法です.

月数積算月数採用条件採用率
A11Rnd*10<110%
B12 = 1+11≦Rnd*10<210%
C24 = 1+1+22≦Rnd*10<420%
D26 = 1+1+2+24≦Rnd*10<620%
E410 = 1+1+2+2+46≦Rnd*10<1040%

Rndメソッドの戻りが0.5だった場合,曲Cが採用されます.そして次の1曲は,以下の方法で採用されます.という風に繰り返す方法.

月数積算月数採用条件採用率
A11Rnd*8<112.5%
B12 = 1+11≦Rnd*8<212.5%
D24 = 1+1+22≦Rnd*8<425%
E48 = 1+1+2+44≦Rnd*8<850%

この方法の問題は,処理時間がかかることです.1曲選ぶたびに積算月数を再計算する必要があります.計算量は候補数×採用数のオーダーです.実行に1分以上かかりました.これは嫌.

■加重ランダム採用方法#2

次に考えたのは,月数に基づく確率で各曲の採用是非を調べていく方法です.

月数採用条件採用率
A1Rnd<0.1 = 1/(1+1+2+2+4)10%
B1Rnd<0.1 = 1/(1+1+2+2+4)10%
C2Rnd<0.2 = 2/(1+1+2+2+4)20%
D2Rnd<0.2 = 2/(1+1+2+2+4)20%
E4Rnd<0.4 = 4/(1+1+2+2+4)40%
  1. 乱数を算出し,0.1未満だったら曲Aを採用する.
  2. (曲Aを採用したかどうかに関わらず)乱数を算出し,0.1未満だったら曲Bを採用する.
  3. (曲AやBを採用したかどうかに関わらず)乱数を算出し,0.2未満だったら曲Bを採用する.
  4. 以下同様

この方法だと,一巡では採用数に達しないことが多いです.実際は分母がもっともっと大きいので,なかなかこの採用条件が満たされないのです.そのため,方法1ほどではないにせよ,何度か回す必要があります.例えば,1巡目で曲BとDが採用された場合は,2巡目で下表のチェックをしていくことになります.

月数採用条件採用率
A1Rnd<0.1 = 1/(1+2+4)14%
C2Rnd<0.2 = 2/(1+2+4)29%
E4Rnd<0.4 = 4/(1+2+4)57%

やっぱり処理時間,かかりました.全部で600巡くらい必要で,十数秒かかりました.これもちょっと嫌.

■加重ランダム採用方法#3

最後に考えたのは,方法2をベースに,残採用数が多いほど採用条件を緩める方法です.

  1. 曲Aの採用条件を「Rnd<0.3 = 1/(1+1+2+2+4)*残採用数3」とする.
  2. 乱数が0.3未満だった場合
    1. 曲Aを採用する.
    2. 曲Bの採用条件を「Rnd<0.2 = 1/(1+1+2+2+4)*残採用数2」とする.
  3. 乱数が0.3以上だった場合
    1. 曲Aを採用しない.
    2. 曲Bの採用条件を「Rnd<0.3 = 1/(1+1+2+2+4)*残採用数3」とする.

この方法でも,一巡では採用数に達しませんでした.何度か回す必要があります.とはいえ,加速項のお陰で,5巡くらいで済みました.処理時間は数秒程度.いいね.

こうして方法3でプレイリストに採用された曲の月数統計をグラフ化しました.良い感じです.頭痛に見合う価値があります.

月数に対する採用率
月数に対する採用率

みたいなことを眠い中やっつけるのが会社での私の仕事の一つです.上記の数理統計学的な理論立てが合っていたとしても,プログラムへの落とし込みに間違いがあると台無し.眠い中,どっちに誤りがあるのか探したりするの辛い.どっちもが合っていたとしても,目標とする結果に達していなければ,別の案を捻りだす必要があります.フレーフレー私.