備忘録

備忘録

C#でWebSocketサーバを建てる方法

Ⅰ. はじめに

タイトルの通り「C#でWebSocketサーバを建てる方法」です。

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
Install-Package Fleck
2. サンプルプログラムを書く
using Fleck;
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketServerTest
{
  class Program
  {
    static void StartServer()
    {
      var server = new WebSocketServer("ws://127.0.0.1:8181");
      server.Start(socket =>
      {
        socket.OnOpen = () => Console.WriteLine("Open!");
        socket.OnClose = () => Console.WriteLine("Close!");
        socket.OnMessage = message =>
        {
          socket.Send($"hello {message}");
        };
      });
    }

    static async Task StartClient(string name)
    {
      var ws = new ClientWebSocket();
      await ws.ConnectAsync(new Uri("ws://127.0.0.1:8181"), CancellationToken.None);
      await ws.SendAsync(Encoding.UTF8.GetBytes(name), WebSocketMessageType.Text, true, CancellationToken.None);
      var buffer = new byte[128];
      await ws.ReceiveAsync(buffer, CancellationToken.None);
      Console.WriteLine(Encoding.UTF8.GetString(buffer));
      await ws.CloseAsync(WebSocketCloseStatus.Empty, null, CancellationToken.None);
    }

    static async Task Main(string[] args)
    {
      StartServer();
      await StartClient("tanaka");
    }
  }
}

実行結果

Open!
hello tanaka
Close!

Excel VBAで任意の文字列で区切られたCSVファイルを出力する方法

Ⅰ. はじめに

タイトルの通り「Excel VBAで任意の文字列で区切られたCSVファイルを出力する方法」です。

Ⅱ. やり方

1. Microsoft ActiveX Data Objects x.x Library を追加する

「ツール」→「参照設定」
f:id:kagasu:20200201055832p:plain

2. 以下プログラムをコピペする
Option Explicit

' 文字エンコーディング
Const Charset As String = "UTF-8"
' 改行コード
Const LineSeparator As String = adCRLF
' 処理対象の範囲
Const Area As String = "A1:D4"
' フィールド区切り文字列
Const Delimiter As String = "<>"
' Const Delimiter As String = vbTab
' 出力場所
Const FilePath As String = "C:\out.csv"

Sub WriteCsvStringToStream(stream As Object, cells As Range)
  Dim x As Range
  For Each x In cells
    If cells.Columns.Count = x.Column Then
      Call stream.WriteText(Trim(x.Value), adWriteLine)
    Else
      Call stream.WriteText(Trim(x.Value) & Delimiter, adWriteChar)
    End If
  Next x
End Sub

Sub SaveAsCSV()
  ' ADODB.stream を初期化する
  Dim stream As ADODB.stream: Set stream = New ADODB.stream
  With stream
    .Charset = Charset
    .LineSeparator = LineSeparator
    .Open
  End With

  ' 任意の文字列で区切られたCSV文字列をストリームに書き込む
  Call WriteCsvStringToStream(stream, Range(Area))

  ' ファイルを出力する
  Call stream.SaveToFile(FilePath, adSaveCreateOverWrite)

  stream.Close
End Sub
3. SaveAsCSV を実行する

実行結果

f:id:kagasu:20200201061032p:plain

geditでShift_JISファイルを文字化け無く開く方法

Ⅰ. はじめに

タイトルの通り「Ubuntu 18.04のgeditでShift_JISファイルを文字化け無く開く方法」です。

Ⅱ. 環境

# version
OS Ubuntu 18.04
gedit 3.28.1-1ubuntu1.2

Ⅲ. やり方

1. 以下コマンドを実行する
dconf write \
  /org/gnome/gedit/preferences/encodings/candidate-encodings \
  "['CURRENT', 'SHIFT_JIS', 'UTF-8', 'UTF-16']"

実行結果

f:id:kagasu:20200131111018p:plain

C#でドメインからTLDを取得する方法

Ⅰ. はじめに

タイトルの通り「C#ドメインからTLDを取得する方法」です。

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
Install-Package Nager.PublicSuffix
2. サンプルプログラムを書く
var domainParser = new DomainParser(new WebTldRuleProvider());

var domainName = domainParser.Get("sub.test.co.uk");
Console.WriteLine(domainName.TLD);

//domainName.Domain = "test";
//domainName.Hostname = "sub.test.co.uk";
//domainName.RegistrableDomain = "test.co.uk";
//domainName.SubDomain = "sub";
//domainName.TLD = "co.uk";

実行結果

co.uk

Linux に n8n をインストールする方法

Ⅰ. はじめに

タイトルの通り「Linux に n8n をインストールする方法」です。

Ⅱ. やり方

1. n8n をインストールする
npm install n8n -g
2. systemd ユニットファイルを作成する

/etc/systemd/system/n8n.service

[Unit]
Description=n8n service

[Service]
Restart=always
User=www-user
ExecStart=/usr/bin/node /usr/lib/node_modules/n8n/bin/n8n

[Install]
WantedBy=multi-user.target
3. サービスを起動する
systemctl enable n8n
systemctl start n8n
4, nginx をリバースプロキシとして設定する

/etc/nginx/conf.d/n8n.conf

server {
  listen 80;
  server_name example.com

  location / {
    proxy_pass         http://localhost:5678;
    proxy_http_version 1.1;
    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection keep-alive;
    proxy_set_header   Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
  }
}
5. nginx を再起動する
systemctl restart nginx

実行結果

f:id:kagasu:20200103103150p:plain:h200