2012年12月28日

来年こそはしっかりモノにしたい6つの技術スキル

1. Node.js


今注目のサーバーサイドJavaScript実行環境。

Windows Azure上でも簡単にホスティング出来るみたいなのでぜひ何か作りたい。

リアルタイムな何か。最初の題材としては対戦型のゲームとかが面白そう。


この本をちらちら見ながらワクワクしている。



2. クライアントサイド MVC



この本は一応読むことは読んだ。でもまだ実践ではクライアントサイドMVCを使う機会がない。

ASP.NET界隈では Knockout.js の人気が高まっているみたいだ。

個人的にはGoogle発の AngularJS に最も興味がある。DotInstallでのレッスンには興奮した。



3. CSS3/LESS/SCSSなど


CSS3はそろそろ機が熟して来たのかなと感じている。

CSSだけで時計やゲームの様な動きを見事に実現してしまう例を見せてくれた http://www.adventar.org/calendars/2 を眺めて、今さらながら驚かされた。

大規模なプロジェクトになると効率アップのために LESS か SCSS はやはり必要になるだろうなと思う。

LESSとSCSSのどちらを使った方が良いか、というのは迷う所だけれども、LESSの方が明らかに名前で得をしていると思う。子音だけのSCSSよりもLESSの方が発音しやすいし、語感が明るい気がする。名前付けは重要だなあ、と。


4. テスト駆動開発


最近は意識的に単体テストを書く頻度を上げて「テスト駆動」に近づく様にしている。そのおかげでリファクタリング/デバッグのスピードが着実に向上しつつあるのを実感している。

下の2冊はまだ読んでいる途中だけど、しっかりとモノにしたいスキルだ。





5. Titanium Mobileによるスマートフォンアプリ開発


Eclipse+Javaを使ってAndroidアプリを個人的に開発するという事は1年半以上前からやっている。JavaやAndroidの勉強をしながら、少しずつ自分で作ったものが形になって行くのはとても楽しい。

ただ、この方法だとXcode+Objective CでのiOSアプリの開発まではいつまで経ってもたどり着けそうにない。趣味的に続けて行くには、単純に時間が足りなすぎるのだ。

そこで何らかのクロスプラットフォームなツールを使う必要性を強く感じている。

ゲームなら多分 UnityCorona と言ったあたりが良さそうだけれども、ツール系のアプリだと Titanium Mobile が一番良さそうかなと思っている。


この本はかなり前に買ったのだけれど、忙しくてまだじっくり読めていない。

来年はAndroidだけでなくぜひiOSアプリの開発にもチャレンジしたい。


6. TypeScript


CoffeeScript ももちろんいいのだけれど、Windows 8アプリの開発などを視野に入れると TypeScript の方に注目したい。

JavaScriptを書くならTypeScriptを使え! - 部屋とボードゲームと私と酒と泪と男と女
Visual Studio 2012を使ってTypeScriptのサンプルを動かしてみたところ、確かにこれなら気軽に入っていけそうだ。もしかしたら来年の今頃は「TypeScript無しでの開発なんて考えられない」っていうぐらいになっているのかも知れない。



来年こそは!


以上、来年こそはしっかりとモノにしたい6つの技術スキルを挙げてみた。

ホントは今年中にやっておきたかったのだけれど、来年の自分に向けて書いておく。






 

2012年12月17日

Eclipseで急にAndroidアプリのエクスポートが出来なくなった時の対処法

あるAndroidアプリを更新した後、「さあGoogle Playにアップロードするぞ」とAPKのエクスポートをしたら、突然Eclipseがエラーで落ちてエクスポート出来なくなるという問題に遭遇した。

前のバージョンまでは全く問題無かったのに、更新後は何回トライしてもエクスポートしようとすると必ずEclipseが異常終了してしまう。

ActionBarSherlockを使う様に画面を変更したのだけれど、それが関係しているのかも知れない。

エラーログを見ると、何やらZipファイルの処理でエラーが発生している様な感じなのが何となく分かるが、対処法がさっぱり分からないので困った。

色々調べてようやくなんとかエクスポート出来たのでメモ。

Issue 28725 - android - Eclipse Crashes with EXC_BAD_ACCESS when exporting signed applications - Android - An Open Handset Alliance Project - Google Project Hosting


ここにある通り、「Build Automatically」のチェックをOFFにして試したら無事エクスポート出来た!

それにしてもよく分からないエラーだ。



 

2012年12月12日

Entity Framework 6では非同期DB処理がこんなに簡単に書ける!

MicrosoftのScott Guthrie氏のブログで Entity Framework 6 の Alpha 2 がダウンロード可能になったと報告されている。

Entity Framework 6: Alpha2 Now Available - ScottGu's Blog

改善点としてまっさきに挙げられているのは「非同期処理のサポート」。

.NET 4.5 introduced the Task-Based Asynchronous Pattern that uses the async and await keywords to help make writing asynchronous code easier. EF 6 now supports this pattern. This is great for ASP.NET applications as database calls made through EF can now be processed asynchronously – avoiding any blocking of worker threads. This can increase scalability on the server by allowing more requests to be processed while waiting for the database to respond.
The following code shows an MVC controller that is querying a database for a list of location entities:

(以下意訳)

.NET 4.5ではTaskベースの非同期実行のパターンが追加されました。このパターンでは async と await キーワードを使って非同期に実行されるコードを容易に記述する事が出来ます。EF6 も今回このパターンをサポートしました。
EF経由のデータベース呼び出しを非同期で実行する事が可能になるので、これはASP.NETアプリケーションにとっては非常に望ましい事です。 - つまりワーカスレッドをブロックせずともよくなるのです。これによってデータベースからの応答を待つ間に他のリクエストを処理出来るので、サーバー側でのスケーラビリティの向上に寄与します。
次のコードはLocationエンティティの一覧をデータベースから取得するMVCコントローラの例です。


    public class HomeController : Controller
    {
        LocationContext db = new LocationContext();

        public async Task<ActionResult> Index()
        {
            var locations = await db.Locations.ToListAsync();

            return View(locations);
        }
    }
上のコードを見ると、青字の部分が変わっただけで、他は今までと同じ。とても読みやすい。これだけでコントローラ側が非同期処理になるとは、素晴らしいの一言。

最近は Node.js がかなり注目されているけれども、その理由の一つが「非同期処理によるスケーラビリティの向上」にある。Entity Framework 6で非同期なDB処理がここまで簡潔に書ける様になると、ASP.NETもその方向にまた一歩近づいたという事になると思う。




 


2012年12月6日

Nexus7を買って4ヶ月後の感想 - じわじわと良くなって来た感じ


8月の初めにNexus7を購入してから4ヶ月が経った。

当初は期待半分、「本当に使えるのかなー」という疑い半分、という感じで、まあ少なくともアプリ開発のデバッグ用途には役に立つかなという程度に思っていた。

ところが、時間の経過とともに当初想定していなかった使い方もする様になって来て、だんだんと手放せなくなりつつある。

他の人の感想を読んだりして、「やっぱりNexus7いいね」と改めて見直したり。
Nexus7購入から1ヶ月後 — 乱れなよ、そして召されなよ

Nexus 7が、とりわけヒジョーにかなりイイ
なんと言っても7インチというサイズと軽さが素晴らしい。これはまあ当然として、その他に次のような点が大きいかなと思う。


Googleのサービスと親和性が高い


一番大きいと思うのはChromeの同期機能。これは使い出すと本当に欠かせない。
もちろんGmailも使いやすい。Google Mapの高機能さもやはりAndroidならでは。



Android OSのアップデートがすぐに反映される


購入してから4ヶ月で既に3回のアップデートが配信されている。アップデートのたびに細かい点が改善されているのが嬉しい。

特にAndroid 4.2で追加されたマルチユーザー機能はとても便利。子供に渡す時にさっとユーザーを切り替えて渡すだけで良くなったので本当に助かる。


あと、買った当初は想定していなかった使い方というのは、電子書籍を読む事と動画や音楽を楽しむ事の2つだった。



紙のメモを使わなくなった


Nexus7を買ってからミーティングのメモは全て「7notes with mazec」を使って取る様にしている。

最初の頃は「書き流し入力」をして後からきれいにテキストに変換していたけれども、この頃は手書き文字のままPDFで保存する様にしている。どうしてもテキストに変換する必要があるドキュメントでない限りはこれで十分だ。

最近スタイラスペンが少しヘタって来た様な気がするのでそろそろ買い換えたほうが良いかも知れない。

手書き入力をしない時は、Google日本語入力のGodanキーボードが便利。mazecと状況に応じて使い分けている。



電子書籍が読みやすい


Amazon.co.jpで日本語の電子書籍が買える様になった。Nexus7の話からは外れるけれど、僕にとってはこれは大きかった。

電子書籍が便利なのはわかっているけど「読む本が無いから結局読書には使わないだろうなあ」と思っていた。

でも、Amazonで簡単に日本語の本が探せて、しかも今まで払っていた高い海外向け送料無しで読めるとなると話は全く別だ。

試しに好きな作家の小説を買ってみたら、もちろんNexus7で全く問題なく読めた。7インチの画面はさすがに携帯の画面より読み易い。読んでいる位置やブックマークを携帯やPCのKindleアプリと同期する事も出来るし、やっぱり便利。

検索しても出てこない本がまだまだ多いけれど、早く紙の本と同じものが買えるようになって欲しい。そうしたらNexus7の出番がもっともっと増えると思う。



Youtube動画を連続再生


日常生活の中で、「Youtubeのあの動画を再生しながらこれをしたいな~」という場面が結構ある。

僕の場合は実は「食後の食器洗い」の時間がそれに当たる。手が濡れているので出来れば画面を触らずに自動でどんどん再生してくれると嬉しい。

それを実現してくれるのが「PVSTAR+」というアプリ。これで気に入った動画をずっと流しながら両手で作業が出来る。



音楽を聴きながら寝る


前からSky.FMは聴いていて、「Solo Piano」というチャンネルが僕のお気に入りになっている。

Sky.FM Radio

このアプリが便利なのはスリープタイマー機能が付いているので聴きながら寝入ってしまっても時間が来れば停止してくれる事。きれいなピアノの音を聴きながら眠ると本当に気持ちがいい。

ただ、無料で使っていると、たまに寝かかっている時にコマーシャルが始まって目が覚めてしまう事がある。なので有料アカウントにしようかと真剣に検討中。



結論


そんなこんなで4ヶ月後の感想としては、「Nexus7買って良かった。悔いはない!」と思っている。



 

2012年12月5日

ASP.NET MVCでDbContextのトランザクションと独自SQL 処理のトランザクションを同一のスコープにする

最近毎日 ASP.NET MVC4 でWebアプリケーションを作っている。

今まで独自のO/Rマッパを使っていたので Entity Framework を使い出したのは実はごく最近。

これでSQLを書かなくてもデータの取得や更新が簡単に出来る様になったのは嬉しいのだけれど、当然ストアドプロシージャを呼んだり自分で書いたSQL文を実行したりしたいという場面も結構ある。

そこでいくつかのDBアクセスのパターンを試していて、独自SQLの実行とDbContext経由でのデータ更新を同一のトランザクション内で行いたい、という場合にちょっと困ったので対処方法をメモしておきたい。



とりあえず問題ない例

上の例では別のContextを使っているのでこれはエラーにはならない。 ただしこれだと1つめの更新処理と2つめの更新処理を同一のトランザクション内で実行出来ない。



問題になる例

上の例の様にDbContextからの更新処理をADO.NETのTransaction内に入れた場合は次のようなエラーが起きる。





対処の方法


1. 生成済みのDbConnectionを渡してDbContextを生成する。

DbContextのインスタンスを生成する時に、コンストラクタに既存のDbConnectionを渡すとDbContextで勝手にCloseされる事が無くなる。

これをするためには、DbContextのクラスにDbConnectionパラメータを受け取るコンストラクタを追加する必要がある。



    public class MyEntities : DbContext {

        public MyEntities()
            : base("DefaultConnection") {
        }

        public MyEntities(DbConnection existingConnection)  
            : base (existingConnection, false){ 
        }

        public DbSet<Product> Products { get; set; }
    }


2. EntityConnectionを使ってコネクションをOpenする。

DbContextのDatabase.Connectionは素のSqlConnectionを返す。ただしこれを自分で直接OpenしてしまうとEFの管理情報と一致しなくなる。

DbContextをIObjectContextAdapter型にキャストしてそこからObjectContextを取得し、そのConnectionプロパティ(実態はEntityConnection)に対してOpenを実行すればEFの管理内で処理される。


3. EntityConnectionに対してBeginTransationする。

1、2の後、EntityConnectionに対してBeginTransationしてトランザクションを開始すれば、独自のSQL処理とDbContextのSaveChangesメソッドによる内部的なトランザクションとが同一のスコープで実行可能になる。


対処後の例



動作確認可能な全ソースを含んだサンプルプロジェクトはこちら


参考にしたURL

This SqlTransaction has completed; it is no longer usable. Entity Framework Code First - Stack Overflow

task parallel library - Entity Framework, SqlCommand and TransactionScope - Stack Overflow

Exception from DbContext API: EntityConnection can only be constructed with a closed DbConnection - Diego Vega - Site Home - MSDN Blogs

EntityConnection can only be constructed with a closed DbConnection

2011 7月 « Do Design Space

.net - Frequent saves with entity framework - Stack Overflow

entity framework - EF Code First DBContext and Transactions - Stack Overflow






 

2012年12月3日

ASP.NETのWCFサービスでDbContextから取得したオブジェクトを返そうとするとエラーになる場合の対策

先日、ASP.NETのWCFサービスでEntityFrameworkのDbContext経由で取得したモデルクラスのオブジェクトを返そうとして、壁にぶつかった。

発生したエラーの内容はこんな感じ。
Test method ServiceTest.CustLoadData threw exception:
System.ServiceModel.CommunicationException:
An error occurred while receiving the HTTP response to http://localhost:60741/MyService.svc.
This could be due to the service endpoint binding not using the HTTP protocol.
This could also be due to an HTTP request context being aborted
by the server (possibly due to the service shutting down).
See server logs for more details.
---> System.Net.WebException: The underlying connection was closed:
An unexpected error occurred on a receive.
---> System.IO.IOException:
Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote host.
上記のエラーはWCFサービスの呼び出し側で表示されるエラーなので実際に起こっているエラーの原因はちょっと違う部分にある。


いろいろデバッグに苦労したけれど、とりあえずどうやらWCFサービス内でオブジェクトを返すためにシリアライズしようとしている所でエラーが起きているらしい、という事が分かった。

原因は、DbContextの動作原理としてPOCOに対する変更追跡と遅延ローディングを実現するために内部的に「動的プロキシクラス」というものを生成している事にあるらしい。

動的に生成されたプロキシクラスはシリアライズ対象に出来る「既知のクラス」として認識されないのでエラーになってしまう様だ。

POCO エンティティの使用 (Entity Framework)
『Windows Communication Foundation (WCF) では、プロキシを直接、シリアル化または逆シリアル化できません。その理由は、DataContractSerializer では既知の型のみのシリアル化または逆シリアル化ができますが、プロキシ型は既知の型ではないためです。』

結局対策としては

this.Configuration.ProxyCreationEnabled = false;

の1行をDbContextクラスのコンストラクタ内に入れる事で解決した。
これでデータ取得時に動的プロキシが作成されずに純粋なPOCOが返って来るので、シリアライズ時に問題が発生しなくなる。


ちなみにMSDN内の下のページには「シリアル化中にProxyDataContractResolver クラスを使用してプロキシ型を POCO 型にマップ」する方法が載っている。でもちょっと試してみたところ上手く行かなかったので今回はパスした。
チュートリアル: WCF による POCO プロキシのシリアル化 (Entity Framework)


他の解決策として、動的プロキシの作成を抑止せずにWCFサービスでオブジェクトを返す前に手動でPOCOにデータを詰め替えるという方法もある。

データを詰め替えるのはAutomapperなどのライブラリを使えば簡単に出来るので、ProxyCreationEnabled を falseにするという解決策を取りたくない場合はそちらでも良いかも知れない。



その他参考になりそうなURL:

Entity Framework 4, WCF & Lazy Loading Tip | .NET Zone


Entity Framework v4 POCO templates: repository returns object of incorrect type - Stack Overflow