月別アーカイブ: 2012年12月

Backbone.js:別ファイル定義のViewではelの定義にjQueryオブジェクトを使ってはいけない

ちょっとはまったのでメモ。

こんな感じで別ファイル定義のViewの中で、elの定義に$(“#id”)なjQueryオブジェクトを使うと、うまく動きませんでした。

 

var MyView = Backbone.View.extend({
  el : $("#id"),
  ...
});

 

どうしてダメかは何となくはわかりますが、ちゃんと調べてないです。

 

回避策

  • jQueryオブジェクトではなく、セレクターを使う。
  • Viewをインスタンスを作成するときにjQueryオブジェクトを渡す。

 

サンプル

実行結果

サンプル実行結果

GistSharpExtension、CreateNewGist.exeを1.4.1.0にバージョンアップ

現在編集中のコードを簡単に新しいGistとして更改できるツールである、GistSharpExtensionCreateNewGist.exeを、それぞれ1.4.1.0にバージョンアップしました。

変更点は次の通り。

  • バグFIX:Ctrl+EnterでGist作成時、入力したdescription等の内容が反映されないケースがあったので修正した。

v.1.4のメイン機能にバグを仕込んでいたというわけです、すみませんすみませんm(_ _)m

 

そんなわけで、安心して使えるようになったGistSharpExtension並びにCreateNewGist.exe v1.4をよろしくお願いします。

Re: Gitのdiff・mergeをgitconfigだけでWinMergeにする

Gitのdiff・mergeをgitconfigだけでWinMergeにする – nrm://lab.kss.inc – Petittech

mergeはまだ試してないんだけど、インストーラが書いたやつだからたぶん動く

WinMerge 2.13で確認したところ、動きませんでした><

 

WinMergeのコマンドラインオプションを確認

WinMergeのコマンドラインオプションを、ヘルプで確認してみましょう。

WinMerge[U] [/r] [/e] [/f filter] [/x] [/xq] [/s] [/ul] [/ur] [/um] [/u] [/wl] [/wr] [/wm] [/minimize] [/maximize] [/dl leftdesc] [/dr rightdesc] leftpath [middlepath] rightpath [/o outputpath]

ごちゃごちゃして分かりにくいので、要所のみ抜き出すと次のようになります。

WinMerge[U] leftpath [middlepath] rightpath [/o outputpath]

*pathのそれぞれを次のようにすればよさそうです。

  • leftpath : $LOCAL(現在のブランチのファイル)
  • middlepath : $BASE(現在のブランチの一つ前のコミットファイル、HEAD^)
  • rightpath : $REMOTE(マージするブランチのファイル)
  • outputpath : $MERGED(マージ結果を保存するファイル)

 

WinMergeをgit mergetoolで使うgitconfig

上記を踏まえると、WinMergeをgit mergetoolで使うためのgitconfigは次のようになります。なお$LOCAL、$REMOTEのファイルは変更する必要はないので、読み取り専用にしています。

ポイントは次の通り。

  • Unicode版のWinMergeU.exeを使う。
  • git.mergetool.pathは不要。
  • コマンドラインオプションの”/”は2重にする。(msysGitの制限?)
    • /r : 再帰的にマージツールが動くらしいが未確認。フォルダーマージで必要なのかな?
    • /e : ESCキーでWinMergeが閉じるようにする。
    • /u : マージ用の一時ファイルがWinMergeの「最近使用したファイル」に追加されないようにします。
    • /wl : 左($LOCAL)側を読み取り専用にする。
    • /wr : 右($REMOTE)側を読み取り専用にする。

これで、git mergeやgit rebaseでconflict発生時に、git mergetool -yとするだけで、WinMergeがマージツールとして起動して、GUIによるマージ作業が行えるようになります。

 

[マージ前]

コマンドラインオプションで指定した通り、マージ先、一つ前のコミット、マージ元のファイルが3ペイン表示されます。

マージ前

 

[マージ後]

「左へコピー」などのGUI操作でマージして保存すると、$MERGEDに指定したファイル、つまりマージ対象ファイルとして保存されます。

マージ後

 

これで皆さんも快適なマージライフを!

 

って、既に「WindowsのGit(msysgit)環境で、秀丸エディタ、Winmergeを使う設定 – みちしるべ」でも動かないって言及されてますね・・・

TypeScriptでWSHを書いちゃおう #visualstudio – @masaru_b_cl

この記事はVisual Studio Advent Calendar 2012 : ATNDへの参加エントリーです。

昨日は@kazukさんの「Visual Studio 2012 でのパフォーマンスプロファイリング « kazuk は null に触れてしまった」でした。

 

TypeScriptいいですよね

今年10/1に突然Microsoftから発表されたTypeScriptですが、型安全でラムダ式も使えたりして、良いですよね。

TypeScriptは「コンパイルされてJavaScriptを吐き出す」ということで、WSH(Windows Script Host)のJScriptも書けるんじゃないの?というのがこのエントリーの趣旨です。

 

何はともあれインストール

TypeScriptを書くからにはVisual Studioがいいですよね。ということで、「TypeScript for Visual Studio 2012」をインストールしましょう。

可能ならPro以上のEditionにして「Web Essentials」もインストールするとなお良いですね。

 

プロジェクト作成

さて、無事TypeScriptのインストールが終わったところで、早速TypeScript用のプロジェクトを作成しましょう。「Visual C#」のテンプレートに「HTML Application with TypeScript」というテンプレートがありますので、選択してプロジェクトを作成します。今回は"WSHSample"という名前にしました。

え?Webアプリじゃないよって?気にせず行きましょう!w

image

 

余分なファイルの削除

プロジェクトが作成されると、既定で次の3つの項目が作成されています。が、WSHには不要なので、ソッコー削除します。

image

 

クラスファイルの作成

ではWSH用のクラスを定義するファイルを作成しましょう。

「新しい項目の追加」ダイアログを開き、これまた「Visual C#」の中にある「TypeScript File」テンプレートを選択し、"greeter"という名前で追加します。

 

image

 

「Web Essentials」を入れているとこんな感じでtsファイルと生成されたjsファイルが横に並んで表示されます。

image

とりあえず既定のコードは全部削除して、次のコードを入力して保存します。

またもやWeb Essentialsの力により、即座にコンパイルされてjsファイルが生成されます。

image

 

メイン処理スクリプト作成

TypeScriptで書いたクラスですから、TypeScriptでメイン処理も書いてしまった方が何かと楽です。

そんなわけで、greeter.tsと同じようにmain.tsを作成して、次のコードを入力して保存します。

 

 

もちろんmain.jsが作成されますが、main.tsとほとんど変わらないので省略。

ちなみにコード中の

 

/// <reference path="greeter.ts"/>

 

はgreeter.tsを参照するためのもので、これを入れるとコード補完が普通に利くようになります。

 

image

 

実行用wsfファイル作成

最後に、生成されたgreeter.js、main.jsを参照したwsfファイルを次のように作成して終了です。

 

 

execute.wsfをダブルクリックして実行すると、次のようにちゃんと実行されてWScript.Echoの結果が表示されます。

 

image

 

まとめ

  • TypeScriptでWSHはイケる。
    • TypeScript for Visual Studio 2012を入れる。
    • Web Essentialsも入れると何かと捗る。
    • Webプロジェクトだけどただのフォルダ、ファイルの組み合わせなので問題なし。
  • メインロジックもtsで書いて、実行はwsfで行う。
    • TypeScriptの恩恵をフルに受けることが可能。

 

最終日はアンカーの@tashinmuさんにバトンタッチです。

Visual Studio Adevent Calender 2012 – Visual Studio が対応するアプリケーション タイプ – Days with Microsoft Platform – Site Home – MSDN Blogs

「実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 最終回 2つのAJAX:「jQuery AJAX API」と「ASP.NET AJAX」」が公開されました

2つのAJAX:「jQuery AJAX API」と「ASP.NET AJAX」(1/3):CodeZine

ついに最終回です。

ASP.NET WebフォームアプリケーションにAJAXを導入する方法には大きく分けて2つの方法があります。一つがjQueryのAJAX APIなどJavaScriptを使い自前で行う方法、もう一つがASP.NET AJAXを利用する方法です。

というわけで、WebFormsで2種類のAJAXを扱う方法について紹介しています。

また、連載の最後ということで

ASP.NET Webフォームに限らず、フレームワークにはある一定の思想、原理が存在します。その思想、原理を理解すれば、「フレームワーク」がもともと持っている機能、アーキテクチャを最大限に生かすことができます。

というメッセージも添えさせていただきました。

 

最近はすっかりWebFormsの人気がありませんが、まだまだ使いどころがあるはずです。何らかの形で今回の連載がお役に立てれば幸いです。

IEnumerableの型を指定したforeach #adcjcs by @masaru_b_cl

この記事はC# Advent Calender 2012 : ATNDへの参加エントリーです。

昨日は@ishisakaさんの「C#でYAMLを使えるか試してみた | OPC Diary – No Code, No Life.」でした。

 

IEnumerable型

古き良きC# 1.0の時代より受け継がれる「Iteratorパターン」のためのインターフェースであるIEnumerable型。.NET 2.0からジェネリック版のIEnumerable<T>型が追加され、昨今では黒歴史扱いを受けたりしています。

しかし、いまだにIEnumberable型のみを実装した型も少なくありません。たとえばSystem.Windows.Forms.Control.ControlsプロパティのControlCollection型などがあります。

そのため、画面のコントロールをすべて舐めるような処理も、型のないIEnumerable型を使う必要があります。

 

foreachによる列挙

IEnumerabe型の列挙といえば、foreachです。for?なにそれ?

ただ、すでに述べたようにIEnumerable型の要素をただ列挙しても、Object型としてしか取得することができません。

// 型推論に任せる
foreach (var item in source)
{
  // itemはObject型になるので、型変換が必要
  var person = item as Person;
  Console.WriteLine("{0}, {1}, {2}", person.Id, person.Name, person.Age);
}

 

これを解決するために、LINQのCast<T>演算子を使うといった方法がありますが、余計な処理が一枚かんでいるという印象はぬぐえません。

// Cast<T>メソッドを通す
foreach (var person in source.Cast<Person>())
{
  Console.WriteLine("{0}, {1}, {2}", person.Id, person.Name, person.Age);
}

 

そこで、おすすめなのが、明示的に型を指定することです。こうすることで、自動的にキャストが行われるため、コードがすっきりします。

// 明示的に型を指定する
foreach (Person person in source)
{
  // personは自動的にPerson型にキャストされる
  Console.WriteLine("{0}, {1}, {2}", person.Id, person.Name, person.Age);
}

 

このことは、C#言語仕様(%ProgramFiles%\Microsoft Visual Studio 11.0\VC#\Specifications\1041\CSharp Language Specification.docx) p.279 「8.8.4 foreachステートメント」の次の内容に対応しています。

ステートメントは次の形式になります。

foreach (V v in x) embedded-statement

 

これは次のように展開されます。

{
  E e = ((C)(x)).GetEnumerator();
  try {
    while (e.MoveNext()) {
      V v = (V)(T)e.Current;
      embedded-statement
    }
  }
  finally {
    … // Dispose e
  }
}

 

サンプル

 

まとめ

C#にはこういった楽をするためのsyntax sugarがたくさんあります。たまに言語仕様をチェックしてみるのも楽しいのではないでしょうか。

次は@Marimoiroさんにバトンタッチです。

C#でゲームつくるです [C# Advent Calender 2012]C#を補助するいろんな脇役