IDEについて考えたこと(続き)
きのうまでの話
きのうの続き。
プログラムの開発環境について書く。
オイラは普段、VisualStudioの恩恵にどっぷり浴しながら
C#を書くプログラマです。
今回macを買ったので、rubyやらFlashやら、もっと本腰を入れて
やってみようと考え中。
教養としてVimを覚えて、XCodeをインストールしてみた。
でも、当然ながらVisualStudioはないの。
さてどうしようか。←今ココ
Eclipseに言いたいこと
Eclipseは使ったことがある。
GoogleSketchUp自動化用のrubyを書く事が、rubyをやってる大きな理由なんだけど、
そのためにEclipseを使うことがある。
でもね、嫌いなのEclipse。
動作ももさっとしてるし、オイラが何を間違えてるのか、
エディタでソース書きながらDeleteキーを押すと、ファイルごと消そうとするし。
高度に隠ぺいされてる割には、全てを任せられない危うさがあるのが、
どうにも好きになれない理由だと思う。
IBMの誰かが作ってくれた、SketchUp API用のSDKがある、というのが
Eclipseを使うモチベーションだったのだけど、
rubyはJavaと違い、ほぼサジェストが効かないので、
IDEの意味がない気がした。
Vimの人たち
Vimを高度に使う人たちは、Vim一本でコードを書いたりするらしい。
秀丸でC++をコンパイルするようなもんですニャ。
自分がIDE難民であることに気が付いた今、
Vimでやるのもひとつの手じゃないか?と考えているのも確か。
つか、Vimってエディタであって、開発環境じゃないよね。
開発に必要なものを考えよう
- ソースエディタ
- GUIエディタ
- コンパイラ(+リンカ)/インタプリタ
- デバッガ
- 自動テスト実行環境
- ソースコード管理ツール
- リファクタツール
- 相互に関連するファイル群をまとめる機能(プロジェクトファイル)
これらを『統合』したツールが『統合開発環境』だということか。
この中で、IDEを使わないと機能の実現が厳しいものは、いくつもある。
- GUIエディタ
- テキストエディタだけでは無理。
- 自動テスト実行環境
- プライベートアクセサの自動生成、やってもらうには、
リフレクションとかしてくれるツールが必要。 - ブレークポイントが使えるデバッガ
- 『Vimでもできる』という噂もあり、未検証。
エディタ+コマンドでやったら、そんなぴたっと止まるわけなさそうなんだけど。
これが使えるから、IDEはやめられない。そう思う。
その一方
基本的にプログラムは、文字列で書かれている。
文字列は、自動化されていない部分は、手で入力しないといけない(当たり前)。
つまり、開発環境の中でも、テキストエディタは、
最も人間に近いパーツなのだということ。
たまにしか使わない機能は、多少使い勝手が悪くても、
大して生産性に影響しない。
しかし、ソースコードを手打ちする部分は、
プログラミングの大部分を占めるだけに、
ものすごく生産性に影響するんじゃないか。
エディタの鍵は、補完にあり
ただのテキストエディタにはなくてもいいけど、
ソースコードエディタには、絶対にあって欲しい機能がある。
ないものを、いかに楽に作れるか
SketchUp APIのライブラリなんてマイナーな存在は、
結局自分でSDKを作る必要があるだろう。
そうなった時に、『いかにカスタマイズしやすいか』という要素は、
生産性にとってかなり重大な問題じゃないだろうか。
そのため、オムニ補完のカスタマイズができるVimは、
非常に魅力的な選択肢となった。
インテリセンスに慣れたオイラは、コード補完にこだわる。
エディタはVimに決まり。
IDEとエディタと道具のこと
勉強してること
mac買って、始めること
最近、MacBookAirを買ったので、現在は環境を作ったりしてる。
で、考えてるのが、FlashとRubyはどう作る?ということ。
普段の仕事はVisualStudio(以下VS)でC#をがりがり組んでる。
IDEの恩恵に浴しながら、毎日を過ごしているわけだけど。
VS以外のIDEをろくに使ったことないという弱点を抱えているオイラは、railsの勉強の時も、本の通りにテキストエディタ(たしか秀丸)で書いた。
当然、macにはVSはない。
じゃあどうすんの?どうすんのオイラ?
というわけ。
続きはWebで
いろいろな選択肢を検討するプロセスを通して、
オイラは『そもそも開発環境ってなんだろう』という、
あるていど根本的な考え事をしている。
この続きは、明日書こうと思う。
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から拾ったコードを乗せとく。いつかまた見たくなるかも知れないので。- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Data.SqlClient;
- using System.Security.Permissions;
- namespace SqlNotifyingTest
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- // Following are the declarations used in this program.
- private string statusMessage;
- private DataSet myDataSet = null;
- private SqlConnection connection = null;
- private SqlCommand command = null;
- private string connstr;
- private void button1_Click(object sender, EventArgs e)
- {
- // Remove any existing dependency connection, then create a new one.
- connstr = "Data Source=MANHATTAN;Initial Catalog=SolarMonitorMobile;Persist Security Info=True;User ID=sa;Password=81at84;";
- string ssql = "select * from THATSUDEN_KIROKU ";
- SqlDependency.Stop(connstr);
- SqlDependency.Start(connstr);
- if (connection == null)
- connection = new SqlConnection(connstr);
- if (command == null)
- command = new SqlCommand(ssql, connection);
- if (myDataSet == null)
- myDataSet = new DataSet();
- GetAdvtData();
- }
- private void GetAdvtData()
- {
- myDataSet.Clear();
- // Ensure the command object does not have a notification object.
- command.Notification = null;
- // Create and bind the SqlDependency object to the command object.
- SqlDependency dependency = new SqlDependency(command);
- dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
- using (SqlDataAdapter adapter = new SqlDataAdapter(command))
- {
- adapter.Fill(myDataSet, "THATSUDEN_KIROKU");
- dataGridView1.DataSource = myDataSet;
- dataGridView1.DataMember = "THATSUDEN_KIROKU";
- }
- }
- private bool EnoughPermission()
- {
- SqlClientPermission perm = new SqlClientPermission(PermissionState.Unrestricted);
- try
- {
- perm.Demand();
- return true;
- }
- catch (System.Exception)
- {
- return false;
- }
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- // TODO: このコード行はデータを 'solarMonitorMobileDataSet.THATSUDEN_KIROKU' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
- this.tHATSUDEN_KIROKUTableAdapter.Fill(this.solarMonitorMobileDataSet.THATSUDEN_KIROKU);
- }
- delegate void UIDelegate();
- private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
- {
- UIDelegate uidel = new UIDelegate(RefreshData);
- this.Invoke(uidel, null);
- //Remove the handler as it is used for a single notification.
- SqlDependency dependency = (SqlDependency)sender;
- dependency.OnChange -= dependency_OnChange;
- }
- private void RefreshData()
- {
- // Since the code is executing on the UI thread,it is safe to update the UI.
- label1.Text = "Database had some changes and are applied in the Grid";
- // Reload the dataset that is bound to the grid.
- GetAdvtData();
- }
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- SqlDependency.Stop(connstr);
- if (connection != null)
- connection.Close();
- }
- }
- }
Author: Balamurali Balaji MVP
WPFの勉強始めた
WPFあれやこれや
WPF(Windows Presentation Foundation)の勉強を始めた。 これから、見栄えのよいアプリを作らないといけないので。
今日覚えた事など、つらつら書いていこうかなと思う。 まず・・・ C#とXAMLで書く。 これは、SilverLightをちらっとかじりかけたので、なんとなくわかる。- リソース
- スタイル
- テンプレート
このあたりは初耳だ。よく勉強してみる。 なになに・・・
リソース
複数の要素で、ひとつのオブジェクトを共有するための仕組み ex:背景色用のブラシを2つのボタンで使い回す、など
リソースには2種類ある
- アセンブリ・リソース アセンブリにバイナリファイルを埋め込むもの。バイナリリソース。
- オブジェクト・リソース 今回メインで説明するリソース。普通リソースといえばこれ。 <window>など、FrameworkElement継承クラスのプロパティとして定義
外部リソースというのも
ルート要素がResourceDictionary型のXAMLファイルを別途用意し、
そのXAMLファイルを取り込む事もできる
スタイル
概要
- HTMLのCSSに相当
- Setter要素のリストとして定義
適用方法
FrameworkElementクラスにはStyle属性があり、 これに値を入れるとスタイルが設定できる
リソース内でスタイルを定義する事もできる。 特に、リソース中にx:Key属性を持たない(匿名の)スタイルを作ると、 TargetTypeプロパティで指定した型の要素すべてに自動設定される。