漫画 on Webクローン作成(準備)

漫画 on Webのビューアに触発されて、Silverlight で作ってみよう、と思い立ちました。

Silverlight 3 のインストールが必要ですが、こんな感じ。
http://moonmile.net/sl/SampleMekuri/

ページの左半分をクリックすると前へ、右半分をクリックすると元に戻ります。

ソースの方は後で公開しますが、制作ポイントを話すと、

  1. Grid に囲まれた Image を 2枚用意する。
  2. マウスクリック時に、1枚目の Image をアニメーション。
  3. 2枚のImageをページに合うように差し替え

なことをしているだけです。
ページ自身は、見て分かるとおり画面のキャプチャで、サーバーに PNG 画像として置いてあり、適宜読み込んでいます。なので、1回目はちょっと重たい。2回目以降は、キャッシュが効いているので、スムースに読み込めます。

# このあたり、リソースからもできるはずなんだが、ひとまずサーバーから読み込み方式で実装

20100505_01

制作手順としては、

  1. めくり画像を用意
  2. 最初に、WPFアプリケーションでWindows上で実装。
  3. Expression Blend のタイムラインを使って、切り替えアニメを作成。
  4. 1枚目から2枚目の切り替えを実装。
  5. 複数のページを切り替える方式に変更。
  6. マウスの右ボタン/左ボタンで、進む/戻るを実装。
  7. Silverlight アプリケーションを作成。
  8. XAML コードの移し替え
  9. C# のコードを移し替え
    WPF と Silverlight で要素の扱いが若干違うので修正。
  10. Silverlight だと、マウスの左クリックしかないので、ページの右/左に変更。
  11. リソース読み込みから、サーバーのURI指定に変更。
  12. FTPでサーバーにアップして実験

な感じですね。

漫画の場合は、スキャナで読み込むので画像の切り替えだけで済みます。漫画の著作権なんかは、サーバーに画像データを置くので、通信時にしか使えないので大丈夫そう(トリッキーなことをすれば、抜けるかもしれませんが)。

iPhoneアプリと同じように、WPFアプリを作成してしまってPC上のローカル環境で動かすのも可能です。この場合は、WPFアプリ自身にDRMを確認するコードを入れるか、パスワード配布という方式が取れます。公開キー方式でも良いでしょう。

文章の場合には、(アイデアレベルですが)ブラウザ(WebBrowserコントロール)を内蔵させてしまうという手があります。ページ捲りをしたいので、ブラウザを2枚用意して、WPFの機能でめくるようにアニメーションさせます。

なところまで考えて作成。ここまで3時間弱ぐらい。

カテゴリー: 開発 | 漫画 on Webクローン作成(準備) はコメントを受け付けていません

ePubコンバータ作成(準備)

電子書籍を開始する前に、システム屋さんとしてはePubを勉強しておこう、ということで、いくつか調査中。

  • テキストからePubを作成する。
  • 画像からePubを作成する。

著作権、不法コピー(海賊版)を防ぐためにはDRM(Digital Rights Management)が必要なんだが、プラットフォーム依存(Kindle、iPhone、iPad、Sony、Adobeなど)なところもあり、流通依存(Amazon、Appleなど、漫画onWeb)なところもある。将来的には課金を考えないといけないのだが、ひとまずシステム屋としてはインフラ主導で考えてみよう。

フリーで作成、流通、PCやiPadなどで閲覧、を想定してフリーなものを探してみると、

iPadビジネスを先取り!EPUB関連フリーソフト5選http://builder.japan.zdnet.com/sp/opensource-for-developer2010/story/0,3800103086,20408786,00.htm

で、フリーのビューア&作成ツールが選べる。ひとまず手軽だろうと思われる Adobe Digital Editions をダウンロードして導入してみる。ページ送り1枚なので見開きとはいかないが、横書きならばこれで十分だろう。

20100504_04

さて、フリーなコンテンツからePubというと、青空文庫からコンバートできるのがいいので、Text2ePub 0.8(β)を試してみる。青空文庫から直接ダウンロードできたりして、版権が切れた本を読むのにいいんだが、、、ああ、何故か私の環境では動かない(悔しい)。

青空文庫 (XHTML) -> ePub変換 なところで、ePubに変換できるらしいんだが、ああ、Bookmarlet が動かん。

ん~、どうしたもんか、と悩んだところ、そうか、試しに epub を zip に変換して中身を覗いてみればいいのだ、ってことで zip を解凍してみる。なるほど、見たことがあるファイルっぽいね、単なるXHTMLファイルが並んでる。

というわけで、いくつか手作業で修正してみて、zip 圧縮、拡張子を「epub」に変えて、先の adobe digital Editions で読むと、うん読めます。この位ならば、perl スクリプトを組むだけでも十分ですね。

 

という訳で基本に返って、仕様っぽいものを読んでみる。

日本語Epubブックサンプル
http://www.kobu.com/docs/epub/index.htm

.epub eBooks Tutorial
http://www.jedisaber.com/eBooks/tutorial.asp

ここのチュートリアルは英語しか通さないので、日本語を通すようにします。その手順をざっと書いていきますね。

  1. チュートリアルから、sample.epub をダウンロード
  2. sample.zip にして展開する。
  3. OEBPS/chap01.xhtml を開いて、
    先頭の encoding を “iso-8859-1″ から “UTF-8” に変更
    <meta http-equiv=”Content-Type” content=”text/html;charset=UTF-8″ /> を追加
    body の何処かに日本語を書いておく。
    そして、UTF-8 で保存
  4. OEBPS/stylesheet.css を開いて

    @font-face {
      font-family: “ipampmona”;
      src: url(font/ipamp-mona.ttf);
    }
    body {
      font-family: “ipampmona”;

    な感じで追加。これは、日本語のフォントを埋め込むためで、ipamp-mona.tff は IPA でダウンロードするか、先の「青空文庫 (XHTML) -> ePub変換」から、サンプルをダウンロードして、展開した後、font/ipamp-mona.ttf を引っこ抜きます。

  5. なわけで、フォントは、
    OEBPS/font/ipamp-mona.ttf
    にコピーしておく。
  6. これを zip で圧縮します。
    圧縮するときは、sample のフォルダを圧縮するのではなく(これでしばらく悩んだ)、
    META-INF
    OEBPS
    mimetype
    を選択した状態で圧縮します。

    20100504_05

  7. 拡張子を zip から epub に変換します。
  8. Adobe のビューアにドロップします。

な感じで、epubをPCで見ることができます。

 

内容のコンテンツは、拡張子が xhtml になっていますが、これだと IE とかのブラウザで確認しづらいので、html にすることができます。拡張子を変更した場合は、content.opf ファイルを書き換えます。

manifest/item のところで、IDとファイル名(href)が指定してあるので、これをちまちま修正。

<item id=”chapter01″ href=”chap01.html” media-type=”application/xhtml+xml” />
<item id=”chapter02″ href=”chap02.html” media-type=”application/xhtml+xml” />

な感じで書きかえるとブラウザで確認しつつ、html を修正ってことができます。

 

というわけで、ビューアが縦書きをサポートしてくれれば、自前のスクリプトでepubファイルを作って小説を読むってことができます。

同様に、画像の埋め込みも非常に簡単なので、同人誌をepubにして配布ってのも十分可能です(無料配布ってのがアレだけど)。宣伝用にはいいんじゃないでしょうか。

後は、epub のファイルを作っていて思いついたんですが、Adobleのビューアでは印刷ができるので、PDFの変わりになります。適度にHTMLを使ってページを作成した後に、ツールを使って epub へコンバート、そのまま印刷。配布資料を作成する場合は、HTMLとepubが一度にできるので楽そうです。

カテゴリー: 開発 | 4件のコメント

投稿専用Twitterクライアントを作る(2)

前回の反省を踏まえて、bit.ly は真面目にテストしつつやる。プログラマ根性というところ。

さて、bit.ly の API を使えることを知っていはいたものの、

APIドキュメントを見るのもしんどいし
http://code.google.com/p/bitly-api/

そんな訳で、検索して探すと、

bit.ly (短縮URL) API呼び出し (その1)
http://d.hatena.ne.jp/m-kawato/20090603/1244041369

があるので参照する。

  1. bit.ly で api key を取得する。
  2. .NETのWebClientを使うことに決定。
  3. クエリ呼び出しが楽なので、OpenReadメソッドを使う。
  4. テスト用のプロジェクトを作って、長いURLを渡して結果を返すところまで完成。
  5. デフォルトではJSONで返ってくるので、formatをxmlで指定。
  6. ストリームを XmlTextReader → XmlDocument に変換。
  7. 「shortUrl」を探して変換テスト
string transBitUrl(string longurl)
{
    string query = &quot;&quot;;
    string shorturl = &quot;&quot;;

    WebClient web = new WebClient();

    query = &quot;http://api.bit.ly/shorten?format=xml&&quot;
          + &quot;version=2.0.1&longUrl=&quot; + longurl
          + &quot;&login=&quot; + bitLogin + &quot;&apiKey=&quot; + bitApiKey;

    Debug.Print(query);

    Stream st = web.OpenRead(query);
    XmlTextReader xr = new XmlTextReader(st);
    XmlDocument doc = new XmlDocument();
    doc.Load(xr);
    var lst = doc.GetElementsByTagName(&quot;shortUrl&quot;);
    if (lst != null && lst.Count > 0)
    {
        XmlElement el = lst[0] as XmlElement;
        shorturl = el.InnerText;
    }
    st.Close();

    return shorturl;
}

これがテストできたので、今度は文章中のURLを変換させる。

  1. IndexOfメソッドで変換しようと思ったが、面倒そう。
  2. 正規表現の Regex クラスを使うことに決定。
  3. 簡単のために”http://[^ ]+ “ のように、後ろに半角スペースで区切る。
    実は、文章末の場合のチェックが必要なのだが、ここでは省く。
  4. 見つかった文字列を MatchCollection で受けて、Replace すれば OK。
  5. ローカルでチェックしてOKなので、これを先のアプリに組み込む。
string transShortUrl(string text)
{
    Regex reg = new Regex("http://[^ ]+ ");
    MatchCollection mc = reg.Matches(text);
    if (mc == null || mc.Count == 0)
    {
        return text;
    }     foreach (Match m in mc)
    {
        string lurl = m.Value;
        if (!lurl.StartsWith(http://bit.ly))
        {             string surl = transBitUrl(lurl);
            if (surl != "")
            {
                text = text.Replace(lurl, surl+" ");
            }
        }
    }
    return text;
}

Bitボタンを付けて、

20100504_02

な状態から、Bitボタンを押せば、

20100504_03

な状態へ。ここまでは1時間半程度、まずまずか。

カテゴリー: 開発 | 投稿専用Twitterクライアントを作る(2) はコメントを受け付けていません

投稿専用Twitterクライアントを作る(1)

さくっ、と出来るかと思ったら、結構掛かった。20時頃からやって23時半まで、う~む。

原因としては、

OAuth(xAuth)のVB.net実装サンプル
http://d.hatena.ne.jp/Kiri_Feather/20100305

なところを、VB.NETからC#へ移し替えようとしたのが駄目。結構長いことが分かって嫌になってしまった。あと、いきなりWPFアプリを作ろうとしたのが駄目だな。2重に駄目が重なってしまって、うまくいかなくなってしまった。

なので、一端やり直して。

  1. VB.NETを丸ごとコピーしてビルド
  2. 試しに、Windowsフォームを作ってみた。
  3. その前に、ボット用のアカウントを取得
  4. TwitterのbotをOAuthに対応させる を参考にして、ruby で手順通りやる。
  5. 手順通り、gem install oauth する。
  6. 手順通り、oauth-patch.rb を作る。
  7. 手順通り、twitter-oauth.rb を作る。
  8. アクセストークンを取ってきて、
  9. 手順通り、twitter-oauth-access.rb で動かしてみる。
  10. 動いた動いた。
  11. どうやら、二重投稿は却下される模様。よかったよかった。
  12. IEでツイッターにログインしてない状態でもチェック。
  13. さて、VB.NET のほうで、認証を試してみるが「認証失敗」
  14. 試しに、投稿してみると投稿できる。
  15. なぜ、認証に失敗するのかよくわからないが、投稿ができるのでOKとする。
  16. いくつか、Windowsフォームから投稿するパターンをチェック。大丈夫そう。
  17. VB.NETで、WPFプログラミングかぁ、と一瞬悩んだ末、C#でWPFを作ることに決定。
  18. 参照設定で、VB.NETのライブラリを追加する。
  19. Visual Studio 2008 で、WPFアプリを作って動かしてみる。
  20. 一応大丈夫そう。投稿できている。
  21. Expression Blend 3 を立ち上げてデザイン開始。
  22. ああ、ボタンの作り方がわかんない、ってんでネットで検索
  23. ああ、テキストボックスが改行されない、ってんでネットで検索
  24. ああ、イメージをリソースから表示できない、ってんでネットで検索
  25. ああ、マウスをポイントしたときに色が代えられない、ってんでネットで検索
  26. やっぱり、WPFの本がないと無理だよなぁ。デザイナじゃないし、良しとするか。

という訳で、自分専用(パスワードとか埋め込みだから)のツイート専用アプリは、ひとまず完成。

ああ、そうそう、せめてbit.lyを入れなくちゃ。

20100504_01

フォントは「江戸勘亭流P」で。日本語の場合はいいのだが、アルファベットの場合が変なので後で変えるか。

カテゴリー: 開発 | 投稿専用Twitterクライアントを作る(1) はコメントを受け付けていません

Visual C++ 2010 の新機能メモ

Visual C++ 2010 の新機能
http://msdn.microsoft.com/ja-jp/library/dd465215.aspx

C++/CLIのインテリセンスが効かないので、C++/CLI関係は駄目なのですが、C++はかなり便利機能満載なので、メモ書き。

■autoキーワードで型推論が使える

最初に言っておくと、「auto」はC++のキーワードで、内部変数の有効期間を示すものなのですが、滅多に使われない(というか全く使われない)ので、Visual C++ では「型推論」のために意味が変更されています。

なので、/Zc:auto なるスイッチが導入されています。デフォルトでは、型推論が有効な状態ですね。
http://msdn.microsoft.com/ja-jp/library/dd293615.aspx

書き方は、

auto i = 10 ;

なんて形で書きます。これだと余り意味がないので、

vector <int> vec ;
vector <int>::iterator it = vec.begin();

の代わりに

auto it = vec.begin();

なんてことが出来ます。

この型推論ですが、F#のタプルを扱う時や、C#での複雑なLINQを扱うとき(C++にLINQはないけど)に便利です。

 

■ラムダ式

ラムダは無名関数とも呼ばれますが、algorithm 関係で比較式を扱うときに便利です。

例えば、sort 関数の場合、比較関数を指定できるのですが、今までは必ず関数を作る必要がありました。

int comp( int x, int y ) { return x < y ; }

sort( vec.begin(), vec.end(), comp );

な感じで、comp関数が必要なのですが、ラムダ式を使うと、

sort( vec.begin(), vec.end(), [=](int x, int y ) { return x < y; });

な感じで、その場で書けます。

いくつか書き方があるので、詳細は調べないと駄目なんですが、mutalble というキーワードを使うところを見ると、F# の影響も入っているようです。

 

■nullptrの利用

長らく、NULLポインタを表すものは、

#define NULL (void*)(0)

で定義されていた訳ですが、Visual C++ 2010 では決別したいようですw

if ( p != NULL ) {

のところを

if ( p != nullptr ) {

と書き換えができます。

nullptr
http://msdn.microsoft.com/ja-jp/library/4ex65770.aspx

を見ると、/clr が必須なようですが、ネイティブのC++を使った場合も通ります。

ってここが改変点なのに! Visual C++ 2008 だとネイティブのほうは nullptr が通りません。

これの便利な処はですね、組み込みシステム何かを作っていると、「#include <stdio.h>」なんてのができません。なので、自前で #define NULL (0) ってことをやることが多いのですが、別の会社でもやっていると、

#ifndef NULL
#define NULL (0)
#endif

なんてのが、頻繁に出てきます。これを回避するために、nullptr が…って、あと、ポインタと0の混在が…、組み込みだと Visual C++なんて使わないですよね~。

  • NULLの再定義による副作用を避けるために、nullptr の導入
  • C++/CLI で使われるNULLポインタと合わせるために、C++にnullptrを導入
  • templateプログラミングでNULLポインタが扱える

ってところですね。

ちなみに、sizeof( nullptr ) ってのも通って、値は「4」です。int型になっているみたいですね。代入は、char *でも、double *でも、NULL同様にできます。

カテゴリー: 開発 | Visual C++ 2010 の新機能メモ はコメントを受け付けていません

投稿専用Twitterクライアントを作る(準備)

Twitterを始めて2週間ほどなので、PCからブラウザ上でやっています。

Webでぽちぽち追っていてもいいんですが(この手のは慣れているので)、入力がちっと面倒。文字数をカウントしてくれるのはいいけど、あの textarea でちまちま編集するのは難しい。かといって、エディタで書いてからペーストすると、文字数を超えてしまうし。

なので、自分用の投稿専用があってもいいかなと(先行きは、リストを表示するでしょうが)。

目標としては、

  • 文字数が制限される(140文字)
  • URLを bit.ly などを使い、短縮できる。
  • そのアプリで投稿できる。

なぐらいですか。実は、最後のはブラウザへコピペでもいいんですが、まあ、先行き作る(であろう)botの調査も兼ねて作ってみるということで。

あと、どうせなので、.NET Framework の WPF を使って、綺麗な画面を作ります。

PHP+OAuthでTwitter
http://www.sdn-project.net/labo/oauth.html

そんなんで、いきなり認証絡みで躓いたので、↑を参照にして。

と思ったら、VB.NET のサンプルが

OAuth(xAuth)のVB.net実装サンプル
http://d.hatena.ne.jp/Kiri_Feather/20100305

ありがたや~。

カテゴリー: 開発 | 投稿専用Twitterクライアントを作る(準備) はコメントを受け付けていません

F# ドキュメント翻訳向上委員会(仮)を始めました

趣味のOCaml – F# 日本語ドキュメント
http://d.hatena.ne.jp/taka-island/20100424/1272096524

なところで、コメントを書きましたが、MSDNライブラリの Visual F# の翻訳がアレなので、wiki を立てました。

MSDN – Visual F#
http://msdn.microsoft.com/ja-jp/library/dd233154%28v=VS.100%29.aspx

F# 日本語ドキュメント Wiki
http://moonmile.net/fsdoc/

# Wiki のほうは、もう少し目的が明確な名前にするかな?

このあたりの主旨/流れとしては、

  1. Visual Studio 2010 から F# と呼ばれる関数言語が導入された。
  2. F# は OCaml の方言である。
  3. F# のドキュメントは主に英語で、日本語はほとんどない。
  4. F# に関するブログも数か所しかない(盛り上がりに欠ける)。

なところで、一方で関数言語としては、Haskell や Scala があるのですが、まあ、個人的に .NET系を触る機会が多いので、Visual F# です。

# そう言えば、「Visual F#」となっているけど、現状、Visual Studio 2010 では、F# の Windows アプリケーションのプロジェクトテンプレートがありません。なので、「Visual」を冠するのは、いつわりですよね~。まあ、手打ちでがしがしやるか、UI を C# で作るのがベターです。

さて、わからんときは英語を読む。日本語の先行ブログを読む、でもいいんですが、ちょっと「オブジェクト指向脳」の方には、かなりハマります(悪い意味で)。きちんと、関数言語の意図がわかっていないと、forループを連発してしまうコードを書きます。

まあ、それでもいいんですが、どうせならば、最初の関数言語の意図とは何だったのか?を抑えて、勉強なり翻訳なりをしたいですよね。

なので、

「関数プログラミング」P.バード、P.ワドラー
http://www.amazon.co.jp/dp/4764901811

を買いました(苦笑)。

これは大学の教科書に使うようなものなのですが、出版が1991年になっています。

原著を見ると、

http://www.amazon.com/dp/0134841891

1988年に出版されています。

C++の発祥が1983年、Modula-2が1978年頃なので、オブジェクト指向とほぼ同時期に発想されているんですね。

# 元ネタは、Lisp だろうから、もっと前なんだろうけど。

そうなると、F# や OCaml を学ぶ時には、関数言語 → オブジェクト指向 の流れで味付けをしいと駄目なわけで、このあたりがずれてしまうと、.NET で関数言語がメインとして使えるメリットが薄れてしまうのです。

逆な言い方をすれば、LINQ は関数言語の良いところを取り入れていますが、

  1. オブジェクト指向として C# を学ぶ → 味付けとして LINQ を学ぶ。
  2. データアクセス言語として LINQ を学ぶ → オブジェクト指向として C# を学ぶ。

のように、2のほうでは相当違和感があるわけです。普通は1の方法で学びます。

 

ここで、何でここに至るのかと言うと、実は2週間ほどF#を弄ってみたわけです。タプルやらリストやら、Lispを知っているので、このあたりはなんとかなんですが、どうもその後はオブジェクト指向に引っ張られるんですよね。OCaml や Haskell のサイトを見て、似た関数を作ろうとおもうけど、私にとっては、C# で書いたほうが楽、ってな感じで、どーしようかなぁ、ってな感じだったのです。

それで仕方がない。初心に帰って勉強するか、ってな具合になって池袋のジュンク堂へ。他の関数言語をちらちら見て、F#の洋書を手にとって、そして目についたのが「関数プログラミング」です。ぱらぱら見て、数式が出てくるのでこれならば良さそう(関数言語=数学で使う、という知識はあったので)、ってんで1階レジへれっつらごー!(死語w)。

レジで「4,400円になります」って言葉に「うっ」ってなりましたが、仕方がない買う、ってなもんです。

1ヵ月間勉強したんですが、これが面白い。抜群に面白いし、どうして関数言語が生まれるのか、がびっしりと書いてあります。いや、実際のところは OCaml や Haskell よりも前に書かれていて、F# なんて影も形もありません。付録には Miranda というプログラム言語の例があります。

まあ、そんな訳で、F# の用語を、

  • 一般的な関数言語の用語に統一
  • OCaml の用語と統一

とするなら、やぶさかではない、って具合です(偉そう…)。

カテゴリー: 開発 | 1件のコメント

Twitter 前夜祭 in 板橋

ひそかに’Twitterではおおっぴらに)準備していましたが、公開します。

Twitter で始まる板橋の夜明け

http://itatr.com

ということで「前夜祭」をやります。

一応、ツイッター講座の前振り(集客目的)なのですが、まあ「お祭り」的な感じでやります。

日時: 2010年5月17日(月) 18:00~

場所: 和民 板橋西口店

です。募集人数はいまのところ「無制限」。ってな感じで募集していきます。

# 和民さんの部屋が最大40名なので、それぐらいが上限ですね。

今回、和民さんに Wi-Fi が導入されるということで、声を掛けさせて頂きました。当日、Wi-Fi が間に合うのか、間に合わないのかは、ソフトバンクさん次第ということでw、まあ、見切り発車。

  • 株式会社プリンシパルの塚越さんを招いて、初級的から、営業ツールとしての話を
  • 今回のサイトのアクセス数などを、経緯を交えて、時系列で説明

など、したいと思います。

ぜひ、お誘いあわせの上、いらっしゃってください~。

http://itatr.com から応募フォームを使うか、ツイッターで @teamitabashi にダイレクトメッセージしてください。

カテゴリー: 起業塾 | Twitter 前夜祭 in 板橋 はコメントを受け付けていません

C++/CLIにインテリセンスが必須な理由

Visual Studio 2010 の C++/CLI ではインテリセンスが効かないのです。

C++では、効くし、最新情報にある通り結構早くなっています(最初にヘッダファイル等を読み込んでデータベース化するところは相変わらずなんですが)。

さて、これを /clr スイッチを付けて、C++/CLI として使おうとすると、全く駄目。C++ 側のインテリセンスも、.NET側のインテリセンスも両方が効きません。全く、昔の vi で組んでいた状態に戻ります。

このインテリセンスの機能、C++/CLIで使えないのは、.NET Framwork を選択するという点でも結構致命的なのです。

それをいくつか説明しましょう。

 

■C++で組むときにインテリセンスがでない

MFCで組む時には出てたインテリセンスが、C++/CLIでは出ない訳ですから、かなり不便です。ただし、不便とはいえ、C++ のヘッダファイルを参照すれば、(かなり面倒ですが)クラス名から関数名を割り出すことができます。

ただし、Visual C++ 6.0 の頃から出ていたもの(10年前)以前に逆戻りというのは、かなり開発効率が落ちるでしょう。

なので、C++/CLI のコンパイラを捨てて、C++ だけでコンパイルするでしょうね。

そうなると、MFC でのインテリセンスも使えるのでうまくできます。

 

■.NETとしてC++/CLIを使う場合に困る

C#やVisual Basicで出ていたインテリセンスが出ないので、結構困ります、、、が、ヘルプを参照すれば何とかコーディングができるでしょう。

しかし、.NET FrameworkでWindowsアプリを組む場合、C++/CLIだけで組むことは皆無でしょう。C#やVisual Basicを選択しますよね。

C++/CLIで作る場合は、学習用か趣味のときぐらいです。

また、C++/CLIで使い勝手が悪かったら、C#やVisual Basicを使えばいいだけです。

 

■ハブとしてC++/CLIを使う場合に、致命的

さて、これが一番の問題です。

C++/CLIの使いどころは、実は既存のC/C++ライブラリと.NETアプリケーションを媒介するところなのです。例えば、OpenCV という画像解析用のライブラリがありますが、これはC++で書かれています。このために、ライブラリを利用するためには、C++の呼び出し(あるいは専用に用意されたC言語呼び出し)が必要になります。

ご存じのとおり、C#やVisual Basicではポインタが扱えません。正確に言えば、C#でboxingを使えば、ポインタを使えるのですが非推奨の機能です。また、適切な呼び出しの属性を付ければ、C#からC言語で作られたDLLを呼び出すことができますが、結構手間です。

さて、この場合は、C言語のライブラリに適当なC++/CLIのラッパを作ります。

つまり、

C言語 → C++/CLI → C#

のような流れを作ってやるわけです。

こうすると、C言語特有のポインタや配列、char型での文字列(ASCIIのみなど)は、C++/CLIでうまく扱ってやり、配列の場合はArrayやList、文字列の場合はstringクラスに直してから C# へ引き渡してやります。

これらの利点は、

  • C言語のライブラリで扱う malloc 関数などを C++/CLI で吸収できる。
  • C#のstringクラス(Unicode)に直すことで、char型の配列を直接変換する必要がない。

また、C言語のライブラリが、昔からある計算ライブラリのような場合(社外秘となる画像解析や暗号解析のライブラリなど)を適度にクラスとしてくるんでやり、C#やVisual Basic のオブジェクト指向で扱いやすいパターンにします。そうすることで、主に.NET側でUIを記述し、高速化しなければならない科学計算などはC++を使ってポインタを駆使することが可能です。

さて、ここでC++/CLIを使う場合、C言語の科学計算ライブラリは、ヘッダファイルがあるために、インテリセンスがなくてもそれなりに記述ができます。非常に面倒ではありますが、なんとか記述可能です。

しかし、C#側で作成したUIライブラリなどを、C++/CLIに引き渡す場合に、非常に困るのです。C#の場合には、ヘッダファイルがないので、直接ソースコードを参照しなければ、クラスのメソッド名やパラメータが分かりません。

この場合、C#やVisual Basicで作られたコードが、DLLとして(アセンブリとして)提供される場合はどうでしょうか?

そう、C++/CLIからは全く手が出せない状態になってしまうのです。

Visual C++ 2008 の場合は、C# で作成したDLLを参照設定させた上で、.NETの各種クラスライブラリを使うことができたので、DLL内のクラスをインテリセンスを使い探索することが可能なのですが、Visual C++ 2010 の場合は、インテリセンスが効かないために、これが出きないという事態に陥ります。

そう、回避策として考えられるのは、

  • 一度、C#で組んだものを、C++/CLI にコンバートする。
  • Visual C++ 2008 で組んだものを、Visual C++ 2010 にコンバートする

という本末転倒なことになるわけですね。

これが致命的なところです。

 

ゆえに、C++/CLI のインテリセンスが出ない場合には、そのままレガシーシステムのラッパーを作れない、に等しい現象が起こるので、

  • C言語で作ったレガシーシステムを、C#に書き直すしかない。
  • C言語で作ったレガシーシステムは、C言語のみで管理するしかない。

の2点に分岐します。ただし、先に書いたとおり機密性の高いC言語ライブラリは、書き直すことは不可能ですし、高速化が必要な科学計算の場合はコアなところはC言語のままとしたいところです。

そんな場合は、C言語あるいはC++のみを使い続けるようになり、ここの分野ではC#やVisual Basicの移行は進まないでしょう。

と、なにやらぐだぐだと書きましたが、

  • 早々に、サービスリリースとかで、C++/CLIのインテリセンスを戻してくれよ!
  • それまでは、Visual C++ 2008 で C++/CLI を使うしかないね。

というのが結論ですねぇ。いまのところは。

カテゴリー: 開発 | C++/CLIにインテリセンスが必須な理由 はコメントを受け付けていません

Visual C++ 2010 の C++/CLI ではインテリセンスが効かない?

誤報であれば、後で修正しますが、ちと致命的なので。

Visual C++ 2010 の C++/CLI プログラミングではインテリセンスが効きません。

Microsoft のページでは、

Visual C++ 2010 の新機能

http://msdn.microsoft.com/ja-jp/library/dd465215.aspx

の中で、

強化された IntelliSense エラー

Visual Studio 2010 の統合開発環境 (IDE) では、IntelliSense の障害を引き起こす可能性があるエラーの検出機能が強化されました。また、IntelliSense エラーが [エラー一覧] ウィンドウに表示されます。問題の原因となっているコードを表示するには、[エラー一覧] ウィンドウでエラーをダブルクリックします。

となっており、強化されているハズなのですが、効かない。

20100427_01

で、試しに MFC のほうでプロジェクトを作ってみるとインテリセンスは効きます!

なので、どうやら「C++/CLI」だけインテリセンスが効かない、現象なのかと。

まずいなぁ~、これは、一挙にモチベーションが↓↓↓(3段階ぐらいダウン)。

MFCでプロジェクトを作るとき、インテリセンス用のデータベースがクラッシュして、仕方がないので作り直し(単にファイルを消すだけだけど)することが多かったのですが、C++/CLIのインテリセンスは効いていました。C#やVisual Basicでは、普通に使うので慣れてしまって、C++で作るときも必須ってな機能なんですけど、C++/CLIだけ、できないってのは、ちょっと困る。

# 英語のRC版でもできなかったので、直るものかと思ったら。こういう落ちとは。

公式的にはどうなのか、後で尋ねますか。。。

C++/CLIでもIntelliSenseが機能してほしい https://connect.microsoft.com/VisualStudioJapan/feedback/details/519716/c-cli-intellisense?wa=wsignin1.0#tabs

えぴさんに対する回答にコメントしておきました。

~~

2010/05/03 追記

Visual C++ Team Blog でも炎上していますね。
http://blogs.msdn.com/vcblog/archive/2010/04/13/visual-studio-2010-is-now-available.aspx#9995285

フォーラムのほうも
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/0dfc0cc6-271f-45a3-9838-1478e96df75b/
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/22ed2e0f-105c-4018-8591-fe999a14a80d

Microsoftからの公式コメントはないようです。

~~

追記:  2012/05/28

現状では、

  • Visual Studio 2010 上で C++/CLI のインテリセンスは使えません。
  • Visual Studio 11 beta (次期 Visual Studio)では、C++/CLI のインテリセンスが使えます。
  • Visual Studio 11 beta で、metro アプリケーションを作るための「C++/CX」では、インテリセンスは使えます。

という状態です。Visual Studio 11 で C++/CLI のインテリセンスが使えるので、Visual Studio 2010 の SP などで使えるようになる可能性も無きにしもあらず、って感じなのですが。どうなんでしょうねえ?

 

カテゴリー: 雑談 | 1件のコメント