2021年03月12日(金) [長年日記]
■ [windows] WSL上のファイルをエクスプローラからアクセスする
WSL起動中にエクスプローラのアドレスバーへ「\\wsl$」と入力すると、エクスプローラからWSLのファイルシステムにアクセスできることを知った。
- ビルド 18342 (Windows Subsystem for Linux のリリース ノート)
ユーザーが Windows から WSL ディストリビューションの Linux ファイルにアクセスできるようにする機能を追加しました。 これらのファイルには、コマンド ラインを使用してアクセスできます。また、ファイル エクスプローラーや VSCode などの Windows アプリもこれらのファイルと対話できます。 \\wsl\$\<distro_name> に移動してファイルにアクセスするか、\\wsl$ に移動して実行中のディストリビューションの一覧を表示します。
- What’s new for WSL in Windows 10 version 1903? (Microsoft Developer Blogs)
When using this feature you’ll notice the distro files are exposed through the path: \\wsl$\.
■ [windows] Docker Desktop for Windowsでのボリュームの保存場所
Docker Desktop for WindowsをWSL Integrationの下で使っている。
Dockerで作ったボリュームの実体はどこに作られるのか?
docker volume inspectコマンドで確認するとMountpointが /var/lib/docker/volumes/ 配下にあるように出力されるが、WSL上にそのようなディレクトリは存在しない。
検索すると、WSLのDiscussionsに
I found my volume here:
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
とあるのを見つけた。このパスをエクスプローラのアドレスバーに貼り付けると、ボリュームの実体が確かにここにあることを確認できた。
docker-desktop-dataというのはDocker Desktopが作るWSLインスタンスなんだけど、ログインできないようなのでエクスプローラからアクセスする機能が役に立つ。
2021年03月18日(木) [長年日記]
■ [go] GoでURLのパスを結合する
GolangでURLのパスをpath.Join()で結合しようとするとうまくいかない。
path.Join("http://localhost/", "api")
の結果は「http:/localhost/api」となり、ホスト名の前のスラッシュが1つ削除されてしまう。path.Join()はリファレンスに「The result is Cleaned.」とあり単に結合するだけではないため。
URLのパスを結合するには、例えばURL型を使って次のようにする。
func MyJoin(base string, p string) (string, error) { u, err := url.Parse(base) if err != nil { return "", err } u.Path = path.Join(u.Path, p) return u.String(), nil }
なお、path.Join()は末尾のスラッシュも削除するので、MyJoin()の結果にも末尾にスラッシュが付かないことに注意。
2021年03月19日(金) [長年日記]
■ [go] http.Clientのサンプル
http.Clientを使うサンプルをメモ。GitHubのリポジトリ情報取得のAPIにアクセスしてみる。
package main import ( "encoding/json" "fmt" "log" "net/http" ) func main() { // http.Requestのインスタンスreqを作って req, err := http.NewRequest( "GET", "https://api.github.com/repos/kenichiice/test-unit-runner-junitxml", nil) if err != nil { log.Fatal("failed to create HTTP request") } // reqにHTTPヘッダを追加して req.Header.Set("Accept", "application/vnd.github.v3+json") // http.Clientを使ってreqの内容を送信する client := http.Client{} resp, err := client.Do(req) if err != nil { log.Fatal("failed to send HTTP request") } // HTTP応答のBodyを読み取る場合はCloseが必要 defer resp.Body.Close() // HTTP応答のステータスコードの確認 if resp.StatusCode != http.StatusOK { log.Fatalf("HTTP status code: %d", resp.StatusCode) } // HTTP応答のBodyのJSONを読み取る var repo struct { Description string } if err := json.NewDecoder(resp.Body).Decode(&repo); err != nil { log.Fatal("failed to decode HTTP response") } fmt.Println(repo.Description) }
2021年03月24日(水) [長年日記]
■ [typescript] 関数を表す型の書き方
TypeScriptで、関数を表す型の宣言方法がなかなかわからなかったのでメモ。
- Function Type Expressions (typescriptlang.org)
に説明があった。「(パラメータ名: パラメータ型) => 戻り値型」のように書けばよい。パラメータ名は省略できない。
let f: (lhs: number, rhs: number) => number; f = (a: number, b: number) => { return a + b; };
2021年03月25日(木) [長年日記]
■ [javascript] JavaScriptには部分文字列を取得するメソッドが複数ある
JavaScriptで部分文字列を取得するときにどのメソッドを使えばいいのかいつも迷うのでメモ。
slice()
- String.prototype.slice() (MDN Web Docs)
通常はslice()を使うのがよさそう。名前が短いし。引数には部分文字列の開始位置と終了位置のインデックスを指定する。
'こんにちは'.slice(1, 4); //--> 'んにち'
Why two different methods slice() & substring()?によると、slice()はsubstring()より後に実装されたもののようだ。
substring()
- String.prototype.substring() (MDN Web Docs)
substring()は仕様がslice()とほぼ同じだが違う所もある。MDNのsubstring()の説明に違いが書かれている。
開始位置が終了位置よりも大きい場合と、引数に負の数が指定された場合の動作が違う。
substr()
- String.prototype.substr() (MDN Web Docs)
substr()は2番目の引数にインデックスではなく文字数を指定する。
'こんにちは'.substr(1, 4); //--> 'んにちは'
これが便利なケースもあるけど、substr()は非推奨扱いのようなのでなるべく使わない方がいい。
String.prototype.substr probably won't be removed anytime soon, but it's defined in Annex B of the ECMA-262 standard, whose introduction states: "… Programmers should not use or assume the existence of these features and behaviours when writing new ECMAScript code. …"