20190607のMacに関する記事は6件です。

一足遅れて Kubernetes を学び始める - 15. セキュリティ -

ストーリー

  1. 一足遅れて Kubernetes を学び始める - 01. 環境選択編 -
  2. 一足遅れて Kubernetes を学び始める - 02. Docker For Mac -
  3. 一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -
  4. 一足遅れて Kubernetes を学び始める - 04. kubectl -
  5. 一足遅れて Kubernetes を学び始める - 05. workloads その1 -
  6. 一足遅れて Kubernetes を学び始める - 06. workloads その2 -
  7. 一足遅れて Kubernetes を学び始める - 07. workloads その3 -
  8. 一足遅れて Kubernetes を学び始める - 08. discovery&LB その1 -
  9. 一足遅れて Kubernetes を学び始める - 09. discovery&LB その2 -
  10. 一足遅れて Kubernetes を学び始める - 10. config&storage その1 -
  11. 一足遅れて Kubernetes を学び始める - 11. config&storage その2 -
  12. 一足遅れて Kubernetes を学び始める - 12. リソース制限 -
  13. 一足遅れて Kubernetes を学び始める - 13. ヘルスチェックとコンテナライフサイクル -
  14. 一足遅れて Kubernetes を学び始める - 14. スケジューリング -
  15. 一足遅れて Kubernetes を学び始める - 15. セキュリティ -

前回

一足遅れて Kubernetes を学び始める - 14. スケジューリング -では、AffinityなどでPodのスケジューリングについて学習しました。今回は、セキュリティについて学習します。

サービスアカウント

Podで実行するためのプロセスを制御するために割り振られるアカウントのことをサービスアカウントというそうです。

sample-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: sample-serviceaccount
  namespace: default
imagePullSecrets:
  - name: hogehoge

これをapplyしてみます。

pi@raspi001:~/tmp $ k apply -f sample-serviceaccount.yaml
pi@raspi001:~/tmp $ k get serviceaccounts sample-serviceaccount -o yaml
...
secrets:
- name: sample-serviceaccount-token-4xhgm

サービスアカウントが作成されました。また、imagePullSecretsの内容がsecretsに登録されました。(sample-serviceaccount-token-4xhgm)
imagePullSecretsはprivateなdockerレジストリに使います。

pi@raspi001:~/tmp $ k get secrets sample-serviceaccount-token-4xhgm -o yaml
apiVersion: v1
data:
  ca.crt: ...
  namespace: ZGVmYXVsdA==
  token: ...
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: sample-serviceaccount
    kubernetes.io/service-account.uid: 4bd076da-8854-11e9-af26-b827eb8ccd80
  creationTimestamp: "2019-06-06T12:12:04Z"
  name: sample-serviceaccount-token-4xhgm
  namespace: default
  resourceVersion: "584634"
  selfLink: /api/v1/namespaces/default/secrets/sample-serviceaccount-token-4xhgm
  uid: 4bfbe8bb-8854-11e9-af26-b827eb8ccd80
type: kubernetes.io/service-account-token

認証に必要なtokenが登録されていますね。

RBAC (Role Based Access Control)

RBACは、さきほど作成したサービスアカウントと、どういった操作を許可するのかを定めたRoleを紐付け(RoleBinding)して、権限管理をします。1つのRoleに対して複数のサービスアカウントをRoleBindingできます。

RBACは、2つのレベルがあり、1つはNamespaceレベルで、もう一つはクラスタレベルがあります。
設定範囲がクラスタの方が大きい感じです。(namespace横断して設定する場合はクラスタレベルにする)

  • RoleとClusterRole
  • RoleBindingとClusterRoleBinding

操作の種類ですが、どのDeploymentやDaemonSetのようなリソースに対して下記のものがあります。

* 全ての処理
create 作成
delete 削除
get 取得
list 一覧取得
update 更新
patch 一部変更
watch 変更の追従

KubernetesのRBACについて

今回はKubernetes道場 20日目 - Role / RoleBinding / ClusterRole / ClusterRoleBindingについてを参考に進めます。

新しく作ったサービスアカウントでコンテキストを作成し、そのアカウントからPod情報を取得できるか試してみます。
そのためには、サービスアカウントの認証情報を通しておく必要があります。
※ RoleとClusterRoleに大きな違いはないため、Roleを試します。

pi@raspi001:~/tmp $ TOKEN=$(k get secret/sample-serviceaccount-token-jd279 -o json | jq -r .data.token)
pi@raspi001:~/tmp $ DECODE_TOKEN=$(echo -n $TOKEN | base64 -d)
pi@raspi001:~/tmp $ k config set-credentials sample-serviceaccount --token $DECODE_TOKEN

では、コンテキスト(sample-sa-context)を作成して、それを使用します。

pi@raspi001:~/tmp $ k config set-context sample-sa-context --user sample-serviceaccount --cluster kubernetes
pi@raspi001:~/tmp $ k config use-context sample-sa-context
pi@raspi001:~/tmp $ k config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO                NAMESPACE
          kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
*         sample-sa-context             kubernetes   sample-serviceaccount

新たに作成したサービスアカウントでPodの情報が取得できるか試してみます。

pi@raspi001:~/tmp $ k get po
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:sample-serviceaccount" cannot list resource "pods" in API group "" in the namespace "default"

Errorになりました。sample-serviceaccountは何もRoleをバインドしていないからですね。
では、RoleBindingしていきます。

元に戻ります。

pi@raspi001:~/tmp $ k config use-context kubernetes-admin@kubernetes
sample-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: sample-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
sample-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: sample-rolebinding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: sample-role
subjects:
- kind: ServiceAccount
  name: sample-serviceaccount
  namespace: default
pi@raspi001:~/tmp $ k apply -f sample-role.yaml
pi@raspi001:~/tmp $ k apply -f sample-rolebinding.yaml

では、もう一度試してみます。

pi@raspi001:~/tmp $ k config use-context sample-sa-context
pi@raspi001:~/tmp $ k get po
NAME                                      READY   STATUS    RESTARTS   AGE
...

おお、取得できました!
もとに戻しておきます。

pi@raspi001:~/tmp $ k config use-context kubernetes-admin@kubernetes

SecurityContext

コンテナに対してセキュリティ設定をすることができます。
例えば、Capabilitiesの追加・削除、実行するユーザ、グループの変更、ファイルのReadOnly化などができるそうです。

sample-capabilities.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-capabilities
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      securityContext:
        capabilities:
          add: ["SYS_ADMIN"]
          drop: ["AUDIT_WRITE"]

applyし、中身を確認してみます。

pi@raspi001:~/tmp $ k apply -f sample-capabilities.yaml
pi@raspi001:~/tmp $ k exec -it sample-capabilities /bin/bash
root@sample-capabilities:/# apt update && apt install libcap2-bin
root@sample-capabilities:/# capsh --print | grep Current
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_sys_admin,cap_mknod,cap_setfcap+eip
root@sample-capabilities:/# exit

cap_sys_adminが増えてますね。audit_writeは見つかりません。
そもそも、どんな種類があるのか分からなかったので、こちらを参考にしました。

PodSecurityContext

Pod(全てのコンテナ)に対してセキュリティ設定をすることができます。
例えば、実行するユーザやグループの制御、root実行を拒否したり、カーネルパラメータを上書きすることもできます。

sample-runuser.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-runuser
spec:
  securityContext:
    runAsUser: 99
    # runAsGroup: 99
    supplementalGroups:
    - 1001
    - 1002
  containers:
    - name: centos-container
      image: centos:7
      command: ["/bin/sleep", "3600"]

では、applyしています。

pi@raspi001:~/tmp $ k apply -f sample-runuser.yaml
pi@raspi001:~/tmp $ k exec -it sample-runuser -- id
uid=99(nobody) gid=99(nobody) groups=99(nobody),1001,1002
pi@raspi001:~/tmp $ k exec -it sample-runuser -- ps aux | grep sleep
nobody       1  0.0  0.0   2032   372 ?        Ss   14:02   0:00 /bin/sleep 3600

実行したユーザがnobody(99)に変更されていますね。また、supplementalGroupsで、プライマリGIDに指定のGIDを追加することができます。

そのほか

PodSecurityPolicyや、NetworkPolicy、そして認証、認可のAdmissionControlというものもあるそうです。

お片付け

pi@raspi001:~/tmp $ k delete -f sample-serviceaccount.yaml -f sample-role.yaml -f sample-rolebinding.yaml -f sample-capabilities.yaml -f sample-runuser.yaml
pi@raspi001:~/tmp $ k config delete-context sample-sa-context

最後に

主にRBACについて学習しました。
複数人で開発する際は、コンテキストを分けて開発を進めるのが良いみたいですね。
今回で取り組んだように、誰がどの権限を持っているかをRBACで管理できるので、
必要以上の権限を与えられて事故るようなことは少なくなりますね。
(といっても、まだ個人でしか使ってないので分かりませんが...)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacにRedisをインストールする

homebrewでredisをインストールする

brew install redis

起動する

redis-server /usr/local/etc/redis.conf

CLIに接続する

redis-cli

CLIで値をset

1127.0.0.1:6379> set key1 val1
OK

CLIで値をget

127.0.0.1:6379> get key1
"val1"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[mac]ターミナル+bashでgit操作してるなら脳死でこれやっとけ

注意

これやったのmac使い始めて1ヶ月目くらいなので正直あんまり覚えてない
ミスってるとこあったらコメントで指摘もらえるとありがたい

この記事でできること

所要時間 5〜15分
・ターミナルの$前(プロンプト)にカレントディレクトリが表示される
・プロンプトに時間が表示される
・プロンプトにブランチ名が表示される
・プロンプトに色がつく

プロンプトのデフォは↓

terminal
shinozakirinka-no-MacBook-Air:lisbeth shinozakirika $

ダセェ

僕のプロ子↓
ScreenShot 21.png
可愛い

構成 : 現在時刻(hh:mm:ss) カレントディレクトリ 果実 ( gitのbranch名 ) $
色も付いてて無駄な情報がない!

カレントディレクトリを出力する

まずはカレントディレクトリのみを表示するように変更

viコマンドで.bashrcを編集

terminal
$ vi ~/.bashrc
.bashrc
export PS1='\W $'      # 追記

PS1というのがプロンプトの内容みたいな感じ、\Wがカレントディレクトリを表す変数
sourceコマンドを流すと、設定反映

terminal
source ~/.bashrc

これでプロンプトにカレントディレクトリが表示されたはず

タイムスタンプを出力する

terminal
$ vi ~/.bashrc
.bashrc
export PS1='\W $'       # これを

export PS1='\t \W $'   # こう

\tというのが時間(24時間形式)を表す変数
またsourceで設定反映

terminal
source ~/.bashrc

タイムスタンプが表示されたはず

現在のブランチ名を表示する

結論から書くと

.bashrc
source ~/project/git/contrib/completion/git-completion.bash
source ~/project/git/contrib/completion/git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true

export PS1='\t \W$(__git_ps1) $ '

とするとブランチ名が表示される

source ~/project/git/contrib/completion/git-completion.bash
source ~/project/git/contrib/completion/git-prompt.sh

この2つはブランチ名表示するのに必要なやつ
(理解はしてないけど、とりあえず理解する必要もない)
brewでgitをインストールしたならここにあるはず

.bashrc
$ ls /usr/local/etc/bash_completion.d/

↑流して出ない人は↓から落として来て、そのpathを書けばいい
https://github.com/git/git/tree/master/contrib/completion

GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true

ブランチ名の右側にステータスが表示される
変更されたファイルがあれば *
addされたファイルあれば +
追加されたファイルがあれば %
stashがあれば $

便利

[おまけ1]色を付ける

いい感じになったけど色つけると可愛くなる

.bashrc
export PS1='\[\033[33m\]\t \[\033[36m\]\W\[\033[35m\]$(__git_ps1)\[\033[00m\] \$ '

本題とずれるので自分好みにしたい人は↓記事みてみるといい
https://qiita.com/fernet/items/4dcb6f82520d87227121

[おまけ2]点滅する果実を表示する

僕は最終的に↓使ってる

.bashrc
export PS1='\[\033[33m\]\t \[\033[36m\]\W\[\033[5;31m\] \[\033[00m\]\[\033[35m\]$(__git_ps1)\[\033[00m\] \$ '

おわり

これでgit branchとかgit status打つ機会は圧倒的に減ったと思う

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ブラウザのfaviconキャッシュを消す

faviconが消えない。

Webアプリを作ってて仕上げにアイコン画像を設定するも、ブラウザの方はたとえばVue.jsで作ったシステムだといつまでたっても緑のVアイコンが変わらないなんてことがよく起きますよね。(特に開発環境localhost:xxxxとか)

これですw

ブラウザのタブ部分とかに表示されてるfaviconは、強制リロードしてもキャッシュを削除してリロードしてもなかなか反映されないです。

そんな時、私はブラウザのfaviconキャッシュを消すようにしてます。

パスの備忘録も兼ねて...

Chrome

  • よくわからないがjournalも削除してる。
rm -f ~/Library/Application\ Support/Google/Chrome/Default/Favicons
rm -f ~/Library/Application\ Support/Google/Chrome/Default/Favicons-journal

Safari

  • ディレクトリごと削除。
rm -rf ~/Library/Safari/Favicon\ Cache

Firefox

  • プロファイルが個別なのがいやらしい、とにかく全部消す。
rm -f ~/Library/Application\ Support/Firefox/Profiles/*.default*/favicons.sqlite

あ、Macしかわかりません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【ターミナル改造④】情報表示のlsコマンドの装飾ツールの「lsd」を導入して、外観からの効率性を問う。

  • 白黒ターミナルを利用する生活が多くなってきた無機質生活に、少々彩りを加えるために奔走する記事第四弾。
  • とうとうMacのデフォルトシェルがbashからzshへ変わることに、冷静を最大に装いながら、無意識の手の震えが止むことを知らない。
  • 今回は、ファイルやフォルダの情報表示のlsコマンドを、カラフルにわかりやすく表示してくれる「lsd」を導入して、外観と効率性の両立を検討していくことにしよう。

概要

  • Rust製の高速ファイル情報表示コマンドツール。
  • 同様のlsコマンドに比べて、「明快な可視化・カラフル」であることが特徴。
  • 公式GitHub

作業環境

  • Mac OS X 10.13.4
  • Homebrew 2.1.4

インストール

  • 「ターミナル.app」を開き、下記のコマンドをうち、lsdの利用環境を構築する。
    • ※Homebrew未導入の場合、こちらを参考にインストールする。
    • ※HomebrewCaskを未導入の場合、こちらを参考にインストールする。
# brewでlsdをインストール
$ brew install lsd
# lsdのバージョン確認
$ lsd -V
# デフォルトでは、アイコン未表示のため、フォントをインストールする。
$ brew tap homebrew/cask-fonts
$ brew cask install font-hack-nerd-font
  • フォントのインストール完了後、「ターミナル.app」の環境設定を開き、「プロファイル」欄を開く。
    • ※環境設定ページは、ターミナル上で「cmd + ,」のショートカットで開くことができる。
  • 「プロファイル」欄の「フォント」欄の変更ボタンをクリックして、フォント変更ページを出す。
  • フォント変更ページの「ファミリー」欄に、先ほどインストールしたHackNerdFontに変更する。

image.png

  • そのほかのインストール方法はこちらを参考にする。

結果

  • 下記、実際の画面

image.png

  • フォルダのツリー構造表示も可能。

image.png

基本操作

  • ※基本的には、lsコマンドの操作と変わらない。
内容 コマンド
通常表示 lsd
縦表示 lsd -l
隠しファイル含め表示 lsd -a
ワンライン表示 lsd -1
ツリー構造での表示 lsd --tree
※オプションで階層制限は現在不可能なため、全ファイル表示されることに注意
フォルダの中身含め全表示(再帰処理) lsd -R
逆順でのソート表示 lsd -lr
サイズごとのソート表示 lsd -lS

まとめ

  • 今回はカラフルな情報表示ツールの試用ということで、作業効率思考を蚊帳の外に置き、色彩に浸りながら、記事を書く。
  • これまでターミナル装飾ツールを色々利用してきたが、圧倒的割合の「外観ひけらかし設定」のため、効率性の本質を自問自答。
  • 「外観も効率性向上に必須だ」と数える程度に自分に言い聞かせながら、次の装飾術を探すことにしよう。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Karabiner-Elementsの設定が超絶楽になるDSL「Goku」

※使用環境: Goku 0.2.5, Karabiner-Elements 12.4.0, Homebrew 2.1.4, macOS 10.13.6

はじめに

「Mac 三大神アプリ」の1つと言っても差し支えない「Karabiner-Elements」ですが、設定ファイルの編集が少し面倒ですよね。GokuというKarabiner-Elements用のDSLを使うと、めちゃくちゃ楽に設定ができるようになりますよ。

どのくらい楽になるのか?

左Optionキーの空打ちを、Control+F2に割り当てる1」という設定を例に、Gokuを使わずに直接書いた場合と、Gokuを使って書いた場合とを比べてみます。

  • Gokuを使わない場合
karabiner.json(抜粋)
{
  "description": "左Option(空打ち) -> Ctrl+F2",
  "manipulators": [
    {
      "from": {
        "key_code": "left_option"
      },
      "to": [
        {
          "key_code": "left_option"
        }
      ],
      "to_if_alone": [
        {
          "key_code": "f2",
          "modifiers": [
            "left_control"
          ]
        }
      ],
      "type": "basic"
    }
  ]
}
  • Gokuを使った場合
karabiner.edn(抜粋)
{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}

いかがでしょうか?

1つだけだと、違いがもう一つ伝わらないかもしれませんので、さらに設定を2つ追加してみます。
Terminalアプリの場合にのみ、「Cmd+S -> Ctrl+S」「Cmd+T -> Cmd+T,英数キー」となる設定を追加した例が下記になります。

Gokuを使わない場合 (クリックで表示)
karabiner.json(抜粋)
{
  "rules": [
    {
      "description": "左Option(空打ち) -> Ctrl+F2",
      "manipulators": [
        {
          "from": {
            "key_code": "left_option"
          },
          "to": [
            {
              "key_code": "left_option"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "f2",
              "modifiers": [
                "left_control"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
    {
      "description": "[Terminal]  Cmd+S -> Ctrl+S",
      "manipulators": [
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.googlecode\\.iterm2$",
                "^com\\.apple\\.Terminal$"
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "s",
            "modifiers": {
              "mandatory": [
                "left_command"
              ]
            }
          },
          "to": [
            {
              "key_code": "s",
              "modifiers": [
                "left_control"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
    {
      "description": "[Terminal]  Cmd+T -> Cmd+T, EISUU",
      "manipulators": [
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.googlecode\\.iterm2$",
                "^com\\.apple\\.Terminal$"
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "t",
            "modifiers": {
              "mandatory": [
                "left_command"
              ]
            }
          },
          "to": [
            {
              "key_code": "t",
              "modifiers": [
                "left_command"
              ]
            },
            {
              "key_code": "japanese_eisuu"
            }
          ],
          "type": "basic"
        }
      ]
    }
  ]
}

  • Gokuを使った場合
karabiner.edn
{:main [{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}
        {:des "[Terminal]  Cmd+S -> Ctrl+S" :rules [[:!Cs :!Ts :terminal]]}
        {:des "[Terminal]  Cmd+T -> Cmd+T, EISUU" :rules [[:!Ct [:!Ct :japanese_eisuu] :terminal]]}]
 :applications {:terminal ["^com\\.googlecode\\.iterm2$" "^com\\.apple\\.Terminal$"]}}

いかがでしょうか?

Gokuを使わない場合は70行以上の追加が必要ですが、Gokuを使った場合は3行の追加で済みます。
このように、Gokuを使えば大半の設定は1~2行で書けるため、追加や見直しを躊躇する必要がなく、いつでも思いついたタイミングで新しい設定を試してみることが可能になります。


導入手順

Gokuを試してみたい方は、まず最初に以下の3つのドキュメントを読むことをオススメします。インストール方法、記述方法、Karabiner-Elementsへの反映まで、必要なことが一通り網羅されています。
- README.md
- Tutorial
- Example

1. Install

HomebrewでGithubのリポジトリをtapしてインストールします。

$ brew install yqrashawn/goku/goku

2. Profileの作成

Karabiner-Elementsの設定画面の「Profiles」から、Defaultという名前のProfileを追加してください。
GokuはProfileを指定する記述がない場合、Defaultという名前のProfileに設定を反映しようとします。

[※注意事項]
もし、既にDefaultという名前でProfileを運用している場合、Gokuで記述されていないリマップルールは反映時に消えてしまいますので、リネームしておいてください。別の名前のProfileを使うように指定することも可能ですが、記述ミスなどによってDefaultという名前のProfileが使われることもありますので、慣れるまではリネームしておいたほうが安全です。

karabiner-profile-gui.jpg

3. karabiner.ednの作成

Gokuはデフォルトでは、~/.config/karabiner.ednを設定ファイルとして読み込みます。
他のディレクトリやファイル名を使う場合は、反映時に環境変数GOKU_EDN_CONFIG_FILEを使ってファイルパスを指定しておく必要があります。

はじめに紹介した「左Optionキーの空打ちを、Ctrl+F2に割り当てる」という設定のみを書いたkarabiner.ednを作成します。

$ cd ~/.config
$ echo `{:main [{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}]}` > karabiner.edn

4. Karabiner-Elementsへの反映

gokuコマンドを実行して、karabiner.ednに書いた設定を、Karabiner-Elementsへの反映します。

$ goku

Done!と表示されたら反映完了です。
Karabiner-ElementsからProfileをDefaultに変更すれば、設定が反映されていることが確認できます。

complex_modifications_抜粋_.jpg

デフォルトとは違うディレクトリやファイル名で設定ファイルを作成した場合は、以下のようにGOKU_EDN_CONFIG_FILEという環境変数でパスを指定後、gokuコマンドを実行してください。

$ GOKU_EDN_CONFIG_FILE=~/path/to/file.edn
$ goku

設定ファイルをウォッチする

gokuwコマンドを実行すると、設定ファイルをウォッチして、変更があれば自動でgokuコマンドが実行されるようになります。

$ gokuw

また、brew services start yqrashawn/goku/gokuを実行すると、gokuwコマンドと同様の処理がバックグラウンドサービスとして起動されます。

ただし、現状はいずれの場合もウォッチする設定ファイルのパスが固定で、環境変数は使われないようになっているため、デフォルト以外のファイルパスを使っている場合は、gokuwの中身を変更したり、別のスクリプトを書いて対応する必要があります。

/usr/local/bin/gokuw
#!/bin/sh
watchexec -r -w ~/.config/karabiner.edn /usr/local/opt/goku/bin/goku

インポート用設定ファイルを使って反映する場合

gokuコマンドを実行すると、karabiner.jsonが更新されますが、それを避けたい場合はインポート用の設定ファイルを作成するのがいいかと思います。方法は下記の記事を参照してください。
【Karabiner-Elements+Goku】インポート用の設定ファイルを作成する

参考資料


  1. Macの標準設定では、Control+F2はメニューバーへフォーカスが移動するショートカットです。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む