VSのセットアッププロジェクトと.NET Frameworkのバージョン [プログラム]
VSのセットアッププロジェクト,最初のバージョン以外に対応させる場合は,マージモジュールを変更するほかに,起動条件でのバージョン変更も必要。
同僚がはまっていたのでメモ代わりに。
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: びっくりした事 [プログラム]
各種リダイレクトに関するブラウザの挙動の違い [その他]
サーバー側のリダイレクト要請には,302 Found,303 See Other,307 Temporary Redirectの3種があります。
302 Foundは元々302 Moved Temporaryで,メソッドを変えてはいけないはずだったのに,UAが守らないから303と307が出来たそうです (ref: [Studying HTTP] HTTP Status Code)。 というわけで,各種ブラウザで挙動を確認してみました。 ベースとなる環境は,Windows Vista 32bitになります。 また,名称はWindowsのタスクバーへの表示を使っています (Safari, Lynx除く)。
- Internet Explorer 8.0.6001.18813CO
- User-Agent
- Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)
- 結果
- 302 Found
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 303 See Other
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 307 Temporary Redirect
- GETに対してはGETで,POSTに対してはPOSTでリダイレクトした。その間,ユーザーへの問い合わせは存在しなかった。POSTの元のフォーム変数は保持された。
- Internet Explorer 8.0.6001.18813CO (互換モード)
- User-Agent
- Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)
- 結果
- 302 Found
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 303 See Other
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 307 Temporary Redirect
- GETに対してはGETで,POSTに対してはPOSTでリダイレクトした。その間,ユーザーへの問い合わせは存在しなかった。POSTの元のフォーム変数は保持された。
- Mozilla Firefox 3.5.3
- User-Agent
- Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)
- 結果
- 302 Found
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 303 See Other
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 307 Temporary Redirect
- GETに対してはGETで,POSTに対してはPOSTでリダイレクトした。POST時のフォーム変数を再送信するかどうか問い合わせがあった。
- Google Chrome 3.0.195.21
- User-Agent
- Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0
- 結果
- 302 Found
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 303 See Other
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 307 Temporary Redirect
- GETに対してはGETで,POSTに対してはPOSTでリダイレクトした。POST時のフォーム変数を再送信するかどうか問い合わせがあった。
- Opera Internet Browser 10.00 Build 1750
- User-Agent
- Opera/9.80 (Windows NT 6.0; U; ja) Presto/2.2.15 Version/10.00
- 結果
- 302 Found
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 303 See Other
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 307 Temporary Redirect
- GETに対してはGETで,POSTに対しては再送信するかの問い合わせがあり,再送信する場合はPOSTで,しない場合はGETでリダイレクトし,キャンセルした場合は元のページのままであった。
- Safari 4.0.3
- User-Agent
- Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9.1
- 結果
- 302 Found
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 303 See Other
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 307 Temporary Redirect
- GET/POSTに対して,どちらもGETでリダイレクトした。
- Lynx 2.8.6 日本語版
- User-Agent
- Lynx/2.8.6rel.4TH libwww-FM/2.14FM SSL-MM/1.4.1 GNUTLS/1.7.8
- 結果
- 302 Found
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 303 See Other
- GET/POSTに対して,どちらもGETでリダイレクトした。
- 307 Temporary Redirect
- GET/POSTに対して,どちらもGETでリダイレクトした。
IE8の307の挙動は,localhostでやっているからかもしれません。 それはともかく,Firefox, Chrome, Operaの307に対する挙動はよいでしょう。IEもPOSTで転送するのでまぁ許せます。 ただ,Safariはどうよ,と思いますが……。
επιστημηさんの「こんなのもあっていいかなーと」に触発されてみた [プログラム]
元記事:こんなのもあっていいかなーと
個人的には,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スレッドで実行する必要があります。