/ 最近 .rdf 追記 設定 本棚

log[2009-08-25]



20090825() Emacsってイーマックスだったのねんエマックスだとばかり……VMAX(名前からの連想)みたいなデカブツは好みじゃないんだよね……ってどちらも重量級だからそれでいいのEmacs(名前も含めて)好きにならないだろう

最終更: 2010-05-19T17:19+0900

[SakuraEditor]ーテーション文字列の色分

 確かに変ですが、ここの部分をきっちりやろうとするとレイアウト処理性能にシビアに影響するみたいです。
 ざっと試したところでは、ファイル読み込みで1.5~3倍くらいの処理時間がかかるようになってしまいました。
 右端で折り返す設定で画面幅を変化させるときの応答にも同様に効いてきます。
http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=data&tree=r7015

さらりとできなくはないと書かれているがどうやるんだろう?

sakura_core\view\colors\CColorStrategy.cpp の後半(「色開始部分)をこう書きかえてみても中途半端な結果ァイルの内容は同じでも文字の追加や削除ゥなどの操作によって意図通りの結果になったり現行通りだったり処理速度に関しては5MBのファイルを開いてファイルタイプをいろいろ切り替えてみたら変更前よりプログスバーの進みが明らかに遅い1.5から 2倍というのは体感に一致している

bool CColorStrategyPool::CheckColorMODE(
	CColorStrategy**	ppcColorStrategy,	//!< [in/out]
	int					nPos,
	const CStringRef&	cLineStr
)
{
	//色終了
	if(*ppcColorStrategy){
		if((*ppcColorStrategy)->EndColor(cLineStr,nPos)){
			*ppcColorStrategy = NULL;
			return true;
		}
	}

	//色開始
	if(!*ppcColorStrategy){
		for(int i = 0; i < (int)m_vStrategies.size(); ++i) {
			if(m_vStrategies[i]->BeginColor(cLineStr, nPos)) {
				*ppcColorStrategy = m_vStrategies[i];
				break;
			}
		}
	}
	return false;
}

違うCheckColorMODE()のときに正規表現キーワドは働いてないそもそも CheckColorMODE()の目的って? CLayoutMgr::Match_Quote()がとりあえず行末を返す( return cLineStr.GetLength(); )って? それでどうやって行をまたげているんだろう


白々しさ爆発だけど書く下は sakura/trunk2/sakura_core/doc/CLayoutMgr_DoLayout.cpp から削除されたコ(の一部)この部分が修正を加えられたうえで sakura_core/view/colors/CColorStrategy.cppに移動しているreturn falseを使わずに breakしているあたりがさらに嘘くささを増してるけど別にこのときの変更をロールバックしたかったわけじゃない知らなかったし参考にしたのは SColorStrategyInfo::DoChangeColor()の方

	if(!*ppcColorStrategy){ 		
		CColorStrategyPool* pool = CColorStrategyPool::Instance(); 		
		for(int i=0;i<pool->GetStrategyCount();i++){ 		
			CColorStrategy* pcSample = pool->GetStrategy(i); 		
			if(pcSample->BeginColor(cLineStr,nPos)){ 		
				*ppcColorStrategy = pcSample; 		
				//bRet = true; 		
				break; 		
			} 		
		} 		
	} 		

俺が感じたプログスバーの進みの遅さはたぶん基底クラスからの仮想関数の呼び出しに伴うものだったんだろう一歩戻って進んでふりだしに戻る


CheckColorMODE()がないとクーテーション文字列が行をまたげない

レイア(禁則処理とか折り返しとか)とクーテーション文字列(+コメ)の関係がわからない癒着してるならトルネックにもなってるらしい CheckColorMODE()をなくして正規表現キーワドが行をまたぐことでカバーしたい


 @2010-05-19 関連ログ発見

http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=dev&v=4079#4083

サクラエタの色分け解析ルーチンは全部で3つあって

  • 行データの変更に各レイアト行の先頭色を決めるもの(CLayoutMgr)
  • 実際の作画時に各文字の色を決定しつつ作画するもの(CEditView::OnPaint)
  • 対括弧の色を戻すときに各文字の色を決定するもの(CEditView::GetColorIndex)

20090824() [Vista] エクスプローラは痴呆気味だけ>explorer .でカレトリを開けるのがえらいMDIEに乗り換えなかった理由の一つ

最終更: 2009-09-24T04:29+0900

[SakuraEditor] 最近使ったファイルを名前でソトしないで!

方法は sakura/trunk2/sakura_core/sakura_rc.rcから CBS_SORTを一か所削除するだけでしたCRecentImp.AppendItem()が名前に反してあえ「アイムを先頭に追加しているけど俺もそれが自然だと思う「開く...(ドロップダウン)ールバーボタンから出るポップアップメニーには CBS_SORTみたいなフラグがないのだろうトはされていない望み通りでも Windowsはスタトメニーの最近使った項目をファイル名でソトしてるそういう考え方もあるんだろう好きにやります。

ダイアログつながりで拡張子補完も完全に切ったお節介は不要拡張子補完って主にエクスプローラで拡張子を隠したままにしてる人のためにあると思う


20090823() またしても LADY GREY欠乏の危機(前回>>20080314, 20080617)だだっ広い(体力と時間を浪費させる)ッピングモールができたあおりなのだろう電器屋が移り本屋が撤退しーパ(+パン屋)がなくなったグレイの他にも 1500円くらいするもの(缶の大きさは隣に並んでいた 500円のものと同じだった)を置いていたりっと変わった店だった他のスーパーを 78件まわってみたけど全然駄目徒歩 5分の FRESCOは唯一点を稼いだがーバッグに戻るつもりはない400/85gったのを覚えていると片岡物産の Web(525/85g)で買うのもためらわれる


20090821() 悪意のあるコンパイラを見破るのは難しいよなあ > Delphi + Induc

最終更: 2009-08-24T23:53+0900

[]ちうもん

STAY~夜明けのSoul~(初回限定盤A)(DVD付) STAY~夜明けのSoul~(初回限定盤A)(DVD)
GARNET CROW
GIZA
2,843
たまにアマゾンを検索して CDの発売を知る


20090817() HikiDoc 0.0.4 でた正規表現に関連した DoS脆弱性楽しいアップデトではないですな自前の valid_plugin_syntax?を使ってる tDiaryには影響なし


20090816() トゲ界隈で蔓延しているようだが一抹の抵抗を試みる課金をするのはサービスの提供者~を課すっていうじゃないあなたは支払い義務を課されてるんだよと書こうとしてあれ課する? 課(おお)す? なにそれ

最終更: 2009-08-28T23:41+0900

[tDiary] セクションごとに最終更新日時を(セクション単位の編集機能とからんでカオ)

表示方法はこう

# coding: utf-8
require 'date'
add_section_leave_proc{|date, index|
  diary = @diaries[date.strftime('%Y%m%d')]
  next unless diary # in case @mode == 'preview'
  section, sidx = nil, 0
  diary.each_section{|sec| sidx+=1
    if sidx == index
      section = sec
      break
    end
  }
  lm = section.last_modified rescue next
  next unless lm
  lm = DateTime.new(*(lm.utc.to_a.values_at(5,4,3,2,1,0))).new_offset(Rational(135,360)) # 日本時間
  lm.strftime %<<p class="lastmodified">最終更新: %Y-%m-%dT%H:%M%Z</p>> # 色分けテストとして、あえてタグと同じアングルブラケットで囲ってみた。
}

DateTimeのオフセトの単位がわからんかったブラウザのブックマークRubyリファレスマニュアル - 20051129だからなあるりまには載ってるかもとりあえfraction of a day(date.rb documented by William Webber)とのこと慣れない Rationalを使ったもんだから Rational(135,360)と書くべき所に Rational(135/360)と書いてしまいオフセ0の結果にしばし首をひねったRational()の呼び出しより引数の評価の方が先だからやむをえないことだけど分数を表現するのにはやっぱり / を使いたい(使ってしまった)FixnumBignumのシームスな移行のように Rationalへも融通無碍に切り替わって欲しい利用者には Numericだけを利用しているように思わせるということ必要なときに整数化(小数化)メソドを呼ぶし変数に整数(や分母を 1に約分できる分数)が入ってることを利用者が知っていればそのまま整数を前提としたメソドを呼んだりできるといい変わるのは整数型の演算結果が整数型であることを前提にした(旧来の言語の呪縛に過ぎない)切り捨て除算がなくなる以外にあるだろうそれも Pythonみたいに // を割り当てれば無駄な有理数化再整数化を避けられる実感に基づいて既に通った(んじゃなかったっけな?)議論を蒸し返してみました俺は整数と小数の垣根を取っ払った JavaScript最初は驚いたけど評価しているJavaScriptのシンプルさが好きだセミコロンインサーションもCより怠けることを許していながらRubyの改行をターミネータにするやり方よりフーマトが自由で最高にバラスがいい(はまるのは returnだけだ)require 'rational'; 10.to_r/2 とか不格好すぎるでしドウェアと型から離れて本質に戻りましょう算数で割り算と分数は同じものだったはずだ。<追記@2009-08-22>require 'mathn' がつまり FixnumBignumRational(と Complex)をより親密にするおまじないでした(いまさら何を)mathnって読めない(マスエヌ?)のと名前から中身が想像できないのとで意識せず無視してたけどRationalとセトで見かけることが多かった気がするそれはそうとRationalComplexの細々した議論に埋もれて全体の方向性が見えないRuby 2.0あたりでは require 'mathn' が不要になっているんだろうか……。</追記>

るりまにはスタドアロンサーバー版と chm版よりスタック HTML版を用意して欲しいなあchmだと閲覧が IEースになってしまって文字の大きさやスクロール量進む戻るが自由にならなくて使いにくいマニュアルサーバーを起動しておくのは嫌ですよview.cgiCGIしようとしたらリンクがルトからの絶対スなせいで Not FoundApacheは既に動いてるから名前ベースのバーチャルホトや待ち受けポトの追加でるりまに一つのホ(or)を与えることはできると思うけど……大仰なのでやらないbase_urlのオプションが用意されてるから view.cgiの設定を間違えてるだけの気もするけど……わからない

組み込みの TimeUTClocaltimeしか扱わないのがもったいない任意のオフセトに基づいた日時を出力したいだけだからDateTimeは牛刀な印象がある。<追記@2009-08-21>ーくかんがえよ(命令形)・・・・・・・・なんてことはないオフセト分だけ未来(過去)UTC時刻が即ちローカルタイムだよ当たり前すぎて俺が何を言いたいのかわからないでしょう先のスクリト片の最後は DateTimeを使わずにこう書けるということです。

  lm = section.last_modified rescue next
  next unless lm
  offset = 9 * 60 * 60 # 秒
  lm_local = (lm + offset).utc # UTCと見せかけて lmの地方時。
  %<<p class="lastmodified">最終更新: %d-%02d-%02dT%02d:%02d%s%+03d%02d</p>> %
    [lm_local.year, lm_local.month, lm_local.day, lm_local.hour, lm_local.min, offset/60/60, offset/60%60]
}

……てなことをmakerss.rbの中の TDiary::RDFSection#time_string

  g = @time.dup.gmtime
  l = Time::local( g.year, g.month, g.day, g.hour, g.min, g.sec )

gmtimeに基づく年月日時分秒からローカルタイムを作っている部分を見ていて(遅まきながら)気付いたgmtimelocaltimeも皮をむけば UNIX epochからの経過秒に過ぎないんだからどういう意味を持たせるかはこちらの自由だった。まあ比較はできなくなりますが……(lm.to_ilm_local.to_i はその意味(同じ瞬間の別表現であること)を考えると望ましくない結果)</追記>

脱線終了表示するまでの仕込みがこんな感じ

add_last_modified_to_every_section@defaultio.rb (2.4KiB)
日記の一日分のデータの一部としてその日のセクションの更新日時をまとめて記録しているWikiStyleのフーマトの一部として更新日時や著者名を埋め込む方法があればそちらの方が利用者の自由度は高い
新設したヘッダ(Sections-Last-Modified)と日記の本文とが連動しているので tDiary以外から *.td2をいじりにくくなっている
add_last_modified_to_every_section@wiki_style.rb (1.7KiB)
都合が良いように変更
add_last_modified_to_every_section@tdiary.rb (10.6KiB)
っちゃりもちろん*今の*自分にとってはそうではない
tdiary_style.rbを変更してないから TDiarySection#last_modifiedは未定義tDiaryスタイルでも日記を書いてみて見つかったエラーは rescueした

主に plugin/makerss.rbからの要請で更新日時を記録したいのでっとした修正では最終更新日時は更新されないとかいいながらこの日記には変更のあったセクションを見つける別の方法が入っている(20090705p01)ので makerss.rbが最終更新日時を利用するようにはしていない


最初にポトされた時刻も有用だろうか? 日記だから最初にポトされた日はほとんど確定してるし時刻まで知りたいとも思わないけど


WikiSectionlast_modifiedプロパをくっつけたけどWikiSection自体はこれを管理してなくて外部から操作されるだけだってのがいけてないっぱり to_src()initialize()DUMP & LOADを担う(last_modifiedauthorその他の情報をフーマトに含める)メソド群を整備してこちらの望む操作を WikiDiaryWikiSection自身にやってもらう(自分でやるから付帯情報のコピー漏れも発生しない道理)のがいい


 2009-08-22

「編集でセクションを追加したとき更新日時のコピー処理でのぬるぽを修正(if old_section and...を追加し)


20090814() [TM-150][MX610] SetPoint 4.80 でた例によってイールはしないなんだろこの BIOSップデトより慎重な態度どんだけ地雷だったのかが偲ばれますね


20090813() 不格好なのmL(ミリリトル)ときっちり大文字で表記されていた同じ面「処方せん医薬品ともちと納得塩水と生理食塩水の違いのひとつかも


20090812() 気になってました > (女性上官に対す)いえっさSirの他に Ma'amもあります。いえすまむ。http://www1.coralnet.or.jp/yonetch/startrek/sir-maam.html


20090808() docs.tdiary.orgがルトから 403 Forbiddenで読めないプラグインの説明が読めない

最終更: 2019-12-01T02:10+0900

[SHJS] shjs-0.6にバトラックを

20090525に書いたことをやってみたsh_ruby.jsは巨大なのでとりあえず 0.6/sh_main.js0.6/lang/sh_javascript.js (lang/sh_javascript.js)どちらの sh_javascript.jsトラックのないーマル sh_main.jsと組み合わせることもできるつもり(2種類の langァイルをメンテナスするのは面倒くさいもんね)0.6/sh_main.jsが自分でも見直したくないソースになっているのは否定できない(だからおおっぴらにリンクしていない)そういう人間はこう言うので「動いたもんが勝ち

 "正しい\
  文字列(ECMAScript 5th ed.の場合)"
 "不正な
  文字列(ですらない)"
 /* 正しい
    コメント */
 /* 閉じていない
    コメント?

ーマルージョン 0.6SHJSと違うのは一つの正規表現で始まりから終わりまでマッチングできない対象(複数行にまたがるものとか)に対して最初の文"」や/*を見て文字列だコメトだと決めてかかった結果を後で修正できること

/*があったここからコメトらしい*/が見つからないっぱりコメトではないという判断が改行をまたいでできる


 @2010-04-13 文字列リテラル内の改行は不正らしい

NOTE 文字 LineTerminatorそれにバックスラッシ\ を先行させても文字列リテラル内には出現できない

http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/7_Lexical_Conventions.html#section-7.8.4

以前っちなんだろう?と調べたとき\(改行)は空文字列と解釈されるシーケスだと書かれてるの(そういうエスケープシーケスの一覧表)を見たんだけど実際は違ったらしい

一次情報にあたらなければ同じミスをおかすんじゃないかと手許にあFinal final final final draft Standard ECMA-262 5th editionというタトルの pdfを開いてみた(3rd ed.ではなく 5th ed.だということに注)

A line terminator cannot occur within any token except a StringLiteral. Line terminators may only occur within a StringLiteral token as part of a LineContinuation.

Final final final final draft Standard ECMA-262 5th edition(pdf) 7.3

NOTE A line terminator character cannot appear in a string literal, except as part of a LineContinuation to produce the empty character sequence. The correct way to cause a line terminator character to be part of the String value of a string literal is to use an escape sequence such as \n or \u000A.

Final final final final draft Standard ECMA-262 5th edition(pdf) 7.8.4

日本語にもそういう罠があるけど英語だとうっかり正反対の意味にとってしまうことがあって恐いそれでも行継続の意味に \(改行)を使う(それは空文字列として解釈される)ことは exception(例外)として認められているように読める

3rdから 5thに更新するにあたり現状を追認するように書き換わったのかもしれないけど……ECMAScript3の仕様はどこ?


面倒くさがらずにダウンロドしてきた

NOTE A 'LineTerminator' character cannot appear in a string literal, even if preceded by a backslash \. The correct way to cause a line terminator character to be part of the string value of a string literal is to use an escape sequence such as \n or \u000A.

Microsoft Word - Ecma-262.doc(pdf) 7.8.4

5thexceptった部分に even ifが使われている現バージョンでは文字列リテラル内で\(改行)の使用は明確に否定されてた

というわけで上のサンプルソースの記述を正しくなるように変更しました

最終更: 2019-12-01T02:10+0900

[] > SFファン度調査 SF本の雑誌オールタイムベト100版

既読は 8/100作品でしたょぼまあSFというラベルは読む理由にも読まない理由にもなってないからね少ないからコピるのも余裕

  • 1『万物理論グレグ・ーガン 山岸真訳/ 創元SF文庫
  • 29『戦闘妖精 雪風・神林長平/ /ハヤカワ文庫JA
  • 35『マク・スクランブル冲方丁/ ハヤカワ文庫JA
  • 48『デカトの密室瀬名秀明/ 新潮文庫
  • 60『ソトウェアッカー 黒丸尚訳/ ハヤカワ文庫SF
  • 61『星を継ぐものェイムズ・P・ーガン 池央耿訳/ 創元SF文庫
  • 66『涼宮ハルヒの憂鬱谷川流/ 角川スニーカー文庫
  • 84〈猫の地球儀〉二部作 秋山瑞人/ 電撃文庫

マイクル クラ『アドロメダ・トレイン100冊の中にまぜてあげて欲しかった

H.G.ェル『タイム・マシン』*なんて古典をこれから楽しめるんだから夢が広がるなあ……

* 中黒の存在にPlayStationPLAYSTATIONの間の時間みたいなものを感じた

 薄く安くなって 9月に発売される PS3の英語表記が PLAYSTATION 3 から PlayStation 3ロゴは PS3ってなんじゃそり(2009-08-19)

最終更: 2019-12-01T02:10+0900

[SakuraEditor] サクラエタの正規表現キーワドを SHJS相当にしたい

行単位で処理してるのはどちらも同じだしサクラエタの既存の設定はすべて State0のパターンとして扱えばいい行をまたぎたいときや凝った処理がしたくなって初めて State移動を使えばいいだけのことpatternStackcurrentStyleを行ごとにキッシュしておけば変更のあった行から即座に色分けを再開できるはず。文書の最初から色分けをやり直す必要はない変更のあった行より後ろの行にジャンプするときは変更によって何行後ろまでの patternStackcurrentStyleに変化を与えたかというキッシュが無効化される範囲を見極める時間が必要になりそう*.cァイルの編集中に /**を削除したりアゥしたりしたあとで Ctrl+Endするのは厳しいですよpatternStackは一行一行でそうそう変化するもんじゃないからキッシュの圧縮が効きやすいだろう(妄想するだけなら気楽だな)


 @2009-09-06

色分けが正規表現キーワドだけによって行われるのでないところが難しい他の色分け機能(コメトとか文字列とか強調キーワドとか)による先食いを考えないといけないから

今のサクラエタで正規表現キーワドで引用符を食べるとその行では組み込みのクーテーション文字列の色分けが無効になるけど次の行からクーテーション文字列が始まってしまう理由がわかった気がするその逆をやろうとしていたことに今やっと気付いた正規表現キーワドも先食いされる可能性を考えないといけない


 @2009-09-07

ック! BREGEXPのインターフェイスには検索開始位置を指定するパラメータ ――JavaScriptでの /pattern/g.lastIndex―― がない対象文字列を指すポインタを進めればそこ(文字列途中)が開始位置だと言ってよいものではないそれでは ^ のようなアンカーが毎回マッチしてしまうだろうから(試したわけではない)むむむBREGEXPには引退してもらいたい……サクラエタは自前で特定のパターン(頭・行末アンカ先読み)の有無を検索パターンに対するパターンマッチングでチックしてますね怪我の元に思えるので避けたい方法だけどこれまで信じられないぐらいうまく動いてるのは事実(でも半信半)<追記>bregonig.dllBregexp.dll for SAKURAを使用しているときは BMatchEx(これは検索開始位置を示すポインタが引数の1つに加えられている)が使用されていたのだった道理でソースを見ながらいじわるなパターンを与えても正しく動いたはずだちなみに鬼車の APIではさらに検索終了位置を指すポインタを対象文字列末尾を指すポインタとは別に渡せる。</追記>年代が違うから比較は酷だけどJavaだか .NETだかの正規表現では渡した対象文字列の(あるかもしれない)続き次第でマッチ結果が変わってくる可能性をさえ知ることができたはず(よく知らないそこまでするかと驚いた記憶だけがあ)Javaった

正規表現リテラルの影響があるのも嫌だなパターンとフラグをスラッシュで連結せずに別の引数に分けたらパターンの中のスラッシュをエスケープする必要がなくなるのにpreg_matchを思い出した文字列で正規表現リテラルを表現しようだなんて(笑止)リテラルである(=余分なエスケープが必要ない)ことに価値があるのに引用符とスラッシュで二重にパターンを囲ませる意図がわからない

<追記@2009-09-23>サクラエタのソースにエスケープを付加する処理が見あたらないなと思ったらスラッシュでなく 0xFFFF をデリミタに使用していたなるほどパターン中にそんな値は出てこないだろうな(そんな気がするだけ)0xFEFF0xFFFEBOMだけど0xFFFFは空いてるのかな。</追記>


 @2009-09-08

CColor_RegexKeywordだけをいじるんでなくCColorStrategy関連を作り直して CColor_*をそれに対応させるのがゴール(だということに気がついた)CColor_Quoteに対する特別扱いをレイアト部から切り離して SColorStrategyInfoに内包させるみたいなSColorStrategyInfoCColorStrategyドライバという位置づ

でもやっぱり色分けにレイアトがからんでくるのがわからないSColorStrategyInfoのメンバの

	//参照
	CEditView*	pcView;
	CGraphics	gr;	//(SColorInfoでは未使用)

	//描画位置
	DispPos*		pDispPos;
	DispPos			sDispPosBegin;

	CLogicInt GetPosInLayout() const;
	const CDocLine* GetDocLine() const;
	const CLayout* GetLayout() const;

こういうの

与えられた行に対してこれからはそれより前の行の色分け結果も参照しつつ一行分の色分け結果をまとめて返すから描画はそちら(CEditView)でどうぞ検索語のハイラトとの重ね合わせもそちらでよろしくといいたいんだけど

CColor_* って 1つのイスタスを 1つのプロセス(=1ドキュメ)で使い回してるのに(1つの行直前のメンバ関数の呼び出しに依存した)状態を持ってるってのが嫌strtok()並に嫌いそういうのも SColorStrategyInfoに移したい


BREGEXPの情報BREGEXP DLLを見てたんだけどそこには載ってない BMatchEx()というものもあるみたい(どこにあるのかは知らない)(BSubstEx()もあった)サクラのソース(CBregexpDll2.h)でみつけた関数の型はこう

typedef int (__cdecl *BREGEXP_BMatchExW2) (const wchar_t* str, const wchar_t* targetbeg, const wchar_t* target, const wchar_t* targetendp, BREGEXP_W** rxp, wchar_t* msg);
typedef int (__cdecl *BREGEXP_BMatchW2)   (const wchar_t* str,                           const wchar_t* target, const wchar_t* targetendp, BREGEXP_W** rxp, wchar_t* msg);

これは期待できるなあ

っと検索して一か所でだけ BMatchEX()が使われていたCBregexp.cppのこの部分

	// 拡張関数がない場合は、行の先頭("^")の検索時の特別処理 by かろと
	if (!ExistBMatchEx()) {
		/*
		** 行頭(^)とマッチするのは、nStart=0の時だけなので、それ以外は false
		*/
		if( (m_ePatType & PAT_TOP) != 0 && nStart != 0 ) {
			// nStart!=0でも、BMatch()にとっては行頭になるので、ここでfalseにする必要がある
			return false;
		}
		//	検索文字列=NULLを指定すると前回と同一の文字列と見なされる
		matched = BMatch( NULL, target + nStart, target + len, &m_pRegExp, m_szMsg );
	} else {
		//	検索文字列=NULLを指定すると前回と同一の文字列と見なされる
		matched = BMatchEx( NULL, target, target + nStart, target + len, &m_pRegExp, m_szMsg );
	}

「拡張関数がない場合もあるんですか……BMatchExgoogle検索結果もたった 7件だなあUNICODE版の正規表現DLLbregonig.dllしかないから BMatchEx()が存在するものとして BMatch()対策はいらないな


 @2009-09-12

BMatch()の戻り値は intだが boolean扱いしてはいけない。BMatch関数のサンプルとして

while (BMatch(patern1,t1+pos,t1+lstrlen(t1),&rxp,msg)) {
    (マッチング結果の処理)
}

みたいに書いてあるので騙されたけどサクラエタの CBregexp.cppにはこうある

		//	検索文字列=NULLを指定すると前回と同一の文字列と見なされる
		matched = BMatchEx( NULL, target, target + nStart, target + len, &m_pRegExp, m_szMsg );
	if ( matched < 0 || m_szMsg[0] ) {
		// BMatchエラー
		// エラー処理をしていなかったので、nStart>=lenのような場合に、マッチ扱いになり
		// 無限置換等の不具合になっていた 2003.05.03 by かろと
		return false;
	} else if ( matched == 0 ) {
		// 一致しなかった
		return false;
	}

負数の時はエラーらしいなんだこの落とし穴そしてパターン文字列を何度も渡さなくてよいという新事実struct BREGEXP.parapにパターン文字列が保持されてるから 2回目以降の呼び出しでは 2つのパターン文字列(異なっているかもしれない!)を渡すことになるのが気持ち悪かったのだっとしたら 2つのパターン文字列を比較してっていたら再度コンパイルみたいな処理があるかもしれないじゃない(そんな処理があってもなくても嫌だ)


 @2009-09-14

レイアトと色分けの関係変更のあった行を知ろうと思うと CDocEditAgentを通って CLayoutMgrへたどり着いてしまうような……CDocEditAgentのくれる情報はすごく役に立つんだけどエタ上のテキトの変更がすべてここを通過するんだろうか? CLayoutMgr::InsertData_CLayoutMgr()LayoutMgr::DeleteData_CLayoutMgr()の二カ所で行の変更を通知するようにした(後で Replaceも入れて三カ) <追記@2009-10-14>Deleteは使われてなくてInsertReplaceだけで済ませてるみたいったら Insertもいらないじゃんねえ。</追記>

次の行以降に影響する文字( " など)を入力しても即座には反映されない(最小化して元に戻すと反映されているゥすると反映されている)再描画を行う範囲が最適化されているから次の行以降の色分けが変わっていて再描画が必要なことを知らせる必要があるみたいどうすれば……?


 @2009-09-15

before

bool CEditView::DrawLogicLine(
	HDC _hdc,            //!< [in]     作画対象
	DispPos* _pDispPos,  //!< [in/out] 描画する箇所、描画元ソース
	CLayoutInt nLineTo   //!< [in] 作画終了するレイアウト行番号

after

bool CEditView::DrawLogicLine(
	HDC _hdc,             //!< [in]     作画対象
	DispPos* _pDispPos,   //!< [in/out] 描画する箇所、描画元ソース
	CLayoutInt* pnLineTo  //!< [in/out] 作画終了するレイアウト行番号

3引数を双方向にして CEditView::DrawLogicLine()の呼び出し元にさらなる DrawLogicLine()呼び出しと描画領域の拡大をしてもらうことになった

……ということをやってもらうために SLayoutWork.bNeedChangeCOMMENTMODESLayoutWork.pnExtInsLineNumが用意されてたみたいどうしたもんかな


 @2009-09-17

っぱりきたよ分割ビー問題表示する行の若い順に再描画すればいいかと思ったけど通ると思った実行パスが使われていない別方面で解決Ctrl+Endでいきなり文書末に飛んだときなんかも最初はエラーだった

あとは

  1. CEditView::IsCurrentPositionURL()を対応させる
  2. 一行だけ return true; と書いたようなざる実装を埋める
  3. ーザー設定を反映する(色分けするしないと)
  4. ドコングされてる正規表現キーワドの構築部分をファイルから読み込むようにする
  5. 空間効率の改善(一行一要素を RLEにする< 何行目までがこう何行目までがこうというデータだから run lengthではなかった相対指定でなく絶対指定だという違いだけで似たようなものだけ)
  6. 既存の色分けコドを消す。(今は色の設定部分だけを削除した状)

折り返しWSHマクロ矩形選択置換などはまだ試してない落ちてから対応する(分割ビーと Ctrl+Endは乗り越えたけど折り返しも怖いな)

自分が忘れてたので覚え書きこの変更で

  • 正規表現キーワドで複数行にわたる色分けが可能になる

    設定のフーマトが悩ましいRxKey[000], RxKey[001],...では表現できないしついでにキャプチャグループを利用した一つのパターン内での色分けを可能にしてもいいGUIはあきらめてるから SHJSlang/sh_*.jsを直接読んでやろうJSONーマ*とかいって……

  • 正規表現キーワドと組み込みの色分け機能が互いに文字の先食いをできる

    たとえば正規表現キーワドが組み込み機能より先に引用符を色分け対象にしたとき次の行から組み込みの色分けが始まることがない > サクラエBBS[r7015]

    再帰的な構造に対してはJavaScriptで動く SHJSに対して鬼車が使えるサクラエタはもともと後れをとってなかったのでSHJS方式になったところでとくに変化なし

  • ときどき落ちる(落ちないはずがな)

    レアな機能を呼び出したときが危ない


 @2009-09-18

JavaScriptで使っていた正規表現パターンを鬼車で動かすにあたっては[文字集] の中の [ をエスケープしなければならないのかな? それだけ?


 @2009-09-19

  • CEditView::IsCurrentPositionURL()を対応
  • lang/sh_javascript.jsをまるまるハドコングして色分けのバグ取りッダファイルを整理して*4

自分に対しても仕様を明確にしたいもはや色分け結果は良くも悪くも以前のものと変わらない


 @2009-09-20

  • 「ユーザー設定を反映(正規表現キーワド以)

 @2009-09-30

ァイルIO 面倒くさいそれは経験値がゼロだからだということに気付いた他人の力を借りようJSON_checkerなんて使いやすそうだけど JSONーマトには正規表現リテラルもコメトも存在しないのでそのまま使えないのが問題shjs/lang/sh_*.jsJSONーマトに予め変換しておくのが簡単だけど……(SHJSの言語ファイルをそのまま放り込めるというのがやりたいんだよなあ)


 @2009-10-02

JSON_checkerを修正して使用することにした修正内容は……

  • コメトの埋め込み可(コメトが埋め込み可能な場所はさらに調整が必要だと思う*5)
  • オブジトや配列の値に正規表現リテラルが使用可
  • オブジトや配列の値にシングルクーテーション文字列が使用可
  • オブジトのプロパ名部分に文字列だけでなく識別子が使用可(大部分の Unicode文字\uXXXXエスケープシークエスが使用不可な不完全実装で)

> allow_comment_and_regex_literal_and_single_quotation_string_and_identifier_as_a_object_key

遷移表が 30×31(=930トリ)から 40×35(=1400トリ)50%増加している気にすることではないな

enum modesenum statesをヘッダへ移動させたらあとは文字を食わせながら JSON_checkermodestateを参照して情報を取り出すだ(解釈の段階でバグが発覚しないことを祈)

(どうでもいいこ: JSON_checker.cenum定義部分だけが LFでなく CRLF改行だ)


SHJSの言語ファイルをそのまま放り込めるというのがやりたい<< 色指定が互換でないから土台無理だった

sh_preprocとか sh_functionという色指定をいちいち正規表現キーワN という色指定にマッピングすればいいのかなsh_stringSQTにするか WQTにするかは決められないけど


 @2009-10-06

オブジトとか配列とかその要素を取得できるようになったCに耐えられずついでに C++ところがJSON_checkerが最初からガチガチに隙のない C++ライブラリだったら敬遠して手を出さなかったんだよね他人の C++ドは読めない!


enumの要素(ラベル)が定数に置き換えられて構文エラこれだからマクロは!!! ヘッダの中だから勝手に #undefもできないどうすれば……

#undef IN したこれは windows.hで定義されていたもの


 @2009-10-09

でけたGUIがないから iniァイルのトリに rkw2/タイプ設定名.rkw2というファイルが存在すれば勝手に読み込んで色分けするSHJSの言語ファイルをそのまま放り込むのは無理でJSONっぽく仕立てないといけないつまりifと代入部分(セミコロンも!)を削除してオブジト配列の配列だけにする必要があるSHJSの言語ファイルは 0.50.6の間でフーマトが変わってるけどそれはたぶん効率上の理由だけだから可読性の高い 0.5のフーマトにだけ対応色指定は SQTRK1というのと強調キーワ1正規表現キーワ1というのの両方に対応したつもり(日本語での指定は確認していないした)SHJSの色指定は sh_normalsh_keywordsh_stringsh_commentsh_numbersh_urlだけがサクラエタの色指定にマッピングできた課題は正規表現パターンで文字集合の中のエスケープされていない [ これは BREGEXP.DLLbregonig.dllの橋渡しをするために色分けと関係なく対応しないといけない

BREGEXP.DLLしかないときだったら色分け能力が飛躍的に向上したと言えるんだけど bregonig.dllができる子なので行またぎぐらいしか色分け能力的には変わりがない行またぎにしたって誤爆恐さで積極的に使いたいものではないし……


 rkw2/タイプ設定名.rkw2というファイルが……

C/C++とか PL/SQLというタイプ設定名をどうしよう全角に変換しよう……した<<< 曖昧な書き方だったタイプ設定名を全角にしたのではなく読み込むファイル名を全角のものにしたという意味


ッダの減量中ッダは公共の場最小が美徳実装は何でもインクル定義して目的のために邁進する俺の世界というイメージ


 @2009-10-10

正規表現キーワN という色名がわかりにくいのとrkw2の色指定をポータブルにするために(強調キーワNや 正規表現キーワNという色は各人各様に役割が定められていてポータビリがない)正規表現キーワド用の色を増やした

短い名前EColorIndexType長い名前
RKBCOLORIDX_REGEX_KEYWORD正規表現キーワ(予約)
RKCCOLORIDX_REGEX_TYPE正規表現キーワ()
RKDCOLORIDX_REGEX_VARIABLE正規表現キーワ()
RKECOLORIDX_REGEX_CONSTANT正規表現キーワ()
RKFCOLORIDX_REGEX_ASSIGN正規表現キーワ()
RKGCOLORIDX_REGEX_OPERATOR正規表現キーワ(演算)
RKHCOLORIDX_REGEX_FUNCTION正規表現キーワ()
RKICOLORIDX_REGEX_OBJECT正規表現キーワ(オブジ)
RKJCOLORIDX_REGEX_BLOCK正規表現キーワ(構造単)
RKKCOLORIDX_REGEX_RXPATTERN正規表現キーワ(正規表現パタ)
RKLCOLORIDX_REGEX_DATE正規表現キーワ()
RKMCOLORIDX_REGEX_TIME正規表現キーワ()

どなたかの受け売りで代入( = など)と演算子( == など)を分けたこの日記での色分けも以前からそうしている


タイプ別設定のデフトに JavaScriptRubyがない!!! PHPPythonもないけどね設定17設定18...設定30という固定長のユーザー設定用プレースホルダもださいexe一つのポータビリだけでなく iniァイル一つにもこだわっているのでなければiniァイルのトリにサブトリを掘りたいトリが空だったり存在しなければ作成してデフトを充填するというポリシーで

  1. types/ が存在しない → すべてのタイプ別設定のデフトを充填
  2. types/タイプ設定名/ が存在するが空 → 基本設定のコピーもしくはタイプ設定名が既知であれば予めカスタマイズされた設定を充填
  3. types/タイプ設定名/タイプ設定名.iniが存在しない → 基本設定のコピーもしくは()

付け加えるならコピーされる基本設定とは基本設定のデフトではなく現在の基本設定を優先したい

カスタマイズされたタイプ設定というのもすべての項目を持つのではなく基本設定からの差分ここだけは譲れないという設定だけを持つようにしたい強調キーワコメト形式タブ幅とかそういうのだ大部分を基本設定から引き継ぐようにすればカスタマイズの手間が省けるタイプ別の iniァイルにも基本設定と異なる設定のみを記録するようにすればいつまでも基本設定を引き継げる

さらに強調キーワドをタイプ別設定に移してァイルで管理したい

  • types/タイプ設定名/keyword01.kwd
  • types/タイプ設定名/keyword02.kwd
  • (以下 keyword10.kwd)

ーワドの名前大文字小文字を区別するかどうかのフラグあとは単語の羅列だけの内容なのでテキトエタで強調キーワドの管理ができるようになるsakuraW.iniのスリム化にも役立つト設定もタイプ別でいいよね<<っぱりプロポーショナルフトが選べないうちはフト設定が一つだけでもいいや

スリム化といえばMRU関連を別ファイルに保存したい共通設定タイプ別設定ト設定などと MRUなど履歴情報は更新頻度が違いすぎるァイルを分ければ sakuraW.iniの不意の破損を防ぐことにもつながる設定画面を呼び出して設定を変更しない限りsakuraW.iniが読み込み専用でも運用できるようになればいい(ールバーやステータスバーの表示・非表示設定は微妙だけど sakuraW.ini入りかな)

全く関係ないが思い出したこと既存のファイルを名前を付けて別名で保存したときだったかにカレトリがあわせて移動しなくて外部コマドの実行で不都合があった外部コマドの産物が期待したところ(編集ファイルの位置)に作成されなくて見つけられなかった

@2009-12-16 カレトリの件がこの修正で直ったんじゃないかな>1073


一つだけ棚上げされていた CColor_Foundの移植完了検索語のハイラドキュメトではなくビーに属していたとは知らなかった<追記>あらら不具合扱いだ>画面分割でハイラトが引き継がれない</追記>棚上げの理由はそれとは関係なくて検索語の開始位置と終了位置をどこに保存するかというものともあれこれで既存の色分けロジックを完全に置き換えることができた

重さとか気になるなあ気がつけば CPUGPUよりケースやクーラーにお金をかけていた今の PCだけどっても Phenom720BEだからAtomの載ったマシンなんて持ってないし(フルHDとかいうわけでは全くない)DivX動画の再生にも苦労した K6-2でどうだろう(ちなみに PhenomⅡは K10)


ッダファイル only (Kazuho@Cybozu Labs: 今更 C++JSONpicojsonを書いたわ)というのは考えたことのない*6価値基準だそのこころは?


 @2009-10-11

移植ミスかと思って ANSI1.6.5.0をダウンロドして試したがどうもそうではない

\w{10} というパターンで検索をするF3を押す度に次の 10文字に選択範囲が移動するCtrl+F3を押してハイラトを解除する検索語が最後に選択されていた 10文字そのものになってしまうのだ検索オプションも変わってるもう一度 F3を押してもCtrl+F3を押しても元の状態には戻らないこれは正規表現を使わない検索では問題にならないがパターン検索では困るCtrl+F3を押しただけで検索条件が変わっては困るちなみに「カーソル位置の文字列をデフトの検索文字列にする設定とは関係がない(OFFだから)

 CViewCommander.cpp

こうしてみた

//検索マークの切替え	// 2001.12.03 hor クリア を 切替え に変更
void CViewCommander::Command_SEARCH_CLEARMARK( void )
{
	this->m_pCommanderView->m_bCurSrchKeyMark = ! this->m_pCommanderView->m_bCurSrchKeyMark;
	this->m_pCommanderView->RedrawAll();
	return;
}

これで本当に Ctrl+F3が検索語ハイラトの切り替えになったしパターン検索でも問題がなくなった2001年から現在までに何かがあったのだろう

<追記@2010-06-20> 検索条件が選択文字列で置きかわるのは意図された動作だったつま「検索マークの切替え(Command_SEARCH_CLEARMARK)は選択文字列をハイラトしたいときに実行するコマドだということハイラトが消えるのは選択文字列が空のときに限られた動作っきりいってこれは名前が悪い「クリア を 切替え に変更したときに主客転倒してしまってる別のコマドにせーよ </追記>


 @2009-10-12

脈絡もなく突然死するabnormal program terminationと出るからthrowしてる部分が原因どうしてそこを実行するような状態になるのかがわからない色分けの反映が外因による再描画が起こるまで遅れることもやはり前後の脈絡なく起こる徐々に壊れていってるのか?

 @2009-10-13

昨日の突然死はコドと仕様を整理して適当に書き換えてるうちに出なくなったみたいだがその過程で新たなミスを仕込んでいた無効化されたイテレータ変数名にしてたった 5文字のミスそのミスをした次の行ではちゃんと意識して避けていたのに……これのせいで描画範囲の最適化(いまはわかりやすさから常に全面を書き換えている)が進まなかった


 @20009-10-14

仮想関数を持ったベースクラスがあって継承するからには必ずオーバーラドしないと意味のないメンバ関数を = 0; で純粋仮想にしてそうでない必ずしもすべての派生クラスにとって必要ではないものをデフト付きの仮想関数にしていた具体的にいうとデフト付きの仮想関数は正規表現キーワドのためだけに用意されたようなもののことだ

気付かなかった継承した正規表現キーワドのクラスでオーバーラドに失敗していたことに関数が constか非constかの違いで失敗していて別の仮想関数を定義していただけだった。だから C#には overrideーワドがあるんだよ .NET1.0βのときから*7落とし穴だって事は知ってたさ気付くまでっと丸一日かかっただけで……orz

派生クラスで分かり易さのためにわざわざ virtualって書いてるんだからそのときに overrideって書かせてくれていたらコンパイラ「おまえ何をオーバーラドしようとしてるんだ(そんな対象は存在しない)って教えてくれていたはずだ

まさにコレ!>Is there some way to make the compiler check if the function I declared in the derived class actually overrides a function in the base class? (stackoverflow.com)

関連C#のえろい人の話>Versioning, Virtual, and Override


degradeの回復はもううんざりだお次はこれをする

  1. 文字集合内のエスケープされておらずコロンが後ろにない[ をエスケープ<<< POSIXブラケトだけじゃなかった普通の文字集合を文字集合の中に書いて集合の和や積を表現できるんだ(たしかにおおざっぱに範囲を指定して一部を取り除きたいときがある使える機能だ)エスケープ必須なのには理由があったということで無理
  2. 一つのパターン内での色分
  3. いまいち機能していない空間効率の改善

 @2009-10-15

  • パターン内での色分けに対応した

    JavaScriptの正規表現と違ってキャプチャの位置がわかるのでSHJSの仕様に従ってかっこを

      /(A)(B)(C)/

    というように隣接させる必要がない入れ子にすることも許される入れ子にしたら一番内側の色が適用されるようにしたつもり

  • ァイルに改行が一つもなく末尾の文字が正規表現キーワドの色分け対象だったときに無限ループに陥っていたのを修正した

 @2009-10-17

  • 改行部分の検索ハイラトが消えなかったのを修正した
  • パターンのコンパイルエラーを報告するようにした(結果的に 1つのパターンを 2回コンパイルすることになって無駄なんだけども色分けに失敗する原因を特定する時間を短縮する方が大)

@2009-10-11に書いた Ctrl+F3での検索語ハイラトの切り替えについてANSIUNICODE版に共通するパターン検索の問題としてハイラト対象かどうかの判断が(おそらく)常に行頭からのマッチングによっているの対してF3や検索ダイアログの検索開始位置はキャレトのある場所からと異なっている\w{10} というパターンを検索するときハイラトは行頭から探して 10文字を対象とするが検索はキャレトの位置から探した 10文字を選択する

検索語ハイラトのやり方を変えないといけない

先にさらに別の問題の上検索で行末からの検索が行われていなかったのを修正したたとえば"0123456789" という数字10文字の行があって行末から \d{6} を上検索したときに "012345" が選択されてしまい"456789" ではないという問題

まだ直っていないのはキャレトを "3""4" の間に置いて \d{6} を下検索したときにハイラトの範囲が(行頭から探した数字6) "012345" なのに対して選択範囲が(ャレトの後ろから探した数字6) "456789" となり一致しない問題


 @2009-10-18

検索語ハイラトのやり方を変えたパターン検索でも検索開始位置を尊重したハイラトができるようになったただし従来の色分け方法ではCColor_Found::BeginColor()CEditView::IsSearchString()に与えられる引数が十分でないために検索開始位置に配慮した判断ができないというわけでここまでの一連の変更に対する上積みの修正となった(本家へのパッチは UNICODE/ANSI版ともに作成できませ)

@2011-03-31 ハイラトが原因で13000桁を超える程度のファイルで検索がすんごく遅くなってたのでハイラトは検索開始位置を考慮しないように戻した


Luaゃんのためにブロックコメトを行コメトより優先したLuaのブロックコメトは --[[ から ]] までで行コメトが -- から行末までrkw2/Lua.rkw2ァイルを用意して正規表現キーワドで色分けすればなんなりと対応できるけどコメトに関しては専用フームが用意されてるからそちらでできた方が良いっとして Luaとは逆のパタン:行コメトを優先しなければいけない言語があるだろうか? その場合開始文字の長さでソトして長い順に色分け機能を登録しないといけなくなる(ところで Luaにはデクリメト演算子がなさそうコメトより強調キーワ強調キーワドより正規表現キーワドの方が優先順位が高いのでどちらかで -- を登録するとコメトじゃなくなってしまうだろうっそり書いたが強調キーワドに記号が登録できるように仕様変更したつもりだ英字とハイフンを混ぜられるわけではないが&& みたいに全体が記号だけならいけるは)


>>'\0'も置換できるように
>正規表現で \x00 とすれば出来ます。

無理俺は NUL文字を考慮していない

> // 前の行のNULL文字(\0)にもマッチさせるために+1 2003.05.16 かろと

というコメトを CSearchAgent::SearchWord() @ CSearchAgent.cpp で見つけたときに嫌な予感はしたけどもう遅い


設定ファイルのことを考えるときには共有メモリのことを考えないといけないんだ*8個々のプロセス(=一つの文書)にとって必要なタイプ別設定は一つだけだから共通設定と基本設定だけを共有メモリに置いておいて他のタイプ別設定は個別に自分のメモリ空間にロドすればいい気がするけどそうするとタイプ別設定の同期が必要変更して iniァイルに保存したときにブロドキトするだけ? タイプ別設定を共有メモリに載せる必要はある? > タイプ別設定数を可変長に


正規表現インクリメンタルサーチなんて機能がある! ひえ


>正規表現による複数行検索対(簡易版 正規表現ライブラリに適切なインターフェイスがない限りァイルサイズに比例したメモリを消費しないと完全な対応はできない気がする

  1. ッチに失敗したのは対象文字列を一行しか与えなかったせいかもしれない
  2. ッチに失敗したのは対象文字列を二行しか与えなかったせいかもしれない
  3. (以下 EOFまで繰り返)

既存の APIに適合させるための非効率的なごり押し(に思える)ッファに格納する行数を事前に入力させるような設計(行数に制限があることと設定の手間あと指定させるなら行数よりバッファサイズでしょうーザーの利便性よりコンピータの効率よりプログラマの都合を優先させてどうするの?)には尻込みしてしまうたとえば <table>タグで囲まれた部分を探そうとしたときにその中身が最大で何行ぐらいあるだろうかとか考えたくはない


 @2009-10-19

色分けのために行ごとに保存するキッシュをトする機能は価値があるかもMB35000行程度のファイルで一行削除する度にスクロールを待たされるのはたまらないマシスペックにもよるがPageDownーを押し続けるだけでは待たされないCtrl+Endやスクロールバーを掴んだときに顕著しかもこのファイルは色分け対象ではなかったさらに遅くなるってことだ

  • 0の上検索がいつまでもその場足踏みしてないで上へ進むように修正
  • ャレトより前の0の行頭マッチがハイラトできていなかったのを修正(あんまりやりにくいので CViewCommander::Command_SEARCH_PREV()から gotoを取り除いて不必要に選択範囲を保存するのをやめ)
  • 強調キーワドが語の境界を気にしていなかったのを修正(少し前にいらない気がして削除した部分がやっぱり必要だったとい)
  • $\b などの幅0のパターンを検索したときにキャレトが表示されたままになるのを修正(実はキャレトではなく空の選択範囲だ)

 @2009-10-20

昨日の空の選択範囲が消えない対策として空のときは範囲選択をしないことにしたら今度は下検索が先へ進まない現在の選択範囲が空かどうかでその場足踏み対策をしていたからだったっぱり正攻法の空の選択範囲の表示をキャレトの移動に伴ってきちんとクリアすることで解決するのがよさそうそのへんのコドの流れがよくわからないから手を付けなかったんだけど

空の選択範囲はキャレトと表示がかぶってしまってャレトの点滅が一巡するまでキャレトを見失うデメリトもあるっそ描画しないのがいいのではそれがいいとは思わないけど幅のない矩形選択範囲も現在は描画されていないのだし

わかってきた空の選択範囲が消えないのは改行記号を描画していないからだ

というわけでもなかった

選択開始時というのは幅0の選択をしている状態であるそのときにCViewSelect::DrawTextArea()を呼ぶことで選択範囲の始点の反転・反転解除の対応がとれたと思う空の選択範囲のゴミは残らなくなったそのおかげで幅0の矩形選択範囲を不具合なくある程度の幅で描画できるようになった

そもそもどの変更でゴミが残るようにしてしまったんだろう?検索と色分けのあたりしかさわってない

 // 2005/04/02 かろと 0文字マッチだと反転幅が0となり反転されないので、1/3文字幅だけ反転させる
 // 2005/06/26 zenryaku 選択解除でキャレットの残骸が残る問題を修正
 // 2005/09/29 ryoji スクロール時にキャレットのようなゴミが表示される問題を修正

こういうコメトが残っていて繊細な部分だったという言い訳はできそうだ

ここ数日は一退一進で進んでいない

18日から 20日にかけてexeのサイズが 50KBdiffのサイズが数KB縮んでいるmergeのやり方を変えたんだが失敗しているとしか思えない


 @2009-10-20

色分けは別スレドにするのがいいなCPU使用率を(3コアだか) 33%にはりつかせてーザーをなすすべもなく待たせてってることが色分けだなんてアホすぎる>@2009-10-19

中心となるデータ構造は一つ行ごとの色分け開始状態コンテキトといってもいい前の行から続くコメトの中なのか文字列の中なのか一番外側なのかを表した配列

色分けスレドは未確定の要素のうち一番小さいインデックスを持つものの一つ前の行をひたすら色分けして確定に変えていく

メイスレドは行の内容に変更があったからその次の行が未確定に変わったことある行からある行にかけて削除されてしまったからその後ろが軒並み未確定に変わってしまった(賢ければ対応する要素を取り除いて後ろの要素を前にトし未確定にするのは先頭の一要素だけで済ませてよい)ことを知らせる色分け結果はタイムアト付きで受け取り間に合わなければ色分けなんてせずに文字の表示を優先する

  • 排他処理
  • 未確定要素が存在しないときに色分けスレドの実行をブロック
  • タイムア

こういう機能はどうやったら手に入るだろう特に 2番目と 3番目イベトとかシグナル? C++標準は無し?

そもそも配列を所有するオブジトがこういう機能を提供するのだろうけどそのオブジトはどのスレドに属しているの3

違う違う両方のスレドがそのオブジトのメンバ関数を起動するから排他処理が必要になるんだって

Unicodeリテラル(>20091007)といい正常進化だよね>C++0xのマルチスレド機2/3CodeZine難しい部分はコンパイラとライブラリ作者に任せて便利な部分を享受するだけの末端アマグラマ拝


非キーワド文字を含む強調キーワドの色分けを可能にした空白が入っていてもハイフンが入っていてもバッククオトで始まっていてもーワドの先頭と末尾が語の境界にありさえすれば色分けする今は文字を 3種類に分類して語の境界を検出している即ち空白類ーワドに使用できる文字ーワドに使用できない文字おおざっぱだけど結構大丈夫この変更は単独パッチにできる

正規表現でたとえると従来の色分けは \b\w+\b を色分けする昨日までは \b(\w+|[^\w\s]+)\b を色分けしていた今日のは \b\S.*?\b を色分けする(\b\w[^\w\s]\w\s[^\w\s]\sの境)

弱点は最長一致ではないから共通の接頭辞を持つ複数のキーワドが一緒に登録されていると長い方は絶対に色分けされないことA-BAが登録されていたときA-Bは絶対に色分け対象にならない面倒だけどキーワドセトを二つに分けて長い方を強調キーワ1短い方を強調キーワ2に割り当てると番号の若い強調キーワドが優先されるので長いキーワドも色分けできるようにはなる

<追記@2010-04-04> やはりというか、掲示板(unicode:1156)で最長一致について言及されてしまったrev2ッチで最長一致に対応したつもり </追記>


 @2009-10-22

昨日おかした間違いトイレで気がついたよ<どうでもいい

長さが足りなくて登録キーワドと一致しなかったときにーワド文字かどうかに関わらず続く語を加えて改めてキーワドかどうかお伺いをたてるようにしたのが昨日の変更それでその結果が結局不一致となったときにカーソルを巻き戻すのを忘れていたせいでーワドの見落としが起こっていた(はずだ)

予想通りだった修正した

こういうケース

# 強調キーワード(2つ)
本日は、晴天なり
晴天じゃないよ

# テキスト(1行)
本日は、晴天じゃないよ。

晴天じゃないよの部分が見落とされていた


 @2009-10-24

ハイラトの描画が古い情報に基づいていたのを修正したなにが大丈夫だから省略> 過去の自分


 @2009-10-27

@2009-10-20での矩形選択始点にゴミが残る問題の修正の結果普通の選択でゴミが残るようになっていたそれならこれでどうだ


 @2009-10-30

組み込み「半角数値の色分けが単語の境界を認識せず数字とみれば見境なく色分けするようにしてしまっていたのを修正した


検索語ハイラトがおかしいCEditView::IsSearchString()の仕様が正規表現検索とそうでない場合で異なっていたことに気付かず正規表現を使用しないときは一行につき一つしかハイラトできていなかった正規表現を使用した検索でもハイラトすべき語が周期的にスキップされてしまう

修正した


@2009-10-10で書いた「どなたかの受け売りで代入( = など)と演算子( == など)を分けたこの日記での色分けも以前からそうしているの元ネタを再発見したこれを以前読んでいたのだ

With syntax highlighting it would be possible to mark "=" and "==" in different colours. Yay! A good reason for implementing syntax highlighting! Butand at this point it probably won't surprise youevery colour scheme I've come across uses the same colour to highlight both "=" and "==".

http://www.linusakesson.net/programming/syntaxhighlighting/index.php

 @2009-10-31

っと考え直して正規表現キーワドの優先順位を強調キーワドの下に下げた正規表現キーワドのフーマトは難しく強調キーワドのは簡単なので「何でこのキーワ登録して設定したのに色分けされへんの?ムキー!ってならないように(容易に想像できる通り今日の自分がそうだったからで)


 @2009-11-01

正規表現キーワドの色設定のチック状態が反映されていなかったのを修正した以前の正規表現キーワドと違い一つのパターンが一つの色設定にひもつけられるわけではないのでック状態は機能の ON/OFFを意味しないックが外れていた場合「テキ色に色分けすることにした


 @2009-11-02 検索語を複数の色でハイラトできるようにした

>複数検索結果のハイラト表示 Request/197 - SakuraEditorWiki

最初に一言検索履歴を利用して複数の色分け対象を探すのは使いやすいインターフェイスがみつからないだろう

検索機能は大枠で三種類あるパターン検索単語検索それとただの検索今回変更したのは単語検索単語検索では検索語が一単語でない場合たとえば空白やピリドやハイフンを含んでいた場合これまでは絶対にマッチが見つからなかった(と思う)だから検索語を単語に区切って各々を違う色に塗り分けても悪影響はないだろうむしろ望むところ?という判断

ールバーの検索ボックスを単語検索専用にするか別に用意すればすごく使いやすくなる


 @2009-11-04

検索文字列の色設定のチック状態を反映するように修正


 @2009-11-15

Very Sleepyを試してみたCtrl+Endを押すと wcschr()がものすごい勢いで呼ばれているらしいそれを呼ぶのは文字変換系などを除くと WCODE::IsZenkakuKigou()がくさいさらにそれを呼ぶのは CWordParse::WhatKindOfChar()これは単語の境界判定で使われている

改行文字36223折り返し64935行のファイルの先頭で Ctrl+Endを押すと以下のような呼び出し履歴を伴って CWordParse::WhatKindOfChar()が○百万回呼ばれていた笑うしかないと書こうとしたが終わらない回数は数えられなかったどうやら Visual Studioが張り付いた状態では限界が低くなるらしいこのファイルの内容をサイズが 100MBを超えるくらいまでコピペを繰り返したファイルでも無限ループ状態になるのを確認している(何時間も終わらなければ無限でし)

sakuraW.exe!CWordParse::WhatKindOfChar(const wchar_t * pData=0x027dd078, int pDataLen=134)  行 120	C++
sakuraW.exe!CWordParse::WhereCurrentWord_2(const wchar_t * pLine=0x027dd078, int nLineLen=134, int nIdx=125, int * pnIdxFrom=0x0017f76c, int * pnIdxTo=0x0017f768, CNativeW * pcmcmWord=0x00000000, CNativeW * pcmcmWordLeft=0x00000000)  行 49 + 0x10 バイト	C++
sakuraW.exe!CEditView::IsSearchString(const CStringRef & cStr={...}, int nPos=125, int * pnSearchStart=0x026338f4, int * pnSearchEnd=0x026338f8)  行 307 + 0x24 バイト	C++
sakuraW.exe!CColorML_Found::IsStartOfKeyword(const CEditDoc * const pDoc=0x02740048, const int nLineNumber=40057076, const int nPosWithinLine=125, EColorIndexType * const outColor=0x0017f80c, void * * userData=0x04af1e94)  行 56	C++
sakuraW.exe!ColorMLStrategy::HighlightEngine::DoHighlightLine(const std::vector<CColorML_Base * const,std::allocator<CColorML_Base * const> > & strategies=[2](0x026338a8,0x026338e8 {pView=0x0263a458 lineNum=1582 begin=-1 ...}), const CEditDoc * const pDoc=0x02740048, const int nLineNumber=1582, const ColorMLStrategy::HighlightEngine::StartingStrategy & startingStrategy={...}, ColorMLStrategy::Result * const outResult=0x00000000)  行 113 + 0x27 バイト	C++
sakuraW.exe!ColorMLStrategy::HighlightEngine::HighlightLine(const std::vector<CColorML_Base * const,std::allocator<CColorML_Base * const> > & strategies=[2](0x026338a8,0x026338e8 {pView=0x0263a458 lineNum=1582 begin=-1 ...}), const CEditDoc * const pDoc=0x02740048, const int nLineNumber=36202, ColorMLStrategy::Result * const outResult=0x0017f9bc)  行 69	C++
sakuraW.exe!ColorMLStrategy::HighlightLine(const CEditDoc * const pDoc=0x02740048, const int nLineNumber=36202, ColorMLStrategy::Result * const outResult=0x0017f9bc)  行 200	C++
sakuraW.exe!CEditView::DrawLogicLine(HDC__ * _hdc=0x00008d6a, DispPos * _pDispPos=0x00000000, int * pnLineTo=0x0017fbe4)  行 546	C++
sakuraW.exe!CEditView::OnPaint(HDC__ * _hdc=0x01011734, tagPAINTSTRUCT * pPs=0x0017fc38, int bDrawFromComptibleBmp=18)  行 377	C++
sakuraW.exe!CEditView::DispatchEvent(HWND__ * hwnd=0x00080684, unsigned int uMsg=0, unsigned int wParam=0, long lParam=0)  行 693	C++
sakuraW.exe!EditViewWndProc(HWND__ * hwnd=0x00080684, unsigned int uMsg=15, unsigned int wParam=0, long lParam=0)  行 103	C++

  1. 検索語ハイラトが無駄に表示領域外の色分けに励んでいたのをやめさせた
  2. そうすると次に単独の関数として一番時間を食っているのが _wctomb_s_l()これは URLの色分け判定で使われる IsURL(@parse/CWordParse.cpp)から呼ばれているIsMailAddress(@parse/CWordParse.cpp)IsUrl()から呼ばれやはりかなりの時間を消費している単語の境界判定を上位で行って IsURL()の呼び出し回数を減らした
  3. CDocLineMgrの実装がリトなのドキュメトの○行目を取得するコトが高い個々の色分けユニトにパラメータを通して CDocLineを渡すことにした

CLayoutMgrの実装もリランダムアクセスの遅さ(=CLayoutMgr.SearchLineByLayoutY()の遅さ)がスクロールバドラッグしたときのカクカクした反応に現れているメモリは潤沢にあるものとしてCPU速度と相談していくつまでならリトをたどっても満足なスポスを返せるかを決めるたとえばそれが 10000なら 10000行ごとにシトカト用のポインタを持っておけばいい

インデックスのはりすぎは更新のコトがいやんなことになる@2013-07-2610000行ごとって決めてしまわずにルーズに管理して更新頻度を減らそうとすると直近のシトカトを見つけるのが割り算一発からバイナリサーチになるなあ

ポインタ二個分のオーバーヘドをもった doubly-linked listなんかよりつなぎ合わせた vectorでいいじゃない(そうするとこんどはリターンキーのスポスが気になるわけだけ)


 @2009-12-21 われながら遠回りしてるよなあ

  1. ップバッファは GreenPad で知ったのだが私は説明しないんで別のページで勉強してください(Alpha のグダグダ日)
  2. 17:35 04/05/29ップバッフ(w.l.o.g.)

AlphaGreenPadとならんでースを参考にしたいエタのにおいがする(まだチラ見もしてないけど)Alphaのリポトリの最終更新は 43時間前とまだ生きてるのも嬉しい

GreenPadはねえどこに機能があったのか?と見返してしまうほどにひとつひとつのファイルはすかすかで整然としてるだからといってべらぼうにファイル数が多いわけでもないテキトエタなんてその程度の規模のアプリなんだと思わせてくれるのだけど自分で書いたら管理不能なスパゲになるのが見えていて知識とテクニックと設計能力の差を思い知るよね


Alpha-0.7.5.16α-fix10.rbァイルを開く#のみの行で #がコメト色にならないとかなんで設定変更できないの?とか枝葉末節はおいておいて機能性もスポスの良さも申し分ない文字の表示がきれい軽や紙切れのようだ100MB超のファイルを開くと CPU使用率 33%(1コアフルロ)でフリーズして応答が戻らないけどそんなん耐久テトのみの世界だし正規表現で複数行検索できるのが何よりすばらしいそれはやはりBoost.Regexだからできたのかなあ >2006-12-22 Boost.Regex で改行をまたぐ検索を その 8 (Alpha の अनुपयोगी な日)入力はイテレータかトリームで与えたいよねえっと\w{10} の前検索が戻っていかない(毛色の違う先端バージョン 0.7.9x系列)Alpha-0.7.93.5αや\w{10}\n というパターンだとバックしていくのだAlpha-0.7.93.5αは選択範囲の D&Dで落ちた本当にアルファ版なんだ

ースの前に日記(Alpha の अनुपयोगी な日記)も読み応えがあるなあグリフって何?レベルの人間には Unicode関連の話が理解できない内部文字集合が Unicodeってだけでなくすごく真面目に Localization(でいいのかな?)に取り組んでるのが伝わってくるそれとメモ帳タを名乗るからにはこけおどしの機能をてんこ盛りにする前に文字の表示で(世界中で販売されている Windowsに添付されている)メモ帳品質を超えていてほしいものだ


 @2009-12-23 l10n v.s. m17n

昨日Localization(でいいのかな?)と書いたけど2006年あたりの日記(Alpha の باطل な日記)を見てると Multilingualizationまで踏み込んでいる気がする「気がするのは用語の適用範囲がいまいちわかっていないから。Unicodeがモノリンガルであるということの意味がそもそもわからん


 @2009-12-24 パターン検索での上検索と下検索の対称性

ってしまいました

@2009-10-17に書い「上検索で行末からの検索が行われていなかったのを修正したたとえば"0123456789" という数字10文字の行があって行末から \d{6} を上検索したときに "012345" が選択されてしまい"456789" ではないという問題に伴う副作用だと思う気付いたきっかけはこの日記

サクラは '00000'00000 ←→ 00000'00000' だから挙動に納得は出来る EmEditorは一見真魚と同じに見えるが aaa1aaa1aaa1に対して+1で検索すれば 順方向では開始位置から最後までがヒトするのに逆方向ではa1だけがヒトする これも全く納得できない理解不能な動作だ

汁么ゴ魚 - 鬼車#3

上検索で a1 ではなく aaa1aaa1aaa1 にマッチするようにはできる副作用だけを取り除けるはずだ正規表現マッチの基本は greedyだから上検索で a1 にしかマッチしないのは自分も納得できない

真魚の最新版(2.2.3.5)aaa1aaa1aaa1 に対して .+1 を下検索すると全体がマッチするのに上検索すると a1 に三回マッチするっていうのは全く納得できない理解不能な動作だどこかで心変わりしたのです

気にせず greedyな上検索にしてみたけど中途半端な結果になった

  1. aaa1aaa1aaa1 の末尾から .+1 を上検索すると aaa1aaa1aaa1 がマッチする(期待通)
  2. aaa1aaa1aaa1 の末尾の 1の手前から .+1 を上検索するとマッチなし(先頭から aaa1aaa1にマッチしてほし)
  3. aaa1aaa1aaa1 の末尾から .+?1 を上検索すると 1aaa1 にマッチする(右から左へのマッチングを正当に行った場合は a1にマッチするのが正しいかもしれない下検索の対称という観点では aaa1にマッチするのもありかもしれないでもどちらでもな)

本家のサクラエタは 3番目に対応している上検索の実装が(行頭から始まる)下検索の巻き戻しだからだところがそれではキャレト位置からの上検索ができないからと変更したのだったその結果下検索を繰り返してキャレトが進んでいくたびにキャレトより前のハイラト範囲(=上検索でのマッチ範囲)がうぞうぞと変化するようになったと自分で報告していたのだから最初から上検索と下検索の対称性などのぞむべくもなかったのだ

対称性は(自分の望んだ結果なのだから)捨てられるとしても2番目と 3番目にはよりよいマッチが存在しているのに対応することができないっとしたら 2番目は鬼車の APIを直接使「検索対象文字列の終端とは違「検索対象文字列の検索終了位置を渡すことで$が誤ってマッチする心配なしにaaa1aaa1にマッチさせられるかもしれないでも 3番目は .NET FrameworkRegexOptions 列挙体 (System.Text.RegularExpressions)に用意されている RightToLeftオプションのようなものが予め用意されていなければ自作するしかないような気がしたが\1 のような参照とキャプチャの前後を入れ替えられるわけもなく.+?1 の上検索が a1にマッチするのを期待するのは無茶ってものだ

行末やキャレト位置からの(中途半端におわってしまう)上検索より(行頭からの)下検索の巻き戻しのように(大部分で)対称的に動作する上検索がわかりやすさも使い勝手も勝ってるようだ(すでに加えた変更を巻き戻すかどうか迷)

 CRLFCRLF

同じく真魚の作者の日記から

正しくは、
CR:←
LF:↓
CRLF:←曲がって↓
LFCR:↓で一行、←で一行
こんな表記になる。

あきらかに間違っているのはサクラエディタで、CRとLFの矢印が逆だ。
いや、Windowsの間違いにわざと乗ってやってると言うべきなのか。
CR:↓(逆)
LF:←(逆)
CRLF:↓曲がって←(逆+逆)
LFCR:←曲がって↓(一行にまとめてはいけない)
汁么ゴ魚 - CRLFの問題

今は ANSIUnicode版ともに CRLFの逆転は解消されCRは←でLFは↓で描画されているCRLFはそのままだがこれはLF()CR()の組み合わせなのではなくリターン記号(cf.リターンキ(ja.wikipedia.org))ったんだよWindowsにおいて改行と CRLFとリターンキーは切っても切れない関係なんだからという強弁で乗り切ろう


 @2010-01-23

URLの色分けがいつからかできてないや

2009-11-16からだアルファベトかをどうか調べる関数に文字(wchar_t)のかわりにその文字の文字列中でのインデックス(int)を渡していた

intwchar_t(オプションにより組み込み型扱いになっている)は全くの別物だと思うんだけどなあ


相変わらずマージってやつは泥臭い作業で自信が持てない同じコドブロックが複数回連続してるような場所がみつかってもまったく驚かないよ


 @2010-04-14 バグ修正

行をまたぐ色分けに問題があってたとえば一画面に収まらない長大な複数行文字列があったとして何度も上下にスクロールしたり改行を入力したりするだけで色分けが変わってしまっていた


 @2010-04-23っとしたバグ

括弧類を色分け対象にしていて「対括弧の強調も有効になってる場合ャレトが括弧から離れるときに閉じ括弧の表示が閉じ括弧の次の文字と同じになってしまう


 っとしたバグ解決

このブランチ単体でも純粋な公式 trunk2でも再現しないからその差分を見ていたら見つけた

http://sakura-editor.svn.sourceforge.net/viewvc/sakura-editor?view=rev&revision=1723

Index: sakura_core/view/CEditView_Paint_Bracket.cpp
===================================================================
--- sakura_core/view/CEditView_Paint_Bracket.cpp	(.../shjs_style_regex_keyword)	(リビジョン 45197)
+++ sakura_core/view/CEditView_Paint_Bracket.cpp	(.../build_my_sakura)	(リビジョン 45197)
@@ -138,7 +138,7 @@
if( IsBracket( pLine, OutputX, CLogicInt(1) ) ){
	// 03/10/24 ai 折り返し行のColorIndexが正しく取得できない問題に対応
	// 2009.02.07 ryoji GetColorIndex に渡すインデックスの仕様変更(元はこっちの仕様だった模様)
-	nColorIndex = GetColorIndex( pcLayout, OutputX );
+	nColorIndex = GetColorIndex( pcLayout, OutputX + 1 );
 					}
else{
	SetBracketPairPos( false );

+1したら次の文字の色になるのも当然GetColorIndex()の中身がブランチの方で別物になってるから公式で行われた上のような呼び出し部分の変更はマージしてはいけなかった


ここらで続く


sakuraW+rkw2.zip (645KiB, 2011-05-25, 2.0.2.0(r1913))

shjs_style_regex_keyword(trunk2@1711).patch (352KiB, 2010-04-14)

svn co https://sakura-editor.svn.sourceforge.net/svnroot/sakura-editor/sakura/trunk2/@1711
  • 突然エラー終了しても泣かない
  • 突然応答がなくなって強制終了するしかなくなっても泣かない
  • 数千文字ある行に対して . をパターン検索するなどして数千回のマッチングが行われそうな場合応答がなくなる(っても返ってくるかは不)
  • bregonig.dll(Unicode)exeの隣にないと当然機能しない
  • タイプ設定名と rkw2ァイルの名前を一致させないと機能は ONにならない
    • タイプ設定名にファイル名に使えない文字が使われている場合その文字を対応する全角文字に置き換えた名前のファイルを作成すればいい
    • この文字( \ )が円マークに見えてる人も全角の \ に置き換えないとファイルを見つけられないので
  • たまたまこの日(2009-08-08)の日記に SHJSのバトラックのことが書いてあるがその機能はない\(改行)JavaScriptの文字列が次行に継続することならば確認できる
  • 無限ループ対策をしていないのである Stateから同じ State一文字も消費しないで遷移するルトが存在すると抜けられない先読みを使って遷移先を振り分けるときは注意

気ままな変更がちらほら

  • 設定のデフトを常駐OFFに変更ーラーソル行アンダーライン改行文字タブEOF表示をOFFに変更正規表現キーワドの色分けを ONに変更
    • 常駐はしないのが普通(俺はブラウザの次によく使うからスタトアップに入れて常駐させてるけど)
    • 改行もタブも空白としてありふれた文字だから表示するとうるさい視認する必要も一般人にはあまりない
      • いきなりの自己否定一般人はサクラエっていうかエタ自体使わないんだよね(伝聞)画像はフトシテキトはワみたいなjpgを表示するだけならフトシップよりブラウザブラウザより IrfanView(たとえが古いな)が軽いだろうけどそんなことは気にしないアイコンをダブルクリックするだけというイメージ
    • 今や実在も疑わしい EOFわざわざ表示する必要はなかろう
    • ーラー? カーソル行アンダーライン? 存在理由がわからない(ーラーにこだわる人がいるのは知っている)
    • 正規表現キーワドは表示までにユーザーの設定が別途必要なので色設定は予め ONの方がわかりやすい
  • 色設定を二つのファイル( view/colors/EColorIndexType.h, .cpp )に集約
  • パターン検索でも検索開始位置を尊重した上検索とハイラトを行う
    • \w{10} のようなパターンで F3(Shift+F3)を押していけばャレトが通り過ぎたあとのハイラト範囲がうぞうぞ変化するのがわかるかと
  • 0の矩形選択範囲が見える
  • 空白やハイフンを含んでいたりッククオトで始まっている強調キーワドを色分けできる(最長一)
  • 検索語を複数の色でハイラトできる
  • 文脈依存変換パッチrev3.3(SourceForge.net: Sakura Editor: Detail: 2972711 - IME前後ドバック機能)
  • 拡張子の存在しないファイルはファイル名を拡張子とみなして適用するファイルタイプを決定する(guess_filetype_of_extlessfile.patch 拡張子リmak makefileとしておけば MAKEFILEにもファイルタイプを適用できる副作用で a.makefileMAKというファイルにも適用され)

 SHJS-0.5/lang/sh_*.jsから rkw2ーマトへの変換

  • ifや代入部分(セミコロンも!)を削除してオブジト配列の配列だけにする
  • パターン中の文字集合の中の [ をすべてエスケープする
  • \xXXというパターンを Unicode形式にするか削除する(JavaScriptではこのへんをうまく扱ってくれる*9のだけど鬼車は違)

色分けされないときのチックリ

ァイルの配置は正しいか?
sakuraW.iniァイルのあるフォルダに rkw2ォルダを置かないといけないsakuraW.exesakuraW.exe.iniのあるフォルダではない
正規表現キーワドの色指定をデフトから変更したか?
色分けの結果「テキと同じでは区別できない

Javaった java.util.regex.Matcherクラスの requireEnd()hitEnd()がそう他にも AnchoringBoundsTransparentBoundsが用意されているなど至れり尽くせりこういう生真面目さが Javaの良さであり冗長さや遅さを許す一因だったのかもと今は思う

* WikiPedia(ja)を見たら JSONで表現できるデータタイプに正規表現がない!ポータブルじゃないからか? ほかにも有効でないエスケープシークエ(\Gとか \qGq自身を表す)とか \(改行)というエスケープシークエスが無効シングルクーテーション文字列もないJSON_checkerによるとマイナスの後に空白を入れるのもプラスを明示的に付けるのも許されない窮屈だけど\x[\x] というエスケープシークエスの存在が正規表現パターンの簡易的な解釈を一段面倒なものにしていると感じていた(>[[20090922p01]])ところなので悪くはない

 内部で使用するだけの型の完全な情報を実装(cppァイル)に閉じ込めようと思ったらッダの中のクラスはその見せる必要のない型をポインタで保持するしかないのか? privateメンバーの詳細(サイズとか)なんてどうでもいいから隠したいのだがポインタで保持することにするとコトラクタで newすることになるのが嬉しくないというジレンマトラクタが呼べないからと std::auto_ptrにすることもできず生ポインタをメンバにしないといけないのも困りもの(明らか「所有しているのに生ポインタではそれが伝わらない)

 @2009-10-24トラクタが呼べないのはauto_ptrをメンバに持つクラスのデトラクタがコンパイラの生成するデフトのデトラクタだったからッダでデトラクタを宣言して実装で空のデトラクタを書けば解決ョルン・ールソBoost(2008, ピアソン・エデュケーション)に書いてあったimplクラス(構造体)の寿命管理を scoped_ptrに任せトラクタから pimpl_(implオブジ)delete文を削除する(scoped_ptrを使えば deleteは不要となるのです)だけで作業は完了です。ただトラクタそのものは定義しておく必要があるということを覚えておいてくださいその理由はコンパイラが暗黙のデトラクタを生成する時点では型 implが不完全でありpimpl_のデトラクタを呼び出せないためです。implの格納に auto_ptrを用いた場合こういったエラーを含むコドがコンパイルされてしまうことになりますがscoped_ptrを用いることでエラーを検出できるのでauto_ptrの場合に起こ「こういったエラが何なのかわかっていないが……

*4 @2010-01-29 More Exceptional C++を読み返していたらこれにも原因の説明と対処法が載っていた読んでいたはずだけど一度自分で穴にはまらないと気付きにくい問題だろうね

*5 今のままでは正規表現のフラグとフラグの間にコメトが埋め込めそうコメトは空白文字だとしてreturnStateに戻る代わりに state_transition_table[returnState][C_SPACE]に戻れば良さげ。

*6 現在までに書いた C++ドの 99%以上がここ 12か月のものだというにわかではあるけども

*7 というかそのときの C#しか知らない

*8 共有メモリにオブジトを置いて初期化されていないゴミメモリにアクセスしたりったら placement newの出番だとコトラクタを呼んだんだけど(想像では)似非共有オブジトが私的に確保したメモリは共有されてなくてやっぱりエラーになった少し前の記憶がよみがえる

@2013-07-26 Scintillaでの行管理の工夫[[Scintillaのデータ設計 - maneman8000の日記|http://d.hatena.ne.jp/maneman8000/20110206/1297006996]]インデックスの更新が必要なエリアはある点から始まり必ず末尾で終わるある点をひとつ記憶しておくことで更新範囲をある点とある点の差分にすることができる

*9 文字列の内部表現が Unicodeなのに \xXX という ASCIIド指定を意味が変わらないように解釈してくれる


20090806()

[tDiary] tdiary.rbplugin/navi_user.rbにパッチあて(plugin/recent_list.rbの分は使用してないのでスル) + セクションごとの最終更新日時に一票

 > Re: [tDiary-devel] all_filtersとかload_pluginsが呼ばれ過ぎで遅い件

速くなると聞いては捨ておけぬ

category_anchorでの nil.yearエラーは起こったのがカテゴリモドだったら既知だけど最新N日表示だから違うしTDiaryBase@dateは読み出し専用プロパだから(navi_user.rbのような荒技を使ったりしない)プラグインには変更できないし……(結局わかりませ)

 セクションごとの更新日時

plugin/makerss.rbが直前に変更のあったセクションの他に過去にちっとした修正のあったセクションを *.rdfのエトリに加えてしまうのを防げるので賛成一度考えた回避策はちっとした修正が *.rdfに反映されてしまうので影響が大きくて断念したし

 「編集」や「追記のときにどうやったら変更のあったセクションを見つけられるだろう(編集機能は一日単位だか)
  1. *.td2から読み込んだ AnyStyleDiaryPOSTされたソースに基づく AnyStyleDiaryを両方に並べて
  2. each_sectionしながらセクションを全文比較
  3. 一致すれば td2から読んだ古い方の最終更新日時を POSTされた新しい方の AnyStyleDiaryにもセ
  4. POSTされたソースに基づく方を *.td2に書き込む

という手順を考えた

セクションインデックスがずれるような変更だった場合は影響範囲が無駄に大きくなるけどセクションインデックスはセクションIDを兼ねているのでやむなし(URLって変わっちってますから)

新規作成や修正されたセクションに適用される最終更新日時を一回「編集」や「追記につき一つに限らないとupdate_procの中で変更のあったセクションを見つけるときにアバトな処理をするはめになりそう(心配しなくてもそうはならんでしょう)


20090805() [Vista] XPVistaLANーブルでつないでXPで共有設定しておいた My Documentsォルダの中身を VistaDocumentsォルダにコピーしたMy PicturesPicturesへコピーされまMy MusicMusicへコピーされまMy VideosVideosへコピーされま わざわざコピー元フォルダの desktop.iniを先読みしてるんかい!(まあォルダアイコンをカスタム表示したりするために読んでるんでしょう) 害はないので MSが用意したシナリオにただ感心した


20090803() [tDiary] だれもがブログやプロフや MySpaceなど自分用の Webスペースを持ってる(らしい)昨今ッコミを入れた人を数文字の名前とオプションのメールスでだけしか特定できないのってどうだろうOpenID(や類似のサービス)が本人確認の代行だけでなく自己紹介アイコンームページURLなど公開設定された情報を引っぱってくる窓口になってくれると嬉しい「提供する主なサービスとしてAuthentication属性交Attribute Exchangeなどがある(Wikipedia:OpenIDから)属性交換何するものぞ? スポhttpまたhttpsから始まるOpenIDURI形式の場合のほか仕様上はニックネームフルネームールスが含まれるが内容は認証サーバによって異なる例えばYahoo!では60文字程度の機械的なOpenIDしか返さない(Wikipedia:OpenIDから)っかりだよ Yahoo! となればーザーの提示する URLが再利用しやすい形式のユーザー情報を指していたらいいんだその内容と URLを提示したユーザーとを結びつけるのが OpenID認証サーバ<link rel="openid.server" href="..."/>コメントトラッキングも支援できたほうが良いがーザー認証の延長でできるのだろう(仕組みがまったくどちら側(あるいは両方)の対応が必要なのかもわかってないけど)っとしてこういう流れで OAuthが出てきてコメトを受け付けたサトがコメト主の利用するコメト集積所(Twitterに読み替えてもいいよ)コメト主の代わりにコメトを CCするのを可能にしてくれたりするんだろう(なんかいまっとだけ時代に追いついてこれた気がしてる一年半前には @ITの記事になってるんだけど)