basyura's blog

あしたになったらほんきだす。

最近読んだ記録

Docker + SQLServer + Azure Data Studio

はじまり

SQL をそろそろ真面目にやらないとレビューアとして成立しないなと重い腰を上げる。SQL 知識皆無ではないしパフォーマンス改善のための活動はしていたのだけど、詳しい人に頼りつつ回している状況だった。詳しい人が抜けてしまったので改めて。JOIN があると悩み始めるレベルで、凝ったクエリになるとウンコードといっしょじゃんと思ってしまい思考が停止してしまう。脳力が低いのでコードを書くときは理解しやすいよう気をつけてやってきたのに、このクエリときたら・・・となる。分解して考えれば分かるとは言われるものの、それはそうだけどもうちょっとなんとかならないのかなと思う。

Docker で SQLServer (mssql) を入れる

# イメージ取得
$ docker pull mcr.microsoft.com/mssql/server
# コンテナ起動
$ docker run --name mssql \
          -e "ACCEPT_EULA=Y" \
          -e "SA_PASSWORD=<strong password>" \
          -e "MSSQL_LCID=1041" \
          -e "MSSQL_COLLATION=Japanese_CI_AS" \
          -p 1433:1433 \
          -d mcr.microsoft.com/mssql/server
# コンテナに接続
$ docker exec -it <container_id|container_name> \
          /opt/mssql-tools/bin/sqlcmd \
          -S localhost \
          -U sa \
          -P <your_password>

パスワードポリシー に従って SA_PASSWORD を設定しないと起動しない (コンテナが起動してすぐ落ちる)。

既定で、パスワードは 8 文字以上の長さにする必要があり、次の 4 つのセットのうち 3 つから文字を含める必要があります。 大文字、小文字、10 進数、記号です。

これに気が付かずダメなのかと思って諦めかけた。

Azure Data Studio

業務では SSMS を使っているけど、構築環境が mac なので Azure Data Studio を使ってみる (SSMS は起動が遅いし、起動後も微妙に CPU を食うのが嫌)。

zip をダウンロードして展開するだけなので簡単。

接続設定

DB 作成

DB 作れた

見た目が VSCode と一緒だなと思ってバージョン情報を見ると、Electron、Chrome、 Node.js と書いてあるので一緒なんだろう。あまり触れてないけどやりたいことは十分できそうなので驚いた ( MS 網に包囲されまくっているのが日々嫌に思っているのだけど流石だなと認めざるをえない)

実行計画を表示

出し方が分からなくてさまよってしまった。

  • 「Command + Shift + P」でコマンドパレットを開く
  • コマンドパレットから「Preferences: Open User Settings」を開く
  • ユーザー設定画面で、「workbench.enablePreviewFeatures」を検索
  • 左側の鉛筆アイコンをクリックし、「false」から「true」へ変更

まとめ

Docker と MS のおかげではあるけど、サクッと環境を作れたのであとは学ぶのみ。 とりあえず JOIN の種類からおさらい・・・。

※ 最近の若者としゃべると DB を (でぃーびー) と言ってるのだけど、おっさんとしては慣例的に DB (でーびー) で定着してしまってるあたりがギャップを感じざるをえない。

Inoreader - Space のスクロール量を調整する

// ==UserScript==
// @name         inoreader
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.inoreader.com/*
// @match        https://jp.inoreader.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=inoreader.com
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const ele = document.getElementById("reader_pane");
    ele.addEventListener("keydown", (e) => {
        if (e.code == "Space") {
            let value = 100;
            if (e.shiftKey) {
                value = -1 * value;
            }
            ele.scrollTop += value;
            e.stopPropagation();
            e.preventDefault();
        }
    })
})();

Mac に ASP.NET Core を入れてリバースプロキシ経由のサーバーで自分のドメインとポートを取りたい

概要

諸事情あってタイトルのことをしたいのだけど、家には手頃な Windows 環境が無いので Mac でやってみる。ちなみに実環境は .Net Core ではない。

Install dotnet

$ brew install --cask dotnet-sdk

==> Downloading https://download.visualstudio.microsoft.com/download/pr/4332c16b-5a65-4adf-b25d-f6a46ef2b335/1a1edc2dab547161e2448390c3d4f56d/dotnet-sdk-6.0.202-osx-x64.pkg
######################################################################## 100.0%
==> Installing Cask dotnet-sdk
==> Running installer for dotnet-sdk; your password may be necessary.
Package installers may write to any location; options such as `--appdir` are ignored.
Password:
installer: Package name is Microsoft .NET SDK 6.0.202 (x64)
installer: Upgrading at base path /
installer: The upgrade was successful.
==> Linking Binary 'dotnet' to '/usr/local/bin/dotnet'
🍺  dotnet-sdk was successfully installed!

実行

$ dotnet

Usage: dotnet [options]
Usage: dotnet [path-to-application]

Options:
  -h|--help         Display help.
  --info            Display .NET information.
  --list-sdks       Display the installed SDKs.
  --list-runtimes   Display the installed runtimes.

path-to-application:
  The path to an application .dll file to execute.

サンプルを動かす

$ dotnet new webapp -o aspnetcoreapp

.NET 6.0 へようこそ!
---------------------
SDK バージョン: 6.0.202

テレメトリ
---------
.NET ツールは、エクスペリエンスの向上のために利用状況データを収集します。データは Microsoft によって収集され、コミュニティと共有されます。テレメトリをオプトアウトするには、好みのシェルを使用して、DOTNET_CLI_TELEMETRY_OPTOUT 環境変数を '1' または 'true' に設定できます。

.NET CLI ツールのテレメトリの詳細をご覧ください: https://aka.ms/dotnet-cli-telemetry

----------------
ASP.NET Core の HTTPS 開発証明書をインストールしました。
証明書を信頼するには、'dotnet dev-certs https --trust' (Windows および macOS のみ) を実行します。
HTTPS の詳細については、https://aka.ms/dotnet-https を参照してください
----------------
最初のアプリを作成するには、https://aka.ms/dotnet-hello-world を参照してください
最新情報については、https://aka.ms/dotnet-whats-new を参照してください
ドキュメントを探索するには、https://aka.ms/dotnet-docs を参照してください
GitHub で問題の報告とソースの検索を行うには、https://github.com/dotnet/core を参照してください
'dotnet --help' を使用して使用可能なコマンドを確認するか、https://aka.ms/dotnet-cli にアクセスしてください
--------------------------------------------------------------------------------------
テンプレート "ASP.NET Core Web App" が正常に作成されました。
このテンプレートには、Microsoft 以外のパーティのテクノロジが含まれています。詳しくは、https://aka.ms/aspnetcore/6.0-third-party-notices をご覧ください。

作成後の操作を処理しています...
/Users/user/repos/dotnet/dotnet-samples/tutorial1/aspnetcoreapp/aspnetcoreapp.csproj で ' dotnet restore ' を実行しています...
  復元対象のプロジェクトを決定しています...
  /Users/user/repos/dotnet/dotnet-samples/tutorial1/aspnetcoreapp/aspnetcoreapp.csproj を復元しました (101 ms)。
正常に復元されました。
$ dotnet dev-certs https --trust

Trusting the HTTPS development certificate was requested. If the certificate is not already trusted we will run the following command:
'sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain <<certificate>>'
This command might prompt you for your password to install the certificate on the system keychain.
A valid HTTPS certificate is already present.
$ cd aspnetcoreapp
$ ls

Pages               Properties          appsettings.json        obj
Program.cs          appsettings.Development.json    aspnetcoreapp.csproj        wwwroot
$ dotnet watch run

watch : Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload. Press "Ctrl + R" to restart.
watch : Building...
  復元対象のプロジェクトを決定しています...
  /Users/user/repos/dotnet/dotnet-samples/aspnetcoreapp/aspnetcoreapp.csproj を復元しました (137 ms)。
  aspnetcoreapp -> /Users/user/repos/dotnet/dotnet-samples/aspnetcoreapp/bin/Debug/net6.0/aspnetcoreapp.dll
watch : Started
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {aa4d01cd-b71d-4a04-a865-f6d68a688bad} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7013
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5263
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /Users/user/repos/dotnet/dotnet-samples/aspnetcoreapp/

実行結果

vim

vim + omnisharp-lsp を使おうとしたけど、cpu を使いまくるが動かないので削除・・・vscode に切り替える。 dotnet watch run で実行していると vscode で保存するとコンパイルが走って反映される (保存した後、正式にビルドをする方法が分からない)。

Go でリバースプロキシ

流用させてもらって・・・

※ ワイルドカードの使い方が分からなくてゴリゴリ。

package main

// Go 言語でリバースプロキシ
// https://qiita.com/penguinshunya/items/93f4609459e5cb97836e

import (
    "net/http/httputil"
    "net/url"
    "time"

    "github.com/gin-gonic/gin"
)

func main() {
    // サーバーを作成する
    sv := gin.Default()

    sv.GET("/", makeReverseProxy("7013"))
    sv.GET("/_framework/aspnetcore-browser-refresh.js", makeReverseProxy("7013"))
    sv.GET("/aspnetcoreapp.styles.css", makeReverseProxy("7013"))
    sv.GET("/css/site.css", makeReverseProxy("7013"))
    sv.GET("/favicon.ico", makeReverseProxy("7013"))
    sv.GET("/js/site.js", makeReverseProxy("7013"))
    sv.GET("/lib/bootstrap/dist/css/bootstrap.min.css", makeReverseProxy("7013"))
    sv.GET("/lib/bootstrap/dist/js/bootstrap.bundle.min.js", makeReverseProxy("7013"))
    sv.GET("/lib/jquery/dist/jquery.min.js", makeReverseProxy("7013"))

    // 非同期にサーバーを立ち上げる
    go sv.Run(":10000")

    // プログラムが終わらないようにする
    time.Sleep(time.Hour)
}

func makeReverseProxy(port string) func(*gin.Context) {
    return func(c *gin.Context) {
        remote, _ := url.Parse("https://localhost:" + port)
        proxy := httputil.NewSingleHostReverseProxy(remote)
        proxy.ServeHTTP(c.Writer, c.Request)
    }
}

ホストを取りたい

リバースプロキシの localhost:10000 ではなく、実際に処理するサーバーの localhost:7013 を取りたい。ドメインも同様に。

httpContext の Request.Uri.Authority を見れば取れてたんだけど、今回の環境では API が無いのでどう取っていいのか分からない。取れないことは無いと思うんだけど。

残念。

vscode

久しぶりに vscode 使った。もちろん vim plugin 入りで。それ以外にもキー設定はしているのだけど、普通にプログラミングできるなと思うなど (あまり違和感を感じなかった)。

Google のデザインが変わった

すべて、ニュースといったカテゴリ?が上にあったのが左に移動してた。画面サイズを小さくしても狭まるわけでもなく邪魔くさいので Stylus でアイコン表示だけにして "もっと見る" は消し去った。

/* 左バー */
.LaG5Le {
    width:60px;
    padding-left:0px;
    margin-right:10px;
}
/* もっと見る */
.rIbAWc {
    display:none;
}

before

after

クラス名が変わったら合わせて変えないといけないけど、ウインドウサイズを半分にしても結果が見れるようになったのでひとまず OK。

Inkdrop - sidetoc plugin v2.0.0 release

Release

選択しているセクション(ヘッダ)の背景色と文字色が UI テーマに従って切り替わるように変更しました。合わせて、背景色を変えるための highlightColor を廃止し、highlightBgColorhighlightFgColor に変更しました。highlightColor を指定していた場合はリセットされる (無視される) ことになりますが特に問題ないでしょう。多少スタイルの構造を変えたこともあるので v1 から v2 に上げました。

key default
highlightColor #C5EAFB - Obsolete!!
highlightBgColor --note-list-view-item-active-background
highlightFgColor --note-list-view-item-active-color

css variables を初期値としていますが、#FFFFFF や red なども指定することができますが UI テーマを変更しても固定になります。

微妙にパフォーマンス改善を入れてみましたが体感できるレベルかはちょっと微妙。

動機

本家 Youtube で紹介されたのは嬉しかったものの、ダーク系 UI ではデフォルトの背景色が合わなすぎて微妙な感じになってしまってた。僕は Default Light UI と Default Light Syntax を使っているのが原因でもあり、UI によってどの色を指定するかは難しいので設定で変えてくれよのスタンスでした。Issue で UI によって変えてほしいリクエストがだいぶ前に来ていたものの断っていたのと、デフォルトを変えたいんだけどソースコード直したよってのもあって (plugin の設定画面知らないのかな・・・) 今回の対応に踏み切りました。ただ、Default Light UI の --note-list-view-item-active-background(or color) は強めの色で主張が激しいんだよなぁってのがちょっとひかかるので自分では色指定しているっていうアレ。