- 投稿日:2021-01-13T21:55:10+09:00
M1 Macbook Air (Big Sur)が届いたら最初にやること。
最速組からふた足遅れてM1搭載Macbook Airを購入しました。MBP13(2013late)からの買い替えです。
以前にも2016MBPを職場で支給された時にやることをまとめましたが再まとめです。
開発環境の構築はこちらで→【随時更新】Apple Silicon (M1)での開発環境。
キーボード
Karabiner-Elements導入
Complex modifications
>Add rules
>Import more rules from the Internet
International (Language Specific)
>For Japanese (日本語環境向けの設定) (rev 5)
をインポートコマンドキーを単体で押したときに、英数・かなキーを送信する。
を有効化Simple modifications
Target device
をApple Internal Keyboard / Trackpadに切り替えcaps_lock
をleft_command
に設定トラックパッド
システム環境設定
>トラックパッド
タップでクリック
をチェック調べる&データ検出
を3本指でタップ
に変更
システム環境設定
>アクセシビリティ
>ポイントコントロール
トラックパッドオプション
>ドラッグを有効にする
をチェックトラックパッドオプション
>3本指のドラッグ
に変更識別名の変更
システム環境設定
>共有
- コンピュータ名を変更
日本語変換
システム環境設定
>キーボード
>入力ソース
日本語 - ローマ字入力
ライブ変換
のチェックを外す数字を全角入力
のチェックを外す
システム環境設定
>キーボード
>ユーザ辞書
スマート引用符とスマートダッシュを使用
のチェックを外す
システム環境設定
>キーボード
>ショートカット
>入力ソース
前の入力ソースを選択
のチェックを外す入力メニューの次のソースを選択
のチェックを外すCtrl+Spaceを後でiTerm2の起動ショートカットに割り当てたいので。
仮想デスクトップ
システム環境設定
>Mission Control
最新の使用状況に基づいて操作スペースを自動的に並べ替える
のチェックを外すホットコーナー
システム環境設定
>Mission Control
>ホットコーナー
- 左下に
画面をロック
を割り当てDockとメニューバー
システム環境設定
>Dockとメニューバー
Dockとメニューバー
サイズ
を少し小さく画面上の位置
を左にサウンド
使用中のみ
を常に
に変更
- 音を出力しても表示されなかった。
使用中
と判定される条件がわからないバッテリー
割合(%)を表示
Finder
Finder
>環境設定
>サイドバー
最近の項目
のチェックを外す(ユーザーホーム)
にチェックを入れる
Finder
>環境設定
>詳細
すべてのファイルの拡張子を表示
にチェックを入れる30日後にゴミ箱から項目を削除
にチェックを入れる
表示
パスバーを表示
ステータスバーを表示
Safari
表示
Safari
>環境設定
>タブ
⌘+1から⌘+9でタブを切り替える
のチェックを外す
Safari
>環境設定
>詳細
WEBサイトの完全なアドレスを表示
にチェックを入れるデフォルトのエンコーディング
をUnicode (UTF-8)
に変更メニューバーに"開発"メニューを表示
にチェックを入れるアンインストール
- iMovie
- GarageBand
- Pages
- Numbers
必要になったら入れ直す
ドックの整理
使用頻度の低いアプリを削除
- Podcast
- Music
- TV
- 連絡先
- カレンダー
- FaceTime
- マップ
- メール
- メッセージ
順番の入れ替え
- 投稿日:2021-01-13T20:23:55+09:00
パスを通すとは
前提
macのterminalでパスを通す方法.
zsh: command not found: コマンド名
というエラーが出た時の対処法です.デフォルトのシェルを確認
macのシェルにはbashとzshがあります.
$ echo $SHELLパスを通すとは
コマンドが格納されているディレクトリを登録しておくこと.
手順
1. 通っているパスを確認
$ echo $PATH2. パスの追加
#bashの場合 $ open ~/.bash_profile #zshの場合 $ open ~/.zshrc$ export PATH=/xxxx/bin:$PATH#bashの場合 $ source ~/.bash_profile #zshの場合 $ source ~/.zshrc3. パスの確認
$ コマンド --version
- 投稿日:2021-01-13T19:00:39+09:00
シェルでコマンドを実行中は Mac をスリープさせないようにする方法
この記事は macOS 専用です。
Linux でも、macOS の
caffeinate
コマンドと同等のコマンドがあれば使えるかもしれません。もしご存じの方がいたらコメントで教えていただけるとありがたいです。はじめに
シェルを操作しているときに、たまに時間がかかるコマンドを実行することがあると思います。
その際にコマンド終了まで放置していると Mac がスリープしてしまうことがあります。
もしかしたらシステムはスリープしていなくて、ディスプレイだけがスリープしているのかもしれませんが、ディスプレイがスリープしていると、コマンドが中断されてしまっているのではないかと不安になりますし、ときおりコマンドの進捗状況を確認したくてもスリープしていてわからないことがあります。
そこで、コマンド実行中は Mac がスリープしない (ディスプレイのスリープも含む) ようにする方法を紹介します。
環境
- macOS Big Sur 11.1
- Zsh 5.8
設定方法
以下を
~/.zshrc
に貼り付けます。
~/.zshrc
の該当部分だけを抜き出して貼り付けているので、下記の~/.zshrc
単体での動作は確認していません。もし正常に動作していなければコメントで教えてください。~/.zshrc_tn_cmd='' need_caffeine=true _tn_caffeinate_pid='' preexec() { _tn_cmd=$1 need_caffeine=true while read line do if [[ $_tn_cmd =~ ^([[:blank:]]+.*)*$line([[:blank:]]+.*)*$ ]]; then need_caffeine=false fi done < ~/.decaffeinated_command_list if type caffeinate 1>/dev/null 2>/dev/null && "${need_caffeine}"; then (caffeinate -d & echo $!) | read _tn_caffeinate_pid fi } precmd() { if "${need_caffeine}" && [[ "$_tn_caffeinate_pid" =~ ^[0-9]+$ ]]; then kill "$_tn_caffeinate_pid" fi _tn_caffeinate_pid='' }次に、
~/.decaffeinated_command_list
というファイルを作ります。$ touch ~/.decaffeinated_command_listそして、
~/.decaffeinated_command_list
に以下を書き込みます。~/.decaffeinated_command_listexit exec source scriptとりあえず設定方法だけ知りたい方はこれで終わりです。
解説
ここから先は具体的な解説をします。
caffeinate
コマンドMac には
caffeinate
というコマンドが用意されています。このコマンドを実行すると Mac をスリープさせないようにすることができます。
caffeinate
コマンドのオプション
オプション 効果 備考 -d
ディスプレイをスリープさせないようにします -i
システムをアイドル状態にさせないようにします -m
ディスクをスリープさせないようにします -s
システムをスリープさせないようにします MacBook の場合、電源に接続されているときのみ有効 今回はディスプレイをスリープさせたくないので、
-d
を指定します。
preexec()
とprecmd()
~.zshrc
にpreexec()
という関数を用意すると、何かしらのコマンドの実行前にpreexec()
の中身が実行されます。また、
precmd()
という関数を用意すると、コマンドの終了後 (厳密には新しいプロンプトが表示される直前) にprecmd()
の中身が実行されます。これを利用して、インタラクティブシェルでコマンド実行前に
caffeinate
コマンドをバックグラウンドで実行しディスプレイのスリープを抑制し、コマンド終了後にcaffeinate
コマンドのプロセスを kill します。
~/.decaffeinated_command_list
について
~/.decaffeinated_command_list
というファイルを作りましたが、これはcaffeinate
コマンドを実行しないコマンドのリストです。
~/.decaffeinated_command_list
を再掲します。~/.decaffeinated_command_listexit exec source scriptたとえば、
exit
コマンドがこのリストの中に入っているので、インタラクティブシェルでexit
コマンドを実行したときはcaffeinate
コマンドは実行されないというわけです。こうしておかないと
caffeinate
コマンドのプロセスが残り続ける (ずっとスリープしなくなる) ことになります。
exit
コマンドでシェルを終了したり、exec
コマンドやsource
コマンドでシェルや~/.zshrc
を再読み込みしたりした場合、コマンド実行前にpreexec()
の中身は実行されますが、precmd()
の中身は実行されません。ということは、
preexec()
が実行されてcaffeinate
コマンドが実行されるのは良いものの、precmd()
が実行されないのでcaffeinate
コマンドのプロセスが残り続けてしまいます。こうすると不眠不休の Mac になってしまいます。それを避けるために、
preexec()
は実行されるがprecmd()
が実行されないようなコマンドは~/.decaffeinated_command_list
に入れておくことをおすすめします。なお、上記の理屈により、
ssh
で別のマシンにログイン中も Mac はスリープしません。SSH 先ではcaffeinate
コマンドが使えないので、SSH 接続中はずっとスリープしないようにしても良いと個人的には思っていますが、これが気に入らない場合はssh
も~/.decaffeinated_command_list
に追加してください。他にも、
man
やless
やvim
を開きっぱなしにして放置している間にスリープしてほしい場合は、それらを~/.decaffeinated_command_list
に追加してください。
$!
について(caffeinate -d & echo $!) | read _tn_caffeinate_pid
$!
にはバックグラウンドプロセスのうち、直前に実行されたプロセスのプロセス番号が入っています。上記のスクリプトでは、
caffeinate -d &
でcaffeinate
コマンドがバックグラウンドで起動したので、$!
にはcaffeinate
コマンドのバックグラウンドプロセスのプロセス番号が入っています。そのプロセス番号を
_tn_caffeinate_pid
に代入しています。コマンド終了時にprecmd()
でこのプロセス番号を指定して kill しています。
pkill caffeinate
ではダメな理由プロセス番号を保持しなくても
pkill caffeinate
を使えばcaffeinate
コマンドのプロセスを kill することはできます。しかしそれだと、別のシェルセッションで実行中の
caffeinate
コマンドのプロセスも一緒に kill されてしまいます。たとえばシェルセッションを 2 つ起動していて、片方で時間がかかるコマンドを実行させていて、もう片方で別の作業をしていたとします。
もし
pkill caffeinate
を使っていた場合、作業している側のシェルでcaffeinate
コマンドのプロセスをすべて kill してしまっているので、もう片方の、時間がかかるコマンドがまだ終了していなくてもスリープしてしまいます。作業の合間に休憩しようとしてスリープしてしまうことになります。
それを防ぐために、ちゃんとプロセス番号を保持して、そのコマンドを実行したときの
caffeinate
コマンドのプロセスだけを kill するようにします。おまけ:
caffeinate
コマンドの起動と終了のチェックコマンド実行前に、本当に
caffeinate
コマンドが実行されるのかどうか、そして終了後にちゃんとプロセスが kill されているのかが気になるかもしれません。その場合は以下を
~/.zshrc
に追記します。~/.zshrc+ export PROMPT_STATE="" + + caffeine_count() { + echo -e "\033[38;05;172m$(ps aux | grep caffeinate | grep -cv grep)\033[00m" + } + + get_prompt_state() { + PROMPT_STATE="☕️ $(caffeine_count)" + } + get_prompt_state _tn_cmd='' need_caffeine=true _tn_caffeinate_pid='' preexec() { _tn_cmd=$1 need_caffeine=true while read line do if [[ $_tn_cmd =~ ^([[:blank:]]+.*)*$line([[:blank:]]+.*)*$ ]]; then need_caffeine=false fi done < ~/.decaffeinated_command_list if type caffeinate 1>/dev/null 2>/dev/null && "${need_caffeine}"; then (caffeinate -d & echo $!) | read _tn_caffeinate_pid fi + + if "${need_caffeine}"; then + if ! { [ "$(ps aux | grep caffeinate | grep "$_tn_caffeinate_pid" | grep -cv grep)" -eq 1 ] && [[ "$_tn_caffeinate_pid" =~ ^[0-9]+$ ]]; } then + echo -e "\033[1;93mWARNING:\033[00m Running out of caffeine! Computer may sleep while executing \`\033[1m$_tn_cmd\033[00m' if it takes long time\033[00m" + echo + fi + fi } precmd() { if "${need_caffeine}" && [[ "$_tn_caffeinate_pid" =~ ^[0-9]+$ ]]; then kill "$_tn_caffeinate_pid" fi _tn_caffeinate_pid='' + + get_prompt_state }
preexec()
では、以下のいずれかの条件がそろっているときに、コマンド実行前にcaffeinate
コマンドが実行されていないという警告を出します。
- 文字列
"caffeinate"
と、直前のバックグラウンドプロセスの番号で grep したときにcaffeinate
コマンドのプロセスが 1 件ではないcaffeinate
コマンドのバックグラウンドプロセス番号を保持する$_tn_caffeinate_pid
の中身が数値ではない (空文字列などになっている)また、
precmd()
ではget_prompt_state()
を呼び出していて、この関数で環境変数PROMPT_STATE
をセットしています。
PROMPT_STATE
にはcaffeine_count()
の実行結果が入っていて、caffeine_count()
はcaffeinate
コマンドのプロセスの数を返します。あとはこれを環境変数
PROMPT
の中に入れておけば、常にプロンプトにcaffeinate
コマンドのプロセスの数が表示されます。ぼくは Starship を使っているので、環境変数
PROMPT
に入れる代わりに Starship のenv_var
モジュールにセットしています。~/.config/starship.toml[env_var] variable = "PROMPT_STATE" default = "???" style = "bold yellow"これで以下のように表示されます。
"☕️ 0" と表示されていますね。
caffeinate
コマンドのプロセスがないことがわかります。ここの数字が 1 以上だった場合は、別のシェルセッションで何かしらのコマンドが実行されているので今はスリープしないということを表しています。Bash や Linux では使えないのが弱点
Bash だと Bash-Preexec を使えば Zsh の
preexec()
やprecmd()
相当のことができるのですが、試してみたところ、残念ながら正しく機能しませんでした。理由はわかりませんが、Bash-Preexec でバックグラウンドプロセスに回すような処理を書くと、インタラクティブシェルでパイプを使ったときにコマンドがストップしてしまいます。
~/.bashrc[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh preexec() { # バックグラウンドで実行する処理を書く caffeinate -d & }$ ps aux | grep caffeinate # 処理がストップしてしまうもしかしたらこれはバグかもしれないので、今後修正されるかもしれません。
Fish に関しては試していないのでわかりませんが、
--on-event fish_preexec
と--on-event fish_postexec
が、それぞれ Zsh のpreexec()
とprecmd()
に似ているので代用できるかもしれません。また、この
caffeinate
コマンドは macOS (Darwin) 専用なので Linux では使えません。Linux にもcaffeinate
コマンド相当のコマンドがあれば使えると思います。
- 投稿日:2021-01-13T14:50:50+09:00
WindowsからMacOSをSSH経由でシャットダウンさせる
リモートで作業中に切断され、復旧できなかったときに(仕方なく)再起動する方法を残す。
環境
・Windows10(接続元)
・Mojave10.14.6(接続先)前提
MacOSは「リモートログイン」の設定(システム環境設定→共有)を行っていること。
作業
・Windows10から下記コマンドを実行する
c:¥>ssh -l (Login名) (IPAddress)途中Yes/Noとパスワードを聞かれる。
・・・ Are you sure you want to continue connecting (yes/no)? yes Password:(パスワード入力)ログインしたら、続けて下記のコマンドを実行することでシャットダウン(再起動)する
(host名):~ (Login名)$ sudo shutdown -r now Password:(パスワード入力)成功したら下記メッセージが出る
Shutdown NOW!!
- 投稿日:2021-01-13T13:47:28+09:00
KiCAD(Mac版)でFreeroutingを使って自動配線する (2021年1月時点最新手法)
はじめに
オープンソース開発環境、かつ、ハードウェアを開発する環境として、充実の機能を提供をしてくれるKiCADについて、さらにより良く開発を進めるための思考錯誤を記録しています。
(誰かの何かに役立てば。。)この記事は
KiCADで部品数が多いなどある程度の規模になってきた際に、実際に民生品や産業用と向け商用開発とかで良く行っている、部品間の配線つなぎを可能な限り自動でやりたい!と感じて、纏めている記事となります。
先人の方々のお陰でKiCAD-自動配線ツールのダウンロード・インストール方法を筆頭に、参考となる良記事(文末参考文献をご参照)がありますが、いずれもWindowsでの実施方法であり、Macにて自動配線を行う場合には、いくつか工夫が必要でしたので、本記事纏めております。
なお、この記事では
KiCAD(Mac版) Version: (5.1.8-0-10_14), release build
Freerouting Version: 1.4.4
JAVA Version: openjdk version "11.0.9" 2020-10-20
にて実施しています。
どういった人向けか
KiCADを使って基板(PCB(=Print Circuti Board)とも言います)を設計している方向けの記事です。
まずぶつかった壁
KiCADで自動配線を行うためにはFreeroutingというツールをインストールし、KiCADと組合せて使う必要があるのですが、Mac版のFreeroutingは
のいずれかにてMac向けの
freerouting-1.4.4-macos-x64.dmg
という.dmg
形式のインストールファイルが入手できるので、その流れでインストールを進めてもといった形で"Freerouting.appは壊れているため開けません。"となってしまい、インストールが上手く出来ませんでした。(Macに
.appファイル
をコピーして実行しても同様…)どう乗り越えたか
何度実施してもダメなため、Freeroutingについては、Java版を用いる事としました。
以下がインストール(および実行)手順です。Freerouting Java版の入手
Freerouting Java版はこちらにて入手可能です。
このページにての様な形で
freerouting-1.4.4-executable.jar
をダウンロードしてください。
これで、Java版の実行ファイルの入手が出来ました。Freerouting Java版実行の事前準備(JAVA 11を有効化)
次に重要だったのが、Java版での実行となるため、Macに適切なJAVAバージョンを有効化しておく事が必要となります。
ハードエンジニア寄りの当方にとって、Javaについては当方もまだ学びの最中で詳しく無いのですが、単純にGUIインストールしたりbrewインストールしただけだと、現行最新版がインストールされてしまうと思います。
このまま進めてしまうと、今回のFreerouting Java版は動作不可
でしたので、JAVA11をインストール、かつ有効化する事をまずは進めます。
JAVA11の有効化については以下が非常に参考となりました。当方としては、
jenv
を用いて、Freeroutingを用いる際にJAVA11にスイッチングする形をとりました。以下がその動作例となります。(この例では、JAVA11を有効化しつつ、JAVA8にいつでも切り替えられるイメージです)Freerouting Java版の実行方法
ここまで来たら後はFreerouting Java版の実行とのことでfreeroutingでKiCadのPCBを自動配線する時に、手動で最後のひと押しをする方法を参考にしつつ、以下コマンドを打つことで、Freerouting GUIが立ち上がると思います。
java -jar freerouting-1.4.4-executable.jar
やっと立ち上がった様子がこちら。
いざKiCADとの連携
で、いよいよ、ここからのKiCADとの連携については
が非常に分かりやすいですので、こちらを参考とさせて頂きながら
- KiCADのpcbnewにて、
specctra DSN(.dsn)
ファイルをエクスポート(出力)- Freeroutingにて、1.でエクスポートした
specctra DSN(.dsn)
ファイルをインポート(読み込み)Autorouter
ボタンをクリック- Freeroutingにて、
specctra session file
をエクスポート(出力)- KiCADのpcbnewにて、5.でエクスポートした
specctra session file
をインポート(読み込み)- 自動配線完了!
の流れで出来ると思います。
なお、まれにAutorouter
ボタンをクリックしてエラーになったことがありましたが、エラーとなっている結線のみを手動で一本引いてあげる
事で、エラー回避してそれ以外は自動配線完了、という事も出来ましたのでご参考まで。さいごに
Mac環境においても、無事、部品間の配線つなぎを可能な限り自動で行うことが実現出来ました。
参考文献・リンク
- 投稿日:2021-01-13T11:30:04+09:00
Mac 読み上げ言語を切り替えるshell script
読み上げ言語の切り替え
日本語だったら英語に、英語だったら日本語に切り替えるためのシェルスクリプトです。
automatorに実行させて、ショートカットで動くようにしています。
スクリプトを直接実行させると反映されなかったので、シェルをファイルに保存して、bash speech.shのように実行させています。#!/bin/sh SelectedVoiceID=`/usr/libexec/PlistBuddy -c "print SelectedVoiceID" ~/Library/Preferences/com.apple.speech.voice.prefs.plist` if [ $SelectedVoiceID != 369275117 ]; then /usr/libexec/PlistBuddy -c "set SelectedVoiceID 369275117" ~/Library/Preferences/com.apple.speech.voice.prefs.plist /usr/libexec/PlistBuddy -c "set SelectedVoiceCreator 1886745202" ~/Library/Preferences/com.apple.speech.voice.prefs.plist /usr/libexec/PlistBuddy -c "set SelectedVoiceName Kyoko" ~/Library/Preferences/com.apple.speech.voice.prefs.plist else /usr/libexec/PlistBuddy -c "set SelectedVoiceID 184560141" ~/Library/Preferences/com.apple.speech.voice.prefs.plist /usr/libexec/PlistBuddy -c "set SelectedVoiceCreator 1886745202" ~/Library/Preferences/com.apple.speech.voice.prefs.plist /usr/libexec/PlistBuddy -c "set SelectedVoiceName Ava" ~/Library/Preferences/com.apple.speech.voice.prefs.plist fi killall com.apple.speech.speechsynthesisd killall SpeechSynthesisServer
- 投稿日:2021-01-13T07:04:11+09:00
M1 Macに機械学習環境を最速で構築してみた (conda, jupyter notebook, tensorflow)
はじめに
M1対応のtensorflowを使うにはApple公式のGithubリポジトリ(Apple/tensorflow-macos)からパッケージをダウンロードして一つ一つインストールするなど面倒だったのですが、
conda-forge
にまとまったパッケージがあったのでそれを使ってM1 MacbookにM1対応のtensorflowをjupyter上で実行できる環境を構築する方法をメモします。(1/12/2021 現在)この記事では
- Jupyter Notebook上でM1対応のtensorflowを実行する簡単な方法を紹介します。
- 実際にM1のGPUを使って学習してみます。
目次
tensorflowを実行する環境を構築する
anaconda環境をインストール
まずは下のGitHubページの、OS X arm64 (Apple Silicon) Miniforge3-MacOSX-arm64を選び、Miniforgeのインストーラーをダウンロードします。
conda-forge/miniforgeダウンロードした
Miniforge3-MacOSX-arm64.sh
を使ってターミナルからMiniforgeをインストールします。$ bash Miniforge3-MacOSX-arm64.sh
必要なパッケージをインストール
# m1用tensorflowを含んだconda環境の作成、起動 $ conda create -n python38 tensorflow-addons tensorflow -c isuruf/label/tf -c conda-forge $ conda activate python38 # Jupyter notebookのインストール $ conda install -n python38 -c conda-forge notebook $ conda install -n python38 -c anaconda ipykernel # Jupyter Notebookに現在のpython環境をセット $ python -m ipykernel install --user --name=python38Jupyter notebookを起動し、pythonファイルから
tensorflow
がインポートきれば成功です。$ jupyter notebook .import tensorflow as tftensorflowを使ってみる
Jupyter上でPythonファイルを作り以下のコードを実行します。
import tensorflow.compat.v2 as tf mnist = tf.keras.datasets.mnist import time tf.enable_v2_behavior() from tensorflow.python.framework.ops import disable_eager_execution disable_eager_execution() from tensorflow.python.compiler.mlcompute import mlcompute mlcompute.set_mlc_device(device_name='gpu') (x_train, y_train),(x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(1024, (3,3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(512, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) start = time.perf_counter() model.fit(x_train, y_train, epochs=5) end = time.perf_counter() print("Elapsed time : {0} s.".format(end-start)) model.evaluate(x_test, y_test)20分ほどで学習が終わりました。
device_name='gpu'
とするのを忘れるとCPUが使われて遅くなってしまいます。mlcompute.set_mlc_device(device_name='gpu')参考文献