読者です 読者をやめる 読者になる 読者になる

1 つのメソッドは 1 つのことに専念する

メソッドはできるだけ単純にしよう。読んで解読する人のことを考えよう。ここでは例として、指定の文字列中の指定の単語を "<B>" と "</B>" で囲んで強調表示に設定する場合を考える。この動作を分解すると、 指定の文字列から単語を抽出する。 抽出した単語が指定…

Emacsでさっきのコマンドをもう一度実行する

Emacsで、さっきミニバッファで入力したコマンドを、もう一回というときは、 C-x ESC ESC (repeat-complex-command) を入力する。そうすると、ミニバッファにさっきのコマンドが表示されるので、必要に応じて編集し、実行する。もう一回前、あるいは次のコマ…

Emacsであるものを使って楽に入力する

入力したいものはEmacsのどこかにある、、、というときは、 最初の何文字かを入力し、 M-/ (dabbrev-expand) してみましょう。そうするとEmacsは、 バッファから入力した文字で始まる語を探し、 入力に続く部分を追加してくれます。 思っていたものと違った…

Interpreterパターン

Interpreterパターンは、文法を解釈しその内容を実行するインタプリタの作成に使う。ここでは、以下の仕様の 1 桁の数字を計算するインタプリタを作ってみる。 使用できる演算子は '*' と '+'。 '*' は '+' より先に計算する。 '(' と ')' で囲んだ部分は先…

Stateパターン

Stateパターンは、オブジェクトの状態によって動作を変えるときに使う。例として文字列の引用符 (") の対応をチェックしてみる。ここで、オブジェクトの状態は、 引用符の外 引用符の中 の二つ。それぞれの状態での動作は、

Visitorパターン

デザインパターンの中のVisitorパターンは、 データ構造をたどって、その要素について処理をし、かつ、 その処理が複数ある。 という場合に使う。ここでは、データ構造として以下のようなComponentクラス, Compositeクラス, およびLeafクラスを使った木構造…

Linqで項目間に区切りを入れる

LinqでIEnumerableの各項目の間に区切りを入れるメソッドを C# で作ってみた。

Windowsでのバックアップ

Windowsでファイルをバックアップするには xcopy が便利。こんなバッチファイルを作成しておいて、実行すればよい。 set SOURCE=C:\Source set DESTINATION=D:\Backup REM /C: コピー時のエラーを無視する REM /D: コピー先に同名のファイルが存在する場合に…

Emacs で文字コードを調べる

ある文字が 'O' (アルファベットのオー) なのか '0' (数字のゼロ) なのかで悩んだら、 C-x = (what-cursor-position) してみましょう。カーソル位置の文字の文字コードなどが表示されます。)

参照型と値型のEquals

参照型と値型での Object.Equals メソッド の動作の違い。 参照型: 同一オブジェクトならば true 値型: 保持している値が同じならば true using System; namespace EqualForValueTypeAndReferenceType { class Program { static void Main(string[] args) { …

DataGridView の CheckBox に Text も表示する。

DataGridView ではチェックボックスだけが表示されテキストを表示できない。そこでチェックボックスに加えて、テキストも表示できるようにしてみた。DataGridViewCheckBoxCell クラスを継承し、テキストも表示できる CheckBoxAndTextCell クラスを作成する。…

Emacs で yank したものが違っていた

Emacs で C-y を押して kill した内容を yank したとき、 あれ、これと違う! ということがある。こんなときは、すぐに M-y (yank-pop) してみると、yank したいものに巡り合えるかもしれない。kill した内容は順に kill-ring に保存されており、 yank は最…

コントロールの背景を透過色にする

コントロールの背景を透過色にするには、 コントロールの BackColor プロパティに Color.Transparent を設定する。 using System; using System.Drawing; using System.Windows.Forms; namespace TransparentLabel { public partial class Form1 : Form { pu…

DataGridView の行や列に区切りを入れる

DataGridView の行や列に区切りを入れるときは、 DataGridViewColumn.DividerWidth DataGridViewRow.DividerHeight を設定する。 using System; using System.Windows.Forms; namespace DataGridViewDividerWidthSample { public partial class Form1 : Form…

DataGridView の描画が遅いときに気をつけること

DataGridView で、 AutoSizeColumnsMode AutoSizeRowsMode ColumnHeadersHeightSizeMode のプロパティが、自動に設定されているとき、 行や列の追加 セルに値を設定 すると、描画が遅くなる。以下の例では、50 x 50 で 9.2 秒かかった。 using System; using…

Visual Studio で長方形を選択

Visual Studio で長方形の範囲を選択するには、 Alt キー を押しながらドラッグする。

Emacs での長方形の範囲の取り扱い

Emacs では長方形の範囲を取り扱える。 たとえば以下のようなテキストで、左にある日付の部分を、右に移動したいとすると、 '1. C-@ や C-SPC (set-mark-command) で角にマークを付けて、 '2. 長方形の対角にカーソルを移動し、 '3. M-x copy-rectangle-to-r…

Emacs のキーボードマクロ

テキスト編集で同じ操作を繰り返すなら、Emacs の キーボードマクロ が便利。例えば、以下のような内容の各行をダブルクォートで囲むとすると、 C-x ( → キーボードマクロ定義開始。ステータス行に "Defining kbd macro..." と表示される。 繰り返す操作を入…

ドメイン駆動設計のユビキタス言語とモデル駆動設計

エリック・エヴァンスのドメイン駆動設計 の中心となる二つの概念のまとめ。 ユビキタス言語 プロジェクト関係者がモデルの記述に使用する共通言語。 この言語をコミュニケーションからコードまで利用する。 モデル駆動設計 解決する問題の理解とソフトウェ…

マウスやキーボードでの範囲選択

マウスやキーボードで範囲を選択する方法。 マウスでドラッグする。 のが普通だが、ボタンを押したままマウスを動かすのは大変なので、 シフトキーを押しながら、 範囲の終わりをマウスでクリック 矢印キー・Homeキー・Endキーで範囲を拡げる という方法もあ…

Enum ではなく Class を使う

Enum を使うと switch ... case ... することになる。たとえば、プログラム言語を Enum で定義して、その名前を表示する例。 using System; namespace UseClassInsteadOfEnum { public enum ProgrammingLanguageEnum { CSharp, Java, } public class ByEnum …

Visual Studio のスニペット

スニペットを使えば、決まった内容を簡単に入力できる。たとえば、C# のプロパティを作成する場合、"propfull" と入力し、TAB キーを押すと、こんなふうに展開してくれる。あとは、反転表示されている部分を編集する。 TAB キーで次の反転表示に移動 Enter …

プログラムをオブジェクト指向にするには

プログラムをオブジェクト指向にするには、 そのプログラムがなにをするか、に加えて、 それをどこにやらせるか、 が重要になる。気を付けるのは、他のクラスのプロパティを使って、いろいろ計算しているところ。次の例では、適用期間 (ApplicableTerm) クラ…

知識レベル-操作レベルを使うとき(1)

アナリシスパターンの知識レベル-操作レベルを使うときとして、 プログラムの再コンパイルなしで、 なにかの種類を増減したい。 場合がある。たとえば、測定の種類として身長や体重などがあるとする。これらがプログラムのコンパイル時点で決定できるならば…

Windbg で sosex を使ってマネージコードのソースレベルでブレークポイント設定

Windbg でマネージコードをデバッグするとき、sosex を使えば、ソースレベルでブレークポイントを設定できる。 '.load sosex.dll' で sosex をロード。 '!mbp ソースファイル名 行番号' でブレークポイント設定。 'g' で実行開始。 ブレークポイントにヒット…

あるアセンブリの実行に必要なアセンブリ

あるアセンブリの実行に必要なアセンブリは、そのアセンブリのマニフェストに書いてある。アセンブリのマニフェストは ildasm で表示できる。

Visual Studio のインクリメンタルサーチ

Visual Studio のインクリメンタルサーチを使えば、1文字打つごとにカーソルが移動し検索できる。 Ctrl + I でインクリメンタルサーチ開始。マウスカーソルが双眼鏡の形に変わる。 サーチする文字を入力すると、その文字へカーソルが移動する。下の例では 'c…

Native Exe ファイルの実行開始アドレス

Dumpbin コマンドで exe ファイルのヘッダ情報を表示すると、その中に開始アドレスが含まれている。ためしに windbg で、開始アドレスから逆アセンブルしてみる。64 ビットのアドレスは ***長い***。

Visual Studio の F8 で次の項目に移動できる。

Visual Studio の Error List Find Results Find Symbol Results で、 F8 を押すと、 これらのウインドウの選択項目が次へ移動し、 コードエディタでは対応する行にカーソルが移動 します。とっても便利!

DataGridView のあるセルの境界線スタイルを変更する

DataGridView のあるセルの境界線スタイルを変更するには、 CellPainting イベント で、 変更したいセルの AdvancedBorderStyle を設定する。 次のプログラムは、セル (1, 1) の境界線を DataGridViewAdvancedCellBorderStyle.InsetDouble に設定する。e.Adv…

UserControl のキャプション用ラベル

UserControl のキャプションとして使うラベル。 親コントロール内にフォーカスがあるかないかで、背景色を変える。 背景色は、グラデーションで表示する。 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms…

TextBox のサイズを内容に応じて設定する

TextBox のサイズを内容に応じて設定するには、TextRenderer クラスの MeasureText メソッドで表示サイズを計算し、その値を TextBox に設定する。TextBox のサイズは境界を含んでいる。そのため BorderStyle が None 以外の場合、計算したサイズをそのまま…

シリアライズ LOB パターン

データベースに関連が複雑なオブジェクトを保存するときに使用するパターン。参照: P of EAA: Serialized LOBたとえば、あるオブジェクトが個数が可変のオブジェクトを保持する場合、普通にデータベースのテーブルに保存しようとすると、 データベースに、そ…

Visual Studio の Document Outline ウインドウ

フォームをデザイナーで作成するとき、Document Outline ウインドウが便利。 フォーム内のコントロールの構造が表示される。 クリックするとそのコントロールがデザイナで選択される。 Document Outline ウインドウは、メニューの "View -> Other Windows ->…

ポップアップから続けてポップアップを表示する

ポップアップパネル - プログラマのメモ書きtt195361.hatenablog.comで表示したポップアップからさらにポップアップを表示すると、もともと表示していたポップアップが閉じてしまう。これを閉じないようにするには ToolStripDropDown.OwnerItem プロパティ …

DataGridView.AutoSizeColumnsMode を Fill にしたときの動作

DataGridView の AutoSizeColumnsMode プロパティ を DataGridViewAutoSizeColumnsMode.Fill に設定したときの動作について。 行の横幅は、ちょうど DataGridView の幅になる。 各カラムの幅は、DataGridViewColumn.FillWeight プロパティ で設定した割合に…

Padding と Margin の違い

System.Windows.Forms.Control の Padding プロパティと Margin プロパティの違いは、 Padding は Control の中に空けるスペース。 Margin は Control の外に空けるスペース。 以下は注意点。 Dock プロパティでドッキングしたコントロールの Margin は使わ…

ポップアップパネル

ポップアップパネルの作り方。ポップアップパネルは、 パネル外をクリックすると閉じる。 表示してもフォーカスは親フォームに残る。 というもの。手順は、 中身として表示するコントロールを含む ToolStripControlHost を作成し、 ToolStripDropDown を作成…

DataGridView での SetCurrentCellAddressCore 関数への再入呼び出しエラー

DataGridView クラス の CellEnter イベント で、選択されたセルを別のセルに変更するために、 private void dataGridView1_CellEnter(Object sender, DataGridViewCellEventArgs e) { dataGridView1[columnIndex, rowIndex].Selected = true; } を実行した…

DataGridView への行追加時の "セルテンプレートが指定されていません"

DataGridView クラス の Rows.Add メソッド で行を追加しようとしたら、 DataGridView コントロールの列のうち少なくとも 1 つにセルテンプレートが指定されていません。 というエラーが発生した。DataGridViewColumn.CellTemplate プロパティ の説明にある…