めもちょー

メモ帳代わりに使っています。

Python

dbt-osmosimのカラムレベルdescription伝播をSQLパーサーを用いてスクラッチ実装してみる

下記のtableとviewがあります。 salary viewはemployee tableとsalary tableを結合しています。 tableにはカラムレベルでdescriptionがありますが、viewには無い状態です。 employee tablesalary tablesalary viewviewは分析者が簡易的に作ることが多く、des…

Pythonの関数で単一プロセス内と複数インスタンス間でのキャッシュ

概要 単一プロセスでのキャッシュ functools cachetools 複数インスタンス間でのキャッシュ 概要 Pytyhonの関数をキャッシュするデコレータについてです。 キャッシュを考える場合、次の2つの状況を考える必要があります。 単一プロセス内でキャッシュする場…

Jupyter Notebookでvenv環境を使う

前提 カーネルが切り換わらない場合 前提 久しぶりに機械学習のコードを書く機会が会ったので、Jupyter Notebookを起動しました。 下記のようにvenv環境でJupyter Notebookを立ち上げました。 # .venv をactivate $ cd workspace $ python -m venv .venv $ s…

Google Mapsに複数Markerを表示する

KEYを作成 スクリプト作成 課題 KEYを作成 GCPConsoleでKEYを作成します。 APIの制限としてMaps JavaScript APIのみを選択しておきます。 スクリプト作成 端末上で環境変数を設定し、JavaScriptふぁいるのHTMLを吐くPythonプログラムを実行します。 map.html…

BigQuery Emulatorを動かす

BigQueryのEmulatorを用いて、開発環境やCI環境で導入できないかを検証しました。 github.com インストール 使用方法は go install Docker バイナリ があるようです。私はlinux用のバイナリを落としPATHに追加する方法で使用しました。 github.com wget http…

Spanner Clientのreleaseされていないverを使う

経緯 結論 経緯 clientからSpannerを扱うコードを書いていてpython-spannerリポジトリのコードをGitHubで読んでいたら、GitHub上では実装されているのに呼び出せないメソッドがありました。 調べたらclientのpython-spannerのverがv.3.22.2に対して、latest-…

CloudBuildからCloudRunへDeployする

概要 手順 ファイルを用意 CloudBuildでトリガーを作成 Blue/Green Deploy 参考 概要 今回説明するのは、GitHubリポジトリにpushするとGCP上でDockerイメージをビルドし、ビルドされたコンテナをCloud Runへデプロイしてくれるパイプラインです。 手順 ファ…

Cloud SchedulerからCloud FunctionsをHTTP・Pub/Subでトリガーする

2つのアーキテクチャ HTTPSからCloud Functionsをトリガーする Pub/Subを介してCloud Functionsをトリガーする 2つのアーキテクチャ Cloud SchedulerからCloud Functionsを定期実行したい場合、下記の2つのアーキテクチャが挙げられます。 HTTPSからCloud Fu…

ブログに上げる画像の加工サーバーを作った

旅行記を書いているのですが、流石に何百枚とアップロードしているのに無加工は厳しいと思い画像の右下にロゴを入れる簡易アプリケーションを作りました。 写真の取り込みはWindowsで行うため、ローカル環境でWindowマシンからアクセスし、Ubuntu上で加工が…

nba_apiからAPIのドキュメントを生成する

全endpointのドキュメントを作るためのスクリプトはコチラ import inspect import json import os from dataclasses import dataclass from typing import Any, Union from nba_api.stats import endpoints DIR_PATH: str = "endpoints" REJECT_ARGS = ["pro…

Workload Identity連携をしてGitHub ActioinsからCloud Functionsをdeployする

Workload Identity連携とは 何が嬉しいのか どういう仕組みか 設定の仕方 事前準備 Workload Identity Poolの設定 IdP (Identity Provider)の登録とWorkload Identity Poolの追加 外部IDがサービスアカウントを使えるようにする workflowにdeploy jobを記述…

nba_api のendpoint 一覧をまとめた

ChatGPTを使いnba_apiの各エンドポイントの概要を教えてもらいました。 alltimeleadersgrids assistleaders assisttracker boxscoreadvancedv2 boxscoredefensive boxscorefourfactorsv2 boxscorematchups boxscoremiscv2 boxscoreplayertrackv2 boxscoresco…

PythonのFakerモジュールを用いてDBにダミーデータを100万件挿入する

はじめに Fakerについて ダミーデータの挿入 tableの準備 挿入スクリプトを書く データの確認 はじめに こちらの記事ではUNIONとCROSS JOINを用いてダミーデータをSQL内で生成する方法を書きました。 memo.geso.site今回はPythonのFakerというモジュールを用…

『Pythonのレベルを上げる12のデコレータ』メモ

はじめに logger wraps lru_cache repeat timeit retry countcall rate_limited register singledispatch はじめに このような記事を見つけました。 functools等で提供されているデコレータではなく、使用頻度の高いデコレータを独自に実装しようという試み…

金色のガッシュの魔物生存期間の可視化

TSVに(名前, 登場話, 退場話)を記録 (記録するために全巻読みました) 名前 登場話 退場話 メモ ガッシュ 1 322 レイコム 4 6 ゴブレ 7 10 ブラゴ 7 321 スギナ 13 15 コルル 16 18 フェイン 19 20 フリガロ 22 22 エシェロス 22 25 キャンチョメ 27 301…

Iterator生成関数をスクラッチ実装

前置き 実装済 chain.from_iterable(iterable) count(start, step) cycle(iterable) groupby(iterable, key=None) pairwise(iterable) dropwhile(predicate, iterable) takewhile(predicate, iterable) filterfalse(predicate, iterable) starmap(function, …

『Fluent Python』メモ

『Fluent Python』を読んだのでメモを残します。 1章 Pythonのデータモデル 2章 シーケンスの配列 3章 ディクショナリとセット 4章 テキストとバイト 5章 第一級関数 6章 第一級関数を使ったデザインパターン 7章 関数デコレータとクロージャ 13章 演算子オ…

Python・JavaScript・HTMLのLint Checkを行うGitHub Actions

Pythonにはpipでflake8, isort, blackを入れる。 name: "test" on: [pull_request, push] jobs: style: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Set up Python 3.9 uses: actions/setup-python@v2 with: python-…

seleniumからhtml2canvasを実行してwebページの特定タグ領域を画像化する

seleniumを使って部分的な領域をスクショする方法を(無理やり)つくりました。selenium.webdriver.chrome.webdriver.WebDriverにもsave_screenshot()というメソッドがありますが欲しい位置が取得できないという問題がありました。 全画面をスクショする方法…

Pythonでジェネリクスを扱う

最近Pythonを書くにしても、型を意識して書くことが増えたためこちらのドキュメントについて、あやふやに理解していた部分をまとめました。 docs.python.org 新しい型を定義したい時 ジェネリクス Any型 特殊型 typing.LiteralString typing.NoReturn typing…

アプリケーションからSQLを実行する際の注意点

PythonなどのアプリケーションからSQLを実行する際のポイントを個人的にまとめてみました。 Python関数よりもSQL関数 NG OK bulk NG OK エラー処理 NG OK Python関数よりもSQL関数 基本的にPythonの速度はSQLの速度と比べて非常に遅いため, SQLで実行できる…

Fast API + nginx のWebアプリをDockerで動かす

FastAPIアプリ側のコンテナの操作 import os import uvicorn from fastapi import FastAPI MESSAGE = os.environ['MESSAGE'] PORT = os.environ['PORT'] app = FastAPI() @app.get("/") def read_root(): return {"Hello": MESSAGE} @app.get("/items/{item_…

Fast API + uvicorn のサーバーをDockerでつくる

コンテナを作成 # pythonイメージから何もしないコンテナを起動 $ docker container run --name base -d python:3.7.5-slim tail -f /dev/null # fastapiとuvicornをコンテナにインストール $ docker container exec base pip install fastapi==0.73.0 $ doc…

『Effective Python』メモ

Effective Pythonを読んだのでそのメモです。 関数をトレースするデコレータ with句を作成するためのcontextmanagerデコレータ 様々なキュー 両端キュー(Double-ended Queue) ヒープキュー(Heap Queue) 関数をトレースするデコレータ 関数呼び出しの引数…

lyricsGeniusで歌詞を取得する

歌詞情報が欲しい場面があったのでメモ lyricsGeniusというOSSが便利だった github.comColdplayのYellowの歌詞を取得したい場合 import lyricsgenius token = 'XXXX' genius = lyricsgenius.Genius(token) song = genius.search_song(title='Yellow', artist…

動画のラベルを抽出する

文字の範囲のみをトリミングした動画から、(フレーム番号, 時刻, そのフレームの画像に表示されている文字)を抽出する import cv2 import numpy as np import csv from PIL import Image import pyocr def cv2pillow(image): new_image = image.copy() if …

動画から特定範囲をトリミング

必要なものをインスコ pip install ffmpeg-pythonimport ffmpeg import cv2 import os.path import numpy as np def video_trimming(video_path, x, y, w, h): """ video_path # ファイルの絶対パス start_x = 850 # 切り取りたい区画のx座標(px) start_y …

SeleniumでChromeを使いスクレイピングした際に容量が増えたときの調査方法と対処方法

急に容量が増えたときの調査方法 スクレイピングしてたら意図しないストレージ容量の増加が起きた. データの保存先のMySQLの容量は大したものではなかったため意図せぬログファイルやキャッシュファイルの仕業と考えられた. 実際, ディスク容量アナライザを…

cv2.VideoCaptureで任意のフレーム番号の画像とその時刻を得る

動画の各フレーム番号の画像に対して画像処理を施し再構成する際に(画像処理を施したフレーム画像, 時刻)が必要 cv2.VideoCaptureを使うと上の要件を満たせることが分かったので基本的な使い方を試した import cv2 import numpy as np if __name__ == '__m…

pytestとblackのテスト環境をGitHub Actionsで作る

poetryのインストール curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - 環境変数を通す vim ~/.bash_profile 下記を追加 export PATH="$HOME/.poetry/bin:$PATH" 既存のプロジェクトの場合はinitでpypro…