tekitoumemo’s diary

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

MacMiniでデュアルディスプレイが最強すぎた

私は今までMacMiniの2014年モデルをBenQのディスプレイに繋いでプログラミングやらやってました。
これ↓

APPLE Mac mini (1.4GHz Dual Core i5/4GB/500GB/Intel HD 5000) MGEM2J/A

APPLE Mac mini (1.4GHz Dual Core i5/4GB/500GB/Intel HD 5000) MGEM2J/A

BenQ モニター ディスプレイ GW2270HM 21.5インチ/フルHD/AMVA+/HDMI,VGA,DVI端子

BenQ モニター ディスプレイ GW2270HM 21.5インチ/フルHD/AMVA+/HDMI,VGA,DVI端子

キーボードもリアルフォースを使ってなかなか良い環境だなと思ってたんですが、家より会社の方が作業が捗ると感じていたのですがなんか微妙だなと思っていました。このキーボードは最高↓
東プレ NG01B0 REALFORCE91UBK

東プレ NG01B0 REALFORCE91UBK

二万近く出してディスプレイを買うほどかなぁと思っていたら友人が24インチのBenqディスプレイいらねーからやるよと言われたので即答でもらって設置。

最高だわ、MacC#環境ないのでWindowsですが。手前のアームレストは自作でぶっちゃけかっこつけです。

あとMacMiniデュアルディスプレイにするにはこいつが必要です。

これでしばらくは引きこもれそうです。

【Azure】インメモリ OLTPのセッション管理がBasicプランで使えなかった

tekitoumemo.hatenablog.com
以前書いた記事でインメモリOLTPのセッション管理を説明しました。

Azureにデプロイしたら以下のエラーが発生しました。

Unable to connect to SQL Server In-Memory session database.
   at Microsoft.Web.SessionState.SqlStore.SqlExecuteReaderWithRetry(SqlCommand cmd, CommandBehavior cmdBehavior)
...

SQL Serverのメモリ内セッションに接続出来ませんとのこと。昨日に記事に書いたIPアドレスや、セキュリティの問題かと思いBasicプランのhttpsで接続を試みると..

Unable to connect to SQL Server In-Memory session database.
...

エラーメッセージがわかりにく杉。エラー内容をいろいろ調べると以下の記事を発見。

azure.microsoft.com
AzureのPremiumプランからしか使えないらしい。。Premiumの最低プランでも5万以上するので普通に無理でした。
マネージインスタンス、エラスティクプールなどは使えるらしい。

諦めて普通にCookieセッションに変えました。

【.NET Core, Azure SQL Server】ubuntuを使って.NET CoreでAzure Databaseを扱う

前回は.NET Coreをubuntuで動かすものを記事にしました。今回はubuntu上で.NET Coreを使ってAzure Databaseを動かせるかという検証です。ubuntuに.NET Coreを動かす場合は以下を参考にしてください。
tekitoumemo.hatenablog.com

僕の持ってるサブPCはポンコツSQL Serverを入れたらパンクしちゃいます。メモリが3.25G以上が推奨ってもう無理じゃん。。
tekitoumemo.hatenablog.com
qiita.com


AzureDatabaseで動かして開発できたらポンコツPCでもなにかと使える!と思って検証しました。また、ubuntu上でAzure SQL Serverを動かすにはどんな作業が必要なのかの検証も含め、実施しました。結果

楽勝でした

はい。

Azure Databaseを作成します。

[SQLデータベース]をクリック→[SQLデータベースの作成]をクリック
f:id:tekitoumemo:20180322004602p:plain

必要な情報を入力します。

これらは任意の情報を入力してください。

  • サーバー

Azure SQL Serverはデータベースのサーバーを構築しなければいけないのでこちらの設定を行います。
こちらも任意の情報を入力してください。
f:id:tekitoumemo:20180322005319p:plain

  • SQLエラスティックプール

こちらは大規模なDBでスケーリングするときの予算や規模の設定が出来ます。今回は検証なので「いいえ」にしておきます。

  • 価格レベル

超知りたいところですね。SingleDatabaseだとBasic、Standard、Preniumの3つがあるので、今回はBasicにします。2G使えて、東日本リージョンで月額600円代です。Standardの250Gが使えるプランでも月額1800円程度なのでめっちゃ安いです。以下の計算ツールで計算出来ます。
azure.microsoft.com

これらの情報を入力したら作成します。ものの5分で作成出来ます。

.Net Coreの準備をします。

今回はEntity Framework Coreを使います。めっちゃ雑ですが、Githubにサンプルを載っけてるので参考になればと思います。
github.com

onConfigメソッドを作成します。
using Microsoft.EntityFrameworkCore;
using System.Data.SqlClient;

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
            // 接続文字列を指定する
            var connectionString = "";
            optionsBuilder.UseSqlServer(connectionString);
}

Nugetから「Microsoft.EntityFrameworkCore」、「System.Data.SqlClient」をインストールして下さい。接続文字列はAzure Portalに記載されています。真っ赤にぬりつぶされたところに記載されています。
f:id:tekitoumemo:20180322012402p:plain

モデルとモデルをマッピングする処理を記載します。
public DbSet<Test> _test { get; set; }
public class Test
{
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime CreateTime { get; set; }
        public Nullable<DateTime> UpdateTime { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
        // テーブルにマッピングする
        modelBuilder.Entity<Test>().ToTable("Test");
}

modelBuilder.Entityにジェネリックでモデルを指定し、ToTableの引数にテーブル名を指定します。その他、モデルクラスとプロパティを設定します。

呼び出しの実装を行います。
using (var dbContext = new AppDbContext())
{
        var test = dbContext._test.ToList(); 
}

これで一通り完成です。

それではVSCodeデバッグしてみます。
f:id:tekitoumemo:20180322013803p:plain
例外が発生しました。このIPアドレスは接続出来ないよ!ってエラーです。Azure Databaseではファイアウォールが設定されているので接続するIPを除外してあげなければいけません。

ファイアウォールの設定を行います。
f:id:tekitoumemo:20180322014403p:plain
[概要]→[サーバーファイアウォールの設定]をクリックします。
f:id:tekitoumemo:20180322014642p:plain
[クライアントIPの追加]を押下します。先ほどアクセスしたので、そのまま設定が出来ます。もちろん、手動で入力することも出来ます。

設定が完了したら再度、接続してみます。
f:id:tekitoumemo:20180322015133p:plain
ちゃんとデータが取れました!

これで、ubuntu上で.Net Coreの開発がまともにできるようになりました。やっとこれでリビングで寝っ転がりながら開発ができる!

【.Net Core 2.0,Ubuntu】Ubuntu16.04でASP.NET MVCを動してみた

f:id:tekitoumemo:20180317184532p:plain
Ubuntu 16.04を入れたので、.NET Coreを入れて動かしてみました。結構、いろんな記事みて理解しながらやったので、まとめます。

.NET Coreを入れる

パッケージのダウンロード。今回は「.NET Core 2.1.0-preview1 」を入れます。

wget -q packages-microsoft-prod.deb https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb

パッケージのダウンロード

sudo dpkg -i packages-microsoft-prod.deb

apt-transport-httpsのインストール

sudo apt-get install apt-transport-https

アップデート

sudo apt-get update

.Net Core 2.0のインストール

sudo apt-get install dotnet-sdk-2.1.300-preview1-008174

Consoleアプリのビルドと実行

mkdir test
cd test
dotnet new
dotnet restore
dotnet run

// 出力
// HelloWorld

一旦、NetCoreが動く環境になりましたが、MVCやSPAを作りたいので他に環境を作らなけばいけません。ちなみにここまでは以下の記事を参考にしました。めっちゃわかりやすい!
kledgeb.blogspot.jp

Nodeの環境を構築

NPMを入れる

sudo apt-get install npm

NPMを最新版にする

sudo npm install -g npm

NVMを入れる

$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh

NVMのバージョンリストを確認。

nvm ls-remote

以下のような感じでバージョン情報がズラッと並びます。私はLTSの最新であるv8.10.0を入れました。

         v8.9.0   (LTS: Carbon)
         v8.9.1   (LTS: Carbon)
         v8.9.2   (LTS: Carbon)
         v8.9.3   (LTS: Carbon)
         v8.9.4   (LTS: Carbon)
        v8.10.0   (Latest LTS: Carbon)
         v9.0.0
         v9.1.0
         v9.2.0
         v9.2.1
         v9.3.0
         v9.4.0
         v9.5.0
         v9.6.0
         v9.6.1
         v9.7.0
         v9.7.1
         v9.8.0

デフォルトのバージョンを指定

nvm alias default v8.10.0

NVMは入れたほうが便利です。以下を参考にしました。
qiita.com

Yeomanインストール

sudo npm install -g yo

僕は間違えて古いnodeを入れていたので以下のエラーが発生しました。

saito@saito-Aspire-one-1-131:~$ sudo npm install -g yo
[sudo] saito のパスワード: 
ERROR: npm is known not to run on Node.js v4.2.6
Node.js 4 is supported but the specific version you're running has
a bug known to break npm. Please update to at least 4.7.0 to use this
version of npm. You can find the latest release of Node.js at https://nodejs.org/
sudo apt install git

このエラーは古いバージョンは動かないよってやつで、nvmでバージョンを新しくしても発生するのでバッサリ削除して入れなおしました。以下を見ました。
stackoverflow.com

sudo apt remove nodejs npm
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs

ASP.Net Generatorをインストール

sudo npm install -g generator-aspnet

bowerをインストール

sudo npm install -g bower

.NET Coreに必要なものをひたすら入れる。片っ端から入れるので5Gぐらいは減ります。

sudo apt-get install dotnet-dev*

ここまでで一通りの環境構築は出来ました!

MVCを動かす

テンプレートの作成

mkdir test

cd test

yo aspnet mvc

ここでログを取り忘れちゃったんですが、コマンドがない!とのエラーが出ます。権限のエラーなので以下を実行します。わかりにくいエラーやな。

sudo chmod -R 777 ~/.config/".

再度作成し、プロジェクトの実行を行います。

yo aspnet mvc

やったー!
f:id:tekitoumemo:20180317210949p:plain

あとはnuget取って実行します。

dotnet restore
dotnet run

http://localhost:5000/にアクセスして完成しました。
f:id:tekitoumemo:20180317211225p:plain
以下がめっちゃ参考になりました。
blankstechblog.com

VSCodeデバッグする

VSCodeデバッグは以下を参照。
ytabuchi.hatenablog.com
VSCodeデバッグする際に以下のエラーが発生しました。

OmniSharp.MSBuild.ProjectManager Failed to load project ..

このエラーはOmniSharpが読み込めませんとのエラーのようで、ubuntuではmonoで動いているのでmonoを入れて対応します。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/ubuntu stable-xenial main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt-get update
apt-get install mono-devel

monoのバージョン等は以下から取得してください。
Download - Stable | Mono
この記事が参考になりました。
github.com

これで開発環境が完成しました。
f:id:tekitoumemo:20180317222902p:plain
やったね!

あとはどのぐらいこの環境で不便があるか触りながら開発してみようと思います。

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("./")