/ 最近 .rdf 追記 設定 本棚

脳log[2009-10-28~]



2009年10月28日 (水) ポインタを教える < 下手なたとえよりハードウェア(メモリと CPUだけ)のことと、配列とポインタの操作に関してコンパイラが行うこと、を教えてほしい。それと最初に、ポインタが必要になる例題を提示しておくこと。ポインタの第一歩はメタ変数だから、ソースコード上でこの変数とこの変数を入れ替えただけの処理を共通化できないかと考えさせるような問題を。つまりそれが俺のポインタ理解の第一歩だったわけで、ビットマップの R と G と B の任意の2つを共通のコードで扱いたかったのだった。ちなみに HSPでのことで、そのときに dup命令の使い道を発見した。


2009年10月27日 (火) HPがマルチタッチ対応、27型、Windows7 64-bit版搭載の TouchSmart PCを出すのを待っている。オプションでリモコンとか付けてね。


2009年10月26日 (月) [tDiary] aq=3 というようなクエリパラメータを含んだ google検索からのリファラをうまく置換できないので調べたら、最新のではしっかり q= というパターンが [^ao]q= に更新されていた。設定ファイルは古いものを引き継いでいたから対応できていなかった。ところで、[^ao]q= より \bq= の方が将来性があって良い。というか、[?&;]q= でどうか?

最終更新: 2011-12-20T23:29+0900

[SakuraEditor] 矩形選択時のカーソルの動きを修正。

発端はこれ > 「折り返ししている物理行末を、キーボードで左から右へ矩形選択しようとすると、 次の物理行にカーソルが移動して意図した通りに選択できません

折り返し桁に到達した瞬間、次の行の始めにキャレットが移動してしまうために末尾一桁が選択不可能になっている。

いいだしっぺの責任のようなものを感じて一応やってみた。

  • 矩形選択中はキャレットを操作と違う方向に移動しない。
    • 右を押していて、折り返しで次の行頭に移動しない。
    • 下を押していて、EOFのある行に着いたとき X座標の最大値を EOFの位置に規正しない。
  • (ついでに) EOFの位置にキャレットがあるときに下を押すと選択解除。
    • EOFの位置で右を押したときに選択解除はすでに行われている。

ざっくり書き換えてしまった部分があるのと、CMemoryIteratorと CLayoutがよくわかっていないために、さっぱり自信が持てない。道具が初めて扱うものばかりなのに加え、フリーカーソルモード、矩形選択中、改行の位置、折り返し桁(設定)、(実際の)折り返し位置など、考慮すべき対象も多すぎる。

いじったのはキャレットの移動部分だけで選択については見ていない。ぶら下がり文字についても考慮していない。選択できないわけではないので、特に不都合だとは思っていない。(改行がぶら下がってるときは不都合があるかも)


 @2009-10-28

矩形選択をキャンセルしたときにカーソルが改行の後ろに取り残されてる。

矩形選択を上下左右矢印で解除したときはカーソルを矩形の左上隅に移動するようになっている。でも現状では、矩形選択は Shift+F6での矩形選択ロックを利用したインターフェイスしかない(マウスのことは知らない)から、矢印で選択状態を解除はできない。で、Escを利用して選択解除するんだけど、このコマンドはキャレットの移動を行わない。だから取り残される。

取り残されるよりはましだろうと思って、必ず左上隅に移動するようにした。

別件。選択を矢印で解除するとき、右(左)矢印だったら選択解除だけが行われてキャレットの右(左)移動は行われない。でも上(下)矢印だったら選択解除とキャレットの移動が両方行われる。どっちでもいいし、今のように混在してても不満はない。

さらに別件。キャレットが EOFの位置にあるとき右矢印で選択解除ができるようになっていたので下矢印でも選択解除ができるようにしたが、キャレットが先頭行にあるとき上矢印で選択解除はできない。キャレットの実質的移動がなければ選択解除はしない、ということで統一し、EOFの特別扱いをやめてもいい気がする。

違うなあ。ファイルの先頭で左を押すと選択解除ができる。EOFでの右解除はこれにならったものだ。最終行での下矢印で選択解除できるようにしたなら、先頭行での上矢印解除も対応しろ、ってことだ。(そのほうが修正点が少ない)

した。

たぶん、二行下移動(そういうコマンドがあって、↓に割り当てたりできる。矩形選択用の二行下移動もある)ではここまでの修正が効いていないだろう。

と思ったら、二行下移動では EOFのみの行に一気に移動できない。必ず手前の行で一度止まってしまう。結果的に問題は起こっていなかったわけだけど、EOFのみの行に一気に移動できるようにしたうえで、修正が効くようにした。

ちょっと考えればわかるけど、左上隅だからって改行の後ろでない保証はなかった。普通の選択解除と同じようにコマンドの方向も考慮しながら(右移動による選択解除なら右下隅にキャレットを置くとか)、キャレットが有効な位置におさまるようにまじめに対応した方がいい。左(右)矢印が押されたときに選択解除とキャレットの移動を両方行うようにすれば、上(下)矢印の場合の動作と統一されるし、キャレットが有効な位置に収まることも左(右)移動コマンドによって特別なことをせずとも保証される。一石二鳥。


 @2009-10-29

ツッコミが入りました。

今のサクラで、選択を上下左右の矢印キーで解除するときの挙動は、秀、Em、MS Wordなどと同じ動きです。

秀丸エディタ、EmEditorはおろか Wordも使ったことがない物知らずなもので……。左右の選択解除でキャレットの移動がなくて上下の選択解除ではキャレットが移動することに関しては、(俺がいう)一貫性以外に、他と揃えるという評価軸もあるということでしょうか。メモ帳と Firefoxのテキストエリアでは左右の選択解除でもキャレットが移動するので、やっぱりどっちでもいいことだと思うな(俺は)。どっちでもよくないという意見があるのだから「一石二鳥」を強行したりはしないけど。

(折り返し位置の1字手前から次行に移動する)も、概ね多くのエディタと同じ動きだと思います。

これ、キャレットの表示を折り返し位置で留まるようにして次行の行頭に飛ばないようにしたけれど、その右、は次行の一文字目と二文字目の間だから実質的なキャレットの位置は変えていないのだよね。行頭の左が前行の折り返し位置の一文字手前であることの対称になることも意図した。折り返しの一文字手前の右が次行の行頭である場合より、ユーザーのできることは増えるし、キャレットが現在の行を端から端まで移動する前にワープしてしまったような印象も受けないし、で、他のエディタも見習ってほしい動作だと思ってる。これに関してメモ帳は、折り返し一文字手前の右が次行の行頭。Firefoxのテキストエリアは、折り返し位置と次行の行頭の間に仮想の一文字が存在する。Firefoxはありだと思うけどメモ帳はどうかと思う。どうかとは思うけど自分は折り返さないのでまったくの他人事だったり。

書いてるうちにさらなるツッコミ。

通常選択や通常カーソル移動の仕様変更するのは本末転倒かな。

「本末転倒」はそうだったかもしれない。折り返し位置での右移動がややこしすぎて、矩形選択の不都合の修正とカーソル移動を分離できなかった、というか、キャレットがおかしな動き(改行文字の後ろに止まったり)をしないように試行錯誤しながらの修正だったから、その結果が自分好みの動きになるのは当然というか。

二人とも、矩形選択中にキャレットが折り返さないことに異論はないのかな。


 自然にこうなるはずもなし。
 先人の意向ということで。

レガシィは積極的に振り捨てたい。それが自然でないのならばなおさら。


個人的な主張や好みはおいておいて、波状攻撃をくらってしまったので折り返しでの右移動を修正した。元の通りに(なったはず)。ちょっと余裕ができたのでコードを整理して仕様変更をしやすくした。これで、こんどまた折り返し行の右端でキャレットを止めようと思ったときも変更がしやすい。MOVE_NEXTLINE_IMMEDIATELYを MOVE_NEXTLINE_NEXTTIME_AND_MOVE_RIGHTに置換するだけじゃないかな。オプション化も簡単だ。わざわざ設定画面を用意して使用者の煩わしさを増大させるほどのものではないけど。


 @2009-10-31 パッチ。

SourceForge.net: Sakura Editor: Modify: 2889930 - 矩形選択中にキャレットが操作と異なる方向に移動しないように。



 @2011-11-30 コミット。

  1. r1966(2011-11-15) コミット by syat.
  2. r1973(2011-11-29) キャレットが -1行目へ移動するバグの修正 by moca_skr.
  3. r1983(2011-12-20) (F6と ESCキーによる)選択中の未選択状態で選択をキャンセルできないバグの修正 by moca_skr.
本日のツッコミ(全3件) ツッコミを入れる

anonymouse今のサクラで、選択を上下左右の矢印キーで解除するときの挙動は、 秀、Em、MS Wordなどと同じ動きです。 折り返..

ななし矩形選択という「おまけ」にあわせて、 通常選択や通常カーソル移動の仕様変更するのは 本末転倒かな。

ななし現行仕様は明らかに他のエディタを調べてそれに合わせた結果と思われ。 自然にこうなるはずもなし。 先人の意向ということ..


2009年10月25日 (日) [C++] 判断が付かないこと。1.値を返す関数の戻り値の型に constを付けること。呼び出し側に不当な制約を押しつけることになる(コピーで受け取った値を変更するのは自由であるべきだ)から付けてはいけない、という指摘がほしい。2.ポインタを引数にとる関数で、そのポインタを constにすること。これは関数を呼び出す側には関係のないことで、関数の実装の中でだけ有効な約束みたいなものだ。ポインタ型の引数が constかどうかでオーバーロードが変わってしまうんだろうか。同一視してほしい。それなら宣言では T* と書き、定義で T*const と書くようにする。……。VCで調べた。1.関数の戻り値の型が const intでも int型の変数で受け取れる。constは飾り。2.宣言と定義でポインタの const性が異なっていてもなんら問題はない。それだけの違いでオーバーロードはできないということもわかる。これは VCについてだけで、仕様はわからないけどすっきりした。この二つは同根で、値で受け取った仮引数や関数の戻り値の constは完全に受け取った側のオプションであり、プロトタイプと定義でのそれらの違いも無視されるらしい。


2009年10月24日 (土) スライドをまとめた PDFは横に連続して並べて、横スクロールしながら読みたい。単一ページを縦に並べても、見開きを縦に並べても、しっくり画面に収まらないので。


2009年10月23日 (金) SourceForge.netの Tracker。あれは何だ(怒) 日本語だと 25文字で強制改行。しかも折り返しではなく <br />。何もしない方がずっとずっと良い。エンコーディングが UTF-8なのと、英語だと 75文字(3倍の長さ)で改行だから、バイト数でカウントしてんだろう。見た目は CSSでやりな!バイト数と文字数と表示幅を短絡するんじゃない! 単語の区切りを考慮して改行を挿入しているのがまた小賢しくて努力の方向があさってで憐れみを誘う。メールやコンソール出力じゃなくて HTMLを生成してるんでしょう?なにやってんの? (なんでこんなに腹を立ててんだろう、我ながら。勝手に文章を悪い方向に整形されたから?) Trackerのさらなるちょんぼ。UTF-8のバイト列を ASCII配列扱いでちょん切ったんだろう。<br />を挿入された付近の1文字がなくなってたりする。


2009年10月22日 (木) [Firefox] 言語ごとにフォントや文字サイズが変更できるとは知らなかった。日本語のフォントは最低12、通常15だけど、西欧は最低15、通常18で、それでもまだちょっと小さいかな、というレベル。なんでこんなにスケールが違うんだ?


2009年10月16日 (金) [SakuraEditor]「折り返ししている物理行末を、キーボードで左から右へ矩形選択しようとすると、次の物理行にカーソルが移動して意図した通りに選択できません」折り返されている行末へカーソルがたどり着いた瞬間、次の行の頭に移動していて右端の一列が選択できない。たしかに問題。折り返し込みの矩形選択とか、コピペしたときにどうなるのが正しいのか想像できないんだけど……。矩形選択は図形的な操作だから、折り返しがあろうが改行があろうが、右へ範囲を広げている最中にキャレットが左へ戻ってしまうというのが意外な感じはする。

最終更新: 2009-10-17T03:43+0900

[javascript] 空文字列にマッチした後の lastIndexの値は IEの挙動が妥当。

  var re = /\b/g;
  var match = re.exec( "012" );
  alert( match.index ); //=> 0
  alert( re.lastIndex ); //=> 0(ECMAScript仕様), 1(IE)

仕様では 何度 re.execを実行しても re.lastIndexが 0から増加しないから、re.execをループで実行するときにはマッチ結果が幅0のときに限り特別に lastIndexをインクリメントする処理が必要になる。

 lastIndexが 1ではいけないの?

マッチの範囲は "0"の直前から "0"の直前までで、lastIndexは範囲の末尾の次の位置を指すもの。マッチの幅は0。

index = 0; lastIndex = 1; であればマッチ範囲は "0"(幅1)ということになってしまい正しくない。

index = 0; lastIndex = 0; であればマッチの幅が 0だということも、その位置が "0"の手前だということも表現できていて正しい気がする。

 でも、lastIndexってパターンオブジェクトのプロパティ……

indexはマッチ結果のプロパティだけど、lastIndexはパターンオブジェクトのプロパティなのだ。match.index...re.lastIndexの範囲が正しいとか正しくないとかは考慮に値しないのではないか。

検索結果に影響があるかといえば、スクリプトエンジンが行ってくれないことを、スクリプトを書く人間が手作業で行っているだけなのだから影響はないだろう。

IEは至極まっとうな実装をしたと思う。


2009年10月15日 (木) [790FX-GD70] BIOS v1.6


2009年10月10日 (土) なんだvvvこれvvvv > THE iDOLM@STER MAD World Service


2009年10月09日 (金) [C++] プライベートメンバ関数をいっぱい宣言する代わりに friend class Hoge; とだけ書いておく、下請け関数ならぬ下請けクラス、メソッド。(ありかな?)


2009年10月08日 (木) sourceforge.netでうざいポップアップが出る。httpsのページで http://ad.doubleclick.net/...を読み込んでいるからだ。slashdot.jpの ads.osdn.jpもそうだったけど、広告がサイトの Readabilityを落としてはいけない。対象が 2hostになったので Adblock Plusを入れた。


2009年10月07日 (水) [C++] wchar_tって使いにくい。2バイトだったり 4バイトだったり。ワイド文字列リテラルのエンコーディング、とそこから決まる wchar_tのサイズ、を決められたらどうか? ……。char16_t、char32_t、u、u' '、U、U' ' というのがそれだ。早く使いたい。ところで、charより ucharの方がわかりやすくないか。char16…や char32…だとビット幅だけを規定してるみたいじゃない。……。実際にそうなんじゃないだろうか。Wikipedia(ja)には「char16_tとchar32_tであり、それぞれUTF-16とUTF-32を内部表現とする。」こうあるけど、エンコーディングを規定するのは u、U接頭辞だけ、とか。C++コンパイラにエンコーディングのバリデーションとかやってほしい人がいるとは思えないし、やらなければ内部表現云々はまるで無意味だし。……。UTF-16、UTF-32はエンコーディングではない気がしてきた(無知)。ならば Wikipedia(ja)の記述は、これらの符号化文字集合を単独で表現できる大きさ持った型だ、という意味だろうか。<< そろそろ調べどき。……。どちらも符号化方式だった。では C++0xの方を……。エンコーディングを持ってるのは文字列リテラルだけに思える。u8という接頭辞で UTF-8文字列を char配列に納められることもわかった。char16_tと char32_tについては「UTF-16とUTF-32を内部表現とする」というのは間違いで、「UTF-16、UTF-32の符号単位を格納するよう設計されている」が正しそう。「符号単位」という言葉を知らなかったのがうまく説明できなかった原因。「符号位置」(コードポイントの訳語だと思う)とは違う。