2012-09-29
.NETでスキャナを扱うためのTWAINライブラリ
結論から言うと、TwainDotNetを使うのが一番幸せになれそうだなということなんですけどね。
twaindotnet - A TWAIN library for the .net platform. - Google Project Hosting
ネット上の日本語情報にあたってみたけれど・・・
今月に入ってから、仕事で.NETからスキャナを扱うことをしていました。
たぶんライブラリあるだろうなぁと調べてみたのですが、なかなか情報が少なく・・・。
有料のコンポーネントもいろいろあるようですが、オープンソースのライブラリで日本語情報としてあったのがこの2つ。助かりました。
C#でTWAINを操作してみる - ニヤリ TechSide
.netでTWAINスキャナから画像の取込(実践編) | .log
ということで、この2つの情報をもとに.NET TWAIN image scannerを使ってみたのです。
.NET TWAIN image scanner - CodeProject
このソースはだいぶ古く、.NET 1.1のころのもののようです。
ですが、.NET 4.0に普通にコンバートしてくれたのでしばらく使っていました。
それで分かったのですが、このライブラリ・・・というかラッパーは、結構使いづらいなということでした。
まずい点としては、
- リソースの解放を自力でやらなければいけない。
- メッセージポンプの実装が必要になるので、それなりの量のグルーコードを書かなければいけない。
の2つです。
特にリソースの解放に関しては、ポインタのない世界で生きてきた自分には苦しくて。。。
リソース解放の方法を調べていたら見つけたデキル奴
そんなわけで、うまいことリソース解放できる仕組みを作ろうと思ってグーグル先生にいろいろ聞いてみました。そこで見つけたのが、上記で紹介したTwainDotNetでした。
このライブラリは.NET TWAIN image scannerに対して、制御用のメソッドを数多く加えています。リソース制御もきっちりやってくれています。
そのおかげで、AccessViolationExceptionが発生しないようになりました。
また、TWAIN DriverのUI表示や画像の回転を指定する際にTWAINのソースをいじくる必要もありませんでした。
実際のところ、このライブラリ一つで十分実用に耐えうると感じています。
細かい使い方に関しては、TwainDotNetのサンプルプロジェクトを参照してください。
/ - twaindotnet - A TWAIN library for the .net platform. - Google Project Hosting
2012-09-23
CyberAgent VS gloops な勉強会に行ってみた。
9/20に行われたレバレジーズさん主催の勉強会
【Java・C#エンジニア必見!】CA×gloopsコアエンジニアによる合同技術勉強会! Javaによるゲーム開発パッケージ化への取り組みとノウハウ /月間150億PVを捌く想像を超えた安定性と適応力を持つC#の魅力 : ATND
に行ってきましたので、久々に勉強会レポートなるものを書いてみようと思います。
なぜ書くかというと、近いうちにがっつりレポートを書かなければいけないので、その練習という感じだったりします。
あと、サイバーエージェントさん・gloopsさんの仕事に興味を持っていたので、一度聞いておこうと思って行ってみました。
サイバーエージェントさん講演
Javaを用いてソーシャルゲームの開発をしている。これまでに15本ほどゲームを展開した。いまも新規で数本開発している。
そのソーシャルゲームも最近ではリッチなUIが求められたり、標準機能が増加している。また、コンプガチャが規制されたように、今後特定の機能が規制されることもあり得る。
そうした対応を個々に行うことが大変になってきたため、ソーシャルゲーム開発の基盤をパッケージすることになった。
講演者の山田元基さん [twitter: @ygenki] は、そのパッケージの開発を行っている。
パッケージ化したのはガチャやショップ・トレードといった、どのゲームにも共通して必要となる機能である。たとえばガチャのライブラリ化を行うことで簡単にガチャを導入できるようになった・規制にも対応しやすくなった・新しいガチャの種類を他のゲームに展開できるようになった。
また、各ゲームでの独自機能開発も行っている。その独自機能開発を行う際はパッケージの開発メンバが入って、ライブラリ化を前提に行うようになった。その結果として、独自開発したものを横展開できるようになった。
パッケージ化をすることで、開発スピードや品質の向上。ゲーム間の機能連携などを行えるようになった。特に開発スピードに関しては、開発前の仕様を決める部分などがごっそり無くなった。また、開発したゲームがヒットすると、開発者はそのゲームの運用にずっとかかわらなければいけなくなり、人が移動しにくくなるという弊害があるが、パッケージ化を行うことで、人が移動しやすくなり、新しいゲームを生み出しやすくなる土壌が出来た。
gloopsさん講演
gloopsはIIS, SQLServer, ASP.NET C#でソーシャルゲームの開発を行っている。主なタイトルは「大召還!マジゲート」など。
講演者の河合宜文さん [twitter: @neuecc] はLINQjsなどのライブラリの開発を個人で行ってもいる。
講演の内容はC#の進化の歴史である。2002年にC#が登場した後、2005年にジェネリクス、2008年にLINQやラムダ式といった関数型言語的な機能が追加される。2010年にDynamicが加わり一部動的言語のように扱えるようになった。そして2012年はASyncと呼ばれる非同期処理向けの言語機能が加わった。
C#は日々進化している。その進化の過程で加わった言語機能に、強力な補完機能、コンパイルエラーをリアルタイム検出、リファクタリング支援などを備えたIDE Visual Studioを合わせることで、スピードの速さが求められるソーシャルゲームの開発をC#で行えている。
例えばLINQを使うことで、どんなコレクションでも同じ構文で統一的に扱える。その機能のおかげで、memcachedを使ったキャッシュデータをそのままアプリ側のメモリ上で高速にJoinすることができている。実際のところ、SQLよりも強力であり、生産性が高い。
Dynamicがあることで、Javascriptを通して取得したデータを動的に扱えるようになっているし、ASyncがあることで、node.jsのようなコールバック地獄に陥ることなく、非同期処理が書けている。
開発コストについてはLinuxを使う場合よりも若干高くつく。しかしAWSなどでもWindows Serverのインスタンスを提供しているので、今後開発コストの差はどんどん縮まっていくだろう。
スタートアップがC#で開発するような場合、BizSparkというMicrosoftが提供する支援制度があるため、費用面も安く済む。
ソース管理はSubversionを使っている。今後はGitを検討中。どちらもIDEと連携するプラグインで優秀なものがある。
一方、ユニットテストなどはあまり書けておらず、今後の課題となっている。
サイバーエージェントからgloopsへの質問
C#以外の言語の採用・検討はあるのか。
現状は無い。他社でF#をバックグラウンドに採用している事例はあるが、ソーシャルゲームの場合、C#のほうが有利であると考えている。
C#を選んだ理由。
前身の会社がSNSをC#で作っており、その流れからC#を採用することとなった。
バージョンアップはどうしてる?
新しいバージョンを試して、問題なく移行できそうであればバージョンを上げている。
バージョンアップ自体はリスクが高いものの、言語そのものをMicrosoftがしっかり管理しているため、あまりリスク無くバージョンアップをすることができている。
gloopsからサイバーエージェントへの質問
他のJVM言語は使わないのか。
ソーシャルゲームはJavaでやることにしている。
他にはScalaのノウハウを貯めるために管理ツールの開発に使っている。
フレームワークはどうしているか。gloopsはASP.NET Web Formsでやっているが。
サイバーエージェントではStrutsやSpring, Seaserなどいろいろ使っている。フレームワークの選定は責任者が行っている。
感想
どちらの講演も「なるほど」という感じで聞いていました。
サイバーエージェントさんについては、「共通機能をライブラリ化することで、ゲームのコア部分にリソースを集中させられるな」と普通に思いました。いい戦略だなぁと思いますし、そうした共通機能のライブラリを作れてしまうのもすごいなぁと思いました。
gloopsさんについては、「こんなにもC#の機能は進化していたのか」と思いました。普段VB.NETでぐぬぬと思いながら開発をしている身としては、なかなか魅力的ではあります。
ただ、ASP.NET Web Formsではテストしずらいのは身を以て知っているので、そこがなんとかなると、もっと魅力が増すなぁと思いました。
2011-10-05
jQueryでGridViewのテーブルを選択する。
久々の技術ネタ。
仕事で「GridViewのテーブルを選択して、選択した行の詳細を別画面で表示する」という機能を実装することになったので、jQueryを使って行を選択できるようにしたという話です。
jQuery UI Selectableを使えばいい
ということで、「jQuery table 選択」といったキーワードでGoogle先生に聞いてみたところ、jQuery UI Selectableを使えばいいということが分かりました。
jQuery UI Selectable で、テーブルの行選択 - Still Laughin’
GridViewで使う場合はCSS Friendly Control Adapterが必要
上記のサイトを元にしてスクリプトを書いてみたのですが、うんともすんとも言わず。
htmlソースを見てみると、tbodyタグが無い。
ちょっと調べてみるとtbodyタグが無い。セレクタの内容を変えてみたのですがうまくいかず。
そんな状態でtbodyタグをつけるにはどうしたらいいのかを調べてみたらCSS Friendly Control Adapters - Homeを使えばいいことが分かりました。
GridView に Flexigrid を適用する
上記サイトの解説にしたがって設定をしていきます。
CSS Friendly Control Adapters - Homeのサイトからdllを落として参照設定、App_Browsersディレクトリを追加してその中に CSSFriendlyAdapters.browserを追加、zipファイルを落としてその中のCSSFriendly/CSS と CSSFriendly/JavaScriptをプロジェクトディレクトリ直下に配置しました。
divタグのなかにtableタグが
ここまでの設定をやって、実行時のhtmlソースを見るとdivタグにGridViewのidがついて、その配下にtableタグがあるような構造になりました。tbodyタグも無事つきました。
さて、ここで問題なのがGridViewのid。作っていた画面はマスタページを適用しているので、idが"ctl00~"というように書き替わってしまいます。このidを使ってセレクタを書くのがいやだったので、一つ外側にdivタグをつけるような形にしました。
ソースコード
ということで出来上がったソースコードはこんな形になりました。(サンプル用にコードを書いています)
<html>
<head>
<script type="text/javascript" src="jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="jquery-ui-1.8.16.custom.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/smoothness/jquery-ui-1.8.16.custom.css" />
<script type="text/javascript">
<!--
$(function() {
$("#selectable div table tbody").selectable({filter: 'tr'});
});
// -->
</script>
<style type="text/css">
#selectable div table tbody .ui-selecting { background: #FECA40; }
#selectable div table tbody .ui-selected { background: #F39814; color: white; }
</style>
</head>
<body>
<div id="selectable">
<div id="gridview1">
<table>
<thead>
<tr>
<th>col1</th>
<th>col2</th>
</tr>
</thead>
<tbody>
<tr>
<td>hoge</td>
<td>hoge</td>
</tr>
<tr>
<td>fuga</td>
<td>fuga</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>
外側のdivタグにidないしはclassを付け、セレクタの起点にします。そこからdiv table tbodyと辿る形でセレクタを書いて、selectableの処理を書きました。
続きは後日
ということで、jQueryを使ってGridViewの行を選択できるようになりました。ここからコードビハインドページに書いた処理を呼び出したいとこなのですが、まだそこまでやってないので今日はここまで。
2011-06-04
.netでJenkinsを動かす実験をしてた。
今週数時間使って、.netでJenkinsを動かす実験をしていましたのでまとめてみる。
まずは参考サイトを。
Jenkins,MSBuildの設定
Hudson で MSBuild を動かす - かおるんダイアリー
Redsolo’s blog site: Guide to building .NET projects using Hudson
HudsonとMSBuildの連携 - 技術メモ
ビルドトリガの設定
Subversion と Hudson の連携−その2 Subversion リポジトリのコミットをトリガにソースをビルドする - かおるんダイアリー
第2回 Hudson事始め:Hudsonを使ったアジャイルな開発入門|gihyo.jp … 技術評論社
基本的には上で挙げたページを見ればできるので、まずは上を参照してください。それで大体できます。
一部うまくいかなかったことだけ書きます。
.net Framework 4だとうまくいかない。
Jenkinsのビルド設定でバッチコマンドを書くところがありまして、Redsoloのページには
"c:\program files\nunit\bin\nunit-console.exe" MediaPortal.Tests\bin\RELEASE\MediaPortal.Tests.dll /xml=nunit-result.xml /config=test.config exit 0
と書いてあるんですが、.net Framework4のプロジェクトだとエラーを出します。
.net Framework4のプロジェクトで動かす場合は、
"c:\program files\nunit\bin\nunit-console.exe" MediaPortal.Tests\bin\RELEASE\MediaPortal.Tests.dll /xml=nunit-result.xml /config=test.config /framework=net-4.0 exit 0
とすれば動きます。
wgetが無い!
かおるんダイアリーから張られてるwgetのリンク先が無くなったりしていてダウンロードできなくなっています。
wget(Windows版) - 俺の基地
で書いてある通り、
Wget for Windows
から
Binaries, Dependenciesをダウンロードして、Dependenciesの中に含まれているdllをBinariesのbatフォルダの中にコピーします。
あと、パスを設定してあげればwgetが動きます。
そのあとはSubversionのRepository\hooks内にpost-commit.batを作り、
wget "http://localhost:8080/job/{Jenkinsのプロジェクト名}/build?delay=3sec"
と書いて保存。
Subversionのサービスを再起動すればコミット→ビルドの流れが出来上がります。


