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

ヘッドセット、マイク

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

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

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)

git submoduleを別のリポジトリに切り替える

以前、git submoduleを別のブランチに切り替えるというのを書いたのですが、

gozuk16.hatenablog.com

今度はオンプレのBitbucketからクラウドのBitbucketへ移行したのでリポジトリを切り替えました。
ググる.gitmodules を書き換えるというのが引っかかりますが、コマンドで出来るんじゃないかなと思って調べたらできました。

$ git submodule set-url <path> <newurl>

でした。

実際にはこんな感じ。(${workspace}クラウドのworkspace名です)

$ cat .gitmodules
[submodule "test_sm"]
    path = test_sm
    url = https://git.example.com/scm/test/test_sm.git
    branch = master

$  git submodule set-url test_sm https://bitbucket.org/${workspace}/test_sm.git
Synchronizing submodule url for 'test_sm'

$ cat .gitmodules
[submodule "test_sm"]
    path = test_sm
    url = https://bitbucket.org/${workspace}/test_sm.git
    branch = master

$ git commit .gitmodules
[master xxxxxxx] migrate git.example.com to bitbucket.org/${workspace}.
 1 file changed, 1 insertion(+), 1 deletion(-)

簡単ですね。

JIRA CloudでTempo Timesheetsを使っているときに残余を調整する

JIRAとBitbucketをオンプレからクラウドへ移行したのですが、色々勝手が違って戸惑ってます。(Confluenceは許容できない機能差が あっていったん断念しました)
クラウドのほうがアプリ間の連携はいいし、慣れれば今の在宅勤務中心な業務にあっていると思うんだけどね。
長期的にも自分がいなくなっ後も継続していけるようにマネージドなサービスにするほうがいいかなと思ってる。
つい先週50歳になってそういう事も考えないといけないなと思ったわけですよw

で、JIRA Software Serverではストーリーポイントではなく、Time Trackingで進捗管理を行っていて、時間入力が便利なTempo Timesheetsを使っていたのでCloudでも同じようにしたんですね。
ところが、初期見積りを入れたあとで修正したら残余が変えられないと言う。
たしかに、チケットの右のバーに残余が表示されてない。設定をいくら見ても出せない。。。
Tempo TimesheetsのLog Timeには残余を入れる欄があるんですが、Durationを入れないと残余見積を入力させてくれません。

f:id:gozuk16:20201015221254p:plain

困ったなーと思ってとりあえずぐぐってたら、本家のKnowledge Baseにありました。

Edit Remaining Estimate in new Jira issue view tempo-io.atlassian.net

旧バージョンの表示に戻して編集すれば出来るよと・・・

f:id:gozuk16:20201015221930p:plain

まじか。なんつー、workaround だw

f:id:gozuk16:20201015222017p:plain

まあ、できました。

asciidoctor-pdfで文字色を変える (2019年版)

以前書いた

gozuk16.hatenablog.com

で、PDFでも文字色を変えるというやり方ですが、asciidoctor-pdfを最新化したらおかしくなってしまいました。

具体的には、色は変わるのに↓のような {zwsp} という文字が差し込まれるようになってしまいました。

{zwsp}日{zwsp}本{zwsp}語{zwsp}

ぐぐってみると、

backport.net

ここの説明を読むと zwsp というのは幅ゼロのスペースだそうで asciidoctor-pdf-cjk が入れているらしい。

なるほど。文字色をつけるのに、

pass:[<span style="color:#ff0000">日本語</span>]

としているわけだからCJKが差し込むzwspをpassが可視化しちゃうのね。
しばらく考えて回避策を考えました。

pass:[<span style="color:#ff0000">]
日本語
pass:[</span>]

この文字色をつけるやり方自体がworkaroundなのに、更にworkaroundを積み重ねるのも何だけど、まあとりあえず回避で・・・

WebDriver(ChromeDriver)でProxyのWeb認証を通す

この記事は、Infocom Advent Calendar 2019 2日目の記事です。

qiita.com

経緯

社内からインターネットの何かを使うときにはProxyを通さなければならないのですが、現在のProxyは認証を通す必要があります。
Windowsで社内のADに参加している場合は、ログオン時に自動的に認証を通してくれるので意識する必要はありません。
ADに入っていない場合は、以下の条件を満たす必要があります。

  • httpのサイトにアクセスする
  • リダイレクトされた認証ページを開く
  • ユーザIDとパスワードを入力し、認証が通ったら最初に開いたhttpにリダイレクトされる

GUIが使えないLinux系のサーバではcurlを使ってプロキシ認証を通しています。
ところが、最近エラーになることが多くなってきました。
w3mでやったら一発でうまくいくのですが・・・
しばらくはコマンドを何度も実行するようにしていましたが、ある時WebDriverならうまくいくかもと思って試してみました。

結論から言うとうまくいってます!

ブラウザなら失敗したこと無いのでまあ予想通りですが・・・。(なぜ今まで思いつかなかったのか)

実装

golangのagoutiというWebDriverクライアントを利用して実装してます。(実際にはChromeDriverを使いました)
開発はMacで行ってます。

サンプルソースを↓こちらに置いておきます。
※このソースをそのまま貼り付けても動きません。URLやパラメーターは調整する必要があります。

github.com

  • ChromeDriverを起動するためのoption
options := agouti.ChromeOptions(
        "args", []string{
                "--headless",
                "-disable-gpu", // 暫定的に必要とのこと
                "--ignore-certificate-errors",   // 認証関係のエラー無視
                "--no-sandbox",
                "--disable-xss-auditor",
        })

optionをつけなければChromeブラウザが普通に上がります。
デバッグをするときはその方が便利です。

  • Web認証ページの指定
page.Navigate("https://xxx.xxx.xxx.xxx:99999/proxy?foo=bar&hogehoge=http://neverssl.com")

page.Navigate() の引数に認証ページを指定しています。
私の環境ではリダイレクト先のhttpsじゃないサイトをパラメーターで指定することになってます。(最近はhttpsが多いのでrebuild.fmで言ってたneverssl.comを指定してます)

  • ユーザID
page.FindByID("user").Fill("xxxxxxxx")
  • パスワード
page.FirstByName("passwd").Fill("xxxxxxxxxxxxxxx")

パスワードは暗号化したものを外部から渡されて、復号してセットするほうがいいと思いますけど、とりあえず・・・
パスワード変えたり、ユーザID変えたりすることも当然ありますからね。

  • ウェイト
time.Sleep(time.Second * 5)

最後にリダイレクトするのをちょっと待ちます。なくても動いたけど念の為に入れてます。

build

Macで作業してるのでクロスコンパイルでLinuxバイナリを作成します。

$ mkdir linux-amd64
$ GOOS=linux GOARCH=amd64 go build -o linux-amd64/proxyauth ./proxyauth.go

run

  • ChromeDriverを入れておく必要があります

Mac

$ brew cask install chromedriver

Linux

$ sudo apt install chromium-chromedriver

依存するパッケージがやたら多いですがしかたありません。入れてしまいましょう!

認証サイトに直接アクセスするようにしておきます。
何故か大文字のNO_PROXYは効きませんでした。
この辺はツールによっていろいろなので、両方指定しておけばいいのかも。

$ export http_proxy=proxy.example.com:9999
$ export HTTP_PROXY=$http_proxy
$ export no_proxy=xxx.xxx.xxx.xxx
$ export NO_PROXY=no_proxy

今の所、失敗せずに一発で認証が通るようになってます!

MacでGoのクロスコンパイルをする

Mac OSはMojaveでGoは1.13.4です。

昔、

gozuk16.hatenablog.com

というのを書いたのですが、いまはbrew--cross-compile-common--with-cc-common も使えないようです。

github.com

これに書いてなければだめなんですよね?

どうやら

GOOS=linux GOARCH=amd64 go build ./hogehoge.go

ってやるだけでできるっぽい。素晴らしい! このままだと区別つかないのでディレクトリごとに出すように。

GOOS=linux GOARCH=amd64 go build -o linux-amd64/hogehoge ./hogehoge.go

あとでmakefileでも書きますか。。。

追記(2019/12/24)
makefile 書きました。

linux:
  GOOS=linux GOARCH=amd64 go build -o linux-amd64/hogehoge ./hogehoge.go
win:
  GOOS=windows GOARCH=amd64 go build -o windows-amd64/hogehoge.exe ./hogehoge.go

ついでにWindowsも入れときました。

更にcgo使ってるときに

# runtime/cgo
gcc_libinit_windows.c:7:10: fatal error: 'windows.h' file not found

というエラーが出たので以下のようにビルドしました。

$ brew install mingw-w64
$ CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -o hogehoge.exe