kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

高機能な Feature Flag サービス「Unleash」のデモを試した

コードを書き換えず,フラグを使って機能を有効化するプラクティスを「Feature Flag(もしくは Feature Toggle)」と言う.Feature Flag を実現するサービスとして「Unleash」があり,単純に機能を有効化するだけではなく,有効化する条件を設定したり,カナリアリリースもできる.多くの機能が揃っていて,管理画面もある.今まで使ったことがなく「Unleash」を試していく!数記事に分割する予定!

www.getunleash.io

Unleash Demo

まずは「Unleash」の挙動を確認するため,公開されているデモ「Interactive demo」を試す.「Unleash」を導入したフロントエンドアプリケーション(React で実装された SPA)と管理画面を操作できる.管理画面にログインするためにメールアドレスを入力必要があるけど,特に認証は求められず,また管理画面の操作ログにも表示されるため,ダミーアドレスにしておくと良さそう.

f:id:kakku22:20220112131522p:plain

Step 1: Enable/disable feature toggle

Step 1 では,フラグを使って機能を有効化する.管理画面でフラグ demoApp.step1 を開いて enabled in default に変更をすると,フロントエンドアプリケーション上に画像が表示された.コードを書き換えずに機能を有効化できている.

f:id:kakku22:20220112132036p:plain

f:id:kakku22:20220112132048p:plain

Step 2: Enable for a specific user

Step 2 では,特定のユーザーに限定して機能を有効化する.管理画面でフラグ demoApp.step2 を開いて「Strategies(戦略)」に「UserIDs」を設定すると,フロントエンドアプリケーション上に画像が表示された.

f:id:kakku22:20220112132344p:plain

f:id:kakku22:20220112132353p:plain

Step 3: Gradual rollout

Step 3 では,割合を指定して一部のユーザーに限定して機能を有効化する.管理画面でフラグ demoApp.step3 を開いて「Strategies(戦略)」に「Rollout 25%」を設定すると,フロントエンドアプリケーション上に画像が表示された.

f:id:kakku22:20220112132703p:plain

f:id:kakku22:20220112132710p:plain

Step 4: Variants

Step 4 では,全ユーザーに機能を有効化しつつ「Variants(バリアント)」を使って挙動を変更する.「Variants(バリアント)」は機能の中に複数の実験項目を含めることができる仕組みで,A/B テストとしても使える.

docs.getunleash.io

管理画面でフラグ demoApp.step4 を開いて「Variants」に「BlueButton 50%」と「GreenButton 50%」を設定すると,フロントエンドアプリケーション上に異なるボタンが表示された(右画面は Chrome のシークレットウィンドウを使っている).ユーザーによって異なる挙動を有効化できている.

f:id:kakku22:20220112132718p:plain

f:id:kakku22:20220112132726p:plain

まとめ

今回は Feature Flag を実現するサービス「Unleash」を試した.まずは挙動を確認するため,デモを使って「計4種類」の仕組みを試すことができた.次回は実際に Unleash SDKs を使ってコードを書いていく!続く〜

2021年のプルリクエストを振り返る

2016年から毎年 OSS に送ったプルリクエストを振り返る記事を書いている.2021年は「計4件」だった.コードを書く機会がとにかく減っていることに関係するけど,2020年と同じ件数だった.プライベートリポジトリには毎週のようにコミットをしているため,GitHub は使っているけど OSS への貢献が減っている状態と言える.過去の振り返りは以下にある.

プルリクエストを振り返るための検索

プルリクエストを振り返るために GitHub の検索条件を使う.今回は「2021年」に限定するため created:2021 とする.

is:pr is:public author:kakakakakku -user:kakakakakku created:2021

2021/02

dgkanatsios/CKAD-exercises

2021年2月に CKAD (Certified Kubernetes Application Developer) を取得した.対策をするときに活用した dgkanatsios/CKAD-exercises の問題で気付いた誤りを修正した.大きな貢献をしたとは言えないけど,リポジトリの Contributors を見たら「6番目」に入っていた!

github.com

github.com

github.com

2021/03

walidshaari/Kubernetes-Certified-Administrator

2021年3月に CKA (Certified Kubernetes Administrator) を取得した.対策をするときに活用した walidshaari/Kubernetes-Certified-Administrator に載っているオンラインコースを最新情報に修正した.

github.com

まとめ

2021年は「計4件」のプルリクエストを送った.2022年も件数目標は立てず,機会があれば積極的にプルリクエストを送っていくぞ!

textlint で句読点をチェックする

ブログ記事も含めて文章を書くときに使う句読点は , と . に統一している.2006年頃から使っているからもう15年以上になる.macOS や Windows をセットアップするときに最初にデフォルト設定を変更するのも「句読点」だったりする.しかし,フォーマットが決められたビジネス文書など,句読点として 、 と 。 を使わなければいけない場面もあるため,文章を書き終えてからエディタで一括置換をするという作業をよくやっている.今回は textlint で句読点をチェックして誤用を検出できるようにする.

例文

今回は以下の例文 hello.txt を使う.特に意味はなくブログ記事用に作る.

こんにちは!
僕は @kakakakakku です.
1年は,12ヶ月です.
hello, world.

案1. textlint-rule-preset-JTF-style

まず,案1として textlint-rule-preset-JTF-style を試す.README.md に書いてある通り,JTF(日本翻訳連盟)の基準として多くのルールが実装されている.この中に 1.2.1.句点(。)と読点(、) や 1.2.2.ピリオド(.)とカンマ(,) など,句読点に関係するルールがある.

github.com

以下の .textlintrc を作って textlint-rule-preset-JTF-style を有効化する.

{
  "rules": {
    "preset-jtf-style": true
  }
}

さっそく実行をすると 全角のピリオドとカンマは使用しません。 として検出できる.しかし,以下のエラーを見るとわかる通り 原則として、全角文字と半角文字の間にスペースを入れません。 や 12ヶ月 => 12か月 など,他のエラーも検出されてしまう.技術文書を書く場合など,適用しにくいこともある.

$ npx textlint ./hello.txt

/Users/kakakakakku/xxx/hello.txt
  2:16  ✓ error  原則として、全角文字と半角文字の間にスペースを入れません。  jtf-style/3.1.1.全角文字と半角文字の間
  2:19  ✓ error  全角のピリオドとカンマは使用しません。                      jtf-style/1.2.2.ピリオド(.)とカンマ(,)
  3:4   ✓ error  12ヶ月 => 12か月                                            jtf-style/2.2.3.一部の助数詞の表記
  3:10  ✓ error  全角のピリオドとカンマは使用しません。                      jtf-style/1.2.2.ピリオド(.)とカンマ(,)

✖ 4 problems (4 errors, 0 warnings)

そこで .textlintrc を以下のように更新して,不要なルールを明示的に無効化する.

{
  "rules": {
    "preset-jtf-style": {
      "1.2.1.句点(。)と読点(、)": true,
      "1.2.2.ピリオド(.)とカンマ(,)": true,
      "2.2.3.一部の助数詞の表記": false,
      "3.1.1.全角文字と半角文字の間": false
    }
  }
}

もう1度実行をすると 全角のピリオドとカンマは使用しません。 以外は検出されなくなった💡期待した挙動と言える👍

$ npx textlint ./hello.txt

/Users/kakakakakku/xxx/hello.txt
  2:19  ✓ error  全角のピリオドとカンマは使用しません。  jtf-style/1.2.2.ピリオド(.)とカンマ(,)
  3:10  ✓ error  全角のピリオドとカンマは使用しません。  jtf-style/1.2.2.ピリオド(.)とカンマ(,)

✖ 2 problems (2 errors, 0 warnings)

しかし textlint-rule-preset-JTF-style には他にも多くのルールがあり,全てを .textlintrc で明示的に無効化するのも正直面倒に感じる.悩ましいところ🤔

案2. textlint-rule-prh

そこで,今度は textlint-rule-prh を試す.

github.com

textlint-rule-prh は表記揺れを検出するために普段からよく使っていて,以下の記事も書いたことがある.

kakakakakku.hatenablog.com

文章を書くときに句読点以外で , と . を使う機会はほとんどなさそうという前提で,textlint-rule-prh を使って , と . を検出することにした.以下のように .textlintrc を作る.

{
  "rules": {
    "prh": {
      "rulePaths": [ "prh-rules/rule.yml" ]
    }
  }
}

特に正規表現などは使わず,シンプルに , と . を検出するように prh-rules/rule.yml を作る.

version: 1

rules:
  - expected: 、
    pattern:
      - ,
  - expected: 。
    pattern:
      - .

さっそく実行をすると,期待した通りに検出することができた👍

$ npx textlint ./hello.txt

/Users/kakakakakku/xxx/hello.txt
  2:19  ✓ error  . => 。  prh
  3:4   ✓ error  , => 、  prh
  3:11  ✓ error  . => 。  prh

✖ 3 problems (3 errors, 0 warnings)

結果的に textlint-rule-prh を使うのが個人的には1番シンプルに感じたため,最近はずっと使っていて,問題なく使えている.なお,textlint-rule-prh を使うアイデアは id:konifar に教えてもらった!ありがとうございました👏

まとめ

今回は textlint を使って句読点をチェックして誤用を検出できるようにする方法をまとめた.textlint-rule-preset-JTF-style と textlint-rule-prh を試したけど,結果的には textlint-rule-prh を使うのが個人的には1番シンプルに感じていて,最近使っている.

そもそも最初は「句読点をチェックするルール」を探したけど,見つからなかった.

もし他により良い方法があったら教えてください💡

nbdime : 簡単に Jupyter Notebook の diff を取る

Jupyter Notebook を使っていると「バージョン管理がしにくい」と感じることがある.当然ながら Jupyter Notebook (.ipynb) は JSON なので diff を取ることはできるけど,Notebook 自体のメタデータも含まれてしまって見にくすぎる.今回はそんな課題を解消できる nbdime (Jupyter Notebook Diff and Merge tools) を紹介する.

github.com

導入する

詳細な手順はドキュメントに載っている.今回は以下のコマンドを使った.環境によっては依存する JupyterLab も必要になるかも.

$ pip install nbdime
$ pip install jupyterlab
$ nbdime extensions --enable

nbdime.readthedocs.io

導入後に Jupyter Notebook にアクセスすると,以下のように nbdiff ボタンが表示される.

f:id:kakku22:20211229121736p:plain

nbdime「GUI」を試す

nbdime は「GUI」と「コマンド」で使うことができる.まずは「GUI」を試す.

適当に「scikit-learn の load_iris() でデータセットを取得して train_test_split() で分割するコード」を書いて GitHub(リモート側)に push しておく.次にコードを書き換えてから nbdiff ボタンを押すと,以下のように表示される.コード/表示結果/セルなど,コードに関係する部分に限定して diff を取ることができる.便利〜👏

f:id:kakku22:20211229121801p:plain

nbdime「コマンド」を試す

次に「コマンド」を試す.nbdime を導入すると nbdiff コマンドが使えるため,実行すると以下のようにシンプルに diff を取ることができる.追加したセルは YAML フォーマットっぽく表示されていて少し見にくいかも?それでも便利〜👏

$ nbdiff sandbox-nbdime.ipynb

(中略)

## modified /cells/2/outputs/0/data/text/plain:
-  120
+  105

## modified /cells/2/source:
@@ -1,2 +1,2 @@
-X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
 len(X_train)


## inserted before /cells/3:
+  code cell:
+    execution_count: 4
+    source:
+      len(X_test)
+    outputs:
+      output 0:
+        output_type: execute_result
+        execution_count: 4
+        data:
+          text/plain: 45

nbdime「コマンド」は他にもある

個人的に使う機会は多くなさそうだけど,nbdime には nbdiff コマンド以外も使える.Notebook をうまく merge できるのは便利そう!

  • nbmerge : Notebook を merge する(3-way-merge)
  • nbdiff-web Notebook の差分を GUI で表示する(Notebook で nbdiff ボタンを押すのと同じ)
  • nbmerge-web : Notebook を GUI で merge する(3-way-merge)
  • nbshow : Notebook をターミナル用に表示する(YAML フォーマットに近かった)

まとめ

Jupyter Notebook でコードに関係する部分に限定して diff を取ることができる nbdime を試した.「GUI」で diff を確認できるのは頻繁に使うことになりそう!

github.com

おすすめ!シンプルに使えるポモドーロタイマー「Tomato 2」

仕事や個人作業を進めるときに「ポモドーロ」を実践している.試行錯誤をしながら,もう7,8年は続けていると思う.2016年に紹介記事を書いていて,今も運用は大きく変わらないけど,タイマーアプリは「Tomato One」から「Tomato 2」に乗り換えている.今回は「Tomato 2」を紹介したいと思う!

kakakakakku.hatenablog.com

Tomato 2

「Tomato 2」は「Tomato One」の後継となる.無料で十分に使える.なお「610円」をアプリ内課金すると,有料機能も使えるようになる.僕自身は課金しているけど,有料機能のためというよりは作者に感謝の気持ちを伝えるためかなぁー💰

Tomato 2: Pomodoro Timer

Tomato 2: Pomodoro Timer

  • Median Tech, s.r.o.
  • Productivity
  • Free
apps.apple.com

時間延長

「Tomato 2」で1番便利な機能は「時間延長」で,ポモドーロ終了時に必要なら +5 minutes で延長できる(なお,ボタンを押さなくても自動的に延長される).基本的には 25 min をセッション時間にしつつ,とは言え「キリが悪い」こともあったり「完全にゾーンに入ってるから継続したい」という場面もある.本当によくある!今までの「Tomato One」だと強制的に休憩に入ってしまっていて微妙だったので「Tomato 2」はとても便利に使えている.

f:id:kakku22:20211229154557p:plain

セッション名

ポモドーロセッションを開始する前に「セッション名」を設定できる.以下の例では blog-tomato2 と設定してある.設定しなくても良いんだけど「なーんとなく気合が入る」気がする🔥セッション名は基本的に Trello タスクと「1 : n」という関係で紐付くように工夫している.本来であれば blog-tomato2 ではなく ●●を終わらせる のように達成することを明確に書くと効果的だと思う.

f:id:kakku22:20211229153619p:plain

Stats

有料機能として「Stats(セッション記録)」が使える.個人的にポモドーロ計測はしていないため,重要な機能ではないけど,1週間単位に「集中できていた時間帯」をザーッと俯瞰できるのは便利だと思う.以下のサンプルは年末(12/27 ~ 12/29)の3日間で,ミーティング以外はそこそこ集中できているけど,通常は半分以下になったりする日もある😇なお,黒塗りをしている箇所は「セッション名」が表示されている.

f:id:kakku22:20211229203954p:plain

Blocking

同じく有料機能として「Blocking(ブロック)」も使える.ポモドーロセッション中にアクセス制限をするウェブサイトとアプリを登録できる.制限をすればするほど例外時に面倒なのであまり使わないようにしている.また以下はサンプルで YouTube と Twitter を登録しているけど,制限される場合とされない場合があり,挙動が不安定に感じる.少なくとも MacBook Pro 2台で試して,どちらも挙動は不安定だった.

f:id:kakku22:20211229204258p:plain

反映が遅れる可能性がある旨はドキュメントに書いてあるけど,登録していないウェブサイトが制限されることもある.日常的に使うには不安定なので,基本的には Blocking は無効にしている.

www.notion.so

まとめ

「ポモドーロ」は今も引き続き実践しているけど,タイマーアプリは「Tomato 2」を使っている.機能はシンプルだし,特に「時間延長」の機能はとても使いやすく,この機能だけでも十分に満足できる!おすすめ!これからも「ゾーンに入るための条件反射」としてポモドーロを実践していくぞ!

Tomato 2: Pomodoro Timer

Tomato 2: Pomodoro Timer

  • Median Tech, s.r.o.
  • Productivity
  • Free
apps.apple.com