2021年11月16日火曜日

Windows10 で caps を ctrl に変更する方法 (ctrl2cap)

Windows10 で caps を ctrl に変更する方法 (ctrl2cap)

概要

ctrl2cap を使います

環境

  • Windows10

インストール方法

ここから zip ファイルをダウンロードし解凍します

コマンドプロンプトを管理者権限で開いて解凍したディレクトリに移動します

あとは以下のコマンドでインストールできます

  • ctrl2cap /install

アンインストール方法

  • ctrl2cap /uninstall

最後に

他のキーバインドも変えたい場合は別のアプリをインストールするのをオススメします

とりあえず caps だけ ctrl にしたい場合は簡単なのでオススメです

参考サイト

2021年11月15日月曜日

Alertmanager のサイレンス API を curl でコールするサンプル

Alertmanager のサイレンス API を curl でコールするサンプル

概要

過去に少し紹介しました
今回は一通りコールしてみたのでサンプルリクエストを紹介します

なお今回使用する API のバージョンは v2 になります

環境

  • Alertmanager 0.23.0

サイレンスとの登録

サンプルリクエスト

curl http://localhost:9093/api/v2/silences \
-H "content-type: application/json" \
-d @- << EOF
{
  "matchers": [
    {
      "name": "severity",
      "value": "critical",
      "isRegex": false
    }
  ],
  "startsAt": "`date -u +%Y-%m-%dT%H:%M:%S`",
  "endsAt": "`date -u -d '2 hours' +%Y-%m-%dT%H:%M:%S`",
  "createdBy": "api",
  "comment": "test silence"
}
EOF

サンプルレスポンス

{"silenceID":"274f9549-967a-4df6-8342-e82d57513237"}

date コマンドを使うことで実行した時間から 2 時間分のサイレンスを登録しています

2hours を 2days などにするとサイレンスの時間を延長することができます

サイレンス情報の取得

サンプルリクエスト

curl http://localhost:9093/api/v2/silence/274f9549-967a-4df6-8342-e82d57513237

サンプルレスポンス

{
  "id": "274f9549-967a-4df6-8342-e82d57513237",
  "status": {
    "state": "active"
  },
  "updatedAt": "2021-11-12T01:16:43.965Z",
  "comment": "test silence",
  "createdBy": "api",
  "endsAt": "2021-11-12T03:16:43.000Z",
  "matchers": [
    {
      "isEqual": true,
      "isRegex": false,
      "name": "severity",
      "value": "critical"
    }
  ],
  "startsAt": "2021-11-12T01:16:43.965Z"
}

単独のサイレンスを取得する場合は /silence/id を使います
すべてのサイレンス情報を取得したい場合は /silences を使います

curl http://localhost:9093/api/v2/silences

expire にする

サンプルリクエスト

curl -XDELETE http://localhost:9093/api/v2/silence/274f9549-967a-4df6-8342-e82d57513237

レスポンスボディはありません

最後に

ドキュメントが少ないので Github にある openapi のリファレンスを見るしかなさそうです

参考サイト

2021年11月12日金曜日

celery の s() と si() の使い分け

celery の s() と si() の使い分け

概要

s() は前のタスクの結果を受け取ります
si() は前のタスクの結果を受け取りません

環境

  • macOS 11.6.1
  • Python 3.8.12
    • celery 5.1.2

タスクの定義

  • vim sub_tasks.py
from celery import Celery

app = Celery('sub_tasks', backend='redis://localhost', broker='redis://localhost')

@app.task
def add(x, y):
    return x + y

@app.task
def multi(x, y):
    return x * y

s() を使う場合

まずは s() を使います
前のタスクの結果は次のタスクの第一引数に渡されます

from celery import chain
from sub_tasks import add, multi

tasks = chain(
    add.s(1, 2),
    multi.s(10)).apply_async()

print(tasks.get())

結果は 1+2=3 -> 3 x 10 = 30 になります

以下のような使い方はエラーになります

from celery import chain
from sub_tasks import add, multi

tasks = chain(
    add.s(1, 2),
    multi.s(10, 10)).apply_async()

print(tasks.get())

TypeError: multi() takes 2 positional arguments but 3 were given 前のタスクの結果と合わせて引数が足りないと言われてエラーになります

si() を使う場合

si() を使うことで前のタスクの結果を使わないようにできます

from celery import chain
from sub_tasks import add, multi

tasks = chain(
    add.s(1, 2),
    multi.si(10, 10)).apply_async()

print(tasks.get())

結果は 10 x 10 = 100 になります
1+2=3 の結果は使っていないことがわかります

以下の使い方はエラーになります

from celery import chain
from sub_tasks import add, multi

tasks = chain(
    add.s(1, 2),
    multi.si(10)).apply_async()

print(tasks.get())

TypeError: multi() missing 1 required positional argument: 'y'

前のタスクが None を返す場合は

None でも関係なく s() を使った場合は次のタスクの第一引数に入るので注意しましょう

どちらを使うのがいいのか

個人的には以下のようなルールで使うのがいいと思っています

  • 定義したタスクは必ず単独で使う -> si() を使う
  • 定義したタスクは前の結果を使う可能性がある -> s() を使う

前者の場合タスクを定義する際の引数に前のタスクの結果を受け取るための引数がなくなるので必ず si() を使い続ける必要があります

後者は前のタスクの結果を受け取るための引数がありながらもケースによっては引数を使わないこともできます
ただ使わない引数を定義することになるので少しコードが紛らわしくなる可能性があります

タスクとして柔軟なのは間違いなく後者です
例えば将来的に定義したタスクの前にタスクが来てその結果を使う場合には後者で実装しなければなりません
前にタスクが来てもタスクの結果を使うことがなければ si() でも OK です

最後に

si() = s() + immutable=True なので素直に s() を使うのがいいのかもしれません

タスクを定義する場合も必ず前のタスクを受け取るようにするのがいいのかもしれません

参考サイト

2021年11月11日木曜日

macOS で pdf ファイルを結合する方法

macOS で pdf ファイルを結合する方法

概要

poppler (pdfunite) を使います

環境

  • macOS
  • Ruby 3.0.2p107
    • pdfunite 0.5.0
    • poppler 21.11.0

poppler のインストール

  • brew install poppler

この段階で pdfunite コマンドは使えるようになっています

pdfunite のインストール

  • gem install pdfunite

サンプルコード

require 'pdfunite'

files = 200.times.map { |i| "/path/to/pdf/name_#{i}.pdf" }
pdf_data = Pdfunite.join(files)
File.open('./joined.pdf', 'wb') { |f| f << pdf_data }

注意

xpdf がすでにインストールされている場合はコマンドがコンフリクトし poppler がインストールできないので先に brew unlink xpdf しておきましょう

最後に

今回は Ruby から操作しましたが普通に pdfunite コマンドを使っても OK です

ファイルが多い場合は Ruby 経由のほうが簡単そうです

2021年11月10日水曜日

emacs で実行したコマンドの結果をカレントバッファに表示する方法

emacs で実行したコマンドの結果をカレントバッファに表示する方法

概要

shell-command を使えばミニバッファでコマンドを実行できますが結果もそのままミニバッファに表示されてしまいます

結果はカレントバッファに表示したい場合には別の方法でコマンドを実行します

環境

  • macOS 11.6
  • emacs 27.2

やり方

たとえば date コマンドの結果をカレントバッファに表示したい場合は以下のようにします

  • C-u M-! date RET

最後に

あとは date の部分を ls や pwd など好きなコマンドにすれば OK です

2021年11月9日火曜日

flymake の警告やエラーをバッファに表示する方法

flymake の警告やエラーをバッファに表示する方法

概要

いつも忘れるのでメモ

環境

  • macOS 11.6
  • emacs 27.2

方法

  • M-x flymake-show-diagnostics-buffer

最後に

popup とかと組み合わせるといちいちバッファを開かなくてもいいので便利かも

あとはショートカットキーに登録するもありかも

2021年11月8日月曜日

docker secret を使ってみる

docker secret を使ってみる

概要

docker を使ってパスワードなどの秘匿情報を使う場合に docker secret が使えます

ただ残念なことに Swarm 上でしか使えません

環境

  • Ubuntu18.04
  • docker 20.10.8

シークレットの作成

docker secret create コマンドを Swram のマネージャノードに対して実行します

  • printf "This is a secret" | docker -H swarm01:2376 secret create my_secret_data -
  • docker -H swarm01:2376 secret ls
ID                          NAME                DRIVER              CREATED              UPDATED
j7uusrvn44cczetr9qc3k5so7   my_secret_data                          About a minute ago   About a minute ago

シークレットを使ったサービスの作成

service create 時に --secret オプションを付与します
これもマネージャノードに対して実行します

  • docker -H swarm01:2376 service create --name redis --secret my_secret_data redis:alpine
  • docker -H swarm01:2376 service ps redis
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
hjfhde044own        redis.1             redis:alpine        swarm03      Running             Running 45 seconds ago

動作確認

docker exec を実行するのでコンテナが動作しているノードに直接実行しましょう
secret はファイルとしてマウントされているのでファイルの内容を確認しましょう

  • docker -H swarm03:2376 container exec $(docker -H swarm03:2376 ps --filter name=redis -q) cat /run/secrets/my_secret_data

This is a secret

マウントを解除する

service update で --secret-rm オプションを付与すると次に作成されるコンテナではシークレットをマウントしなくなります

  • docker -H swarm01:2376 service update --secret-rm my_secret_data redis
  • docker -H swarm03:2376 container exec $(docker -H swarm03:2376 ps --filter name=redis -q) cat /run/secrets/my_secret_data
cat: can't open '/run/secrets/my_secret_data': No such file or directory

シークレットを削除する

シークレットを使っているサービスがある場合はシークレットを削除できないので先にサービスを削除しましょう

  • docker -H swarm01:2376 service rm redis
  • docker -H swarm01:2376 secret rm my_secret_data

最後に

テキストファイルとしてマウントされるのでアプリ側でそれを展開する処理などが必要になるのが少し面倒な気はします

コンテナ作成時に環境変数などに展開してあげればアプリ内でも簡単に使えるかなと思います

次回は docker-compose で使う方法を紹介します

参考サイト