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