M2 MacBook Air セットアップメモ
MacBookをセットアップする際に、私はいつも自身のブログに書いておいたメモを参考にしている。
わざわざブログに書き残しておくのは、インターネットに繋げればそれだけで見れるからだ。
(これがNotionなど特定のアプリに記載している場合、インターネットにつないでそのアプリをインストールしてログインして...というフローを挟まなくてはならない。)
そして自身のブログに書いておいたセットアップのメモというのは下記になるのだが、今日M2のMacBook Airをセットアップしようとしたら記述内容がかなり古く今は使っていないアプリも多かったので、新たにこちらに最新版を記載することにした。
というわけで、ひたすらセットアップ内容を書いていく。
目次
- 目次
- macのシステム環境設定をいじる
- Finder
- Chrome
- Chrome Canary
- 1password
- Dropbox
- Google日本語入力
- BetterTouchTool
- iTerm2
- mi
- VSCode
- Notion
- Logic Pro
- Final Cut Pro
- Slack
- Todoits
- Line
- ToyViewer
- Docker環境
- Discord
- brew
- zsh環境のセットアップ、ならびにOh My Zshの導入
- nvm
- Go
- Deno
- Rust
- その他のツールやプログラミング環境周りなど
macのシステム環境設定をいじる
macOSがアップグレードされる中で以下の変更箇所についてもいくつか変更点が生じているような気がしたので、改めて設定方法を記載している。
(なお、実際に作業したOSは12.6のMontereyとなる。)
- タップ一本でクリックを有効化
- キーリピートを高速化
- トラックパッドの軌跡の高速化
- マウスの軌跡の高速化と「副ボタンのクリック(右側をクリック)」を有効化
- スクリーンセーバーの設定
- ウィンドウ切り替えの設定
- 「システム環境設定」から「キーボード」を選び 「ショートカット」を選択する。サイドメニューから再度「キーボード」を選択し、「次のウィンドウを操作対象にする」を選んで、
option + tab
キーを押して設定
- 「システム環境設定」から「キーボード」を選び 「ショートカット」を選択する。サイドメニューから再度「キーボード」を選択し、「次のウィンドウを操作対象にする」を選んで、
- 3 本指のドラッグを有効可
- Bluetoothをメニューバーから触れるように設定を変える
Finder
- Finderの環境設定から
一般
タブを選択- 新規ウィンドウで
デスクトップ
を表示するように変更
- 新規ウィンドウで
- Finderの環境設定から
サイドバー
タブを選択- よく使うディレクトリのチェックを入れておく
Chrome
なお、Chromeやこのあとに書くChrome Canaryについては下記の方法でプロファイル移行も適宜実施する。
Chrome Canary
1password
Dropbox
Google日本語入力
BetterTouchTool
設定ファイルはDropboxに置いてあるので、そちらを参照してインポートする。
iTerm2
iTerm2で音が鳴らないようにする
iTerm2の設定画面を開き、 Profile -> Terminal
を選択。
ここに Silence bell
という項目があるのでここにチェックを入れる。
mi
VSCode
M1だと Insider
バージョン使っていたけど、そちらを使う必要もなさそうなので普通の方を使う。
ちなみに Insider
バージョンはこちら
Notion
Logic Pro
App storeからダウンロード
Final Cut Pro
App storeからダウンロード
よく使うショートカット設定があるので、下記の記事を見て設定しておく。
Slack
App storeからダウンロード
Todoits
App storeからダウンロード
Line
App storeからダウンロード
ToyViewer
App storeからダウンロード
Docker環境
Dockerは別マシンで利用しているので、もしこのマシンでも必要になりそうであればセットアップしていく
Discord
brew
アクセスした先のbashコマンドをterminal上で実行する。
(やや抵抗を感じるインストール方法だが、こればかりはしょうがない)
M1以降のmacではbrewをインストールしたあとに /opt/homebrew/bin
などにPATHを通す必要があるので、そちらも忘れずに
zsh環境のセットアップ、ならびにOh My Zshの導入
ここ数年はOh My Zshをデフォルト設定のまま利用するという形に落ち着いている。
以前はOh My Zshを導入するとターミナル起動時にもたつくような感覚を覚えていたがM1以降のmacだとそういうのも感じなくなったので、このままでよいかという感じでズルズルと使い続けている。
セットアップ手順については以下に書いた。
nvm
Node.jsは nvm
を使って管理している。
自分の場合、nvmはgitでcloneする形でインストールしている。
nvmのインストール手順については以前ブログに書いたのでそちらのリンクを貼っておく。
Go
Goは直接インストールバイナリをダウンロードしてセットアップしている。
Deno
denoは以前は brew
を使ってインストールしていたと思うが、下記ページの一番上にも記載されている curl
を使ったやり方でも良さそうだ。
この文章を書いている現在はまだインストールしていないが、ちょっと考えた末、 curl
か brew
の方法でインストールすることにする。
追記:
今回は curl
を用いた方法でインストールした。
インストールのためのスクリプトをターミナル上で実行し、インストール後に表示される記述を .zshrc
に追加することでインストールは完了した。
Rust
Rustは下記ページの方法でインストールしている。
こちらもインストール実施後に表示されるPATHに関する設定を .zshrc
に追加し、 source
コマンドなどで再読込することで設定完了。
その他のツールやプログラミング環境周りなど
基本的なセットアップについては以上となる。
あとは適宜やる。
プログラミング周りなどについても同じく適宜。
Vimやgit周りの設定はdotfilesを参考にする。
Goのtime.Duration型を用いた比較について
Go初心者による備忘録。
Goのtime.Duration型を用いることで経過時間を表すことができる。
そしてこの time.Duration
は int64
のため、数値型としての比較ができるようだ。
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
が利用できるようだ。
Goのドキュメント
以下サンプルコード。
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.Locator
に ScrollIntoViewIfNeeded
というメソッドが用意されているのでこれを利用する。
実際のサンプルを下に記載したが、わざわざサンプルを記載するほどのこともないぐらい簡単。
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.Locator
に Fill
メソッドが用意されているのでそちらを利用する。
※コード自体は以前書いた『Playwright for GoでローカルのChromeを利用して実行する方法』内のコードを拡張した形で書いている また、処理内容を目視で確認できるようにHeadlessモードは無効化している。
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
を追加するのはどうかと議論されているので、今後追加される可能性もあるのかも
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秒
ちなみにコードを作成するに当たり、下記のドキュメントを参照している。
育児日記 - (2020.09.29)
最近の育児について日記を残しておく。
- ここ最近で急に娘はおしゃれに目覚めだした。眠る前にもちょっとした外出用のドレスを着たいと言い出す
- だが、それとは別にパワフルさもアップしてきており、駆け回ったり、あらゆるところによじ登ったりしている。そしてたいてい転んで大泣きする
- 公園などで好きな遊びはブランコや滑り台、というのは以前から変わらないが、最近はよく子供向けのボルダリングみたいなやつで遊んだり、何かによじ登る系も好み始めた
- 以前よりも体力がついた気がする。以前は保育園があった日などは夜すぐに眠っていたが、最近はなかなか眠らない...また、それとは別に以前よりも体調を崩す頻度も下がった。体が頑丈になってきたのだろうか?
- 最近、娘と時折夜のお散歩をする。仕事終わりに娘と二人で外を歩くだけだが、娘としては普段なかなか味わえない夜の風景を見れるのは新鮮なのかもしれないと思ったりしている
- グミ系のお菓子が好き。お気に入りは相変わらずポイフルだが、他のグミのお菓子も買ってあげると喜ぶ。というかこればっかり食べたがるのがここ最近の悩み。最近自宅で作った琥珀糖もほぼほぼ娘が食べてしまった
今日は自宅で琥珀糖作りにチャレンジした。これから乾燥させるところ。すでにキレイ。 pic.twitter.com/OgfW7SaUy1
— Yuki Shindo (@shinshin86) August 28, 2022
あとは最近、「昔々あるところに〜」的なやつを創作して寝る前に話すということを初めてした。
子供を寝かしつける際にリクエストされて初めて「昔々あるところに~」的な創作話をした。アザラシが一日中糸を巻いている話で、巻いて大きくした糸を町に売りに行くところで今日は終わった。この話の続きをどうするか、ぼんやり考えている🧵 #育児
— Yuki Shindo (@shinshin86) September 24, 2022