プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

フォルダ名の最後がスペースのフォルダを作る (作れない)

作れません

知っている人は当たり前だと思うかもしれませんが、そんな名前のフォルダ作ろうなんて思ったこともなかったので知らなかったよ

試してみる

Explorer

f:id:puni-o:20181108183446j:plain

こうすると

f:id:puni-o:20181108183458j:plain

こうなります。勝手に最後のスペースが消されます。警告とかそーいうの出ません

勝手に省略しないで

f:id:puni-o:20181108183517j:plain

こっちの仲間に入れてあげればいいのに

C#でやってみる

// 最後がスペースのパス
var path = @"g:\test ";
try
{
    Directory.CreateDirectory(path);  // これは正常終了する
}
catch
{
    Console.WriteLine("しっぱい");  // 例外とか吐かない
}

if (Directory.Exists(path))  // これもtrueが返ってくる
{
    var file = Path.Combine(path, "a.txt");  // あるはずフォルダの下にテキストを書いてみる
    try
    {
        File.WriteAllText(file, "にゃーん");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);  // 「パス 'g:\test \a.txt' の一部が見つかりませんでした。」
    }
}

Oh...

せめてDirectory.Exists()falseを返してほしいんだけど・・なんか歴史的な経緯とかあるのかな~

GitHubから脆弱性あるよって報告が来た話

3か月ほど前に

ASP.NET CoreのSignalRでバイナリーデータをやり取りする - プログラムの事とか

ってやつを書いた時に作ったサンプル用のリポジトリGitHubからAlertがやってきました。 こんなの初めてだったからドキドキしちゃった💛

GitHubのInsights->Alertsを見るとこんなものが

f:id:puni-o:20181017091731j:plain

CVE-2018-8409はこちら

NVD - CVE-2018-8409

System.IO.Piplinesの4.5.0に脆弱性があったみたいですね

NuGetで最新にしてコミットして完了

通知見た時は誰か暇な人がIssueでも投げてくれたのかと思ったんだけど、GitHubが自動で解析みたいなことして警告出してくれているんですねー

ASP.NET CoreのSignalRでバイナリーデータをやり取りする

ASP.NET CoreのSignalRのお話です (2018/7/5時点)

古いSignalRは知らない

SignalRがWebSocketを使えるなら使ってくれるのはご存知だとおもいます

んで、WebSocketのペイロードデータにはTextとBinaryのどちらかを入れることができます

データサイズに敏感な環境では極力小さいデータでやり取りしたいので、バイナリーでやり取りしてくれると助かるわけです

準備

とりあえず普通にSignalRでやり取りするサンプル作ります

Server

Visual StudioASP.NET Core Webアプリケーション (2.1)を新規に作ってStartup.csに追記

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSignalR();
    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseSignalR(options => options.MapHub<DataHub>("/hub/data"));
    ...
}

DataHubはこんな感じ

public class DataHub : Hub
{
    public void Upload(byte[] data)
    {
        System.Diagnostics.Debug.WriteLine($"Receive {data.Length}bytes.");
    }
}

Client

.NET Framework 4.7のコンソールアプリで作ります

class Program
{
    static async Task Main(string[] args)
    {
        var connection = new HubConnectionBuilder()
            .WithUrl("http://localhost:58456/hub/data")
            .Build();
        await connection.StartAsync();

        var testData = Enumerable.Range(0, 1024).Select(i => (byte)i).ToArray();
        await connection.InvokeAsync("Upload", testData);

        await connection.DisposeAsync();
    }
}

クライアントは1024byteのbyte[]を送るようにしてあります

試す

両方実行して送信データを見てみます

f:id:puni-o:20180705112245j:plain

WebSocketのデータフレーム(?)が1になってテキストとして送っていることがわかります

この時のパケットサイズは1481byte

Binaryで送る

Server

Install-Package Microsoft.AspNetCore.SignalR.Protocols.MessagePack
services.AddSignalR()
    .AddMessagePackProtocol();  // 追加

Client

Install-Package Microsoft.AspNetCore.SignalR.Protocols.MessagePack
var connection = new HubConnectionBuilder()
    .WithUrl("http://localhost:58456/hub/data")
    .AddMessagePackProtocol()  // 追加
    .Build();

準備完了

MessagePack使うだけです、楽スギ!

試す

実行して送信データを見てみます

f:id:puni-o:20180705112823j:plain

WebSocketのデータフレーム(?)が2になってバイナリで送ってるっぽいです

データサイズも1090byteまで減りました

まとめ

サーバーもクライアントも1行(?)追加するだけでできちゃったし、フレームワーク作る人ってすごいんだなーと改めて実感しました

今回のソースはこちら

github.com