個人ニュースサイト更新支援ツールにLivet導入した
メッセージボックスを自前で表示するのがだるかったのと今後の機能追加を考えて導入しました。
runceel/Livet: WPF MVVM Infrastructure. https://github.com/runceel/Livet
参考にした
Livetを使ってViewModelからMessageBox表示 | プロプログラマ -Flex,Air,C#,Oracle,HTML5+JS- http://propg.ee-mall.info/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/c/livet%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6viewmodel%E3%81%8B%E3%82%89messagebox%E8%A1%A8%E7%A4%BA/
WPFとMVVMについて雑に理解する(まずはパラダイムを理解する)
あーそーゆーことね完全に理解したとなったので記憶が新しいうちに記事にする。
例えが比較的Java EEを使用した大規模開発経験者向けかもしれないのはご容赦ください。
この記事で使用する単語の意味
例えに使う言葉は割愛。
WPF:Windows Presentation Foundationの略。デスクトップ クライアント アプリケーションを作成する UI フレームワーク。(さすがに書かなくてもいいかと思いつつ念のため。)
MVVM:Model-View-ViewModelの略。WPFを使用する際に推奨されるデザインパターン。ちなみに、Model-View-Controller (MVC)の派生とのこと。
XAML:Extensible Application Markup Languageの略。ユーザーインターフェースを定義するためのXMLベースの言語。ちなみに、ザムルと読むそうです。
WPFとMVVMについて図にしてみた
それぞれ少しずつ補足していきます。
- 表示に関する部分は全部Viewで完結させるよ。
- ViewModelは表示に関するロジックとModelの情報をView用に加工するロジックを受け持つよ。Viewに向けたイベント通知もDispatcherを介してやるよ。
- Dispatcherはメッセージキューのようなものと思って間違いなさそう。
- Modelはドメインに関する情報、要はデータモデルとか定義ファイルとかそれらを処理するための表示に関わらないロジックとか広い範囲を受け持つよ。
- クライアントアプリの場合、ViewとModelの切り分けが難しそうではあるけど切り分けられないことはないはず?
- 実際にアプリを作るときはDBや定義ファイルの読み書きを直接扱う部分とロジック部分は層を分けて考えたほうがよさそうだね!
J2EEのモデルでいうとViewがクライアント層、ViewModelがプレゼンテーション層(JSPやサーブレット)、Modelがそれ以外といった感じでしょうかね。
ついでにスレッドについて
詳細なことは(ちゃんと調べてないので)割愛しますが、WPF周りの調べ物をしているとスレッドに関する話題が出てくるので少しだけ。
GUIを保有するプログラムは基本的にマルチスレッドになっています。
WPFの場合、特に意識はしていませんが画面表示に関する部分専用のスレッドとUIを管理する(要はユーザからの入力を受け付ける)スレッドの二種類があります。
後者のことを少なくともC#+WPFの界隈ではUIスレッドと呼ぶようです(C#以外のウェブページだとGUIスレッドとか書いているところもあります)。
通常、UIスレッドはメインスレッド(起動時のスレッド)ですが、別スレッドを立てる場合もあります。
参考
むずかしくないWPF - Qiita
このページのおかげでビビっときました。
C#の便利な機能についての備忘録 - Qiita
» [WPF] MVVMパターンについて -入門編- 技術ブログ
MVVMそれぞれの位置づけはこの記事達のおかげでわかりました。
WPF とは何ですか? - Visual Studio | Microsoft Docs
Windows Presentation Foundation | Microsoft Docs
詳細設定 (Windows Presentation Foundation) | Microsoft Docs
WPFの理解という点ではMicrosoft Docsはイマイチでした。
(記事そのものがイマイチなのか機械翻訳だからなのかは何とも言えないところですが、今読み返してもそもそものパラダイムの説明がすっぽ抜けている気がするのでそのせいかと……。)
ただ、詳細なところまで書いてあるのでパラダイムが頭に入った後に読み込めば有用かと思います。たぶん(まだちゃんと読んでない)。
記事を書いていたらMVVMの責務がよくわかんなくなってきて追加で調べました。やっぱりアウトプット大事。
MVVMを勉強するときに参考になったリンク集 & 概要まとめ - Qiita
MVVMパターンの常識 ― 「M」「V」「VM」の役割とは?(1/5) - @IT
プログラミング経験者が雑にC#入門をするリンク集(2019年版)
すでにプログラミングに関する知識はあるけどC#の経験は浅い・無いといった人のために入門をしながら本記事を書いていきます。
リファクタリングするのはいいけどC#的文化とかベストプラクティス的なもの学んだ方がいいんじゃないの?と思ったので。
なお、JavaとC++を経験している身で書いているのでその辺で知りえたところは省略しているかもしれません。
あと、途中まで書きながら思ったけどアレどこ行ったっけ?となったときに参照できるといいかも。
Microsoft Docsって充実しているのでは?
C# 関連のドキュメント - はじめに、チュートリアル、リファレンス。 | Microsoft Docs
ラインナップを見る限り、概念、開発手順、言語使用など網羅されてそうですね……っ!
勝手に自分なりのインデックスをつけながらリンクを張ってコメントをつけていきます。
対話型のチュートリアルなんかもありますが、こちらは初学者、文章を読んで覚えるのはちょっとつらい……、ちょっとしたことでも実践しながら学びたいという方向けかと思います。
私は文章で読んであーここはこっちの言語とはこう違うのねーとか考えながら進めたいタイプなのでチュートリアルはすべて飛ばします。
- 概要
- C# 言語と .NET Framework の概要 | Microsoft Docs
- C#や.NETがそもそもどんなものなのか?プログラミング関連用語が多数あるので初学者向けではない。別言語での経験者向け。
- C# 言語と .NET Framework の概要 | Microsoft Docs
- Visual Studioを使用したC#の開発
- Visual Studio自体が初めて、またはVisual Studioを触ったのは結構昔という方は一読してもよいかも。なぜか.NET Coreですが.NET Framework使い方はその点を読み替えればよいかと。(例えば、WPFのデザイナはCore向けにはまだ正式提供されていない。)
- Visual Studio 2017 での .NET Core を使用した C# Hello World アプリケーションの構築 - .NET Core | Microsoft Docs
- Visual Studio 2017 を使用して C# .NET Standard ライブラリを構築する - .NET Core | Microsoft Docs
- Visual Studio 2017 での .NET Core を使用した .NET Standard クラス ライブラリのテスト - .NET Core | Microsoft Docs
- Visual Studio 2017 での .NET Standard ライブラリの使用 - .NET Core | Microsoft Docs
- Visual Studio 2017 での .NET Core Hello World アプリケーションの発行 - .NET Core | Microsoft Docs
- C#の文法概略
- C# のツアー - C# ガイド | Microsoft Docs
- 本カテゴリ配下は全部読んでおいてよいと思います。ラインナップは下記。言語によって異なる最たるものだと思います。
- (プログラムの構造、型と変数、式、ステートメント、クラスとオブジェクト、構造体、配列、インターフェイス、列挙型、デリゲート、属性)
- C# のクラスとオブジェクト - C# 言語のツアー | Microsoft Docs
- クラスとオブジェクトのアクセシビリティは絶対に悩むので個別にリンク張っておく。
- C# のツアー - C# ガイド | Microsoft Docs
- C#での方法
- 方法に関する記事 (C# ガイド) | Microsoft Docs
- C#を使う場合にどのように行うか?要は逆引き的な。そこそこ使えそう。
- ファイル システムとレジストリ - C# プログラミング ガイド | Microsoft Docs
- プログラミングガイド内にあったけどジャンル的にはこっちかな。
- 方法に関する記事 (C# ガイド) | Microsoft Docs
- C#プログラミングガイドとリファレンス
- ここからが言語の詳細。今回はC#の言語仕様をマスタしたいわけではないので主要な個所をピックアップしていきます。
- 識別子名 | Microsoft Docs
- C# のコーディング規則 - C# プログラミング ガイド | Microsoft Docs
- これも言語ごとに結構違うので大事。ただ、後続の言語仕様を読んだ後のほうが理解できるかも。
- Main() とコマンドライン引数 - C# プログラミング ガイド | Microsoft Docs
- ファイナライザー - C# プログラミング ガイド | Microsoft Docs
- 部分クラスと部分メソッド - C# プログラミング ガイド | Microsoft Docs
- 部分クラスはGUIアプリ作ってると必要になりそう。部分メソッドの使い道はいまいちピンとこない。任意に設定できるコールバック関数的な感じに使うのかな。
- デリゲート - C# プログラミング ガイド | Microsoft Docs
- 関数ポインタのオブジェクト指向向け進化版という雑な理解をした。
- イベント - C# プログラミング ガイド | Microsoft Docs
- GUIプログラミングでは避けて通れないので。基本的にはイベントが発生した時の処理を書くことが多いはず。
- ジェネリック - C# プログラミング ガイド | Microsoft Docs
- よその言語でもあるよね。C++経験者はテンプレートとの違いは読んでおいた方がいいかも。
- 名前空間 - C# プログラミング ガイド | Microsoft Docs
- Javaでいえばパッケージ。ほんのり風味が違うので一読しておいた方がいいと思う。
- XML ドキュメント コメント - C# プログラミング ガイド | Microsoft Docs
- ドキュメント自動生成に使えるらしい。
- 例外と例外処理 - C# プログラミング ガイド | Microsoft Docs
- ざっと見た感じ他の言語と同じだと思う。
- C# でのコレクションの反復処理 | Microsoft Docs
- イテレーターですね。
- C# の統合言語クエリ (LINQ) | Microsoft Docs
- リストや配列に対してSQL的にアクセス出きるっぽい。ちゃんと知りたい。
- 言語リファレンス
- これも主要なものだけピックアップ。
- C# のキーワード | Microsoft Docs
- 予約語の一覧。
- C# 演算子 - C# リファレンス | Microsoft Docs
- 一覧だけ見てよくわからないのだけ見ればOKかな。
- 特殊文字
- $ - 文字列補間 - C# リファレンス | Microsoft Docs
- 文字列の結合とかはこっちを使うこととコーディング規約にありましたね。内部的にはコンパイル時にString.FormatかString.Concatに変換されるらしい。
- @ - C# リファレンス | Microsoft Docs
- 予約語を識別子に使うのはどうかと思うけど文字列に対して使うのは便利ですね。
- $ - 文字列補間 - C# リファレンス | Microsoft Docs
- C# プリプロセッサ ディレクティブ | Microsoft Docs
よくわかんなかったとこ、深堀しなかったこと、あえてリンクしなかったこと
この記事を作るにあたってリンクしていないページもほぼほぼ読んでいるのですが、ピンとこなかったトピックか今調べなくても大丈夫だろう……と判断したトピック。別途、調べておきたい。
- ステートメント関連
- yield?とか見おぼえないけどとりあえずいいかと流した。
- ダイナミック型
- 何に使うんだ?Objectじゃない理由は?
- 匿名関数とラムダ式
- 匿名メソッドまではぎりぎりわかる気がする
- 部分メソッド
- 何に使うの?
- デリゲート
- 雰囲気は分かった気がするけどもう少し知りたい
- インデクサー
- 何に使うの?
- アンセーフコード
- C#でもポインタが使えるらしい。ネイティブ関数を呼ぶときに使用とのこと。パフォーマンス向上する場合あり。危険なので基本的にはやめておくのが吉だと思う。
- タプル
- 長いので
- イテレーター
- なんかJavaと違うという印象を受けたので
- LINQ
- 奥深そうなのでこれだけでいろいろ掘り下げられそう。
個人ニュースサイト更新支援ツールを作った
仕様
クリップボードを監視して特定の文字列が含まれていたらコメント入力欄を表示。
入力後にボタンを押下したら特定のテキストにデータを出力する。
ソースは一応公開しています。現時点ではいろいろ固定値で埋め込んでいる状態なので悪しからず。
kurodenimu/PersonalNewsSiteSupportTool: PersonalNewsSiteSupportTool
参考
C# WPF で タスクトレイ 常駐アプリ の 開発 - galife
クリップボードの更新を監視、AddClipboardFormatListener - 午後わてんのブログ
WPF4.5入門 その33 「ComboBoxコントロール」 - かずきのBlog@hatena
カテゴリの選択にコンボボックスを使おうと思ったら思いのほか難航した。
テストコード調べながら書いていたんですけど常駐型アプリのテストコードどうやって書いたらいいかわかんない……。
WPFのテストコードはFriendlyを使うのがよいっぽい?ほかの手段も特に見つからなかったので。
Friendlyを使ったWPFのGUIテスト - Qiita
Friendly カテゴリーの記事一覧 - かずきのBlog@hatena
コード化されたUIテストというのがEnterprise版だと使えるらしい。非推奨のようですが……。
Appium と WinAppDriver を使うほうが良い?後で調べてみる。
コード化された UI テスト - Visual Studio | Microsoft Docs
ひとりごと
色々あって自宅での開発作業はストップしていたんですけどまた始めようかと。
ちょっとタイトルにも書いたツールのほうが先に欲しくなったのでこっちを作ってしまった。
Evernoteのほうのツールは出来上がるまでまだ時間かかりそうだし……。
Visual Studio C#でデスクトップアプリを作るときに選択するプロジェクトテンプレートのメモ
身の回りでいろいろあって開発関連作業を全然していなかったけどまた始めようかと。
今まで進めていたのとは別のツールが欲しくてVisual Studioをインストール。
サクッとアプリ作ろうと思ったらプロジェクトテンプレートがいっぱいだったのでどんなテンプレートなのかをメモしておく。
選択基準も書こうと思ったけどメリデメをちゃんと整理するのが面倒になったのでやめた。
選択基準はこの辺とか参考になると思う
アプリ プラットフォームの選択 | Microsoft Docs
それぞれの特徴
言語にC#、プラットフォームにWindows、プロジェクトの種類でデスクトップを選択した際に私の環境で表示されたもの。
インストールしているコンポーネントによって内容に差があると思います。
NUnit テストプロジェクト(.Net Core)
他に作成したプロジェクトをテストする用のプロジェクトを作る。
ちなみに、NUnitはJUnitを.Net coreでも使えるようにしたものとのこと。
Windows フォーム アプリケーション(.Net Framework)
Windows Forms インターフェースを含むアプリケーション。
Windows Forms インターフェースはWindows API(GDI/GDI+)をマネージドコードでラップしたものとのこと。
WPFアプリ(.Net Framework)
Windows Presentation Foundation (WPF) は、デスクトップ クライアント アプリケーションを作成する UI フレームワークとのこと。
グラフィック関連はDirect3Dを使用していて、環境に応じてGPUを使用するらしい。
WPF App(.Net Core)
WPFアプリ(.Net Framework)と同じだけど.Net Coreの範囲ってことだと思われます。
(Windows以外でも動くけど当然Windows専用の機能は使用できない。)
空白のアプリ(ユニバーサル Windows)
ユニバーサル Windows プラットフォーム(UWP)を使用した空ウィンドウアプリ。
UWPはWindows 10で導入された各デバイスで共通のプラットフォームでWindows 10上であればデバイスを問わず(Hololensとかで)動く模様。
Windows フォーム アプリケーション(.Net Core)
Windows フォーム アプリケーション(.Net Framework)と同様。
Windows サービス(.Net Framework)
Windowsで動くサービスを作る。
WPF ブラウザーアプリ(.Net Framework)
WPFの機能を使用したWebアプリを作る。
実質的にWPFアプリと同様でWebを介して配信するってだけっぽい。
セキュリティ回りが厳しい組織内でのWPFアプリ配信方法くらいの認識でいいかも。
WPF カスタム コントロール ライブラリ(.Net Framework)
WPF ユーザー コントロール ライブラリ(.Net Framework)
それぞれCoreと同様。カタカナだったり英語だったり翻訳のばらつきが気になります……。
Windows フォーム コントロール ライブラリ(.Net Framework)
Windows Formsアプリで新しいコントロールを作るやつ。
WPF Custom Control LibraryのWinForms版と解釈した。
共有プロジェクト
複数のプロジェクトで共有するプロジェクト。
マルチOS対応したアプリのコア部分とかに使うっぽい。
DLLとかにはせず参照しているプロジェクト側で自プロジェクトにあるかのようにコンパイルする。
空のプロジェクト(.Net Framework)
ローカルアプリケーション用の空プロジェクト。
ピュアな(WPFでもWinFormsでもUWPでもない)デスクトップアプリ。
次にすることがわからなくなってきたのでタスク管理としてPlanioに登録してみた
クラウドプロジェクト管理・Redmineホスティング | Planio(プラニオ)
Redmineベースでずっと無料で使えるそうです。
まだ登録してプロジェクトを登録してみただけ。
ちょっと身の回りがごたごたしていて忘れがちなのもあり、そもそも何をするか整理してないのがよくないのもあり……という感じです。