2021年9月2日木曜日

eglot 起動時に flymake-mode を自動起動させない方法

eglot 起動時に flymake-mode を自動起動させない方法

概要

flymake を使って構文チェックしたくない場合には eglot 起動時に flymake を自動起動しないようにしましょう

環境

  • macOS 11.5.2
  • emacs 27.1
  • eglot 20210817.912

やり方

.emacs に以下を追記します
eglot--managed-mode-hook で eglot 起動時に flymake-mode に -1 を設定することで自動起動を防ぐことができます

(require 'eglot)
(add-hook 'eglot--managed-mode-hook (lambda () (flymake-mode -1)))

2021年9月1日水曜日

M-x eglot で起動時のデフォルトコマンドを変更する方法

M-x eglot で起動時のデフォルトコマンドを変更する方法

概要

デフォルトだとグローバルにインストールしたコマンドを使うようになっています
プロジェクト固有のコマンドを使いたい場合などはデフォルトのコマンドを変更することができます

環境

  • macOS 11.5.2
  • emacs 27.1
  • eglot 20210817.912

やり方

以下を .emacs に追記します
eglot-server-programs という変数の値を変更すれば OK です

(add-to-list 'eglot-server-programs '(ruby-mode . ("bundle" "exec" "solargraph" "socket" "--port" :autoport)))

2021年8月31日火曜日

LSP solargraph で rubygems にある gem のコード補完を行う方法

LSP solargraph で rubygems にある gem のコード補完を行う方法

概要

デフォルトでは Rubygems からインストールしたライブラリなどは補完の対象になっていません
今回は Gemfile などを使ってインストールしたライブラリの補完を solargraph を使って行う方法を紹介します

環境

  • macOS 11.5.2
  • emacs 27.1
  • solargraph 0.43.0
  • Ruby 3.0.1p64

bundler 配下で solargraph を管理する

前回はグローバルに solargraph をインストールしました
すでにプロジェクトがありそれが bundler で閉じている場合、グローバルの solargraph ではなく bundler 配下の solargraph を使います

  • cd /path/to/workspace
  • vim Gemfile
gem "solargraph"
gem "yard"
  • bundle install

yard ドキュメントの生成

ポイントは yard ドキュメントを生成する必要がある点です
solargraph をインストールすると yard の gem も同時にインストールされておりこれを使って yard ドキュメントを生成しましょう

初回生成時は時間のかかる場合があります

  • cd /path/to/workspace
  • bundle exec yard gems

vendor 配下の各 gem に .yardoc ファイルが生成されていれば OK です

生成されたパスを調べたい場合は --debug オプションを使います

  • bundle exec yard gems --debug

グローバルな solargraph の停止

もしすでにグローバルにインストールした solargraph が起動している場合は停止しましょう

emacs から自動起動する設定が記載されている場合は一旦その行をコメントして emacs を再起動しましょう

eglot の起動

emacs 側から接続しにいきます
ここでもポイントがあり eglot から solargraph を起動する場合に bundler 配下の solargraph を起動するようにします

なのでまず emacs のバッファのワークディレクトリを変更します

  • M-x cd
    • /path/to/workspace に移動する

そして bundle exec 経由で solargraph を起動すれば OK です

  • C-u M-x eglot
    • bundle exec solargraph socket --port :autoport:

これで「[eglot] Connected! Server EGLOT (pjct-name/ruby-mode) now managing ‘ruby-mode’ buffers in project ‘pjct-name’.」となれば接続完了です

動作確認

サードパーティの gem にカーソルを合わせるとちゃんと補完が表示されます

最後に

ポイントは以下の2点です

  • bundle exec yard gems で bundler 配下にインストールした gem のドキュメントを生成する
  • グローバルの solargraph ではなく bundler 配下にインストールした solargraph を eglot から起動する

のがポイントです

おまけ: 対象クラスのスキャン

  • cd /path/to/workspace
  • solargraph scan -v

おまけ: 設定ファイルの作成

  • cd /path/to/workspace
  • solargraph config

参考サイト

2021年8月30日月曜日

Emacs で Ruby の LSP をインストールする方法

Emacs で Ruby の LSP をインストールする方法

概要

Ruby で LSP に入門してみました
今回はサーバ側は solargraph という LSP 実装を使いクライアント側は eglot というツールを使います

環境

  • macOS 11.5.2
  • emacs 27.1
  • solargraph 0.43.0
  • Ruby 3.0.1p64

solargraph のインストール

まずはサーバ側のインストールを行います
Ruby を実装されているので gem を使うと簡単です

  • gem install solargraph

eglot のインストール

次にクライアント側 (emacs) の設定になります
package-list-packages から eglot を選択してインストールします

.emacs の設定

ruby-mode にフックするのが一番簡単です

(require 'eglot)
(add-hook 'ruby-mode-hook 'eglot-ensure)

動作確認

emacs を起動して ruby のファイルを開きましょう
eglot が自動的に起動して接続できれば OK です

補完を使うには Ctrl + Alt + i を押せば現在のカーソル上で補完可能な候補を表示してくれます
もし helm などを使っている場合は helm 上で候補を絞ることができます

最後に

引数などのオブジェクトの補完はデフォルトだとやってくれませんでした

また flymake を使って構文チェックを行ってくれるのですが自分の設定が悪いのか Wait という状態になり動作しませんでした
すべてにいろいろと設定済みの emacs 上だとそれらと競合してうまく動かない部分が出てくるのかもしれません

トラブルシューティング

eglot 起動時に Could not start and connect to server が発生する場合は emacs から solargraph の起動がうまくいっていません

emacs を開いているバッファ上で solargraph コマンドが実行できるか確認しましょう PATH など変更している場合は一度 emacs とターミナルを閉じて再度 PATH を読み込ませるとうまく起動できます

参考サイト

2021年8月27日金曜日

EC2 の t2.micro を立てる

EC2 の t2.micro を立てる

概要

AWS の EC2 で t2.micro を構築する方法を紹介します

環境

  • macOS 11.5.2
  • AmazonLinux2

事前作業

事前に以下のリソースを作成しておきましょう

  • キーペアの作成とダウンロード
  • セキュリテイグループの作成
  • VPC の作成

インスタンス作成

今回はウィザードを使ってインスタンスを作成します
右上の「インスタンスを起動」をクリックします

イメージ選択

まずはイメージを選択します
今回は AMI を選択しました

インスタンスタイプの選択

次にインスタンスタイプの選択をします
丁寧に無料枠とわかるようになっているので t2.micro を選択します

ストレージ選択

30GB まで無料で使うことができます
インスタンスを1台しか構築しないのであれば30GB使うように変更しましょう

セキュリティグループ選択

デフォルトのセキュリティグループは事前に作成したセキュリティグループになっていないので変更します

キーペアの設定

キーペアは右下の「起動」ボタンを押したあとに設定します
事前に作成しておいたキーペアを設定しましょう

動作確認

あとは作成できるまで待ちます そして ssh できるか確認してみましょう

  • ssh -i ssh -i /path/to/key/ec2.pem ec2-user@xxx.xxx.xxx.xxx

IP の部分は EC2 の一覧で確認することができる「パブリック IPv4 アドレス」or「パブリック IPv4 DNS」を指定しましょう
再起動すると IP が変わることを考えると DNS を指定するほうが無難です

任意: ElasticIP の設定

もしサーバとして公開するのであれば ElasticIP を設定しましょう
設定しないと起動するたびに IP アドレスが変わってしまうので DNS との紐付けができません

任意: 請求アラートの設定

無料枠を超えた場合や指定の金額を超えた場合にメールで通知してくれます
可能であれば設定しておきましょう

最後に

無料枠なので起動しっぱなしでも料金は取られません
がネットワーク料金は発生する可能性があるのでセキュリティグループでしっかりとアクセスを絞るようにしましょう
また apt install や docker pull/push などを実行してもネットワーク料金が発生する可能性があるので使いすぎには注意しましょう

参考サイト

2021年8月26日木曜日

Airflow 超入門

Airflow 超入門

概要

Apache Airflow は Python 製のジョブスケジューラです
今回はインストール方法と簡単な使い方を紹介します

環境

  • macOS 11.5
  • docker 20.10.7
  • Airflow 2.1.2

docker-compose ファイルのダウンロード

  • curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.1.2/docker-compose.yaml'

データ保存用のディレクトリ作成

  • mkdir ./dags ./logs ./plugins

env ファイルの作成

  • echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env

初期化

  • docker-compose up airflow-init

これで Postgres と redis が起動します

起動

  • docker-compose up -d

これで Airflow が起動します

  • docker-compose ps
           Name                          Command                   State                     Ports
----------------------------------------------------------------------------------------------------------------
airflow_airflow-init_1        /usr/bin/dumb-init -- /ent ...   Exit 0
airflow_airflow-scheduler_1   /usr/bin/dumb-init -- /ent ...   Up (unhealthy)   8080/tcp
airflow_airflow-webserver_1   /usr/bin/dumb-init -- /ent ...   Up (healthy)     0.0.0.0:8080->8080/tcp
airflow_airflow-worker_1      /usr/bin/dumb-init -- /ent ...   Up (unhealthy)   8080/tcp
airflow_flower_1              /usr/bin/dumb-init -- /ent ...   Up (healthy)     0.0.0.0:5555->5555/tcp, 8080/tcp
airflow_postgres_1            docker-entrypoint.sh postgres    Up (healthy)     5432/tcp
airflow_redis_1               docker-entrypoint.sh redis ...   Up (healthy)     0.0.0.0:6379->6379/tcp

動作確認

主に 3 パターンあるのでそれぞれ紹介します

GUI

localhost:8080 にアクセスすると確認できます
初期ID/パスワードは airflow/airflow でログインできます

サンプルのジョブがいくつか登録されているのが確認できると思います

<

CLI

airflow.sh というシェルスクリプトを使ってアクセスできます

  • curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.1.2/airflow.sh'
  • chmod +x airflow.sh
  • ./airflow.sh info

これで Airflow の情報が表示されるのが確認できると思います

curl

RESTAPI があるので curl を使ってコールしてみます
単純な Basic 認証でアクセスできます

  • ENDPOINT_URL="http://localhost:8080/" curl -X GET --user "airflow:airflow" "${ENDPOINT_URL}/api/v1/pools"

リファレンスはこちらにあります

最後に

とりあえずインストールと簡単な使い方だけ紹介しました
実際はジョブの登録やスケジューリングの登録を行う必要があります

チュートリアルがあるのでそれをやると大まかな使い方は理解できると思います

参考サイト

2021年8月25日水曜日

celery の Periodic Tasks で cron 的なタスクを作成する

celery の Periodic Tasks で cron 的なタスクを作成する

概要

celery に定期実行するためのタスクがあるので試してみました
時間は cron フォーマットで登録できるようです

環境

  • macOS 11.5
  • Python 3.8.3
  • celery 5.1.2

cron タスク

タスクを定義し setup_periodic_tasks で add_periodic_task を使って登録できます

「実行する時刻」と「実行するタスク」を指定します オプションで name や expires が指定できます
これは apply_async で使えるオプションと同じものが指定できます

  • vim sub_tasks.py
from celery import Celery
from celery.schedules import crontab

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

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)

動作確認

起動するコマンドが worker -> beat になるので注意しましょう

  • pipenv run celery -A cron_tasks beat --loglevel=info

これでログを見るとちゃんとタスクが実行されているのが確認できると思います

[2021-08-12 15:39:46,142: INFO/MainProcess] Scheduler: Sending due task add every 10 (cron_tasks.test)
[2021-08-12 15:39:56,142: INFO/MainProcess] Scheduler: Sending due task add every 10 (cron_tasks.test)
[2021-08-12 15:40:06,143: INFO/MainProcess] Scheduler: Sending due task add every 10 (cron_tasks.test)
[2021-08-12 15:40:16,138: INFO/MainProcess] Scheduler: Sending due task cron_tasks.test('world') (cron_tasks.test)

最後に

cron だけでなく solar という形式でもスケジューリングできます

ワーカーが動作している状態で動的に cron タスクを追加する方法があるのか気になりました

参考サイト