MacからAirPodsに接続して指定のマイクを入力にする

普段は携帯にAirPodsを繋いでPodcastを聞いたりしているのですが、ミーティングをする時にMacAirPodsを繋ぎます。繋ぐために、ツールバーBluetoothを選んで〜と手順が多いのも気になっていたんですが、外付けマイクを使いたいのに、AirPodsを繋ぐと自動で入力がAirPodsになってしまい、マイクを指定し直すのが毎回面倒でした。

そこで今回アプリケーションランチャーのAlfredを使うことで、キーボードショートカットでAirPodsに接続、接続後に指定のマイクが入力に設定されるようにできたので、その方法を残しておきます。

1. Alfred Powerpackを購入してインストールする

Alfredのworkflows機能を使うので、Alfred Powerpackを購入し、インストール後にライセンスを入力します。

www.alfredapp.com

2. AirPods Connector workflowをインストールする

下記のサイトを参考にして、AirPods Connectorのworkflowをインストールします。 この設定ができるとキーボードショートカットでAirPodsに接続/切断することができます。

qiita.com

3. AirPods接続後に指定のマイクを入力に設定する

2 でインストールしたAirPods Connectorのworkflowの最後に Run NSAppleScript を追加します。

f:id:t-kashima:20210415234907p:plain:w320

そして、スクリプトの内容は下記になります。 好きなマイクの名前 のところは、Macサウンド設定の入力に表示されている指定したいマイクの名前に変更します。

on alfred_script(q)
deplay 0.3
tell application "System Preferences" to activate
tell application "System Preferences"
    reveal anchor "input" of pane id "com.apple.preference.sound"
end tell
tell application "System Events" to tell process "System Preferences"
    delay 0.3
    try
        select (row 1 of table 1 of scroll area 1 of tab group 1 of window "サウンド" whose value of text field 1 is "好きなマイクの名前")
    on error errMsg
        return errMsg
    end try
end tell
quit application "System Preferences"
end alfred_script

これでキーボードショットカットを押すだけで、AirPodsに接続して入力に指定のマイクが設定されます!

AquaSKKとSlackでCtrl+jを取り合うのを制御する

ある日、Slack上でCtrl+jを押すとDownloadsウィンドウが開くようになってしまいました。

f:id:t-kashima:20200618004400p:plain:w240

普段からAquaSKKで文字を入力しているので、このままだと入力モード切り替えの度にウィンドウが出てきてかなり不便です。そこで、この記事では、Karabiner ElementsとAquaSKKの設定を変えることで、Ctrl + jで入力モード切り替えのみを行う方法を書きます。

1. Karabiner Elementsをインストールする

まずは下記のリンクからキーボードをカスタマイズするKarabiner Elementsをインストールします。

karabiner-elements.pqrs.org

2. Aqua SKKの設定を追加する

AquaSKKの入力モード切り替えは、デフォルトでCtrl+jが割り当てられています。このままでは、Slackのショートカットとバッティングしてしまうので、それとは別でCtrl+tでも入力切り替えができるように設定します。

まずは、下記のコマンドで keymap.conf をコピーして持ってきます。

cp /Library/Input\ Methods/AquaSKK.app/Contents/Resources/keymap.conf $HOME/Library/Application\ Support/AquaSKK

次にコピーしてきた keymap.conf を開いて、SKK_JMODEの部分に ||ctrl::t を追加します!これでCtrl+j、Ctrl+tどちらでも入力モードを切り替えることができるようになります。

SKK_JMODE        ctrl::j||ctrl::t

変更して保存した後に、メニューバーにあるAquaSKKの「設定ファイルの再読み込み」を押しておきます。

f:id:t-kashima:20200618005642p:plain:w240

3. Karabiner Elementsに設定を追加する

Karabiner Elementsは、Complex modificationsの項目を設定することで、開いているアプリに応じて、押したキーを別のキーに入れ替えることができます。今回は、Slackアプリを開いている時にCtrl+jが押されたら、Ctrl+tが押されたことにします。

まずは、下記の場所にある設定ファイルを開きます。

$HOME/config/karabiner/karabiner.json

次に complex_modifications の rules の部分に下記を追加します。

                "rules": [
                    {
                        "description": "Ctrl-J to Kana on Slack",
                        "manipulators": [
                            {
                                "conditions": [
                                    {
                                        "bundle_identifiers": [
                                            "^com\\.tinyspeck\\.slackmacgap$"
                                        ],
                                        "type": "frontmost_application_if"
                                    }
                                ],
                                "from": {
                                    "key_code": "j",
                                    "modifiers": {
                                        "mandatory": [
                                            "control"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "t",
                                        "modifiers": [
                                            "control"
                                        ]
                                    }
                                ],
                                "type": "basic"
                            }
                        ]
                    }
                ]

bundle_identifersの部分で、どのアプリを開いている時かを指定することができます。fromは押されたキー、toがこのキーが押されたことにする指定になります。

捕捉ですが、同時にインストールされるKarabiner-EventViewerを使うと、どのアプリを開いているかやどのキーが押されているかが表示されるので、一度確認してからbundle_identifiersやtoを設定すると正確です。

最後に

これで、Slackアプリを開いて、Ctrl+jを押した時に、Ctrl+tが押されたことになるので、Downloadsウィンドウは出てこず、入力モードの切り替えだけを行えるようになりました!

この辺りの記事を参考して色々試しました。

medium.com

今年読んだ、私の好きなマンガ3選

この記事はアルベントカレンダー19日目です。

今年も残すところあと少し、ということで、

ちょうどマンガサービスの「アル」で、今年のBEST3が作れるようになったので、今年読んだ好きなマンガを紹介します!

alu.jp

今年はいつもよりたくさん読んだのですごく迷いましたが、その中でも作品の雰囲気が好きなマンガを3つ選んでみました!

f:id:t-kashima:20191218233154j:plain

水は海に向かって流れる

水は海に向かって流れる(1) (KCデラックス)

水は海に向かって流れる(1) (KCデラックス)

このマンガは、高校への進学を機に、おじさんの家に居候することになった高校生の男の子と、その家で男女5人が共同生活を送っていく話です。ですが、大きな事件が起きたり、慌しくなることはなく、どこまでも日常が描かれます。

alu.jp

そして、何げない会話や、時にドキッとするシーンも

alu.jp

alu.jp

日頃なにげなく感じている気持ちと、照らし合わせながら読める素敵なマンガだなと思います。読みはじめたのはこの記事を読んだからなのですが、すごく読みたくなる内容なので、気になった方はおすすめです。

alu.jp

デッドデッドデーモンズデデデデデストラクション

東京に侵略者が乗った巨大な母艦が舞い降りる中、青春時代を過ごす女子高生たちの話です。とにかく、浅野いにお先生の世界感なんですが、ものすごく個性的な登場人物たちが繰り広げる非日常の中の青春に、より力強さが際立っています。

alu.jp

そして、立ち止まって考えさせられるシーンが多いのも魅力です

alu.jp

alu.jp

非日常の中にも変わらない日常があって、登場人物たちの慌しさに、読んでいて元気になれるマンガです!

ネムルバカ

ネムルバカ (リュウコミックス)

ネムルバカ (リュウコミックス)

今年、石黒正数先生のマンガをはじめて読みました。どれも面白かったのですが、その中でも「ネムルバカ」は、音楽のアルバムように何度も読み返したいと思える作品でした。大学の女子寮で同室の先輩と後輩が、素朴な疑問や葛藤から色んな話をするんですが、どの話も自分にない視点で物事を見ているのが読んでいて新鮮です!

alu.jp

alu.jp

また登場人物たちのゆるいやりとりや場を流れる空気も、読んでいて居心地がいいです。 最後もすっきりした終わり方なので、みんなにオススメできるマンガです!

こんな感じで

他にも読んでやる気にさせてくれたり、今まで知らなかった世界を見せてくれたり、今年はマンガに影響を受けた1年でした。もし、おすすめのマンガがあれば、気軽に教えてもらえると嬉しいです!

そして、今年読んだマンガBEST3を作ってみてはいかがでしょうか?

alu.jp

最後まで、読んでくれてありがとうございました!!


記事内のすべてのコマは出版社様・著作者様からの許可をいただいた上、「アル」内で投稿されたものになります。詳しくはこちら

香川でよく行くコワーキングスペース

ほとんど家で作業をしているのですが、時々コワーキングスペースを利用しています。そこで、「香川 コワーキングスペース」で調べてもほとんど見つからなかったので、誰かのためにも行ったことがある所をまとめておこうと思います。

1. gain-Y (ガイニー)

https://gain-y.com/wordpress/wp-content/uploads/gain-ykaijyou-e1555545711165.jpg
ホームページより

gain-y.com

瓦町駅から東に徒歩5分、市街から離れた静かな場所にあります。アンティーク調で落ちついた空間なので、ゆったり作業がしたい時に利用しています。店主の方は、コワーキングスペースを運営されて長く、地元の話からWordpressの話まで色々聴けて面白いです。

[うどん情報] 近くの釜バターうどんで有名なバカ一代がおすすめです

www.udonbakaichidai.co.jp

2. co-ba 高松

https://s3-ap-northeast-1.amazonaws.com/static.co-ba.net/wp-content/uploads/2018/07/IMG_0409.jpg
ホームページより

co-ba.net

高松中心部の中央公園の近くにある、木と間接照明で暖かい空間のコワーキングスペースです。大学が近くにあったり、商店街からのアクセスも便利なので、色んな職業の方が利用されています。また、定期的に落語やヨガなどのイベントが開催されているのも面白そうです。

[うどん情報] 商店街にある麺処綿谷が量も多く満足感が高いです

www.maruwa-wataya.com

3. BIBLIO 〜Hammer Academy〜

https://image.jimcdn.com/app/cms/image/transf/dimension=1038x10000:format=jpg/path/sfb78419520e1debf/image/iafae6e0133f16c8a/version/1554098266/image.jpg
ホームページより

www.biblio-studyspace.com

瓦町駅からすぐ、トキワ街に今年オープンしたコワーキングスペースです。地元の塾が運営しているのもあってか、少し暗めなところが黙々と集中して作業しやすい空間です。本棚に置いてある本も、マンガからビジネス書までこだわりが感じられて面白いので、眺めてるだけでも楽しいです。

[うどん情報] 近くのしんぺいうどんの日替わり定食がおいしかったです

www.shikoku-np.co.jp

こんな感じでまだ行ったことがある数は少ないですが、香川にもしっかりコワーキングスペースはあります!まだ知らないところもありそうなので、また見つけたらふらっと行ってみようと思います。

Node.jsで特定のフォントを使えるようにする

Cloud FunctionsなどのNode.js環境で、日本語フォントを使いたいけど入ってないことがあると思います。そんな時にGoogle Fontsなどからダウンロードしてきたフォントを使えるようにできます。

はじめに

Node.js で fc-list コマンドを実行して、既に使えるフォントを確認してみましょう。

const result = spawnSync('fc-list');
console.log(result.stdout.toString();

/usr/share/fonts/truetype/tlwg/TlwgTypo-Bold.ttf: Tlwg Typo:style=Bold
/usr/share/fonts/truetype/tlwg/TlwgTypewriter-BoldOblique.ttf: Tlwg Typewriter:style=Bold Oblique
...

  こんな感じで使えるフォントの一覧が表示されます。

fontconfigを作成する

手元にあるフォントをどこかNode.jsから見えるディレクトリに置きます。そして、fonts.confファイルを作成して、フォントのパスを記載します。例えば、下記の階層だと /src/fonts/google と書きます。

/src/fonts
  ├ fonts.conf
  ├ /google
    ├ 〜.otf

fonts.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/src/fonts/google</dir>
</fontconfig>

FONTCONFIG_PATHを指定する

次にNode.jsの環境変数 FONTCONFIG_PATH に、fonts.confがあるディレクトリを指定します。例の場合だと、/src/fonts/ です。

process.env.FONTCONFIG_PATH = '/src/fonts/';

これで、もう一度 1. を実行すると、Node.jsから使いたかったフォントが一覧に表示されると思います!

※フォントのライセンスにはくれぐれも注意しましょう

Cloud FirestoreをExportしてImportする

Cloud FirestoreをExportして、別プロジェクトのCloud FirestoreにImportすることがあったのでその方法を残しておきます。

Cloud FirestoreをExportする

今回はClound Functionsのscheduleを使って定期的にバックアップとしてCloud StorageにExportするようにしました。 この2つの記事がものすごく参考になりました。

medium.com

firebase.google.com

1. サービスアカウントに権限をつける

Exportした結果をCloud Storageにアップロードするので、サービスアカウントに下記の権限を付与します。

- 環境とストレージ オブジェクトの管理者
- Cloud Datastore インポート / エクスポート管理者

さっそくGCPのIAMページを開いて PROJECT_ID@appspot.gserviceaccount.com のサービスアカウントの鉛筆マークを選択します。

f:id:t-kashima:20191210221649p:plain

そして、 + 別の役割を追加 を選んで2つの役割を追加して保存します。

f:id:t-kashima:20191210221822p:plain:w160

2. Cloud Functionsで定期的にCloud FirestoreをExportする

Cloud Functionsのscheduleを使って、特定の時間にCloud StorageにCloud FirestoreからExportします。この場合は毎朝5時に実行されます。

const functions = require('firebase-functions');
const firestore = require('@google-cloud/firestore');

export const backupFirestore = functions.pubsub.schedule('every day 05:00').timeZone('Asia/Tokyo').onRun(async (context) => {
    const projectId = 'PROJECT_ID';
    const client = new firestore.v1.FirestoreAdminClient();
    const databaseName = client.databasePath(projectId, projectId);
    await client.exportDocuments({
        name: databaseName,
        outputUriPrefix: `gs://${projectId}-backups-firestore`,
        collectionIds: []
    });
    return null;
});

コードを書いたらCloud FunctionsにDeployします。

3. 動作確認

それでは、GCPCloud Scheduler画面の「今すぐ実行」から実行してみましょう。

f:id:t-kashima:20191210222900p:plain:w240

実行のログは、少し待ってからCloud Functionsのログタブで確認することができます。

f:id:t-kashima:20191210223043p:plain:w320

Exportが成功するとCloud Storageに下記のようなディレクトリができます。これでExportできました。

f:id:t-kashima:20191210223201p:plain

Cloud FirestoreにImportする

次にExportしたコレクションをCloud FirestoreにImportします。

1. ImportしたいプロジェクトのCloud Storageにアップロードする

※ExportとImportするプロジェクトが同じであればこの手順は不要です。

Cloud FirestoreにImportする場合は、下記の手順で一度ダウンロードしてから、ImportしたいCloud Firestoreと同じプロジェクトのCloud Storageにアップロードします。

// ローカルにダウンロード
gsutil -m cp -R gs://BUCKET_NAME/2019-12-08T00:00:00_00000 .

// Cloud Storageにアップロード
gsutil cp -R 2019-12-08T00:00:00_00000 gs://NEW_BUCKET_NAME/

2. gcloudコマンドでImportする

先ほどアップロードしたファイル名を指定して、下記のコマンドでFirestoreにimportします。既に存在しているIDと同じデータをImportするとエラーになるようなので、すべて消してからImportするのがよさそうです。

gcloud firestore import gs://NEW_BUCKET_NAME/2019-12-08T00:00:00_00000

特定のコレクションのみのImport方法などはこちらに書いてありました。

firebase.google.com

これでCloud FirestoreへのImportもできました。

まとめ

やる前は色々大変そうだなと思っていたのですが、Cloud Functionsにscheduleがあったり、GCPの中で完結したので特に詰まることなくできてよかったです!

ひゃくえむ。がめちゃくちゃ熱い

今年読んだマンガの「ひゃくえむ。」は読みながらすごく熱くなれる作品でした。この記事では、好きな主人公の熱いところをコマを混じえて紹介したいと思います!

(なお、記事内のすべてのコマは出版社様・著作者様からの許可をいただいた上、「アル」内で投稿されたものになります。詳しくはこちら)

これはアルベントカレンダー8日目の記事になります。

adventar.org

ひゃくえむ。とは

ひゃくえむ。(1) (マガジンポケットコミックス)

ひゃくえむ。(1) (マガジンポケットコミックス)

あらすじ

俺はトガシ。生まれつき足が速かった。だから、100m走は全国1位だった。「友達」も「居場所」も、“それ”で手に入れた。しかし小6の秋、初めて敗北の恐怖を知った。そして同時に味わった。本気の高揚と昂奮を──。100mの全力疾走。時間にすれば十数秒。だがそこには、人生全てを懸けるだけの“熱”があった。

小学生の頃のトガシは走ることに熱心ではなく、こんな感じでした。

alu.jp

それから高校生になったトガシは、走ることに少しずつ向き合い熱くなっていきます。

alu.jp

圧倒的な自信

熱くなったトガシは、走るのを飽きらめかけたチームメイトに、

alu.jp

俺は速いぞ (負けねぇからついてこい!)とさらっと言ったり、

alu.jp

こう言ってくる先輩に向かっては、

alu.jp

めちゃくちゃ熱く語ります!!

alu.jp

周りも変わる

顧問の先生も元々弱腰だったんですが、

alu.jp

トガシたちの影響で変わりました!

alu.jp

まとめ

トガシが100mに向き合っていく姿を見ていると、読んでいるこっちまで熱くなります!取り組む時の "熱" の大切さが分かりますね。

1つのことに人生を懸けて進んでいく姿は読んでいてすごく気持ちがいいです!全5巻で読みやすいので、熱くなりたい方はぜひ手にとってみてはどうでしょうか。

alu.jp