最終更新: 2017-10-03T19:34+0900
何も起こりません(起こったら困る)。見どころもありません。ただの日常です。
だいたい何を考えてるかというと、コーナーで向かいから視界を塞ぐような大型車が迫ってきたら怖いな、いきってセンターを割り込んだ車が突っ込んできたら怖いな、ハンドルを回すのを面倒くさがったドライバーがセンターを越えてきたら怖いな、そこが右コーナーで、ライダーの頭が対向車にぶつからないようにアウトにふくらんだときにタイヤが落ち葉や砂利を踏んだらこけそうで怖いな、そうならないために車体を立てても曲がれるだけの余裕をもったスピードで走れているだろうか、コーナーで一瞬先の目の前にエンコ(※初めて使ったけど通じるんだろうか)した車が現れても止まれる速さで走れているだろうか、そのとき後ろの車は反応できるだろうか、というようなことをずっと考えてる。
時にタイヤ1本分も余裕のない際際まで対向車を避けるのは、他人の責任で事故に遭うのが耐えられないから。壁際は安心できる。左右を挟まれた真ん中の車線なんて絶対に走らない。
車を運転するときは、(1)安全であると確認したエリア、(2)安全ではない(他者がいる)と確認したエリア、(3)どちらとも確認できていないエリア、の3つに視界を塗り分けるようにしてる。大事なのは3番で、ぼんやりしてると脳みそが勝手に未来図を外挿(※最近仕入れた単語。補間と対にして使いたい)してしまって、教習所が言うところのだろう運転になってしまうところを、意識してまだ確認できていないことを、岩が落ちていたり壁が建っていたり奈落が広がっていたりしても不思議ではないことを、絶えず確認する必要がある。
>net user 俺
によれば Event Log Readers/HelpLibraryUpdaters/Netmon Users/Performance Log Users/Performance Monitor Users/Remote Desktop Users/Users というローカルグループに属しているらしい。ローカルセキュリティポリシー>ユーザー権利の割り当てによれば名指しで システムパフォーマンスのプロファイル/メモリ内のページのロック/リモートコンピュータからの強制シャットダウンの3つが許可されている。その他にもシンボリックリンクの作成やらなにやらを Users に対して許可していたりする。何かの割り当てが引っかかったのだろうか。最近(つまり先月の Windows Updateに伴う再起動以後に)変更しただろうか。■とりあえず権利の割り当てと参加グループを変更してはログオフを繰り返して試行錯誤してたら UACに名前が出てこなくなった(最終的になんの権利も放棄していないのに!)。めでたしめでたし?For class and private DCs, GetDC leaves the previously assigned attributes unchanged. However, for common DCs, GetDC assigns default attributes to the DC each time it is retrieved. For example, the default font is System, which is a bitmap font. Because of this, the handle to a common DC returned by GetDC does not tell you what font, color, or brush was used when the window was drawn.」。ダイアログのウィンドウハンドルを使って得る DCが「
common DC」なのかって聞かれると自信がないけど。あるいはまだ一度も SelectFont(SelectObject)してなかっただけとか。■r3879はフォントに高さを聞いたがそれを知らない俺はリソースファイルがうまくやるやり方に従った。オーナードローコントロール以外はそれで文字が切れたりしてなかったから。カスタムDPIでもうまくやるかは知らない。■ちなみに MapDialogRect(※先のスクリーンショットに写しておきました)を使うのは3番目の(それで最後の)案で、その前には引数を4つ(left,top,right,bottom)も取らない GetDialogBaseUnitsを検討した。実際 MapDialogRectで使ってるのは bottomと topの2つだけだし、それが GetDialogBaseUnits関数は引数をひとつも取らないって言うんだから、これで間に合うならこれを使おうとするだろう。……でもひとつも? ダイアログのウィンドウハンドルもいらない? 実行コンテクストを参照してマジカルな方法で答えを返すとでも? 答えはここに>「GetDialogBaseUnits is a crock – The Old New Thing」 crockは「ナンセンス、でたらめ」という意味が何番目かに載ってる。■WM_MEASUREITEMに反応してオーナードローアイテムの高さを変える方法は邪道ではある(が、適切なデフォルトを設定しているだけだとポジティブに考えたい)。変更対象のファイルが個別のプロパティシートに対応したものではなく、基底クラスのもの(prop/CPropCommon.cpp, typeprop/CPropTypes.cpp)だということからそれが知れる。WM_MEASUREITEMは WM_INITDIALOGより前に呼ばれるから、基底クラスが派生クラスにディスパッチする仕組みが働かないんだよね(だから基底クラスのファイルに直に書いた)。これが同じ事情を説明してる>「OnMeasureItem will be called only if the control's class is created at run time, or it is created with the LBS_OWNERDRAWVARIABLE or CBS_OWNERDRAWVARIABLE style. If the control is created by the dialog editor, OnMeasureItem will not be called. This is because the WM_MEASUREITEM message is sent early in the creation process of the control. If you subclass by using DDX_Control, SubclassDlgItem, or SubclassWindow, the subclassing usually occurs after the creation process. Therefore, there is no way to handle the WM_MEASUREITEM message in the control's OnChildNotify function, which is the mechanism MFC uses to implement ON_WM_MEASUREITEM_REFLECT.」 邪道だろうがなんだろうが、ツールバータブの個別対応コードを削るだけでダイアログのフォントを正しく変更できたのだから嬉しい。「やってやったぜ!」■これはなんだろう>「Imp: ダイアログのフォント変更設定追加 · mocaskr/sakura@af39f17」 リソースからコンパイル済みのダイアログテンプレートを読み込んで、それからダイアログを作成するまでのあいだにフォント指定を書き換えるってこと? うへぇ、こんなんMS Pゴシックにも Meiryo UIにも満足できないこだわり派のユーザーも黙っちゃうよ。そうか、実行時に変更できるのか。■「履歴を読んでるだけで楽しい」とか書いていてもそれは楽しそうだ、というだけのことで、実際に読んではいなかったり。「列を指定してソート。たしか秀丸にあったことで知った機能」というのもそうだし、「ダイアログのフォントとしてMeiryo UIが指定可能」というのも、検索に引っかかって初めて気付くわけで、検索可能なオンラインのヘルプっていうのは広告塔なのだね。■ダイアログのフォント指定は言語設定と同じように特別な配慮が必要な設定だろうか。つまり、表示言語をうっかりクリンゴン語に変更してしまうとスタートレックを見たこともない自分は元の設定に戻すことさえできなくて設定画面の迷宮で途方に暮れてしまうわけだけど、ダイアログのフォント設定を間違えたり壊したりすると同じように元に戻せなくなりそうなので。※iniファイルを直接編集するという解決法は、可能であるというだけであって、利用者に求めていいことではない(俺だってやりたくない)。■実はフォント設定にからめてセキュリティフォントをからかってやろうとしたのだけど、自分の想像が及ぶ程度の素朴な仕組み(※salt付きの換字暗号)ではなかったのでやめた>「自称完璧なマイナンバー保護技術『セキュリティフォント』 その1 - Windows 2000 Blog」
absent operatorの挙動だが、(?~) は何にもマッチしないのが期待値なんだろうか?」■空パターンはすべての文字列に含まれている(※空文字列を含め何にでもマッチする)というのが普通なので、そういう文字列以外にマッチするパターン(※非包含オペレータが表すもの)は何にもマッチしないのだろうかってことだよね。文字の集合に対する
[]
(どの文字にもマッチしない)と [^]
(どの文字にもマッチする) とは反対なのが面白い。■文字集合を使った初心者のよくやる間違い [^ここに文字の集合ではなく列を書いてしまう]
や、お手軽だが不完全な代替 .*?
を使ったパターンに対して、正しく、簡単で、理論を逸脱しない答えが用意されるのが待ち遠しい。■日本語部分だけ読んだ>「正規表現における 非包含オペレータの提案」。■いや待てよ。非包含オペレータが扱う典型的なパターンはどういうものだろう。foo
だろうか .*foo.*
だろうか。俺は (?~)
について書いてるつもりで (?~.*)
について書いていたんだろうか。二つが同じだとすると部分一致ではなく完全一致であることを明示するために (?~^foo$)
みたいにアンカーを付けたくなるだろうから両者は区別されるんだろう。じゃあやっぱり勘違いしてた? s=uvw
みたいな文字で構成された式を「文字列がパターンを含む? どういうこと?」と読んで疑問のままにしてるんだけど、その辺を含めて PDFを読み直したい。static const Range Null;;」)、高校生のときのノートを(捨てる前に)眺めてみたりするたび思う。あの頃俺は賢かった(今はもう理解できない……)。たぶん没入することが必要なんだな。振り返ってるときにはそれがない。■パッチを読んでいて……。「-で始まる行がいっぱい」<嬉しい!やってやったぜ! 「+で始まる行が凝集している」<ファイルを移動しただけか、正しい徴候。それかなんとなく気に入らなくてイチから書き直す悪い癖の発露。「あちこちに散らばる + の行」<やり方か仕組みのどちらかが間違ってる。「交互に現れる + の行と - の行」<普通っぽい。あと手前味噌だけどコメントが丁寧だと思った。「あ、そうなんだ。勉強になります(書かれていなければわかっていなかった)」って感じ。やっぱり時間差があっても自分は自分で、阿吽の呼吸で疑問と答えが噛み合うところがある。■アクセスログの一覧を下の方まで眺めてたら、こんな名前のファイルが3ヒットしていた>subpattern_highlight.rev2.patch。え、あれ? こんなんやってたっけ。「脳log[20120517p01] サブパターンハイライト。」つい反応してしまうくらいお気に入りのネタではあるんだな。■■■漢検の対策テキストから啐啄同時(※ATOKで一発変換できない)という四字熟語を仕入れた。ここ(「阿吽の呼吸で~」)が使い所だと思うのだけど、どういう形で文に組み込めるんだろうか。
最終更新: 2018-03-14T23:15+0900
行単位で加工するマクロのための定型。そのままで同時に標準入出力にもファイルドロップ(SendToを含む)にも対応している。Perl譲りなんだろうけど、Rubyの -p スイッチって便利だし実際のニーズに基づいてるよねって。
マクロに登録しても良し、ソートしたいテキストファイルをドロップしても良し。
よく知らないけどプラグインだとメインメニューにコマンドを登録できたりするんだろうか。こういうものを C++で書いてエディタ本体に内蔵したくはないよね。
掲示板に貼り付けるには長いし、Wikiのマクロ投稿ページはログインを要求してきて書き込みさせてくれないしで、返信できずにここに書いてるんですよ。>「[8316] ソートの挙動の切り替えはサクラエディタ内で可能になりませんでしょうか」
Meryのソートマクロを見たら実質ワンライナーだった。連打するたぐいのマクロではないとしても、自分のはゼロオーバーヘッドルールから離れすぎていた。
bSelLock
はたしかに else や default でパターンを網羅したいケース。■SetFocus
は、他はなくても必ず自分自身が対象として含まれるだろうという期待があるのだろうけど、それは予断だし油断があったのだと思う。同じファイルのすぐ上にある CViewCommander::Command_CASCADE
にも同じ型のコードがあるけどそれは?■クリア済みのWndProcを呼ぶことについて。呼べないから呼ばないでいいのか、呼べないから呼べるようにして呼ぶのか、判断がつかない。■パッチ部分は SendMessageToAllEditors
なのだけどそのすぐ上にある Send を Post に置き換えただけの PostMessageToAllEditors
については?■ここまでで触れずにとばした部分は全体に趣味的な印象を持った。delete 0
は安全らしいし、CloseHandle(0)
は無害らしいし、使わない領域、範囲外とインデックスでマークされてる領域を NULL で埋めなければいけない理由はないし、変数を2つ定義して、同時に初期化した片方を条件にもう一方を直後の if-else 文で初期化(※厳密には代入)するというとき、定義部分でも初期化が必須かといえばどーでもいい。それよりも C99 より前の C言語に倣った関数冒頭にまとめた変数宣言(&定義)のほうがつらい。長大な関数のあるブロックである変数が必要になったとき、使いたい値が代入されてからそこまでのすべてのコードパスでどんな値が代入され得るのかチェックしないといけないし、反対に不要になったときは、代入をやめたことで関数の以後で問題が起こらないことを確認しなければいけないし、それを forループの変数 i についても行わなければいけないのだから。行き当たりばったりで次々変数を増やすのもどうかと思うが、適切な粒度のスコープがあると思う。env/CAppNodeManager.cppのパッチで指摘された初期化はまとまっていて問題を見出せない。■env/CAppNodeManager.cppの別の部分については、IsSakuraMainWindow
でもやっていて実質的な意味を持たない NULLチェックを足して今以上にごたごたさせるより、2番目のループを取り除くぐらいの書き直しをしたらいい。「hWndLastが NULLのときに全くメッセージが送られていなかった」なんてときのコードはおそらく原型が残っていないし(そんなことを言うやつがよくわからないまま(同じ)轍を踏むのだ(自虐)。でも unicodeブランチでは遡れるログに限界が……)、その対応のせいで(たぶん昔はそうだったのだろうけど)双子のループではなくなっているのだから。こんな感じにしたい>CAppNodeGroupHandle__PostMessageToAllEditors.txt。もちろん SendMessageの方も。仕様の違いは、pWndArrに hWndLastが複数含まれていたときに複数回メッセージが送られないってことだけど、そんなこと起こらないし期待もしていないでしょう? ほぼコピペの双子関数をひとつにまとめるのは、PostMessageと SendMessageの戻り値の型が違うせいで失敗した。マクロを使うとデバッガで追いかけるのが難しくなるし、メンバ関数テンプレートはコンパイラの実装が遅かったような記憶があって積極的に使いたくないし、そもそもリンクエラーを取り除けなかった(<テンプレートの定義を.cppに書いていたから。明示的な実体化が必要だった。こんな感じ)。たぶんファイルローカルのモジュール関数テンプレートにしたら一挙両得だけど、アクセス許可を出さないとダメだよね? 代わりに staticメンバにする? そうするだけの、過剰なテクニックを駆使したりヘッダに手を入れたりするだけのメリットがないのでコピペのままでいいや。■macro/CWSH.cppについて。中断のためのスレッド関数とメインスレッドがパラメーターを通して hEventを共有していて、子スレッドの方で
OpenEvent
や DuplicateHandle
みたいなものは呼んでいないんだけど、子スレッドの終了を待たずに SetEvent(hEvent);
即 CloseHandle(hEvent);
して子スレッドはイベントを受け取れる?■読んだのはここまで。趣味的(あるいは潔癖・偏執的)とは書いたけどデバッグモードのコードだと思えばそういうものかなという気がしないでもない。が、C++が初期に遅いと言われたのってコンパイラが隠れてする仕事(コンストラクタの呼び出しとか)に対する無理解が理由にあると聞くので、無駄とわかってるところに 0 を埋めて歩くことに積極的にはなれない。staticでない未初期化変数の値をそのまま使用するのは結果が予測できないバグだけど、未初期化変数(遅延初期化変数)それ自体は問題にしないよ。■自分の不見識が明らかになるだけかもしれないけど……。「スタックのドカ食い対策」<スタックで間に合ってるならスタックの方が速いんじゃないの? 「
WINVERによる条件コンパイル」<ソース分裂バイナリ分裂はない方がいいし、俺プリプロセッサ嫌いなんだよね(<誰も聞いていない! 共感性・説得力皆無!)。さらに共感を得られそうにないことを書くと、namespaceが導入されたからグローバルな名前空間を明示するために
::
を付けましょう、これまでただ Func();
と呼んでいたものを ::Func();
と書きましょう、なんてのはなんの冗談かと思う。譲るのは当然後から来たほうだし、衝突しないような名前を選ぶ、衝突が避けられないときにしぶしぶ ::
を付けて区別する、くらいの態度でいるんだけど、みなさん積極的に ::
を付けますね。それって(知らないしやったことないけど)まさに MFCプログラミングで名前のバッティングが避けられなかったからみんなそうしてただけなんじゃないかとも思ってるんだけど、SDKプログラミングでもわりと積極的だよね。自分が無知で異端なのかと不安になる。■途切れていた古いログを見つけた。「Fix: Send/PostMessageToAllEditors() don't send message when last window parameter is NULL.」この修正が不可解で、現在のソースに残ったコメントから以前のコードを想像できなかった(だから原型が残っていないのだろうとコメントした)。単純に m_hWndLast の NULLチェックを省いてこう直せば良かったじゃない?>if( phWndArr[i] != m_hWndLast )
この頃はまだ IsEditWnd
(※後のIsSakuraMainWindow
?)が引数の NULLチェックをしていないことから、先取りして phWndArr[i](※m_hWndLastではない)の NULLチェックを追加してもいい>if( phWndArr[i] != m_hWndLast && phWndArr[i] )
。ま、済んだことはさておき、この時点ではまだ双子のループが存在していないことが興味深い。双子のループが誕生したのはこのコミット>「New: Grouping of the tab windows.」(←Firefoxだとアドレスバーで20回ぐらい Enterキーを押しているうちにページ内アンカー(#diff-24)が機能するけど、Operaだとリロードしてしまって永遠に機能しない。くそったれな遅延ロード。くそったれな S……)。グルーピング対応のためとはいえループは必要だったろうか(反語ではありません。結論保留)。