プログラム

WPF

勉強がてらWPFアプリ作ってるのだけど、ほとんどの要素をXAMLではなくC#で書いているので、デザインとコードはまったく分離されて無い。

文字列の抽出

検索対象文字列の書式が決まっている場合は、正規表現を使うよりもIndexOfやSplitやSubstringを使った方が効率的か。

WPFでメモ帳を作る

デザインとコードを分離できるのはすばらしいが……。 WPFでメモ帳を再現しようと思ったがステータスバーの表示/非表示の切り替えで詰まった。Margin.Bottomをいじると高さが調節されるのではなく上方向に移動してしまうのはなぜ……。Gridとかの配置を工夫する…

自作数学ライブラリ

整数論をやるのに必要そうな関数を静的クラスにまとめてみた。 今のところ、 Mod(x, m) 符号が除数mと同じになるような剰余を返す GCD(x, y) 最大公約数を返す GCDEx(x, y) ax+by=GCD(x, y)となるような整数a, bを返す Inverse(x, m) mを法とする、正の整数x…

オブジェクトのハッシュコード

System.Collections.Hashtableは、キーとするオブジェクトのGetHashCode()の戻り値で一意性を保証しているとする。 GetHashCode()は32bit整数型を返すので、個以上のオブジェクトをHashtableに格納しようとすると必ず衝突が起きる? ということは、64bit整数…

負数の剰余

C言語やC#で負数の剰余を行うと余りが負の数になってしまう。調べてみると端数切り捨ての商を使うみたい。 static long Rem(long x, long y) { return x - y * (long) System.Math.Floor((double) x / y); } みたいな関数ぐらい用意してあっても良さそうなも…

ビットマップ

黒一色(データがすべて0x00)の超巨大なビットマップならば、圧縮すれば数KBに縮むのではないかと思い実験してみた。 12000x12000(24bit)で432MB程度のものを7zの最高圧縮で圧縮したら60KBくらいになった。ZIPだと元サイズの1000分の1程度にしかならない。数…

PHPで書いたはてな記法パーサを改造してみた(2)

PHPで書いたはてな記法パーサを改造してみたの続き。 クラス名やらメソッド名やらを変えてしまったがメソッド名から推測して欲しい。 シンタックスハイライト付きスーパーpre記法をスマートに実装させるのが難しい。 とりあえずHatenaPreクラスを流用するた…

PHPで書いたはてな記法パーサを改造してみた

自分のサイトで簡単な記法で書かれたテキストをパースしてHTMLを生成するようにしようと思い、すべての記法を正規表現でなんとかしようとしたら恐ろしく重くなったのでやめた。 そこで使い慣れたはてな記法のパーサがないか調べてみたところ、anatoo氏が作成…

SHA1ハッシュの計算

何でSHA1ハッシュを計算する方法が System.Security.Cryptography.SHA1Managed System.Security.Cryptography.SHA1CryptoServiceProvider System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "sha1") の3つもあるんだ。 1番…

Bitmap.LockBits メソッド

サンプルコードの通りにやってもエラーになるので半日くらい困っていたが、試しに開いていたいくつかの画像のフォーマットがたまたまFormat24bppRgbではなかっただけだった。 LockBitsメソッド使ってバイト列操作してもBitmap.GetPixel/SetPixelメソッドと3…

Microsoft Visual C++ 2008 Express Edition

やっぱりコマンドラインからコンパイラに適当なオプション与えてコンパイルするのと比べると最適化(?)の効きが違うな……。

GNU coreutils

マクロソフトとは関係ないが、なぜ関数じゃなくて関数形式のマクロで記述してるんだろう。

M_PI

gccでコンパイルできたものをVisualC++ 2008のC/C++コンパイラでコンパイルしようとしたら定義されていない識別子と言われてしまった。 どうやら標準化されていない定数であるため、最近のMicrosoftのライブラリではmath.hをincludeする前に #define _USE_MA…

計算精度

確率の総和が1.0を超えてしまうのを解決するのに半日かかった……。 積分計算のfor文まわすときの刻みを0.1から0.001くらいにしたら解決した。

マルチバイト文字の扱い

やはりブロック単位で処理するとマルチバイト文字の扱いで問題が生じる。こういうのはどうやって判定すればいいんだろう? オーバーヘッドがかなり大きいが、最初から読み直すのが確実かな……。ディスクから読み出すよりも配列をコピーしていく方が速いか。

テキストファイルから一部分を取り出すプログラム

文字エンコーディングと改行コードを適切に変換するようにし、さらになるべく省メモリか高速になる書き方をしたらかなり可読性の低いコードになった……。 具体的には下記のような処理をするようにした。 テキストファイルをバイナリとして開き、先頭1KBくらい…

文字エンコーディングまわりの不可解な仕様

System.IO.StreamReaderで文字エンコーディングを指定しなかった場合、C#既定のUTF-16LEだけではなくUTF-16BEやUTF-8もちゃんどデコードされているのはなぜ? 文字エンコーディングを判別するメソッドが公開されていないのはなぜ?

改行コード

とあるソフトのソースコードを読んでいたのだが、ひとつのテキスト形式ファイル中に含まれる改行コードが1種類であることを前提としてコーディングされていた。 意図的に弄らない限り普通は混在しないし重箱の隅をつつくみたいだからバグとして報告するほど…

ガベージコレクション

テキストファイルをバイナリとして開いてbyte配列に格納して操作したのち、stringで返すようなプログラムを組んでビルドした。 ところが40MBくらいのテキストファイルを2つ3つくらい開くと物理/仮想メモリの使用量が800MB/1300MBくらいになる。 あまり効果が…

StringとStringBuilder

文字列の操作を繰り返す場合、操作するたびにStringのインスタンスを生成と破棄を繰り返すためにパフォーマンスが悪いので、この場合はあらかじめ大きめにメモリを確保するStringBuilderを使うのが良いらしい。 前者は一番単純な方法で考えなしに用いられる…

Microsoft.Win32.RegistryKey.SetValue()とGetValue()

SetValueでbool値を保存するとレジストリには自動的に型変換されて文字列型で保存されるが、GetValueではbool値としては読み出せないのか……。

終了コード

エラー発生時に強制終了させたいときはApplication.Exit()じゃなくてEnvironment.Exit(int errCode)を使うのか……。

数値の丸め誤差

unsigned int型に可逆な変換をかけてdouble型にした後にそのまま逆変換した絶対値をunsigned int型に戻したときに誤差が発生して困っていたのだが、負の値の小数第1位の四捨五入の処理で0.5を引くんじゃなくて0.5を足したらうまくいった。 やっぱり何も考え…

GetCurrentImageでフレームをキャプチャする

「IBasicVideoを使って静止画を取得する」にしたがって動画から静止画を取得しようとしたのだが、出力されたビットマップの左下に10ピクセル(40バイト分)のゴミが入る。 バイナリエディタで先頭55バイト目から40バイト分削ってみると正常な表示になるので、B…

DirectShowによるビデオの再生

「ファイルの再生法」などを参考にC言語でビデオを再生するプログラムを書いてみた。 C言語ではC++のインターフェイスをそのまま使うことができないので、クラスに相当するポインタとメソッドの間にヘッダファイルで宣言されているメンバのポインタ(lpVtbl)…

C言語で128bit整数型を扱いたい

C言語で128bit整数型を扱いたいのだが、C言語で用意されている整数型は最大で64bitまでなので、それ以上の桁数を持つ数を計算することができない。 そこで多倍長整数演算アルゴリズムを用いなければならないらしいが、こいつは面倒くさそうだ……。

ListView項目の並べ替え

IComparerインターフェイスを実装したクラスを用いるということは分かっていたので、「ListViewの項目を並び替える: .NET Tips: C#, VB.NET, Visual Studio」を参考にさせていただいた。 ついでに通常のWindowsフォームのリストビューのようにソート方向を示…

コンストラクタコード

アプリケーションで使用する変数などを初期化するときはコンストラクタ内にコードを書くのが適切なのだろうけど、Windowsアプリケーションの場合はフォームが読み込まれるときのイベントから呼び出されるメソッドに初期化用のコードが書かれているソースコー…

.NETのコレクション

リストビューなどで選択されている項目のインデックスのコレクションを返すようなプロパティは、リストが未選択の場合には空のコレクションを返すようになっているけど、そのコレクションが空かどうか調べるにはそのコレクションのCountプロパティが0かどう…