12/08/2010
Rubyの良い教材
Rubyの良い教材。それは高品質で低価格であること。
そんな我侭な要望を満たす様なカリキュラムがあるのです。
OSSモデルカリキュラム導入実証
ここで公開されている資料はとてもよくまとまってるので、便利である。さらにPDFなので、iPadなどで閲覧するのにうってつけである。
カリキュラムも段階をおっていて、自学習するのにもよい。
これ以外にも公開されているカリキュラムもあるので、合わせて学習してみたら良いと思う。
ちなみに私も現在Rubyの勉強中であり、ここの資料を拝借させていただいている。
主目的としてはRedmineのカスタマイズを行うためである。
Redmineのガントチャートの制御と、Pluginがなぜ動作しなくなるのかを知りたくて勉強している。呼び出しのメソッドが変わったりすると動かなくなるというのは分かる。では翻ってどうすれば正しく動くように修正できるのか。つまりは有用であるが、保守された無くなってしまったPluginを復活させたり、改修したいのである。
11/23/2010
Doxygenによる開発のカンフル
- 出力ファイルで文字化けが起こること。
- 入力ファイルが読み込めないこと。
- ファイルの検索がうまくされないこと。
11/15/2010
SilverlightのDataBinding
11/13/2010
Silverlight Sketchflowの変換
実稼動プロジェクトに変換
http://msdn.microsoft.com/ja-jp/library/ee371158(Expression.30).aspx
11/06/2010
Google C++ Test Framework
最近Google C++ Test Framework(以下googletest)を いまさら 導入してみました。
googletestはxUnitの流れをくむTestのFrameworkで少しでもxUnit系のテストについての知識があれば、すぐに使えるという触れ込みです。とりあえず公式な情報を翻訳したサイトで勉強すれば、何とかわかります。ちょっと面白いのは、OpenCVのドメインでGoogleTestDocsの日本語訳がホストされていることかなぁ。
肝心の使い方は、公式に書かれているので、割愛しますが、ちょっと読み解くときに面倒に感じたことをいくつか。
- メジャーなコンパイラのためにはすでに特別なプロジェクトが用意されているので、それを利用すること。MSVCとかG++とかは用意されているので、それを利用すればいいので、Cmakeを利用しなくてもいいこと。ただしCmakeを利用した生成もサポートされているので、そちらを利用してもいい。
- MSVCに限らないと思うが、Runtimeの種類で別のSolutionが用意されている。たとえば、マルチスレッドとマルチスレッドDLLで別のRuntime体系になるので、別のSolutionが用意されていて、基本的にはマルチスレッドになっている。なので、MSVCの人でMDdとかMDのRuntimeを使う人は、gtest_md.slnを利用する。
- MSVCはテスト用のプロジェクトにgtest.projもしくはgtest_md.projをプロジェクトに含めて、テスト用のProjectはその追加したgoogletestのProjectへの依存関係を作ることが必要である。
- TEST_Fを使う場合には事前に::testing::Testクラスを継承したクラスをつくる必要性がある。TEST_F(test_fixture, test_name)でtest_fixtureの部分には利用したい::testing::Testを継承したクラス名を使う。またTest部分ではクラス内部のように変数を扱ってテストできる、はず。
- ::testing::Testの仮想メソッドにはSetup(),TearDown()があるが、名前は厳密に継承元にある奴でないと動作しない。(当たり前) またそれぞれのクラスの利用のタイミングであるが、それぞれデフォルトコンストラクタやデストラクタでは利用できない仮想メソッドや例外が発生しやすいメソッドの利用などの場合には、利用する価値が出てくると思う。この質問に対する回答もある。
10/11/2010
継承関係ということについての試論
ちゃんとOOPを学習していないのですし、該当する書籍を読み込んでいないのでなんともいえませんが、軽症という事象にはいくつかの要因があるのではないかと推察します。
- インターフェイス
- 実装
- データ構造
この3要素があると思う。
よく考えずにこれらをごっちゃにして継承をさせていくとどこかで使いにくさが出てくるように思われる。さらにいうとデータ構造の部分が特に危険だと感じています。
インターフェイスの継承は一般的なOOPでの利用に関して合致しそうです。多態性の文脈に合致します。
実装の部分は、特化したインターフェイスを生かし続ける形で実装しないといけないのでとてもナイーブな感じがします。
データ構造に関しては実に困難さを覚えるのですが、多態のためにサブクラス分化するとあまりにクラスが分割されすぎる気もしますし、それぞれの振る舞いがデータ構造に依存しているときにはやりようがないのですが、うまくまとめないと理解しにくくなりすぎる感があります。
どうすりゃいいんだ。OOPはあまりに強い困難さを覚えます。設計ということに向いていないのかもしれない、、、データ構造と実装があまりに緊密になっている感が。。。でもデータ構造が抽象された実装はアルゴリズムとなっているなぁ。。。
インターフェイスはある意味ではさらにもう一層上のレベルでの継承関係をあらわすのかもしれない。
そう仮定すると、COMやインターフェイス志向の記述は、実装を含めたデータ構造を抽象化したものであり、これは一層抽象度が高いので変更可能性強度が増すと思う。
10/10/2010
MacでBoostを使う
とりあえず、作業をする前に調べてみる。
■[Macプログラミング][Boost]MacにC++の高速ライブラリBoostをインストールしたCommentsAdd Startomisima
Mac でBoostCommentsAdd Star
手始めに調べておいていれてみる。いろんなところで実践実践。
2010/10/11 0:14:45
XCodeの最新版を導入
MacPortの導入
導入後にUpdateをかける
BoostJamの導入
Boostの導入<ここでError発生 ちなみにMacOSX SnowLeopard
DEBUG: Changing to port directory: /opt/local/var/macports/sources/rsync.macports.org/release/ports/devel/boost
DEBUG: OS darwin/10.4.0 (Mac OS X 10.6) arch i386
DEBUG: org.macports.load registered provides 'load', a pre-existing procedure. Target override will not be provided
DEBUG: org.macports.unload registered provides 'unload', a pre-existing procedure. Target override will not be provided
DEBUG: org.macports.distfiles registered provides 'distfiles', a pre-existing procedure. Target override will not be provided
DEBUG: Reading variant descriptions from /opt/local/var/macports/sources/rsync.macports.org/release/ports/_resources/port1.0/variant_descriptions.conf
DEBUG: universal variant already exists, so not adding the default one
DEBUG: Starting logging for boost
Error: Cannot install boost for the arch(s) 'x86_64' because
Error: its dependency zlib is only installed for the arch 'i386'
Error: and the configured universal_archs 'i386 ppc' are not sufficient.
DEBUG: architecture mismatch
while executing
"macports::_upgrade_mport_deps $mport $target"
(procedure "mportexec" line 26)
invoked from within
"mportexec $workername $target"
Error: Unable to execute port: architecture mismatch
おいおいどうすればいいんだよ。。。
2010/10/11 1:53
なんとなくだけど、
$port varibants boost
でオプションを調べて、
universalを確認してから
$sudo port install boost +universal
ってやるとなんか依存関係もまとめて調べてくれるから、何とかなりそう。
でもBoostのBuildにかかる時間がすげーなげー。か?
2010/10/11 09:51
放置しておいて、朝見たら、Build終わっていた。
---> Computing dependencies for boost
---> Fetching boost
---> Verifying checksum(s) for boost
---> Extracting boost
---> Configuring boost
---> Building boost
---> Staging boost into destroot
---> Installing boost @1.44.0_0+universal
---> Activating boost @1.44.0_0+universal
---> Cleaning boost
とりあえず導入まではできた。
std::vectorは連続領域なのか?
http://cranehouse.dojin.com/program/vector.html
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/
ここの二つでなんか問題は解決できそうですな。
それにしても、言語の仕様書を読んだのが初めてというへたれっぷり。C#さんの仕様書でも探し読もうかなぁ。
あと先ほどのリンクにあげたS34って会社が大阪にあるので、ちょっと興味ありかも。
10/08/2010
Code Kata的な 練習
// Kata000.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include
#include
#include
#include
#include
void foreachMethod(const size_t& size)
{
boost::progress_timer t;
using namespace boost::lambda;
using namespace std;
vectortmpArray(size);
tmpArray[50] = 200;
boost::progress_display show_progress( tmpArray.size());
for_each(
tmpArray.begin(),
tmpArray.end(),
(_1 + 1) );
}
void forMethod(const size_t& size)
{
boost::progress_timer t;
using namespace std;
vectortmpArray(size);
tmpArray[50] = 200;
boost::progress_display show_progress( tmpArray.size());
for( size_t i = 0; i < tmpArray.size(); i++){
int itt = tmpArray[i] + 1;
++show_progress;
//cout << tmpArray[i] << endl;
}
}
void foriterMethod(const size_t& size)
{
boost::progress_timer t;
using namespace std;
vectortmpArray(size);
tmpArray[50] = 200;
boost::progress_display show_progress( tmpArray.size());
for(
vector::const_iterator i = tmpArray.begin();
i != tmpArray.end(); i++){
int itt = *i + 1;
++show_progress;
//cout << *i << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
const size_t size(1000000);
foreachMethod(size);
forMethod(size);
foriterMethod(size);
return 0;
}
とりあえずいえるのは、VS2008のReleaseならforeachがはやい。Debugならforが早い。とりあえずどれでもイテレータは遅い。でもこの場合に重要な点は、こんな単純なケースで通常のイテレータ回しはあまり有用ではない、という点と、イテレータでの制御はもっと凝ったもののほうがいいかもしれない。とりあえずforeachすげー。投げる要素数が増えるとかなり露骨に早くなる。
9/18/2010
WinSxSについて
今日はVC++2005から導入されているManifestについての再配置について。
VC++2005以上でコンパイルされたプログラムは、以前存在していたDLL地獄に対応するために、ManifestによるDLLの選択という機構を取り入れました。
これによって起こっている問題は、VC++2003以前でコンパイルして、配布する際には、プライベートアセンブリや共有DLLは同名のDLLファイルが存在していれば、動作できるのです。しかし、これは正しいDLLかどうかは保障されませんでした。DLL地獄の本当のところは調べれば出てきますので、割愛します。
とりあえず手っ取り早く配布をしたい場合には、以下の手順を踏めばいけます。
・VSコマンドプロンプトでmt.exeを動作させます。
・mt.exe -inputresource:
・分離されたManifestに記述されているDLLを集めます。
・DLLの場所はVisualStudio/VC/redistのところにある場合とWINDOWS/WinSxSにあります。そこから該当するものを取得します。
・WinSxSの場合には、該当するDLLとそのDLLに合致するManifestが必要になります。ManifestファイルはManifestフォルダにあります。ここから取得します。
・アプリケーションを入れるディレクトリにEXEとDLLと同じフォルダ内に、最初に取得したManifestのName属性に記述されている名前と合致するようにフォルダ名を変更して、そこにDLLとそのDLLのためのManifestを入れます。
これでたいてい動きます。それでもWinSxSのエラーが出るときには、コントロールパネル:コンピュータの管理:イベントビュアーにエラーログがでますので、そこから、問題のDLLを調べることができます。
またmt.exeを利用しなくても、VSのソリューションにExeやDLLを登録して、開くとリソースビューが開き、MT_MANIFESTとかかれている項目があります。そこにEXEなら1、DLLなら2と書かれた項目が格納されていますので、それを開きます。その際に表示された文字列が埋めこまれたManifestになります。これは最初に分離したものと同じになります。
またMSDNで記述されているようなDLLのライブラリをフォルダに入れて云々は、Manifestファイルに記述されていない際には、EXEと同じ階層に置くようになりますので、この方法から除外されます。しかしながらDLLのManifestのほうも問題がありますので、そこも要調整になります。
7/27/2010
ベクトル解析
いまさらベクトル解析に本格的に取り掛かりました。
学部自体に専門ではなかったので、特に勉強もせずにすごしていました。これはなかなか興味深いですね。陰関数の特性やスカラー積が何を現しているのかとか、ベクトル積がどういう意味をもつのか。じっくりと基礎の基礎にあたってみるのは、実に価値がある。
同様にこのような基礎に対して、教師なしで学習することができるだけの地力がまだ自分にあることが喜ばしいと感じました。高等教育を受けさせてもらえたことをとても感謝しています。と同時に、高等教育を受けても、その教育が役に立たない、勉強はもう終わりと思っている方が多く見られるのが悲しいです。
Visual Studio 2008 コメント付けについて
7/22/2010
Silverlight 覚書
6/27/2010
DBの覚書
DBの開発に関する選択肢として、Access、SQLite、PostgreSQLを挙げてみる。
AccessはMicrosoftの製品であり、比較的容易にデータベースを構築出来る。
SQLiteはPublicLicenseであり、ソースもすべて手に入る。
PostgreSQLも似たようなものだが、最近人気になりつつある?MySQLがライセンスが変更されたことによる代替か?
AccessはRDBMSではあるらしいが、データベーストリガとストアドプロシージャがない。
SQLiteはアプリケーションに組み込んで使うタイプのDBMSである。
PostgreSQLがRDBMSとして手軽に利用できるもののようであるが、よく分からない。
RDBMSはコッドの12の法則に準拠してることが必要らしい。
ACIDとかいろいろ定義はあるんだろうけど、DBをやるなら本気で腰をすえていろいろいじらないとTuneUpできそうにない。
SQLite
MicrosoftAccess
Firebird
関連データベース管理システム
Silverlight Error Code 2104
6/21/2010
拡張保護を使用した統合 Windows 認証ってなんだ?
http://msdn.microsoft.com/ja-jp/library/dd639324(v=VS.90).aspx
http://msdn.microsoft.com/ja-jp/library/dd470100(VS.95).aspx
Extended Protection for Client Applications
6/20/2010
Windows7でのマルチタッチ開発での問題
6/12/2010
Webサービスを利用する際の大容量データの受信について
ちょいと失念してしまうことをいくつか。
http://msdn.microsoft.com/ja-jp/library/aa480521.aspx
大量データに対する戦略 - MSDN
ここに書かれているのですが、
今回はぶち当たったのは、SOAPで提供されているサービスである特定のリクエストに対して大容量データを返す場合に、エラーが起きて受信出来ない問題があったのですが、これは、VisualStudioを利用している場合には、Webサービス参照の追加でSOAPサービスなりを追加するのですが、ここで記述されるApp.configもしくはWeb.ConfigファイルにXML形式で記述されている部分で、受信サイズなどを決定している属性があるのですが、そこがデフォルトの値だとうまく処理ができなかった。
このデフォルト値には、意味があり、不用意な大容量データを受け取らないようにするためであり、基本的には問題にならない。しかし今回起こったような大容量データを受信しようとすると、そこで初めて属性情報に処理を止められると言う事態になる。
この一件を総括するならば、「ウィザードが作ってくれるものは、便利だが、その構築がむき出しの元になったときには困難が起こる」ということになるだろう。これは「達人プログラマ」でも指摘されていることで、悪い魔法使いの話だ。
よくよくデータを確認してみる必要性があるなぁとつくづく思った。
5/30/2010
SilverlightにおけるCustom Template Controlの作り方について
- カスタムテンプレートは、再利用可能なユーザーコントロールの開発
- ユーザーコントロール継承は、再利用を含めないユーザーコントロールの開発
- TemplatePartAttributeなどのパラメータは今度の実装者がどういうパラメータをUIとして定義しているのかを知るための補助的な情報であること。メタデータとして定義されるので、当たり前ですが。
- GetTemplateChildというメソッドを使って、自身で定義したフィールド変数にそのコントロールへの参照を設定します。これをしないと煩雑な呼び出しがいっぱいなMFCみたいなことになるので、注意です。
5/23/2010
Webサービスのリファレンスの追加に関して。
Webサービスのリファレンスの追加に関して(VS2008)。
Webサービスの追加を行うと、こっそりReferenceファイルが生成されますが、定義から飛ばないと生成されたものを確認できません。定義を確認するとわかるのですが、クラスがpartialで定義されています。これが何を意味するのかと言うと、自動生成のファイルのバックエンドへ変更点を書き込むと更新時に修正、変更した部分を破棄されてしまうので、別ファイルで定義を明確に書いてねって事みたいです。
例えば、EntityのEntityDataという名前のクラスが取得される場合に、その中の要素はPropertyとして生成されます。これに対して、INotifyPropertyChangedを実装しようとします。しかしそれをReferenceに書いてしまうと、更新時に破棄されますので、別ファイルに名前空間に整合性を持たせつつ、PartialなEntityDataを定義します。あとはPartialのキーワードを利用して、各項目のOn
5/22/2010
DataGridとの憂鬱
MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Reflection;
namespace AgScheduler
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
var list = DataEntity.Users;
PropertyInfo[] infos = typeof(UserInfo).GetProperties();
//var q = (from rec in list
// select new { Name = rec.名前, Norma = rec.年計, Result = rec.実績 })
// .ToArray();
this.DataContext = infos.AsQueryable();
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
PropertyInfo[] infos = typeof(UserInfo).GetProperties();
this.dataGrid1.RowHeight = 30;
this.Foreground = new SolidColorBrush(Colors.Red);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
}
private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
public class hoge
{
public string Name { get; set; }
public double Norma { get; set; }
public double Result { get; set; }
}
}
MainPage.xaml
<UserControl
x:Class="AgScheduler.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"
xmlns:ctrl="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="800">
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="180" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="620*" />
</Grid.ColumnDefinitions>
<ctrl:DataGrid Name="dataGrid1"
ItemsSource="{Binding}" Grid.Column="2" Margin="0" AutoGenerateColumns="True"
SelectionChanged="dataGrid1_SelectionChanged" />
<Button Content="Help" Click="Button_Click"/>
</Grid>
</UserControl>
DataEntity.cs
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Linq;
namespace AgScheduler
{
public class DataEntity
{
public static UserInfo CreateUserInfo()
{
return new UserInfo()
{
ID = 0,
実績 = 80,
年計 = 1200,
名前 = "テスト太郎"
};
}
public static IQueryableUsers {
get
{
var list = new List();
list.AddRange(new UserInfo[]{
CreateUserInfo(),
CreateUserInfo(),
CreateUserInfo(),
CreateUserInfo(),
CreateUserInfo(),
CreateUserInfo(),
CreateUserInfo(),
CreateUserInfo()
});
return list.AsQueryable();
}
set { }
}
public static IQueryableProjects { get; set; }
}
public class UserInfo
{
public int ID { get; set; }
public string 名前 { get; set; }
public double 年計 { get; set; }
public double 実績 { get; set; }
}
public class ProjectInfo
{
public int ID { get; set; }
public string ProjectName { get; set; }
public double ProjectAmount { get; set; }
}
}
明示的なデータ構造がわかるものじゃないと中身を表示してくれないし、そもそもPropertyInfoは中身を表示してくれない。意味がわからない。無名構造体でも表示はしてくれない。どういうことだ。適応のさせかたのどこかで間違えたことは確かなのだが、どこかわからない。無名構造体が使えないのでは、DataGridに動的にデータを適応しようと思うと困るのだが。
5/19/2010
Codeの表示のテスト
MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Reflection;
namespace AgScheduler
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
var list = DataEntity.Users;
PropertyInfo[] infos = typeof(UserInfo).GetProperties();
var q = (from rec in DataEntity.Users
select new
{
Name = rec.名前,
Product = rec.年計,
Amount = rec.実績
}).AsQueryable();
this.dataGrid1.ItemsSource = q;
this.dataGrid1.UpdateLayout();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
}
private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}
5/16/2010
Silverlightにおける各種画像のエンコード、デコード
BMPでしか保存出来ないのに、BMP読めないじゃん
5/14/2010
ADO.NETのあれこれ
そもそもEntityを生で扱うとめんどくさいことになるので、困りますね。
5/11/2010
LINQ
LINQはここがめちゃくわしい。
日向ぼっこデベロッパhandcraftの備忘録
http://handcraft.blogsite.org/ComponentGeek/ShowArticle/66.aspx
5/10/2010
ADO.NET Data Service のデータの追加、削除、更新
どうもJudaです。
ADO.NET Data Service のデータの追加、削除、更新についてのサイト
ADO.NET Data Services Part 7: Data Modification - Client
http://lostintangent.com/2007/12/30/adonet-data-services-part-7-data-modification-client/
こりゃ詳しい。
5/06/2010
ADO.NET Data Serviceについて
どうもJudaです。
ADO.NET Data Servicesについてですが、主キーでNot NullableなAutoIncrimentなカラムの値の設定方法ですが、どうも値を自動で上書きされるようです。
それ以上に注意しないといけないのは、Entity FrameworkのEntity Data Modelで接続部分をになってくれる構造体群に対しては、接続元になっているDBの各列の型、既定値、Null許容かなどの、「SQL Expressでつくったから、Wizardがやってくれている」と幻想をいだいているものは大半がダメです。そげぶされます。
明示的に設定するようにMSDNでも書いてあります。調べないとわからないのですけど、ちょっとはどこかに書いて欲しいものであります。
また失敗した場合のエラーログが欲しい場合は、Wizardが書いてくれているコードに対して、いくつかの属性を設定すればより詳しいエラーメッセージを得られるのですが、前に書いたのを忘れたので、探しています。属性についても本当に調べにくい。そのくせ、属性すごく重要。
それとLINQにはAutoIncrimentに関する操作は特にはないです。だから今度はUpdateで揉めそうです。うわー、嫌だなぁー。
5/05/2010
SilverlightとDBの連携
どうもJudaです。
Silverlight : ADO.NET Data Services (Silverlight)
http://msdn.microsoft.com/ja-jp/library/cc838234(v=VS.95).aspx
まぁ連携についての情報はここが一番詳しそうです。
ちなみに疑問になるのは、Entity Frameworkを利用した際に、Viewに該当するものは、基本的にUpdateやDeleteは出来ないのではないかと言うことであり、Wizardを通じて、AddTo
5/04/2010
SilverlightでのDataDrivenでの注意
プロパティの変更を通知するインターフェイスの実装をしているクラス
INotifyPropertyChangeでの注意。
文字列で指定するプロパティ名は、
別の参照されている部分で使われているバインディングパスの名前と
同一でないと機能しない。
だからバインドを統括するようなクラスをDataContextにして
それぞれ同じデータを別のエイリアスでつかっている場合には、
それら全てに適応できるように読み換えや
同時に複数の変更を通知するようにしないといけない。
本当はエイリアスのような使い方をする場合には
もっと気をつかった設計を行う必要性があると思われる。
もっともなるべく同一の名称になるようにクラスを調整する方が推奨されるだろう。
しかし今回のような注意点は、複数の提供元によって作成されたコントロール間で
協調させたい場合には、協調を制御する統括クラスにはそれなりの対応が求められる。
SilverlightでのXMLシリアライズ
どうもJudaです。
すまないが、XMLの書き出し、読み込みをもうちょっと簡単にしたい。
System.Runtime.Serialization.DataContractSerializer
をつかえば、なんとかなる。というか、なんとかできる。
でも正しい使い方なのかわからない。
とりあえずSilverlightでXMLを読み書きするときには、便利なクラス。
というか、XMLの解析をガチでやらせようと思うと、めんどくさくてくさくて、仕方がないです。
ありがとう、XMLの簡単な読み書き機能を作ってくれた開発者の方。
それにしてもXMLにある潜在的なセキュリティーホールとか怖いなぁ。まぁ、全ての入力はすべからく怖いのか。
4/29/2010
Silverlightとインターフェイスの話
XAMLの技術とInterfaceの親和性についての話。
XAMLで記述して、事前にデータバインディングのターゲットを固定させて、そこへのアクセスを確率できるようなInterfaceを公開することは有益なのだろうかと言う問から端を発しました。
試作段階に置いてXAMLで表示したいものと表示の形式がある程度固まると、そのバックエンドとなる部分で調整になると思います。その時に、もっとも合致する機能はInterfaceではないのかという思いつきですが、そこそこ有益だと思います。
Interfaceなら実装を保証させるので、それによってバインディングエラーを減らすことができます。ここで注意したいのは、XAMLのほうでTwoWayを採用するなら、Interfaceに必ずSetterを書いておく方が混乱が少ないのですが、それ以外のOneTime、OneWayの場合には、それはInterfaceで規約するのではなく、実装側の裁量に任せる方がいいとおもう。また、OneWay、TwoWayの場合にはINotifyPropertyChangedの継承が実装側で最終的に必要になるので、それも検討しておきたい。
別の話にはなるが、INotifyPropertyChangedでプロパティの変更を検知する処理を組み込んで、Setterなりを修正するのだけれども、この場合には、自作でSnippet、もしくはマクロを組むことが有効であると思う。大半のコードが同一になるので、これをおすすめしたい。しかしながら、簡易でPropertyを書いた場合、つまり get;set;のプロパティへの変更検知機能の追加はめんどくさい。なんとかならないのかと思っている。
話は戻るが、Interfaceの基本的な考え方とXAMLでのバインディングの記述の間にある程度の親和性があり、これを再利用出来る形で提供すると面白いのではないかと思う。しかしこれでは何が問題になるってくるのか、まではまだちゃんと確認出来ていない。Interfaceがそういう具体性を求めているのではないとすれば、この考え方はあまり良くないと思うが、個別の開発でフロントエンドとバックエンドを分離して開発するときには、いちいち名称の確認をとらなくてもよくなって、個人的にはいいと考えた。
4/26/2010
DataServiceKeyAttribute("ID")
どうもJudaです。
Reference.cs
[global::System.Data.Services.Common.DataServiceKeyAttribute("ID")]
こいつか。。。
昔おいらを苦しめたのは。。。。
追記;
あれ、違う。。。
4/25/2010
Silverlight Content Controlについて
どうもJudaです。
なんとなくですけど、Contentって名前は既に使われているので、これをそのまましようすることはできないので、DependencyPropertyでObjectで任意のコントロールを生成する。そしてPropertyのSetterで登録を行えば、なんとか認識して使用できますが、明確に登録するプロパティを使用しないイケないので、ちょいと見栄えが悪くなります。ここらへんはどうすればいいのかわからない。
SilverlightにおけるCustom Content Control
どうもJudaです。
Silverlight Custom Content Control
まさに掲題のとおり、Contentを表示したい時があります。
けれども簡単に行う方法はよくよく調べないとわかりません。Custom Template Bindingもひとつの手ですが、それもそれでなかなか大変なのです。(本当か?
Silverlight 2 のカスタム コントロールを作成する
うん、なんかいろいろめんどくさい。
3/27/2010
HgInitの試訳
どうもJudaです。
JoelがMercurialの入門手引きを書いたので、かっとなって日本語に訳してみた。最初の頁のとちゅうまでだけどね。
--以下訳--
私の会社にいるプログラマたちがSubversionからMercurialへ乗り換えることを決めたとき、ジョエル少年は混乱してしまった。
はじめに、あらゆる乗り換えるべきでないくだらない理由に付き合ってくれた。”私は中央サーバにリポジトリを保持すべきであり、それが安全だと思う。””君はしっているのか?君はあまり詳しくないだろうがMercurialでは全ての開発者が自らのハードディクス上にリポジトリ全体のコピーをもつんだよ。それは実際にはより安全だろう。なにより、大抵のMercurialを採用したチームは中央サーバもつかうし、君がBackupをとらなければならないという強迫観念にかられるようなら、そうしよう。また君は3層にもなるセキュリティー、Cylons、Stromtroopers、またはをささやかな開放的な領域を構築できるよ。"
"煩雑なバージョン管理によるトラブルはブランチすることによってすぐに起きてしまうし、ブランチをつくることは常に問題を起こす。””結局この考えも良くない。いずれ悪い結果がおきる。Subversionでブランチすることは問題を発生するのは、Subversionはマージ処理をおこなうのに十分な情報を持っていないからだ。Mercurialでは、マージは苦痛じゃないし、簡単だ、そしてブランチはありふれたことだし、害もない。
”そいつはいいね、つかってみるよ。でもとても僕には理解できるようには思えないよ”僕はJacobにMercurialでSubversionで行っていた事と同等のことをできるようにCheatSheetをつくってくれるように頼んだ。
いま、私はこのCheatSheetを君にみせれる、でもしない。それは数カ月のものあいだ混乱のもとだったからだ。
結局のところ、Subvesionをつかっていたとしよう、それは君の脳をすこし、えっと礼儀正しく言うにはどうすればいいのかな。その、イカれちまってる。おっとこれはよくない。君には少し再教育が必要になる。私が半年の間MercurialがSubvesionよりも複雑だと考えることによってイカれちまった部分を探してみた。でもそれは私がMercurialがどういう働きをするのか理解していなかったから、一度分かれば、ちんからほい、Mercurialはある意味簡単だ。
だから私は君のために手引書を書いている。この手引書では、慎重にSubvesionの意味で説明しないようにした。それもこれ以上の混乱のもとをなくすためだ。もう混乱のもとはたくさんだ。代わりにSubvesionからきた人たちのためにMercurialを勉強するために可能な限り綺麗な状態に戻そうと一章つかってやってみようと思う。
Subvesionを使ったことがないのなら、次の章にいくといいよ。見逃さないでね!
準備はいい?いくよ。ここで簡単なクイズ!
Q1. 初回で完璧なソースを書けますか?
もし君がはいと答えたら、君はとんでもない嘘つきだし、詐欺師だ。君は失格。また試験を受けてくれ。
新しいコードはバグに満ちている。ちゃんと働かせるには、すこし時間がかかります。その間の時間、チームの他の開発者の苦痛になります。
このとき、Subvesionはどのように働くか、
新しいコードをチェックインするとき、みんなトラウマコードを取得します。
君の書いた全ての新しいコードはバグだらけですので、君は悩みます。
バグのあるコードをチェックインして、他の開発者に苦痛を与える。
バグがなくなるまでの間、チェックインをしないようにする。
Subvesionは常にこの苦しいジレンマを起こします。リポジトリはバグで満ちている。新しいコードを入れてもバグを含むし、また新しいコードを管理しないならそれもバグだ。
Subvesionをつかうひとなら、このジレンマが存在しないことを想像できないでしょう。
Subversionをつかうチームはしばしば何日もあるいは何週間も何もチェックインしないことがある。Subversionチームでは、新入りはあらゆるコードをチェックインすることを恐れる。ビルドを壊してしまうこと、つまり年長の開発者のマイクさんやそういったお歴々を怒らせるを恐れる。マイクはすぐにチェックインによってビルドが壊れたことに腹を立てて、インターンのいるパーティションまでやってきて、彼の机の上のものを全部払いのけて、「てめぇはクビだ!」と叫ぶでしょう。(もっともそうならなくても、哀れなインターンはパンツを濡らしちゃいますけどね。)
あらゆるこの種のチェックインに関するおそれはみんながコードを何週もの間バージョン管理のご利益を得ずにソースを書くことをいみし、そしてこの状況に気づいたある年長の開発者がそれらをチェックインするように助けて回る。
どうしてバージョン管理が使えないのに、バージョン管理を導入したいと考えるだろう。
--ここまで訳--
確かにSubversionのジレンマはそのとおりだと思う。しかもこれでブランチを作りまくれば、まぁ大変になるのも仕方なし。とりあえずはやく全部読む。
ADO.NET Data Serviceにおける注意点
どうもJudaです。
ADO.NET Data Serviceの暗黙的な制約があるっぽいので、注意を。
このサービスを作るときに.svc.csファイルに記述をしていくと思いますが、この時に注意があります。基礎となるデータ構造へのアクセスを提供するIQueryable
追記
どうも原因が一定しないみたい。問題を捉えたと思ったら逃げられた。一箇所にデータを入れておいたのに、サービスが認識されない。要求エラーが表示されて、内部にエラーが潜在してしまう。作り方自体は、各種サンプルを参考にしているがどうしても問題点を捉え損なう。
バイナリ化しているものの参照がうまく行っていない気もするけれど、いかにしてそれを捕まえるのか分からない。最近こんなんばっか。はしごが外されている。
もいっちょ追記。
DataService
3/26/2010
3/25/2010
Silverlightのためのいくつかの話
Silverlightリファレンスブック
ASP.NET MVC実践プログラミング―.NET Frameworkによる標準Web開発技法
Silverlightで開発するデータ駆動アプリケーション
とりあえずこの3冊は現状で手に入る日本語のSilverlightまわりの書籍としてはとってもいい。
リファレンスブックは、「そうなんだよ、この実装をどうやるか知りたかったんだよ」っていうものがちらほら。
ASP.NETは、「そもそもSilverlightのクロスドメイン回避するWebサービスが必要だな」ってときに助かる。
データ駆動は、「Silverlightを使い倒してやる」っていうアプリケーション開発者にはぴったりな一冊。
ADO.NET Data Servicesに関する情報は少ないし、そもそもWebアプリケーションに関するビビッとくる本に未だ出会えていない。誰かご存じないですかねぇ。
3/24/2010
3/23/2010
いきなりSilverlightというか、WPFというか、
Bindingで使われるDependencyPropertyの話をMSDNの項目からかなり抜粋するが、
細かな部分だが結構込み入った使い方をする。
依存関係プロパティは、DependencyObjectに存在するPropertyのことで、
DependencyObjectプロパティストアに格納されている。
このプロパティストアを所有するDependencyObjectは、
public static readonlyで修飾されるDependencyProperty識別子を使って、識別される。
この依存関係プロパティを実装しようと思うと、通常のプロパティ(CLRプロパティ)をラップする必要性がある。
この依存関係プロパティがなぜ「依存関係」プロパティというのかという一因は、
あるプロパティが別のプロパティを値としてい持てるからであり、
実行時までその値を評価するのを遅延させることができ、
そのことによってプロパティに依存関係を作ることができるからである。
これはBindingとも関連する。
このプロパティを記法は似ているが、異なる添付プロパティが存在する。
例えば、Canvas.Leftのような個別のオブジェクトが所有していないプロパティである。
この添付プロパティの実装は、依存関係プロパティと似ているが、
設定された値が、自身ではなく、要素に対する付加的な意味合いがある。
カスタムしたイベント群を作っていこうと思うと、後半の添付プロパティをうまく使っていかないと、
XAMLで楽をできない。
ましてや、サポートされていない機能であるDrag&DropやDoubleClickの基本構造を適応していこうと思うと、
添付プロパティを使わなくてはとてもコーディングできると思えない。
ただイベントの登録をどうするのかが若干困りものではある。
大まかにはわかるのだが、
Propertyとして設定しようとして
そのプロパティを呼び出したときのオブジェクトを知らせてくれるならば、
オブジェクトとともにイベントハンドラを持てばいいのだろう。
関連付けさえうまくできればなんとかできそうではあるが、煩雑なことにはかわりない。
あとはListBoxからのDrag&Dropに関しても、内部で取得されるItemsSourceが不定であるので、
Converterを指定し、さらにDrag時の描画や、Dragのイベントなどの処理まで考えるとうんざりしてしまう。
ちょうどいいことにライブラリはあるのだが、Telerikのライブラリいいんだけど、10万も出せません><
でもこの機能で10万は安い買い物だと思います。
ちなみに体験版もあるので、ぜひ!
3/22/2010
Vimでのコメントアウトについて
どうもJudaです。
掲題の件に該当する記事のサルベージ
Vim Tip: Comment out multiple lines
commentout.vim : ソースをコメントアウト ←→ コメントアウト解除
とりあえず一番上の英語をオレオレ訳
Vimのプラグインなしで、一連の行をコメントアウトすることについて
ヴィジュアルブロックでコメントアウトしたい行を選択して、そのときに”I”を入力する。これは、選択した部分の頭に挿入を行うためだ。次にコメントアウト用の文字を入力する。PythonやShellなどなら#だ。そのあとでESCする。
頻繁には使わないけど、時々使う便利なVimコマンドを忘れてしまう。ブログに書けばいいのに。
君はヴィジュアルラインで選択したものについては別の方法を使える。 ”s/^/#”ってやつだ。
こいつなら行頭にコメントアウト用の文字をくっつけることをができるさ。
って感じか?
3/21/2010
電子書籍の新しい形をサービスへ
どうもJudaです。
前回描いた電子書籍の新しい形をやっぱりサービスにしたい。
友人と話をしていてとっても勇気づけられたから、なんとか夏までにサービスに原型を作る。
そのときに新しくあるといい機能が出たので、メモしておく。
- 本から別の本への参照機能
- 気に入った部分のリスト機能
- リスト公開機能
- 書籍の情報入力の簡易化
とりあえずメモの共有機能をやるとどうなるのかやってみる。
3/20/2010
電子書籍というよりも書籍型アプリについて
今日は面白そうだと思った。電子書籍のやり方をぽつぽつと。
まずはTweet抜粋
書籍化されたアプリ。。。これは、面白い。 これに追加して、他人のメモが挟まっていたりするとおもしろいのではないだろうか? http://bit.ly/abQUHL
書籍化されたアプリというニュアンスはとても心地いい。そしてそれはこれから電子書籍をどうしていくのかについて、とてもいい指針を表している。 VerUpしていく書籍ということを考えていたが、これにMedia機能を盛り込んでいくことによって、これまでの書籍とは価値の違う書籍を提供できる。
実はその手前に電子カルテを見据えている。これの普及が日本での鍵かな。日本の出版業界には期待していないので。
何を考えているのかというと、既存の紙媒体の書籍と電子書籍の棲み分け。既存の紙媒体をただ代替するだけでは、あまりに電子書籍という考え方は面白くないし、そもそも出版業界が邪魔をするのでうまく普及できない。日本ではKindleが対応していないが、一応EPUBという形式はあるが、普及はしていない。既存の紙媒体の特徴というのは
- 無電力
- 高い保存性
- 印刷したものは変化しない
- 可読性の高さ
- 自由度が高い
- 版組がきっちりしている
- 物理的なコンテナを持っている
- 紙の感触をもつ
- 重さがある
- 手に入れるまでに時間がかかる
- 索引があるけれど、検索はできない
- 電気を使う
- 電源を切ると見えなくなる
- 買った状態から書かれている内容が変わる
- 可読性は変化できる
- 自由度は制限される
- 版組を変更できる
- 書籍自体の物理的なコンテナはない
- 紙の感触はない
- 書籍自体としての重さはない
- オンデマンドに手に入る
- 索引がなくても、全文検索などができる。
さて話は戻るがここで一つ、試みを足してみる。それは他のメディアを補強するものとして、文字を使うことである。ちなみにこれはすでにペンギンブックスなどが試みている。しかし私は、この方向も面白いが、情報量的な制約によってできることとできないこともあるし、それ以上にこれでは書籍じゃない。雑誌のグラビアが動画になっているのもいいけれど、もっと猥雑さを足してみたい。
例えば書籍にメモを貼れるようにして、それをTwitterや、ニコニコ動画のようにみんなで共有する。現実の本で考えるならば、たくさんのポストイットが貼られている感じ。これがみんなで共有できるのは、オモシロイと思う。ブログに対してコメントを残していく事に比べて、敷居が下がるかどうかは、分からないが、動画にコメントをする行為が受け入れられているので、それほど悩ましい問題ではないかもしれない。
いままでこれをやろうとすると、どうしても同時性に欠けてしまったり、物理的に賃借しなければ読めないことなどがあるが、その問題は電子書籍ではなくなるし、そもそも本を読んでいる人の輪はネットワーク上で補填されるの、地理的な意味は薄くなる。
これは読者側の一体感や同時性を演出するための仕掛け。おなじコンテキストを共有することに対しての提案としての電子書籍。
もう一つ、書籍自体の改版のあり方について、変えてみたい。つまりはVerUpする書籍。あるいはBeta書籍。
現在の書籍は常に完成された形で生まれてきて、長い時間の間で若干の修正が入る。ServicePackがあたるようなもんだ。では、これをBetaで公開しましょう。Alphaで公開しましょう。もしこれを有償のサービスとしてやるなら、Alphaで参加した人は、Betaで参加した人よりも安く手に入り、作者は早い内から読者のFeedBackをもらえる。仮に完成したなら、それを書籍として物理的に発売してもいいだろう。これは、代謝の激しい技術書の世界で根づいてくれるなら、とても嬉しいサービスだ。
つまり技術書、とくにコンピュータ関係の書籍はVerUpによって変更がよく起きる。しかしそれは基本的なものを全部捨て去るほどのものではないし、次の版で、新しいVerのことが追加されて発売されることもままある。そのために良書の版違いをいくつも集めなければいけないことに忸怩たる思いをしている。その問題を解消することが狙いである。あとは、技術書ならば、サンプルを足してもいいし、わかりにくいところを補稿をしてもいい。つまり完全な書籍を販売できないので、不完全な状態から公開、販売し、それを継続的にケアしていく。
こうすることによって、電子書籍は紙書籍とは異なるプロセスで成長できるとおもう。現状の販売システムとは異なるものであり、販売のタイプはライセンス系の契約事項に似てくると思う。そこまで含めてケアできるサービスと、クライアントを用意できれば、これはとてもオモシロイと思う。文字情報をなるべく紙媒体で読みたいという要望は、いずれ電子ペーパーが近いものを提示してくると思う。でも、あくまで紙の代替ではないやり方を電子書籍が追求すると、とてもいい。
こういうビジネスをやりたいなぁ。
3/17/2010
Silverlightとの戦い
Silverlightと最近は格闘中ですが、面白いです。TemplateやBindingはパワフルで使い出のあるアドバンテージです。これらの機能を使いこなすことでコーディング量を劇的に減らすこともできますし、自分の中のデータとビューの関係性を捉え直す機会もくれます。実に取り組みがいのある技術です。この先には、まだまだ多くの発展技術がいることを考えると、挫けそうですが。
それはそうとSilverlight4RCがきましたが、まだ確認をしていません。それよりなによりVerUpの頻度が多い気がします。それ自体は悪いことではないですが、技術書が出揃わないうちにVerUpされると出版側が手を出しにくくなって、困ります。ただでさえ、少ないのに。
ブログなどもいくつも見ていますが、重要なのは基本的な機能に十分習熟することと、Bindingをコード側からも理解することがかなり重要ですね。特にとっつきづらいのはCanvasとGridの実際的な制約事項。
Canvasは自由配置できるのですが、Grid内に配置しても自由に配置を出来ること。Gridのみの場合には、自由配置が全くできないので、XAML側での構造の構築には気を使わなければなりません。あとはDrag&Drop機能を使おうと思うときには、構造をよくよく見れば明白ですが、ListBotのListBoxItemはListBoxの外ではそのまま使えないので、取り出したあとなんらかのコンテナを必要とする点や、データ自体の受け渡しのみならば、別のItemSoruceをもつものとも融通がきくことなど。
実際にコードを触らないとあまりに些末で考えなければならないことが多いです。
3/16/2010
3/02/2010
VSでIntelliSenceのセンスがインテリでもセンスでもなくなったとき
どうもJudaです。
VS2008でIntelliSenceが使い物にならなくなりました。その解決方法は、devenv.exe のコマンドオプション /resetsettingもしくは/resetskippkgsのいずれかを用いて、設定がうまく更新されない問題を再設定を行なうことによって解消します。
このオプションの存在を知らないと、延々と続く再インストールを行い、なおかつ設定が変更されていないので、結局IntelliSenceがつかいものにならないという事態が発生してもおかしくないので、なにかこまったことがあったときには実行ファイルをコマンドプロンプトで実行してオプションを知るのもいいなぁと感じました。それにしてもVSは知らない機能が多くありすぎて、使いこなせていないのも一つあります。また悲しいことにVSの説明書はどれも初心者のためのものが多くあり、中級で普段の使い方になれて、次の段階へ移行しようとする開発者にとっては使い物になりません。Keyboardの隠しショートカットの存在とか、アドオンの設定とか。
2/22/2010
2/21/2010
Silverlightのためのいくつかの話
Silverlight SDK Sample Browser
SDKのサンプル集であり、実行形式になっているものばかりだから、とてもわかりやすい。。。とは言い難いが、それでも基本的な使用方法はよくわかるので参考にされたし。
基本的な使用方法のなかで、全画面表示を考えている場合には、とても重要な情報があります。
全画面表示サポート
使い方に関しては、書かれているがこれはとてつもなくわかりにくい。
基本的な開発をVisualStudioで行うことを考えていると思いますが、この場合に重要になるのは、基本的にはProjectNameで作られたXAMLやcsファイルに対して変更を加えていきますが、この場合にSampleとして上げられているものはどこに導入すればいいのかさっぱりです。
@IT - [Silverlight 2]Silverlight アプリケーションをフルスクリーンで表示するには?
この記事を利用すれば比較的簡単にボタンに対して処理を使っていけましょう。
これで導入ができますが、これよりも詳細なものの設定は個別のイベントに対しておこないます。
しかしここで4未満においては入力関係に対しては制限がかかります。4からはOut of Browseモードでのみ全画面時にキーボード系の入力を受け付けるみたいですが、これがIn Browseでつかえるのかは謎です。たぶんできないのだと思います。
ほかにも全画面表示の解除を行うためのキーのバインドを変更することができません。ちょっと調べただけですが。
Pageクラスがこの全画面関連のメソッドをもっているので、このクラスを継承もしくは利用するクラスを作成すれば良さそうですが、それでも連携部分に対して不安が残ります。
簡単に調べただけなので、これらの情報の確度は不定です。
2/11/2010
SilverLightについての少々の覚書
どうもJudaです。
SilverLightの初心者向けにいくつか簡単な説明を
Grid要素の下に、ColumnDefinitions、RowDefinisionsを設定して、その子要素としてColumnDefinition、RowDefinisionを必要な分だけ指定してやらないと、その次にTextBoxやButtonを設定してそのプロパティとしてGrid.Row="0"やGrid.Column="0"をやってもうまく表示指定できません。段の組み方などは従来のTable組みと同じです。ただ定義部分とデータ部分が分離されている点がHTMLの時とは若干異なります。
この点を無視して出来るのはCanvasですが、きっちりとした位置取りを行いたいときには面倒かも知れません。
また最初の状態でGridの名前がLayoutRootのものはたしかひとつしか宣言できませんが、これはGridコントロールが唯一と言う意味ではありません。Grid要素の内部にGrid要素を作って入れ子状態にできます。
また塗潰を行うRectangleですが、Gridのときには基本的には指定したセルにフィットしますが、サイズがちぐはぐになると、角の丸め表示などの部分が切られてしまうことがあるので、幅と高さの指定については要注意です。
1/24/2010
SilverLight 簡単サンプル
どうもJudaです。
MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverBullet
{
public partial class MainPage : UserControl
{
//BookmarkList m_listBookmark = null;
TextBox m_txtBox_UserId = null;
TextBox m_txtBox_UserPwd = null;
TextBlock m_txtBlk_UserId = null;
TextBlock m_txtBlk_UserPwd = null;
string m_userId = null;
string m_userPwd = null;
public TextBox TxtBox_UserId
{
get { return m_txtBox_UserId; }
set { m_txtBox_UserId = value; }
}
public TextBox TxtBox_UserPwd
{
get { return m_txtBox_UserPwd; }
set { m_txtBox_UserPwd = value; }
}
public TextBlock TxtBlock_UserId
{
get { return m_txtBlk_UserId; }
set { m_txtBlk_UserId = value; }
}
public TextBlock TxtBlock_UserPwd
{
get { return m_txtBlk_UserPwd; }
set { m_txtBlk_UserPwd = value; }
}
public string UserId
{
get { return m_userId; }
set
{
m_userId = value;
TxtBlock_UserId.Text = value;
}
}
public string UserPwd
{
get { return m_userPwd; }
set
{
m_userPwd = value;
TxtBlock_UserPwd.Text = value;
}
}
public MainPage()
{
InitializeComponent();
m_txtBox_UserId = txtBox_UserId;
m_txtBox_UserPwd = txtBox_UserPwd;
m_txtBlk_UserId = lbl_UserId;
m_txtBlk_UserPwd = lbl_UserPwd;
}
private void btn_Login_Click(object sender, RoutedEventArgs e)
{
UserId = m_txtBox_UserId.Text;
UserPwd = m_txtBox_UserPwd.Text;
messageTxt.Text = "Hit";
}
private void txtBox_UserControl_GotFocus(object sender, RoutedEventArgs e)
{
if (sender is TextBox)
{
TextBox txtBox = (TextBox)sender;
txtBox.Text = "";
}
}
}
}
MainPage.xaml
MainPage.xmlを投稿しようとしたが、上手くいかない。XMLの構文を解釈されてしまうので、掲載しにくいです。
今日気がついたことは、位置情報をきっちり決めようとすると、Gridの要素としてCanvasを登録して、さらにその要素としてTextBlockなどを設定。そのプロパティとしてCanvas.Left,Canvas.Topを設定すると明確に位置合わせができます。
SilverLightの特徴まとめ
どうもJudaです。
SilverLightのどういう点が特徴的であるのか、ちょっとまとめる。
- XAML(XMLの拡張)でUIを記述する。
- C#、VBもしくはJavaScript、Iron Python、Iron Rubyでロジックを記述する。
- デザインとロジックを分離できる。
- 動画再生にAdv.がある。
- 疑似3DやエフェクトをSilverLight3からサポート。
- WPFのサブセットという位置づけであるので、Desktop Applicationとしても使える。
- DeepZoomやPhotoSynthいう機能が他のRIAとは異なる。
DeepZoomはこちらで確認できる。
Photosynthはこちらで確認できる。
マルチメディア系のアプリケーションをつくるのにはいろいろ楽しい感じになっている。
1/23/2010
SilverLightことはじめ
どうもJudaです。
とりあえずSilverLightのことはじめ。
VisualStudio2008で始めるには、とりあえずSP1が当たっていること、.net Framework3.5がはいっていること。これらはWindowsのDownloadページで手にいれることができるのでこれを用意します。Visual Studio 2008 Service Pack 1 および .NET Framework 3.5 Service Pack 1
つぎにVisualStudio上でSilverLightを快適に開発するために、SilverLight Toolをいれる。Visual Studio 2008 SP1 用 MicrosoftR Silverlight(TM) 3 Tools
ほかにも便利なToolなどが存在するが、それらはCodePlexで探せばよい。
たぶん開始してProject作成をしてすぐに文字列を表示したいと思う。その際に注意がある。XAMLファイルの編集は癖があるので、注意。文字列はTextBlockを使う。ここにしか文字を書き込めない。Buttonにすらだ。つまりLabel的なものの動作はこれが請け負っている。これだけわかればあまりイライラせずに開始できるとおもう。この落とし穴に関しては解説サイトでもなんかスルーされている気がする。
開始して30分で気がつく落とし穴はそれぐらい。
インターフェイスの使い方
インターフェイスの使い方は疎結合のための考え方だろうとおもう。個人的にはpImplイディオムと似た匂いを感じます。ちなみにpImplイディオムの関連して記事
Pimpl イディオムのお手軽な実装
PImpl イディオム
pimplイディオムを語る
このイディオムの重要性は、その結合が粗であること。それによって得られる副次的な作用は、コンパイル時間の短縮、変更の容易さが得られますが、代償としてこのイディオムを知らない人に対してはなぜこのような実装をしているのかが、わかりにくくなります。
これは、開発者のレベルに差がある時には非常に問題になりますが、それはOOPも一緒だし、他の様々な実装方式も同一の問題を抱えます。
インターフェイスベースと言うとCOMですねー。COMあれもめんどくさい。
インターフェイスを重要視して開発すると実装の詳細はあまり関係はなくなりますが、十分に動作や手続を説明していないと使い物になりません。また実装が隠蔽されていることによって、慣れると手続きを構築するのは簡単になるのですが、それを学習するコストが大抵はソースコードをみることができないことによって増加しますし、関連ドキュメントがないことによってさらに増大っと利用に関しては結構な関門があるのと思います。
ここまで考えが至るプログラムを組むことに対して、思慮深くなる。うむむ。
ちなみに参考
プログラミングメモ - インターフェイスの使い方
WPFって?
今さらですが、
Windows® Presentation Foundation - Microsoft
Windows Presentation Foundation - Wiki
まぁSliverLightの基礎的なフレームワークなんですけど、
これは既存のWindowsのFrameworkから脱却する目的で開発されているので、MFCとは違いますし、.net Frameworkとも違います。まぁ.netとはとても近いですけどね。
重要なのはこれがまぁ新しいフレームワークで、なおかつDesktopとWebをそれほど区別しない点、UIとLogicの分離をフレームワーク的に強制するところです。
これによってMVCのような粗な結合を作ることが推奨されますし、これによってOOP、テストの導入などがしやすくなると考えられます。しかしこれは、ある程度以上の興味と技術をもっていないと上手くいかないので、学習コストをそれなりに払う必要があると思います。
もっとも悲しい事例をあげるなら、すべてが無理やり結合されている。もしくはそれに近い状態におかれることでしょう。例えるなら果物ナイフで巨木を切り倒すようなことにならないように、適宜道具の吟味とその使用法を確認する必要があります。
WPFはC#とVBから利用できる点も特筆しておきたいです。
NVIDIAのCUDAを利用したSolution
とりあえずこれを見てほしい。
NVIDIA「OptiX」エンジン発表、GPUでレイトレーシングを高速処理
NVIDIA® OptiX™ ray tracing engine
引用、ただし体裁は変更。
System Requirements
- Operating System: 32 or 64-bit versions of Windows XP, Windows Vista, Windows 7, Linux
- CPU: x86 compatible
- System Memory: matches graphics board recommendations
- GPU*: NVIDIA Quadro FX or NVIDIA Tesla (GT200 class required for multi-GPU scaling and technical support)
- Frame buffer memory: varies with data complexity
- Driver: NVIDIA Unified Driver r190 or later, CUDA toolkit 2.3 or later
- C/C++ Compiler: Visual Studio 2005 or 2008, along with CMAKE
- NVIDIA GeForce to be supported with NVIDIA's upcoming "Fermi" GPU architecture- see OptiX 2 Beta.
以前は40万からしかOptiXを実行することができなかったのですが、今回は2万円のGPUでも実行可能らしいので、とても楽しみです。
これはCUDAベースのライブラリ群です。開発用にSDKを取得するのは、ちょこっと登録すればダウンロードできるので、オッケーです。
でもGPUをまだ買ってきていないので、実験すらままなりません。どうしましょう、どうしましょう。
1/16/2010
TracかRedmineかそれが問題だ
プロジェクト管理ツールとして、Tracを採用するか、それともRedmineを導入するのか、思案中。
CVSがMercurialとSubverisonを併用しているので、両方扱える方がいい。
また導入しやすくて、当面はローカルなサーバーとして運用できる方がいい。
この二つの条件から考えると上記の二つに絞れるのだけど、まだ別の選択肢もあるのかなぁ。と思う。
ちなみに会社のPCに試験的にTracは導入してみた。Trac Lightingではないので、導入に戸惑ったがSubversionの導入はそれなりに簡単にできた。でもHgとの連携のためのPluginの設定方法が分からなかった。とりあえず管理画面からできるという情報を入手したが、まだよくわからない。
Redmineはとりあえず調べなければ、うむうむ。
1/12/2010
xUnit Test Patterns買った
最近の金遣いが最低な人間レベルになっていることは気づいているけど、Kindleは便利だ。すぐに洋書が手にはいるのが素晴らしい。中古販売の権利はないから、もうちょい安くして欲しいと思うけど、さっさと読んで、できれば日本語訳をこっそり作りたい。
テスト系統の学習を早く業務に役立てて、会社に普及させたい。
周りを変えたいと願うなら、まず自分から。とりあえず情報系の大学卒者でいけ好かないやつを m9 したい。学習コストを支払い続けないとどうなるのかを教えてやる(メラ
1/10/2010
ソフトウェアテストについても並行して学習開始
『体系的ソフトウェアテスト入門』
『ソフトウェアテスト293の鉄則』
を買ってきた。
これでソフトウェアテストについて勉強を並行して開始。開発サイクルと言う考え方を適応するならば、開発フェーズとテストフェーズは隣接しているので、一緒に勉強するのはとっても重要!って言ってみる。