2012年3月24日

「n件目からm件だけを取り出したい」場合のSQLクエリの書き方

Webアプリケーションで何らかのデータの一覧を表示する際に、ページング処理(Pagenation)を行うのはほとんど当たり前の事になっている。

EntityFrameworkでLINQを使って「100件スキップしてから20件だけ取得する」というクエリーを書きたい場合は、例えば下の様な書き方になると思う。

var list = db.Books
.OrderBy(itm => itm.id)
.Skip(100)
.Take(20);

これを実行すると実際にはどのようなSQLに変換されているのかを調べてみたい。

*ただし、以下の内容はMicrosoft SQLサーバーやOracleなど、分析関数が使用可能なデータベースサーバーを使っている場合に限られた話になると思う。


Microsoft SQLサーバーを使っている場合は、クライアントとデータベースの間でやりとりされているデータの内容を確認するには、「SQL Server Profiler」を使うのが便利だ。
「SQL Server Profiler」でキャプチャを開始する前の設定画面

キャプチャされたSQLの内容

実際にデータベースに送られたSQL文を少し読み易く書き直すと、下の様な感じになる。

SELECT TOP 20 *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY [bs_id] ASC) AS [row_number]
FROM [dbo].[Bookshelves]
) AS e
WHERE e.[row_number] > 100
ORDER BY e.[bs_id] ASC

なるほど、ROW_NUMBER() という関数を使って一旦全レコードに行番号を付けて、そこから100行目以降の20件だけを取り出すというロジックになっているのか。。。


多分、この様にサブクエリを使って書くとSQLサーバーの内部で最適化が行われて、実際には全件アクセスはせずに最小のコストで必要な部分だけを返す事が出来るのではないだろうか。

この書き方は自分でSQLを書くときにも使えそうだ。一つのひな型として覚えておこうと思う。








.

新しいiPadを触ってみた感想

今日初めて「新しいiPad」を触って来た。



印象が薄れないうちに感想を書いておこうと思う。

  1. 画面がキレイ。
  2. やっぱり重い。
  3. でもiPad2には戻れない。
  4. 結論: 重さが半分になれば買います。


1.画面がキレイ。

これは本当にその通り。細かい文字も確かに見易くて良い。これで電子書籍を読んだら快適だろうと思った。

2.やっぱり重い。

Apple Storeに居る間、片手で5分間持ち続けたのだけれど、やっぱり重い。ベッドに寝転んでWebを見るにはこれでは辛い。実は家に初代iPadがあって、買った当初は喜んでこれでWebを閲覧していたけれども、重さが気になって段々と使わなくなってしまったのだ。重さ的には新型もほぼ変わらないので、多分同じ結果になりそうな気がする。

3.でもiPad2には戻れない。

店内にはiPad2も展示されていたので、比べてみた。こちらの方がスペック的には少し軽いはずなのだけど、その場では体感的には違いが分からなかった。一目で歴然とした違いが分かったのは、解像度の差だ。一度新型の画面を見てしまった後では、これからiPad2を買おうと言う気にはまずなれないと思う。少なくとも、100ドル引きになったぐらいではこの解像度の差には代えられない。

4.結論: 重さが半分になれば買います。

自分としては新しいiPadを買わない最大の理由は、結局は重さになる。

もし7インチで350グラム程度、かつこの素晴らしいディスプレイをもった「もっと新しいiPad」が登場したら、その時こそはアップルストアに並んででも買おうかなと思う。









.

2012年3月23日

Android SDKをRevision 17に更新したらエミュレータがサクサクに!

Android SDK ToolsがRevision 17にアップデートされたので早速更新した。今回は比較的大きな更新になっている様だ。
Android SDKアップデート、Windows/Macでエミュレータが高速に | マイナビニュース

Updated SDK Tools and ADT revision 17 | Android Developers Blog

特に興味を惹かれたのが、
WindowsおよびMac OS Xにおいてエミュレータが仮想モードでAndroidx86システムイメージをサポートし、Androidが高速に動作するようになった。
という部分。

早速ここに書かれている手順通りにやってみた。
Using the Android Emulator | Android Developers


ただし、Intel VTによる仮想化支援を使うには、次の制限があるとの事。
  • ARMベースではなくx86のシステムイメージを使ったエミュレータしか動かせない。
  • 仮想化された環境内では動かせない。
  • 同一PC上でIntel VTを使う他の仮想化ソフト(VMwareやVirtualBoxなど)と同時に動かす事は出来ない。
  • OpenGL ESを使うアプリのパフォーマンスは実機ほどは出ない。



まずは、「Android SDK Manager」でx86のシステムイメージをインストールする。
現時点では、APIレベル10(Android 2.3.3)用のものしか無いみたいだ。


次に、SDK Managerのリストの一番下の方にある「Extras」の中の「Intel Hardware Accelerated Execution Manager」を選択してこれもインストール。
インストール後、コマンドラインから
sc query intelhaxm
を実行して、
SERVICE_NAME: intelhaxm
       ...
       STATE              : 4  RUNNING
       ...
と表示されればOK。



インストール完了後、AVD作成ダイアログのターゲットに「Intel Atom x86 System Image」が追加された。これを選択してAVDを作成すると、エミュレータ実行時にIntel VTによる仮想化支援機能が使われて動作が速くなるという事らしい。



早速エミュレータを起動してみると...

お、確かにブラウザが一瞬で起動する様になっている。

サンプル「APIDemos」を動かしてみる。
従来のエミュレータだとかなりカクカクしていたOpenGL ESのデモも、上述の様に実機ほどのパフォーマンスは出ないと但し書きはあったものの、x86イメージのエミュレータだとかなりスムーズに動いている。

(上)従来のエミュレータ (約8.5FPS)
(下)x86システムイメージを使ったエミュレータ (約27FPS)



普段からエミュレータ上で開発をしている人にはかなり嬉しい改善になりそうだ!


と思ったのだけれど...、

ここまで書いてから、さてVirtualBoxでいつも使っている仮想マシンを起動しようとしたら、「仮想マシンを起動出来ません...云々」のエラーが出てしまった。。。

「なんださっきインストールしたIntelのHAXMとか言うサービスを止めればいいんでしょ。」と思ってコマンドラインから、
sc stop intelhaxm
を実行。サービスが止まっているのを確認してから再度VirtualBoxの起動を試みても、やっぱり同じエラーが出る。検索したらMacでもやはり同じ問題に遭遇している人が居た。
HAXM stops VirtualBox fro ... - Intel® Software Network
PCを再起動しても同じなので、結局あきらめて「Intel Hardware Accelerated Execution Manager」をアンインストールする事にした。

アンインストール後は無事VirtualBoxの仮想マシンが起動出来たので、このIntelのHAXMサービスが原因だった事は間違いないと思う。

という事で、VirtualBoxとの相性は良くないみたいだ。残念。:-(









.

2012年3月21日

小さな子を持つ親としてAndroidタブレットに欲しい機能

我が家の子供達にひらがなやカタカナの練習をさせたいと思って、たまに初代iPadを使わせている。

ただ、子供にタブレット端末を使わせる場合、何も設定しないと大きな問題がある事に最近気付いた。というのも、子供達がYoutubeの使い方を覚えて、放って置くと1時間でも2時間でもアニメ(主にアンパンマン)の動画ばかり見続けるという状態になったからだ。

これではだらだらとテレビやDVDを見ているのと変わらないから、きっと教育上よろしくない。

そういう時に便利なのが、iOSの「機能制限」の設定だ。ここでYoutubeの使用を制限する事が出来る。さすが Apple、よく出来ている。


それはそれでいいのだけれど、せっかくだから出来れば自作のアプリでひらがな・カタカナを練習させたいなあと思い始めていて、そうなると今からiOSの勉強は大変なのでやはり子供用にAndroidのタブレット端末を買おうかなという事になる。

そこで気になるのが、Youtubeの存在だ。

Android端末でYoutubeのアプリを使用不可にする事は出来るのだろうか。少なくとも手元のAndroidスマホでは出来なさそうだ。

なんらかの方法で仮にYoutubeアプリを使えなく出来たとしても、多分ブラウザからは見る事が出来てしまう。

今年の5月か6月頃に出ると噂されているGoogle製の7インチタブレットには、ぜひこういったかゆい所に手が届く機能をOS標準の機能として付けてもらいたい。
Google タブレットは7インチ、 ASUS 製、5月発売? - Engadget Japanese

本当に200ドル前後という低価格で販売されるのだったら、iPad1台分の値段で2台買ってもまだお釣りが来る! 期待してしまうだけに、こういう細かい点がどうなるのかなあ、と気になる。




.

2012年3月17日

良い習慣付けをサポートしてくれそうなAndroidアプリ達

この記事を読んだのがきっかけで「習慣付けをサポートしてくれるアプリ」が気になりだした。
日記が全然続かない僕がたどり着いた『4行日記』を習慣化する為に行った方法 | ライフハック | Yu_notes.
僕も日記を続けようと思っていてなかなか続かないので何か良い方法はないかなと思っていた所だったので、Androidでも「21日習慣づけ」と同様のアプリが多分あるだろうと思って探してみた。

選んだ基準は、

  1. 見た目がシンプルでデザインが良い事。
  2. 入力が簡単そうな事。
  3. カレンダー表示やグラフ表示が出来る事。

の3つ。

とりあえず次の7つをインストールして試し中。

Routinely


Success Log: Goal Tracker


Habit Streak


My Effectiveness Habits (beta)


Habitlog - Habit Builder


GoalTracker


MyChain


一週間ほど使ってみて、どれが最も気に入ったかまた書こうと思う。






.

2012年3月1日

ASP.NET MVC4 が面白い!

今、ASP.NET MVC 4 が面白い。まだBetaだけど、正式リリースが待ち遠しくなって来た。

ASP.NET MVC 4 Beta 関連ドキュメント

特に興味を引かれるのは、「Web API」と「Single Page Application (SPA)」だ。

Web APIについてはこの動画と次の説明を見ればほぼ概要がつかめる様になっている。
http://www.asp.net/web-api/videos

ASP.NET Web API を使ってみよう: MVC 4 新機能シリーズ - THE TRUTH IS OUT THERE


出来ればいつかはこういう解説が出来るぐらいには詳しくなりたいものだ。
ControllerとApiController - 無聊を託つ



SPAについてはこのサンプルをチェックして次の説明を読めばなんとなく分かった気になれる。
SPA Samples: The Official Microsoft ASP.NET Site

Single Page Application (SPA) を使ってみよう: MVC 4 新機能シリーズ - THE TRUTH IS OUT THERE

SPAの標準テンプレートではクライアント側のJavascriptライブラリとして「Knockout.js」と「Upshot.js」などが使われている模様。またまた憶える事が増えたなぁ。。。


早速実際に試してみた方の記事も非常に参考になる。
ASP.NET MVC 4 Beta で追加された Web API プロジェクトを試す - まめしば雑記
ASP.NET MVC 4 Beta で追加された Single Page Application を試す - まめしば雑記


現時点の感触としては、Web APIとSPAの組み合わせで、プラグイン無しでクライアントサイドで動く操作性の良いアプリケーションが作れて、かつValidationなどはサーバーサイドのロジック(というより宣言的な記述)としっかり同期させられて、とっても良い感じ! という印象だ。

早速何か作って色々試してみたい。



(こちらはMVC 3ベースのWeb APIの例。実際にDBからデータを取得する部分などはこちらも参考になりそうだ。)
WCF Web API, WCF Data Servicesとはまた違うREST APIライブラリ | OPC Diary