Python利用状況現状報告 2023.06

Python mini hack-a-thon Conference 2023.06.17

お前誰よ

Kei IWASAKI

  • コネヒト株式会社のインフラエンジニア

SNSなど

はじめて参加した pyhack は第37回です


https://pyhack.connpass.com/event/3718/

初参加から今まで5回ほど転職しています

今日のお話

お久しぶりなので現状報告をしたいと思います

お久しぶりなので現状報告をしたいと思います

最近Python+開発環境はこんな感じで使ってるよという話を
ダラダラします

アウトライン

  • 最近のお仕事
  • 最近のPC環境の話
  • 最近の Python とのかかわり

最近のお仕事

最近のお仕事: ざっくり概要

  • インフラエンジニア業
    • AWS 関連全般(社内システム含む), CI/CD まわり
    • Platform Engineering の実践
  • 社内 Notion 相談役
  • コーポーレートシステムの開発っぽいこと

最近のお仕事: 書物

  • よく書いているもの
    • HCL(terraform)
    • YAML(GitHub Actions, ecspresso, ecschedule, Ansible など)
    • 日本語
  • まあまあ書く
    • Python, シェルスクリプト, Makefile
  • たまに書く
    • Go, Dockerfile, jsonnet
    • AWS, GitHub, Notion

最近のPC環境

業務

  • Windows11
  • Wezterm + nushell
  • Neovim

サブ

  • WSL2: ArchLinux + zsh

最近のPC環境

最近のPC環境

プライベート

  • ArchLinux
  • wezterm + zsh
  • Neovim

Windows11

  • 現職にきて2年7カ月ほどですが、すっかり Windows に慣れました。
  • むしろ今では結構気に入っています

Windows11: CLI環境事情

とりあえず WSL2 は Docker 動作環境としてか Ansible のコードを書くとき以外
ほとんど使ってない

Windows11: CLI環境事情

  • Terminal エミュレータは Wezterm をメイン利用。(ArchLinuxと同じものにしたいので)
  • メインで使うシェルは cmd でもなく PowerShell でもなく nushll
  • コマンドラインツールも最近はWindowsでも充実していて困ってない

Windows11: Windowsでのコマンドの充実具合

  • ssh, curl, tar, make なんかは普通に Windows 対応してる
  • ripgrep をはじめとした bat, fd, sd などの Unixコマンドの Rust 実装は Windows でも大体動く
  • それらのツールは標準で入っているか大体 scoop か winget でそろう
  • go 製のツールも go install すれば大体使える

Windows11: お世話になってるCLIツールたち(一部)

ツール名 概要
fzf Go製のfizzzy finder
ghq Go製のいい感じに git clone してくれる君
go-task/task Go製のタスクランナー、非同期事項が安定している
ripgrep Rust製の高速なgrep
bat Rust製のリッチなcat
difftastic Rust製のdiffコマンド
fd Rust製のfindコマンド

以下のページが詳しいので気になる人はみてみて

Wezterm https://wezfurlong.org/wezterm/

  • Rust製のターミナルエミュレータ
  • Wezさんが作ってる
  • Windows, macOS, Linux で使える
  • 設定は lua で書く

nushell ( https://www.nushell.sh/

nushell ( https://www.nushell.sh/

  • Rust 製の CLI シェル
  • Windows, macOS, Linux で使える
  • 動作がとにかく早いけどリッチな機能が使える
  • 対応している補完は正直まだ少ない。でも自分で書くのは結構カンタン
  • 地味に virtualenv には activate.nu が含まれている(venvは未対応だけど)
  • パイプラインの扱いは PowerShell っぽさもある

Windows11: エディタ

  • 基本的にコードも文書もほとんど Neovim でやっている
  • NotionとObsidianも使うけど
  • たまに VS Code も開く

Windwos11:
エディタ - Neovim利用状況

  • プラグインマネージャ: lazy.nvim
  • LSP: nvim-lsp系 + Mason.nvim
  • ファイラ: lir.nvim
  • カラースキム: shaunsingh/nord.nvim
  • fizzyfinder: telescope.nvim
  • 他: vim-terraform, vim-jsonnet, copilot.vim

詳細は GitHub の laughk/dotfiles

最近の Python とのかかわり

最近の Python とのかかわり

  • Python を書く機会は全然あります
  • 社内システムやインフラ関連の AWS lambda は基本的に全部 Python

最近のPythonとのかかわり: 最近書いたやつ

Notion の直近で書かれた日報をピックアップして Slack に通知を出す君

最近のPythonとのかかわり: 最近書いたやつ

Notion の特定のデータベースの記事の更新内容を流すやつ(前まで公式であったのに使えなくなってしまった 😂)

最近の Python とのかかわり: Python の環境

  • 基本的に scoop の versions バケットを使って複数インストール
    • AWS lambda を触る関係で Python3.9, 3.10 も入れてる
    • 基本は最新だけ使ってる
  • nushell との相性の問題で virtualenv をグローバルの pip に直接入れちゃってる
  • ArchLinux 環境は AUR から必要なバージョンだけ入れて適宜 venv

これ以外のものは Python 関連では使ってない(というか必要ない)

最近の Python とのかかわり: Python の環境

とはいえ、実はほとんどの場合で最近は標準ライブラリだけで済ませてしまっているので pip/venv すらほぼ使わなくなってしまった...

ほぼ↓これだけで済んでいる

$ nvim main.py
$ python main.py

最近の Python とのかかわり: PyPIのライブラリを使わなくなった

複雑なことをしないならSDKとか使わず urllib で直接 API を叩くヘルパーを作っちゃう

def fetch_data_by_query(
    query: str, token: str, endpoint: str = GITHUB_GRAPHQL_API_ENDPOINT
) -> list:

    headers = {"Authorization": f"bearer {token}"}
    post_data = {"query": query}

    req = urllib.request.Request(
        GITHUB_GRAPHQL_API_ENDPOINT, json.dumps(post_data).encode(), headers
    )

    res = ""
    with urllib.request.urlopen(req) as f:
        res = f.read().decode("utf-8")

    return json.loads(res)["data"]

最近の Python とのかかわり: PyPIのライブラリを使わなくなった

複雑なことをしないならSDKとか使わず urllib で直接 API を叩くヘルパーを作っちゃう

def request_to_notion_api(
    path: str, query: dict = {}, token: str = "",
    api_version: str = NOTION_API_VERSION, api_endpoint: str = NOTION_API_ENDPOINT,
):
    """Notion APIにリクエストする際のヘルパー関数"""
    headers = {
        "Content-Type": "application/json",
        "Notion-Version": api_version,
        "Authorization": f"Bearer {token}",
    }

    if query:
        req = request.Request(
            f"{api_endpoint}{path}",
            json.dumps(query).encode("utf-8"),
            headers=headers,
        )
    else:
        req = request.Request(
            f"{api_endpoint}{path}",
            headers=headers,
        )

    result = ""
    with request.urlopen(req) as res:
        result = res.read().decode("utf-8")

    return json.loads(result)

最近の Python とのかかわり: コーディング事情

  • LSP は mason.nvim 経由の pyright を利用 + copilot パワー
  • PyPIのライブラリは開発環境用に black を入れたり AWS 関連でたまに boto3 を使うくらいでほぼ使わない
  • タスクランナーはインフラ関連のオペレーションの兼ね合いもあってほぼ GNU Make
  • 社内の他のメンバーでも触りやすくするために README と Makefile はちゃんと書く

大体書くMakefileのパターン

.PHONY: bootstrap
bootstrap:
        python -m venv venv
        ./venv/bin/python -m pip install -U pip
        ./venv/bin/python -m pip install -r requirements-dev.txt

.PHONY: fmt
fmt:
        python -m black app/*.py

AWS Lambda で動かすツールのパターン

.PHONY: bootstrap
bootstrap:
        python -m venv venv
        ./venv/bin/python -m pip install -U pip
        ./venv/bin/python -m pip install -r requirements-dev.txt

.PHONY: fmt
fmt:
        python -m black *.py

.PHONY: deploy
deploy:
        lambroll deploy

lambroll => https://github.com/fujiwara/lambroll

ECSで動かすツールパターン

.PHONY: docker_build
docker_build:
        docker build -t $(ECR_REPOSITORY) .

.PHONY: login_ecr
login_ecr:
        aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $(ECR_DOMAIN)

.PHONY: docker_push
docker_push: login_ecr
        docker push $(ECR_REPOSITORY)

.PHONY: docker_build_and_push
docker_build_and_push: docker_build docker_push

.PHONY: deploy
deploy:
        ecspresso deploy --config=_ecs/ecspresso.yml --skip-task-definition=true --force-new-deployment=true

.PHONY: diff_ecs
diff_ecs:
        ecspresso diff --config=_ecs/ecspresso.yml

.PHONY: push_and_deploy
push_and_deploy: docker_build_and_push deploy

ecspresso => https://github.com/kayac/ecspresso

こんな感じです

さいごに

  • 気が付いたら Python を触り始めてから自分も10年を超えていました
  • 自分の仕事やライフステージが色々移り変わっていっても相棒のように今でも Python のお世話になっています
  • pyhack にも引き続きお世話になります

何話そうかと思っていたけど「Python 利用状況現状報告 2023.06」がいいかな

# 最近の Python とのかかわり - 利用シーン - 「面倒なことはPythonでやらせよう」的なノリの使い方で今でも相棒感ある - コネヒトのインフラ領域ではコードの力が必要な場合は Python が利用されることが多い - 細かい lambda は基本的に Python を使っている - Slack通知系のものとか - GitHub のレビュー待ちPRのリマインダとか - Notion の日報通知とか - Notion の更新内容通知とか - Python開発環境 - Python は scoop 経由で入れている(ArchLinuxだと標準パッケージ/AURで入れたもの) - バージョンは最新と3.9(lambda用) - Python の細かいバージョンの違いによって動かなくなるという事はまずないのでこれで十分(ただし、lambda に合わせて Python3.9 使うときに型がダルイと感じることはある) - 細かい Linter/formatter も使っていなくて black くらい - ただ ruff はちょっと興味あり - lsp は pyright 使ってる + copilot パワー - 環境は原点回帰して素のPythonでそのままやるケースが増えた - というのも、最近はほとんど標準ライブラリで事足りてしまっていて、PyPIパッケージは本当に必要に迫られない限り使わないので - boto3 みたいにどうしても必要な場合のみ使う、その場合は venv (virtualenv)+ pip - タスクランナーは Make で済ませちゃう - 書いているものが社内便利ツール的なものが多いので、テストを書くよりも README/help をちゃんと書いたり型をちゃんと書くほうに時間を使っている