2012年2月11日土曜日

CLRProfilerでエラーが発生してプロファイルできない問題への対応

CLRProfilerを使う際に以下のログがウィンドウにでたままプロファイルができない場合がある。

Waiting for application to start common language runtime

特権レベルでの実行

まず、原因の1つにアプリケーション実行ユーザーの権限が適切でないというケースが考えられる。

これを解消するには、プロファイルの対象の実行ファイル(.exe形式)を選択して、右クリックし メニューからプロパティを選択した上で、以下のチェックボックスにチェックをいれておけばよい。

互換性>特権レベル>管理者としてこのプログラムを実行する

対応しているCLRのバージョン

管理者として実行しても、プロファイルを開始できない場合は、CLRProfilerのターゲットバージョンが、 プロファイル対象のアプリケーションと合っていないことを疑ってみるとよい。

アプリケーション側のCLRのバージョンは、VisualStudioであれば、プロジェクトのプロパティから アプリケーション情報を開き、対象のフレームワークにより、.Net Frameworkの バージョンで確認できる。

一方、CLRProfiler側は、このツールを紹介している時期によって、ダウンロード先のリンクから取得できる CLRProfilerの対応しているバージョンがことなっている場合がある。

CLRのダウロード

とりあえず見つけ出したバージョンへのリンクを以下にメモしておく。

2012年2月4日土曜日

VisualStudio2010でファイル名で検索してファイルを開く方法

"ファイル内"ではなく、"ファイル名"でソリューション内を検索して、そのファイルを開きたいことがある。

MacのTextMateのCommand+Tや、Eclipseでいうところの Ctrl+Shift+Oのような機能を、VisualStudioで探していたみた。

VisualStudio2010の「移動」を使う

Ctrl+カンマで、移動ダイアログを開き、検索したい文字列を入力すると、 プロジェクトないの該当するファイル、関数、マクロを表示できる。

関数やマクロがヒットしてうれしい場合もあるが、ファイルだけをフィルタしてくれるシンプルなモードがあればもっと使いやすそう。
VisualStudio2010の標準機能というところはとてもよいので普通に使うならこれがよさそう。

Quick Open File for Visual Studio 2010

VisualStudioの機能拡張QuickOpenFileは、 ファイルを開くということに特化していることもあり使い勝手がよい。
使い心地はTextMateのCommand+Tに近くて気に入っている。

ただ、Ctrl+Kを押してからOを押すショートカットは変更できないようなので、その点だけが残念。

Productivity Power Tools の Quick Access

便利な機能拡張をセットにしたProductivity Power ToolsにQuick Accessという機能がある。

この機能はProductivity Power ToolsをインストールするとCtrl+3で呼び出せ、ファイル名を 入力すれば検索結果を表示、ファイルを開くことができる。またタスクの実行などもでき、使いこなせば便利かもしれない。

ただ、ファイル名の先頭から一致していないとヒットしない致命的な欠点がある。

2012年1月29日日曜日

NotePad++の便利なショートカット

忘れがちだけど、便利なショートカット。

Ctrl + Alt + I インクメンタルサーチ (逐次検索)
Ctrl + G 指定行移動
Ctrl + L 行削除
Ctrl + D 行複製
Ctrl + Q コメントアウト
Ctrl + Shift + ↑ カーソル行を上の行と入れ替え
Ctrl + Shift + ↓ カーソル行を↓の行と入れ替え
Ctrl + Shift + U UpCase (大文字に変換)
Ctrl + U UpCase (小文字に変換)
HOME 行頭へ移動
End 行末へ移動
Ctrl + Space 関数補完
Ctrl + Enter 単語補完

2011年12月17日土曜日

BubbleTranslateの代わりにブックマークレットを使う

chromeで便利に使っていたインライン翻訳エクステンションbubble translateが使えなくなった。
原因はよくわからないのだけど、Googleの翻訳APIが有料になったからかもしれない。

仕方ないので、とりあえずブックマークレットでもいいやと思い探してみたところ、Google謹製の翻訳ブラウザ ボタンというのを発見した。

このブックマークレットは、選択中の単語などをGoogle翻訳にリダイレクトしてくれるのだけど、読んでるページをlocation.hrefを書き換えてしまうのが残念だったので、window.openに書き換えて別タブで開くようにした。

できる人ならブックマークレットでも、インラインでポップアップ表示してくれるものをつくれそうだけど、そんな元気はないので当面これでがまんすることにしようと思う。

下のリンクをブックマークツールバーにドラッグして、翻訳したい単語を選択した状態で「日本語」ブックマークをクリックすれば、別タブで、選択した部分を翻訳した状態でGoogle翻訳ページを開いてくれる。

日本語

2011年9月11日日曜日

WPFよく使うコードのスニペット

MVVMを使う場合、何度も書いてる気がするコードをスニペットにしてまとめておくエントリー。
他に足すものがあれば随時追加する。

ViewModelBase

XAMLからバインドするビューモデルのベースクラスのスニペット。

 
public class ViewModelBase : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
 public event PropertyChangedEventHandler PropertyChanged;

 public void NotifyChanged( string propertyName )   
 {   
  if ( string.IsNullOrEmpty( propertyName ) )   
   throw new ArgumentNullException( "Unknown Property : " + propertyName );

  if ( PropertyChanged != null )   
    PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );   
 }
#endregion
}

ICommandに関するスニペット

ワーニングが不要な場合は以下のpragma文を用いて抑制する。

 
 public class MyCommand : ICommand
 {
#pragma warning disable 67
  public event EventHandler CanExecuteChanged;
#pragma warning restore 67
  
  public bool CanExecute( object parameter )
  {
   // throw new NotImplementedException();
   /* do something */
  }
  
  public void Execute( object parameter )
  {
   // throw new NotImplementedException();
   /* do something */
  }
 }

2011年8月10日水曜日

VisualStudio2010でリンクエラー(LNK2019)


VisualStudio2008では、プロジェクト依存関係として指定すると、スタティックライブラリ(.lib)がリンクされていたのが、VisualStudio2010ではLNK2019となってしまった。
どうやらVisualStudio2010ではスタティックライブラリを利用するプロジェクトからスタティックライブラリを出力するプロジェクトに参照を設定する必要があるらしい。



設定手順を以下にメモしておく。

  1. ソリューションエクスプローラからスタティックライブラリを利用するプロジェクトを右クリックして参照...をクリック
  2. 新しい参照の追加...をクリックして、依存先となるプロジェクトを選択
  3. 適宜ローカルのサテライトアセンブリをコピーまたはライブラリ依存関係の入力の使用をTrueにする

とりあえずこれでリンクでき簡単なサンプルが動作することは確認したが、細かく調べていないので問題があるかもしれない。



参考:
http://bbs.wankuma.com/index.cgi?mode=al2&namber=52741&KLOG=88

2011年5月29日日曜日

MacBookPro BootCamp Windows7 64bit Arduino USBドライバのインストール

MacBookPro BootCamp Windows7 64bitでArduinoを使いたいと思ったのですが、ニッチな環境っぽいので雑にメモしておきます。

1. ArduinoのIDEをダウンロード


以下よりArduinoのIDEをダウンロードする。
http://arduino.cc/en/Main/Software

場所はどこでもいいけど、自分は解凍した内容を
C:\Program Files\arduino-00xxにコピーした。
00xxはバージョン番号。

2. VirtualComPortドライバのダウンロード


Currently Supported VCP Drivers:のWindowsのx86 (32-bit)からダウンロード。
http://www.ftdichip.com/Drivers/VCP.htm

適当なフォルダに解凍する。

3. Arduinoを繋いでドライバインストール


ArduinoとMacBookProをUSBケーブルで繋ぐと、ブコッっと音がするので
コントロールパネルからデバイスマネージャを選択して、警告アイコンのついてる
FT232R USB UARTを探す。

右クリックからプロパティウィンドウを開き、ドライバの更新を押す。
検索先を2.で解凍したフォルダにする。うまくいくとデバイスマネージャで
FT232R USB UARTの警告アイコンはなくなり、新たにUSB Serial Portが
警告アイコン表示される。

4. USB Serial Portドライバのインストール


警告アイコンの表示されたUSB Serial Portを右クリックして、
1.で解凍したArduino-00xxフォルダ内のdirverを検索するようにしてインストール。

以上でドライバーのセットアップは終了。

2011年2月6日日曜日

C#でXmlシリアライズ/デシリアライズするヘルパー


C#でpublicなプロパティやフィールドをXMLにダンプするモジュールを作りまりた。
コードが横に長くてすみません。めんどくさいのでそのままにします。

 
public static class XmlSerializeHelper
{
private static readonly System.Text.Encoding _encoding = System.Text.Encoding.UTF8;

private static readonly XmlWriterSettings _xmlSettings = new XmlWriterSettings
{
Encoding = _encoding,
NewLineChars = Environment.NewLine,
NewLineHandling = NewLineHandling.None,
};

public static XmlWriterSettings XmlSetting
{
get { return _xmlSettings; }
}

public static void Save<T>( string path, T o )
{
using ( StreamWriter sw = new StreamWriter( path, false, _encoding ) )
{
Save<T>( sw, o );
}
}

public static void Save<T>( StreamWriter sw, T o )
{
using ( XmlWriter writer = XmlWriter.Create( sw, _xmlSettings ) )
{
XmlSerializer xmlSerializer = new XmlSerializer( typeof( T ) );
xmlSerializer.Serialize( writer, o );
}
}

public static T Load<T>( string path )
{
using ( StreamReader sr = new StreamReader( path, _encoding ) )
{
return Load<T>( sr );
}
}

public static T Load<T>( StreamReader sr )
{
using ( XmlReader reader = XmlReader.Create( sr ) )
{
XmlSerializer xmlSerializer = new XmlSerializer( typeof( T ) );
return ( T ) xmlSerializer.Deserialize( reader );
}
}

}


使い方はこんな具合。
 
class SampleData
{
public string Name { get; set; }
public int Value { get; set; }
}

class Program
{
static void Main( string[] args )
{
List<SampleData> samples = new List<SampleData>{
new SampleData
{
Name = "Test1",
Value = 255
},
new SampleData
{
Name = "Test2",
Value = 100
}
};

/// XMLファイルに書出し
XmlSerializeHelper.Save<List<SampleData>>( "test.xml", samples );

/// XMLファイルから読込み
List<SampleData> loadedSamples = XmlSerializeHelper.Load<List<SampleData>>( "test.xml" );

foreach ( SampleData data in loadedSamples )
{
Console.WriteLine( string.Format( "{0} {1}", data.Name, data.Value ) );
}

}
}

なおDictionaryをダンプするには、ISerializerインターフェイスを実装する独自クラスが必要。
こちらのサイトが参考になります。

C#用のスニペット


VisualStudio用のスニペットを作ってみた。
まず下記のXMLを適当なフォルダに適当なファイル名(拡張子は.snippet)で保存する。
次にツール(T)>コードスニペットマネージャ(T)...からフォルダを指定して追加。
あとは、下記の一覧のショートカット(アンダースコア含む)をエディタ上で入力して、Tabキーを押せば補完できる。

ショートカット説明
_propプロパティ自動生成
_fieldフィールド自動生成
_classクラス自動生成


以下、フィルに保存するXML。ちょっと読めば雰囲気でカスタマイズ可能な内容。

プロパティ自動生成(_prop)



<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>prop</Title>
<Shortcut>_prop</Shortcut>
<Description>プロパティ用のスニペット</Description>
<Author></Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>viewname</ID>
<ToolTip>日本語名</ToolTip>
<Default>名前</Default>
</Literal>
<Literal>
<ID>type</ID>
<ToolTip>型</ToolTip>
<Default>string</Default>
</Literal>
<Literal>
<ID>property</ID>
<ToolTip>プロパティ名</ToolTip>
<Default>MyProperty</Default>
</Literal>
<Literal>
<ID>field</ID>
<ToolTip>フィールド名</ToolTip>
<Default>_field</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
/// <summery>$viewname$を設定/取得します。</summery>
public $type$ $property$
{
get{ return this.$field$; }
set{ this.$field$ = value; }
}
$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>


フィールド自動生成(_field)



<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>field</Title>
<Shortcut>_field</Shortcut>
<Description>フィールド用のスニペット</Description>
<Author></Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>viewname</ID>
<ToolTip>日本語名</ToolTip>
<Default>名前</Default>
</Literal>
<Literal>
<ID>type</ID>
<ToolTip>型</ToolTip>
<Default>string</Default>
</Literal>
<Literal>
<ID>field</ID>
<ToolTip>フィールド名</ToolTip>
<Default>_field</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
/// <summery>$viewname$</summery>
private $type$ $field$;
$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>


クラス自動生成(_class)



<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>class</Title>
<Shortcut>_class</Shortcut>
<Description>クラス用のスニペット</Description>
<Author></Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>description</ID>
<ToolTip>クラスの説明</ToolTip>
<Default></Default>
</Literal>
<Literal>
<ID>name</ID>
<ToolTip>クラス名</ToolTip>
<Default>MyClass</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[

/// <summery>
/// $description$
/// </summery>
class $name$
{
#region フィールド

#endregion

#region 初期化
/// <summery>
/// コンストラクタです。
/// </summery>
public $name$()
{}
#endregion

#region プロパティ

#endregion

#region メソッド

#endregion

}
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>



もちろん標準のスニペットもあるが、細かいところが合わなかったりするので、結局は自分で作ったほうがしっくりくる。

C#の#regionのインデントを削除するマクロ


VisualStudioを使ってC#をコーディングしている際に、#regionを書くとコードのインデントと揃ってしまって不快なので、力技で置換するマクロを作ってみた。


Option Strict On
Option Explicit On

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module FindAndReplace
Sub RemoveeRegionIndent()
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Activate()
DTE.Find.Target = vsFindTarget.vsFindTargetCurrentProject
DTE.Find.FindWhat = "^.+{(\#region|\#endregion).*}$"
DTE.Find.ReplaceWith = "\1"
DTE.Find.MatchCase = False
DTE.Find.MatchWholeWord = False
DTE.Find.MatchInHiddenText = False
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
DTE.Find.KeepModifiedDocumentsOpen = False
DTE.Find.FilesOfType = ""
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
'Throw New System.Exception("vsFindResultNotFound")
End If
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Close()
End Sub
End Module

2009年11月12日木曜日

rubyによるincludeを用いたクラス拡張のイディオム

rubyでよく使うincludeを用いたクラス拡張のイディオムについてのメモというかサンプル。


サンプルはTextMateのbundleを参考にしました。



module IncExt
module ClassMethods
def foo
puts "foo"
end
end

module InstanceMethods
def bar
puts "bar"
end
end

def self.included(receiver)
receiver.extend ClassMethods
receiver.send :include, InstanceMethods
end
end

class Buz
include IncExt
end

Buz.foo # => "foo"
Buz.new.bar # => "bar"

2009年9月20日日曜日

NotePad++の設定

NotePad++を導入した際のメモ。

1.本体の入手


いずれかを入手する。
NotePad++UTF8版(本家)
NotePad++ UTF8+EUC-JP/ShiftJIS対応版
ダウンロードしたらインストーラを起動してインストールする。


2.Explorerプラグインのセットアップをダウンロード


ExplorerプラグインはNotePad++にエクスプローラ風のウィンドウを表示するためのプラグイン。
以下のURLからダウンロードできる。
http://sourceforge.net/projects/npp-plugins/files/Explorer/


3.Explorerプラグインのインストール


Explorer.dllをNotePad++フォルダ(デフォルトインストールの場合、C:\Program Files\Notepad++\plugins)内のpluginsフォルダに入れる。


4.プラグイン設定


メニュー>プラグイン>Explorer>Explorer...を選択してエクスプローラが起動

メニュー>プラグイン>NppExecの中から、Show Console DialogConsole Commands HistoryFollow $(CURRENT_DIRECTORY)を選択する

メニュー>プラグイン>NppExecExecute ...に良く使うコマンドを設定してSaveする。起動はF6で行う。


5.よく使うコマンドの登録(C++)


ちょとした確認のためのプログラムを書いてコンパイルして実行するバッチを登録しておく。cppを書き溜めるフォルダに以下の内容でbuild.batを作成すると便利。
call "%VS90COMNTOOLS%vsvars32"
cl.exe /EHsc "%1"
%2.exe


F6で開いたダイアログ下部のコンボボックスが<temporally script>の状態で
cd $(CURRENT_DIRECTORY)
build.bat $(FULL_CURRENT_PATH) $(NAME_PART)
をcommand(s)に入力する。
Save ...ボタンを押しC++ Build and Runと名前を付ける。

この状態でC++ファイルを開いてコマンドを実行するとコンパイルから実行まで行ってくれる。

追記


あくまでも簡易的にコンパイル実行するために利用するものなので、以下のように一行で書き下したほうが便利。フルパスを書かなければいけないがバッチファイル不要。
"C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat" && cl.exe /EHsc $(FULL_CURRENT_PATH) && $(NAME_PART).exe


Win7(64bit)で、VisualStudio2010の場合。
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat" && cd "$(CURRENT_DIRECTORY)" && cl.exe /EHsc "$(FULL_CURRENT_PATH)" && "$(NAME_PART).exe"




6.よく使うコマンドの登録(Ruby)


先ほどと同じようにF6でダイアログを開きcommand(s)に
cd $(CURRENT_DIRECTORY)
ruby.exe $(FULL_CURRENT_PATH)
を入力する。
次にSave ...ボタンを押しRun as Rubyと入力しておく。

実行したRubyスクリプトを開いている状態で実行すればRubyスクリプトが起動する。


7.その他の設定


メニュー>表示>右端で折り返すをしておくと便利。

Rubyの補完候補はデフォルトでは用意されていない。以下のURLから入手。
http://pastebin.com/f4fedbb27
ダウンロードしたらruby.xmlにリネームしてNotePad++フォルダのplugins\APIsに入れる。

2009年7月26日日曜日

rubyのCOM(win32ole)を使うためのTIPS

rubyからCOMを使えるようになると便利。
使う場合に役に立ちそうなTIPSをまとめる。



どんなCOMが使えるのか調べる




require "win32ole"
WIN32OLE_TYPE.progids.each do |id|
puts id
end

これでCOMのprogidがリストアップされる。



使いたいCOMのメソッドとヘルプの表示


各COMのメソッドからヘルプ情報を取得できる(場合がある)
たとえば、IEを使うための簡単なヘルプを表示するには以下のコードを実行すればよい。



require "win32ole"
ole_name = 'InternetExplorer.Application'
obj = WIN32OLE.new(ole_name)

list = []
obj.ole_methods.each do |m|
list << [m.to_s, obj.ole_method(m.to_s).helpstring]
end

list.uniq.each do |item|
puts "== obj.#{item[0]}"
puts "#{item[1]}\n\n"
end

2009年6月27日土曜日

rdocでriを後から生成するための3ステップ

Windows版のrubyをソースからコンパイルして利用することにしたのですが、riドキュメントを生成し忘れてしまいました。

ri用のドキュメント生成を忘れたまま放置するのは非常にもったいない。簡単に生成できるのでメモを残します。



前提

  • rubyのソースコードがあること

  • rubyのインストールが終了していること

  • ruby\binにパスが通っていること(ここではC:\ruby\binとします)

ステップ1:riドキュメントの出力先を知る

まずriドキュメントを、どこに出力すればよいか知る必要あります。
コマンドラインコンソールから次のコマンドを実行してください。
ri -h

僕の環境では、次のような出力となりました。
--system Include documentation from Ruby's standard library:
C:/ruby/share/ri/1.8/system

--site Include documentation from libraries installed in site_lib:
C:/ruby/share/ri/1.8/site

--home Include documentation stored in ~/.rdoc:
C:/Documents and Settings/USERNAME/.rdoc

--gems Include documentation from RubyGems:
C:/Documents and Settings/USERNAME/.gem/ruby/1.8/doc/*/ri

C:/ruby/lib/ruby/gems/1.8/doc/*/ri

とりあえず欲しいのはsystemのドキュメントなので、以下のパスが出力先です。
C:/ruby/share/ri/1.8/system


ステップ2:rdocでriドキュメントを出力する

ri用のドキュメントは、以下のようにソースコードの位置へ移動してからrdocコマンドを使って生成します。

ここでいうソースコードとは、rubyのコアの.cファイル(string.cとかarray.cとか)を含むruby自身のソースコードを指します。

ここの例ではC:\src\ruby-1.8.7-p174にソースコードが置いていある想定です。
ポイントはステップ1で調べた出力先を--opオプションで指定している部分になります。

cd C:\src\ruby-1.8.7-p174
rdoc --ri -op C:/ruby/share/ri/1.8/system

ここまでの作業で、rubyのソースコード(.cおよび.rbファイル)からriドキュメントが生成されます。


ステップ3:riでマニュアルを読む

あとは、riの使い方です。最初は、ここで説明している基礎的なコマンドだけで十分だと思います。

書式説明
ri クラス名ri Arrayクラスのドキュメントを参照する
ri クラス名.メソッド名ri File.basenameクラスメソッドのドキュメントを参照
ri クラス名#メソッド名ri Hash#rehashインスタンスメソッドのドキュメントを参照
ri searchキーワードri searchto_yamlキーワードで検索
ri -l参照可能な項目をリスト表示

ほかにも便利な使い方がありますが、最低これだけ知っていれば困らないかと。