IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python Poetryでのパッケージ管理

どうも、nippa です。

Python 記事は久しぶりになります。

今回は Python のパッケージの管理方法についてです。javascript や node.js、typescript だと npm、yarn などのパッケージ管理ツールがあります。

Python では requirements.txt を使って管理することが多い印象ですが、同じパッケージを2重でもったりするため非常に効率が悪くなりがちです。

そこで今回は、npm、yarn などの Python バージョンである Poetry についてまとめたいと思います。

Python Poetry 公式

環境

Poetry システム要件

プラットフォームは Windows/ macOS / Linux に対応しています。 現在は Python 2.7 もしくは Python3.5 以上であれば利用可能となっています。

ただし、公式としては今後システム要件を Python 3.6 以上でマルチプラットフォームで同等になるような対応を目指しているということなので、今後も使える形で記事をまとめたと思います。

Poetry のインストール

macOS / Linux の場合は以下の curl を使ってインストール可能です。

Python 3.6 以上のみ対応

curl -sSL curl -sSL https://install.python-poetry.org | python3 -

pip 等でもインストール可能ですが、公式は推奨していません。なので、推奨方法でのインストールのみ記載しています。

Path の設定

Poetry のインストール先は$HOME/.local/binなので、.zshrc / .bashrc に Path を通します。

# zshrc
echo 'export PATH="$HOME/.local/bin:$PATH"' > ~/.zshrc

# bashrc
echo 'export PATH="$HOME/.local/bin:$PATH"' > ~/.bashrc

以前のバージョンだと$HOME/.poetry/bin:$PATHにインストールされているので注意してください

サブコマンドの補完の設定

Poetry のサブコマンドのタブ補完をログインシェルで有効にしておくと、コマンドを検索する頻度が大幅に減るのでおすすめします。

タブ補完の設定は人により違いますので、環境に合わせて設定してください。

# Zsh (Homebrew)
poetry completions zsh > $(brew --prefix)/share/zsh/site-functions

# Zsh
poetry completions zsh > ~/.zfunc/_poetry

# Bash
poetry completions bash > /etc/bash_completion.d/poetry.bash-completion

# Bash (Homebrew)
poetry completions bash > $(brew --prefix)/etc/bash_completion.d/poetry.bash-completion

これで Poetry の設定は完了です。

プロジェクトでの Poetry の設定

poetry-testを作業ディレクトリとします。

mkdir poetry-test
cd poetry-test

Poetry の初期設定

以下のコマンドで Poetry の初期設定を行います。

poetry init

プロジェクトの設定を聞かれます。必要に合わせて設定します。

This command will guide you through creating your pyproject.toml config.

Package name [poetry-test]:
Version [0.1.0]:
Description []:
Author [(Gitユーザー設定), n to skip]:
License []:
Compatible Python versions [^3.9]:

Would you like to define your main dependencies interactively? (yes/no) [yes]
You can specify a package in the following forms:
  - A single name (requests)
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Search for package to add (or leave blank to continue):

Would you like to define your development dependencies interactively? (yes/no) [yes]
Search for package to add (or leave blank to continue):

Generated file

[tool.poetry]
name = "poetry-test"
version = "0.1.0"
description = ""
authors = ["(Gitユーザー設定)"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"


Do you confirm generation? (yes/no) [yes]

pyproject.tomlが生成され、このファイルに設定が記載されていますので、後ほど変更も可能です。

pyproject.tomlは以下のような内容になっています。

[tool.poetry]
name = "poetry-test"
version = "0.1.0"
description = ""
authors = ["author name"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Porter のパッケージ管理のコマンド

Poetry で使う必要最低限のコマンドをまとめておきます。

  • 本番環境へのパッケージの追加
poetry add [パッケージ名]
  • 開発環境へのパッケージの追加
poetry add -D [パッケージ名]
  • パッケージコマンドの実行
poetry run [コマンド]
  • パッケージの削除
poetry remove [パッケージ名]
  • poetry.lock に記載のパッケージのインストール
poetry install
  • package のアップデート
poetry update [パッケージ名]

インストールしたパッケージは.venv/lib/python[version]/site-packagesにインストールされます。

パッケージを追加するとpoetry.lockが生成され、依存関係が記載されます。

感想

Python でパッケージ管理をするために、Poetry についてまとめました。

他にもパッケージ管理ツールはありますが、しばらく Poetry を使おうと思ってます。

現状の python の環境が複雑化してきており、以下のような状況になっています。

anyenv -> pyenv -> miniconda3(localhost) / poetry(project)

素で anaconda をインストールのは brew との衝突もあるので、したくないところです。

しばらくこの構成で様子をみたいと思います。

ではでは、また次回。

GCP 永久無料枠でインスタンスの作成

どうも、nippa です。

今回 GCP の永久無料枠でインスタンスを作成しようと思います。

インスタンス代は無料ですが、通信量は多少かかるので、完全無料とはなりませんが、月 100 円もかからない予定なので、GCP でテストサーバーを作成します。

前提事項・環境

今回は GCP の契約済みを前提としています。

GCP Compute Engine でのインスタンス作成になります。

他のサービスの無料枠については、こちらを参照ください。

Google Cloud の無料プログラム

インスタンスの無料枠

インスタンスの数に関わらず時間が無料枠になっています。

インスタンスの作成

画像の赤枠が最低限の設定になります。

f:id:NIPPA:20220106233618p:plain
gcp-fig1
今回 OS は Lockey Linux を採用しています。

好きな OS をお選びください。

f:id:NIPPA:20220106233702p:plain
gcp-fig2

ディスクは「標準永続ディスク」で 30GB にしています。

http(80) https(443)ポートの開放

http(80) https(443)を開放する場合、ファイアウォールの http、https にチェックを入 れてください。

f:id:NIPPA:20220106233705p:plain
gcp-fig3

固定 IP アドレスの設定

デフォルトではフィラメント(起動するたびに変更される)であるので、固定 IP アドレ スを取得しておくと便利です。

インスタンスに紐付けされている場合は、料金は無料です。

f:id:NIPPA:20220106233708p:plain
gcp-fig4

f:id:NIPPA:20220106233711p:plain
gcp-fig5

SSH 認証鍵の設定

デフォルトだとプロジェクト全体の SSH 認証鍵が設定されますが、個別の認証鍵も登録 できます。

SSH 認証鍵の作成は local 端末でで作成し、作成した鍵の公開鍵を登録を登録します。

ssh-keygen -t ed25519 -C "example@example.com"

f:id:NIPPA:20220106233713p:plain
gcp-fig6

設定が完了したら、「作成」でインスタンスを作成します。

SSH でのアクセス確認

インスタンスが起動したら、local から SSH 秘密鍵を利用してアクセスします。

ssh -i [ssh private key] [username]@[ip]

インスタンス詳細ページにユーザーと鍵の記載があります。

アクセスが確認できれば、接続は問題ありません。

セキュリティ設定

  • ssh(22)ポートの変更

デフォルトの ssh(22)ポートはすべての IP からアクセスを許可しているため、 SSH のポート変更・フィルタ指定を行う方が良いです。

VPC ネットワークからファイアウォールから設定できます。

感想

今回 GCPインスタンスの作成を行いました。

通信量的に月 100 円以下で、2vCPU/1GB のインスタンスが利用できるのはかなり魅力て きなので、オススメ致します。

ではでは、また次回。

ラズパイ Rocky LinuxのDocker環境構築

どうも、nippa です。

ラズパイ+ Rocky Linux(64bit) の運用を始めましたが、最近便利で使っている Docker 環境を Rocky Linux(64bit) に構築したいと思います。

環境

Docker のインストール

1. Locky Linux のレポジトリを登録します。

sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

2. dnf のアップデート

sudo dnf update

3. Docker CE engine のインストール

sudo dnf install docker-ce docker-ce-cli containerd.io

4. Docker サービスの設定

sudo systemctl enable docker
sudo systemctl start docker

Docker サービスの状態を確認します。

systemctl status docker

5. Docker を利用するユーザーを Docker グループに登録

sudo usermod -aG docker [Username]

# ユーザーグループの確認
id [Username]

docker グループに入っていることを確認します。

6. Docker の実行

グループを変更したユーザーで docker を実行して、確認します。

docker run hello-world

#出力
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
93288797bd35: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

上記のような出力がされれば、docker が利用できています。

docker-compose のインストール

バージョンアップ v1

  • インストール(バージョン 1.29.2)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • アップデート(バージョン 1.29.2)
sudo export DOCKER_COMPOSE_V1_VERSION='1.29.2' curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_V1_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • アンイストール
sudo rm /usr/local/bin/docker-compose
  • 実行方法
docker-compose up -d

バージョンアップ v2

  • インストール(バージョン 2.2.2)

バージョン 2 は CLI plugin として配布されるので、.docker/cli-pluginsにインスト ールする必要があります。

mkdir -p $HOME/.docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x $HOME/.docker/cli-plugins/docker-compose
  • アップデート
export DOCKER_COMPOSE_V2_VERSION='v2.2.2'
curl -SL https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_V2_VERSION}/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x $HOME/.docker/cli-plugins/docker-compose
  • アンイストール
rm $HOME/.docker/cli-plugins/docker-compose
  • 実行方法

プラグインのためハイフンが不要になります。

docker compose up -d

感想

今回 Locky Linux に Docker をインストールしましたが、Linux であればレポジトリの 登録以外同じになります。

そのため、他の Linux でも手順はほぼ同じになります。

勉強にはなりましたので、記事にしました。是非、試してみてください。

ではでは、また次回。

ラズパイ Rocky Linuxのインストール

どうも、nippa です。

久しぶり Raspberry Pi を触り初めました。自宅のサーバとして今後使っていこうと思い 、動かし始めました。

今日は Rocky Linux (64bit) を Raspberry Pi にインストールしたいと思います。

今回は Rocky Linux Wiki を参考に Raspberry に Rocky Linux をインストールします。

環境

  • Raspberry Pi OS 10(ディスク作成用、他の OS でもよい)
  • Rocky Linux 8.5(64bit)

ディスク(マイクロ SD カード)のフォーマット

まず SD カードを接続し、fdisk コマンドでディスクを削除します。parted でも代用可 能ですので、好きな方をお使いください。

ディスクリストの表示をします。

sudo fdisk -l

表示から SD カードのディスクを確認します。今回は/dev/sdaで進めていきます。

パーティションの削除を行った上で、ディスクをフォーマットします。

sudo fdisk /dev/sda

# パーティションの確認
Command (m for help): p

# パーティションの削除
Command (m for help): d
Partition number (1,2,5-7, default 7): # <--- Enter

# パーティションの削除
Command (m for help): d
Partition number (1,2,5,6, default 6): # <--- Enter

# パーティションをすべて削除するまで繰り返えします
# パーティションをすべてを削除したら、新規にパーティションを作成します。

# パーティションの確認
Command (m for help): p

# パーティションの作成
Command (m for help): n
Select(default p): p

# あとはEnterでOK

# パーティションの確認
Command (m for help): p

SD カードを ex4 にフォーマットします。

sudo mkfs.ext4 /dev/sda

# /dev/sdaのフォーマット状況を確認
sudo fdisk -l

これでマイクロ SD カードのフォーマットが完了です。

Rocky Linux のイメージのダウンロード

以下から、Raspberry Pi 用の Rocky Linux のイメージファイルをダウンロードします。

ファイル名:RockyRpi_8.5_20211116.img.xz

https://download.rockylinux.org/pub/rocky/8/rockyrpi/aarch64/images/

Rocky Linux のインストール

ダウンロードしたイメージファイルを SD カードに展開します。

xzcat RockyRpi_8.5_20211116.img.xz > /dev/sda

展開が完了したら、インストールは完了になります。

Rocky Linux の起動

ラズパイに SD カードを挿入して、電源をいれます。

Rocky Linux が起動し、ログイン画面が表示されます。

初期のログイン情報は

  • username: rocky
  • password: rockylinux

になります。

Rocky Linux の設定

ユーザーのパスワード変更

以下のコマンドでパスワードの変更が可能です。

passwd

ネットワークの設定

Wi-Fi のパッチをあてます。ホームディレクトリにパッチ用の Shell script が配置され ていますので、そちらを root ユーザーで実行します。

sudo sh fix-wifi-rpi4.sh

# パスワードはrockyユーザーのもの

まず、インターフェイスの確認をします。

sudo nmcli c

#出力
Wired connection 0  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  wifi      --
Wired connection 1  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  ethernet  --

Wi-Fi に接続します。SSID の確認

sudo nmcli d wifi

# Wi-Fiへの接続
sudo nmcli connection up [SSID]
# パスワードを入力

# 接続の確認
sudo nmcli connection show

自動接続にする場合は、以下のコマンドを実行してください。

sudo nmcli connection modify [SSID] connection.autoconnect yes

WiFi の設定は完了です。

ディスクスペースの拡張

初期段階では、3GB 程度に設定されているので、以下のコマンドでディスクを拡張します 。

# ディスクサイズの確認
df -h

# ディスクの拡張
sudo rootfs-expand

# ディスクサイズの再確認
df -h

感想

今回 Rocky Linux 64bit を Raspberry Pi にインストールしてみました。

Rocky Linux のコミュニティの方がイメージを作成してくれているため、非常に簡単にイ ンストールすることができました。

これで久しぶりに RedHat 系の Linux に触れそうです。

ではでは、また次回。

Docker MySQLの環境構築(その2)

どうも、nippa です。

前回の内容:

timesaving.hatenablog.com

Docker MySQL を docker-compose 化を行います。

ツール化して持っておけば、今後簡単に開発環境ごとにデータベースを用意することがで きるようになります。

環境

ディレクトリ構造

今回は以下のようなディレクトリ構造です。

.
├── docker-compose.yaml
└── mysql/
    ├── data/
    ├── dockerfile
    └── init/
        └── init.sql

datapostgresql のデータが保存されるディレクトリ、initはコンテナの初回起動 時に実行されるスクリプトを格納するディレクトリになります。

dockerfile の作成

dockerfile の内容は前回同様です。

FROM mysql:latest

# Time Zone
ENV TZ Asia/Tokyo

RUN apt update

docker コマンドでビルドする場合は、以下のコマンドで行います。

docker build -t mysql ./mysql

init.sql の作成

初回起動時に実行される SQL スクリプトです。内容は以下の通りです。

users テーブルを作成しています。スキーマの作成は docker-compose の環境変数で行い ます。

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='test';
USE test;

/** CREATE TABLE **/
CREATE TABLE IF NOT EXISTS users (
    id          int AUTO_INCREMENT PRIMARY KEY,
    username    VARCHAR ( 50 ) UNIQUE NOT NULL,
    password    VARCHAR ( 50 ) NOT NULL,
    email VARCHAR ( 255 ) UNIQUE NOT NULL,
    created_on TIMESTAMP NOT NULL
);

docker-compose.yaml の作成

docker-compose.yaml にコンテナの起動情報を記載します。

version: "3"
services:
  db:
    build: ./mysql
    container_name: mysql
    hostname: mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d

上の docker-compose.yaml を docker コマンドで実行する場合は、以下のような形にな ります。

docker run --name db -it -p 3306:3306 \
     -e MYSQL_ROOT_PASSWORD=root \
     -e MYSQL_DATABASE=test \
     -e MYSQL_USER=test \
     -e MYSQL_PASSWORD=test \
     -v ./mysql/data:/var/lib/mysql \
     -v ./mysql/init:/docker-entrypoint-initdb.d
     -d mysql

docker-compose の起動と終了

docker-compose の起動コマンドは以下の通りです。

docker-comppose up -d

docker-compose の終了コマンドは以下の通りです。

docker-comppose down

データベースの確認

以下のコマンドでコンテナの MySQL にログインします

mysql -u test -h 127.0.0.1 -p -D test
Enter password: [パスワードの入力]
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

テーブルの確認を行います。

show tables;

# 出力
+----------------+
| Tables_in_test |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

mysql> select * from users;
Empty set (0.00 sec)

データの挿入をしてみます。

INSERT INTO users (username, password, email, created_on) VALUES ('Yamada Taro', 'yamadatraro', 'yamada-taro@example.com', now());

データの確認を行います。

mysql> select * from users;
+----+-------------+-------------+-------------------------+---------------------+
| id | username    | password    | email                   | created_on          |
+----+-------------+-------------+-------------------------+---------------------+
|  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-21 21:24:20 |
+----+-------------+-------------+-------------------------+---------------------+
1 row in set (0.00 sec)

docker-compose の終了し、再度起動して、データが読み込まれているかを確認します。

# 終了
docker-compose down

# 終了の確認
docker-compose ps

# 出力
NAME                COMMAND             SERVICE             STATUS              PORTS

# 起動
docker-compose up -d

# 起動の確認
docker-compose ps

# 出力
NAME                COMMAND                  SERVICE             STATUS              PORTS
mysql               "docker-entrypoint.s…"   db                  running             0.0.0.0:3306->3306/tcp

データベースへアクセスします。

mysql -u test -h 127.0.0.1 -p -D test
mysql> select * from users;
+----+-------------+-------------+-------------------------+---------------------+
| id | username    | password    | email                   | created_on          |
+----+-------------+-------------+-------------------------+---------------------+
|  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-21 21:24:20 |
+----+-------------+-------------+-------------------------+---------------------+
1 row in set (0.00 sec)

データが保存されていることが確認できました。

感想

PostgreSQL に続き、MySQL での docker-compose 化を行いました。

開発の環境構築が捗ること間違いないですね。

是非、試してみてください。

ではでは、また次回。