kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Python コードでアーキテクチャ図を生成できる Diagrams がめっちゃ便利!

「Diagrams」を使うと Python コードでアーキテクチャ図を生成できる.サポートされているアイコンセットがとても多く AWS や Google Cloud や Microsoft Azure もあれば,Kubernetes やプログラミング言語なども使える.試してみたけどめちゃくちゃ便利!まさに Diagram as Code だ✌️

diagrams.mingrammer.com

セットアップ

「Diagrams」Graphviz に依存しているため,macOS だと pipbrew ですぐにセットアップできる.

$ pip install diagrams
$ brew install graphviz

試してみた

さっそく Examples を参考にアーキテクチャ図を作ってみた!

サンプル : AWS

from diagrams import Cluster, Diagram
from diagrams.aws.compute import EC2, EC2AutoScaling, Lambda
from diagrams.aws.database import Aurora
from diagrams.aws.integration import SQS
from diagrams.aws.network import ALB, Route53
from diagrams.aws.storage import S3

with Diagram('AWS Architecture'):
    route53 = Route53('Route 53')

    alb = ALB('ALB')

    with Cluster('EC2 Auto Scaling'):
        instances = [
            EC2('Instance'),
            EC2('Instance'),
            EC2('Instance')
        ]

    aurora = Aurora('Aurora')

    sqs = SQS('SQS')

    function = Lambda('Lambda')

    s3 = S3('S3')

    route53 >> alb >> instances
    instances >> aurora
    instances >> sqs >> function >> s3

サンプル : Kubernetes

from diagrams import Cluster, Diagram
from diagrams.k8s.compute import Deployment, Pod, ReplicaSet
from diagrams.k8s.network import Ingress, Service
from diagrams.k8s.podconfig import ConfigMap

with Diagram('Kubernetes Architecture'):
    ingress = Ingress('Ingress')

    service = Service('Service')

    with Cluster(''):
        pods = [
            Pod('pod'),
            Pod('pod'),
            Pod('pod')
        ]

    replicaset = ReplicaSet('ReplicaSet')

    deployment =  Deployment('Deployment')

    configmap = ConfigMap('ConfigMap')

    ingress >> service >> pods << replicaset <<  deployment << configmap

サンプル : アプリケーション

from diagrams import Cluster, Diagram
from diagrams.programming.framework import React
from diagrams.programming.language import Go, Java
from diagrams.onprem.database import MySQL, PostgreSQL

with Diagram('SPA Architecture'):
    frontend = React('Frontend')

    with Cluster('Service A'):
        frontend >>  Go('Go API') >> MySQL('MySQL')

    with Cluster('Service B'):
        frontend >> Java('Java API') >> PostgreSQL('PostgreSQL')

Pandas で指数表記を無効化する

Jupyter NotebookPandas のコードを実装しているときに「指数表記を無効化」する場合は pd.optionsdisplay.float_format を設定する.以下にサンプルとして「桁数 2」「桁数 6」の例を載せておく.

# 小数点以下 桁数 2
pd.options.display.float_format = '{:.2f}'.format

# 小数点以下 桁数 6
pd.options.display.float_format = '{:.6f}'.format

pandas.pydata.org

DataFrame で動作確認する 🎯

random.uniform で取得した乱数を3乗した適当な値を DataFrame にする.デフォルト設定だと e+08 のように指数表記になる.

import pandas as pd
import random

df = pd.DataFrame(
    {
        'id': [1, 2, 3],
        'dest': [random.uniform(100, 1000) ** 3, random.uniform(100, 1000) ** 3, random.uniform(100, 1000) ** 3]
    }
)
df

#    id          dest
# 0   1  5.343391e+08
# 1   2  1.095209e+08
# 2   3  5.267437e+08

次に pd.optionsdisplay.float_format'{:.2f}'.format を設定する.桁数 2 で指数表記を無効化できた!

pd.options.display.float_format = '{:.2f}'.format
df

#    id         dest
# 0   1 534339073.50
# 1   2 109520894.40
# 2   3 526743661.86

今度は pd.optionsdisplay.float_format'{:.6f}'.format を設定する.桁数 6 で指数表記を無効化できた!

pd.options.display.float_format = '{:.6f}'.format
df

#    id             dest
# 0   1 534339073.500472
# 1   2 109520894.397633
# 2   3 526743661.855074

Jupyter Notebook の実行結果も載せておく!

関連記事

kakakakakku.hatenablog.com

Pandas で NDJSON (.jsonl) を読み込む

Pandas で NDJSON (Newline Delimited JSON) を読み込む場合 read_json() 関数に lines=True パラメータを設定すれば OK!

pandas.pydata.org

NDJSON サンプル dataset.jsonl

{ "id": 1, "name": "Alice" }
{ "id": 2, "name": "Bob" }
{ "id": 3, "name": "Kakakakakku", "blog":  "https://kakakakakku.hatenablog.com/" }

サンプルコード ndjson.py

import pandas as pd

df = pd.read_json('./dataset.jsonl', lines=True)
print(df)

実行すると期待通りに DataFrame を表示できた!

$ python ndjson.py
   id         name                                 blog
0   1        Alice                                  NaN
1   2          Bob                                  NaN
2   3  Kakakakakku  https://kakakakakku.hatenablog.com/

無料で受験できる Python 新試験「PythonZen & PEP 8 検定試験」に合格した

2022年3月1日に β リリースになった「一般社団法人 Python エンジニア育成推進協会」の新試験「PythonZen & PEP 8 検定試験」に合格した💡現在まだ β だけど合格すると「本認定」になる.PythonZen (PEP 20 - The Zen of Python)PEP 8 から出題されるため,どのように Python で「良いコード(良いとは何だろう?)」を書くかというお作法の理解を確認できる.試験とは言え,受験料は「無料」だし自宅で「24時間いつでも」受験できるから気軽に挑戦してみると良いんじゃないかと✌️

www.pythonic-exam.com

プレスリリースを読んでいたら本試験をリリースした背景が載っていた.Python を知らない人が書いている書籍PythonZen や PEP 8 を知らない講師 と書いてあり,プログラミング教育界隈としては危機的状況に思える.本試験で全てを解決できるとは思わないけど,PythonZen や PEP 8 を意識するきっかけにはなるし価値はあると思う.本試験の普及を応援するためにもブログを書いている.

Python 需要の増加に伴い、Python の関連書籍やプログラミングスクールが増える一方、Python を知らない人が書いている書籍や PythonZen や PEP 8 を知らない講師が、不適切な Python 文法を教えてしまうケースが散見されています。

試験概要 🐍

試験概要は以下のサイトに載っている.申込みをしたらすぐにメールで試験 URL が送られてきて受験できる.場合によっては迷惑メールになるという注意点が載っていたけど Gmail で本当に迷惑メールに判定されていて最初気付かなかった😇

  • 試験名称 : PythonZen & PEP 8 検定試験
  • 概要 : PythonZen (The Zen of Python) と PEP 8 に関する知識を問う試験
  • 受験料 : 無料 ✌
  • 問題数 : 20 問(全て選択問題)
  • 合格ライン : 70 %
  • 試験方式:WBT (Web Based Training) → ビデオ監視など特別な要件はなく気軽に受験できる🌸
  • 出題範囲:PythonZen と PEP 8 より出題

pythonzen-pep8-exam.jp

PythonZen (PEP 20 - The Zen of Python) 🐍

PythonZen (PEP 20 - The Zen of Python) は以下のサイトに載っている.Python を書くときの「格言(心構え)」とも言える.個人的に好きなのは以下!なお Zen を意味している.

  • Readability counts.(読みやすさは重要)
  • Although never is often better than right now.(でも今すぐやるよりもやらない方が良いことも多い)

www.python.org

また Python インタプリタを起動して import this を実行すると PythonZen (PEP 20 - The Zen of Python) を表示できる!

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

PEP 8 🐍

PEP 8 は以下のサイトに載っている.Python の「コーディング規約」としてよく使われていると思う.コードのお作法として良し悪しを宣言している部分もあるし,例えば,文字列に使う引用符である "' は推奨までは宣言せず「統一すること」と書いてあったりもする.最終的には PEP 8 をディスカッションのテーマにして,プロジェクトで決めていく必要がある.

www.python.org

個人的には import 順序の理解が曖昧だったり,Ruby に慣れていて無意識に { eggs: 2 } と書いてしまって不要な半角文字が入ってしまう場合があったりするけど,普段は pycodestylePylint を使って CI で検知している.

github.com

PEP 8 はサンプルコードも載っていて英語でも比較的読みやすいとは思うけど,日本語に翻訳するプロジェクトもあって,更新もされている.以下も合わせて参考にすると良いと思う.

pep8-ja.readthedocs.io

まとめ 🐍

2022年3月1日に β リリースになった「PythonZen & PEP 8 検定試験」に合格した💡ほとんど準備はせず,PythonZen (PEP 20 - The Zen of Python)PEP 8 をザッと1度読んですぐに受験した.1問間違えてしまって「95点」だった.間違えた問題と回答もメールで送られてくるので復習もしやすくて良かった.合格者番号は PEP-0-000233 だからそこそこ早く合格できたかも!(そもそも2日前まで新試験のリリース情報に気付いてなかったことが悔やまれる🌀)

もし PythonZen (PEP 20 - The Zen of Python)PEP 8 どちらも未経験の場合は,サンプルコードを書きながらドキュメントを1,2度読んでみると十分合格ラインには到達できる気がする💪

まとめると「PythonZen & PEP 8 検定試験」は無料で受験できる Python 新試験でおすすめ!特に「合格したから○○」という価値を求めるのではなく,PythonZen (PEP 20 - The Zen of Python)PEP 8 を学ぶことにより,Python でコードを書く前の準備運動になったり,プロジェクトメンバー間で共通認識を築いたりするきっかけとして有効だと思う!

関連試験 🐍

なお「一般社団法人 Python エンジニア育成推進協会」から提供されている「Python 3 エンジニア認定基礎試験」「Python 3 エンジニア認定データ分析試験」も過去に受験して合格している.詳しくは以下の記事を読んでもらえればと!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Scratchpad は便利!Jupyter Notebook で検証用のセルをシュッと追加する

Jupyter Notebook でコードを書いているときに「検証のために一時的にセルを追加してコードを書いて終わったらセルを消す」という操作を頻繁にしている(表現しにくいけど...).些細な操作ではあるけど地味に面倒だった.

そこで「Scratchpad」を使ったら便利だった!「Scratchpad」 nbextensions を有効化すればすぐに使える.Jupyter Notebook の右下に表示されている アイコンをクリック(もしくは Ctrl-B)すると一時的に使えるセルが出てきて書き捨てのコードを気軽に実行できる.

便利だー👏

f:id:kakku22:20211218183323p:plain