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 などのソフトウェアミキサーと組み合わせましょう

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

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

2022年11月16日水曜日

Chromeのパスワード情報をkeychain側にコピーする方法

Chromeのパスワード情報をkeychain側にコピーする方法

概要

Apple が公式で提供しているiCloudパスワードというエクステンションがあるのですがこれは keychain にある認証情報を Chrome 上で使用できるようにするエクステンションになります

今回やりたいのは Chrome 上にすでにある認証情報を keychain 側にまるまるコピーする方法になります

環境

  • macOS 11.7.1
  • chrome 107.0.5304.87
  • csv2keychain 0.1.3

csv2keychain のインストール

  • pip install cmdline-csv2keychain

chrome のパスワード情報をエクスポート

  • chrome://settings/passwords を入力
  • パスワードのエクスポートを選択

Macの認証情報を求められるので入力します

keychain 側にコピーする

先程のパスワードファイルは pass.csv というファイルで保存しました

  • csv2keychain ~/Downloads/pass.csv

実行すると以下のようなログがつらつら流れるので完了するまで待ちましょう

Copying item #462...
#462 complete

The specified item already exists in the keychain.

というログはそのまんまの意味ですでにパスワードが登録されていると言われてエラーになっています

-u オプションを使うと上書きコピーできるので全部 Chrome 優先にしたい場合はオプションを使いましょう

  • csv2keychain ~/Downloads/pass.csv -u

ただこの方法だと毎回認証ダイアログが表示されてしまいかなり面倒です
解決方法もないようです

https://github.com/nntarasov/csv2keychain/issues/7

なのでもし重複している場合には手動でパスワードを修正しましょう

Safari 側でパスワードが参照されない場合は

よくわからないのですが keychain にコピーしたパスワードは Safari ではうまく参照してくれませんでした

なので Safari で Chrome の情報を読み込みたい場合は

  • ファイル -> 読み込む -> Google Chrome

でコピーする必要があります

最後に

上書きコピーになるのですでに keychain 側にある認証情報は残ります

参考サイト

2022年11月15日火曜日

CeleryでRetryしたジョブを見つける方法

CeleryでRetryしたジョブを見つける方法

概要

Celery はリトライしたジョブは最終的に SUCCESS or FAILURE になるためリトライした RETRY のステータスのジョブは残りません

成功したがどのジョブがリトライしたかを調べたい場合には flower の API を使うと簡単です

環境

  • Ubuntu 18.04
  • Python 3.10.2
  • flower 1.2

サンプルコード

import requests

api_root = 'http://localhost:5555/api'
task_api = '{}/tasks'.format(api_root)

res = requests.get(task_api)
tasks = res.json()
for task_id, info in tasks.items():
    if info['retries'] > 0:
        print(task_id)
        print(info)

参考サイト

2022年11月14日月曜日

SQLAlchemyでカラムに独自のクラスを設定する方法

SQLAlchemyでカラムに独自のクラスを設定する方法

概要

Custom Types という機能を使います

環境

  • macOS 11.7.1
  • Python 3.10.2
    • sqlalchemy 1.4.43
    • mysqlclient 2.1.1

インストール

  • pipenv install sqlalchemy
  • pipenv install mysqlclient

サンプルコード

"""TypeDcoratorを使ったサンプルモジュール."""
from dataclasses import dataclass

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Column
from sqlalchemy.types import (Integer,
                              String)
from sqlalchemy.types import TypeDecorator


# セッション作成
engine = create_engine("mysql://root:@localhost/test?charset=utf8mb4")
SessionClass = sessionmaker(engine)
db_session = SessionClass()

Base = declarative_base()


class ProfileType(TypeDecorator):
    """カラム用の独自のプロファイルクラスを管理."""

    impl = String

    def __init__(self, *args, **kwargs):
        """クラスを指定する引数の定義."""
        self.profile_class = kwargs.pop('profile_class')
        TypeDecorator.__init__(self, *args, **kwargs)

    def process_bind_param(self, value, dialect):
        """レコードのデータの型チェックをして返却."""
        if value is not None:
            if not isinstance(value, self.profile_class):
                raise TypeError("Value should %s type" % self.profile_class)
            return value.value

    def process_result_value(self, value, dialect):
        """レコードのデータをオブジェクトに変換."""
        if value is not None:
            if not isinstance(value, str):
                raise TypeError("value should have str type")
            lang, framework = value.split(',')
            return self.profile_class(lang, framework)


@dataclass
class Profile():
    """このクラスを使った独自カラムを定義する."""

    lang: str
    framework: str


class User(Base):
    """テーブル定義."""

    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    age = Column(Integer)
    profile = Column(ProfileType(profile_class=Profile))  # ここに独自のクラスを使ったカラムを定義


# 動作確認
users = db_session.query(User).all()
for user in users:
    print(user.profile.lang)
    print(user.profile.framework)

ちょっと解説

ProfileType が sqlalchemy の Custom Types を使った独自の型になります
この型をカラム定義に使うことができます

データを受け取る際のクラスは Profile クラスになります
MySQL の内部的には CSV で保存されていることを想定しておりそれを分割して各フィールドに設定しています (process_result_value)

impl は独自実装元の型を定義します

process_bind_param と process_result_value は必ず実装するメソッドになります

最後に

わざわざ取り出したあとでオブジェクトに変換する必要がなくなるので便利です

参考サイト

2022年11月11日金曜日

macOSでpythonやrubyをHomebrewでインストールした場合にシステムデフォルトのpythonやrubyより優先して使う方法

macOSでpythonやrubyをHomebrewでインストールした場合にシステムデフォルトのpythonやrubyより優先して使う方法

概要

Homebrew で最新の python や ruby をインストールした場合にそれを優先的に使いたいことがあると思います

その場合 brew link などのコマンドを使うのですが /usr/local 配下を上書きしようとすると怒られます

  • brew link --force ruby
Warning: Refusing to link macOS provided/shadowed software: ruby

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

環境

  • macOS 11.7.1
  • Homebrew 3.6.1

.zshrc に PATH を記載する

Homebrew でインストールした python と ruby を PATH に追加することで優先的に使うことができます

export PATH="/usr/local/opt/python/libexec/bin:$PATH"
export PATH="/usr/local/opt/ruby/bin:$PATH"

最後に

これで pyenv や rbenv の system 側のバイナリも Homebrew でインストールした最新のものを system に使用することができます

2022年11月10日木曜日

pyenvでsystemを使っているときにsystemのpythonのパスを確認する方法

pyenvでsystemを使っているときにsystemのpythonのパスを確認する方法

環境

  • macOS 11.7.1
  • pyenv 2.3.3 (via homebrew)

コマンド

  • pyenv which python

2022年11月9日水曜日

paramikoでfile descriptorが開放されない場合に確認すること

paramikoでfile descriptorが開放されない場合に確認すること

環境

  • Python 3.102
  • paramiko 2.7.2

必ずクライアントはクローズすること

オブジェクトのスコープが終了すると自動でクローズされるようなのですがどうもクローズされないことがあるようなので必ず close をコールしましょう

with 句を使えば間違いないです