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

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

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

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 句を使えば間違いないです

2022年11月8日火曜日

ブラウザで動作する電気回路シミュレータ

ブラウザで動作する電気回路シミュレータ

メモ

Circuit Simulator Applet

https://www.falstad.com/circuit/

サンプルも豊富
電子の流れも可視化されているので直感的

2022年11月7日月曜日

Pythonのコードフォーマッタblackを試す

Pythonのコードフォーマッタblackを試す

概要

Python のコードフォーマッタ black を試してみました

環境

  • macOS 11.6.8
  • Python 3.10.2
  • black

インストール

  • pipenv install black

試す

  • pipenv run black .

設定ファイル

  • vim pyproject.toml
[tool.black]
line-length = 88

最後に

一度 line-length = 10 などにして再度 line-length = 88 に戻してからフォーマットをかけても元に戻らない部分があるので注意しましょう

参考サイト

2022年11月4日金曜日

capistranoのconsoleコマンドで実行時のエラーを抑制する方法

capistranoのconsoleコマンドで実行時のエラーを抑制する方法

環境

  • Ruby 3.1.2
  • capistrano 3.17.1

標準エラーをリダイレクトする

おそらくこれが一番簡単です

  • bundle exec cap production console 2>/dev/null

--suppress-backtrace というオプションがあるが使い方がよくわからない、、

2022年11月2日水曜日

docker-compose から構成図を作成する方法

docker-compose から構成図を作成する方法

概要

docker-compose-viz というツールがあるのでそれを使うと簡単に作成できます

環境

  • docker 20.10.7
  • docker-compose 1.29.2

サンプルコマンド

  • docker run --rm -it -v $(pwd):/input pmsipilot/docker-compose-viz render -m image --force docker-compose-local.yml

上記の場合カレントディレクトリにある docker-compose-local.yml を使って構成図を作成します
作成されるファイル名は docker-compose.png で出力先はマウントしているカレントディレクトリになります

その他オプション

こちらを御覧ください

最後に

links などが必要になっているので network の設定だけだとうまく線が引けない場合があります

2022年11月1日火曜日

Python marshmallow で datetime 型を使う際のフォーマット指定方法

Python marshmallow で datetime 型を使う際のフォーマット指定方法

概要

format が使えるのでそれを使うと datetime に自動で変換してくれます

環境

  • Python 3.10.2
  • marahmallow 3.18.0

サンプル

class TestSchema(Schema):

    created_at = fields.DateTime(data_key="created_at", format="%Y-%m-%dT%H:%M:%SZ")