個人ニュースサイト更新支援ツールに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/

docsifyをGithubで使うのを試していたら微妙にはまった件

docsifyは_から始まるファイルがあるのですが、Githubでは「.nojekyll」ファイルを置いてあげないといけない。
その置き場なんですが、ファイルのルートやファイルがあるフォルダではなく、Githubページのルートとなるディレクトリにおいてあげる必要がある。
リポジトリ全体をGithubページの対象とした場合、リポジトリのルートに置く必要があります。
という点に気づくのに時間がかかってしまったのでメモしておく。

WPFとMVVMについて雑に理解する(まずはパラダイムを理解する)

あーそーゆーことね完全に理解したとなったので記憶が新しいうちに記事にする。
例えが比較的Java EEを使用した大規模開発経験者向けかもしれないのはご容赦ください。

この記事で使用する単語の意味

例えに使う言葉は割愛。
WPFWindows Presentation Foundationの略。デスクトップ クライアント アプリケーションを作成する UI フレームワーク。(さすがに書かなくてもいいかと思いつつ念のため。)
MVVM:Model-View-ViewModelの略。WPFを使用する際に推奨されるデザインパターン。ちなみに、Model-View-Controller (MVC)の派生とのこと。
XAML:Extensible Application Markup Languageの略。ユーザーインターフェースを定義するためのXMLベースの言語。ちなみに、ザムルと読むそうです。

WPFとMVVMについて図にしてみた


それぞれ少しずつ補足していきます。

  • 表示に関する部分は全部Viewで完結させるよ。
    • WPFの場合、それはXAMLで表現するよ。
    • 図にも書いたけどxaml.csには原則何も書かないでね!
  • 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#的文化とかベストプラクティス的なもの学んだ方がいいんじゃないの?と思ったので。
なお、JavaC++を経験している身で書いているのでその辺で知りえたところは省略しているかもしれません。
あと、途中まで書きながら思ったけどアレどこ行ったっけ?となったときに参照できるといいかも。

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)

他に作成したプロジェクトをテストする用のプロジェクトを作る。
ちなみに、NUnitJUnitを.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専用の機能は使用できない。)

WPF Custom Control Library(.Net Core)

WPFで新しいコントロールを作るときに選ぶやつ。
ここでいうコントロールはボタンとかリストボックスとかそういうの。

WPF User Control Library(.Net Core)

WPFで既存のコントロールの組み合わせを一塊にするときに選ぶやつ。

空白のアプリ(ユニバーサル 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でもない)デスクトップアプリ。

Windows アプリケーション パッケージ プロジェクト

MSIXパッケージを作成するためのプロジェクト。
MSIXはUWP用のインストーラのことっぽい。

次にすることがわからなくなってきたのでタスク管理としてPlanioに登録してみた

クラウドプロジェクト管理・Redmineホスティング | Planio(プラニオ)
Redmineベースでずっと無料で使えるそうです。

まだ登録してプロジェクトを登録してみただけ。
ちょっと身の回りがごたごたしていて忘れがちなのもあり、そもそも何をするか整理してないのがよくないのもあり……という感じです。