System.Net.HttpWebRequestでのPOST [プログラム]
はまったので記録として。
System.Net.HttpWebRequestを使ってPOSTしようとすると,417 Expectation Failed (Studying HTTP様)を返してきた。 Fiddlerで覗くと,確かに
Expect: 100-Continue
というフィールドがある。 自分では書いた覚えがないので,HttpWebRequestが自動で付けていると予想。 探してみると,HttpWebRequest and the Expect: 100-continue Header Problemという記事を発見。 これで解決できた。
var request = (HttpWebRequest)WebRequest.Create(uri); request.ServicePoint.Expect100Continue = false; request.Method = "POST";
Phil Haack氏とLance Olson氏に感謝。
re: びっくりした事 [プログラム]
επιστημηさんの「こんなのもあっていいかなーと」に触発されてみた [プログラム]
元記事:こんなのもあっていいかなーと
個人的には,initialに対しての拡張メソッドにしたいかな,というわけで作ってみました。
using System; using System.Collections.Generic; namespace Yuo.Extensions { public static class SystemExtensions { // 初項:initial 公差:stride の等差数列 public static IEnumerable<int> MySequence (this int initial, int stride) { for (; ; ) { yield return initial; initial += stride; } } // initialから1刻み public static IEnumerable<int> MySequence (this int initial) { return initial.MySequence(1); } } }
項数はTake 拡張メソッドに丸投げしたので,引数が減っています。 また0からcount - 1までは,Enumerable.Range メソッドでできるので作っていません。
比較用。
using System; using System.Collections.Generic; using System.Linq; using Wankuma.Extensions; using Yuo.Extensions; public class Program { public static void Main () { // 初項2, 公差3 で 5つ。 var seq = 5.Sequence(2, 3); var seq2 = 2.MySequence(3).Take(5); Console.WriteLine(seq.SequenceEqual(seq2)); // 比較 // 要素数10コ、ぜんぶ-1で埋める var array = new List(10.Sequence(-1, 0)); var array2 = new List ((-1).MySequence(0).Take(10)); Console.WriteLine(array.SequenceEqual(array2)); // 比較 } }
結果
True True
別ドメインでのコードの実行 [プログラム]
よく忘れるのでメモ。
新しいAppDomainでデリゲートを実行するには,DoCallbackメソッドを使う。引数無し,戻り値の型System.Void。
System.AddIn [プログラム]
System.AddInを使ったアドインに挑戦。 アドインおよび拡張機能に従って作ると,とりあえずのものは簡単にできる感じ。
問題はセットアップかなぁ。 実行時にPipelineSegments.storeとAddIns/AddIns.storeを作る関係で,ユーザーが書き込み権限をもっていないといけないのは,結構面倒かも。
ExcelのPrintOutメソッド [プログラム]
ExcelのWorksheetオブジェクトやWorkbookオブジェクトにあるPrintOutメソッドですが,Excel内部の印刷処理が終了するよりメソッドから戻るのが先のようです。 内部の印刷処理が終了するより前にClsoeメソッドなどを呼び出してWorkbookを閉じたりすると,印刷処理がキャンセルされるという……。
で,同期用のイベントとかメソッドとかプロパティとかは……ない……。BeforePrintイベントじゃなくてAfterPrintイベントがほしいんだけどなぁ……。
System.ComponentModel.INotifyPropertyChanged on XNA Framework [プログラム]
WPFのデータバインドとマルチスレッド [プログラム]
WPFのプロパティにバインドしているプロパティを,別スレッドから弄ってみた。PropertyChangedイベントは別スレッド側で実行。結果は,
- 通常のバインド:プロパティの取得は,UIスレッドで行われた
- ICommand.CanExecuteChanged:イベントの実行は,別スレッド側で行われるために例外発生
でした。 なので,CanExecuteChangedイベントの呼び出し時のみ,Dispatcher経由が必要なようです。 System.Windows.Application.Current.Dispatcuer経由,ということになりそうです。
ちなみに,Windows Formsでは別スレッド側でプロパティ取得が行われます。 よって,PropertyChangedイベントをUIスレッドで実行する必要があります。
テキストボックスとInt32型のバインディング [プログラム]
M-V-VM関係の話をよく聞くのでテスト。
TextBoxふたつはっつけて,ボタンを押すと割り算の結果をTextBlockに表示するだけの簡単なプログラム。
あれ?intを直接バインドすると,"a"とかの時に,確認するすべがない……というのは困るのでさがしていると,八巻さん@グレープシティのデブサミ資料を発見。 変換は,ViewModelでやるのか。なるほど。
やってると,Windows Formsアプリケーションとも共通化したくなりますが,ICommandインターフェースがWPFのものだし,いろいろ対応していないので断念。 ここらへんだけは,WinFormsでは手で書かないといけなさそうです。 でも,WinFormsでも,M-V-VMっぽいことはできそう。
C#とWordとPowerPointと [プログラム]
あいも変わらずC#でWordとPowerPointをいじくっています。
さて,要求事項にWord 2000-2007対応とかあって,その中の文字列引っ張ってくるだとか,該当する箇所の背景色かえるだとか,起動中はWord閉じるなとかの要求があるわけです。
まず,Word 2000と2002 (XP)以降で,Canvasの存在の有無という違いがあります。 また,Word 2002およびそれ以前とWord 2003および以降では,各種イベントのキャンセルがC#からできるかという違いもあります。
そこで採った方法が……ラッパライブラリ。当然,各バージョン用。バージョンによってget_ItemだったりItemだったりインデクサだったり……。 さらに,object以外に共通クラスが無いので,各バージョン用にファイルごとコピペ……。
まぁ,WordとPowerPointを弄っていると,双方の考え方の違いが分かってきます。
WordはMissing.Value,つまりはNothingを多用し,ref objectな引数たくさん。インデクサの実装とかでは結構面倒なことも多いです。 それに対して,PowerPointはrefを基本的に使いません。2値にはBooleanではなくMsoTriStateを使います。
このあたりの思想の違い,いまさら整合はとれないのでしょうが……。