tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

ubuntu 16.04を入れるときにやったこと

ubuntuで.NETの開発をするためにクリーンインストールしました。過去にRails試したりしたとき何回も入れたときの記事がありました。
tekitoumemo.hatenablog.com
tekitoumemo.hatenablog.com
最近のWindowsUpdateが安定しなかったり、32GしかないのにWindows10だと20Gぐらいデフォルトで消費するので、もう完全に切り替えようと決意しました。メモリも2Gしかないくせにネットサーフィンしてるだけで1.8Gぐらい食ってもう話になりませんでした。
tekitoumemo.hatenablog.com
Ubuntuは入れると結構めんどくさいことがあるので、メモ程度に残しておきます。

日本語入力が効かない

[システム設定]→[言語サポート]
f:id:tekitoumemo:20180316233024p:plain
キーボードに使うIMシステムを「fcitx」に。

Caps LockをCtrlに変更する

僕の場合、Ctrl+Spaceで日本語変換する癖があるので、Caps LockをCtrlに変えます。大学生時代にHHKBを使ってた名残が未だに残ってます。
/etc/default/keyboardに以下を追加

XKBOPTIONS="ctrl:nocaps" 

で再起動。

Ctrl+Spaceで日本語変換

f:id:tekitoumemo:20180316234805p:plain
入力メソッドのオン、オフで切り替えてください。

ショートカットの設定

Windowsと似た配置に変更。ここはお好きに。
f:id:tekitoumemo:20180316235122p:plain

wifiがつながらない問題

ipv6を無効化にするために/etc/sysctl.confに以下を追記します。

net.ipv6.conf.all.disale_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

これやらないと全く使い物になりません、少なくともぼくのPCでは。
あといろんな記事に8.8.8.8(Google PublicDNS)にすると早いって書いてありますが、別に変わらんので変更しなくて良いです。気休め。

Unity重すぎる問題

12.04あたりからUnityになって結構重くなりました。デフォルトで1.3Gも食うのでClassicに変更

sudo apt-get install gnome-session-fallback

18.04からUnityやめるらしいですね。唯一おしゃれなディストリビューションだったのに残念。UbuntuPhoneとかどこ行ったの?って感じ。
japanese.engadget.com

スクロールが使いにくい

通常は上下反対にスクロールするのが良いのですが、デフォだと上下同じ方向にスクロールしちゃいます。
f:id:tekitoumemo:20180317003824p:plain
ナチュラルスクロールにチェックを入れると違和感がないと思います。

軽量なペイントソフトを入れる
ブログを書く際に画像を添付するのですが、ちょっと加工が必要な場合もあるので簡単なペイントソフトも入れときます。

sudo apt-get install pinta

Pinta: Painting Made Simple! - PintaProject/Pinta

【C#、ASP.NET】SQL Serverでセッション管理する

f:id:tekitoumemo:20180316021210p:plain
ほぼ完成した。公開まであと少し。

ASP.NETのセッション方法はいくつかあるのですが、今回はインメモリ OLTP でセッション管理を行う方法を紹介します。以下を参考にしました。
blogs.technet.microsoft.com

インメモリ OLTP とは

正直、僕もよくわかってないのですが、データベースのメモリ最適化を行うための手法みたいです。まぁ勝手に最適化してくれて早くなったという感じでしょうか。
インメモリ OLTP (インメモリ最適化) | Microsoft Docs

まずMicrosoft.Web.SessionState.SqlInMemoryをNugetから取得します。
f:id:tekitoumemo:20180316022331p:plain

取得するとプロジェクト直下に「ASPStateInMemory.sql」というクエリが作成されるのでこちらをSQLServerで実行します。FileNameのところがDドライブの指定になってるので、環境に合わせて実行してください。あえて指定しなくてよいと思うので、削除しちゃってよい思います。

CREATE DATABASE [ASPStateInMemory]
ON PRIMARY (
	   NAME = ASPStateInMemory, FILENAME = '{ここまでののパス}\ASPStateInMemory_data.mdf'
),
FILEGROUP ASPStateInMemory_xtp_fg CONTAINS MEMORY_OPTIMIZED_DATA (
	   NAME = ASPStateInMemory_xtp, FILENAME = '{ここまでののパス}}\ASPStateInMemory_xtp'
)
GO

Web.ConfigのsessionStateも自動で書き換わるのですが、以下の項目を環境に合わせて変更します。

<sessionState mode="Custom" customProvider="SqlInMemoryProvider">
    <providers>
        <add name="SqlInMemoryProvider" type="Microsoft.Web.SessionState.SqlInMemoryProvider" connectionString="data source=sqlserver;initial catalog=ASPStateInMemory;User ID=user;Password=password;" />
    </providers>
</sessionState>
  • data source : サーバー名
  • catalog:カタログ名
  • User ID:SQL ServerのユーザーID
  • Password:SQL Serverのパスワード

これでセッション管理を行うとSessionsテーブルにデータが保存されるようになります。
めっちゃ簡単だねこりゃ。

【ASP.NET WEB API、MsTest】アノテーションをテストする



テストで正常パターン、異常パターンなど様々なテストを書くと思いますが、アノテーションのエラーを取るやり方が日本語で載ってなかったので書きます。stack traceでは以下に載ってました。

ASP.NETではアノテーションで大体のエラー処理が行えるのでめっちゃ楽なんですが、通常のメソッド呼び出しだとアノテーションが効きません。なので、アノテーションを効かせるコードを紹介します。

まず、アノテーションとはどういうものなのか?

アノテーション(英語:annotation)とは、あるデータに対して関連する情報(メタデータ)を注釈として付与すること。

ASP.NETでは、以下のように空白チェック、数値チェックなど、モデルのプロパティで自動に検知出来る仕組みがあります。

    public class Models
    {
        [Required(ErrorMessage = "Hoge1がない!")]
        public string Hoge1 { get; set; }
        [RegularExpression(@"[0-9]+", ErrorMessage = "Hoge2が数字じゃない!")]
        public string Hoge2 { get; set; }
    }

こんな感じのやつです。

上記のモデルを使い、このメソッドをテストします。

        // POST api/values
        public void Post(Models value)
        {

        }

で、次にMsTestでどう検知するか以下に記載します。

        [TestMethod]
        public void Post()
        {
            // 準備
            ValuesController controller = new ValuesController();
            var json = File.ReadAllText("json1.json");
            var model = JsonConvert.DeserializeObject<Models>(json);
            controller.Configuration = new HttpConfiguration();
            controller.Validate<Models>(model);
            // バリデーションが取得可
            //controller.ModelState
        }

まず、HttpServerのインスタンスを作成するためにcotroller.ConfigurationにHttpConfigurationを設定します。そのあとにcontroller.Validateにジェネリックで型とモデルを渡します。そうするとModelStateにエラーが検知され、assertやらなんやらでテストを書けば終了です。

これである程度のテストはなんとかなりました。

ちなみに

テストを書いててめんどいのが、webサイトのパスが取れんこと。以下のようなコードは当然取れないので諦めてカスタムビルドを作ってテスト用に作るしかないという結論に至りました。テストに関してはあまりわかってないからいい方法があるかも

HttpContext.Current.Server.MapPath("./")

【Visual Studio】Visual Studioが凄すぎて鼻血が出る

https://venturebeat.com/wp-content/uploads/2015/06/visual_studio_purple.png?fit=578,287&strip=all
言語毎に様々なIDEがあると思いますが、Visual Studioに勝るものはいまのところないと思っていて、Visual Studioで開発するエンジニアはプログラムが書けないとまで言われます。何げなく使っていて便利だなーと思うものをいくつか紹介したいと思います。

インテリセンスが最強

f:id:tekitoumemo:20180308233748p:plain

インテリセンス (IntelliSense) は、Microsoft Visual Studio統合開発環境で使用されている、マイクロソフトによる自動補完システム。

いわずもがな、入力した文字の候補を出してくれる機能です。この機能があるおかげで「Visual Studioで開発するエンジニアはプログラムが書けない」と言われ、Windows開発者はLinux開発してる人に対して劣等感を持っているほどです。インテリセンスに従えば、ほぼ確実にコンパイルが通りますし、辞書替わりにも使えるので21世紀のエディタだなと感心するばかりです。LINQの遅延評価など、C#の機能はインテリセンス前提に設計しているのでここまでのパフォーマンスが出せるようです。以下のスライドでは、言語、IDEオープンソース化の平行開発をどのように進めているかわかります。
channel9.msdn.com

マルチプラットフォームに強い

基幹系ならWindows FormやConsole、WebForm、WPF、WEBならASP.NET MVCASP.NET WEBAPI、アプリならXamarin、ゲーム(VRも含む)ならUnityなどほぼすべてのソフトウェアをVisual Studioのみで開発出来ますし、最近では.NET Coreが出てきたのでLinuxでもMacでもVisual Studio Codeがあれば開発出来ます。もちろんインテリセンスやその他機能も使えますし、学習コストを減らしつつマルチ開発ができるのはすごく素敵です(C#はめっちゃムズイ言語だと思いますが)。以下の記事で、C#で出来ることがまとまってるので参考になります。
blog.okazuki.jp

サードパーティの連携が豊富

SQL Server、Git、Azure、Python、JSフレームワークなど連携するのが鬼のように楽になりました(昔は全然ダメでした)。Dockerも「Docker for Windows」があるのでいつかは含まれるんじゃないかと勝手に思ってます。ここはかなり重要な部分だと思っていて、2年前までLinux環境の勉強しようと思っていましたが、2013あたりからバンバン使えるようになったのでしばらくはC#を集中して勉強しようと思ったきっかけになりました。最近はMSもそれをどんどん推してきてます。

実は無料

2013?あたりから「Visual Studio Community」が発表され、5名ユーザーまでは無料となっています。昔はReleaseビルドが使えなかったり(記憶では使えなかったような。。)したのですが、今はほとんど困ることはありません。以下で紹介する機能が使えたりするので不満はないです。5名ユーザーまでって書いてありますが、それ以上の人数で開発してる会社は結構多いんじゃないかなと思います。
www.visualstudio.com

[形式を選択して貼り付け]がすごい

いきなり機能紹介となりますが、JsonXMLをモデルマッピングする機会が多いですが、コピペしてマウスポチポチでモデルを作ってくれます。
まず、モデルを挿入したい場所にカーソルを当てます。
f:id:tekitoumemo:20180309000501p:plain
[編集]→[形式を選択して貼り付け]→Jsonをクラスとして張り付ける
f:id:tekitoumemo:20180309000534p:plain
出来ました。
f:id:tekitoumemo:20180309000928p:plain
めんどくさいところはすべて自動化できるレベルまできてる感じがします。

リファクタリング機能が便利杉

Visual Studio 2017の目玉と言って良いほど強化されました。以下はHttpClientを入れた例です。
[考えられる修正内容を表示する]を押下します。
f:id:tekitoumemo:20180309001418p:plain
名前空間がないんじゃね?」って教えてくれます。
f:id:tekitoumemo:20180309001459p:plain
クリックすれば勝手に追加してくれます。これだけじゃなく、コードの省略化や修正方法やなんなら名前まで候補を出してくれたりするのでマジでやばいです。

パフォーマンスプロファイラが優秀

パフォーマンス測定の時に非常に便利です。どこにCPUリソースが使われているなどかなり詳しくレポートが出されるので、簡単に目星がつけられます。
[分析]→[パフォーマンスプロファイラ]を押下します。
f:id:tekitoumemo:20180309002235p:plain
好きなの選んでください>手抜き杉。
f:id:tekitoumemo:20180309002326p:plain
f:id:tekitoumemo:20180309002328p:plain
ごめんなさい、まったくもって良い例じゃないんですがこんな感じで表示されます。
f:id:tekitoumemo:20180309003035p:plain
f:id:tekitoumemo:20180309003025p:plain
コードまで解析してくれるので、どこが重いか一瞬で分かります。

また私も知らない便利機能が腐るほとあります。Visual Studioだけでなく、Azureなど最近のMSが提供するものには関心を持つばかりなので
どんどん便利な機能が増えていくのが楽しみです。

【ASP.NET MVC,C#】一つのメソッドで複数のViewを切り替える方法

以前書いた記事の応用編です。


同じようなロジックなんだけど、ビューのデザインや表示する値を変えれば便利だなーと思うときがあります。今回は受け取ったパラメータから表示するビューを切り替えたり、ViewModelを変えたりする方法を紹介します。参考用にgithubに上げております。

以前記事に書いた戻り値のViewメソッドに表示したいパスを指定します。

public ActionResult Index()
{
  return View("~/Views/Home/Hoge.cshtml");
}

Indexメソッドで表示するViewがHoge.cshtmlになります。パラメータ毎に表示を変える場合は以下の書きます。

public ActionResult Index(string id = "")
{
       return View(string.Format("~/Views/Home/{0}.cshtml", id));
}

以前書いた記事の内容と全く同じです。idとViewの名前が一致しない場合も応用出来ます。

ASP.NET MVCはモデルをViewに渡すことが出来ますのでView()メソッドの第二引数にモデルを指定しましょう。

public ActionResult Index(string id = "")
{
       var model = new IndexViewModel();
       return View(string.Format("~/Views/Home/{0}.cshtml", id),model);
}

View側には受け取るためのモデルを指定します。

@inherits System.Web.Mvc.WebViewPage<SwitchViews.Models.IndexViewModel>

さらにパラメータなどによってViewもモデルも切り替えたい場合があります。

        public ActionResult Index(string id = "")
        {
            if (id.Equals("foo"))
            {
                return View(string.Format("~/Views/Home/{0}.cshtml", id), new Models.FooViewModel());
            }
            else if (id.Equals("bar"))
            {
                return View(string.Format("~/Views/Home/{0}.cshtml", id), new Models.BarViewModel());
            }
            return View(new Models.IndexViewModel());
        }

idがfooだったら

idがbarだったら

と条件によってViewもモデルも切り替えられます。

このような方法はHTMLヘルパーのActionやPartialなどにも使えますので自由度増して便利です。ただし、多様すると何のメソッドなのかよく分からなくなってしまうので使いどころは考えた方が良さそうです。

GitからPull出来ないと思ったらシレッと仕様が変わってた


2/23にgithubから取得するjenkinsを動かしたらエラーが発生しました。認証でエラーになっている模様でした。

調べたら以下の記事が

要はTLS(Transport Layer Security)の1.0、1.1のサポートを終了し1.2に移行しましたとのこと。知らなかったわ〜。

解決策はGit for Windowsのバージョンを2以上にあげるだけ(2以上か正直わかりませんが、最新にすれば大丈夫です)

すぐ記事が見つかったので特に困らなかったけど、何事かと思いました。

【C#..Net】.ctor()って何?


VB.NETで起きた謎の.ctor。

.Net Frameworkのバージョンアップをやった時に一瞬で落ちたのでイベントビューアーでログ解析したら以下のエラーが発生しました。

アプリケーション:○○.exe
フレームワークのバージョン:v4.0.30319
説明: ハンドルされない例外のため、プロセスが中止されました。
例外情報:System.IO.FileLoadException
場所 ○○.Main..ctor()

ぼく「FileLoadException」あぁ、ライブラリのFrameworkバージョンが一致しないとかそんなエラーだろうなぁ、どこで落ちてるのかな?

・・・

.NET「.ctor()」
ぼく「誰だよ!」

って感じでちょっと困りました。

これはコンストラクタで.NETの中間言語が出力されてるらしいです。

VB嫌いだなぁと思ったこの頃。