保守のために自分が10年前に作成したソースコードを読んだのですが、非常に読みづらい。
.NET Frameworkは出始めのバージョン1.1です。
.NET Frameworkの機能も貧弱だったので仕方が無い所もあるものの、名前の付け方や実装の方法が.NETの作法から外れていたり古くさかったり、残念なソースコードになっていました。
10年の間に.NETも自分も成長したのだと、ポジティブに考えることにします。
保守のために自分が10年前に作成したソースコードを読んだのですが、非常に読みづらい。
.NET Frameworkは出始めのバージョン1.1です。
.NET Frameworkの機能も貧弱だったので仕方が無い所もあるものの、名前の付け方や実装の方法が.NETの作法から外れていたり古くさかったり、残念なソースコードになっていました。
10年の間に.NETも自分も成長したのだと、ポジティブに考えることにします。
C#7の新機能の話です。
言語レベルでタプルに対応するそうです。なお、System.Tupleとは関係がありません。
ざっくり言うと、メソッドの引数や戻り値、プロパティの型などに匿名型が使える様になります。
System.Tupleを使った場合も汎用の型として同様のことが行えますが、System.TupleはメンバへのアクセスがItem1やItem2のようにメンバの意味が分かる名称で無いため、可読性が悪くあまり使いたい機能では無かったです。
タプルを使用した戻り値は以下のようなコードになります。
public (int sum, int count) Tally(IEnumerable values) { … }
var t = Tally(myValues);
Console.WriteLine($”Sum: {t.sum}, count: {t.count}”);
Tallyメソッドの戻り値がsumとcountの2つになっています。
引数と同じように括弧で囲って複数記載できるようになっています。
Tallyメソッドの呼び出し側は、戻り値を変数tに代入しています。
tは、sumとcountメンバを持つ匿名メソッドのようになっています。
この機能追加によって、out引数を使用したり、戻り値専用に一時格納用クラスを定義する必要がなくなり、シンプルで可読性の高い実装になりそうです。
こんにちはMTJです。
現在装置に依存しているソフトを作成しています。
装置のライブラリを使い装置のデータを取得するというものです、
タイトルにも書きましたがこれの危険なところは装置が本当にどういう動作をするかわからないところ
戻ってくるデータは仮想的に作れますが、装置の動きは予想して作れません、
こういう事もありました。
・装置がある動作をしたときに装置の状態を調べる関数をPCから送る。
上記の動作をさせた時に装置が操作不能になることがありました。
装置のメーカーに問い合わせたところその関数は装置内部に問い合わせを行っており
操作が被ることで操作不能になるかもしれないとのことでした。
この問題が何で発生しているか特定するのも大変でしたが、問題はどちらもエラーも発生せずに
動いていることでさらに特定が難しくなっていました。
装置依存のソフトを作成する場合は、この関数は装置の内部に何か操作を要求しそうか
など考えながら作成したほうが時間を取られずに済むのかと思いました。
3/22(日)に京都で行われた、ネタモノ系ものづくりの展示・交流会「NT京都2015」を見に行ってきました。
見に行ったのは今年で2回目です。
こういう技術の無駄遣いな集まりが大好きです。
内容を詳しく書きたいのですが、今週は仕事が忙しいため詳細はまた次回記載したいと思います。
道辻です。
現在EntityFrmeworkを使用していて問題にあたりました。
それは、旧バージョンから新バージョンDBにアクセスするとエラーが発生するのです
新バージョンで旧バージョンならmigrationで勝手にDBをアップデートしてくれますが
旧から新はDBのバージョンがうんぬんでまったくアクセスできなくなります。
普通に考えれば旧バージョンから新バージョンにアクセスするなんて変な話ではありますが
装置などで24/7動かすソフトではあり得る話でした。
はやりのWebアプリでは全く必要の無い機能だと思います。
Webアプリのアップデート時にはアクセス不可にしサーバー、クライアント両方のソフト
をアップデートし、クライアントアクセス時には必ず最新版にするので、この機能が無いのは
普通だと思いました。
逆にアクセスできないのでアップデートされていないので更新してくださいというエラーを出す
ようにもできると思います。
結局解決するために、LinqToSqlの方でDB操作を行う事にしました。
DBを更新する場合はDBとテーブルを合わせないといけないため保守は大変になりました。
C#7の機能追加のお話です。
C#7ではプロパティのスコープ内のみで使用できる変数が定義できるようです。
これにより以下のように実装できるようになります。
■今までの実装
private string _myField;
public string MyProperty {
get { return _myField; }
set {
_myField = value;
NotifyOfPropertyChange(nameof(MyProperty));
}
}
■C#7での実装
public string MyProperty {
string myField;
get { return myField; }
set {
myField = value;
NotifyOfPropertyChange(nameof(MyProperty));
}
}
今まではクラス外からは_myFieldが隠蔽できていましたが、クラス内では自由にアクセスでき、隠蔽できてませんでした。
今回の機能追加により、プロパティのGetとSetからしかアクセスできない変数が定義できるようになり、完全な隠蔽ができるようになります。
VB6のころからこの機能が欲しいと思っていたので、とてもうれしいです。
ラダー改造の案件で変数名を使いました。
変数名を使わない場合はデバイスの実アドレスが主になります。
シフト命令を使ってステップシーケンスを作る場合、ステップを割り込ませるには
一括置換が必要になります。
変数名を使うと名前が主になるので実アドレスを変えても名前は変わりません。
ラダーは「回路」から「言語」へと変わっていくのでしょうか。
こんにちは、mtjです。
現在DBの開発を行っており、今回はEntityFrameworkを使用して開発しております。
これで便利なのが、コードファーストなので接続先のDBさえあれば勝手にテーブル、
リレーションなども作成してくれます。
テーブル定義もコード上に記載するので確認も容易です。
通常ではテーブル定義を書いて、データベースを開いてなどコード上では面倒の多い事がありません。
データベース検索もSQLを発行することなくLinqでアクセスできます。
TestCont.TestEntity.Single(x=>x.Id == id);
のような感じで容易にアクセスできます。
テーブル定義の変更もコード上のクラスの定義を変更するだけでMigrationが変更を検知し
自動でDB書き換えのコードを作成してくれます。
ソフト開発者としてはSQLサーバーを気にせずアクセスできるのは大変便利な事です。
通常だと変更があったらDBの定義を変更するコードを書いたり、それに伴ってコード上のテーブル定義
などの修正も行う必要がありますが、このフレームワークの場合はコードを気にしているだけでいいという感じです。
またテスト環境を容易に構築できる利点もあるので今後DBはこのフレームワークを使っていくと思います。
先週、C#ソフトのタブインデックスを久しぶりに自分で設定しました。
いつもは誰かにして貰っていたのですが、自分でするとものすごく面倒くさい。
これは人のする作業ではないと考え、自動化する方法を検討。
結果、ネットの情報を元に以下の拡張メソッドを作成しました。
public static void RefreshTabIndex(this Control ctl) {
//子コントロールのタブインデックス更新
foreach (Control child in ctl.Controls) {
if (child.Controls.Count <= 0) continue;
child.RefreshTabIndex();
}
//子コントロールの位置をもとにソートする
var children = new List<Control>();
foreach (Control child in ctl.Controls) {
children.Add(child);
}
children.Sort((x, y) => {
if (x.Top == y.Top) return x.Left.CompareTo(y.Left);
return x.Top.CompareTo(y.Top);
});
//タブインデックスを設定する
for (int i = 0; i < children.Count; i++) {
if (children[i].TabIndex == i) continue;
children[i].TabIndex = i;
}
}
フォームのコンストラクタなどで、this.RefreshTabIndex()を実行すると、
コントロールの配置をもとに自動でタブインデックスが設定されます。
まだ使い始めた所なので、この方法ではうまくいかない場合があるかも知れませんが。
概ね思っている動作をしており、作業が楽になりました。
現在、通常国会では速記ではなく音声自動認識が使われているという話をラジオで聞き驚きました。また、その翻訳精度は98%ということでさらに驚きました。
国会のような専門用語が飛び交うところで高精度に音声を文字変換するシステムは京都大学とNTTが開発したらしいです。
そして、速記者の募集はとっくの昔に終了していたという事も知りました。
技術の進歩で人の職業がなくなってしまう。しかも、単純作業ではなく、速記という高等技術さえも不要にしてしましました。