楽しい人生

紙 おいしいな〜!

.NET CoreでC#スクリプトを素早く実行するためのQuickSharpをリリースした

tl;dr

  • VimEmacsC#のquickrunができるようになります

記事執筆時の環境

  • dotnet cli version 1.0.4(.NET Coreのバージョンではない)

筆者がVimを使用していた頃はvim-quickrunを、Emacsを利用している今はemacs-quickrunを愛用しています。

これは、現在エディタで開いているバッファの内容をその場で処理系に渡して実行し、結果をエディタ内で確認できるというプラグインです。

新しい言語の入門書片手に書き捨てのファイルをその場でサッと書いて実行したい時、言語仕様のちょっとした確認をしたい時、プロジェクトを作るほどでもない簡単な計算を行いたい時など活躍の場は多く、筆者の必須プラグインの一つと言えます。

そういった訳で今まで快適なquickrun生活を送ってきた筆者ですが、最近C#に入門したところ、quickrunがデフォルトではC#の実行(ここでは.NET Core CLRを想定します)に対応していないことがわかりました。

理由として推測できるのは、dotnetコマンドが単一.csファイルの実行を想定した作りになっていないからでしょう。基本的には、.csprojファイルを用意し、プロジェクトとして構成したものを実行することが想定されています。

そういったわけでC#のコードをquickrunで実行することは難しいのですが、quickrun愛用者としてはなんとか書捨てのC#ファイルを実行できるようにしてみたいものです。dotnetコマンドについて調査してみたところ、どうやら昔はreplというサブコマンドが用意されており、対話的にC#のコードを実行したり、引数として与えた単一ファイルをその場で実行したりできた様です。残念ながら現在は廃止されてしまったコマンドの様ですが、その実装を追えば同じような仕組みを構築する事は可能でしょう。

そういった訳で実装を調べた所、これらの機能はMicrosoft.CodeAnalysis.CSharp.Scriptingライブラリで実装できるようです。これは実際には標準のC#コードを実行するものではなく、C#スクリプトという仕様に基いて書かれたコードを実行するためのものである様です。

C#スクリプトによる主な仕様の違いは以下のサイトで詳しく解説されています。

ufcpp.net

C#スクリプトは標準のC#との仕様の違いはありますが、さっとコード片を書いて実行するには十分適したものと言えるでしょう。そこで、C#スクリプトファイルを簡単に実行することができる薄いラッパーコマンドを作成しました。それがQuickSharpです。

github.com

NuGetでもリリースしていますが、npmやrubygemsなどの文化圏とは違いNuGetはグローバルにインストールするコマンドラインツールなどの配布は想定されていない様ですので、基本的にはリポジトリにあるREADMEに従って各自好きな場所にビルドしたdllを配置して頂く形になります。

dllのビルドが完了すれば、以下のようにcsxファイルを簡単に実行できるようになります。

using System;
Console.WriteLine("Hello, World!");
> dotnet [path/to/dotnet-quicksharp.dll] ./sample.csx
Hello, World!

そうすれば、あとはvim-quickrunやemacs-quickrunに、quicksharpを呼び出すコマンドを設定すればエディタ内で快適に書捨てのC#スクリプトを実行できるようになります。

以下はEmacsでの設定例です。

(quickrun-add-command "dotnet"
  `((:command . ,(concat
                  "dotnet "
                  (expand-file-name "~/Develops/QuickSharp/QuickSharp/bin/Release/netcoreapp1.1/dotnet-quicksharp.dll")))
    (:exec . ("%c %s"))))
(add-to-list 'quickrun-file-alist '("\\.csx$" . "dotnet"))
(add-to-list 'quickrun-file-alist '("\\.cs$" . "dotnet"))

すごく便利(すごく)

ASP.NET Core MVC における DB の自動 Migration 実行

tl;dr

Startup.csConfigure メソッド内で IdentityDbContext 継承クラスインスタンス contextcontext.Database.Migrate() メソッドを呼ぶ

背景・動機

ASP.NET Core MVC アプリケーションにおいて、起動時に自動で Migration を実行して欲しい

方法

前提として、Entity Framework Core のを利用しているものとします。

まずは Migration を実行するためのクラスを Data/MigrationInitializer.cs に作成します。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace AppName.Data
{
    public class MigrationInitializer
    {
        public static async void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new ApplicationDbContext(
                serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>()))
            {
                await context.Database.MigrateAsync();
            }
        }
    }
}

次に、Startup.cs 内の Configure メソッドの最後に以下のコードを追記します。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // 中略
    MigrationInitializer.Initialize(app.ApplicationServices);
}

これで、アプリケーション起動時に Migration が自動で実行される様になります。

Windows の ruby にて gem install に失敗する場合は gem コマンドを手動アップデートすると良い

Windows における Ruby で、gem コマンドにより rubygem をインストールしようとすると以下のような SSL 接続エラーが出る場合があります。

PS C:\> gem install bundler
ERROR:  Could not find a valid gem 'bundler' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

この問題は gem コマンド自体のバージョンが古いために起こるので、gem コマンドを最新のものに変更すれば良いです。

手順

  1. 最新の rubygems-update gem を手動ダウンロードする(ここではバージョン 2.6.8 と仮定)
  2. gem install rubygems-update-2.6.8.gem を実行し、rubygems-update gem をインストール
  3. update_rubygems --no-ri --no-rdoc を実行し、gem コマンドをアップデートする
  4. gem uninstall rubygems-update -x を実行し、rubygems-update gem をアンインストール

以上です。gem -v すると 2.6.8 になっており、任意の gem のインストールに失敗する問題が解決しているはずです。

Slack はもう古い、これからは次世代チャットの「あび屋」

tl;dr

f:id:supermomonga:20161028211518p:plain

経緯

仕事の都合で古の perl cgi をコード変更なしにサーバ移行する必要が出てきたので、これは Docker ですねということで Apache コンテナで mod_cgi を動かす練習をすることになりました。

次世代のチャット「あび屋」を設置

最近、perlcgi ベースの「あび屋」が Yet Another Slack として世界的に注目を集めていることはご存知だと思います。今回の練習にぴったりだということで、今回はこちらを Docker コンテナとして自宅サーバーに設置してみました。

「あび屋」とは

「あび屋」は、Slack には存在しないユニークな機能を備えています。

  • アバターベースの空間表示による、まるでその場で対面しているかのような密度の濃いコミュニケーション
  • 発言すればするほど「チャット内通貨」が貯まっていき、その通貨を消費することで様々な疑似コミュニケーションを行うことができる
  • 安い(800円弱のライセンス購入でずっと使える)

これはもう御社も Slack から移行してイントラで設置するしかないですね。

実際のチャットには https://izakaya.darui.io/ こちらからアクセスできます。居酒屋モードを使うために有料ライセンスも購入しました。技術調査の一環での購入なので、経費扱いになりました。

みなさんもぜひお使い下さい。では。

Emacs の tramp にてリモートのファイルを開く時 sudo を使う

パイプを使えばできました

/ssh:user@host|sudo::/etc/nginx/nginx.conf

便利