IDEについて考えたこと(続き)

きのうまでの話

きのうの続き。
プログラムの開発環境について書く。

オイラは普段、VisualStudioの恩恵にどっぷり浴しながら
C#を書くプログラマです。

今回macを買ったので、rubyやらFlashやら、もっと本腰を入れて
やってみようと考え中。

教養としてVimを覚えて、XCodeをインストールしてみた。
でも、当然ながらVisualStudioはないの。
さてどうしようか。←今ココ

IDE選び・・・の前に

候補はいくつかある。

これからしばらく、いくつか比べながら、自分の手に合った
開発環境を作っていこうかと思う。

Eclipseに言いたいこと

Eclipseは使ったことがある。
GoogleSketchUp自動化用のrubyを書く事が、rubyをやってる大きな理由なんだけど、
そのためにEclipseを使うことがある。

でもね、嫌いなのEclipse

動作ももさっとしてるし、オイラが何を間違えてるのか、
エディタでソース書きながらDeleteキーを押すと、ファイルごと消そうとするし。
高度に隠ぺいされてる割には、全てを任せられない危うさがあるのが、
どうにも好きになれない理由だと思う。

IBMの誰かが作ってくれた、SketchUp API用のSDKがある、というのが
Eclipseを使うモチベーションだったのだけど、
rubyJavaと違い、ほぼサジェストが効かないので、
IDEの意味がない気がした。

Vimの人たち

Vimを高度に使う人たちは、Vim一本でコードを書いたりするらしい。
秀丸C++コンパイルするようなもんですニャ。

自分がIDE難民であることに気が付いた今、
Vimでやるのもひとつの手じゃないか?と考えているのも確か。

つか、Vimってエディタであって、開発環境じゃないよね。

開発に必要なものを考えよう

IDE統合開発環境)とは、以下のパーツによって成る。

これらを『統合』したツールが『統合開発環境』だということか。
この中で、IDEを使わないと機能の実現が厳しいものは、いくつもある。

GUIエディタ
テキストエディタだけでは無理。
自動テスト実行環境
プライベートアクセサの自動生成、やってもらうには、
リフレクションとかしてくれるツールが必要。
ブレークポイントが使えるデバッガ
Vimでもできる』という噂もあり、未検証。
エディタ+コマンドでやったら、そんなぴたっと止まるわけなさそうなんだけど。

これが使えるから、IDEはやめられない。そう思う。

その一方

基本的にプログラムは、文字列で書かれている。
文字列は、自動化されていない部分は、手で入力しないといけない(当たり前)。

つまり、開発環境の中でも、テキストエディタは、
最も人間に近いパーツなのだということ。

たまにしか使わない機能は、多少使い勝手が悪くても、
大して生産性に影響しない。

しかし、ソースコードを手打ちする部分は、
プログラミングの大部分を占めるだけに、
ものすごく生産性に影響するんじゃないか。

エディタの鍵は、補完にあり

ただのテキストエディタにはなくてもいいけど、
ソースコードエディタには、絶対にあって欲しい機能がある。

コード補完機能だ。
VSならインテリセンスだ。Eclipseならサジェストだ。
Vimで言えば、オムニ補完だ。

これがないと、生産性が激減する。
ここが物足りなかったのが、EclipseRubyの最大の欠点だ。

ないものを、いかに楽に作れるか

SketchUp APIのライブラリなんてマイナーな存在は、
結局自分でSDKを作る必要があるだろう。

そうなった時に、『いかにカスタマイズしやすいか』という要素は、
生産性にとってかなり重大な問題じゃないだろうか。

そのため、オムニ補完のカスタマイズができるVimは、
非常に魅力的な選択肢となった。
インテリセンスに慣れたオイラは、コード補完にこだわる。
エディタはVimに決まり。

IDEVimが最強?

ここまで考えてきたら、
Vimを外部エディタにしたIDEでやれば最強じゃないか?』
という考えが生まれた。

ファイル群をひとまとめにしてくれるとか、
管理のしやすさを考えると、やっぱりIDEからは離れられないかも。
と思うオイラ。

今のところ、IDE競争はこんな感じ。

× Eclipse
もっさり感があって、感触が悪い。あんまりRubyは相手にされてない。
勝手がわからなくて落ち着かない。
Xcode
Appleだけあっておしゃれ。動作もさくっとしている。
やりたいカスタマイズができれば、本命かも。
NetBeans
まだ使ってない。インストールが失敗する謎。ねこび〜んがかわいい。
Eclipse使いが『遅い』と言うくらいだから、相当なのかも。

これから

NetBeansがインストールできないのをどうしよう・・・
RAMクリアして再挑戦してみよう。
買ったばっかのmacなのに、けっこうインストール失敗するので、
ちょっと悩ましい。

XCodeはもう少し調査。
どうやらRubyは使えるらしいので、問題はVimとの連携だけか。
デフォルトで画面のどこかに『Vim』って文字を見たので、
まあ大丈夫だろう。

IDEとエディタと道具のこと

勉強してること

さいきん、新しい言語をやりたくて、
あれこれと手を出している。
主にRubyFlash

Ruby

Rubyは数年うすーく関わっていて、Railsを勉強して本1冊やってみたりした。
もちろん、SketchUpスクリプトRubyなので、
『いつかはSketchUpプラグインを作って、ぐりぐり作れる快感を味わいたい』
という願いもある。

Flash

Flashは、ホントに最近ふと思いついて勉強しはじめた。
jQueryやったので、『えーいついでに』って感じ。
Flashが書けるようになりたい』というよりは、『UIのロジックに強くなりたい』という願望がある。

mac買って、始めること

最近、MacBookAirを買ったので、現在は環境を作ったりしてる。
で、考えてるのが、FlashRubyはどう作る?ということ。

普段の仕事はVisualStudio(以下VS)でC#をがりがり組んでる。
IDEの恩恵に浴しながら、毎日を過ごしているわけだけど。

VS以外のIDEをろくに使ったことないという弱点を抱えているオイラは、railsの勉強の時も、本の通りにテキストエディタ(たしか秀丸)で書いた。

当然、macにはVSはない。
じゃあどうすんの?どうすんのオイラ?

というわけ。

続きはWebで

いろいろな選択肢を検討するプロセスを通して、
オイラは『そもそも開発環境ってなんだろう』という、
あるていど根本的な考え事をしている。

この続きは、明日書こうと思う。

SQL通知の挫折

挫折

前回は、SQLの通知について書いた。
結局挫折してしまったので、その記録を残しておく。
まず、データベースにスクリプトを流し、エージェントを有効に。

(コードはあとで)



その後、コード内でイベントを書いてあれこれやってみたが、

データベースを変更してもイベントが発生しなかった。



具体的に何をやったかは後で整理する。

非常に悔しい・・・

App.xamlってのがあった

App.xamlとは?

WPFのプロジェクトに、見慣れないファイルがあることに気付いた。
App.xamlとApp.xaml.csである。
ちなみにメインウィンドウのファイル名は、Window1.xaml


中身をみると、ちょびっとしか書いてない。

なんだコレ?いらないんじゃないの?
と思い、削除する。

リビルド。
ビルドが通らない。
慌ててごみ箱から拾ってプロジェクトに再度追加するのだが、
それでもビルドは通ってくれない。
非常に焦る。

オチはビルドアクション

ファイルのプロパティから、ビルドアクションを変更し、
【page】 →【ApplicationDefinition】に設定すると、
無事にビルドが通るようになった。

このオプションの中に、Mainメソッドが書いてあるんだ・・・
と思い、Window1を【ApplicationDefinition】にしてみる。
ビルドが通らない。

program.csのようなxamlファイルが、ひとつは必要って事なのね。

Bindingがうまくいかん

どうにもxamlとコードビハインドの関係がわからない。
下のふたつは同じものじゃないの?
どうしてPropertyChangedイベントが起きないのか不思議。
プロパティをTextBlockのTextにバインドして、コードビハインドから値を変えてるんだけど。

window1.xaml


<Window.Resources>
        <ObjectDataProvider x:Key="RootFolderDataProvider" >
            <ObjectDataProvider.ObjectInstance>
                <my:VideoCollection x:Name="videos" ></my:VideoCollection>
            </ObjectDataProvider.ObjectInstance>

        </ObjectDataProvider>
        <ObjectDataProvider x:Key="ElectricityDataProvider">
            <ObjectDataProvider.ObjectInstance>
                <my:ElectricityGeneratingEntity x:Name="electricity" ></my:ElectricityGeneratingEntity>
            </ObjectDataProvider.ObjectInstance>
        </ObjectDataProvider>
    </Window.Resources>



window1.xaml.cs

((System.Windows.Data.ObjectDataProvider)(this.FindResource("ElectricityDataProvider"))).ObjectInstance as ElectricityGeneratingEntity;

データベースの変更が通知できるのね

おかわりありませんか? −SqlDependency

今回の作品では、5秒ごとに更新されるデータベースの値に追随する必要がある。
じゃあちょいちょいコマンドを飛ばそうかと思っていたのだが、
有益な情報を得たのでメモメモ。

わんくまBBS


なんでも、SQLServer上で値が更新された事を、
クライアントに通知してくれる機能があるらしい。
(実際には、1プロセスを占有してクライアントが監視し続けるんだそうな)

さっそく試してみよう

msdnのチュートリアルを見つけ、さっそく書いてみることに。

かりかり。


動作させてみた

どれどれ。実行!

無題
NotSupportedException はハンドルされませんでした。
通知機能を使用するにはSQL Server 9.0以降が必要です。
がくり。

そうか・・・開発環境はSQL Server 2000だった。
本番環境は最新だったはずだけど、テストできないと辛いな・・・


使ったソースコード

msdnから拾ったコードを乗せとく。いつかまた見たくなるかも知れないので。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10. using System.Security.Permissions;
  11. namespace SqlNotifyingTest
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. }
  19. // Following are the declarations used in this program.
  20. private string statusMessage;
  21. private DataSet myDataSet = null;
  22. private SqlConnection connection = null;
  23. private SqlCommand command = null;
  24. private string connstr;
  25. private void button1_Click(object sender, EventArgs e)
  26. {
  27. // Remove any existing dependency connection, then create a new one.
  28. connstr = "Data Source=MANHATTAN;Initial Catalog=SolarMonitorMobile;Persist Security Info=True;User ID=sa;Password=81at84;";
  29. string ssql = "select * from THATSUDEN_KIROKU ";
  30. SqlDependency.Stop(connstr);
  31. SqlDependency.Start(connstr);
  32. if (connection == null)
  33. connection = new SqlConnection(connstr);
  34. if (command == null)
  35. command = new SqlCommand(ssql, connection);
  36. if (myDataSet == null)
  37. myDataSet = new DataSet();
  38. GetAdvtData();
  39. }
  40. private void GetAdvtData()
  41. {
  42. myDataSet.Clear();
  43. // Ensure the command object does not have a notification object.
  44. command.Notification = null;
  45. // Create and bind the SqlDependency object to the command object.
  46. SqlDependency dependency = new SqlDependency(command);
  47. dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
  48. using (SqlDataAdapter adapter = new SqlDataAdapter(command))
  49. {
  50. adapter.Fill(myDataSet, "THATSUDEN_KIROKU");
  51. dataGridView1.DataSource = myDataSet;
  52. dataGridView1.DataMember = "THATSUDEN_KIROKU";
  53. }
  54. }
  55. private bool EnoughPermission()
  56. {
  57. SqlClientPermission perm = new SqlClientPermission(PermissionState.Unrestricted);
  58. try
  59. {
  60. perm.Demand();
  61. return true;
  62. }
  63. catch (System.Exception)
  64. {
  65. return false;
  66. }
  67. }
  68. private void Form1_Load(object sender, EventArgs e)
  69. {
  70. // TODO: このコード行はデータを 'solarMonitorMobileDataSet.THATSUDEN_KIROKU' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
  71. this.tHATSUDEN_KIROKUTableAdapter.Fill(this.solarMonitorMobileDataSet.THATSUDEN_KIROKU);
  72. }
  73. delegate void UIDelegate();
  74. private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
  75. {
  76. UIDelegate uidel = new UIDelegate(RefreshData);
  77. this.Invoke(uidel, null);
  78. //Remove the handler as it is used for a single notification.
  79. SqlDependency dependency = (SqlDependency)sender;
  80. dependency.OnChange -= dependency_OnChange;
  81. }
  82. private void RefreshData()
  83. {
  84. // Since the code is executing on the UI thread,it is safe to update the UI.
  85. label1.Text = "Database had some changes and are applied in the Grid";
  86. // Reload the dataset that is bound to the grid.
  87. GetAdvtData();
  88. }
  89. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  90. {
  91. SqlDependency.Stop(connstr);
  92. if (connection != null)
  93. connection.Close();
  94. }
  95. }
  96. }

Author: Balamurali Balaji MVP

WPFの勉強始めた

WPFあれやこれや

WPFWindows Presentation Foundation)の勉強を始めた。 これから、見栄えのよいアプリを作らないといけないので。

今日覚えた事など、つらつら書いていこうかなと思う。 まず・・・ C#XAMLで書く。 これは、SilverLightをちらっとかじりかけたので、なんとなくわかる。
  • リソース
  • スタイル
  • テンプレート

このあたりは初耳だ。よく勉強してみる。 なになに・・・

リソース

複数の要素で、ひとつのオブジェクトを共有するための仕組み ex:背景色用のブラシを2つのボタンで使い回す、など


リソースには2種類ある

  1. アセンブリ・リソース
  2. アセンブリにバイナリファイルを埋め込むもの。バイナリリソース。
  3. オブジェクト・リソース
  4. 今回メインで説明するリソース。普通リソースといえばこれ。 <window>など、FrameworkElement継承クラスのプロパティとして定義

 

外部リソースというのも

ルート要素がResourceDictionary型のXAMLファイルを別途用意し、
そのXAMLファイルを取り込む事もできる

スタイル


概要

  • HTMLのCSSに相当
  • Setter要素のリストとして定義

適用方法

FrameworkElementクラスにはStyle属性があり、 これに値を入れるとスタイルが設定できる

リソース内でスタイルを定義する事もできる。 特に、リソース中にx:Key属性を持たない(匿名の)スタイルを作ると、 TargetTypeプロパティで指定した型の要素すべてに自動設定される。