Macでまあまあよく使っているアプリまとめ(2021年3月)

Karabiner-Elements

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

karabiner-elements.pqrs.org

ただただ素晴らしい。
Macを使う理由の一つ。(他の理由はフォントがきれいなこと、OSに統合されたUNIX likeなCLI環境があること)
vi風カーソルがないと生産性がた落ち。
設定は超簡単。自分で定義を書くのも簡単にできる。

iTerm2

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

iterm2.com

素晴らしいターミナルアプリ。

Homebrew

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

brew.sh

Mac用パッケージマネージャ。
Karabiner-Elements、iTerm、Homebrewの組み合わせで快適なCLI環境がつくれる。

かわせみ3

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-visa-orange

www.monokakido.jp

3ライセンスキー:6,600円(税込)
Google日本語入力の変換のおかしさに耐えられなくなってかわせみに移行した。
かわせみも結構ひどいが少なくとも学習するし、そこそこカスタマイズできるので使えないということはない。

MacVim-KaoriYa

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

github.com

昔のviってUndoは1回だったし、syntax highlightもなかったけどそれでCのプログラム書いてた。
Vimではたいていのことが便利にできる。
軽いし、これで十分。

Firefox

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

www.mozilla.org

会社Macだと社内システムがChromeに依存してたりするのだが、私物MacではFirefoxがメインブラウザ。
たまに使えないサイトがあるがその時はSafariを使えばいいので、Chrome使わなくても生きていける。

Chrome

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

www.google.co.jp

会社Macだとメインブラウザ。
タブ開きすぎなので常にメモリを大量に使ってる。

Choosy

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-paypal-orange

www.choosyosx.com

$10
Rebuildfmで紹介されてたので入れてみた。
リンクによって立ち上げるブラウザを切り分けることが出来る。
会社Macだと社内のURLはChrome、インターネットのサイトやGoogle検索はFirefoxと使い分けをしている。

Bartender

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-paypal-orange

www.macbartender.com

これも、Rebuildfmで紹介されてたので入れてみた。
メニューバーのアイコンが多すぎて、メニューで隠れてしまう問題があったのでちょうどよかった。
最新版のBartender4はBig Surのみ対応。会社のMacOS XがBig Surに上げられないので早く上げられるようにして欲しい。

1Password

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-visa-orange

1password.com

$35.88(税抜) 1年間毎のサブスクリプション

もともとアプリで使っていたがデバイス間の同期が面倒くさくなってきたので、サブスクに切り替えた。とっても快適。
これのおかげでサービスごとに違うパスワードを使うことが出来る。

Fork

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-paypal-orange

git-fork.com

$49.99(3台まで)
動作が軽快で挙動が素直なのがよい。
SourceTreeは真逆なので乗り換えた。
Mac/Windows両方アプリがあるのも良い。
チェコの人が夫婦でつくっているらしい。

Alfred

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-paypal-orange

www.alfredapp.com

Mega License £49
⌘+スペースで起動するようにしてSpotlightの替わりに使っている。
シングルクォート'からファイル名で簡単にファイルが開けるのとクリップボード履歴は必需品。
もちろんランチャーとしても使っている。ぱっと出るのが良い。

Logitech Options

https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

support.logi.com

このソフトでMX Anywhere 2のミドルボタンを範囲選択キャプチャ(クリップボード)に割り当ててる。
とりあえずどんどんキャプチャしていけば、Alfredのクリップボード履歴(画像)に残るので結構便利。

私物Macはマウス使ってないので入れてない。

Twitter App

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/paid-free-lightgrey

Twitter

Twitter

apps.apple.com

ブラウザだとマウスオーバーのポップアップがうざいので何もでない公式アプリの方が良い。軽いし。

会社Macには入れてない。本当に入れてないよ。まじでw

LINE App

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/paid-free-lightgrey

apps.apple.com

たまに使う程度。入れとけば何かと便利。

メッセージ App

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

公式アプリ。
iPhoneのiMessageや連絡先と共有されるのが便利。
仕事だと割と長い文章を書かないといけないことがあるのでたまに使う。 私物Macだとそもそも携帯がAndroidなので使い道はない。

Slack

https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

slack.com

仕事ではお世話になってます。
ブラウザだとWorkspaceの切り替えが面倒くさいのでアプリを入れてる。
メモリ食いだけど。

辞書 App

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

英和辞典として、結構使ってる。

写真 App

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/paid-free-lightgrey

iPhotoからようやく移行した。
iPhoto課金ユーザだったのになぁ。。。
特に便利とか無いけどとりあえず使ってる。

Pixelmator Classic App

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-visa-orange

Pixelmator Classic

Pixelmator Classic

  • Pixelmator Team
  • グラフィック/デザイン
  • ¥3,680
apps.apple.com

ずいぶん前に買ったので値段は忘れた。いまは、\3,680
ちょっとしたサイトのデザインサンプルとかを書くときに使っている。
Pro用も出たけどこれで十分。(Proは使わずに言ってます)

X Lossless Decoder(XLD)

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/paid-free-lightgrey

tmkk.undo.jp

大量にある昔のCDを気が向いたらFLACリッピングするために使っている。

VOX MUSIC PLAYER

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/paid-free-lightgrey

vox.rocks

XLDでリッピングした曲を確認するために入れている。

LICEcap

https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

www.cockos.com

アニメーションGIFをつくるために入れている。

KeyCast

https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

github.com アニメーションGIFをつくるときにキー入力を表示するために使っている。

VirtualBox

https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-free-lightgrey

www.virtualbox.org

仕事でWindows開発用に使っている。

Google File Stream

https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-company-orange

会社でGoogle Workspaceを契約しているので使っている。
遅いし、誰かが大量のファイルを上げるとOSごとフリーズすることもあるけど、まあ便利。

Microsoft Office

https://img.shields.io/badge/on-business-blue https://img.shields.io/badge/paid-company-orange

仕事用。周りの人が使うので仕方なく使っている。

株価 App

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/paid-free-lightgrey

公式アプリ。
ネット証券が出しているアプリはたいていWindows用なんですよね。
Macでチャートを見るのに結局これが一番使いやすい。

Steam

https://img.shields.io/badge/on-private-brightgreen https://img.shields.io/badge/paid-free-lightgrey

store.steampowered.com

Factorioをやるために入れた。

WindowsでもMacのKarabiner-Elementsのようにキーバインドを変更したい

ということでAutoHotKeyの紹介なんですが、まずは前置き

まえおき

キーボード

20代の頃は仕事上キーボードは現場で用意されているものを何でも使わないといけなかったのですが、よく使っていたのはNEC EWS-4800、PC9801シリーズ、SunのType-5, Type-6などのキーボードでした。
日本語キーボードもあれば英語キーボードもありましたし、キーマップもわりとそれぞれ違ってたりしましたね。
なかでも、SunのType-5をこよなく愛するプロジェクトリーダーの下で仕事をしたときに英語配列を気に入り、以降は選べるときは英語配列を選ぶようになっていきました。
30代ではHHKBとThinkPad Keyboard、40代から現在にかけてはHHKB Professional2 Type-S(US)を個人でも会社でも両方使うようになっています。

PC-9801

www.google.com

EWS-4800用キーボード

www.abk.nu

Sun Type5 UNIX Keyboard, Type 6 Keyboard

www5f.biglobe.ne.jp

HHKB Professional2 Type-S(US)

www.pfu.fujitsu.com

主な使い方

現在の主な使い方の組み合わせは以下のようになっています。

場所 所有 PC OS Keyboard 注意点
自宅 個人 Macbook Air 2018 OS X BigSur US版 ノートPC
自宅 会社 Mac mini 2018 OS X Catalina HHKB Type-S(US) メイン
自宅 会社 Mac mini 2018 Windows10 HHKB Type-S(US) VirtualBox
自宅 会社 ThinkPad X1 Carbon Gen7 2019 Windows10 US版 ノートPC
会社 会社 ThinkPad X1 Carbon Gen7 2019 Windows10 HHKB Type-S(US) キーボードのみオフィスに置いてる

一番使っている時間が長いのは、Mac miniにつないでいるHHKB Type-S(US)なのですが、ThinkPadにもつなぐ事があるのでWindowsでもそれなりに同じ操作ができないと仕事になりません。
そこでAutoHotKeyの出番というわけです。(やっとか)

WindowsのCapsLockはCtrl2Capを使って入れ替え済みです。

AutoHotKeyで矢印キーを実現する

一番使用頻度が高いHHKB Type-S(US)には、矢印キーがありません。
デフォルトでは Fn + ;/[' なのですが、そんなの使いにくくてしょうがないので自分は Ctrl + hjkl を割り当ててます。
いわゆるvi風ってやつですね。(ちなみにメインのエディタはVimです)

MacだとKarabiner-Elementsという素晴らしいソフトで実現しているのですが、Windowsでいい感じのソフトを探していたらAutoHotKeyというので出来ました。

karabiner-elements.pqrs.org

www.autohotkey.com

Windows + HHKB Type-S(US)を使うときだけでなくThinkPad単体で使うときもうまく行ってます。
ちなみにMac mini上のVMWindowsを使うときはMacキーバインドがそのまま使えるので何もしていません。

レシピ

AutoHotKeyは設定を拡張子ahkのファイルにテキストで記述し、コンパイルしたものを起動時に実行させます。

矢印キーは押しっぱなしになるのでキーリピートの設定を入れてます。

; キーリピートの早いキーボードだと警告が出るので設定
#HotkeyInterval 100

矢印キーの制御を記述します。

; vi like key
^h::Send, {Left}

^j::Send, {Down}

^k::Send, {Up}

^l::Send, {Right}

以下のページからリファレンスを見ることが出来ます。

ahkwiki.net

「ホットキー」と「キーリスト」を見ると定義がわかります。
修飾シンボルとして ^ がCtrlキーとなり、Leftはキーリストから探すと矢印キーの左になりますね。

つまり ^h::Send, {Left}Ctrl+h が来たら 左矢印キー になるということです。
j, k, lも同じように定義します。

Shiftを押しながら選択移動も定義します。

^+h::Send, +{Left}

^+j::Send, +{Down}

^+k::Send, +{Up}

^+l::Send, +{Right}

Shiftの修飾シンボルは + です。
つまり ^+h::Send, +{Left}Ctrl+Shift+h が来たら Shift+左矢印キー になるということです。

その他

Emacs風のもの少し

Emacs風というよりはbashzshの対話シェルのときによく使ってるからという感じでしょうか。
特に Ctrl + aCtrl + e は多用するので設定しています。

^a::Send, {Home}

^+a::Send, +{Home}

^e::Send, {End}

^+e::Send, +{End}

Slackの送信ボタン

Slackを日本語モードにすると Enter が改行になるのはいいんですが、送信がMacだと Cmd + EnterWindowsだと Ctrl + Enter でよく間違えます。
両方同時に使ってると頭のモード切替が間に合わなくてw
よく使うMacに合わせるためにWindowsでは Alt + Enter で送信出来るように設定します。
この設定はSlackのときだけ使えるようしています。

; slack
#IfWinActive, ahk_exe slack.exe
    !Enter::
        Send, ^{Enter}
        return
#IfWinActive

#IfWinActive はWindowタイトルやプロセスを指定してその時だけ動作するように設定できます。
Windowタイトルやプロセスはahkスクリプトを実行したときにタスクトレイのアイコンを右クリックすると、出てくるWindow Spyというツールで調べることが出来ます。

※1行で書くときはreturnが省略できますが、複数行ではreturnを書かないと次に流れていってしまいます。(思わぬ挙動になったりします…)

今後

とりあえず今はこれだけですが、Karabiner-Elementsで出来ているCtrlキーを一回押すとEscになって、長押しはCtrlとして動く、というのも実現したいな。

Karabiner-ElementsはWebでほしい設定をポチポチ押すだけで設定できるので他にも色々設定しているけど、AutoHotKeyは記述しても思ったように動かないことが多くて、デバッグが結構必要になるし、ちょっとづつ増やしてる感じですね。

VMWare ESXi 7.0をアップデートする

ESXiにHDDを追加したのでついでにアップデートしました。
ESXi 7.0 15843807から16324942にしてます。

以前やったのは5.5から6.5にしたのですが、7.0ではアップデート用のファイル名が変わっていました。

gozuk16.hatenablog.com

7.0では、VMware vSphere Hypervisor (ESXi) Offline Bundle というのを使うようです。VMware-ESXi-7.0b-16324942-depot.zipですね。

# esxcli software sources profile list -d  /vmfs/volumes/datastore/VMware-ESXi-7.0b-16324942-depot.zip
Name                          Vendor        Acceptance Level  Creation Time        Modification Time
----------------------------  ------------  ----------------  -------------------  -----------------
ESXi-7.0bs-16321839-no-tools  VMware, Inc.  PartnerSupported  2020-06-02T05:57:00  2020-06-02T05:57:00
ESXi-7.0b-16324942-standard   VMware, Inc.  PartnerSupported  2020-06-02T17:26:43  2020-06-02T17:26:43
ESXi-7.0bs-16321839-standard  VMware, Inc.  PartnerSupported  2020-06-02T05:57:00  2020-06-02T05:57:00
ESXi-7.0b-16324942-no-tools   VMware, Inc.  PartnerSupported  2020-06-02T17:26:43  2020-06-02T17:26:43

ESXi-7.0bとESXi-7.0bsの2つが入ってる…。
ここを見ると、

docs.vmware.com

名称とバージョン リリース日 カテゴリ 詳細
ESXi 7.0b - 16324942 06/16/2020 機能拡張 セキュリティとバグ修正のイメージ
ESXi 7.0bs - 16321839 06/16/2020 機能拡張 セキュリティのみのイメージ

ということなので、ESXi 7.0bを採用。

# esxcli software profile update -p ESXi-7.0b-16324942-standard -d /vmfs/volumes/datastore/VMware-ESXi-7.0b-16324942-depot.zip
Update Result
   Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
   Reboot Required: true
   VIBs Installed: VMW_bootbank_nvme-pcie_1.2.2.14-1vmw.700.1.25.16324942, …
   VIBs Removed: VMW_bootbank_nvme-pcie_1.2.2.13-1vmw.700.1.0.15843807, …
   VIBs Skipped: VMW_bootbank_bnxtnet_216.0.50.0-4vmw.700.1.0.15843807, …

アップデートできました!

後で気がついたんですが、VMware-ESXi-7.0U1c-17325551が出てますね…。

Bitbucket Server(オンプレ)からbitbucket.org(クラウド)への移行

この記事は、Infocom Advent Calendar 2020 15日目の記事です。

qiita.com

2020年の9月くらいからBitbucket Serverの移行をしたときの話です。

まえがき

自分が所属している部署では2014年に自分が導入したBitbucket Serverを使っています。(その前はSubversion)
COVID-19以降は基本在宅勤務になり、制約はあまりないが接続が面倒なSSL-VPNから接続を意識しないブラウザベースのPre App VPN主体へと切り替わり、CloneやPush/Pull出来ないオンプレのGitサーバが使いにくいと思う事が増えてきてました。
また、20年以上その時々に所属する部署の開発環境を整備してきたのだけど、いつまでも自分がやれないこともあるし、残してきたシステムが古くなるさまを見ると、マネージドなサービスに移行すべきなんだろうなと考えていたりして、移行に踏み切れたのかもしれないですね。

移行直後に、AtlassianからオンプレミスのServer製品EOLが発表されたのでタイミングとしては良かったのかなと思ってます。

事前調査

中身はGitなのでリポジトリが移行出来るというのはわかってました。これはbitbucket.orgじゃなくて別サービス、例えばgithub.comでも一緒です。
Pull Requestは移行できないというのが公式サイトにも書いてあったのでそこは考えた末に、過去分はオンプレで見れるからいいやということにしました。
やってみて、気がついたのがフォーク(fork)でした。今までフォークしたリポジトリ間でPull Requestを出すようなワークフローでした。
が、普通にリポジトリを移行しただけではフォーク関係が切れてしまいました。
これでは今のワークフローが回らなくなるので、フォークを維持しながら移行できるか調べたら、なんとかなりました。

支払いはドル建てのクレジットカード払いになるということはわかっていたので、そこは社内で精算方法を確認しておきました。

移行

大まかな手順はこんな感じです。

  1. git clone --mirror で社内リポジトリのミラーを作成
  2. APIクラウドリポジトリ作成
  3. 社内のミラーに、クラウドリポジトリをremoteとして登録
  4. 社内ミラーをクラウドリポジトリへpush

フォークがあるともうちょっと複雑になります。

  1. git clone --mirror で社内リポジトリのミラーを作成
  2. APIクラウドリポジトリ作成
  3. 社内のミラーに、クラウドリポジトリをremoteとして登録
  4. 1のforkリポジトリのミラーを作成
  5. APIクラウドに2のforkリポジトリ作成
  6. 社内のforkミラーに、クラウドforkをremoteとして登録
  7. 社内forkミラーをクラウドforkへpush
  8. 社内ミラーをクラウドリポジトリへpush

という感じです。

リポジトリ

Bitbucket Serverとbitbucket.orgのリポジトリはURLが違います。
Bitbucket Serverは、 https://git.intra.example.com/scm/$PROJECT/$REPO という構成になっています。
bitbucket.orgは、 https://bitbucket.org/$WORKSPACE/$REPO です。

概念としてはクラウドにもプロジェクトはありますが、URLで識別するものではなくなっています。

単純なリポジトリの移行ならこんなスクリプトでやってます。
Macでやってますが、デフォルトのbashでは使えない機能を使ってしまったので、homebrewで入れたbashを使っています。

#!/usr/local/bin/bash

リポジトリ--mirror オプションを付けてクローンしてます。

git clone --mirror https://userid@git.intra.example.com/scm/$ORG_PROJECT/$REPO

クラウドリポジトリを作るAPIは、割と単純ですが、プロジェクトを指定するために指定するJSONは結構試行錯誤しました。
消してから作るようにしているので、移行後に流すのは厳禁です。
(※実際にはコマンドは改行なしの1行です)

curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}
curl -v -X POST -u userid:passwd -H "Content-type: application/json"
    https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}
    -d {
        "scm": "git",
        "is_private": true,
        "fork_policy": "no_public_forks",
        "name": "'$R'",
        "project": {
            "type": "project",
            "name": "'$PROJECT'",
            "key": "'${PROJECT^^}'"
        }
    }

Git-LFSは使っているところが少ないのですが、もれないようにスクリプトの中で発行してしまってます。

git lfs fetch --all
...
git lfs push --all new

remoteにpushするのは --mirror オプションを付けていますが、 git push --all new && git push --tags の方がいいのかもしれない?

git push --mirror new

次に移行するリポジトリがあったら調べてみようかな。

以下スクリプトの全文です。

#!/usr/local/bin/bash

BASE_DIR="/Users/gozu/projects/migration"

WORKSPACE="example_ws"
ORG_PROJECT="Project1"
PROJECT="Project1"

REPOS="repo1 repo2"

rm -rf $PROJECT
mkdir $PROJECT
cd $PROJECT

for R in $REPOS ; do
        REPO=$R.git
        rm -rf $REPO
        git clone --mirror https://userid@git.intra.example.com/scm/$ORG_PROJECT/$REPO
        curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}
        curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} -d '{"scm":"git", "is_private":true, "fork_policy":"no_public_forks", "name":"'$R'", "project": {"type":"project", "name":"'$PROJECT'", "key":"'${PROJECT^^}'"} }'
        cd $REPO
        git lfs fetch --all
        git remote add --mirror=push new https://userid@bitbucket.org/$WORKSPACE/$REPO
        git push --mirror new
        git lfs push --all new
        cd ..
done

cd $BASE_DIR
  • 参考

developer.atlassian.com

qiita.com

www.seeds-std.co.jp

フォーク

bitbucket.orgのリポジトリはURLにプロジェクトが入らなくなったので、forkして同じリポジトリ名を別プロジェクトに作ることが出来ません。
なので、forkを移行するときはリポジトリ名の後ろに -fork を付加して移行しました。
https://git.intra.example.com/scm/$PROJECT/$REPOhttps://bitbucket.org/$WORKSPACE/$REPO-fork
という感じですね。

以下のスクリプトは、repo1, repo2にそれぞれ別プロジェクトでフォークがあった場合です。
forkを含めて空のリポジトリを作ってからpushしてます。

フォークはリポジトリ名に -fork を付加してAPIで作ってます。
(※実際にはコマンドは改行なしの1行です)

curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}-fork
curl -v -X POST -u userid:passwd
    https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}/forks
    -H 'Content-Type: application/json'
    -d {
        "name": "'$FORK_R'-fork",
        "workspace": {
            "slug": "$WORKSPACE"
        },
        "project": {
            "type": "project",
            "name": "'$FORK_PROJECT'",
            "key": "'${FORK_PROJECT^^}'"
        }
    }

以下スクリプトの全文です。

#!/usr/local/bin/bash

BASE_DIR="/Users/gozu/projects/migration"

WORKSPACE="example_ws"
ORG_PROJECT="Project1"
PROJECT="Project1"

REPOS="repo1 repo2"

rm -rf $PROJECT
mkdir $PROJECT
cd $PROJECT

for R in $REPOS ; do
        REPO=$R.git
        rm -rf $REPO
        git clone --mirror https://userid@git.intra.example.com/scm/$ORG_PROJECT/$REPO
        curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}
        curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} -d '{"scm":"git", "is_private":true, "fork_policy":"no_public_forks", "name":"'$R'", "project": {"type":"project", "name":"'$PROJECT'", "key":"'${PROJECT^^}'"} }'
        cd $REPO
        git lfs fetch --all
        git remote add --mirror=push new https://userid@bitbucket.org/$WORKSPACE/$REPO
        #git push --mirror new  ← fork作ってからPushする
        #git lfs push --all new  ← fork作ってからPushする
        cd ..
done

cd $BASE_DIR

FORK_PROJECT="ForkProject"
FORK_ORG_PROJECT="fp"

FORK_REPOS="repo1 repo2"

rm -rf $FORK_PROJECT
mkdir $FORK_PROJECT
cd $FORK_PROJECT

for FORK_R in $FORK_REPOS ; do
        FORK_REPO=$FORK_R.git
        rm -rf $FORK_REPO
        git clone --mirror https://userid@git.intra.example.com/scm/$FORK_ORG_PROJECT/$FORK_REPO

        curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}-fork
        curl -v -X POST -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}/forks -H 'Content-Type: application/json' -d '{ "name": "'$FORK_R'-fork", "workspace": { "slug": "$WORKSPACE" }, "project": {"type":"project", "name":"'$FORK_PROJECT'", "key":"'${FORK_PROJECT^^}'"} }'

        cd $FORK_REPO
        git lfs fetch --all
        git remote add --mirror=push new https://userid@bitbucket.org/$WORKSPACE/$FORK_R-fork.git
        git push --mirror new
        git lfs push --all new
        cd ..
done

cd $BASE_DIR

cd $PROJECT

for R in $REPOS ; do
        REPO=$R.git
        cd $REPO
        git push --mirror new
        git lfs push --all new
        cd ..
done
  • 参考

developer.atlassian.com

機能差

移行後に気が付きましたが、細かい機能差があります。
どうやらクラウド版とオンプレ版では別製品のようですね。(クラウド版はPython実装で、オンプレ版はJava実装みたい)
パッと気がついたところで以下のような差異があります。だいたいクラウドでは出来ないという感じ・・・。今後に期待。

  • Shift-JISが文字化けする
    • Pull Requestで旧表示(See the old experience)にすると化けないこともある
    • .gitattribute でdiffは直るようだが、ファイル表示では化けてる
  • 要作業がない
    • 昨日(2020/12/14)、 Request changes がリリースされた!
  • Pull Request作成後、添付ファイルを追加できない
    • Pull Requestを作るときは添付できる
  • プロジェクト設定がない
    • URLでもわかるようにリポジトリがフラットに管理されているようなので仕方がないか
    • APIでまとめて設定した→※後述
  • git lfsの容量で課金額が変わる
    • むやみに使わないようにするしか無いかな
  • Pull Requestの削除がない
    • 却下のみ
  • クラウド版のJIRAとの連携は強化されている
    • JIRAも同じ時期にCloudへ移行したのでこれは嬉しかった
  • SourceTreeがうまく使えない
    • 特に社内のProxy環境下で・・・
    • なんか意味不明な挙動をするので、早々に諦めて私はForkというアプリに移行しました。VS Codeに移行したメンバーも居るよう
  • CI(pipeline)がついた
    • まだ使ってない(既存のCIはJenkins)
  • オンラインエディターがついてた
    • 以前はAddonを買っていたので節約できた
  • Markdownレンダリング結果が違う
    • 修正するしか無い
  • 自動マージングがなくなった
    • これはすごい不便。git-flowでやってるので、releaseブランチをmasterとdevelopの両方に自動でマージしたいのに・・・
  • Addonだけど、Auto Unapprove for Bitbucket Serverに相当するものがない

APIでまとめて設定

プロジェクト設定がなくなったので、リポジトリ毎に設定をしないといけないが1つづやってられない・・・
APIでやりたいことは一応出来た。
とりあえずやったことは、ブランチのアクセス許可の設定です。
masterとdevelopの削除禁止と履歴の書き換え禁止、プルリクエストでマージ(全員)です。(他もやればできそう)

f:id:gozuk16:20201215131345p:plain

(※実際にはコマンドは改行なしの1行です)

curl -v -X POST -u userid:passwd -H "Content-type: application/json"
    https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}/branch-restrictions
    -d '{
        "kind": "force",
        "pattern": "master",
        "branch_match_kind": "glob"
    }'

curl -v -X POST -u userid:passwd -H "Content-type: application/json"
    https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}/branch-restrictions
    -d '{
        "kind": "delete",
        "pattern": "master",
        "branch_match_kind": "glob"
    }'

curl -v -X POST -u userid:passwd -H "Content-type: application/json"
    https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}/branch-restrictions
    -d '{
        "kind": "push", "user": [],
        "pattern": "master",
        "branch_match_kind": "glob", "groups": []
    }'

リポジトリに強制的に付与したので、リポジトリの一覧を取得してます。
APIリポジトリの一覧を取得しているのですが、一回のリクエストに付き最大100個しか取れないので以下のようにしてます。
2ページ取ればよかったのでループにはしてないですね。。。

以下スクリプトの概要です。

#!/usr/local/bin/bash

#--- page 1 ---
REPOS=`curl -v -X GET -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE\?pagelen\=100\&page\=1 | jq -r '.values[].name'`
for R in $REPOS ; do
    ...
done

#--- page 2 ---
REPOS=`curl -v -X GET -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE\?pagelen\=100\&page\=2 | jq -r '.values[].name'`
for R in $REPOS ; do
    ...
done
  • 参考

developer.atlassian.com

残課題

bitbucket.orgのミラーを社内に残ったBitbucket Serverに作って、1日1回くらい同期させておきたい。
バックアップにもなるし、メンテ落ちのときにソースも見られるし。

Macでリンクによって起動するブラウザを切り替える

www.choosyosx.com

rebuild.fm で何回か紹介されていたChoosyを入れてみました。

在宅勤務が常態化して8ヶ月位なのですが、社内で勤務していたときにはなかった事が起きてます。

例えば、社内のサイトを見るために、ブラウザベース(Chrome)のPer App VPNが導入されたとかですね。
社内勤務のときは例えばSlackからリンクを押しても、Proxyを通るか通らないかの違いくらいで、どのブラウザでも同じようにページを開くことが出来ました。
しかし、現在の在宅勤務では、Per App VPN経由の社内サイトはChromeでしか開けず、GSuiteはクラウド認証をしないと使えず、という状況になっています。
社内サイトはChrome一択です。
Chrome以外のFirefoxSafariは常時クラウド認証を通してないのでGSuiteもChromeで開きたいです。
逆に、インターネット上のサイトはFirefoxで開きたいです。これは理由があってGoogle meetをChromeでやってるときに、別のタブで重いページを開くとmeetが止まったりして嫌なので、裏で調べ物などをするときはFirefoxを常用しているからですね。

で、Choosyの出番なのですが、SlackにはられているURLをクリックすると全部Chromeに飛んでしまうので、URL毎にブラウザを切り替えたかったということです。
下の図のようにSlackのリンクを押したらリンクの内容に応じて、

  • 社内にあるConfluence、Redmineクラウド認証が必要なGSuiteなら、Chrome起動
  • Cloud版を利用しているJIRAやBitbucket、Stack Overflowやgithub.comならFirefox起動
  • 判断に困るようなサイトがあれば手動選択

というようなことが出来ます。

f:id:gozuk16:20201211131623p:plain

しばらく使った結果、とてもいい感じだったのでPayPalで10$支払いました。

ルールの設定方法は簡単で、Choosyを起動したら Rules タブを開き、 + を押してルールとどのブラウザを選ぶか(それともブラウザを手動で選ぶか)決めるだけです。

f:id:gozuk16:20201211103009p:plain

この例だと、Slackで社内サイトならChromeを使うことにしてます。
GSuiteなら以下のように設定してますね。

f:id:gozuk16:20201211103234p:plain

仕事がリモート中心になって半年が過ぎたので振り返る(ガジェット篇)

ヘッドセット、マイク

以前から東京、大阪、福岡に開発メンバーが分散していたので、ヘッドセットは持っていた。

以前オフィスで使っていたのは、

Jabra Pro 925

https://assets.jabra.com/2/9/1/d/291d7974316a14a43e155ea71f70a6a2774dd89b_Jabra_Pro_925_Dual_Connectivity_01_Jabra_Pro_925_Dual_Connectivity_0001_Jabra_Pro_925_Dual_Conn.png?w=400&h=400&auto=format

www.jabra.jp

ワイヤレスの片耳タイプで、Bluetoothではなく台座に充電兼専用レシーバーが埋め込まれている。とても安定していて気に入っていた。
このヘッドセットはマイク性能がとても良い。ノイズキャンセリングと指向性のおかげで周囲の音は殆ど拾わないし、キーボードの打鍵音もほとんど気にならない、自分の声はもちろんクリアに聞こえる。

その後、ドライバのトラブルに見舞われて別のヘッドセットに変えた。

Sennheiser MB Pro 1

https://www.senncom.jp/sites/default/files/products/2017-10/product_detail_x2_desktop_mp-pro1-skype-1.jpg

www.senncom.jp

こちらはBluetoothなのだが付属のレシーバーを使うようになって接続のトラブルは起きなくなった。
マイク性能はJabraの方が良かった気がするが、こちらも十分よいものであった。
Jabraはマイクの位置取りがシビアだったのが、こちらはちょっとずれていてもちゃんと拾ってくれる。もちろんノイズキャンセリングも付いてるので周囲の音を拾いすぎる感じはない。

毎日リモートワークになってきた当初は快適に過ごせていたが、周囲がなれてきて毎日長時間ビデオ会議が入ってくると今までなかった問題が発生した。
耳の問題である。
5時間も6時間もやっていると蒸れるし、鼓膜が痛くなったり、頭痛がしてくる。
これでは仕事にならないので、私物で持っていた骨伝導ヘッドフォンに変えたところ耳のトラブルはピタッと収まった!

AfterShokz Aeropex(私物)

https://cdn.shopify.com/s/files/1/0271/5389/1376/products/AEROPEX-product_1024x1024.png?v=1579555281

AEROPEXaftershokz.jp

ウォーキングや通勤時にPodcastを聞くために買ったのだが、周囲の音が入ってくるので大きな音がするとPodcastの音が聞こえなくなるという弱点があってお蔵入りになってたのだ。
去年から羽田空港への着陸ルートが変更され自分が住んでいる品川区やウォーキングをする目黒川周辺の上空を飛行機が低空でバンバン飛ぶようになり、高頻度でPodcastの音がかき消されるという致命的な弱点があったが、室内でビデオ会議を行うのには何ら問題がない。
ちなみに眼鏡ともほとんど干渉しない優れもの。

マイクについてはついてるという程度のものでノイズキャンセリングもなくこもった音になる。キーボードの打鍵音やマウスホイールの音を拾うことも多かった。
耳のことを考えると骨伝導一択なので、不満があったマイクだけ変えてみることにした。
入力と出力を別デバイスにするとエコーやハウリングが起こるわけなのだが、骨伝導ヘッドフォンから音はもれないはずなので大丈夫だろうという事、手頃なお値段、ミュートできる、ミュート状態が見た目でわかるという基準で選んでみた。

Maono AU-GM10

https://cdn.shopify.com/s/files/1/0025/5934/4686/products/microphone_gooseneck_1296x.jpg?v=1579138516

Gooseneck Microphone USB Cardioid Condenser Mic MAONO AU-GM10www.maono.com

コンデンサーマイクなので環境音を拾いすぎないかちょっと心配だったけど、単一指向性マイクのおかげかまず問題ないレベル。
キーボードの打鍵音は多少拾うようだが、すぐ隣に置いているので仕方がないか。
概ね満足しているのだが、Google meetを起動すると入出力デバイスを合わせようとするので、マイクがAfterShokzに戻されて、びっくりみたいなことがあり、設定覚えてくんないかなーって思ってる。(あれ?今日確認してみたらちゃんと保存されてる?)

最近発売されたAfterShokzのOPENCOMMではマイクが改善されているとのことなのでいずれ試してみたい。

https://cdn.shopify.com/s/files/1/0271/5389/1376/files/landing-pc-03_2000x_116bfc85-fcbd-4d11-a02e-967894456ab5_2000x.png?v=1602222225

OPENCOMMaftershokz.jp

マイクって自分自身にはどうせ聞こえないのだけど、ビデオ会議で音が悪い人がいると発言内容よりそっちが気になってしまって印象が悪くなるので、気をつけてる。 最低限ノイズキャンセリング付きのマイクはみんな使ってほしいなー。

今は、Jabra Pro 925はWindowsマシンの方につないでいて、月1回のMicrosoft Linkで会議をするときに使っている。
LinkはMacで出来そうで出来ないのでWindows用にいちいち切り替えるよりいいし、短時間だし、音質は良いのでいい感じ。
Sennheiser MB Pro 1はオフィスに置いてあるので月に2,3回出社したときに使ってる。こちらも性能は良いので短時間だし十分満足している。

カメラ

ビデオ会議で自分の顔を流す人は少ないですね。
そもそも大抵は資料を映すので必要がないというか、Google meetだとZoomと違って資料と顔を別画面に映せないし、皆で画像を流していると声が途切れることが多いと思う。そのへんZoomはすごいけど、会社指定のツールがmeetなんでだいたい顔を映さなくなることになりますね。
ただ、朝会や1on1とかでは映す方がいいと思うのでそうしてる。

私のメインマシンはMac miniなのでカメラがない。
以前は別のノートPCからミュートでログインしてノートPCのカメラを使ってたけど、面倒なのでiPhoneのカメラをWebカメラとして利用できるアプリを使うようになった。

EpocCam(私物)

EpocCam Webcamera for Computer

EpocCam Webcamera for Computer

  • Corsair Components, Inc.
  • 写真/ビデオ
  • ¥980
apps.apple.com

WiFiで飛ばせるので便利です。meetでも使えてます。(もちろんZoomでも) iPhoneのカメラはしょぼいWebCamよりクリアに映るし、背景画像を設定したときに境目のぼやけが少ない気がする。

ただ、アプリの制約でiPhoneを横向きにしないといけないため位置取りが面倒なんで、机のフレームに巻きつけられるような小型のゴリラポッド三脚を買ったところとても良い感じになった。

ラスタバナナ RastaBanana RLEGTRB00YE

rbdirect.jp

こんな感じ。(右上の方)

f:id:gozuk16:20201115221818j:plain

カメラを使わないときは縦にしておいて、メールやSlackの通知がぱっと出るのでこの位置に固定するのが意外と便利。
作業中のPCに通知が出るとうざいのですが目の前のiPhoneにちょっと出る程度ならさほど邪魔されず、なんか来たから後で見ようかって感じになります。 最近会社携帯がiPhone 11になったので正面に固定しておくと顔認証でメール通知で最初の数行見えるし、2FAアプリもFace ID対応しててこれまた便利。

どうでもいい話ですが、プレゼン中にSlackのメッセージを通知させるように設定するのはやめたほうがいいですよ。変なのが来るんじゃないかとヒヤヒヤしますw

電話がかかってきたときは昔買ったBluetoothのヘッドセットで取るので問題なし。

plantronics M70

www.poly.com

あと、iMessageが来たときはMacで全部見られるし、返事もできるので超便利(会社ではProxyに阻まれるが・・・)

ノートPC用アーム

ほぼ毎日家で仕事をしていると使いもしないPCを会社においておくのがもったいないので、Mac miniを家で常用し、持ち出し用のノートPC(ThinkPad X1 Carbon)も基本家に置くようになりました。
そうするとまずノートPCの置き場所に困った。いちいちしまったり出したり面倒だし、Slackやメールを表示しておくと便利なので、アームを買うことにした。

サンワサプライ 100-NPC004(私物)

direct.sanwa.co.jp

ガスシリンダー式のフレキシブルアームなので微調整できるし、キーボードを打てる程度にはしっかり固定されるのでいい感じ。
自宅の机はエレクターで自作しているのだが、机の天板が完全に平らではないためアームを固定する台座が不安定だったけど、100均で耐震ゴムを買ってきてクランプと机の間に挟み込んだらバッチリ固定できた。

f:id:gozuk16:20201115221126j:plain

最後に

自分が聞こえないのでマイクにこだわらない人が多いけど、マイクはある程度いいものを使うべき。
体を大切に。(耳とかその他色々ね)
私物と会社の備品が混じっているが、会社規定として利用に問題なく、また自宅で永続的に使いたいものは自分で買うことにしている。
写真に写っているモニターやキーボード(HHKB Type-S)も私物ですね。

Gitのコミットemailを書き換える

環境をいくつも使っていると設定を間違ってコミットしてしまうことがありますよね。
特に1台のPCに仕事とプライベートのリポジトリが混在してるとメール設定が間違っていたり・・・
こういうのは大抵だいぶ後に見つけてしまうのですが、Gitは過去のコミットログを修正できます。
まあ push -f するのは危険なので最初から気をつけるに越したことはないですけどね。

ここを参考にやってみました。

qiita.com

確認方法

1個目は正常。2個目間違ってる。。。

$ git log --pretty=fuller
commit xxxxxxxxxxd61e214a190a042f3416c5d85f4046 (HEAD -> master, origin/master, origin/HEAD)
Author:     GOZU Kenichiro <gozuk16@gmail.com>
AuthorDate: Sat Oct 31 13:13:20 2020 +0900
Commit:     GOZU Kenichiro <gozuk16@gmail.com>
CommitDate: Sat Oct 31 13:13:20 2020 +0900
 
commit xxxxxxxxxxd66b9169746acada7f8355e59d6d1c
Author:     GOZU Kenichiro <k.gozu@example.com>
AuthorDate: Fri Oct 30 13:13:21 2020 +0900
Commit:     GOZU Kenichiro <k.gozu@example.com>
CommitDate: Fri Oct 30 13:13:21 2020 +0900

emailを書き換え

指定するメールアドレスは変更後のものです。
履歴全部を書き換える場合、最後に HEAD を指定します。
ユーザ名も GIT_AUTHOR_NAMEGIT_COMMITTER_NAME で書き換えできますが、今回はメールアドレスだけ間違ってました。

$ git filter-branch -f --env-filter "GIT_AUTHOR_EMAIL='gozuk16@gmail.com'; GIT_COMMITTER_EMAIL='gozuk16@gmail.com';" HEAD
Proceeding with filter-branch...

Rewrite xxxxxxxxxxd61e214a190a042f3416c5d85f4046 (20/20) (0 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten

書き換えを確認

$ git log --pretty=fuller
commit xxxxxxxxxxd1218c7b6d2a96c57e0ca6f8776547 (HEAD -> master)
Author:     GOZU Kenichiro <gozuk16@gmail.com>
AuthorDate: Sat Oct 31 13:13:20 2020 +0900
Commit:     GOZU Kenichiro <gozuk16@gmail.com>
CommitDate: Sat Oct 31 13:13:20 2020 +0900
 
commit xxxxxxxxxx72d5d3b83a8df9c645508e3531787d
Author:     GOZU Kenichiro <gozuk16@gmail.com>
AuthorDate: Fri Oct 30 13:13:21 2020 +0900
Commit:     GOZU Kenichiro <gozuk16@gmail.com>
CommitDate: Fri Oct 30 13:13:21 2020 +0900

リモートリポジトリへpush

過去を改変した場合、 -f じゃないとpush出来ないのでチームで使ってるリポジトリはメンバーに確認してやりましょう。

$ git push -f
Enumerating objects: 83, done.
Counting objects: 100% (83/83), done.
Delta compression using up to 12 threads
Compressing objects: 100% (82/82), done.
Writing objects: 100% (83/83), 25.66 KiB | 3.67 MiB/s, done.
Total 83 (delta 46), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (46/46), done.
To https://github.com/gozuk16/testrepo
 + xxxx200...xxxxd73 master -> master (forced update)