at backyard

Color my life with the chaos of trouble.

M2 MacBook Air セットアップメモ

MacBookをセットアップする際に、私はいつも自身のブログに書いておいたメモを参考にしている。
わざわざブログに書き残しておくのは、インターネットに繋げればそれだけで見れるからだ。
(これがNotionなど特定のアプリに記載している場合、インターネットにつないでそのアプリをインストールしてログインして...というフローを挟まなくてはならない。)

そして自身のブログに書いておいたセットアップのメモというのは下記になるのだが、今日M2のMacBook Airをセットアップしようとしたら記述内容がかなり古く今は使っていないアプリも多かったので、新たにこちらに最新版を記載することにした。

shinshin86.hateblo.jp

というわけで、ひたすらセットアップ内容を書いていく。

目次

macのシステム環境設定をいじる

macOSがアップグレードされる中で以下の変更箇所についてもいくつか変更点が生じているような気がしたので、改めて設定方法を記載している。
(なお、実際に作業したOSは12.6のMontereyとなる。)

  • タップ一本でクリックを有効化
  • キーリピートを高速化
  • トラックパッドの軌跡の高速化
  • マウスの軌跡の高速化と「副ボタンのクリック(右側をクリック)」を有効化
  • スクリーンセーバーの設定
  • ウィンドウ切り替えの設定
    • 「システム環境設定」から「キーボード」を選び 「ショートカット」を選択する。サイドメニューから再度「キーボード」を選択し、「次のウィンドウを操作対象にする」を選んで、 option + tab キーを押して設定
  • 3 本指のドラッグを有効可
    • 「システム環境設定」から「アクセシビリティ」をクリックし、サイドバーで「ポインタコントロール」を選択。さらに「トラックパッドオプション」から「ドラッグを有効にする」を選択し、メニューから「3 本指のドラッグ」を選択
  • Bluetoothをメニューバーから触れるように設定を変える
    • 「システム環境設定」から「Bluetooth」を選択し、「メニューバーにBluetoothを表示」を選択

Finder

  • Finderの環境設定から 一般 タブを選択
    • 新規ウィンドウで デスクトップ を表示するように変更
  • Finderの環境設定から サイドバー タブを選択

Chrome

www.google.com

なお、Chromeやこのあとに書くChrome Canaryについては下記の方法でプロファイル移行も適宜実施する。

shinshin86.hateblo.jp

Chrome Canary

www.google.com

1password

1password.com

Dropbox

www.dropbox.com

Google日本語入力

www.google.co.jp

BetterTouchTool

設定ファイルはDropboxに置いてあるので、そちらを参照してインポートする。

folivora.ai

iTerm2

iterm2.com

iTerm2で音が鳴らないようにする

iTerm2の設定画面を開き、 Profile -> Terminal を選択。
ここに Silence bell という項目があるのでここにチェックを入れる。

mi

www.mimikaki.net

VSCode

M1だと Insider バージョン使っていたけど、そちらを使う必要もなさそうなので普通の方を使う。

code.visualstudio.com

ちなみに Insider バージョンはこちら

code.visualstudio.com

Notion

www.notion.so

Logic Pro

App storeからダウンロード

Final Cut Pro

App storeからダウンロード

よく使うショートカット設定があるので、下記の記事を見て設定しておく。

shinshin86.hateblo.jp

Slack

App storeからダウンロード

Todoits

App storeからダウンロード

Line

App storeからダウンロード

ToyViewer

App storeからダウンロード

Docker環境

Dockerは別マシンで利用しているので、もしこのマシンでも必要になりそうであればセットアップしていく

Discord

discord.com

brew

brew.sh

アクセスした先のbashコマンドをterminal上で実行する。
(やや抵抗を感じるインストール方法だが、こればかりはしょうがない)

M1以降のmacではbrewをインストールしたあとに /opt/homebrew/bin などにPATHを通す必要があるので、そちらも忘れずに

zsh環境のセットアップ、ならびにOh My Zshの導入

ここ数年はOh My Zshをデフォルト設定のまま利用するという形に落ち着いている。
以前はOh My Zshを導入するとターミナル起動時にもたつくような感覚を覚えていたがM1以降のmacだとそういうのも感じなくなったので、このままでよいかという感じでズルズルと使い続けている。

セットアップ手順については以下に書いた。

shinshin86.hateblo.jp

nvm

Node.jsは nvm を使って管理している。
自分の場合、nvmはgitでcloneする形でインストールしている。

nvmのインストール手順については以前ブログに書いたのでそちらのリンクを貼っておく。

shinshin86.hateblo.jp

Go

Goは直接インストールバイナリをダウンロードしてセットアップしている。

shinshin86.hateblo.jp

Deno

denoは以前は brew を使ってインストールしていたと思うが、下記ページの一番上にも記載されている curl を使ったやり方でも良さそうだ。
この文章を書いている現在はまだインストールしていないが、ちょっと考えた末、 curlbrew の方法でインストールすることにする。

deno.land

追記:

今回は curl を用いた方法でインストールした。
インストールのためのスクリプトをターミナル上で実行し、インストール後に表示される記述を .zshrc に追加することでインストールは完了した。

Rust

Rustは下記ページの方法でインストールしている。

www.rust-lang.org

こちらもインストール実施後に表示されるPATHに関する設定を .zshrc に追加し、 source コマンドなどで再読込することで設定完了。

その他のツールやプログラミング環境周りなど

基本的なセットアップについては以上となる。

あとは適宜やる。

プログラミング周りなどについても同じく適宜。

Vimやgit周りの設定はdotfilesを参考にする。

github.com

Goのtime.Duration型を用いた比較について

Go初心者による備忘録。

Goのtime.Duration型を用いることで経過時間を表すことができる。
そしてこの time.Durationint64 のため、数値型としての比較ができるようだ。

https://pkg.go.dev/time#Duration

つまり経過時間の比較をするケースで、どちらの変数の time.Duration が大きい場合を比較するのは t1 > t2 的な形で比較ができる。

サンプルコードを下に記載する。

package main

import (
    "fmt"
    "time"
)

func main() {
    t1 := time.Duration(1) * time.Second
    t2 := time.Duration(2) * time.Second
    t3 := time.Duration(2) * time.Second

    fmt.Println("t1:", t1)
    fmt.Println("t2:", t2)

    // t1(1秒)よりt2(2秒)のほうが数値としては大きいのでtrueになる
    fmt.Println(t1 < t2)

    // t2とt3は同じ2秒のためtrueとなる
    fmt.Println(t2 == t3)

    // 数値型として表示させると実際に保持されている数値が見える
    fmt.Printf("t1: %d\n", t1)
    fmt.Printf("t2: %d\n", t2)
    fmt.Printf("t3: %d\n", t3)
}

文字列内の数値と文字列を分割させたい(Goのfmt.Sscanf)

例えば 5個の林檎 というようにスペースを挟まずに数値と文字列が連なったテキストを分割させたいケースがあったとする。
このような場合、Goではどう対応できるかを調べた際の備忘録。

下記のスタックオーバーフローを参考にした。 どうやらこういうケースでは fmt.Sscanf が利用できるようだ。

stackoverflow.com

Goのドキュメント

https://pkg.go.dev/fmt#Sscanf

以下サンプルコード。

package main

import (
    "fmt"
    "log"
)

func main() {
    str := "5個の林檎"

    var num int
    var text string

    n, err := fmt.Sscanf(str, "%d%s", &num, &text)
    if err != nil {
        log.Fatalln(err)
    }

    fmt.Println(n)
    fmt.Println(num)
    fmt.Println(text)
}

実行結果は以下のようになる。
一行目に表示されている返り値は、正常に解析された項目の数となる。

2
5
個の林檎

Playwright for Goで指定した場所にスクロールさせる方法

昨日に引き続き、Playwright for Goに関する個人的な備忘録。

Playwright for Goで指定した場所にスクロールさせる方法だが、playwright.LocatorScrollIntoViewIfNeeded というメソッドが用意されているのでこれを利用する。

実際のサンプルを下に記載したが、わざわざサンプルを記載するほどのこともないぐらい簡単。

package main

import (
    "log"
    "time"

    "github.com/playwright-community/playwright-go"
)

func main() {
    // Playwright用にブラウザを新たにインストールはせず、既にインストールされているChromeを利用する
    runOption := &playwright.RunOptions{
        SkipInstallBrowsers: true,
    }

    // ここでPlaywrightのDriverのインストールを実施する
    // なお2回目以降はすでにDriverはインストールされているため、この処理はスキップ可能
    err := playwright.Install(runOption)
    if err != nil {
        log.Fatalf("could not install playwright dependencies: %v", err)
    }

    pw, err := playwright.Run()
    if err != nil {
        log.Fatalf("could not start playwright: %v", err)
    }

    option := playwright.BrowserTypeLaunchOptions{
        Channel:  playwright.String("chrome"),
        Headless: playwright.Bool(false),
    }

    browser, err := pw.Chromium.Launch(option)
    if err != nil {
        log.Fatalf("could not launch browser: %v", err)
    }
    defer browser.Close()

    page, err := browser.NewPage()
    if err != nil {
        log.Fatalf("could not create page: %v", err)
    }
    defer page.Close()

    if _, err = page.Goto("https://playwright-community.github.io/playwright-go/"); err != nil {
        log.Fatalf("could not goto: %v", err)
    }

    moreExamples, err := page.Locator("#more-examples")
    if err != nil {
        log.Fatalf("could not get input form: %v", err)
    }

    // 対象の場所までスクロールする
    if err := moreExamples.ScrollIntoViewIfNeeded(); err != nil {
        log.Fatalf("scroll error: %v", err)
    }

    // 3秒待機
    time.Sleep(time.Duration(3 * time.Second))

    log.Println("Finish!")
}

以前Seleniumを利用していた際は、スクロール処理を書くのに JavsScript 経由で実現させていたが、このようなメソッドが組み込まれているのは非常に楽。

Playwright for Goでinputフォームの値を空にする方法

Playwright for Goに関する個人的な備忘録

Seleniumであれば clear 関数を用いてinputフォーム内を空にできるが、Playwrightの場合は fill を用いる。

Playwright for Goであれば playwright.LocatorFillメソッドが用意されているのでそちらを利用する。

※コード自体は以前書いた『Playwright for GoでローカルのChromeを利用して実行する方法』内のコードを拡張した形で書いている また、処理内容を目視で確認できるようにHeadlessモードは無効化している。

shinshin86.hateblo.jp

package main

import (
    "log"
    "time"

    "github.com/playwright-community/playwright-go"
)

func main() {
    // Playwright用にブラウザを新たにインストールはせず、既にインストールされているChromeを利用する
    runOption := &playwright.RunOptions{
        SkipInstallBrowsers: true,
    }

    // ここでPlaywrightのDriverのインストールを実施する
    // なお2回目以降はすでにDriverはインストールされているため、この処理はスキップ可能
    err := playwright.Install(runOption)
    if err != nil {
        log.Fatalf("could not install playwright dependencies: %v", err)
    }

    pw, err := playwright.Run()
    if err != nil {
        log.Fatalf("could not start playwright: %v", err)
    }

    option := playwright.BrowserTypeLaunchOptions{
        Channel:  playwright.String("chrome"),
        Headless: playwright.Bool(false),
    }

    browser, err := pw.Chromium.Launch(option)
    if err != nil {
        log.Fatalf("could not launch browser: %v", err)
    }
    defer browser.Close()

    page, err := browser.NewPage()
    if err != nil {
        log.Fatalf("could not create page: %v", err)
    }
    defer page.Close()

    if _, err = page.Goto("https://www.google.com/"); err != nil {
        log.Fatalf("could not goto: %v", err)
    }

    input, err := page.Locator("input")
    if err != nil {
        log.Fatalf("could not get input form: %v", err)
    }

    // 「今日の天気」と入力する
    input.Fill("今日の天気")

    // 3秒待機
    time.Sleep(time.Duration(3 * time.Second))

    // inputフォームを空にする
    input.Fill("")

    // 3秒待機
    time.Sleep(time.Duration(3 * time.Second))

    log.Println("Finish!")
}

ただし下記で議論されているようにこのやり方は確実ではないとのこと。
clear を追加するのはどうかと議論されているので、今後追加される可能性もあるのかも

github.com

Goでtime.Durationの文字列を日本語に変換する関数

完全に自分向けの備忘録。

time.Duration で表される秒数を日本語に変換したかったので、下記のような関数を作って対応した。

package main

import (
    "fmt"
    "strings"
    "time"
)

func jaDuration(t time.Duration) string {
    var jaStr string
    jaStr = strings.Replace(t.String(), "ns", "ナノ秒", 1)
    jaStr = strings.Replace(jaStr, "µs", "マイクロ秒", 1)
    jaStr = strings.Replace(jaStr, "ms", "ミリ秒", 1)
    jaStr = strings.Replace(jaStr, "s", "秒", 1)
    jaStr = strings.Replace(jaStr, "m", "分", 1)
    return strings.Replace(jaStr, "h", "時間", 1)
}

func main() {
    t1 := time.Duration(1 * time.Nanosecond)
    fmt.Println(t1)
    fmt.Println(jaDuration(t1))

    t2 := time.Duration(1 * time.Microsecond)
    fmt.Println(t2)
    fmt.Println(jaDuration(t2))

    t3 := time.Duration(1 * time.Millisecond)
    fmt.Println(t3)
    fmt.Println(jaDuration(t3))

    t4 := time.Duration(1 * time.Second)
    fmt.Println(t4)
    fmt.Println(jaDuration(t4))

    t5 := time.Duration(1 * time.Minute)
    fmt.Println(t5)
    fmt.Println(jaDuration(t5))

    t6 := time.Duration(1 * time.Hour)
    fmt.Println(t6)
    fmt.Println(jaDuration(t6))
}

上のコードを実行すると下記のような実行結果となる。

1ns
1ナノ秒
1µs
1マイクロ秒
1ms
1ミリ秒
1s
1秒
1m0s
1分0秒
1h0m0s
1時間0分0秒

ちなみにコードを作成するに当たり、下記のドキュメントを参照している。

https://pkg.go.dev/time#Duration.String

育児日記 - (2020.09.29)

最近の育児について日記を残しておく。

  • ここ最近で急に娘はおしゃれに目覚めだした。眠る前にもちょっとした外出用のドレスを着たいと言い出す
  • だが、それとは別にパワフルさもアップしてきており、駆け回ったり、あらゆるところによじ登ったりしている。そしてたいてい転んで大泣きする
  • 公園などで好きな遊びはブランコや滑り台、というのは以前から変わらないが、最近はよく子供向けのボルダリングみたいなやつで遊んだり、何かによじ登る系も好み始めた
  • 以前よりも体力がついた気がする。以前は保育園があった日などは夜すぐに眠っていたが、最近はなかなか眠らない...また、それとは別に以前よりも体調を崩す頻度も下がった。体が頑丈になってきたのだろうか?
  • 最近、娘と時折夜のお散歩をする。仕事終わりに娘と二人で外を歩くだけだが、娘としては普段なかなか味わえない夜の風景を見れるのは新鮮なのかもしれないと思ったりしている
  • グミ系のお菓子が好き。お気に入りは相変わらずポイフルだが、他のグミのお菓子も買ってあげると喜ぶ。というかこればっかり食べたがるのがここ最近の悩み。最近自宅で作った琥珀糖もほぼほぼ娘が食べてしまった

あとは最近、「昔々あるところに〜」的なやつを創作して寝る前に話すということを初めてした。