contextlib.ExitStackをもちょっと便利に使ってみる

Python標準ライブラリのcontextlib.ExitStackを利用すると、コンテキストマネージャーを個別に管理する必要はなくなりスコープを抜けた際に一括で開放できるためコードの見通しが非常に良くなると思います。

ExitStackを使わないコード

def sample():
    with (open("path","r") as f,
          open("path2","r") as f2,
          ):
        pass

個人的に見通しが良いと思っていません。 冒頭のwithに含められない場合には、ネストしてwithを利用する必要がありさらに可読性に難ありだと思っています。

ExitStackを使う場合

from contextlib import ExitStack

def sample():
    with ExitStack() as stack:
        f = stack.enter_context(open("path","r"))
        f2 = stack.enter_context(open("path2","r"))

with 文を改行するよりも見通しがよくなり、スコープの任意の場所で安全にインスタンス生成が可能となりましたが、このために関数全体with 文を適用してネストを深めるのもなんだかなぁな感じです。

デコレータでExitStackを隠蔽すればいいのでは?

from functools import wraps
from contextlib import ExitStack

def with_exit_stack(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        with ExitStack() as stack:
            # `ExitStack` を引数として渡す
            return func(*args, stack=stack, **kwargs)
    return wrapper

@with_exit_stack
def sample(stack: ExitStack):
    f = stack.enter_context(open("path","r"))
    f2 = stack.enter_context(open("path2","r"))
    # リソースは関数終了時に自動的に解放

sample()

関数を抜ける際にリソースが安全に開放され、ネストも深くならないのでこれでよさそうです。

突如としてOfficeアプリが起動しなくなった(0xc0000005)

Word、ExcelなどOfficeアプリが突如として起動しなくなったのでその対処法

状況

  • スタートメニューから起動しても何も言わずに起動しない
  • 管理者権限だと起動する
  • イベントビューアーで見ると起動時にAppVIsvSubsystems64.dll(?)が例外吐いて落ちている

Excel

障害が発生しているアプリケーション名: EXCEL.EXE、バージョン: 16.0.17628.20144、タイム スタンプ: 0x66639c21
障害が発生しているモジュール名: AppVIsvSubsystems64.dll、バージョン: 16.0.17804.43981、タイム スタンプ: 0x665fe11c
例外コード: 0xc0000005
障害オフセット: 0x00000000000b12ad
障害が発生しているプロセス ID: 0x0x1E70
障害が発生しているアプリケーションの開始時刻: 0x0x1DAC132E3F3FE95
障害が発生しているアプリケーション パス: C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE
障害が発生しているモジュール パス: C:\Program Files\Microsoft Office\root\Office16\AppVIsvSubsystems64.dll
レポート ID: 43a1de4e-c785-4384-a1d9-3b855ed0fc24
障害が発生しているパッケージの完全な名前:
障害が発生しているパッケージに関連するアプリケーション ID:

Word

障害が発生しているアプリケーション名: WINWORD.EXE、バージョン: 16.0.17628.20144、タイム スタンプ: 0x66639b10
障害が発生しているモジュール名: AppVIsvSubsystems64.dll、バージョン: 16.0.17804.43981、タイム スタンプ: 0x665fe11c
例外コード: 0xc0000005
障害オフセット: 0x00000000000b12ad
障害が発生しているプロセス ID: 0x0x168C
障害が発生しているアプリケーションの開始時刻: 0x0x1DAC132DF437CBB
障害が発生しているアプリケーション パス: C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE
障害が発生しているモジュール パス: C:\Program Files\Microsoft Office\root\Office16\AppVIsvSubsystems64.dll
レポート ID: c4a6b39b-5eaa-4751-863c-7ffaff605816
障害が発生しているパッケージの完全な名前:
障害が発生しているパッケージに関連するアプリケーション ID:

原因

最近、Windowsのカスタマイズでインストールした「Windhawk」との相性でした。

Windhawk:1.4.1

対策

シンプルには、Windhawkをアンイストールすることで解消
ただし、この問題はGithubなどでも報告されているためこちらのIssueで対処方法が寄せられています。

こちらのコメントの方法では、Officeアプリがインストールされている配下すべてのプロセスに対して割り込みを除外する設定を入れることで解消してるのでこの方法がよいかもしれません。

なんにしろWindhawkのアップデートで解消しそうなのでそれまではアンイストールもしくは除外設定で回避するしかなさそうです

github.com

Satisfactoryの風景

2019年からコツコツやってるSatisfactory

全体像

位置的には、GRASS FIELDS (草原)の近くにある池?が2つ繋がっているエリアです。 地域住民の反対を無視してきれいな湖を埋め立てて建築を強行

MAP

全体風景
あのきれいな湖の面影すら残っていないくらい完璧に埋め立て工場 鉄、銅などから始まるすべての素材をこの工場で生産しているので超ツメツメ状態

生産設備①

1つの工場にすべての生産を突っ込んでるが流石に鉄系、銅系などによってエリア分け

鉄系のライン

地下1
地下2
工場全体が二重底構造で、汚いものはすべて床下に隠してしまえ発想 各生産ライン間の接続はすべて、床下に詰め込んで地上スッキリ中カオス

生産設備②

ここももとはきれいな湖で、もちろん埋め立て アルミの生産ラインはここ

アルミ系生産ライン

Updateが入って途中から水が必要!窒素が必要!とか言われて都度工事。

お家

お家には各種素材は生産物を保存する全手動の倉庫を完備 どこに何が入っているかわかりやすくてイイね!

倉庫

ブレーカー

工場の生産エリアごとに分電盤を設置して、エリア単位で供給停止ができるように。 なぜ? 停電になったときに復旧を簡単にするためですよ

ブレーカー

以上、とりあえずこんな感じでセンスないですが、Updateの度に増改築してマイルストーン達成していますが、そろそろこの工場では敷地的に厳しくなってきたなー

スクリーンショットの画像に枠線を付ける

ブログ記事書くために、スクショ取って載せる時になんか、締り?見栄えが良くないなーって思って画像の1pxの枠線を付けるんですよね

これを こういう風に

特に背景が白のときはスッキリ見えて個人的にこの一手間が好きです ただ、これいろいろやり方があり、ここ数年では、[Windows] + [Shift] + [S]によるスクリーンショットの枠線を自動で追加の機能が非常に便利でしたが、スクショ撮ったときにしか使えなかったのでちょい不便

C#使ってクリップボードから画像を取り出して、Bitmap作ってGraphicsで四角書いて~とかやってましたがいま時代、ブラウザでも簡単にできたんですよね 作ってみた、完全に個人の趣味

wakusentsuika.com

  • クリップボードやローカルの画像ファイルを読み取って任意の太さ、色の枠線を追加
  • JavaScriptですべて処理をするので、外部に画像を送信しない安心設計