2010年5月25日火曜日

Desktopをお洒落に管理 Fences

Fencesのフリー版をインストールしたという記事があったので、なんぞ?と思いつつリンク先のビデオを見たら、予想以上に使い勝手がよさげなのでインストールしてみた。


おぉ、デスクトップが綺麗に片付いた。ランチャーを使って起動している人には無用の長物だろうけれど、ハードデスクトップユーザの私にはありがたいツールだ。

2010年5月24日月曜日

WPFを難読化しよう ~ Obfuscator

.NETのアセンブリはIL化されているので、普通にコンパイルしただけではアセンブリから逆アセンブルしてコードの中身をそっくりそのまま見れるようになっている。それはもうReflectorなどのツールを使ってしまえばコードの隅々まで手に取るように分かってしまう。

これではコードの知的財産権を意図せずに放棄しているようなもので、重要なビジネスロジックを実装している場合や、ビジネス的に価値のある高度なプログラミングをしている場合などは危なっかしくてアセンブリを頒布することができない。

そのため.NETでは商用のアセンブリなどをリリースする際には、アセンブリを逆アセンブルされても良いように、ILのコードを意味不明な変数名などに置き換えるコード難読化ツール(英語では大体「ほにゃらら obfuscator」という名称が用いられている。obfuscate=分かりにくくする)が利用されてきた。

今回はWPFアプリ用のObfuscatorで良いなと思ったツールを紹介したい。

商用のObfuscatorは大体$100~$400ぐらいと、個人で開発している開発者にとっては結構な値をはるものが多いが機能は異常に豊富だ。フリーのツールでも充分用を足せるものがあるので、ガチガチにかためる必要がない場合は「.net obfuscate free」などでGoogleしてもらいたい。

実はWPFアプリの難読化には一つ問題があり、他の.NETアセンブリと同様に難読化を行うとアプリが起動しなくなる。というのはCode Behindのコードは難読化されるのにXAMLは通常無視されるので起動時にプロパティなりクラスなりが見つからずに例外が発生して終了してしまう。それなのでWPFアプリにはそれに対応したObfuscatorが必要になる。


で、いくつか評価したフリーのツールで一番のお勧めObfuscatorはcodefort.orgだ。実際には完全にフリーなわけではなく、Free版とProfessional版に分かれている。XAMLまで含めた完璧な難読化を行いたい場合はProfessional版を買い求める必要があるが、簡易な難読化でよい場合はFree版でことたりる。使い方もいたって簡単で、難読化したいdllなりexeなりを選択すれば勝手に依存しているアセンブリを探してきてくれて、Buildタブをクリックすると任意のフォルダへ必要最小構成でアプリをパッキングしてくれる。Build後のアセンブリを前述のReflectorなどで参照してみれば変数名等が変更されているのが分かると思う。

2010年5月19日水曜日

Bing API 2.0で独自のサーチアプリを作る

複数のキーワードを色々と組み合わせた検索結果が欲しい場合にいちいちその組み合わせごとに入力するのが面倒なのでBing API 2.0を使うアプリを作った。


初めはGoogle Search APIを使おうと思ったのだが、いつの間にだか仕様変更がされていて、Googleから提供されるライブラリを使いクライアントスクリプト上からのみしかアクセスできないようになっていた。それなので、クエリに対してほぼ制限のないBing APIを使うことにした。

Bing APIはかなり使いやすくBing Developer Centerで下図のフォームに必要事項を入力しAppIDを取得しさえすれば、後はBing APIの形式にのっとってHttp GETメソッドで取得すればよい。ちなみにAppIDの取得にはWindwows Live IDが必要なので、ない場合はWindows Live IDを取得してから作業をすすめよう。

(Company Nameなどは適当に入力したが特に問題はなかった)

Bing APIの実際を知るにはSDKをダウンロードしてコードを見るのが一番手っ取り早いが、いくつか解説しておこうと思う。
(Developer CenterでAPI Documentationなどが参照できるので詳細はそちらへ)

基本のクエリは下記のようになる(Bing APIではXMLかJsonで結果を受け取れる。Jsonで取得したい場合はxml.aspxではなくjson.aspxに対してリクエストすることになる)。

http://api.search.live.net/xml.aspx?Appid=&query=漫画&sources=web

一番後ろのパラメータにsourcesを指定しているがBing APIではSourceTypeを指定する必要がある。SourceTypeにはWeb, Image, News, InstantAnswer, Spell, Phonebook, RelatedSearch, Adとあるが下記のように複数組み合わせることも可能だ。

http://api.search.live.net/xml.aspx?Appid=&query=漫画&sources=web+image

いくつかの例を下記に示す。

複数のキーワードを組み合わせる場合
http://api.search.live.net/xml.aspx?Appid=&query=漫画 おすすめ&sources=web
http://api.search.live.net/xml.aspx?Appid=&query=漫画 おすすめ -Amazon&sources=web

検索結果を30件取得する場合
http://api.search.live.net/xml.aspx?Appid=&query=漫画&sources=web&web.count=30

30件の検索結果を、51件目から取得する場合
http://api.search.live.net/xml.aspx?Appid=&query=漫画&sources=web&web.count=30&web.offset=51

ちなみに、web.countは最大で50になる。そして検索結果は最初の1000件まで取得可能だが、web.offsetはweb.count + web.offset <= 1,000となる必要がある。 WebソースタイプのXMLフォーマットのレスポンスサンプルはここで参照できる。レスポンスとして取得したXMLやJsonの解析方法などはSDKで詳細にコーディングされているのでそちらを参照して欲しい。

最後に、Bing APIを使う上で次のようにいくつかの制約がある:検索結果をすべて表示すること、IPアドレスごとに秒間7つまでのリクエストしかできない、SEOのために使ってはならない、Bingを使っていると表示すること、などなど他にもいくつかあるのでAPI Basicsの一番最後の部分をしっかりと読んでから使って欲しい。

Mr. Gengo 1.0 リリース

Mr. Gengoがとりあえず形になったのでリリースした。


Mr. Gengo 1.0 at FreewareFiles.com
Mr. Gengo 1.0 at Softpedia

日本人用の英語学習ツールはVectorなどにかなり高機能な素晴らしいものがあるので、日本単語を学びたい外国人用として上記のサイトへリリースした。

初めはFreewareのみに登録したのだが、数日してから突然Softpediaからメールが来て勝手にHostしてくれるようになった。

WPFの勉強用に組んだプログラムなので全然ブラッシュアップされていないが、何か思いついたら機能追加は随時していく予定だ。さしあたってはSilverlight版を作るつもりでいる。

2010年5月11日火曜日

UserControlのCode behindをDataContextに指定する方法

一つ前のポストでUserControlを独自の基本クラスから継承する方法を解説したが、そのクラスをDataContextに指定する方法を解説する。

と言ってもやることは至極簡単で下記のようにDataContextに対してRelativeSource Selfを指定するだけだ。

<localModel:BaseUserControl x:Class="MyWebCrawler.Controls.Keyword"
xmlns:localModel="clr-namespace:MyWebCrawler.Models"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
</localModel:BaseUserControl>

これでそのXAML自身をDataContextとすることができたので基本クラスなどに実装されているPropertyをBinding先として指定できる。ただ、DataContextに指定するクラスがINotifyPropertyChangedを継承するか、またはDependency Propertyを使用することを忘れないように注意しよう。

UserControlを独自の基本クラスから継承する方法

下図のように似たような構造のUI要素が多い場合は、UserControlを作るにしてもまとめた機能を基本クラスにおきたくなる。


しかし、Code behindで継承元をUserControlから独自の基本クラス(BaseUserControl)へと下記のように変更しても「Partial Declaration may not have different base classes.」とコンパイルエラーが発生する。

// これだけじゃ駄目
public partial class Keyword : BaseUserControl{ }

この問題の解決方法はXAMLを下記のように変更する必要がある。

<localModel:BaseUserControl x:Class="MyWebCrawler.Controls.Keyword"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:localModel="clr-namespace:MyWebCrawler.Models">
</localModel:BaseUserControl>

2010年5月6日木曜日

カスタムActionFilter その3

数ヶ月前にカスタムActionFilterの解説をしたが、今回はその補足を。

前回解説したものはAuthorizeAttributeから派生し、認証していないリクエストを他のURLへリダイレクトするというものだった。そのリダイレクトする箇所のコードは下記の通り。

string loginUrl = RedirectUrl();  
filterContext.HttpContext  
 .Response.Redirect(loginUrl, true);  

が、ASP.NET MVC 2にアップグレードしたら上記のコードが期待通りに動作しなくなったのでGoogleした結果、下記のように書き換える必要があった。

string loginUrl = RedirectUrl();  
filterContext.Result = new RedirectResult(loginUrl);

これで期待通りに指定のURLへリダイレクトされるはずだ。

2010年5月1日土曜日

Areaを使ってみる その2

今回はArea間をまたいだリンクの解説をする。

前回追加したAreaのリンク(http://www.my-clip.net/Sandbox/MrGengo/Index/)は下記のようになる。
Httml.ActionLink("Link Text", "Index", "MrGengo", new { Area = "Sandbox" }, null });

4つ目の引数でAreaを渡していることに注目して欲しい。ついでSandboxからDefaultのAreaへリンクする場合は下記のようになる。

Httml.ActionLink("Link Text", "Index", "MrGengo", new { Area = "" }, null });

Area=""でDefaultのAreaへの参照となる。

正直他にも書こうとした内容があったので2回に分けたのだが、思いのほか役に立ちそうにない情報なので今回は予想以上に短いブログポストになってしまった。