メモの日々


2021年03月25日(木) [長年日記]

[javascript] JavaScriptには部分文字列を取得するメソッドが複数ある

JavaScriptで部分文字列を取得するときにどのメソッドを使えばいいのかいつも迷うのでメモ。

slice()

通常はslice()を使うのがよさそう。名前が短いし。引数には部分文字列の開始位置と終了位置のインデックスを指定する。

'こんにちは'.slice(1, 4);  //--> 'んにち'

Why two different methods slice() & substring()?によると、slice()はsubstring()より後に実装されたもののようだ。

substring()

substring()は仕様がslice()とほぼ同じだが違う所もある。MDNのsubstring()の説明に違いが書かれている。

開始位置が終了位置よりも大きい場合と、引数に負の数が指定された場合の動作が違う。

substr()

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. …"


2021年03月24日(水) [長年日記]

[typescript] 関数を表す型の書き方

TypeScriptで、関数を表す型の宣言方法がなかなかわからなかったのでメモ。

に説明があった。「(パラメータ名: パラメータ型) => 戻り値型」のように書けばよい。パラメータ名は省略できない。

let f: (lhs: number, rhs: number) => number;
f = (a: number, b: number) => { return a + b; };

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月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月12日(金) [長年日記]

[windows] WSL上のファイルをエクスプローラからアクセスする

WSL起動中にエクスプローラのアドレスバーへ「\\wsl$」と入力すると、エクスプローラからWSLのファイルシステムにアクセスできることを知った。

  • ビルド 18342 (Windows Subsystem for Linux のリリース ノート)

ユーザーが Windows から WSL ディストリビューションの Linux ファイルにアクセスできるようにする機能を追加しました。 これらのファイルには、コマンド ラインを使用してアクセスできます。また、ファイル エクスプローラーや VSCode などの Windows アプリもこれらのファイルと対話できます。 \\wsl\$\<distro_name> に移動してファイルにアクセスするか、\\wsl$ に移動して実行中のディストリビューションの一覧を表示します。

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インスタンスなんだけど、ログインできないようなのでエクスプローラからアクセスする機能が役に立つ。