PowerShell でコマンドや変数の文字色を変える
ターミナルの黒画面に飽きて色を変えてみてますが コマンドの出力に色がついてるところだと 色が被ったり影響が出るのですよね
Windows Terminal だと設定の中にテーマを設定するところがあって そこで文字色や背景色を設定できます

wt-color

通常の文字色と背景色以外にも 黒や赤などの色も設定できます
背景色の上に表示してはっきりと文字が見えるように調整できます
色名は参考のものでしかないので 赤なのに実際の色は青みたいなこともできます
アプリケーション側で赤色って指定されたときに画面に出す色を設定する感じです
これのお陰で色を変えてもきれいに見れるように調整できます

これだけでもいいのですが PowerShell 側で色を付けてる部分は PowerShell の設定で変更できます
ユーザーが入力する部分で コマンドは黄色で変数は緑色みたいなのです

ps-color1

ここでどの色を出すかは PowerShell 側に設定があって Get-PSReadLineOption で取得できます

PS C:\Users\WDAGUtilityAccount> Get-PSReadLineOption

EditMode : Windows
AddToHistoryHandler :
HistoryNoDuplicates : True
HistorySavePath : C:\Users\WDAGUtilityAccount\AppData\Roaming\Microsoft\Windows\PowerShell\PSRea
dLine\ConsoleHost_history.txt
HistorySaveStyle : SaveIncrementally
HistorySearchCaseSensitive : False
HistorySearchCursorMovesToEnd : False
MaximumHistoryCount : 4096
ContinuationPrompt : >>
ExtraPromptLineCount : 0
PromptText : >
BellStyle : Audible
DingDuration : 50
DingTone : 1221
CommandsToValidateScriptBlockArguments : {ForEach-Object, %, Invoke-Command, icm...}
CommandValidationHandler :
CompletionQueryItems : 100
MaximumKillRingCount : 10
ShowToolTips : True
ViModeIndicator : None
WordDelimiters : ;:,.[]{}()/\|^&*-=+'"–—―
CommandColor : "$([char]0x1b)[93m"
CommentColor : "$([char]0x1b)[32m"
ContinuationPromptColor : "$([char]0x1b)[37m"
DefaultTokenColor : "$([char]0x1b)[37m"
EmphasisColor : "$([char]0x1b)[96m"
ErrorColor : "$([char]0x1b)[91m"
KeywordColor : "$([char]0x1b)[92m"
MemberColor : "$([char]0x1b)[97m"
NumberColor : "$([char]0x1b)[97m"
OperatorColor : "$([char]0x1b)[90m"
ParameterColor : "$([char]0x1b)[90m"
SelectionColor : "$([char]0x1b)[30;47m"
StringColor : "$([char]0x1b)[36m"
TypeColor : "$([char]0x1b)[37m"
VariableColor : "$([char]0x1b)[92m"

◯◯Color になってるところは実際の色で表示されています
コマンドの色を変更してみます

Set-PSReadLineOption -Colors @{ "Command"="$([char]0x1b)[33m" }

ps-color2

エスケープとして出力する文字が変わるものなので 過去ログは変わらず変更後の行だけ変わります
33 や 93 の数字が色に対応してます
エスケープの詳細は wikipedia 参照です
https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters

38 や 48 を使うと 8bit/24bit で色を絶対値指定できますが これを使うと色名を通さないのでユーザーが変更できないです
そうなると背景色等のカスタマイズと相性が悪いのであまり使わないほうが良さそうです



ちなみに上のは標準の PowerShell でしたが 新しい PowerShell だと少しプロパティが追加されていて エスケープの表記方法も変わっていました
「$([char]0x1b)」 → 「`e」 とシンプルになってます

PowerShell 7.4.1
PS C:\Users\WDAGUtilityAccount> Get-PSReadLineOption

EditMode : Windows
AddToHistoryHandler : System.Func`2[System.String,System.Object]
HistoryNoDuplicates : True
HistorySavePath : C:\Users\WDAGUtilityAccount\AppData\Roaming\Microsoft\Windows\PowerShell\PSRea
dLine\ConsoleHost_history.txt
HistorySaveStyle : SaveIncrementally
HistorySearchCaseSensitive : False
HistorySearchCursorMovesToEnd : False
MaximumHistoryCount : 4096
ContinuationPrompt : >>
ExtraPromptLineCount : 0
PromptText : {> }
BellStyle : Audible
DingDuration : 50
DingTone : 1221
CommandsToValidateScriptBlockArguments : {ForEach-Object, %, Invoke-Command, icm…}
CommandValidationHandler :
CompletionQueryItems : 100
MaximumKillRingCount : 10
ShowToolTips : True
ViModeIndicator : None
WordDelimiters : ;:,.[]{}()/\|!?^&*-=+'"–—―
AnsiEscapeTimeout : 100
PredictionSource : HistoryAndPlugin
PredictionViewStyle : InlineView
TerminateOrphanedConsoleApps : False
CommandColor : "`e[93m"
CommentColor : "`e[32m"
ContinuationPromptColor : "`e[37m"
DefaultTokenColor : "`e[37m"
EmphasisColor : "`e[96m"
ErrorColor : "`e[91m"
InlinePredictionColor : "`e[97;2;3m"
KeywordColor : "`e[92m"
ListPredictionColor : "`e[33m"
ListPredictionSelectedColor : "`e[48;5;238m"
ListPredictionTooltipColor : "`e[97;2;3m"
MemberColor : "`e[37m"
NumberColor : "`e[97m"
OperatorColor : "`e[90m"
ParameterColor : "`e[90m"
SelectionColor : "`e[30;47m"
StringColor : "`e[36m"
TypeColor : "`e[37m"
VariableColor : "`e[92m"

またスタイルに関連する情報が入っている変数 $PSStyle が存在します

PS C:\Users\WDAGUtilityAccount> $psstyle

Reset : `e[0m
BlinkOff : `e[25m
Blink : `e[5m
BoldOff : `e[22m
Bold : `e[1m
DimOff : `e[22m
Dim : `e[2m
Hidden : `e[8m
HiddenOff : `e[28m
Reverse : `e[7m
ReverseOff : `e[27m
ItalicOff : `e[23m
Italic : `e[3m
UnderlineOff : `e[24m
Underline : `e[4m
StrikethroughOff : `e[29m
Strikethrough : `e[9m
OutputRendering : Host
Formatting.FormatAccent : `e[32;1m
Formatting.ErrorAccent : `e[36;1m
Formatting.Error : `e[31;1m
Formatting.Warning : `e[33;1m
Formatting.Verbose : `e[33;1m
Formatting.Debug : `e[33;1m
Formatting.TableHeader : `e[32;1m
Formatting.CustomTableHeaderLabel : `e[32;1;3m
Formatting.FeedbackName : `e[33m
Formatting.FeedbackText : `e[96m
Formatting.FeedbackAction : `e[97m
Progress.Style : `e[33;1m
Progress.MaxWidth : 120
Progress.View : Minimal
Progress.UseOSCIndicator : False
FileInfo.Directory : `e[44;1m
FileInfo.SymbolicLink : `e[36;1m
FileInfo.Executable : `e[32;1m
FileInfo.Extension : .zip,.tgz,.gz,.tar,.nupkg,.cab,.7z,.ps1,.psd1,.psm1,.ps1xml
Foreground.Black : `e[30m
Foreground.BrightBlack : `e[90m
Foreground.White : `e[37m
Foreground.BrightWhite : `e[97m
Foreground.Red : `e[31m
Foreground.BrightRed : `e[91m
Foreground.Magenta : `e[35m
Foreground.BrightMagenta : `e[95m
Foreground.Blue : `e[34m
Foreground.BrightBlue : `e[94m
Foreground.Cyan : `e[36m
Foreground.BrightCyan : `e[96m
Foreground.Green : `e[32m
Foreground.BrightGreen : `e[92m
Foreground.Yellow : `e[33m
Foreground.BrightYellow : `e[93m
Background.Black : `e[40m
Background.BrightBlack : `e[100m
Background.White : `e[47m
Background.BrightWhite : `e[107m
Background.Red : `e[41m
Background.BrightRed : `e[101m
Background.Magenta : `e[45m
Background.BrightMagenta : `e[105m
Background.Blue : `e[44m
Background.BrightBlue : `e[104m
Background.Cyan : `e[46m
Background.BrightCyan : `e[106m
Background.Green : `e[42m
Background.BrightGreen : `e[102m
Background.Yellow : `e[43m
Background.BrightYellow : `e[103m

Set-PSReadLineOption で色を変更するときに色に対応する数字を覚えなくてもここから参照できて便利です

ここの変数を直接更新できないかなと試しましたが ReadOnly プロパティと言われてダメでした

PS C:\Users\WDAGUtilityAccount> $PSStyle.Background.Red = $PSStyle.Foreground.Red
InvalidOperation: 'Red' is a ReadOnly property.
PS C:\Users\WDAGUtilityAccount> $PSStyle | Get-Member background

TypeName: System.Management.Automation.PSStyle

Name MemberType Definition
---- ---------- ----------
Background Property System.Management.Automation.PSStyle+BackgroundColor Background {get;}

PS C:\Users\WDAGUtilityAccount> $PSStyle.Background | Get-Member black

TypeName: System.Management.Automation.PSStyle+BackgroundColor

Name MemberType Definition
---- ---------- ----------
Black Property string Black {get;}

getter しか用意されてないですね
PowerShell 起動時に実行されるスクリプト
これまで気にしたこと無かったですが PowerShell でも bash の .bashrc などのように起動時に実行するスクリプトが登録できるようです

ファイルの場所は決まっていて $profile 変数に入ってます

PS C:\Users\WDAGUtilityAccount> $PROFILE | select *

AllUsersAllHosts : C:\Program Files\PowerShell\7\profile.ps1
AllUsersCurrentHost : C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\WDAGUtilityAccount\Documents\PowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\WDAGUtilityAccount\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
Length : 81

AllUsers だと PowerShell の実行ファイルと同じ場所で CurrentUser だとそのユーザーのドキュメントフォルダの中みたいです
ユーザーは Sandbox ユーザーのものです
ユーザーフォルダと違ってドキュメントフォルダというのが少し微妙な感じがします

インストールせずに zip 版を使うと AllUsers は展開先になります

PS C:\> $PROFILE | select *

AllUsersAllHosts : C:\Users\WDAGUtilityAccount\Desktop\PowerShell-7.4.1-win-x64\profile.ps1
AllUsersCurrentHost : C:\Users\WDAGUtilityAccount\Desktop\PowerShell-7.4.1-win-x64\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\WDAGUtilityAccount\Documents\PowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\WDAGUtilityAccount\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
Length : 81

デフォルトで入ってる古い PowerShell の場合はこうでした

PS C:\Users\WDAGUtilityAccount> $PROFILE | select *

AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\WDAGUtilityAccount\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\WDAGUtilityAccount\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length : 88

CurrentUser の方がドキュメントフォルダの中なのは同じですが 最近の方だと PowerShell だったところが WindowsPowerShell になっていて別フォルダでした
getClientRects と getBoundingClientRect の違い
たまに使おうとするとどっちだっけってなるやつです
どちらも Element のメソッドで要素の場所やサイズを取得するものです

よく読めば違いは名前でわかるようになってます
getClientRects は複数形なので複数の DOMRect を取得します
それに対して getBoundingClientRect は単数なのでひとつです
Bounding という言葉からわかるように 全部の DOMRect を覆うひとつの DOMRect になります

基本は 1 つなのですが 折り返すケースでは複数の DOMRect に分かれます
例えばこういう HTML があって

<div>
<span>AAA AAA AAA AAA AAA</span>
<span>BBB BBB BBB BBB BBB</span>
</div>

見た目がこうなったとします

AAA AAA AAA AAA AAA BBB BBB BBB
BBB BBB

このとき A の span では

[getClientRects]

DOMRectList {
"0": DOMRect {
"x": 8,
"y": 8,
"width": 184.40625,
"height": 24,
"top": 8,
"right": 192.40625,
"bottom": 32,
"left": 8
}
}

[getBoundingClientRect]

DOMRect {
"x": 8,
"y": 8,
"width": 184.40625,
"height": 24,
"top": 8,
"right": 192.40625,
"bottom": 32,
"left": 8
}

となり getClientRects の結果は 1 つだけです
getBoundingClientRect で得られるものと同じです

それに対して B の span では

[getClientRects]

DOMRectList {
"0": DOMRect {
"x": 197.84375,
"y": 8,
"width": 107.765625,
"height": 24,
"top": 8,
"right": 305.609375,
"bottom": 32,
"left": 197.84375
},
"1": DOMRect {
"x": 8,
"y": 32,
"width": 70.03125,
"height": 24,
"top": 32,
"right": 78.03125,
"bottom": 56,
"left": 8
}
}

[getBoundingClientRect]

DOMRect {
"x": 8,
"y": 8,
"width": 297.609375,
"height": 48,
"top": 8,
"right": 305.609375,
"bottom": 56,
"left": 8
}

右上と左下の 2 つに分かれます
getBoundingClientRect ではこの 2 つを含む領域なので 大きめの矩形です
ほぼ親の div と一致します
横の僅かな隙間などがあるので完全には一致しません

基本は getBoundingClientRect で良いと思います
Fastify のセッション
久々に Fastify を使ったらセッションってどのプラグイン使えばいいのだっけとなったので
https://fastify.dev/ecosystem

公式のプラグインだと 3 種類

@fastify/cookie
@fastify/session
@fastify/secure-session

@fastify/cookie はセッションというよりは cookie を扱うライブラリ
だけど署名機能があるので koa の koa-session 相当のものならこれで十分
ただし あくまで cookie ライブラリなのでセッション風に特定のオブジェクトを更新するだけで後は自動でやってくれるということはない
cookie を読み取って署名チェックや cookie をレスポンスで送信するなどの制御は自分で実装する必要あり
それらを行うための関数は用意されるので addHook を使って onRequest や onSend にフックを追加すれば良い

@fastify/session はサーバーサイドのセッション
PHP みたいなもの
ID を cookie に書き込んでデータはサーバー側で持つ
デフォルトだとセッションデータはメモリ上に保持するのでセッション数が増えるとメモリを使うしサーバーのリスタートで消える
ストアの実装をカスタマイズできるのでちゃんとしたところで使うならファイル等に書き込んだほうがいい
redis に保存するなら一応コミュニティに別のプラグインがある
ただ スターがほとんどなくてマイナーみたいなのでストアを自作でもいいかも
このプラグインを使うのに @fastify/cookie が必須
内部で自動でやってくれないので自分でインストールと register しないといけない

@fastify/secure-session はクライアントサイドでデータを持つセッション
@fastify/cookie の署名とは違って暗号化してくれるのでユーザーが中身を見れない
hapi の iron 的なもの
暗号化には sodium-native を使ってる
sodium でググってると高速な暗号化というのを見かけたけど Node.js 組み込みの crypto と比べてどっちが速いのかはわからない
わざわざ外部のものを使ってるんだから組み込みよりは高速?
事前に付属ツールで鍵を発行しておいて プラグインの登録時にその鍵を渡す必要あり
鍵を使わずに secret にパスワード指定でも動かせるけど 起動時に毎回内部で鍵を生成してるので少し遅くなるらしい
内部で @fastify/cookie を使ってるけど @fastify/session とは違ってインストールも register も自動でやってくれるので意識しなくて良い
tmux で画面分割して操作したい
Docker のコンテナで作業中にもう一つターミナルが欲しくなるときが時々あります
もうひとつウィンドウを起動して コンテナ ID を調べて docker exec するのも少し面倒なので久々に tmux を使いましたが全然使い方がわかりません
ググっても必要以上の情報がありすぎなんですよね
ということで最低限の分割して切り替えて使うだけの方法

まずは tmux コマンドで起動します
tmux 起動中にプレフィックスキー (Ctrl-B) を押した後になにかのキーを押すことで tmux を操作できます

" → 上下に分割
% → 左右に分割
o → 分割したペインのフォーカス切り替え
z → 分割したペインの最大化切り替え
{ → 分割したペインの並び変更(前と交換)
} → 分割したペインの並び変更(次と交換)

不便な点として tmux を使うと過去のログも tmux 内で管理されてしまい ターミナル上のマウススクロール機能で戻れないです
プレフィックスキーと [ キーで過去ログモードに入れます
エディタのようにカーソルを動かせます
Esc キーでキャンセルできます

一応マウスに対応させる設定もあるようですけど Linux や Mac の標準ターミナル向けみたいですし Windows でしかも WSL 内の Docker 内の tmux となると面倒ごとが多そうです
しかも 普段使いの環境ではなく 使い捨て環境に tmux を入れる前提なので tmux の設定ファイルを書き換えるみたいなのは向いてないのでパスです
HTML タグ一覧 (2023/3)
search タグが仕様に追加されたと聞いたので以前書いた HTML のタグリストの新しい版
whatwg の目次から抽出

The document element
html

Document metadata
head
title
base
link
meta
style

Sections
body
article
section
nav
aside
h1
h2
h3
h4
h5
h6
hgroup
header
footer
address

Grouping content
p
hr
pre
blockquote
ol
ul
menu
li
dl
dt
dd
figure
figcaption
main
search
div

Text-level semantics
a
em
strong
small
s
cite
q
dfn
abbr
ruby
rt
rp
data
time
code
var
samp
kbd
sub
sup
i
b
u
mark
bdi
bdo
span
br
wbr

Edits
ins
del

Embedded content
picture
source
img
iframe
embed
object
video
audio
track
map
area

Tabular data
table
caption
colgroup
col
tbody
thead
tfoot
tr
td
th

Forms
form
label
input
button
select
datalist
optgroup
option
textarea
output
progress
meter
fieldset
legend

Interactive elements
details
summary
dialog

Scripting
script
noscript
template
slot
canvas

全部で 112 個

前回の 106 から 6 つ増えてるけど 実際の差分は少し
前回はセクション名をそのまま使っていたので h1 ~ h6 や sub と sup が 1 行にまとまっていたけど 今回はそれぞれを 1 行にしてる

追加されたのは search 要素
消えたのは param 要素

section 16 に廃止機能がまとまっていて param はこっちに移動したみたい
このセクションの中だと marquee だけが他の有効な要素と同じ感じでセクション名に載ってる
そのせいで自動的に取り出したときに marquee も含まれてた
仕様に載ってるんだしとリストに入れておこうとしたけど セクションの中身を見ると他にも param とか frame とかの廃止要素も色々
入れるならそれらも入れないとバランスが悪い気がするけど 廃止要素も全部探すのは面倒なので section 16 は除外



ついでなので Chrome 上でコンストラクタがある要素 (Chrome 112 時点)

const ctors = Object.getOwnPropertyNames(window).filter(x => x.match(/^HTML.+Element$/)).toSorted()
copy(ctors.join("\n"))
HTMLAnchorElement
HTMLAreaElement
HTMLAudioElement
HTMLBRElement
HTMLBaseElement
HTMLBodyElement
HTMLButtonElement
HTMLCanvasElement
HTMLDListElement
HTMLDataElement
HTMLDataListElement
HTMLDetailsElement
HTMLDialogElement
HTMLDirectoryElement
HTMLDivElement
HTMLEmbedElement
HTMLFieldSetElement
HTMLFontElement
HTMLFormElement
HTMLFrameElement
HTMLFrameSetElement
HTMLHRElement
HTMLHeadElement
HTMLHeadingElement
HTMLHtmlElement
HTMLIFrameElement
HTMLImageElement
HTMLInputElement
HTMLLIElement
HTMLLabelElement
HTMLLegendElement
HTMLLinkElement
HTMLMapElement
HTMLMarqueeElement
HTMLMediaElement
HTMLMenuElement
HTMLMetaElement
HTMLMeterElement
HTMLModElement
HTMLOListElement
HTMLObjectElement
HTMLOptGroupElement
HTMLOptionElement
HTMLOutputElement
HTMLParagraphElement
HTMLParamElement
HTMLPictureElement
HTMLPreElement
HTMLProgressElement
HTMLQuoteElement
HTMLScriptElement
HTMLSelectElement
HTMLSlotElement
HTMLSourceElement
HTMLSpanElement
HTMLStyleElement
HTMLTableCaptionElement
HTMLTableCellElement
HTMLTableColElement
HTMLTableElement
HTMLTableRowElement
HTMLTableSectionElement
HTMLTemplateElement
HTMLTextAreaElement
HTMLTimeElement
HTMLTitleElement
HTMLTrackElement
HTMLUListElement
HTMLUnknownElement
HTMLVideoElement

70 種類

一部要素は共通のコンストラクタだし↓

document.createElement("del").constructor.name
// 'HTMLModElement'
document.createElement("ins").constructor.name
// 'HTMLModElement'

独自のコンストラクタを持たない要素もあるし↓

document.createElement("b").constructor.name
// 'HTMLElement'
document.createElement("article").constructor.name
// 'HTMLElement'

HTMLUnknownElement も含まれてるしで HTML タグの数と一致はしてない
PowerShell で◯◯したい
たまにしか使わないので PowerShell で◯◯したいってなったときに覚えれなくて毎回調べてるのでメモ

▶ コマンドを探したい

Get-Command

PS C:\Users\WDAGUtilityAccount> get-command

CommandType Name Version Source
----------- ---- ------- ------
Alias Add-AppPackage 2.0.1.0 Appx
Alias Add-AppPackageVolume 2.0.1.0 Appx
Alias Add-AppProvisionedPackage 3.0 Dism
...
...

Alias, Function, Cmdlet, Application と実行できるコマンドは種類問わず探せる

引数で検索ワードを指定できる
* や ? でワイルドカード指定もできる

PS C:\Users\WDAGUtilityAccount> get-command select*

CommandType Name Version Source
----------- ---- ------- ------
Alias select -> Select-Object
Cmdlet Select-Object 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-String 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-Xml 7.0.0.0 Microsoft.PowerShell.Utility

PS C:\Users\WDAGUtilityAccount> get-command i?x

CommandType Name Version Source
----------- ---- ------- ------
Alias iex -> Invoke-Expression

▶ alias を探したい

エイリアス名から実行されるコマンドを探すなら Get-Command でいいけどその反対
コマンドからそのコマンドを実行するエイリアスを探す
直接的なコマンドはなさそうなので Get-Command の結果から ResolvedCommand の Name が目的のに一致する行を探す

PS C:\Users\WDAGUtilityAccount> (get-command *)| ? { $_.ResolvedCommand.Name -eq "where-object" }

CommandType Name Version Source
----------- ---- ------- ------
Alias ? -> Where-Object
Alias where -> Where-Object

PS C:\Users\WDAGUtilityAccount> (get-command *)| ? { $_.ResolvedCommand.Name -eq "set-location" }

CommandType Name Version Source
----------- ---- ------- ------
Alias cd -> Set-Location
Alias chdir -> Set-Location
Alias sl -> Set-Location

データとして使える形式でなくて良ければ help を見れば書いてる

PS C:\Users\WDAGUtilityAccount> help cd

NAME
Set-Location

...
...

ALIASES
sl
cd
chdir

...
...

▶ コマンドの実行結果を grep したい

Select-String でテキストをフィルタできる

PS C:\Users\WDAGUtilityAccount> echo "a1`nb1`na2`nb2" > text.txt
PS C:\Users\WDAGUtilityAccount> cat text.txt
a1
b1
a2
b2
PS C:\Users\WDAGUtilityAccount> cat text.txt | select-string a

a1
a2

新しい PowerShell だとマッチしてる部分の色が変わる

PowerShell ではパイプで受け取るものはオブジェクトの配列
文字列以外のオブジェクトになってることもある
Select-String は文字列として検索するので文字列化されたものが対象になる

PS C:\Users\WDAGUtilityAccount> dir

Directory: C:\Users\WDAGUtilityAccount

Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r--- 11/5/2022 7:18 AM 3D Objects
d-r--- 11/5/2022 7:18 AM Contacts
d-r--- 11/5/2022 7:18 AM Desktop
d-r--- 11/5/2022 7:18 AM Documents
d-r--- 12/10/2022 4:37 PM Downloads
d-r--- 11/5/2022 7:18 AM Favorites
d-r--- 11/5/2022 7:18 AM Links
d-r--- 11/5/2022 7:18 AM Music
d-r--- 11/5/2022 7:18 AM Pictures
d-r--- 11/5/2022 7:18 AM Saved Games
d-r--- 11/5/2022 7:19 AM Searches
d-r--- 11/5/2022 7:18 AM Videos
-a---- 12/10/2022 5:16 PM 13 text.txt

PS C:\Users\WDAGUtilityAccount> dir | select-string Do

Documents
Downloads

PS C:\Users\WDAGUtilityAccount> dir | select-string 2022

dir で得られるオブジェクトは DirectoryInfo 型か FileInfo 型
DirectoryInfo 型は文字列化すると Name プロパティの値になる

PS C:\Users\WDAGUtilityAccount> (dir)[0].name
3D Objects
PS C:\Users\WDAGUtilityAccount> (dir)[0].tostring()
3D Objects

Do で検索すると Name プロパティに Do を含む Documents はマッチするけど 2022 で検索しても日付は検索対象にならないのでマッチしない

FileInfo 型は特殊で通常の文字列化ではなく ファイルの中身を読み取って検索する

PS C:\Users\WDAGUtilityAccount> dir | select-string b

3D Objects
text.txt:2:b1
text.txt:4:b2

ファイルの中身を検索した場合は ファイル名とマッチした行数も表示される

Get-Alias では文字列化するとエイリアスの名前になる
Name として表示されてる「(エイリアス名) -> (参照先)」は DisplayName プロパティ
文字列化した内容にエイリアスの参照先は含まれないので参照先では検索できない

PS C:\Users\WDAGUtilityAccount> get-alias

CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
...
...

PS C:\Users\WDAGUtilityAccount> get-alias | select-string Whe

where

「?」 がでなくてエイリアスの名前の方に whe を含む where がマッチする

▶ ファイルをダウンロードする

Invoke-WebRequest

古い PowerShell だと wget や curl がエイリアスに設定されていたけど新しい PowerShell だと iwr のみで wget などは使えない
最近は標準で curl.exe が存在するので紛らわしいからだと思う

Invoke-WebRequest http://localhost/test.zip -OutFile test.zip

ダウンロードする場合はファイル名が必須
自動でつけてくれない
curl で -O を使えば自動でつけてくれるのでこっちのほうがいいかも

PowerShell で curl を使う場合は名前をつけて保存するときにリダイレクトを使わないように注意が必要
PowerShell のリダイレクトは文字列化する変換処理が入るのでバイナリを保存するときに使うと壊れる

古い PowerShell だと Invoke-WebRequest が IE 設定を参照するらしくてエラーになることがある
IE を参照しないよう -UseBasicParsing オプションをつけると回避できる
curl を使うでもいいけどデフォルトでは curl は Invoke-WebRequest にエイリアス設定されてるので curl ではなく curl.exe にしないと Invoke-WebRequest が実行されてしまう

▶ コマンドの実行時間を測る

Measure-Command

ブロックの中に計測したいコマンドを書く
コマンドの出力はされない

PS C:\Users\WDAGUtilityAccount> function fib ($a) { if ($a -lt 2) { $a } else { (fib ($a - 1)) + (fib ($a - 2)) } }
PS C:\Users\WDAGUtilityAccount> Measure-Command { fib 30 }

Days : 0
Hours : 0
Minutes : 3
Seconds : 19
Milliseconds : 24
Ticks : 1990247069
TotalDays : 0.00230352670023148
TotalHours : 0.0552846408055556
TotalMinutes : 3.31707844833333
TotalSeconds : 199.0247069
TotalMilliseconds : 199024.7069

ブロックの中で Write-Host にパイプするとコマンドの出力も見れる

▶ select と where

Select-Object と Where-Object へのエイリアス

SQL や LINQ と同じ感じで where は行をフィルタして SELECT は列をフィルタする

PS C:\Users\WDAGUtilityAccount> $obj1 = [PSCustomObject]@{ foo = 1; bar = 2 }
PS C:\Users\WDAGUtilityAccount> $obj2 = [PSCustomObject]@{ foo = 3; bar = 4 }
PS C:\Users\WDAGUtilityAccount> $obj1, $obj2

foo bar
--- ---
1 2
3 4

PS C:\Users\WDAGUtilityAccount> $obj1, $obj2 | where foo -eq 1

foo bar
--- ---
1 2

PS C:\Users\WDAGUtilityAccount> $obj1, $obj2 | where bar -eq 4

foo bar
--- ---
3 4

PS C:\Users\WDAGUtilityAccount> $obj1, $obj2 | select foo

foo
---
1
3

PS C:\Users\WDAGUtilityAccount> $obj1, $obj2 | select bar

bar
---
2
4

PS C:\Users\WDAGUtilityAccount> $obj1, $obj2 | select bar, foo

bar foo
--- ---
2 1
4 3

多くのオブジェクトは普通に表示しても全部のプロパティを表示してくれない
select で * を指定して全部を表示できる

PS C:\Users\WDAGUtilityAccount> dir | where name -eq Desktop

Directory: C:\Users\WDAGUtilityAccount

Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r-- 11/5/2022 7:18 AM Desktop

PS C:\Users\WDAGUtilityAccount> dir | where name -eq Desktop | select *

PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\WDAGUtilityAccount\Desktop
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\WDAGUtilityAccount
PSChildName : Desktop
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : True
Mode : d-r--
ModeWithoutHardLink : d-r--
BaseName : Desktop
ResolvedTarget : C:\Users\WDAGUtilityAccount\Desktop
Target :
LinkType :
Parent : C:\Users\WDAGUtilityAccount
Root : C:\
FullName : C:\Users\WDAGUtilityAccount\Desktop
Extension :
Name : Desktop
Exists : True
CreationTime : 11/5/2022 7:18:11 AM
CreationTimeUtc : 11/4/2022 10:18:11 PM
LastAccessTime : 12/10/2022 7:28:05 PM
LastAccessTimeUtc : 12/10/2022 10:28:05 AM
LastWriteTime : 11/5/2022 7:18:14 AM
LastWriteTimeUtc : 11/4/2022 10:18:14 PM
LinkTarget :
UnixFileMode : -1
Attributes : ReadOnly, Directory

ブロックを使って各行に対して任意の式を適用することもできる

PS C:\Users\WDAGUtilityAccount> 1,2,3 | select { $_ + 10 }, { $_ * $_ }

$_ + 10 $_ * $_
--------- ---------
11 1
12 4
13 9

PS C:\Users\WDAGUtilityAccount> 1..10 | select { $_ }, { fib $_ }

$_ fib $_
---- --------
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55

▶ 要素数を数える

Measure-Object

PS C:\Users\WDAGUtilityAccount> dir Do*

Directory: C:\Users\WDAGUtilityAccount

Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r-- 11/5/2022 7:18 AM Documents
d-r-- 12/10/2022 4:37 PM Downloads

PS C:\Users\WDAGUtilityAccount> dir Do* | Measure-Object

Count : 2
Average :
Sum :
Maximum :
Minimum :
StandardDeviation :
Property :

PS C:\Users\WDAGUtilityAccount> gcm * | Measure-Object

Count : 2515
Average :
Sum :
Maximum :
Minimum :
StandardDeviation :
Property :
CJS モジュールを ESM 1 ファイル化する Rollup 設定
CJS + Node.js ビルトイン追加 + node_modules を参照する

インストール

yarn add rollup rollup-plugin-node-builtins rollup-plugin-node-resolve rollup-plugin-commonjs

[rollup.config.js]
import builtins from "rollup-plugin-node-builtins"
import resolve from "rollup-plugin-node-resolve"
import commonjs from "rollup-plugin-commonjs"

module.exports = {
input: "index.js",
output: {
file: "bundle.js",
format: "esm",
},
plugins: [
builtins(),
resolve(),
commonjs(),
],
}

index.js でエントリポイントモジュールを選択

[index.js]
module.exports = require("foo")

複数モジュールをまとめるなら

[index.js]
module.exports = {
foo: require("foo"),
bar: require("bar"),
baz: require("baz"),
}

ビルド

yarn rollup -c

bundle.js が出力される
グローバル IP を調べる方法
ローカルじゃなくてグローバルなので 外部のサーバと通信するしかない
普段は「ip 調べる」みたいなワードでググれば出てくる適当なサイトを見てる
だけど機械的にプログラムから取得したいときにはこれだと困る
IP を返してくれる API が必要

JSON ならここ
https://httpbin.org/ip

こういう JSON を返してくれる

{
"origin": "255.255.255.255"
}

IP アドレスだけなら JSON の必要もなくテキストでもいいので テキストでよければここ
https://checkip.amazonaws.com/

こんな感じでただのテキストとして取得できる

255.255.255.255

こっちは AWS のサービスなので それなりに安心
Node.js の GUI ライブラリ
Python だと GUI を作るライブラリで tkinter とか kivy とか聞くけど Node.js って NW.js や Electron くらいしか聞かない
ブラウザ組み込み系じゃなく GUI を作るライブラリってないのかなと調べてみた

● Node-Qt
http://documentup.com/arturadib/node-qt (Github)

C++ Qt bindings
この手のライブラリはラップしてるだけだと思うので C++ で Qt 使ったことある人には向いてるかも
2014 年から更新されてない
bindings だし安定してるのか放置されてるのか

● node-gtk
(Github)

GNOME Gtk+ bindings
こっちは最終更新は 2020 年末で最近
Windows だと使えなさそう

● NodeGui
https://docs.nodegui.org/ (Github)

一番人気そうな GUI ライブラリ
内部は Qt 使ってるらしい
React や Vue にも対応してるらしいけど そういうの使うなら Electron でいい気がする
React Native は Windows 版もあった気がするし

● Yue
https://libyue.com/ (Github)

リポジトリ内に C++, Lua, Node.js がまとめて入っていてドキュメントも同じサイトにまとまってる
Qt などの移植と違って元プロジェクト自体が 3 言語サポートしてるみたい
既存のライブラリに求めてるのがなかったから自作したらしい
内部的に何使ってるかまでわかってない
base フォルダを見るに一部 Chromium のコードを流用してる?
Windows 版は GDI+ で将来的に Direct2D に置き換え予定だとか
Rust のドキュメントまとめ
ググって Rust のドキュメントのページを開いたときに 同じような見た目なのに別ドキュメントになってることが多くて まとめてほしかったので公式サイト内のリンクにあったのをまとめた
後半はほとんど見ることなさそう

The Rust Programming Language - The Rust Programming Language
https://doc.rust-lang.org/book/title-page.html

Introduction - Rust By Example
https://doc.rust-lang.org/stable/rust-by-example/index.html

Introduction - The Rust Reference
https://doc.rust-lang.org/reference/index.html

Introduction - The Edition Guide
https://doc.rust-lang.org/edition-guide/index.html

Getting started - Command Line Applications in Rust
https://rust-cli.github.io/book/index.html

Introduction - Rust and WebAssembly
https://rustwasm.github.io/book/introduction.html

Overview - Rust Forge
https://forge.rust-lang.org/index.html

Introduction - The Cargo Book
https://doc.rust-lang.org/cargo/index.html

What is rustdoc? - The rustdoc book
https://doc.rust-lang.org/rustdoc/index.html

What is rustc? - The rustc book
https://doc.rust-lang.org/rustc/index.html

Introduction - The Embedded Rust Book
https://doc.rust-lang.org/embedded-book/index.html

Introduction - The Rustonomicon
https://doc.rust-lang.org/nomicon/index.html

The Unstable Book - The Rust Unstable Book
https://doc.rust-lang.org/nightly/unstable-book/index.html
***ctl コマンド
systemctl や timedatectl や hostnamectl みたいなの

他になにあるんだろうと bin と sbin フォルダで検索してみた結果

環境は fedora 31 で 追加で入れたパッケージに入ってたものもあるし (pg_ctl など) 入れてないパッケージのものは含まれてないから網羅できてるわけでもない

~> ls /usr/bin | grep ctl
bluetoothctl
bootctl
busctl
coredumpctl
evmctl
hostnamectl
journalctl
kdumpctl
keyctl
localectl
loginctl
networkctl
pg_ctl
portablectl
resolvectl
systemctl
teamdctl
timedatectl
udisksctl
wdctl
~> ls /usr/sbin | grep ctl
apachectl
auditctl
brctl
cupsctl
remotectl
smartctl
sysctl
usernetctl
zramctl
正規表現の Unicode Property
new RegExp(/\p{sc=Hiragana}/u)

みたいなの
他言語だと 「sc=」 がいらないようでそれを参考にしたらエラーが出る

JavaScript の Unicode Property の指定方法はこれ

// Non-binary values
\p{UnicodePropertyValue}
\p{UnicodePropertyName=UnicodePropertyValue}

// Binary and non-binary values
\p{UnicodeBinaryPropertyName}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes

「For most values, the UnicodePropertyName part and equals sign may be omitted.」(ほとんどの値で UnicodePropertyName とイコール記号は省略できる)って書いてるのに Hiragana はだめらしい

その他指定できるプロパティの一覧
https://www.ecma-international.org/ecma-262/10.0/index.html#sec-runtime-semantics-unicodematchproperty-p

ECMAScript のスペックは whatwg みたいに分割版がなくて ES2019 が全部入りのページなせいでかなり重い
今後更新されないはずだけどそう変わるものでもないので 提案時のスペック見るのもあり

https://tc39.es/proposal-regexp-unicode-property-escapes/#sec-runtime-semantics-unicodematchproperty-p
JavaScript の enum 値の例
JavaScript では enum 値は文字列で扱うものが多い
定数にいれた数値を使う C 系に多い方法はあんまりない
数値はわかりづらいし 数値も文字列もほぼ同じように扱える言語で数値にするメリットはほとんどない

JavaScript の標準の機能は 最近のものだと最初から文字列になってる
昔からあるものは数値のがいくつかあったけど 今では非推奨になって文字列版の代替が用意されたものが多め
はっきりどこか覚えてないけど提案段階もしくは普及前段階で数値の入った定数を渡す API だったものが 文字列で指定するものに変わったのもあったはず

◯ キーボード

昔は keyCode で Enter が 13 みたいな数字
今では keyCode は非推奨で code や key を使う
これには "Enter" みたいな文字列が入ってる

◯ DOMException

DOMException エラーオブジェクトでは code プロパティににエラーの種類を表す数値が入ってる
ただしこのプロパティは非推奨で name プロパティにエラーの名前が文字列で入ってるのでこっちを使う

◯ nodeType

Node のプロパティ nodeType にノードの種類(HTML 要素やテキストノードやコメントノード)が数値で入ってる
文字列の代替はなくて数値のみ
instanceof を使って判定もできる

◯ モード・タイプ

動作モードやタイプを指定する場合文字列で名前指定することが多い
多いのでまとめて

▶ IndexedDB ("readwrite" など)
▶ ShadowDOM ("closed" など)
▶ Canvas Context ("2d" など)
▶ Event Type ("click" など)
▶ Mutation Record Type ("childList" など)
▶ typeof ("number" など)
▶ fetch オプション credential, mode, redirect, ... ("omit", "cors", "follow", "no-cache" など)
▶ crypt オプション keytype, algorithm ("pkcs", "HMAC" など)
▶ Fullscreen Option navigationUI ("show" など)
▶ WebAnimaion playState ("paused" など)
▶ WebAnimaton オプション easing, fill ("linear", "forwards" など)
▶ XHR, fetch の HTTP メソッド ("GET" など)



JavaScript と書いたけどほとんどが ブラウザ固有の Web API のもの
この辺りは HTML 属性やタグなどが文字列だから合わせてるのもありそう

ただ ECMAScript 部分でも最近の機能は文字列のものもある

◯ Promise.allSettled

返り値の status プロパティが "fulfilled" または "rejected" の文字列

◯ Atomics.wait

返り値が "ok" や "timed-out"
JavaScript の組み込みオブジェクト型
JavaScript で Date や RegExp みたいな組み込みのオブジェクト型って何あったっけって思うことが多いので調べたまとめ
グローバルオブジェクトがコンストラクタのはずなので ES2019 のスペックから一覧

18.3 Constructor Properties of the Global Object

18.3.1 Array (...)
18.3.2 ArrayBuffer (...)
18.3.3 Boolean (...)
18.3.4 DataView (...)
18.3.5 Date (...)
18.3.6 Error (...)
18.3.7 EvalError (...)
18.3.8 Float32Array (...)
18.3.9 Float64Array (...)
18.3.10 Function (...)
18.3.11 Int8Array (...)
18.3.12 Int16Array (...)
18.3.13 Int32Array (...)
18.3.14 Map (...)
18.3.15 Number (...)
18.3.16 Object (...)
18.3.17 Promise (...)
18.3.18 Proxy (...)
18.3.19 RangeError (...)
18.3.20 ReferenceError (...)
18.3.21 RegExp (...)
18.3.22 Set (...)
18.3.23 SharedArrayBuffer (...)
18.3.24 String (...)
18.3.25 Symbol (...)
18.3.26 SyntaxError (...)
18.3.27 TypeError (...)
18.3.28 Uint8Array (...)
18.3.29 Uint8ClampedArray (...)
18.3.30 Uint16Array (...)
18.3.31 Uint32Array (...)
18.3.32 URIError (...)
18.3.33 WeakMap (...)
18.3.34 WeakSet (...)

プリミティブ型のコンストラクタや リテラルで書ける配列や関数のコンストラクタも入ってるので適当にグループ分けすると

プリミティブ型:
Boolean, Number, String, Symbol

リテラルで書ける基本的なオブジェクト型:
Array, Function, Object, RegExp

その他オブジェクト型:
Date, Map, Promise, Proxy, Set, WeakMap, WeakSet

バイナリ系オブジェクト型:
ArrayBuffer, DataView, Float32Array, Float64Array, Int8Array, Int16Array, Int32Array, SharedArrayBuffer, Uint8Array, Uint8ClampedArray, Uint16Array, Uint32Array

エラーオブジェクト型:
Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError


【おまけ】 その他グローバルオブジェクト

18.4 Other Properties of the Global Object

18.4.1 Atomics
18.4.2 JSON
18.4.3 Math
18.4.4 Reflect
fish で export を追加する
fish で環境変数を追加したいことがときどきあるけどよくやり方忘れてるのでメモ

~/.config/fish/config.fish

に設定を追加すればいいだけなんだけど 自分で作らないとこのファイル自体がなくて名前が config.fish だっけ fish.config だっけで迷う

fish では永続する環境変数をコマンドで作れるのでこっちのほうが楽
set -U で fish_user_paths に追加する
ユニバーサル変数って名前らしい

nodebrew の例
インストールしたら下を追加してくださいって指示が出る

export PATH=$HOME/.nodebrew/current/bin:$PATH

fish ではこのコマンドをうつ

set -U fish_user_paths $HOME/.nodebrew/current/bin $fish_user_paths

$PATH の代わりが $fish_user_paths でちょっと長い
このコマンドで設定したのは自動で生成される設定ファイルに追加されてる

.config/fish/fishd.0a0027000002

の最後に

SET fish_user_paths:/home/user/\x2enodebrew/current/bin

が増えてた

自動生成される設定ファイルの名前は環境によって違う
0a00~の部分は MacAddress らしい
自動生成ファイルはユーザが変更しても再作成でもとに戻るので直接書くのはダメ
ファイルの最初にも注意書きあり

# This file is automatically generated by the fish.
# Do NOT edit it directly, your changes will be overwritten.
datepicker 系ライブラリ
input の type="datetime-local" の日付入力サポートの変わりのライブラリを探してるけど
jQuery ありのものが多めで依存なしのは少なめ
日付だけでじゃなくて時刻も設定したいけど対応してるのは少なめ

マイナーなのも多いけど時刻も選べる jQuery いらずのライブラリのまとめ

flatpickr
https://flatpickr.js.org/

基本はこれでよさそう
各種フレームワークに対応していて star も 1 万超え
時刻入力は AM/PM じゃなくて 24 時間表記にしたいけど軽く見た感じ無理そう
カレンダーのサイズをもうちょっとコンパクトにしたい気がする

Material Design - Date & Time Picker
https://puranjayjain.github.io/md-date-time-picker/

moment.js とフォントロードの CSS が必要
見た目が結構好き
時刻をアナログ時計風に選択できるのがいいところ

simplepicker
https://priyank-p.github.io/simplepicker/index.html

パット見は良さそうだけど時刻入力がイマイチ
star もほぼないし (< 10) マイナーどころ

tail.DateTime
https://github.pytes.net/tail.DateTime/

見た目が好き
コンパクトでカレンダーの下で時刻選択ができる
時刻は 24 時間表記で選択できる
デモを試した感じ悪いところなさそうだけど star は少なめ (60)

Window Date Picker
https://cevadtokatli.github.io/window-date-picker/

見た目良さそうだけど カレンダーと時刻選択で画面変わるのがいまいち
star は 10 未満

Picker.js
https://fengyuanchen.github.io/pickerjs/

カレンダーを使わないのが特徴
タッチ操作で選択するときに出そうなそれぞれを回転させて選ぶやつ
カレンダーがいらないならこれでいいと思う
star は 200 ちょっとでそこそこある



条件外

Date Range Picker
https://www.daterangepicker.com/

日付の範囲を選ぶのに特化したライブラリ
高機能で star も 9000 以上ある
ただ jQuery 依存

Light Pick
https://wakirin.github.io/Lightpick/

時刻選択できない

pickadate.js
https://amsul.ca/pickadate.js/

star は 7000 超えと多め
だけど jQuery 依存

Pikaday
https://github.com/Pikaday/Pikaday

star は 7000 弱あって依存なし
datepicker であって時刻は対応しないみたい
時刻に対応したフォークはあるけどどれもメンテされてない
ssh 鍵作る
秘密鍵と公開鍵

ssh-keygen -t rsa

Windows のソフト用 ppk

puttygen id_rsa -O private -o id_rsa.ppk

WSL (Ubuntu) の場合の puttygen インストール

apt install putty-tools
イメージプレビュー系ライブラリ
Fancybox3
https://fancyapps.com/fancybox/3/
jQuery
良い感じだけど jQuery 依存なのだけがネック
モバイル対応や GPU アクセラレーションやマルチインスタンス対応など高機能なのでもったいない

Fullscreen Lightbox
https://fslightbox.com/javascript
VanillaJS
jQuery 依存ないし良い感じだけど無料版は基本機能だけ
ズーム・サムネ・キャプション・ツールバー など便利機能は有料版の PRO 必要

Lightbox2
https://lokeshdhakar.com/projects/lightbox2/
jQuery
これがこの系統ライブラリのスタンダード?
lightbox 系と呼ばれたりもするし元になったらライブラリぽい
jQuery 必要だし機能もシンプルで最低限だけみたいなので あえて選択はしなくていいかも

WA MediaBox
https://jiri.hybek.cz/wa-mediabox/
VanillaJS
ドキュメントみても情報少なめ(機能が自体が少なめ?)
DEMO の感じだと ZOOM とかキャプションなど高機能なものはなさそう
画像ロード遅め(DEMO の画像が重いだけかも)

PhotoSwipe
https://photoswipe.com/
VanillaJS
ツールバーやキャプションにズームなど 基本機能以上の機能があるしモバイルも対応
さらに VanillaJS ととても良さそうなのに特に聞かない名前だし ウェブサイトもシンプルでちょっと古めなイメージの見た目

lightgallery.js
https://sachinchoolur.github.io/lightgallery.js/
VanillaJS
VanillaJS ですごく高機能
ツールバーやキャプション・ズームに加えて サムネ表示やサムネにカーソル合わせたときのアニメーションもある
ウェブサイトもきれいでアニメーションやロード画面などあって PhotoSwipe よりできる感ある
VisualStudioCode の Untitled-X の保存場所
ファイルに保存する前の Untitled-X (X は連番) が保存されてる場所

C:\Users\USER\AppData\Roaming\Code\Backups\XXXXX\untitled

ちゃんとファイルに保存されてるので 強制終了とかがあっても復元できる

Code フォルダが VSCode のデータがあるフォルダ
Electron だからこのフォルダを見つければ Mac や Linux でも中身の構造は同じだと思う

USER はユーザ名

XXXXX は unixtime かハッシュ値
たぶんハッシュ値はフォルダを開いたりワークスペースを開いたりした場合の ID で unixtime はフォルダなどを開いてないときのもの

untitled フォルダ内にはハッシュ値のファイル名になっていて Untilted-X 形式の名前じゃない
ただのテキストなので開いてみればわかる
Nodist で yarn 使うときのパス
Windows に Nodist で Node.js を入れて yarn でパッケージをグローバルインストールすると自分でパスを通さないといけません
普通に Nodist をインストールすると 「C:\Program Files (x86)\Nodist」 にインストールされます
node.exe や npm.exe は 「C:\Program Files (x86)\Nodist\bin」 に保存されます
npm でグローバルにインストールしたパッケージのコマンドもここに配置されます
npm で yarn を入れたあとに確認してみると

user1@pc MINGW64 /c/Program Files (x86)/Nodist/bin
$ ls -1
bin/
etc/
node.exe*
node_modules/
nodist*
nodist.cmd
nodist.ps1
nodist.sh*
nodist_bash_profile_content.sh
npm.cmd
npm.exe*
yarn*
yarn.cmd
yarnpkg*

ここにはパスが通ってるので yarn コマンドは使えます
yarn でパッケージをグローバルインストールしたものはこのフォルダではなくそのさらに内側の bin フォルダにコマンドが配置されます
yarn で parcel をグローバルインストールしてみると

user1@pc MINGW64 /c/Program Files (x86)/Nodist/bin
$ ls bin -1
parcel*
parcel.cmd
parcel.cmd.ps1*
parcel.ps1*
parcel.ps1.cmd
parcel.ps1.ps1*

parcel はパスが通ってないのでそのままでは使えません
「C:\Program Files (x86)\Nodist\bin\bin」 にパスを通せばどこでも yarn でインストールしたツールが使えるようになります
SQL の IN / ANY / ALL
毎回のようによくわからなくなるのでまとめ

IN
IN で指定したどれかに行の値が一致すると true
NOT はどれにも一致しないと true
単純に IN にマッチしない行が true になる
「x NOT IN y」 と 「NOT (x IN y)」 は一緒

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c IN (1, 2)

-- 1, 2

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c NOT IN (1, 2)

-- 3, 4, 5

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE NOT (c IN (1, 2))

-- 3, 4, 5

ANY
通常は IN と一緒
postgresql の場合は配列を指定するので $1 などのパラメータ化できるのが特徴
<> を使うと配列の要素のどれにもマッチしない行が true になる
「x <> ANY(y)」 と 「NOT (x = ANY(y))」 は別
「NOT (x = ANY(y))」 を使うと 「x NOT IN y」 と同じになる

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c = ANY(ARRAY[1, 2])

-- 1, 2

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c <> ANY(ARRAY[1, 2])

-- 1, 2, 3, 4, 5

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c <> ANY(ARRAY[1, 1])

-- 2, 3, 4, 5

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE NOT (c = ANY(ARRAY[1, 2]))

-- 3, 4, 5

SOME
ANY と全く同じ

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c = SOME(ARRAY[1, 2])

-- 1, 2

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c <> SOME(ARRAY[1, 2])

-- 1, 2, 3, 4, 5

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c <> SOME(ARRAY[1, 1])

-- 2, 3, 4, 5

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE NOT (c = SOME(ARRAY[1, 2]))

-- 3, 4, 5

ALL
配列の全てに一致する行が true になる
<> するとひとつでも一致しないのがあると true になる
「x <> ALL(y)」 と 「NOT (x = ALL(y))」 は別
「x <> ALL(y)」 と 「NOT (x = ANY(y))」 が同じになる

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c = ALL(ARRAY[1, 2])

-- none

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c = ALL(ARRAY[1, 1])

-- 1

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE c <> ALL(ARRAY[1, 2])

-- 3, 4, 5

SELECT c
FROM unnest(ARRAY[1,2,3,4,5]) as c
WHERE NOT (c = ALL(ARRAY[1, 2]))

-- 1, 2, 3, 4, 5
JavaScript の上書きできるプロパティ
よくわからなくなるので

const x = {}
Object.defineProperty(x, "a", {configurable: false, writable: false, value: 1})
Object.defineProperty(x, "b", {configurable: false, writable: true, value: 1})
Object.defineProperty(x, "c", {configurable: true, writable: false, value: 1})
Object.defineProperty(x, "d", {configurable: true, writable: true, value: 1})

// Object.defineProperty(x, "a", {value: 2}) -> cannot redifine
Object.defineProperty(x, "b", {value: 2})
Object.defineProperty(x, "c", {value: 2})
Object.defineProperty(x, "d", {value: 2})

// {a: 1, b: 2, c: 2, d: 2}

configurable と writable の両方が false のは再定義できない
dnf の使い方サンプル
なにかおかしいとき

dnf clean all


履歴の一覧

sudo dnf history


履歴一覧から指定パッケージを含むものだけ

sudo dnf history git

upgrade もでてくる


履歴の詳細

sudo dnf history info 1

履歴の番号を指定する
スペース区切りで複数指定できる


指定のパッケージを含む履歴の詳細

sudo dnf history info python3

パッケージを含む履歴番号が複数あるなら全部表示される


ユーザがインストールしたものだけ

sudo dnf history userinstalled

依存関係で入ったのが出てこないので別環境に移行するときになにをインストールするか考えるときに便利
自分でインストールしてないのも少しある kernel, grub2, lvm2, xfsprogs など


パッケージの詳細

dnf info nano


指定パスのファイルを含むパッケージの詳細

dnf info /usr/bin/zsh


パッケージのインストール

sudo dnf install v8


指定パスのファイルを含むパッケージのインストール

sudo dnf install /usr/bin/fish


URL の rpm をインストール

sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-28.noarch.rpm


ローカルの rpm をインストール

sudo dnf install /tmp/download/dmd-2.080.0-0.fedora.x86_64.rpm


グループをインストール

sudo dnf install @GNOME
sudo dnf group install GNOME

install からグループをインストールするには @ が必要
group install に @ つけるとグループが見つからない


グループのサマリー

dnf group


グループの一覧

dnf group list


グループの詳細

dnf group info KDE


パッケージの再インストール

sudo dnf reinstall sqlite


指定パスのファイルを含むパッケージの再インストール

sudo dnf reinstall /var/lib/pgsql


パッケージのアンインストール

sudo dnf remove php


指定パスのファイルを含むパッケージのアンインストール

sudo dnf remove /var/lib/mysql


パッケージすべてをアップグレード

sudo dnf upgrade


指定のパッケージをアップグレード

sudo dnf upgrade kernel


アップグレードのあるパッケージ一覧

dnf list upgrades


全パッケージの一覧

dnf list


パッケージ検索

dnf list fire\*
dnf search fire\*

list だとパッケージ名から検索する
インストール済みや利用可能などにわけられてる
search だと名前と概要から検索する
インストール済みかどうかは見えない


指定パスのファイルを含むパッケージを検索

dnf list /usr/bin/irb
dnf provides /usr/bin/irb

表示のされ方が違うけど結果は同じ


最近更新のあったパッケージ一覧

dnf list recent

最近がどれくらいなのかは知らない


インストール済みパッケージ一覧

dnf list installed
rpm -qa


リポジトリ一覧

dnf repolist
dnf repolist --all

--all があると有効無効も表示される


リポジトリの詳細

dnf repoinfo


指定リポジトリの詳細

dnf repoinfo fedora


アップデート情報

dnf updateinfo

アップデートの内容のサマリー
セキュリティ通知が 5 件 バグ修正通知が 20 件 みたいな情報が表示される


指定パッケージのアップデート情報

dnf updateinfo nginx


指定パッケージを必要としているパッケージを検索

dnf repoquery --whatrequires nodejs


指定パッケージをレコメンドするパッケージを検索

dnf repoquery --whatrecommends npm

npm なら nodejs がでてくる


パッケージの中のファイル一覧を表示

dnf repoquery -l micro
rpm -ql micro


インストールする rpm の場所(URL)を表示

dnf repoquery --location clang


エイリアスみたいなもの

dnf repoquery --whatprovides python

python をインストールすると実際にインストールされるパッケージを見れる
python2 が表示される
mysql だと community-mysql と mariadb の 2 つがあるけど実際にインストールされるのは mariadb のほう


OS アップグレード

プラグイン dnf-plugin-system-upgrade を入れて

sudo dnf system-upgrade download --releasever=28
sudo dnf system-upgrade reboot

ダウンロード後に reboot でアップグレードされる


nevra

name, epoch, version, release, arch のこと

httpd-0:2.4.33-5.fc28.x86_64

名前         : httpd
バージョン : 2.4.33
リリース : 5.fc28
アーキテクチ : x86_64
VM の HDD サイズを拡張する
環境ごとの方法で VM の仮想 HDD サイズを適当に広げる

parted で LVM パーテーションを広げる
parted

parted の中で
resizepart 2 100%
「2」 のところは parted 中に 「p」 で表示されるパーテーション ID

pvresize で Physical volume を広げる
pvresize /dev/sda2

lvresize で Logical volume を広げる
lvresize -l +100%FREE /dev/fedora/root

xfs_growfs でファイルシステムを広げる
xfs_growfs /
/dev/mapper/fedora-root や /dev/fedora/root だと 「is not a mounted XFS filesystem」 と言われるのでマウントしてる場所を指定
C# でスクリプト実行
NuGet で Microsoft.CodeAnalysis.CSharp.Scripting をインストールする

using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;

namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private async void Button_Click(object sender, RoutedEventArgs e)
{
var runner = new RSRunner();
var state = await runner.run("var x = plusOne(1);");
MessageBox.Show(state.ReturnValue?.ToString());
var state2 = await runner.runContinue("WpfApp1.MainWindow.sub(100, x)", state);
MessageBox.Show(state2.ReturnValue?.ToString());
}

static public int sub(int x, int y)
{
return x - y;
}
}

public class RSRunner
{
public class Context
{
public int plusOne(int i)
{
return i + 1;
}
}

public Task<ScriptState<object>> run(string code)
{
var option = ScriptOptions.Default.WithReferences(
typeof(WpfApp1.MainWindow).Assembly
);
var context = new Context();

return CSharpScript.RunAsync(code, option, context);
}

public Task<ScriptState<object>> runContinue(string code, ScriptState<object> prestate)
{
return prestate.ContinueWithAsync(code);
}
}
}

ボタンを押すと
var x = plusOne(1);
が実行される
context に設定したオブジェクトのメソッドをグローバル関数みたいに使える
代入文なので結果を表示しても空

次に
WpfApp1.MainWindow.sub(100, x)
が実行される
メインのアプリのアセンブリを参照してるので WpfApp1.MainWindow.sub メソッドを使える
前の実行結果の state を使って途中から実行してる
x は前回実行した 1 + 1 の結果なので 98 が表示される
Windows のファイル共有の接続状況を確認する
PowerShell のコマンド

get-smbsession
その PC で共有してるフォルダへ接続してる PC の IP アドレスなどがわかる
ClientUserName は接続するときにログインしたユーザ

get-smbconnection
その PC が接続してる共有フォルダの一覧がわかる
ServerName はサーバ名 \\fs01 なら fs01
ShareName はサーバ内に出てくる共有フォルダのルートのこと
UserName は接続してるユーザ名
Dialect は smb のバージョン
両方が使える最大のバージョンが使われる (Win7 は 2.1, Win 8.1 は 3.0.2)

get-smbshare
その PC が共有してるフォルダ一覧
共有設定で指定した名前とそのフォルダのパスがわかる


コマンドは管理者権限で PowerShell で実行する必要あり

C:\Users\win>powershell start-process powershell -verb runas

別 Window で PowerShell が開くのでそこで実行

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> Get-SmbSession

SessionId ClientComputerName ClientUserName NumOpens
--------- ------------------ -------------- --------
154618822713 192.168.1.109 DESKTOP\PUBLIC 0
154618822727 192.168.1.113 DESKTOP\PUBLIC 0


PS C:\WINDOWS\system32> Get-SmbConnection

ServerName ShareName UserName Credential Dialect NumOpens
---------- --------- -------- ---------- ------- --------
fs01 common DESKTOP\win DESKTOP\win 3.0.2 1
fs01 programs DESKTOP\win DESKTOP\win 3.0.2 4


PS C:\WINDOWS\system32> Get-SmbShare

Name ScopeName Path Description
---- --------- ---- -----------
ADMIN$ * C:\WINDOWS Remote Admin
C$ * C:\ Default share
share001 * C:\Data\share-dir\public\tmp9999\share001
D$ * D:\ Default share
icxss * C:\dev2\code\icx\ss
IPC$ * Remote IPC
print$ * C:\windows\system32\spool\drivers プリンター ドライバー
public * C:\Data\others\public
scanner * C:\Data\share-dir\scanner
web * D:\test\web\
.NET Framework 関係のファイルの場所
msbuild
C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\MSBuild\15.0\Bin\MSBuild.exe

コマンドラインからビルドするツール

14.0 は VisualStudio 2015
15.0 は VisualStudio 2017
Community と WDExpress は VS のエディションの違い


framework
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\
C:\Program Files\Reference Assemblies\Microsoft\Framework\
C:\Windows\Microsoft.NET\Framework\
C:\Windows\Microsoft.NET\Framework64\

.NETFramework の dll


gac
C:\Windows\assembly\
C:\Windows\Microsoft.NET\assembly

グローバルアセンブリキャッシュ
4.0 以降が Microsoft.NET の方


csi
C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\MSBuild\15.0\Bin\Roslyn\csi.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csi.exe

C# の REPL ツール


fsi
C:\Program Files (x86)\Microsoft SDKs\F#\4.1\Framework\v4.0\fsi.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsi.exe

F# の REPL ツール
.NET Framework のサポート期限
https://support.microsoft.com/ja-jp/lifecycle/search?sort=PN&alpha=.NET%20Framework&Filter=FilterNO
https://support.microsoft.com/ja-jp/help/17455/lifecycle-faq-net-framework

ここ参照

○ 3.5 まで

3.5 の SP1 以外は終了済み
3.5 の SP1 は未だにサポートされてる
OS のサポート期間中はサポートされる
(7 のサポートが終わったら 7 では .NETFramwork もサポート切れる?)

一部機能 (dynamic 型とかメソッド色々) が使えなかったり 使えてもこういう違いがあるのであえて選ぶ必要はない

○ 4.0 から

4.0, 4.5, 4.5.1 はサポート終了済み
4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 がサポートされてる

これらも OS と同じライフサイクルでサポートされる

○ ダウンロード

https://www.microsoft.com/net/download/visual-studio-sdks

JavaScript の iterator と generator
JavaScript で文字列を for-of すると一文字ずつ繰り返し処理される
これを行単位にしたいなら String.prototype の Symbol.iterator プロパティを置き換える
String.prototype[Symbol.iterator] = function(){
const lines = this.split(/\r?\n|\r/)
let index = 0
return {
next(){
if(index >= lines.length) return {value: undefined, done: true}
return {value: lines[index++], done: false}
}
}
}

for(const l of "abc\ndef\r\nghi") console.log(l)
// abc
// def
// ghi

イテレータ形式のオブジェクトを返す関数を設定する
イテレータ形式のオブジェクトは next プロパティに {value: value, done: done} 形式のオブジェクトを返す関数を持つオブジェクト

String.prototype を変えてしまうと全体に影響するので別のメソッドや関数通して変換したほうがいい

for-of の of に渡すのは iterable オブジェクト
iterable オブジェクトは Symbol.iterator プロパティが必要
String.prototype.getLinesIterable = function(){
const str = this.toString()
return {
[Symbol.iterator](){
const lines = str.split(/\r?\n|\r/)
let index = 0
return {
next(){
if(index >= lines.length) return {value: undefined, done: true}
return {value: lines[index++], done: false}
}
}
}
}
}
for(const l of "abc\ndef\r\nghi".getLinesIterable()) console.log(l)
// abc
// def
// ghi


めんどうなのでジェネレータにまかせる
String.prototype.getLinesIterable = function*(){
yield* this.split(/\r?\n|\r/)
}
for(const l of "abc\ndef\r\nghi".getLinesIterable()) console.log(l)
// abc
// def
// ghi

今回みたいのなら単純に split で配列にしてしまったほうが簡単
for(const l of "abc\ndef\r\nghi".split(/\r?\n|\r/)) console.log(l)
HTML タグ一覧
HTML のタグ一覧
2018/2/8 時点の whatwg のスペックから

The *** element の部分を抽出

The document element
html

Document metadata
head
title
base
link
meta
style

Sections
body
article
section
nav
aside
h1, h2, h3, h4, h5, and h6
hgroup
header
footer
address

Grouping content
p
hr
pre
blockquote
ol
ul
menu
li
dl
dt
dd
figure
figcaption
main
div

Text-level semantics
a
em
strong
small
s
cite
q
dfn
abbr
ruby
rt
rp
data
time
code
var
samp
kbd
sub and sup
i
b
u
mark
bdi
bdo
span
br
wbr

Edits
ins
del

Embedded content
picture
source
img
iframe
embed
object
param
video
audio
track
map
area

Tabular data
table
caption
colgroup
col
tbody
thead
tfoot
tr
td
th

Forms
form
label
input
button
select
datalist
optgroup
option
textarea
output
progress
meter
fieldset
legend

Interactive
details
summary
dialog

Scripting
script
noscript
template
slot
canvas

全部で 106 個
グローバルの let 宣言と window のプロパティは別物
宣言するときはグローバルでも let/const 使いたいのと関数内のスコープでグローバル参照するときはグローバルを見ることを明示的に示すように window.*** って書きたい
その結果 たまに罠にハマりかける

グローバルで let で宣言したものを更新するときに window のプロパティとして代入しても別扱いになる
変数はグローバルにして 初期化の関数呼出し時に代入するつくりのときは注意が必要

let loaded = false

window.addEventListener("load", eve => {
window.loaded = true
})
window.addEventListener("click", eve => {
alert(`${loaded}, ${window.loaded}`)
// false, true
})
AsyncFunction と普通の Function の見分け方
typeof だとどっちも function

typeof function(){}
// "function"

typeof async function(){}
// "function"

instanceof にすると見分けられる

;(function(){}) instanceof Function
// true

;(async function(){}) instanceof Function
// true

;(function(){}) instanceof (async function(){}).constructor
// false

;(async function(){}) instanceof (async function(){}).constructor
// true

AsyncFunction は Function を継承してるので 非同期関数は Function のインスタンスだけど 普通の関数は AsyncFunction のインスタンスじゃない
AsyncFunction のインスタンスかで判定できる
Chrome の情報集めるときのサイト
Chromium Blog
https://blog.chromium.org/

新機能の紹介とか


Chrome Releases
https://chromereleases.googleblog.com/

Chrome のリリース系情報


developers.google.com
https://developers.google.com/web/updates/

開発者向けの新機能の紹介や更新情報など
いい情報多め
一番見る価値あるかも


The Chromium Projects

https://www.chromium.org/Home

Chromium プロジェクトの公式サイト
知っておくといつか役立つかもしれない 程度のもの
あんまりみない


Chrome Platform Status
https://www.chromestatus.com/

バージョンごとの詳しい新機能まとめ
提案段階や開発中のものも含めて 追加予定の機能一覧が見れる


developer.chrome.com
https://developer.chrome.com/home

開発者向け情報
devtools や Chrome App や拡張機能などの情報がある


Chromium Issues

https://bugs.chromium.org/p/chromium/issues/list

バグトラッカーサイト
バグっぽいのあったらここをググると情報があることが多め
C# の読み取り専用
Property
getter のみで setter をつけないことで読み取り専用にできる
> class C { public int foo { get; } = 1; }
> var c = new C();
> c.foo
1
> c.foo = 2
(1,1): error CS0200: プロパティまたはインデクサー 'C.foo' は読み取り専用であるため、割り当てることはできません
> typeof(C).GetProperty("foo").SetValue(c, 10)
Property Set メソッドが見つかりません。
> typeof(C).GetField("<foo>k__BackingField", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(c, 100)
> c.foo
100

リフレクションでも setter が存在しないので書き込めない

内部的には自動でフィールドを作って読み書きしてるので そのフィールドにさえアクセスできれば変更は可能
つまりリフレクションで書き換えできる




Constant
読み取り専用というより「定数」
一部の型のみ設定可能でオブジェクトなどはできない
> class C2 { public const int foo = 1; }
> typeof(C2).GetField("foo", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).SetValue(null, 100)
定数フィールドを設定できません。

扱いは Static なフィールド
リフレクションでも変更できない

byte code にハードコーディングされてるとか
stackoverflow では デコンパイルして編集して再度コンパイルすればいける みたいな回答もあった
実質無理ってことみたい



Field
readonly をつければ読み取り専用にできる
> class C3 { public readonly int foo = 1; }
> var c3 = new C3();
> c3.foo = 20
(1,1): error CS0191: 読み取り専用フィールドに割り当てることはできません (コンストラクター、変数初期化子では可 )。
> typeof(C3).GetField("foo", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public).SetValue(c3, 100)
> c3.foo
100

リフレクションすれば普通に変更できる

リモートデスクトップでローカルドライブにアルファベットつける
接続するときにドライブを共有する設定をしておく

D ドライブを共有したら リモートでは

\\tsclient\D

という名前でアクセスできる

エクスプローラで "\\tsclient" を開いて D を右クリックして "ネットワークドライブの割り当て" を選択
あとは表示されるウィンドウにある通り
ローカルが D でも リモートの H に割当とか 好きなアルファベットを選んで大丈夫
プログラミング言語メモ
比較するときに他に言語なにあったっけと調べる手間を減らす用
alt 系 や shell script 系はなし

Web
JavaScript

サーバサイドのスクリプト系言語
Python
PHP
Perl
Ruby
Hack
Node.js

JVM
Java
Scala
Kotlin
Ceylon
Clojure
Groovy

.Net Framework
C#
F#
VB.NET

Windows
JScript
VBScript

Mac
Objective-C
Swift

ネイティブにコンパイル
C
C++
D
Go
Rust
Delphi

その他
Lua
R
Julia
Elixir

関数型
Erlang
Lisp
Scheme
OCaml
Haskell

古いの
Fortran
COBOL
Pascal
Basic
HSP
ActionScript
Dart

ネタ系
Whitespace
Brainfxck
Unlambda
AsyncFunction がグローバルに用意されてない
Function("arg1", "arg2", "return arg1 + arg2")(10, 20)
// 30

みたいなことを async 版でやりたいとき
↓ を準備

window.AsyncFunction = (async()=>{}).constructor

あとは同じように使える

await AsyncFunction("arg1", "return await fetch(arg1).then(e => e.text())")(location.href)
// <!doctype html> ……

オブジェクトの並びが追加順じゃない例
const obj = {
10: 0, y:1, x:2, z:3, 2:4, "1": 5, "-1": 6,
"5.5":7, 4294967294: 8, 4294967295: 9,
}
console.log(JSON.stringify(Object.entries(obj)))

// [["1",5],["2",4],["10",0],["4294967294",8],["y",1],["x",2],["z",3],["-1",6],["5.5",7],["4294967295",9]]

符号なし 32bit の整数の昇順 → 追加順
符号なし 32bit を超えたり負値や小数になると文字列扱いになって入れた順番

jQuery の ○○Target
current と delegate が未だに覚えられなくて確認してる

$(document).on("click", "body", eve => {
console.log("target", eve.target)
console.log("currentTarget", eve.currentTarget)
console.log("delegateTarget", eve.delegateTarget)
})
target<button>
currentTarget<body>
delegateTargetdocument