Windows Azure Eclipse PDTでのPHPプロジェクト開発手順
Posted in Azure, OS関連, PHP関連, 開発関連 on 7月 27th, 2011 by Site Administratorhttp://msdn.microsoft.com/ja-jp/windowsazure/hh240574
こちらに手順がまとめられています。
私はPleiades 3.7を使って構築を行いました。
http://msdn.microsoft.com/ja-jp/windowsazure/hh240574
こちらに手順がまとめられています。
私はPleiades 3.7を使って構築を行いました。
我が家はケーブルテレビ契約を行っており、しばらくは上位でデジアナ変換が行われることとなります。
おかげで一部のアナログ機器(パソコン用テレビチューナー)が使い続けられる、と思いきや、
アナログ放送用の番組表サービスが停止してしまうとか…。
アイ・オー・データのGV-MVP/GX2Wを使っているのですが、本日確認してみると番組表のダウンロードに
失敗してました。メーカー製ユーティリティなので設定もいじれず、お手上げ状態です。
http://www.valsoft.jp/delphi/tvs2hp.html
iEPGでの番組録画ができるようで、これを併用することで番組表の穴は埋められます。
キーワード録画もできるとのことで、こちらのTVスケジューラーを使えば、しばらくは困らなそうです。
ちなみになぜアナログ機器を使い続けるかというと、GV-MVP/GX2WはLAN外へのテレビの
再配信機能があるのです。ワンセグも選択肢にはあるのですが、屋内での視聴を考えると
IPネットワーク経由のほうが安定していることが多いんですよね。
外でサッカー中継を見たいとき、緊急ニュースを見たい時などにかなり重宝するので、
デジタル放送で同様の機能が正式に認められるまでは使い続けるでしょう。
Windows Azureですが、MSDN契約者向けには無料使用権の特典があります。
ざっと調べてみると契約期間が8か月・16か月限定とか、MSDN特典の用途は
開発用途に限るとか、契約関連の情報で混乱してきたのでMSに問い合わせてみました。
契約期間→MSDNを契約している限りは有効
用途→特に制限はなし。商用利用も可能。
とのことでした。参考情報として公開です。
お約束ですが、ライセンスについて気にされている方は直接MSに問い合わせたほうが良いです。
http://akiba-pc.watch.impress.co.jp/hotline/20110723/ni_c6805e.html
Adaptec(PMC-Sierra)のSAS/SATA RAIDカードです。
注目すべきはスロットがPCI Expressのx4、x1であること。
Intel DQ67SWではx16スロットでAdaptec 2405、2805ともに動作せず、
x8が使える空きスロットもないため泣くこととなりました。
ハードウェアRAIDでx1/x4に刺さるボードはあまり見かけないのでそのうち購入します。
Razorのカスタムヘルパー内でActionLinkを使用する場合、
@helper CustomActionLink(label As String, action As String, controller As String) @Html.ActionLink(label, action, controller) End Helper
上記のように@Helper内でHtml.ActionLinkを使用するとエラーとなります。
Helperのインスタンスが
System.Web.WebPages.Html.HtmlHelper
となっているためです。System.Web.Mvc.HtmlHelperを使うため、
@helper CustomActionLink(html As System.Web.Mvc.HtmlHelper, label As String, action As String, controller As String) @html.ActionLink(label, action, controller) End Helper
と明示的にHtmlヘルパーのインスタンスを渡すようにして回避しました。
http://buffalo.jp/product/news/2011/07/13_01/
BHR-4RVの後継機種が発表されました。
VPNクライアント機能を搭載しているこのクラスのルーターってなかなか無いんですよね。
連載:Entity Framework 4.1入門 第2回 EF 4.1の規約とデータベースの初期化方法
まだまだまとまった記事がないので貴重です。
既存のDBに合わせてコードファーストを使う場合に必要なテクニックになりますので
最初に読んでおいたほうがいいでしょう。
メソッドにNonActionAttribute属性を付与することで、外部公開されなくなる
<NonAction()> Function Index() As ViewResult ... End Function
コードファーストで、定義したエンティティクラスはcontextクラスにプロパティとして登録することになります。
便利な機能なのですが、ここでふと疑問が。contextはどういう単位で作成すべきなのか?
エンティティ単位にcontextを作成すべきなのか、一つのcontextに詰め込むべきなのか。
はたまた使用するエンティティの種類によって適宜切り替えるべきなのか。
(可能であれば一つのcontextに詰め込んだほうが作りがすっきりする)
想像するに、内部ではエンティティクラスを参照してSQLを組み立てたりしているので、登録されるエンティティが
多くなると、きっとパフォーマンスが悪くなっていくのでしょう。
しかし、いろいろなサンプルを参照しても、一つのcontextにすべてのエンティティをまとめているものばかり。
いったいどれだけのエンティティを詰め込んだらパフォーマンス的に支障が出るのか調べてみました。
調査
エンティティは下記の3クラスを1組とします。各クラスでリレーションが張ってあります。
Public Class SizeTest1Item1 <Key()> <DatabaseGenerated(DatabaseGeneratedOption.Identity)> Public Property id As Integer Public Property option1_id As Integer Public Property data1 As String <ForeignKey("option1_id")> Public Overridable Property Item() As SizeTest1Item2 End Class Public Class SizeTest1Item2 <Key()> <DatabaseGenerated(DatabaseGeneratedOption.Identity)> Public Property id As Integer Public Property option2_id As Integer Public Property data2 As String <ForeignKey("option2_id")> Public Overridable Property Item2() As SizeTest1Item3 End Class Public Class SizeTest1Item3 <Key()> <DatabaseGenerated(DatabaseGeneratedOption.Identity)> Public Property id As Integer Public Property data3 As String End Class
上記の組を名前を変えつつ1、10、20、…、300、500と増やし、contextに登録して計測します。
計測は下記の2つで計測します。
1.contextクラスのインスタンス生成
2.データ取得
2ではincludeを使用して、遅延ロードが行われないよう(joinしたSQLが発行されるよう)にしています。
Dim sw As New Stopwatch sw.Start() Dim db As SizeTestContext = New SizeTestContext sw.Stop() Dim sec As Double = sw.ElapsedTicks / Stopwatch.Frequency System.Diagnostics.Debug.WriteLine("time " + sec.ToString()) Dim id As Integer = DateTime.Now.Ticks Mod 10000 sw.Reset() sw.Start() Dim data3 = (From a In db.SizeTest1Item1s.Include("Item").Include("Item.Item2") Where a.id > id).ToList() sw.Stop() sec = sw.ElapsedTicks / Stopwatch.Frequency System.Diagnostics.Debug.WriteLine("sql time " + sec.ToString())
結果
組数 | エンティティ数 | インスタンス生成(s) | データ取得(s) | ||
初回 | 2回目以降 | 初回 | 2回目以降 | ||
1 | 3 | 0.0040139000 | 0.00002185 | 0.380862 | 0.00700525 |
10 | 30 | 0.0367546 | 0.000054625 | 0.6435081 | 0.0074485 |
20 | 60 | 0.085165 | 0.000098675 | 0.9136356 | 0.010602125 |
30 | 90 | 0.1359965 | 0.000155375 | 1.4051476 | 0.00925665 |
50 | 150 | 0.2135294 | 0.000204075 | 2.5750359 | 0.0142086 |
100 | 300 | 0.4460645 | 0.000499725 | 9.8501423 | 0.02892025 |
200 | 600 | 0.921872 | 0.001003225 | 53.739042 | 0.064910225 |
300 | 900 | 1.3339758 | 0.00120595 | 168.6336884 | 0.1096848 |
500 | 1500 | 2.2109845 | 0.0026371 | 718.1666749 | 0.3085771 |
組数として30(エンティティ数90)くらいが境目でしょうか。
これを過ぎると急激にパフォーマンスが悪化します。
逆に言えばエンティティ数90程度のシステムであれば、一つのcontextにまとめてしまっても
問題ないとも言えます。
このあたりは、システムの規模に合わせて要検討というところで。
Public Class Data1Record Public Property id As Integer Public Property item_id As Integer Public Overridable Property Item() As Data2Record End Class
上記のようにエンティティモデルにOverridable Propertyを設定すると、対象のデータが
遅延ロード可能になります。これを遅延ではなく、joinした形でまとめてデータを取得したい場合は
Function Index() As ViewResult Dim data = db.Data1Records.Include("Item").ToList() Return View(data) End Function
上記のようIncludeで対象Propertyを指定することによって、joinしてデータを一括取得できます。