tag:blogger.com,1999:blog-9385496204961345422024-03-14T01:54:57.475+09:00C#.NET vs VB.NET主に C#.NET と VB.NET の違いについて、メモを残していきます。<br>
誤り等があれば、コメントから知らせていただけるとありがたいです。<br>
※載せているソースについて検証はしていますが、無保証です。implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.comBlogger79125tag:blogger.com,1999:blog-938549620496134542.post-10167471573263100342016-05-31T00:00:00.000+09:002016-06-16T09:59:19.093+09:00C# 文字列リテラル(補間文字列・逐語的文字列)まとめ
C# 6.0 から補間文字列が追加されて、文字列リテラルの種類が 4 つに増えている。
MSDN にまとめた記事が無いので(たぶん)、自分用まとめ
書式
バックスラッシュエスケープ
改行
補間式
その他のエスケープ
標準
"regular"
逐語的
@"verbatimstring"
"" → "
補間
$"1+1={1+1}"
{{ → {
}} → }
補間逐語的
$@"interpolated
{"and"}
verbatim"
"" → "
{{ → {
}} → }
また、補間文字列の補間式の中に各種文字列リテラルを書くことが可能。implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-42243397857061427742016-05-25T00:00:00.000+09:002016-06-16T09:59:30.116+09:00Kotlin から見た Java の getter / setter (getXXX / isXXX / setXXX)
Calling Java code from Kotlin - Getters and Setters の補足みたいな話。
Kotlin 1.0.2
Kotlin から Java のコードを呼ぶ際、getter / setter (getXXX / isXXX / setXXX メソッド) はプロパティとして扱える。
詳細なルールとしては、
getter
get{X} または is{X} で始まる引数無し・戻り値ありのインスタンスメソッド
{X} は小文字と解釈されない文字、日本語でもOK
getXXX / isXXX でプロパティ名の規則が異なる
getHoge メソッド → hoge プロパティ
isHoge メソッド → isHoge プロパティ
isXXX の戻り値の型implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-79633854450385882502016-03-23T00:00:00.000+09:002016-06-16T10:00:02.255+09:00Kotlin null 許容型 (nullable) の外し方(スマートキャスト)
Kotlin の null 許容型 (nullable type) の変数は、if 等の制御文を挟むことで、null 非許容型 (non-null type) に自動でキャストされる。
null 許容型はコンパイル時にしか存在しないので、バイトコードにキャスト処理が入るわけではない。
IntelliJ IDEA だと、自動キャストされた変数はハイライトされて、マウスオーバーすると「Smart cast to 型名」がポップアップされるので分り易い。
ここでは、どんな制御文で null 許容型からのスマートキャストが可能か(コンパイラがどこまでやれるのか)、色々試してみる。
Kotlin 1.0.1 なので、バージョンが上がると挙動が変わるかも。
1 変数の場合
if で null 除外
fun ifNotNull(x: Any?) {
if( x != null ) implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-86478136177515019722016-03-10T00:00:00.000+09:002016-03-10T00:00:00.786+09:00Kotlin null 許容型 (nullable) はコンパイル時だけの存在
Kotlin の目玉機能の 1 つ「null 安全」のために null 許容型 (nullable type) が存在するが、これはコンパイル時だけの存在で、実体クラスが定義されているわけではない。
C# / VB.NET 経験者なら Nullable<T> 相当のクラスがあるのか?と思うかもしれないが、そんなものは無い。
たぶん、Java コードとの共存 + 実行時のパフォーマンスが考慮された仕様になっている。
一応、下記で検証可能。
fun main(args: Array<String>) {
printType<Int>()
printType<Int?>()
// Int?::class だとコンパイルエラー (直接 println できない)
}
inline fun <reified Timplhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-86010486029967865822016-02-12T00:00:00.000+09:002016-03-08T14:20:27.061+09:00Kotlin 遅延評価型と先行評価型のコレクション操作関数
"ことりん" の名前が気に入ったので色々調査中・・・
(・8・) × >ω</
Kotlin のコレクション操作関数(C# の LINQ to Object、Java の Stream API 相当)は、1.0.0-rc-1036 時点で stdlib に 2 種類用意されている。
Sequence インターフェース の拡張関数(遅延評価型)と、Iterable インターフェース の拡張関数(先行評価型)である。
※ スカラ値を返す関数(any, count, max 等)は両方とも先行評価型
よって、正確には、LINQ to Object や Stream API 相当になるのは、Sequence 拡張関数の方になる。
[Sequence と Iterable 拡張関数の比較]
fun main(args: Array<String>) {
val implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-65617505227686215822016-02-10T00:00:00.000+09:002016-02-12T21:11:36.256+09:00Kotlin ジェネリクス 型引数の情報を実行時に取得
Kotlin 正式版がそろそろリリースされそうなので・・・
(GitHub - temp-impl/spring-mvc-singleton-vs-prototype_kotlin を作った時の調査メモ。)
Kotlin も JVM 言語なので、コンパイル時型消去の呪いからは逃れられない。
が、inline と reified を使うことで、関数・メソッドなら型引数の情報を実行時に使用可能になる。
[型引数使用サンプル]
fun main(args: Array<String>) {
printType<String>()
}
inline fun <reified T> printType() {
println(T::class)
}
//[結果]
// class kotlin.String
//[補足]
// 上記implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-35936093156908122362016-01-30T00:00:00.000+09:002016-01-30T14:04:56.857+09:00Spring @Autowired フィールドを持つクラスを手動で生成
初めて Spring を触って、@Autowired の便利さに感動したので・・・
前置き
@Autowired について簡単に説明すると、自動で初期化されるフィールドの目印。
(フィールドだけでなくセッターメソッドに対しても使用可能)
つまり、コンストラクタやフィールドの右辺に、フィールドの初期化処理を書かなくてよくなる。
古い Spring では初期化設定を xml に書く必要があったが、今はアノテーション(C# での カスタム属性)のみで完結できるようになっている。
[@Autowired サンプル]
@Controller
public class HogeController {
@Autowired
private HogeService service;
// 以降、URL 割り当てメソッド
}
@Service
public implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-39378114019969605552016-01-13T00:00:00.000+09:002016-01-20T13:47:16.607+09:00Java Stream API とチェック例外(検査例外)の相性が悪い件
久々に Java を触ることがあって、Java 8 だったので Stream API を使ってみたところ・・・
色々言いたいことはあるけど、一番の問題はチェック例外(検査例外)だと感じた。
チェック例外とは、簡単に言うと catch または throws してないとコンパイラに怒られる例外のこと。
Java 以外の言語ではほとんど採用されてないレア機能。
で、何が問題かというと、下記のようなケースでコンパイルできない。
/**
* source にある valueType 型を返すメソッドを実行して、結果をリストで返す。
*/
@SuppressWarnings("unchecked")
public static <T> List<T> getValues(Object source, final Class<T> valueType){
implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-20190375901654056712015-12-05T00:00:00.000+09:002016-10-22T22:16:26.319+09:00Firefox のボタン(<button>, <input type=button>)の大きさ(幅・高さ)が違う場合の対処法
width や height を指定せず、padding や内部の文字列で大きさを確保するボタン(<button> や <input type="button">)では、IE/Chrome と比べて Firefox のボタンサイズが大きくなる。
文字の幅は、同じフォントを指定してもブラウザによって異なるのが普通だが(レンダリングエンジンが異なるため)、Firefox のみ明らかに大きくなる。
[問題になる CSS の例]
button {
padding: 5px;
border: 1px solid lime;
letter-spacing: 0px;
/* ブラウザ間の差が少ないメイリオを使用 */
font: 15px/22px Meiryo;
cursor: pointer;
}
[プレビュー]
implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-17596235651907878762015-11-19T00:00:00.000+09:002015-11-26T17:37:04.833+09:00<iframe> を動的生成する際の注意点
javascript で src 無しの <iframe> とその中身を構築した際、はまったことがあったのでメモ。
動的に追加した <iframe> の中身をいじる際は、
iframe.contentWindow.document の document.write() を使う
または
<iframe> のロード完了を待つ。(<iframe> 自身に onload イベントがある)
<iframe> に onload イベントを設置する際は、DOM への追加前に行う。
DOM に <iframe> を追加した瞬間、onload イベントが処理されるブラウザがあるため (Chrome)
[サンプルコード]
// 単純化のため、jquery 使用
// 良い例
// IE:OK / Firefox:OK / implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-25555389772065680322015-10-31T00:00:00.000+09:002015-11-13T14:52:49.892+09:00highlight.js で行番号を表示
ブログ内の SyntaxHighlighter → highlight.js 移行作業がようやく終わったので投稿。
highlight.js には行番号を表示する機能が付いてない。
とりあえず検索してみたところ、ちょうどいいプラグインがあったのでそれの紹介。(当ブログでも使用中)
wcoder/highlightjs-line-numbers.js
使用方法は、highlight.js を適用した要素(普通は <code>)に対して hljs.lineNumbersBlock(要素) を実行。
もしくは、hljs.initLineNumbersOnLoad() を仕掛けておく。
[使用例]
[].forEach.call(document.querySelectorAll('pre > code'), function(elem){
// implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-83765613838357996502015-09-25T00:00:00.000+09:002015-09-25T14:51:31.273+09:00python の加算代入演算子(+=)(プラスイコール)の注意点
python の一部のオブジェクト(list 等)では、「a = a + b」と「a += b」が同一視できない。
他言語経験者が思わぬバグを埋め込んでしまいそうな罠仕様・・・
>>> A = a = [1]
>>> a = a + [2]
>>> a, A, a is A
([1, 2], [1], False)
>>> # list の加算(+)は、元の a を変更しない
... # 加算の結果(新しい領域)を a に代入しているので、a と A は別オブジェクト
...
>>> B = b = [1]
>>> b += [2]
>>> b, B, b is B
([1, 2], [1, 2], True)
>>> # list のimplhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-52749670448915547272015-09-24T00:00:00.000+09:002015-09-25T14:36:26.864+09:00python の代入は値を返さないけど多重代入は可能
python の代入は値を返さないので、下記のような書き方はエラーになる。
>>> # ファイルから少しずつ読み込んで処理
...
>>> f = open('hoge.txt', 'rb')
>>> while chunk = f.read(4096):
File "", line 1
while chunk = f.read(4096):
^
SyntaxError: invalid syntax
だけど、多重代入 (マルチターゲット代入 / chained assignment) はできる。
>>> a = b = 'test'
>>> a, b
('test', 'test')
何となく納得いかない感があるけど、多重代入だけは特別implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-83888257522479301542015-09-07T00:00:00.000+09:002015-09-25T01:36:43.331+09:00python の等価演算子(==)と bool / 数値型
python の == 演算子は割と厳密で、公式ドキュメントにもあるとおり、数値型を除いて異なる型同士は等価にはならない。
javascript みたいに 1 == "1" が成立したりしない。
そのためか、python には === 演算子がない。
ただし、注意する点が 1 つあって、bool 型が int 型のサブクラスで、「True = 1」「False = 0」であること。
つまり、bool 型も数値型に含まれることになる。
そのため、下記のような結果になる。
>>> isinstance(False, int)
True
>>> isinstance(True, int)
True
>>> False == 0
True
>>> True == 1 == float(1) == complex(1)
implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-52882486982530421472015-08-22T00:00:00.000+09:002015-09-07T18:06:41.597+09:00document.querySelector で先頭が数字の ID を指定する方法
document.querySelector や document.querySelectorAll で、数字から始まる ID をそのまま指定するとエラーになる。
※ document.getElementById はエラーにならず取得できる。
※ DOM じゃないけど、jquery セレクタもエラーにならず取得可能。
console.log(document.querySelector('#20150821abc'));
// Error: An invalid or illegal string was specified
console.log(document.getElementById('20150821abc'));
// <div id="20150821abc">
// 上記の div 要素は、このページ内に含まれているので、firebug・implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-24941222880259510552015-07-03T00:00:00.000+09:002015-09-07T18:17:37.162+09:00非同期 ASP.NET MVC と HttpContext.Current
非同期な ASP.NET MVC で HttpContext.Current を使うのはやめた方がいい、という話。
[非同期メソッドのサンプル]
public class MyController : Controller
{
// RouteConfig で URL が割り当てられた非同期メソッド
public async Task<ActionResult> Test()
{
// (A)
await Task.Run(() => {
// (B)
});
// (C)
return View();
}
}
上記で HttpContext.Current が使用できるのは (A) (B) (C) のどこか?
と疑問になったimplhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-76315732086032474612015-06-30T00:00:00.000+09:002015-09-07T18:21:38.254+09:00XmlSerializer と CDATA セクション
XmlSerializer で CDATA セクションを扱うのが面倒だったので、自分なりのまとめ。(ぐぐれば引っかかる内容。)
System.Xml.Serialization 名前空間には、なぜか CDATA セクションのためのカスタム属性が用意されてない・・・
CDATA セクションのみを含む要素
[XML]
<root>
<text><![CDATA[<b>cdata</b>]]></text>
</root>
[対応クラス]
[XmlRoot("root")]
public class CDataXml1
{
[XmlElement("text")]
public XmlCDataSection Text { get; set; }
}
implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-80507392928783424282015-06-20T00:00:00.000+09:002015-09-08T18:22:44.431+09:00クラスと構造体のインターフェースメソッド呼び出し
IComparer<T> や IEqualityComparer<T> などのインターフェースを実装する際、クラスと構造体のどちらがいいのか迷ったことがあったので、インターフェースにキャストしたクラス・構造体からの、メソッド呼び出し速度を測定してみた。
[測定コード]
static class MeasureMethodCall
{
static void Main(string[] args)
{
var size = 10000000;
var cmpc = new ComparerClass(); // クラスベース
var cmps = new ComparerStruct(); // 構造体ベース
for( var i=0; i<11; i++ ){
implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-7283393657420953252015-06-05T00:00:00.000+09:002015-09-08T18:24:43.992+09:00LINQ OrderByDescending != OrderBy + Reverse
LINQ でシーケンスを降順にソートする場合、素直に OrderByDescending を使う方法と、OrderBy と Reverse を組み合わせる方法がある。
(降順ソート用 IComparer<T> を使う方法もあるが、OrderByDescending と同じなので割愛)
この 2 つの方法は、異なる結果になることがある。
理由は、OrderByDescending と OrderBy が両方とも 安定ソートであるため。
「降順の安定ソートってどっち?」と混乱するかもしれないが、OrderByDescending の実装は MSDN の記載通り同じキーを持つ要素の順序は保持される。
OrderBy も同様なので、同じキーを持つ要素については、OrderByDescending と OrderBy は同じ順序になってしまう。
つまり、両者は正反対の順序にならimplhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-40101066224861283102015-05-23T00:00:00.000+09:002015-09-08T18:26:22.923+09:00ASP.NET 出力レスポンスをキャプチャする方法
ブラウザに出力される HTML や API の出力などのレスポンスを、サーバー側で取得したい場合がたまにある。
ASP.NET (not MVC) でこれを行う方法はいくつかある。
Response.Filter を使う方法
Response.Filter にフィルタクラス (Stream 継承) を設定すると、レスポンスを出力前に加工することができる。
加工目的でなくても、Stream.Write に出力内容が入ってくるので、その内容を MemoryStream 等に入れればレスポンスをキャプチャできる。
[キャプチャ用フィルタクラス実装例]
public class CaptureStream : Stream
{
public CaptureStream(Stream targetStream)
{
_targetStream = implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-45453461951738621322015-05-16T00:00:00.000+09:002015-09-15T18:01:20.415+09:00Assert.AreEqual に NaN が入るとテストが成功するバグ (VS2010~2012)
Visual Studio 2010 (たぶん 2012 も) の MSTest の delta を指定する Assert.AreEqual には下記のようなバグがある。
// delta を指定する場合
Assert.AreEqual(1.0, double.NaN, 1.0); // 成功
// delta を指定しない場合
Assert.AreEqual(1.0, double.NaN); // 失敗
// 失敗するのが正しい動作なので、delta を指定する方はバグっている
バグの原因はソースを見れば明らかで、NaN を考慮していないため。
[Assert.AreEqual のソース (ILSpy)]
public static void AreEqual(double expected, double actual, double delta, string implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-30920848489440260672015-05-10T00:00:00.000+09:002015-09-15T18:02:21.759+09:00GAC 内のアセンブリ検索方法
.NET Framework アプリケーションの実行時、参照されている署名付きアセンブリ (DLL) は、まずグローバル アセンブリ キャッシュ (GAC) から検索される。
GAC 内に見つからなかった場合、アプリケーションフォルダや設定ファイルで指定した場所が検索される。
ランタイムがアセンブリを検索する方法
で、GAC 内のアセンブリ検索方法は、少し複雑である。
GAC の実フォルダ(アセンブリの配置場所)は、アセンブリの CLR バージョンによって 2 個所に分かれている。
※ 2015/05/01 現在
①
CLR 1.0 ~ 2.0(.NET 3.5 以前)
%windir%\assembly
②
CLR 4(.NET 4.0 以降)
%windir%\Microsoft.NET\assembly
アセンブリ検索方法も、実行implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-90289163125714258512015-04-14T00:00:00.000+09:002015-09-15T18:04:56.923+09:00Entity Framework でアトミックインクリメント & 一括更新
Entity Framework (EF) 標準の更新処理では、アトミックインクリメント(デクリメントも)や一括更新(BULK UPDATE/DELETE)ができない。
一括処理については、条件に当てはまるものを select 後に update ないし delete は可能だが、件数が多い場合はかなり効率の悪い処理になる。(select → update/delete × 件数)
そこだけ文字列 SQL 使えば解決・・・なんだけど、せっかく EF 使ってるので文字列 SQL は避けたい、という人は多いと思う。
そういう要望に応えるライブラリがいくつかある。(非 MS 製)
loresoft/EntityFramework.Extended · GitHub
MikaelEliasson/EntityFramework.Utilities · GitHub
ZZZ Projectsimplhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-71197413328657453692015-04-04T00:00:00.000+09:002015-09-15T18:08:53.484+09:00Entity Framework のパフォーマンス #2 更新処理
Entity Framework (EF) の更新処理 (insert, update, delete) は、AutoDetectChangesEnabled に false を設定するだけでパフォーマンスを向上できることがある。
[AutoDetectChangesEnabled 設定方法]
using( var context = new SampleEntities() ){
context.Configuration.AutoDetectChangesEnabled = false;
// 更新処理
}
パフォーマンスが向上するケース
[環境]
Windows 7 64bit
Visual Studio 2010 SP1
.NET 4.5.2 (TargetFramework は 4.0)
Entity Framework 5.0 + implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0tag:blogger.com,1999:blog-938549620496134542.post-35897029339466520032015-04-03T00:00:00.000+09:002015-09-15T18:10:00.899+09:00Entity Framework のパフォーマンス #1 LINQ to Entities クエリ
Entity Framework (EF) の LINQ to Entities クエリの 1 回目(コールドクエリ)は、かなり遅い。
1 回目なので DB アクセスも当然遅いのだが、それだけでなく、プログラム側でコストの高い初期化処理を行っているため、遅くなっている。
どんな処理を行っているかは下記参照。
Performance Considerations for Entity Framework 4, 5, and 6
Entity Framework 5 のパフォーマンスに関する考慮事項 (日本語記事はちょっと古い)
パフォーマンス
いくつかの簡単な LINQ to Entities クエリの SQL 構築時間と実行時間を測定してみる。
[環境]
Windows 7 64bit
Visual Studio 2010 SP1
.NET 4.5.2 (implhttp://www.blogger.com/profile/14791034233828360426noreply@blogger.com0