行ごとの編集状態、その2
本日Azukiの不具合修正版1.6.2をリリースしました。一応当日のブログなので一言触れておきます 🙂 ここのところ悩んでいるのは3/13にも本ブログで記した「行ごとの編集状態」です。もともと想定していた範囲を超える仕様 … 続きを読む 行ごとの編集状態、その2
本日Azukiの不具合修正版1.6.2をリリースしました。一応当日のブログなので一言触れておきます 🙂 ここのところ悩んでいるのは3/13にも本ブログで記した「行ごとの編集状態」です。もともと想定していた範囲を超える仕様 … 続きを読む 行ごとの編集状態、その2
(2011/4/6追記。本件はMicrosoftから将来のリリースで修正するとの回答がありました)
(2011/8/27追記。最新版のVisual Studio 2010+最新の.NET Framework 4で試したところ、まだ修正されていないようです。)
本日、各言語での正規表現エンジンを使って「^」記号(文字列または行の先頭を示す、アンカーあるいはゼロ幅アサーション…と呼ぶらしい)に関する動作を調査しました。背景にあるのはAzukiが内蔵している正規表現検索で行頭マッチングが行われないというユーザ報告の不具合(に近いが対策できず黙認していた動作仕様)です。過去に検索機能を実装した際の調査結果では.NETの正規表現エンジンで「Multilineモード」を有効にしても各行の先頭でない位置でマッチする現象が起こり、使えないと判断しました。今回は、この問題を改めて少し掘り下げて調査した結果報告(?)となります。
調査結果のポイントです。
ポイント1および2です。Regex.Match( string, int )のオーバーロードを使ってマッチング開始点だけを指定した場合には、行頭でも文字列先頭でもない位置がマッチング範囲の開始点であっても「^」記号は該当位置にマッチしません。しかしRegex.Match( string, int, int )のオーバーロードを使うと、マッチします。したがってオーバーロード引数を追加するだけで動作仕様が変化してしまうため、不自然な印象を受けます。次に例を記します。
string text = "abc";
new Regex( "^[a-z]" ).Match( text, 1 ); // どこにもマッチしない
new Regex( "^[a-z]" ).Match( text, 1, text.Length ); // 1文字目のbでマッチする
ポイント3です。Javaの正規表現エンジンでは「Anchoring Bounds」という概念があり、「^」記号の扱いをカスタマイズできます。Anchoring Boundsを使うよう設定すると、「^」記号および「$」記号のマッチング時にマッチング範囲の前後が考慮されない — つまり問答無用でマッチング範囲の始点に「^」記号がマッチするようになります。そしてAnchoring Boundsを使わないよう設定すると、マッチング範囲の開始点が文字列先頭あるいは行頭でない限り、「^」記号はマッチング範囲の開始点にマッチしません。このように「^」記号のマッチング動作を明示的に指定できる機構があれば、それを使うことで問題回避できますが、残念ながら.NETにはありません。
ポイント4です。どうやら.NETの正規表現エンジンではJavaでいう「Anchoring Bounds」の扱いがRegex.Matchのオーバーロードごとに異なっており、Regex.Match(string,int)はAnchoring Boundsを使わず、Regex.Match(string,int,int)はAnchoring Boundsを使う動作となっています。ここで、もしAnchoring Boundsを「常に使いたい」場合は外部でマッチング対象の文字列をSubstringすることで代替できます。しかしAnchoring Boundsを「常に使いたくない」場合、Regexクラスの外部でこれを実現する方法は無いように思われます。
この仕様はAPIからもドキュメントの記述内容からも想定できるものでなく、また統一が取れていないという点も考えると、意図的な設計結果とは思えません。本件は、改めてMicrosoft社に報告と確認をしておこうと考えています。
以下、各言語・環境での検証コードおよび検証結果を記します。なお言うべきことはすでに記したので、細かい説明はしません。興味のある方や再現してみたい気分になった方へ向けた情報です。
Azukiでは行ごとに3種類の編集状態を定義し、管理しています。具体的には未編集、編集済み、保存済み(一度以上編集されたが最後に保存された状態から変化していない)の3状態です。Azukiで3状態を扱うようにした背景は安直 … 続きを読む 行ごとの編集状態
ソフトウェアは設計上の階層構造を持つことが多く、ほぼ間違いなく最上位をアプリ層(そのアプリ固有の処理)とした複数の階層を重ねた形になっています。ごく単純なアプリの場合は最上位のアプリ層のみが存在すると解釈すれば、やはり階層構造です。このとき、特に最初が単純な一階層のアプリだったものに機能を追加していく場合、ある程度の規模を越えると階層構造を組まないと管理不可能になっていきます。本日はこの階層構造と「丸投げ」について思うことを書きます。
続きを読む “丸投げ”
本日は駄投稿です 🙂 何となくAzukiのソースコードの「ステップ数」を計測してみようという気分になったので計測してみました。計測に使わせていただいたのはコロ助というフリーソフトです。また計測したソース一式は2011/0 … 続きを読む Azukiのステップ数を数えてみた
久しぶりのハッキングメモです。タイトル通りの内容で.NET FrameworkもといWindows.Formsフレームワークの仕様を掘り下げた記録です。
続きを読む “備忘録: マウスクリック関連イベントの流れ”
今からxenを使う人は少ないんじゃないかと思いつつ、仕事場でxenを設定していたときにつまづいたことを備忘録。 ホストOSはCentOS 5.3で、インストール時にオプションでxenを選択して構築したところ、ゲストOSは … 続きを読む xenメモ
本日、Azukiの最新版1.6.0を公開しました。1.5.0のリリースは2009/12/12だったので、なんとも奇遇なことに(ほぼ)ちょうど一年が経っていたことになります。 正直なところ、毎日肌で感じている「クラウド化」 … 続きを読む Azuki 1.6、公開。
本日、AiB Tools 3.1を公開しました。 ついに、本バージョンからニュー・ブレイル・システム株式会社のピンディスプレイ点字出力エンジン「ピンブレイル」を無償でインストーラに同梱できるようになりました。これで、イン … 続きを読む AiB Toolsの悲願が達成
7-Zipの自己解凍ファイルを簡易インストーラ化する方法についての備忘録です。 普通に.7zファイルを作成 7-ZipのウェブサイトからExtraパッケージをダウンロード Installerフォルダ内にあるreadme. … 続きを読む 7-Zipの自己解凍ファイルを簡易インストーラにする