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

ITエンジニアのメモ+α

Python Poetry AssertionErrorエラー解消

どうも、nippa です。

Poetry のパッケージ管理で、AssertionError が起きたので解決策をまとめておきます。

環境

  • macOS 11.6
  • poetry 1.1.14

AssertionError の原因

今回起きたのは、pyproject.tomlnameがパッケージ名と同じだったため、AssertionErrorが起きました。

name = "selenium"のときに、selenium をインストールしようとすると起きました。

[tool.poetry]
name = "selenium" <--ここ
version = "0.1.0"
description = ""
authors = ["authors <0000000+authors@users.noreply.github.com>"]

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

[tool.poetry.dev-dependencies]

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

以下のように変更して、再度 selenium をインストールするとインストール可能になりました。

[tool.poetry]
name = "selenium-test" <--変更後
version = "0.1.0"
description = ""
authors = ["authors <0000000+authors@users.noreply.github.com>"]

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

[tool.poetry.dev-dependencies]

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

感想

Poetry のAssertionErrorで悩まれている方の役に立てればと思い、記事に残しておきます。

ではでは、また次回。

Docker 一般ユーザーでのdockerコマンドの利用

どうも、nippa です。

Linux で docker をインストールすると初期設定では root ユーザーでのみでしか利用できません。

今回は、一般ユーザーで利用する方法をまとめておきたいと思います。

環境

  • ubuntu 20.04(VM 上にインストール)

docker のインストール

iso ディスクでの ubuntu 20.04 をインストールすると、インストール時のオプションとして docker をインストールすることができます。その場合、sanp でインストールされます。

snap でインストール場合は、以下のコマンドで docker をインストール可能です

sudo snap install docker

docker グループの作成・確認

docker グループが作成されているかを以下のコマンドで確認します。

cat /etc/group | grep docker

docker グループが作成されていない場合は、以下のコマンドで作成します。id は指定しなくても問題ありません。

sudo groupadd docker --gid [グループID]

グループの確認をします。

cat /etc/group | grep docker

ユーザーに docker グループを追加する

ユーザーのグループを確認します。

groups [ユーザー名]

docker グループに含まれてない場合は、

sudo usermod -aG docker [ユーザー名]

で追加します。

一般ユーザーで docker を実行する

グループ情報を変更したので、セッションを接続したまま情報を以下のコマンドで更新します。

newgrp docker

docker を実行します。

docker run hello-world

以下のようなエラーが出る場合は、sock の権限が正しくありません。

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.

以下のコマンドで sock の権限を変更してください。

sudo chmod 666 /var/run/docker.sock

権限変更後、docker のテストコマンドを実行し、以下の結果が表示されれば、一般ユーザーでの実行が可能となったことになります。

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.
    (amd64)
 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/

感想

Linux を docker をインストールするといつも設定を忘れてしまうので、記事にまとめておきました。

一般ユーザーで使えた方が便利ですので、設定してみてください。

ではでは、また次回。

Python 人名データセットを使ってみる

どうも、nippa です。

膨大なテストデータを生成するために、人名のデータセットを使ってみようと思います。

今回試してみるのは、names-datasetになります。

README を見る限り、結構充実してるように思います。

このデータセットFacebook からリークされた情報から生成されていますが、個人が特定できません。

ライセンス部分には、一般的には”名前の一覧”には著作権はないとのことですが、必要なら弁護士に確認取ってねと書かれてます。

環境

ライブラリのインストール

  • pip インストール
pip install names-dataset
  • poetry インストール
poetry add names-dataset

依存関係は pycountry のみです。

使い方

データセットを初期化して、名前の検索、データの詳細確認、国ごとの名前を上位から表示ができます。

コードを見る限り、他の使い方はなさそうです。

名前の検索

from names_dataset import NameDataset, NameWrapper

# データセットの初期化
nd = NameDataset()

# 名前の検索
print(nd.search("Taro"))

結果 (整形済)は以下のようになります。

{
    "first_name": {
        "country": {
            "France": 0.05,
            "United Kingdom": 0.063,
            "Hong Kong": 0.046,
            "Iraq": 0.031,
            "Italy": 0.059,
            "Japan": 0.463,
            "Malaysia": 0.091,
            "Netherlands": 0.044,
            "Singapore": 0.041,
            "United States": 0.112,
        },
        "gender": {"Female": 0.11, "Male": 0.89},
        "rank": {
            "United Kingdom": 9740,
            "Hong Kong": 6121,
            "Japan": 156,
            "Malaysia": 13690,
            "Netherlands": 7182,
            "Singapore": 7227,
            "France": None,
            "Iraq": None,
            "Italy": None,
            "United States": None,
        },
    },
    "last_name": {
        "country": {
            "France": 0.106,
            "India": 0.054,
            "Italy": 0.147,
            "Japan": 0.038,
            "Morocco": 0.059,
            "Malaysia": 0.439,
            "Nigeria": 0.03,
            "Saudi Arabia": 0.036,
            "Singapore": 0.032,
            "United States": 0.059,
        },
        "gender": {},
        "rank": {
            "India": 9676,
            "Japan": 1748,
            "Malaysia": 4161,
            "Singapore": 6564,
            "France": None,
            "Italy": None,
            "Morocco": None,
            "Nigeria": None,
            "Saudi Arabia": None,
            "United States": None,
        },
    },
}

日本での first_name で 156 位と表示されています。first_name で性別の割合も出てます。

名前を Wrapper して詳細表示

NameWrapper を使うと、

print(NameWrapper(nd.search("Taro")).describe)

# 出力
Male, Japan

Taro は日本人男性というような形で表示されます。

国別の名前ランキング

日本人の男性トップ 5 を表示します。

print(nd.get_top_names(n=5, gender='Male', country_alpha2='JP'))

# 出力 (整形済)
{
    "JP": {
        "M": [
            "Takashi",
            "Hiroshi",
            "Yusuke",
            "Daisuke",
            "Akira",
        ]
    },
}

日本の男女トップ 3 をそれぞれ表示すると、

print(nd.get_top_names(n=3, country_alpha2="JP"))

# 結果(整形済)
{
    "JP": {
        "M": ["Takashi", "Hiroshi", "Yusuke"],
        "F": ["Yuki", "Yuka", "Yuko"],
    },
}

のようになります。

フルデータセット

インストール時は、50MB 程度のファイルしかないためフルデータを利用する場合は、

Github の README のフルデータセットのダウンロードからデータをダウンロードして、ライブラリの中の

names_dataset/v3/に配置すればフルサイズ(2.3GB)で利用できます。

ただし、50MB でも実行時間が少しかかるので、フルサイズは時間がかかることが予想されるのでご注意ください。

感想

データセットから、ランダムで人名生成するときには使えそうなライブラリです。

テストデータ生成などで役に立ちそうです。

ではでは、また次回。

Python ランダムな文字列生成

どうも、nippa です。

テストデータ作るときに、数字は簡単に乱数生成できますが、

文字列はどうするのか気になったので、まとめておきます。

環境

アルファベット 1 文字のランダム生成(chr)

1 文字のアルファベットの生成は chr と乱数を使って生成できます。

アルファベットの小文字は chr で ASCII コードポイント 97 から 123 を指定することで表示できます。

for n in range(97, 123):
     print(chr(i))

指定する i を乱数で指定すればアルファベットをランダムは 1 文字生成できます。

import random

# 小文字 a-z
print(chr(random.range(97, 123))

大文字の場合は chr の ASCII コードポイントは 65 から 91 になります。

import random

# 大文字 A-Z
print(chr(random.range(65, 91))

アルファベット 1 文字のランダム生成(string)

python 標準の string を利用する方法だと、少し手間ですが、文字列生成のときは便利です。

import string

# 小文字 a-z
for n in string.ascii_lowercase:
     print(n)

# 大文字 a-z
for n in string.ascii_uppercase:
     print(n)

# 小文字・大文字 a-Z
for n in string.ascii_letters:
     print(n)

# 数字(10進数)
for n in string.digits:
     print(n)

# 数字(16進数)
for n in string.hexdigits:
     print(n)

# Cロケールにおける区切り文字 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
for n in string.punctuation:
     print(n)

公式のページを見てもらうと String ライブラリの詳細が書かれています。

random ライブラリを使ってランダム生成します。

import random
import string

# 小文字 a-z
random.choice(string.ascii_lowercase)

# 大文字 a-z
random.choice(string.ascii_uppercase)

# 小文字・大文字 a-Z
random.choice(string.ascii_letters)

# 数字(10進数)
random.choice(string.digits)

# 数字(16進数)
random.choice(string.hexdigits)

# Cロケールにおける区切り文字 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
random.choice(string.punctuation)

ランダムな文字列の生成

上で述べた、String ライブラリと random ライブラリを利用した文字のランダム生成を任意の長さに拡張します。

小文字だけの場合、

import random
import string


n = 10
random_list = [random.choice(string.ascii_lowercase) for n in range(n)]
random_chr = "".join(random_list)

print(random_chr)

で生成できます。 n の値を変えれば任意になるので関数化すると、

import random
import string


def ramdom_lowercase(n: int) -> str:
    random_list = [random.choice(string.ascii_lowercase) for n in range(n)]
    return "".join(random_list)

となります。大文字・小文字・区切り文字からランダム生成する場合は、

import random
import string


def ramdom_chr(n: int) -> str:
    random_list = [random.choice(string.ascii_ascii_letters + string.punctuation) for n in range(n)]
    return "".join(random_list)

で関数化できます。

感想

テストデータでデータを突っ込むときに使えるかと思いまとめてみました。

手作業で作っていられない膨大なデータはこれで生成しましょう!

ではでは、また次回。

Next.js + Typescriptの環境構築

どうも、nippa です。

フロントを触り始めるために、Next.js を利用しようと思っています。

今回は Next.js + Typescript の環境構築方法を紹介します。

環境

1. create-next-app を利用した構築

今回は create-next-app を使って、環境を構築します。

# npmの場合
npx create-next-app@latest --typescript

# yarnの場合
yarn create next-app --typescript

実行方法は以下の通りです。

# npmの場合
npx dev

# yarnの場合
yarn dev

デフォルトであればlocalhost:3000で起動されます。

2. create-next-app コマンドをインストールして、環境構築

テンプレートを使う場合に便利なので、インストールしておいても良いかもしれません。

# npmの場合
npm install --global @create-next-app

# yarnの場合
yarn global add @create-next-app

create-next-app でのテンプレートを指定して、環境を構築できます。

create-next-app [プロジェクト名] --typescript --template [テンプレート名]

テンプレート一覧はここから確認できます。

テンプレートを利用しない場合は、テンプレートオプションを利用しないか、値をdefaultにしてください。

テンプレートによっては development のパッケージがインストールされないものがありますので、package.jsonを確認の上、以下をインストールしてください。

# npmの場合
npm install --save-dev typescript @types/react @types/react-dom @types/node

# yarnの場合
yarn add --save-dev typescript @types/react @types/react-dom @types/node

next の起動は、

# npmの場合
npx dev

# yarnの場合
yarn dev

で起動して、デフォルトであればlocalhost:3000で起動されます。

3. 手動で必要なパッケージをインストール

# npmの場合
npm install next react react-dom

# yarnの場合
yarn add next react react-dom

packege.jsonは自身で修正が必要です。

感想

next.js の環境構築方法をざっとまとめてみました。

create-next-app とテンプレートを利用するのが便利かと思います。

next.js はこれからなので、是非使ってみてください!

ではでは、また次回。