2022年12月6日火曜日

emacs robe 使い方 Tips

emacs robe 使い方 Tips

概要

基本的な設定や使い方はこちらを御覧ください
本記事ではトラブルシューティングや Tips を紹介します

環境

  • macOS 11.7
  • emacs 28.1

Can’t find the location と Method not found 対策

インストールした gem にしろ自分で作成した Ruby ファイルにしろ ruby-load-file で emacs に認識させないと上記のエラーになります

認識させたいファイルを開いて C-c C-l でロードできます

pry バッファで全部ロードする

robe-start すると pry が実行できるインタラクティブバッファが作成されるのでそこで自作の rb ファイル require するのはありです

例えば lib 配下にあるファイルをすべて ruby-load-file するには以下を実行します

Dir["./lib/*.rb"].each {|file| require file }

複数のディレクトリがある場合は以下のような書き方もありです

['lib', 'controller'].each { |dir| Dir["#{__dir__}/../../../../#{dir}/*.rb"].each {|file| require file } }

自動化するには

例えば pry ファイルに上記のロードスクリプトを一行足しても OK です
サンプルは相対パスを使っていますがフルパスでも OK です

  • vim vendor/ruby/3.1.0/bin/pry
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'pry' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'
Dir["#{__dir__}/../../../../lib/*.rb"].each {|file| require file }

Gem.use_gemdeps

version = ">= 0.a"

str = ARGV.first
if str
  str = str.b[/\A_(.*)_\z/, 1]
  if str and Gem::Version.correct?(str)
    version = str
    ARGV.shift
  end
end

if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('pry', 'pry', version)
else
gem "pry", version
load Gem.bin_path("pry", "pry", version)
end

一部の gem がなぜかロードされていない

例えば slack-incoming-webhooks gem の Slack::Incoming::Webhooks がなぜか参照できません
理由は不明ですがこれも ruby-load-file で vendor ディレクトリ以下からロードすればちゃんとジャンプできるようになります

対策

これも pry でロードすれば OK です
以下 pry バッファで実行しましょう

require 'bundler'
Bundler.require

自動化するには

これも pry ファイルに書いてしまいましょう

  • vim vendor/ruby/3.1.0/bin/pry
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'pry' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'bundler'
Bundler.require
Dir["#{__dir__}/../../../../lib/*.rb"].each {|file| require file }

require 'rubygems'

Gem.use_gemdeps

version = ">= 0.a"

str = ARGV.first
if str
  str = str.b[/\A_(.*)_\z/, 1]
  if str and Gem::Version.correct?(str)
    version = str
    ARGV.shift
  end
end

if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('pry', 'pry', version)
else
gem "pry", version
load Gem.bin_path("pry", "pry", version)
end

Bundler.require は基本的に追記して OK だと思います
自分で作成したスクリプトを require する場合はメインとなるスクリプトを require してしまうと実行されてしまうので注意しましょう

ファイルが追加されたり gem が追加された場合は

pry を再起動したくなります
簡単なのは emacs をまるごと再起動すれば OK です
emacs を起動したまま robe を再起動したい場合は pry バッファを kill して再度 robe-start すれば OK です

複数のプロジェクトを開く場合には

複数のプロジェクトで robe-start してしまうと2つ目に開いたプロジェクトが1つ目の pry バッファを参照してしまいうまく動作しません
2つ目のプロジェクトで robe を起動したい場合は inf-ruby-console-auto を実行しましょう

最後に

面倒ですが robe-start 前に pry ファイルを弄っておくといい感じに補完やジャンプできるようになると思います

2022年12月5日月曜日

(solargraph) progn: Timeout while waiting for response. Method: textDocument definition. 対策

(solargraph) progn: Timeout while waiting for response. Method: textDocument definition. 対策

環境

  • macOS 11.7.1
  • emacs 28.1

原因

ネストしたプロジェクトに対しては動作しない模様

対策

一度プロジェクトを削除して再度プロジェクトを追加します

その際にネストしたプロジェクトの親ディレクトリは指定せず直接ネストしてあるディレクトリをプロジェクトとして追加しましょう

2022年12月2日金曜日

treemacs でファイル検索する方法

treemacs でファイル検索する方法

概要

treemacs の find-file だとその階層にいるファイルしか検索できないので projectile を使います

環境

  • Ubuntu 18.04
  • emacs 27.1

projectile のインストール

  • package-list-packages
  • projectile を探して i -> x

検索

projectile-find-file を使います

プロジェクト上にカーソルがある状態で実行するとそのプロジェクト内のファイルをルートからすべて検索してくれます

キーバインドはないので必要であれば設定しましょう

トラブルシューティング

fatal: detected dubious ownership in repository at '/home/xxx/app'
To add an exception for this directory, call:

        git config --global --add safe.directory /home/xxx/app

emacs を開いているユーザと検索しようとしているプロジェクトの権限が違う場合は上記のようなエラーが出ます

この場合は emacs を開いているユーザで上記のコマンドを実行すれば OK です

2022年12月1日木曜日

GitlabICIでスケジュールの場合だけ実行するジョブを設定する方法

GitlabICIでスケジュールの場合だけ実行するジョブを設定する方法

概要

GitlabCI のスケジュール機能はパイプラインを実行するので基本すべてのジョブが実行されます

スケジュール実行のときに特定のジョブだけ実行する方法を紹介します

バージョン

  • Gitlab-ee 15.4.3
  • Gitlab-runner 15.3.0

サンプル .gitlab-ci.yml

stages:
  - test

test_manual:
  stage: test
  image:
    name: python:3.10.2-buster
  script:
    - python -V
  except:
    - schedules

test_auto:
  stage: test
  image:
    name: python:3.10.2-buster
  script:
    - python -V
  only:
    - schedules

ちょっと解説

except と only を使います

except は除外なのでスケジュールのときは実行しません
only はそのときだけ実行するのでスケジュールのときだけ実行します
こうするとスケジュールのときだけ test_auto が実行されます
それ以外の手動で実行したい場合は test_manual を使います

ちなみに when: manual でスケジュール時の実行を無視できますが when を使った場合は push 時の自動実行もなくなります

スケジュールの登録方法

こちらで紹介しています

参考サイト

2022年11月22日火曜日

ffmpegでmovを圧縮するコマンド

ffmpegでmovを圧縮するコマンド

環境

  • macOS 11.7.1
  • ffmpeg 5.1.1

コマンド

  • ffmpeg -i input.mov -pix_fmt yuv420p output.mp4

2022年11月21日月曜日

Pythonでクラスなしの定数の一覧を参照する方法

Pythonでクラスなしの定数の一覧を参照する方法

概要

クラス配下の定数であれば ClassName.__dict__ などで参照できます
しかしクラス外に直接モジュール配下に定義している定数ではそうはいきません

今回はその方法を紹介します

環境

  • macOS 11.7.1
  • Python 3.10.2

サンプルコード

NAME = "hawk"
AGE = 20


def export():
    import sys
    current_module = sys.modules[__name__]
    return [(k, v) for k, v in current_module.__dict__.items() if k.isupper()]


if __name__ == "__main__":
    for i in export():
        print(i[0])
        print(i[1])

ちょっと解説

ポイントは sys.modules[__name__] です
これで現在のモジュールが取得できます
あとはそのモジュールに対して __dict__ を参照すれば OK です

今回は定数だけ取得するので key の値で先頭が大文字のフィールドだけを返却しています

また tuple で返却しているのでフィールド内に mutable な値 (dict型) が存在しているためで再度 dict などで返却しようとすると TypeError: unhashable type: 'dict' などが発生するのでその対処として tuple にしています

2022年11月18日金曜日

QuickTimeで音声付きの画面収録方法メモ

QuickTimeで音声付きの画面収録方法メモ

概要

blackhole を使います

環境

  • macOS 11.7.1
  • blackhole 0.4.0

blackhole のインストール

  • brew install blackhole-2ch

複数出力装置の作成

  • Audio MIDI設定
  • プラスボタン
  • 複数出力装置を作成
    • BlackHole 2ch
    • 内蔵出力

Mac 側の音声設定

  • 出力 -> 複数出力装置
  • 入力 -> BalckHole 2ch

QuickTime 側入力設定

  • ファイル
  • 新規画面収録
  • オプション
  • マイク -> BlackHole 2ch

あとは普通に画面収録すれば OK

これでブラウザなどの動画などを収録すれば音も収録されます

注意事項

MacOS の複数出力装置ではボリュームの調整ができないので注意が必要です

もし各チャネルごとにボリューム調整したい場合は LadioCast などのソフトウェアミキサーと組み合わせましょう

録音したいアプリの出力設定にも注意

システムデフォルトの出力を使っている場合は問題ないのですが個別で設定しなければいけない場合にはアプリ側の出力も複数装置に変更しましょう