- 1. 9年目くらいのいまだ続いているレガシーなプロジェクトで改善してきたことと抱えている多くの課題
- 2. OpenCVとMatplotlibでAR(拡張現実)する
- 3. 使いこなしたい Python の便利機能
- 4. python 関数のアンパック
- 5. Dynamic Linksで発行したURLのクリック数をPythonで確認
- 6. [Python]変数を扱う際の注意点
- 7. 【python】勉強メモ-その3 2次元配列CSV出力
- 8. PythonのLiteral型について調べてみた(PEP586)
- 9. Python: ラムダ式で yield を使う
- 10. python ファイルの読み書き
- 11. seleniumでフォームのテストを自動化する方法
- 12. discord.py V2のスラッシュコマンドを使えるようにする
- 13. 【Python】勉強メモ-その2
- 14. python スライスの仕組み
- 15. graphvizの矢印について
- 16. AtCoder Beginner Contest(ABC) 280 – Pythonでのバーチャル参加結果と内容整理
- 17. チートシート【Python】
- 18. pybind11に入門してみた話
- 19. リストすべてをstr型からint型を相互に変換する方法
- 20. 【AtCoder】ABC281のA,(B),C,D における Python解説
9年目くらいのいまだ続いているレガシーなプロジェクトで改善してきたことと抱えている多くの課題
最初のgitのコミットから約8年?経過し9年目に突入しているのでは・・・というレガシー感の溢れるプロジェクトを引き継いでから何年もかけて色々改善してきた内容だったり、逆に現在でも色々抱えていて今後改善していきたい課題などについて本記事で振り返り的に触れていきます。
※執筆に関して上長から許可をいただいています。
# プロジェクトの概略
– 弊社がゲーム会社なのですが、各ゲームタイトルで横断で使われているwebアプリです。
– 言語としては主にPython、フレームワークとしては主にDjangoが使われています。
– テストやdocstringなどを含めた現在残存するPythonファイルの行数は約78万行くらいです。
– サーバーはAWSのクラウドが使われています。年数的に色々レガシー感のある点がたくさん残っていますが、一方でここまで長い間社内で使われ続けてきている・・・というのは中々無いケースでしっかり続いてきたのは良いことだと思います(大体のプロジェクトは数年で終わってしまったり、会社自体も10年持たないケースも世の中では多いでしょうし)。
# 引き継いだ当初の状況
以
OpenCVとMatplotlibでAR(拡張現実)する
## OpenCVとMatplotlibでAR(拡張現実)できるか挑戦してみた
去年のアドベントカレンダーでは[100行で作るAR](https://qiita.com/suo-takefumi/items/231a6f97cd880fe629a5)と題して、できるだけシンプルにARを実装する挑戦をしました。
今年は、MatplotlibでARを実装する挑戦をしました。
OpenCVで3Dデータを用いたARにはOpenGLを使うことがよくあると思いますが、OpenGLを使用せずMatplotlibの3DグラフでARができないか挑戦しました。## 完成デモ
完成したものはこちらです。ARで描画しているのはMatplotlibの3Dグラフです。ARマーカーの傾きに応じグラフの見え方も変わっているのがわかるでしょうか。
python 関数のアンパック
## 関数の戻り値をアンパックしよう
関数の戻り値は、以下のコードのように、複数の変数に対してアンパックが可能。
~~~python:exam.py
def func(numbers):
max_num = max(numbers)
min_num = min(numbers)
return max_num, min_numnumbers = [4, 1, 6, 2, 10, 100, 5, 200]
max_num, min_num = func(numbers)
print(f’最大値:{max_num} 最小値{min_num}’)>>>最大値:200 最小値1
~~~## アスタリスクを用いたアンパック
例えば、リストの最大値と最小値だけを個別に変数に代入して、そのほかは一つの変数に代入することもできる。
~~~python:exam2.py
def func(numbers):
numbers.sort(reverse=True)
return numbersnumbers = [4, 1, 6, 2, 10, 1
Dynamic Linksで発行したURLのクリック数をPythonで確認
# はじめに
Firebase Dynamic Linksと聞くと、iOSアプリやAndroidアプリ周りでのトラッキングなどでよく使われている印象ですが、弊社では営業業務の効率化などに使っています。
具体的には、アプローチ先に送った資料のURLがクリックされているかなど、SFAでできるようなトラッキングの機能を試す際に使っています。スタートアップの初期や個人開発だとSFAの導入はハードルが高いため、導入せず類似の機能を試すことができるというのがかなり便利です。
今回の記事では、実際の業務でDynamic Linksを使って、実装、運用をする際に工夫した点などについて書いてみました。
# ソースコード
以下で記述しているソースコードは、Dynamic Linksで発行した追跡URLのクリック数をプログラムで確認できるというものです。“`Python
import json
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSess
[Python]変数を扱う際の注意点
# はじめに
– Pythonにおける変数とオブジェクト、不変型と可変型のオブジェクト、および可変値を扱う際の注意点についてまとめてみました。
– 動作環境
– Python 3.11.0# オブジェクトについて
Pythonのすべてのオブジェクトは「値」、「データ型」、「ID」を持っています。`オブジェクトの値を変更できないオブジェクトは不変型`(immutable)オブジェクトで、`値を変更できるオブジェクトは可変型`(mutable)オブジェクトです。
以下、Pythonにおける不変型と可変型のデータ型の一例です。| 不変型 | 可変型 |
| ——— | ——– |
| int | list |
| float | dict |
| bool | set |
| str | byearray |
| frozenset | array |
| bytes | |
| tuple | |
【python】勉強メモ-その3 2次元配列CSV出力
### 1.はじめに
二次元配列を、CSVフィルに書き込む場合、`writerows`を使いますが、
`writerows`は、全データーを一旦、メモリに読み込むため、データー量が多い場合には
メモリが足りなくなる可能性もあります。そのような場合は、一行一行書き出すため、`writerow`を使います。
### 2.2次元配列をwriterowで記載する場合
では、2次元配列を、`writerows`と同じように`writerow`で書くと、どうなるでしょうか?
テキストファイル内には、`”[‘犬’, ‘ネコ’, ‘豚’]”,”[‘サル’, ‘牛’, ‘鳥’]”`と出力されています。
意図した結果と違いますね。“`sampel_01.py
import csv
str_li = [
[“犬”, “ネコ”, “豚”],
[“サル”,”牛”,”鳥”]
]print(str_li)
# [[‘犬’, ‘ネコ’, ‘豚’], [‘サル’, ‘牛’, ‘鳥’]]with open(“test.csv”, “w”, encoding=”utf_8″,
PythonのLiteral型について調べてみた(PEP586)
最近ちらほらとVS Code上での各ライブラリの操作でLiteral型関係が目に付いたり他のPEPの資料を読んでいて見かけたりしていたのでLiteral型のPEP資料(PEP586)の内容を軽くメモしておきます。
# どんな型なのか
Pythonビルトインのイミュータブルな値に対して、特定の値のみを受け付けるようにする型です。例えば`Literal[42, 10]`というLiteralの型であれば42か10の整数のみを受け付けるようになりますし、`Literal[“apple”, “orange”]`という型であればappleもしくはorangeという型のみ受け付けるようになります(値は整数と文字列など複数の型を混ぜることもできます)。
enumなどと少し用途が似ています(enumとの違いは後の節で少し触れます)。
# 使えるPythonバージョン
Python3.8以降のバージョンで使用することができます。3.8以降であればビルトインのtypingパッケージにLiteral型が入っているのでそちらで利用できます。
“`py
from typing import Lite
Python: ラムダ式で yield を使う
まずは普通のyieldの簡単な使いかたです。
“`py:
>>> def g():
yield 0
yield 1
return>>> a = g()
>>> next(a)
0
>>> next(a)
1
>>> next(a)
Traceback (most recent call last):
File ““, line 1, in
StopIteration
“`
こんな風にするとラムダ式でも yield できます。“`py:
>>> from itertools import chain
>>> g = (lambda : chain(
(yield 0)
, (yield 1)
)
)
>>> a = g()
>>> next(a)
0
>>> next(a)
1
>>> next(a)
Traceback (most recent call last):
File ““, line 1, in
StopIteration
python ファイルの読み書き
## with文を使おう!
> with open(ファイル名, ‘w’, encoding=文字エンコード) as 変数:
……(ファイルを操作する処理)※コロン「:」の後に、文を続けて書くこともできるが、pep8では推奨されていない
※with文を使わずopen関数でファイルを開いて書き込んだり、読み込んだりすることもできるが、最後にclose関数でファイルを閉じる必要がある。with文は、インデントブロックが終了すると自動的にファイルを閉じてくれるので、ファイルの閉め忘れ防止という意味でもwith文を使おう!– open関数の第1引数は、操作したいファイル名を書く
– open関数の第2引数は、’w'(write:書き込み)、’r'(read:読み込み)、’a'(append:追加書き込み)、’r+'(読み込んでから書き込み)、’w+'(書き込んでから読み込み)などがある。第2引数を省略した場合は、’r'(読み込み)になる。
– open関数の第3引数(キーワード引数)は、ファイルの読み書きの文字エンコーディングを現す。utf-8(UTF-8), shift-ji
seleniumでフォームのテストを自動化する方法
# 前提条件
フォームのバリデーションチェックのテストって面倒ですよね。
いちいちフォームの入力窓に入力して、送信ボタンを押してエラーメッセージを読んでバグをなおして、またフォームに入力して
…なんて、入力項目がものすごく多いフォームだともう気が狂いそうです。
そこで、フォームの入力だけでも一発で実行する方法をまとめました。– macOS 12.4 Monterey
– jupyter lab 3.1.4
– Python 3.9.5jupyter labとpython3はインストールされている状態からスタートします。入っていない人は、インストールしましょう。
jupyter labはjupyter notebookでも大丈夫です。
またローカル開発環境でもテストできる方が便利なので、Google Colaboratoryではやらない方が良いと思います。# jupyter labにプロジェクトファイルを作る
ターミナルで以下のコマンドを叩く。
通常、グローバルでインストールしていると思うのでディレクトリはどこでもOKだと思います。
“`
$ jupyter lab
discord.py V2のスラッシュコマンドを使えるようにする
最近自分が作っているBotでは、discord.py V2のスラッシュコマンドは使い方がわかりにくかった(元々[interactions.py](https://readthedocs.org/projects/discord-interactions/)を使っていた)ため、discord.pyにちょっと似た、[Disnake](https://disnake.dev)を使っていました。
ですが、discord.py V2が結構普及しているみたいだったので、今回はある程度スラッシュコマンドの書き方を理解して紹介していきます。
## 環境
“`
Python 3.10
discord.py 2.1.0
“`
## Botの起動
とりあえずBotの起動をしていきます。
今回の目的はdiscord.py V2でスラッシュコマンドを動かすことなため、app_commandsを使っていきます。
“`python:bot.py
import discord
from discord import app_commandsTOKEN = “”
intents = discord.In
【Python】勉強メモ-その2
# リストをカンマ区切りでテキストに出力
### 1. はじめに
**CSVモジュール**を使えば、効率的じゃないかと思われる方が大半だと思いますが、
**急がば回れ**の精神で、無駄じゃない?と思われるようなことも、最初は、理解のために取り組んでおります。この方法は、ちゃんとしたCSVではありません。
CSVにはRFCという規格でちゃんとフォーマットが決められているんですが、
この簡易的な方法ではその規格には対応できないんですね。たとえばデータの中に
カンマが含まれていた場合は、自分でダブルクオーテーションでエスケープしなきゃいけません。### 2. 数値のリストをカンマ区切りでテキスト出力
これは、文字列ではないため、エラーとなります。
“`sample_01.pyli = [1, 2, 3]
with open(‘test.txt’, ‘w’, encoding=’shift-jis’) as f:
for x in li:
f.write(x)# 結果
# write() argument must be str, not int
python スライスの仕組み
## スライスとは?
>スライス
⇒シーケンスなオブジェクトの要素を指定して、新たなオブジェクトを生成すること。
シーケンス[始まり:終わり:ストライド]というような形で指定する。
特殊メソッドの__getiteam__と__setiteam__を実装したクラスをスライスすることができる。
~~~python
numbers = [0, 1, 2, 3, 4, 5, 6]
print(numbers[:4])
print(numbers[0:3])
print(numbers[-1:0:-1])
print(numbers[0:7:2])>>>
[0, 1, 2, 3]
[0, 1, 2]
[6, 5, 4, 3, 2, 1]
[0, 2, 4, 6]
~~~
# 特殊メソッドとは
各種演算子、組み込み関数などの操作を独自に定義したクラスを利用できるようにするための仕組みのこと。__init__や__str__,__repr__など。# __getiteam__とは、クラスにキーを指定して(辞書型のような)アクセスを可能にさせる特殊メソッド。
~~~python
class
graphvizの矢印について
# 矢印の先端を変えたい!!!
### 結論
線自体はstyle
線の先っちょはarrowhead
で変えられます!## 本文
“` sample_graph.py
import graphvizg = graphviz.Digraph(format=’svg’, filename=’test’)
g.node(“1″,”a”)
g.node(“2″,”b”)
g.node(“3″,”a”)g.edge(“1″,”2”)
g.edge(“2″,”3”)# 表示
g.view()
“`この場合の表示は
![2022-12-11 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243082/35a24074-35b1-4369-1728-b64714dd5955.png)矢印の先端を消して線だけにしたいのに。。。。
## 最初に考えた解決方法
どうせstyle とかallowStyleとかで何とかなるでしょ
→
無理でした“` sample_g
AtCoder Beginner Contest(ABC) 280 – Pythonでのバーチャル参加結果と内容整理
# 1. 前書き
AtCoderBeginnerContest(ABC)の参加結果と内容の整理、および外部の解説記事を参考にした上で、自分なりに解法を整理していきます。
使用言語はPythonで行きます。本業ではJavaかRubyonRailsユーザーですが、計算速度の問題であったり、トレンドに乗っておくという意味でも(こちらが大きい)、Pythonに慣れていきたいと思います。# 2. コンテスト内容
– コンテスト名
– AtCoder Beginner Contest 280
– 開催日時
– 2022/12/3(土) 21:00 – 22:40
– 実施区分
– バーチャル参加
– 2022/12/6(火)# 3. 結果
|区分|結果|所要時間|実行時間|
|:–|:–|:–|:–|
|A問題|AC|4:36|22ms|
|B問題|AC|10:43|22ms|
|C問題|AC|30:28(3)|128ms|
|D問題|WA|-|-|# 4. 解説
## 4-1. A – Pawn on a Grid
### 4-1-1. 問
チートシート【Python】
# よく使う
## エラーハンドリング
### traceback
“`python
import traceback
traceback.format_exc()
“`
## 時間処理
> モジュール
“`python
import datetime
“`
> メイン
“`python
dt = datetime.datetime.now()
dt_str = dt.strftime(“%Y-%m-%d %H:%M:%S”)
dt_minutes = (dt + datetime.timedelta(minutes=-5)).strftime(“%Y-%m-%d %H:%M:%S”)
dt_hours = (dt + datetime.timedelta(hours=-1)).strftime(“%Y-%m-%d %H:%M:%S”)
dt_days = (dt + datetime.timedelta(days=-1)).strftime(“%Y-%m-%d %H:%M:%S”)
dt_years = (dt + datetime.timedelta(years=-1))
pybind11に入門してみた話
# はじめに
こちらの記事は、[eeic (東京大学工学部電気電子・電子情報工学科) Advent Calendar 2022](https://qiita.com/advent-calendar/2022/eeic) の 11 日目の記事として書かれたものです。pybind11 という Python のライブラリを初めて使ってみたので、その紹介を簡単にしようと思います。
# pybind11 とは
Python に C++ の関数やクラスを組み込めるライブラリです。
Python3.6+ と C++ の標準ライブラリのみに依存しているため、余計な依存関係をないのがポイントです。
古いコンパイラを無視して C++11 で書かれたものに限定することによって、軽量なヘッダのみのライブラリとすることができたらしいです。
詳しくは [公式ドキュメント](https://pybind11.readthedocs.io/en/stable/index.html) をご覧ください。チュートリアルも充実しています。# 自作ライブラリの作成
`pybind11_demo` というライブラリを作
リストすべてをstr型からint型を相互に変換する方法
## Map関数を使う
map関数とはリストないすべての要素に関数を適用するというものである。例えば list1[ ‘1’, ‘1’, ‘1’, ‘1’]というリストが有った場合
list1 = map(int , list1)をすることですべて整数型にすることができる。
もちろん逆も同じようにすれば簡単にできる。
【AtCoder】ABC281のA,(B),C,D における Python解説
ABC281のA,(B),C,D問題を解くために考えたこと、ACできるPython3(PyPy3)コードを紹介します。
この記事は @u2dayo さんの記事を参考にしています。見たことのない方はそちらもご覧ください。とても勉強になります。
また、diffは問題の難易度を表す指標です。[Atcoder Problems](https://kenkoooo.com/atcoder/#/table/tsuru1471) から引用しています。このサイトは勉強した問題を管理するのにとてもオススメです。
質問やご指摘はこちらまで
Twitter : [Waaa1471](https://twitter.com/Waaaa1471)作者プロフィール
Atcoder :[緑 855](https://atcoder.jp/users/tsuru1471)
22/1210 現在# 目次
[はじめに](#はじめに)
[A.Count Down](#acount-down)
[B.Sandwich Number](#bsandwich-number)
[C. Circular Playli