エクスプローラでOpen Live Writerの全文検索ができない

ログの作成・投稿に使っているOpen Live Writerをストアアプリからデスクトップ版に切り替えた.ストアアプリではOpen Live Writerをインストールしたフォルダを見つけることができない.マイクロソフトではストアアプリの方を売り込みたいらしく,Open Live Writerのウェブサイトは閉鎖されてしまっているが,ようやくGitHubにある Open Live Writer の現物を見つけた. EXEのあるフォルダが分からないとファイルの拡張子とアプリケーションをリンクすることができない.また,データファイルのデフォルトアプリが決まっていないと,エクスプローラでコンテンツ検索ができないことになっている.

いままでOpen Live Writerを重用してきたのは,過去記事の全文検索がローカルで可能だったからなので,もしそれができないとなればOpen Live Writerを使うメリットは半減してしまう.デスクトップ版のOLWをインストールして,*.wpostをOLWとリンクし,ファイルのアイコンを叩けばOpen Live Writer が起動するところまではできたのだが,全文検索がどうしてもできない.かなり悩んでいる.Meryなどのエディタには全文検索機能(grep)が付いているが,これは対象ファイルがプレーンテキストでないと動作しないので,まったく使えない.

現行の系列再配置処理はかなり場当たりに作られているので相当冗長な部分があるかもしれない.ファインチューニングすれば倍速くらいまでは向上できそうな感触があるが,しばらくは現状で進むしかないだろう.「純血統図をサポートし上流が養親系だけの場合の下流検定の動作を保証する」というところがいまいち分明でないので,もう少し詰めてみる.これが片付くとnodule.hで預かっているすべてのオプションが片付いたことになり,あとはBobject.hが抱えているDEBUGとVERIFYタグの項目を点検するだけになる.かなり整理されてきた.

オプションPUREBLOODSUPPORTではTOPOLOGY::getkinshipDegreeで以下のようなことを行っている.

  1. 基準ノードの親数をカウントする 
  2. もし,親数がゼロでなければ,先祖ノードを列挙し,先祖ノードを起点に親等計算を行う ただし先祖ノード不在で親数1の場合は基準ノードを起点に親等計算を行う
  3. 親数ゼロの場合は基準ノードを起点に親等計算を行う

PUREBLOODSUPPORTがONのときとOFFのときの違いは,OFFでは(1)を実行していないこと,(2)で先祖ノード不在の場合を見ていないこと,(3)の親数ゼロのケースが存在しないことが挙げられる.しかし,このようなことは純血統図でなくても起こり得ることであり,もしそれが処理できていなければ従来論理は誤っているということになる.オプションをOFFにして動作を確認してみよう.⇒特に問題はないように見える.先祖ノードからの下流検定ループで先祖ノードが空になった場合には必ず基準ノードからの下流検定を実施するようになっているから,漏れが発生するおそれはないように思われる.

この修正が導入された事情を知りたいので過去ログを探してみた.純血統図が導入されたのは2014年の3月頃と思われるが,結構てこずっていたようだ.PUREBLOODSUPPORTに直接該当する記事は見つからなかったが,3月20日の記事で,

「親等計算はつねに全域的に計算し,どこで計算しても同じ値になるべきであると考えられるから,親等計算で養親系を登らないようにするというのは多少問題があるようにも感じる.上記のような検定漏れが生じることを防止するのならむしろTABLESORT::getkinshipDegreeで対処した方がよいのではないかとも思われる.⇒その方向で再修正した.」

とあるのが近いのではないかと思う.「親等計算はつねに全域的に計算し,どこで計算しても同じ値になるべきである」とするのなら,一番確実な計算方法は親族範囲によってカードの有効・無効を決定する前に全体図上で親等計算を実施するというのが解ではないかと思う.親等計算は基準ノードさえ決まればあとは自動的に計算可能だから,系統並び替えを実施する前に実施することができる.この方式なら「親等不一致」は原理的に起こり得ない.しかし,純血統図の場合などはむしろ養親系を除外したときの数字が欲しいのではないだろうか?

親等計算をどこで実施するか?については再考の余地があると思う.PUREBLOODSUPPORTに関しては棄却とするか,ないしDEFECTEDではないだろうか?⇒一旦棄却でフィックスしてしまおう.

そればかりではなく,TOPOLOGY::getkinshipDegreeで先祖ノードが空のとき実行している基準ノードからの親等計算も不要と思われる.実際,モジュール構成図 TEST2の全体図テストではこの論理を完全に止めても問題なく動作している.現行ではsearchForefatherで先祖ノードが空の場合には基準ノードを返しているためと思われる.⇒例外が発生した場合には停止するように仕掛けてしばらく仮修正で運用する.

▲親等計算論理の解析中,ゼルコバの木モジュール構成図 TEST2の全体図テストで TEST2.ZELをノード=21 UndoChainのとき,PAIRBOX::repairCommonEndPointの出口で (CheckSamePoint())により停止した.反例サンプルは作られていない.反例を取れるようにしたが,再現しない.⇒リリース版だからではないか?確かにIDE上では停止する.反例サンプルはBUG20-11-16 16-50-27.ZEL.これは後で見ることにしよう.

DEBUG_NEVERでも反例を出力した方がよい.⇒対処した.⇒ただし,起動するたびに反例サンプルが生成されるというのは流石に過剰だ.パネルを出して,「保存」でファイルを生成というのがよいかも…

おかしい.66点サンプルの全体図テストが6面で終わってしまう.⇒一覧表上で現在選択されているカードから最後までをテストするようになっているようだ.⇒「仕様」ということにしておこう.

Bobject.hに置いてあるDEBGU: とVERIFY: タグのオプションの整理に掛かろう.すでにTRIBEBOXではシフト禁止リストというのを廃止しているのに,NAMEBOXにはSHIFTPROHIBITEDという属性が残っている.これは使われているのだろうか?シフト禁止は主に長い尻尾がオーバーシュートした場合の回数をカウントして上限を超えた場合にはシフト禁止にするなどの動作になっているが,長い尻尾長オーバーなどの事象はほぼ根絶されたものと思われる.ただし,カードシフト操作自体はSHIFTPROHIBITEDのステージ【5.1】絶対世代番号に基づいてカードシフトでShiftDirectAbsoluteとして実行されている.おそらく発現する可能性はゼロと思われるが,とりあえず現行のままとする.

まず最初にデフォルトでONになっている項目をチェックしておきたい.考え方としてはDEBUGはすべてデフォルトOFF,VERIFYはすべてデフォルトONというのがノーマルな状態と思うので,まず,DEBUGにあるデフォルトONから見ることにしよう.たとえば,NOSEGMENTSILENT(セグメント値ゼロでダンプしない)というのがある.この反対は「セグメント値ゼロでダンプ」だが,これならDEBUG: になる.「セグメント値ゼロで停止」ならVERIFYになるだろう.これはやはり正論理に改めておいた方がよいのではないか?

これに関連するブール値として,NODISPNOSEGMENT // セグメント値を持たないノードは描画しないというのがある.しかし,この値はFALSEに固定で実際には作動していない.過去の遺物と言ってもよい代物だが…セグメント値ゼロで描画まで来るということはまずないと考えられるから,この辺りはコードから一掃してもよいのではないか?余分なコードがなくなるとプログラムもかなりメンテし易くなる.NODISPNOSEGMENTとNODISPNOSEGMENT はともに廃止とする.

属性値は大文字で表記することが多いので,属性を返す関数も大文字表記にするとわかり易いのでないか?たとえば,IsElderWifeならISELDERWIFEとする.ただし,このような関数は副作用を持ってはならない.⇒関数型プログラミングに向かう方向だ.

INVESTIGATEVSPLITS(検出した垂直スプリットを画面に表示する)は廃止でよいはずだ.垂直セグメント検定はすでに廃止されているのだから…いや,垂直検定とは別に「全域垂直スプリット検査」というのがある.おそらくこれが作動することはないと思われるが…水平スプリット検査にはINVESTIGATEHSPLITSというのがある.これらはVERIFYでよいのではないか?「残留参照カウントの警告パネルを表示する」も監視という意味ではVERIFYだろう.

PRINTPARAMETER(人名枠にノード属性を表示する)というのはデフォルトでONということもないが,デバッグ時はつねに作動しておくものなのかもしれない.VERIFYに置くデフォルトでONの項目も通常はデバッグ時限定と考えられるので,_DEBUGで囲んでおけばよい.

DRAWTRIBEGENEBOX(世代枠矩形領域を描画する)は現状でフィックスでよいのではないか?系図画面設定パネルで切り替えできるようになっているが,これがOFFでは表示できないし,系列枠にはそのようなものはない.いや,これはオプションかも知れない.ONではGENEBOX::Drawを呼び出すようになっているが,OFFではXORで矩形領域を塗りつぶすようになっている.

世代枠反転色というのを試して,何も出なかったので廃止と決めたのだが,確かに作動はしている.ただし,なにかバグがあるらしく,米粒くらいにしか見えない.⇒これもなにかの役に立つ可能性はあるので温存しておこう.どこに置けばよいか?設定パネルでは「世代枠反転色」とあるので,もともとはこれが仕様だったのだろう.「背景色」としないで「反転色」としたのは,ユーザがバグと間違えないようにというつもりだったのだろう.⇒世代枠が表示されないのは矩形領域に値が入っていないためかもしれない.⇒とりあえず,OPTIONSに移しておこう.系列枠を描画すると上書きされてしまうのは欠陥だ.もし,ONでリリースするのなら,反転色を背景色に改めなくてはならない.

「WriteNonStopSampleListを一時停止@20161026」がデフォルトでONというのも芳しくない.デバッグ用のログ出力などはほとんどフラグを使って操作しているので,その方式に改めた方がよい.⇒WriteNonStopTestLogというフラグを新設した.DEBUG: には現在デフォルトOFFの項目が38個ある.このうちのDEBUG:で始まる11個はすべて廃止してcheck文の中に押し込むことにする.⇒片付いた.

「CheckWasteCountを呼ぶ」というのがある.ゴミ箱の中身をダンプするというものだと思うが,むしろ,呼び出し側ではなく,OFFのときはCheckWasteCountから無動作で戻るという動作の方がすっきりする.「CheckWasteCountを実行する」に改めておこう.

「端点共有ノード対をカラー表示」というのがある.ちょうど今その反例サンプルが手元にあるので試してみよう.⇒BUG20-11-16 16-50-27.ZELを開いてみたが,特に色の付いている線分は見当たらない.GREENないしBLUEで塗ることになっているのだが…解消してしまっているのだろうか?端点共有というのはノード対の属性なので,これがリセットされているということは解消しているということではないか?

「ノード対区間ゼロで端点共有不可」というのと「端点一致でsamepoitゼロ」というのが起きている.ただし,前者はエラーにはなっていない.障害は[ノード対]:#634:#308 MDB(1)→#191 MDB(0)で起きている.MDBは親を3組持っている.topologyとlinktable, namesortだ.

image

左から入ってくるnamesort→MDB(イエロー枠)と直上から下がるlinktable→MDBはわかり易いが,確かに右から入ってくるtopology→MDBを識別するのは難しい.右隣りのPDBも同じように親を3組持っているが,こちらははっきりと識別できる.「端点一致でsamepoitゼロ」というのが何を意味するのかよくわからないが,多少不都合であることだけは確かだ.それにしても,「端点共有属性」をどこで落としているのかが問題だ.⇒これは,後で見ることにする.

「相対座標系から絶対座標系への変換結果をチェックする」というのがある.これは絶対座標系に変換する前にあらかじめTREEVIEWとの原点距離から測定した絶対距離を保存しておいて変換後に比較するというものだ.異同があれば,停止するようになっている.使うチャンスがあるかどうかは別として置いておくでよいだろう.

「選択人名枠の背景色描画でXORを使わない」というのがある.どんなことになるのかやってみよう.⇒これはかなりひどいことになる.一度クリックすると元に戻らない.

image

XORで描画する以外の方法があるのかないのか分からないが,これは現状でフィックスでよいのではないだろうか?あるいはSPECIFICATIONに移動することもできるが…単に矩形枠を塗り潰しているだけなので捨ててもよいと思う.「画面中央不動点をカラー表示する」というのもある.最近この必要性を感じていたところだ.すでに試みていたとは…その割には成功していないような感じもするが…

「HasMultiOccurrence:隠蔽カードを検出する」というのは,前にも出てきていたような気がするが…⇒いや,これはどこからも参照されていない.すでに廃止されていると思う.

DISREGARDLIMITSIZEOVER(描画矩形領域オーバーフローを無視する)これは仕様的にまずいと思う.オーバーフローを無視するにしても対処するにしても,オーバーフローが発生していることを検知しなければ始まらない.現状では「描画矩形領域オーバーフローを無視する」ONにすると検査自体を実行しないことになってしまう.

これは表現を変えて,「描画矩形領域サイズオーバーを監視する」CHECKDRAWSIZEOVERとしてデフォルトONでSPECIFICATIONに移すことにする.⇒これでDUMP: タグの中はすべてデフォルトOFFになった.23件になった.あとはVERIFYだけだ.こちらは,デフォルトOFFから見てゆくことにしよう.

PRINTABNORMALGENEGAPはcheck文で代替できる.

TOTALCONFLICTION,ALLOWMARGGAP,UPSTREAMSYMMETRY,SYMMETRICPRIMEMOVE,DONTAPPLYLOCALBEND,OYASANSYOPATH,CHECKCROSSINGJOINT,CHECKSYMMETRICPOINT,LOCALBENDCONSTRAINT,SELECTOLDEST,CHECKTRIBECOMPLETE,SINGLESPECIALLINE,INITILIZEPAPERSIZE,_DEBUG_VACUUM,ISALIGNTIGHT,NONRIGIDSYMMETRY,LINEAGE_PARTIALTREE,MOVELOWERBLOCK

は参照されていないので廃止.これらを除くとDEBUG: から降りてきたのを除いて,VERIFYに残ったのはデフォルトONが7件,OFFが3件になった.計10件になった.いや,廃止になるものがまだ残っていた.AVAILABLECHANNEL,MOVENEUTRAL,COMPLETETREE.

「写真がゴミ箱の中にあれば停止」というのがある.どういうことだろう?カードの中にあるbitmapinfo,cBitmap,notepageは任意サイズのオブジェクトだが,これらがゴミ箱には入らないというのはどういう理由なのか?確かに写真イメージなどはアプリ終了時にまとめて始末していたような気もする…UNDOでバックアップするときに複製を取るのはコストが掛かり過ぎるという理由だろうか?20180215という日付があるので,ログを調べてみよう.タイトルは「写真イメージ貼り込み・削除のUNDOをサポートする」となっているので,やはりその辺りが理由になっているようだ.

freeblockで取得したメモリはすべてアプリ終了時まで保持されている.これは他のオブジェクトでも同じだが,delete xxx を実行すると,オブジェクトxxxはゴミ箱に入る.写真や記録ページはカードに付帯しているものだが,明示的に delete されていないので,そのままfreeblockにキープされた状態になっている.「画像を貼り付けてもUndoで消えてしまう」という問題が発生したために,もしかしてゴミ箱の中ではないかと考えてこのトラップを仕掛けたのだろう.実際には入っていなかったので外してもよいのではないかと思う.

オブジェクトがゴミ箱の中に入っているか否かをチェックする関数IsInTrashCanはあるが,オブジェクトのメモリ上のアドレスからfreeblockの位置を取得する手続きを実行している例はこれ以外にない.そういう関数を一つ作っておいてもよいと思うが,小さ過ぎて見つけるのは結構難しいかもしれない.⇒そこまでやる必要もないだろう._getblock_という関数は別のところでも使われている.⇒廃止でよいと思う.INITIALIZEPRINTERも廃止でよい.このプラグマでは何もしていない.InitializePrinter自体は複数の別の位置で実行されている.

SORTLOOSEBOX(ルーズな結婚枠配列をソートする)は廃止してもよいだろう.現在はアクティブではないし,MAXIMALGRAPH:SortLooseBoxも使われていない.この関数はルーズな兄弟枠を世代順に並び替えるもので,コンパクトなレイアウトを作り出すための効果的な手続きを案出しようとする試みだが,あまり成功したとは言えない.この関数自体廃棄でよいと思う.INTERSECTRECT(BRect:InterSectRect関数で接触を交差に含める)とあるが,現状では「接触を交差に含めない」動作になっている.この関数は広範に使用されているので,現状でフィックス以外の選択はない.

HasMultiOccurrence:隠蔽カードを検出しない@20190131は検出しないとしながら,実際はhiddenで停止するようになっている.有効で可視のカードが隠蔽されているというのはやはりおかしいので停止でよいのではないだろうか?⇒DEBUG_NEVERで置き換えることにしよう.CHECKRINGCOUNTはデフォルトOFFなのでDEBUGに移動する.SYMMETRICMOVELOOP(HeapSymmetryBoxでCheckMargPointループを実行する)はすでに2016-11-14に 廃止が決定している.

終わった!VERIFYにはデフォルトONが5個残った.まだ少し残っている.DEBUG: の方はすでに参照されていない項目のチェックをやっていない.PRINTEMPTYPAGE,PRINTPHASENAME,はすでに参照されていないので廃止.これですべてだ.DEBUG: はすべてデフォルトOFFで22件,VERIFY: がすべてONで5件となった.OPTIONS: はすべてデフォルトOFFで9件,SPECIFICATION: がすべてONで15件だ.いや,OPTIONSにDEBUG: のタグでデフォルトONというのが混じっている.

DRAWTRIBEGENEBOXだ.裏面の反転表示は動作不良になっている.デフォルトONというのは規定ではSPECIFICAITONかVERIFYになるところなのだが… 動作的に考えるとSPECIFICATIONに置くしかないような気がする.裏面を補修して元の仕様に戻すことも考えられるが,なぜ現在の仕様になっているのかも考えなくてはならない.あえて分類すれば,INCOMPLETEになってしまうのだが…(一応現状で動いているし)それほど重要な項目でもない…⇒SPECIFICATIONに入れておいた.ONでなければ動かないという条件があるのでここに置くしかない.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA