環境
- macOS 11.7.1
- ffmpeg 5.1.1
コマンド
-
ffmpeg -i input.mov -pix_fmt yuv420p output.mp4
クラス配下の定数であれば ClassName.__dict__
などで参照できます
しかしクラス外に直接モジュール配下に定義している定数ではそうはいきません
今回はその方法を紹介します
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 にしています
blackhole を使います
これでブラウザなどの動画などを収録すれば音も収録されます
MacOS の複数出力装置ではボリュームの調整ができないので注意が必要です
もし各チャネルごとにボリューム調整したい場合は LadioCast などのソフトウェアミキサーと組み合わせましょう
システムデフォルトの出力を使っている場合は問題ないのですが個別で設定しなければいけない場合にはアプリ側の出力も複数装置に変更しましょう
Apple が公式で提供しているiCloudパスワードというエクステンションがあるのですがこれは keychain にある認証情報を Chrome 上で使用できるようにするエクステンションになります
今回やりたいのは Chrome 上にすでにある認証情報を keychain 側にまるまるコピーする方法になります
Macの認証情報を求められるので入力します
先程のパスワードファイルは pass.csv というファイルで保存しました
実行すると以下のようなログがつらつら流れるので完了するまで待ちましょう
Copying item #462...
#462 complete
というログはそのまんまの意味ですでにパスワードが登録されていると言われてエラーになっています
-u オプションを使うと上書きコピーできるので全部 Chrome 優先にしたい場合はオプションを使いましょう
ただこの方法だと毎回認証ダイアログが表示されてしまいかなり面倒です
解決方法もないようです
https://github.com/nntarasov/csv2keychain/issues/7
なのでもし重複している場合には手動でパスワードを修正しましょう
よくわからないのですが keychain にコピーしたパスワードは Safari ではうまく参照してくれませんでした
なので Safari で Chrome の情報を読み込みたい場合は
でコピーする必要があります
上書きコピーになるのですでに keychain 側にある認証情報は残ります
Celery はリトライしたジョブは最終的に SUCCESS or FAILURE になるためリトライした RETRY のステータスのジョブは残りません
成功したがどのジョブがリトライしたかを調べたい場合には flower の API を使うと簡単です
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)
Custom Types という機能を使います
"""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 は必ず実装するメソッドになります
わざわざ取り出したあとでオブジェクトに変換する必要がなくなるので便利です
Homebrew で最新の python や ruby をインストールした場合にそれを優先的に使いたいことがあると思います
その場合 brew link などのコマンドを使うのですが /usr/local 配下を上書きしようとすると怒られます
Warning: Refusing to link macOS provided/shadowed software: ruby
今回はその対処方法を紹介します
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 に使用することができます
オブジェクトのスコープが終了すると自動でクローズされるようなのですがどうもクローズされないことがあるようなので必ず close をコールしましょう
with 句を使えば間違いないです
Python のコードフォーマッタ black を試してみました
[tool.black]
line-length = 88
一度 line-length = 10 などにして再度 line-length = 88 に戻してからフォーマットをかけても元に戻らない部分があるので注意しましょう
おそらくこれが一番簡単です
--suppress-backtrace
というオプションがあるが使い方がよくわからない、、
docker-compose-viz というツールがあるのでそれを使うと簡単に作成できます
上記の場合カレントディレクトリにある docker-compose-local.yml
を使って構成図を作成します
作成されるファイル名は docker-compose.png で出力先はマウントしているカレントディレクトリになります
こちらを御覧ください
links などが必要になっているので network の設定だけだとうまく線が引けない場合があります