環境構築

GitHubのRSA鍵が変更された!鍵交換の対応手順

こんにちは、ウチイダです。

GitHubのリモートリポジトリへpush しようとしたところ、以下のようにエラーが表示されました。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
Add correct host key in ~/.ssh/known_hosts to get rid of this message.
Offending RSA key in ~/.ssh/known_hosts:1
  remove with:
  ssh-keygen -f "~/.ssh/known_hosts" -R "github.com"
RSA host key for github.com has changed and you have requested strict checking.

ローカルに保持している接続先情報と違うサーバーにつながったよ、とのこと。

中間者攻撃かもしれないと書かれており、ちょっとドキッとしますよね。。。

調べてみたところ、公式からアナウンスが出ていました。

GitHubサーバーの秘密鍵を、公開リポジトリに置いてしまったのとこと…

短時間ってどのくらいなんでしょうね…?

このセキュリティインシデントに対する措置として鍵を取り換えたということのようです。

新しい内容で接続できるように変更しておきます。

やることは特に難しくなく、古い情報を破棄して新しい情報に差し替えるだけです。

# 古い鍵情報の破棄
$ ssh-keygen -R github.com
/home/y-uchiida/.ssh/known_hosts updated.
Original contents retained as /home/y-uchiida/.ssh/known_hosts.old

# 新しい鍵情報を追加
$ ssh -T github.com
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM. # 表示される鍵情報が正しいものか確認
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes # yes を入力
Warning: Permanently added 'github.com' (ECDSA) to the list of known hosts.
Hi y-uchiida! You've successfully authenticated, but GitHub does not provide shell access.

アナウンスだと、known_hosts に接続先情報を手動追加、もしくはコマンドで追加するように記載されていましたが、少し違う方法を取りました。

ssh -T github.com で接続テストをすると、known_hosts に接続先の情報がなければ確認を出してくれます。

ここでyes を入力すれば、接続先情報がknown_hosts に登録されます。

以下のページで、GitHubの公開鍵が一覧化されています。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints

接続確認時に表示された公開鍵が、いずれかに一致していれば問題ありません。

以上です。あなたのお役に立てれば幸いです。

Python, Djangoをきちんと使いたい_03: mypy で型安全を得る

皆さまこんにちは、ウチイダです。

時間を見つけてはDjango で中規模以上のアプリケーションを開発するための環境構築について調べています。

前回の記事はこちら。

ウチイダの作業環境は以下です。

  • Windows 11 21H2
  • WSL2 Ubuntu20.04
  • GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

以降の内容は、この環境にPython/Djangoの開発環境を導入していく手順メモとなります。

転ばぬ先の型チェック

今回は、型チェッカーを導入します。

TypeScript + React をやり始めてから、実行時エラーで悩むことが激減しました。

Pythonでもそういう開発体験ができるといいなあと思って、型チェッカーを使っていくことにしました。

Pythonでは、TypeScriptのような静的型付けの機能を持ったスーパーセット言語はなさそうですが、型ヒント(Type hinting)が機能としてついているので、これを使うと型不整合を検出できるようです。

型の不整合をチェックするツールとしては、mypy がメジャーなようなので、これを導入していきます。

http://mypy-lang.org/index.html

エラーチェックツールとしては、VSCodeの拡張機能であるPylance も人気があります。

しかし、こちらはあくまでVSCode上でチェックをしてくれるもので、CLIで任意のタイミングに実行することができません。

チーム開発で使うことを考えて、Gitのpre-commitやレビュー実施時にCLIから実行をすることを考えて、mypyを採用します。

おことわり

mypy の導入にあたってはスムーズに行かなくてけっこう試行錯誤しました。

うまくいかない経緯も何らかのお役に立てるかもしれないと思い、なるべくそのまま掲載しています。

シンプルな導入手順を知りたい方にとっては冗長かもしれません。そのうちきれいに手順をまとめようと思います。

mypy のインストール

Poetry で導入する場合の例です。

$ poetry add --group dev mypy
The --dev option is deprecated, use the `--group dev` notation instead.
Using version ^0.991 for mypy

Updating dependencies
Resolving dependencies... (0.3s)

Writing lock file

Package operations: 2 installs, 0 updates, 0 removals

  • Installing typing-extensions (4.4.0)
  • Installing mypy (0.991)

pip でインストールする場合は以下のようにコマンドを実行します。

$ pip install mypy

これだけで導入は完了です。

CLI からチェックを試す

ためしに、あえて型不整合があるスクリプトを書いて、それをチェックしてみます。

import datetime

var: datetime.datetime = "foo"

mypy でのチェックは、mypy <対象ファイル> で行います。

$ mypy mypy_test.py
mypy_test.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "datetime")  [assignment]
Found 1 error in 1 file (checked 1 source file)

datetime と str で型エラーが出ました!

ところで、上記のスクリプトって実行時エラーにもならないんですね…

VS Code 上で警告を表示する

続いて、VS Codeのエディタ上に型不整合のエラーを表示していきます。

VS Code上の設定項目にmypy が入ってるので、これを有効にします。

Mypy Enabled にチェックを入れる

ウチイダこれだけでOKでした。

さらに、プロジェクト全体を自動でチェックしてくれるように、Mypyの拡張機能も導入してみます。

上記の設定だと、ひらいてるファイルのチェックしかしてくれないようなんですよね…

mypy をシステムグローバルにインストールしていない(プロジェクトごとの仮想環境にしかインストールしていない)場合、mypy daemon が見つからない、という警告が出る場合があります。

mypy daemon が見つからないエラー

公式ドキュメントを見てみると、mypy server プロセスを起動させて置きそれに型チェックをさせるしくみがあるようです。

VS Codeはこれと連携して、チェックをしているみたいですね。

https://mypy.readthedocs.io/en/stable/mypy_daemon.html

さらに、mypy の拡張機能の説明文を読んでみると、仮想環境上のmypy を利用する場合は、 mypy.RunUsingActiveInterpreter をEnable にするように、と書いてありました。

仮想環境のmypy を使う場合の指示

設定をしたところ、エラーが消えました!

Dmypy.Executable はデフォルト値のままでOKです。

これで基本の設定は完了です。

返り値の型指定がない関数の内部はチェックされない

基本の設定は完了…と思っていたのですが、まだもう少し続きます。

どんなパターンでエラーが出るのか、いろいろ試していたところ、間違っていそうなのにVS Code で警告されないものがありました。

str 型の変数に、わざわざint キャストした整数値を代入しています。

def main():
    num_string: str = int(2)
    print(f"test: {num_string}")


if __name__ == "__main__":
    main()

それでも、エラーになりません。

エディタ上でも、CLIでもエラーにならない

よく見ると noteのところに、untyped な関数の内部はデフォルトではチェックしないので、 –check-untyped-defs を使ってみて、と書いてあります。

オプションを加えてチェックを再実行したところ、エラーになりました。

–check-untyped-defs オプションをつけるとエラーになる

untyped function というのは、返り値の型を定義していない関数のことのようです。

というわけで、 main() の返り値としてNoneを指定してみます。

返り値を設定したら、エラー検出された

untyped function ではなくなったので、エディタ上でも検出してくれました。

VS Codeでのチェックにオプションを設定する

型注釈がない関数が、VS Code上で警告されないのはつらいです。

調べてみたところ、VS Code の設定から、 mypy のチェックオプションを設定できるようでした。

設定画面を開いて、 python.linting.mypyArgs から設定できます。

ひとまず、–check-untyped-defs を追加しました。

python.lintinh.mypyArgs に –check-untyped-defs を追加

すると、 main() の返り値に型注釈がなくてもエラーを検出してくれました!

unyped-function の内部も、エディタ上で警告されるようになった

mypy のチェックオプション

オプションとして設定できる項目はいろいろあるようです。

https://mypy.readthedocs.io/en/latest/command_line.html#specifying-what-to-type-check

Python の型ヒントの仕様とあわせて理解すれば、良い感じの制限を作れそうです。

VS Code の設定を共有する

VS Code をチームで統一して使っている場合、その動作も統一したくなります。

mypy はけっこう設定の作業項目が多いので、可能なら全員で同じ設定ファイルを共有してしまうのがよいと思います。

プロジェクト内に .vscode/settings.json を作って、Git リポジトリに共有するだけでいいのでお手軽ですね。

mypy の設定は、json でみると今のところこんな感じになっています。

{
  "python.linting.mypyEnabled": true,
  "mypy.runUsingActiveInterpreter": true,
  "python.linting.mypyArgs": [
    "--follow-imports=silent",
    "--ignore-missing-imports",
    "--show-column-numbers",
    "--no-pretty",
    "--check-untyped-defs"
  ]
}

もう少しきちんと設定ファイルを作りたいです。。。

まとめ

とりあえずCLIと、VS Code上での型不整合の検出ができるようになりました。

TypeScriptもそうですが、設定周りで覚えることが多いので、もっと使い慣れていく必要があるなと思いました…

というわけで、今回はここまで。

あなたのお役に立てればうれしいです。

参考資料

https://ohke.hateblo.jp/entry/2020/10/03/230000

https://mypy.readthedocs.io/en/latest/mypy_daemon.html

https://future-architect.github.io/articles/20201223/

https://mypy.readthedocs.io/en/latest/command_line.html#specifying-what-to-type-check

VSCode で、PythonのGotoDefinitionが動かない – Language Serverの設定を見直す

皆さまこんにちは、ウチイダです。

Pythonの環境設定をいろいろ試しているところで、タイトルの事象が発生しました。

VSCodeでは、コード上の変数やクラス名にカーソルを置いてF12を押すと、その定義を開いてくれる機能があります。

その機能がいつの間にか使えなくなっていました。

「定義が見つからない」と表示される

原因:LSPが設定できていなかった

定義へ移動する機能は、LSP(Language Server Protocol)によって実現されています。

詳細はこちらで…

https://github.com/microsoft/language-server-protocol

VSCodeで編集している内容に対して、このLanguage Serverを介して機能を提供する仕組みです。

そのため、Language Serverが動作していないといけないということになります。

通常はVSCode起動時に、指定されたLanguage Serverが起動するようになっているはずです。

そこで、VSCode の設定を確認してみたところ、Python のLanguage Server で「None」が選択されており、を起動しない設定になっていました。

これを「Default」に変更したところ、改善しました。

Mypyを導入する際に既定のLanguage Server であるPylanceと併存できるかいろいろ調べていたので、その時にやってしまったのかもしれません。

原因究明するまでに結構時間がかかってしまいました。

以上です。あなたのお役に立てればうれしいです。

Python, Djangoをきちんと使いたい_02: Poetry でパッケージ管理

皆さまこんにちは、ウチイダです。

Python開発環境を整えるメモ、今回はパッケージ管理の仕組みをやっていきます。

前回はpythonランタイムのバージョン管理のためにpyenv を導入しました。

ウチイダの作業環境は以下です。

  • Windows 11 21H2
  • WSL2 Ubuntu20.04
  • GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

以降の内容は、この環境にPython/Djangoの開発環境を導入していく手順メモとなります。

Python のパッケージ管理ツール

公式かつ最大手のpip

パッケージ管理ツールは公式からpip が提供されていますが、どうやら依存解決に難があるようなのです。

pip install しても、composer やnpmみたいに lock ファイルとかできないですしね…

あと、依存解決でインストールされたパッケージが、他からの依存がなくなっても削除されなかったりするようです。

ウチイダは基本的に公式のツールを使っていきたいスタンスですが、これはさすがに不安が残ります。

Pipenv, Poetry, Pyflow

というわけで、ほかの言語のパッケージ管理ツール機能を持ったサードバーティのツールを調べてみました。

Pipenv, Poetry, Pyflow の3つが有力っぽいです。Pipenv が先にリリースされて、そのあとにPoetry、 Pyflow の順番でリリースされています。

いろいろ調べたのですが、タイトルの通りPoetry を使ってみることにしました。

https://python-poetry.org/

比較は今回の趣旨ではないので、ごく簡単に理由を書いておくことにします。

  • PEPで策定されてる形式の設定ファイル(pyproject.toml)ひとつで管理できる方式
  • pyproject.toml が使えるのがPoetry とPyflow
  • Pyflow はまだ安定してないっぽい(バージョン1になってない)

選定が妥当かどうかはわかりません。技術選定の審美眼ほしい。

インストール

# 1. インストール用のスクリプトを読み込んで実行
$ curl -sSL https://install.python-poetry.org | python3 -
Retrieving Poetry metadata

# Welcome to Poetry!

This will download and install the latest version of Poetry,
a dependency and package manager for Python.

It will add the `poetry` command to Poetry's bin directory, located at:

/home/y-uchiida/.local/bin

You can uninstall at any time by executing this script with the --uninstall option,
and these changes will be reverted.

Installing Poetry (1.2.2): Done

Poetry (1.2.2) is installed now. Great!

To get started you need Poetry's bin directory (/home/y-uchiida/.local/bin) in your `PATH`
environment variable.

Add `export PATH="/home/y-uchiida/.local/bin:$PATH"` to your shell configuration file.

Alternatively, you can call Poetry explicitly with `/home/y-uchiida/.local/bin/poetry`.

You can test that everything is set up by executing:

`poetry --version`

# 2. パスが通っていなければ、以下を追加
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

# 3. poetry が実行できれば完了!
$ poetry --version

Poetry のアップデート

インストールした直後なので不要ですが、未来の自分のためにメモ。

poetry self update で更新します。

$ poetry self update
Updating Poetry version ...

Using version ^1.2.2 for poetry

Updating dependencies
Resolving dependencies... Downloading https://files.pythonhosted.org/packages/d1/20/4c2ea55d6547460a93dce9112599953be1c9Resolving dependencies... Downloading https://files.pythonhosted.org/packages/1d/38/fa96a426e0c0e68aabc68e896584b83ad1eeResolving dependencies... Downloading https://files.pythonhosted.org/packages/76/cb/6bbd2b10170ed991cf64e8c8b85e01f2fb38Resolving dependencies... (25.9s)

Writing lock file

No dependencies to install or update

Poetry のアンインストール

インストールしたばかりなのでこちらも不要ですが、未来の自分のためにメモ。

インストールのコマンドの最後に –uninstall オプションをつけるだけです。削除のためのモードも含めてるんですね。

$ curl -sSL https://install.python-poetry.org | python3 - --uninstall
Removing Poetry (1.2.2)

Poetry でプロジェクトを作る

空のプロジェクトを作るなら、poetry new <プロジェクト名>、

既存のディレクトリに作成する場合はpoetry init です。

# 新しくプロジェクト用のディレクトリを作る場合
$ poetry new porty_new_sample
Created package porty_new_sample in porty_new_sample

# 既存のディレクトリにプロジェクトを追加する場合
$ poetry init

Poerty で仮想環境を作る

Poetry はPythonのバージョン管理こそできませんが、仮想環境を作成することができます。

Python の公式ツールとなったvenv でも仮想環境は作れますが、仮想環境を起動してからスクリプトを実行しないといけないのですこし面倒です。

poetry は、そのCLIから仮想環境のランタイムで指定のスクリプトが実行できるので、開発中のコマンド実行が少し楽になるかもしれません。コマンド実行ごとのタイプ量が増えるので、一長一短かも。

仮想環境の作成先を設定

デフォルトの設定では、Poetryの仮想環境は$HOMEディレクトリ配下の専用ディレクトリに作成されます。

どの仮想環境が実行されているのかわかりづらくなるので、プロジェクトのディレクトリ内にあったほうがいいな…と思います。

というわけで、プロジェクトディレクトリ内に仮想環境が作成されるように、設定をしておきます。

$ poetry config virtualenvs.in-project true

これで、仮想環境は各プロジェクトのディレクトリ内に作成されます。

デフォルトでは.venv というディレクトリ名のようです。

仮想環境を作成・実行する

現在のターミナルで仮想環境に入るときは poetry shell、

仮想環境でコマンドを実行する場合はpoetry run <実行するコマンド>です。

# 仮想環境に入る
poetry_venv_test$ poetry shell
Spawning shell within /home/y-uchiida/poetry_venv_test/.venv
. /home/y-uchiida/poetry_venv_test/.venv/bin/activate
poetry_venv_test$ . /home/y-uchiida/poetry_venv_test/.venv/bin/activate
(poetry-venv-test-py3.11) :poetry_venv_test$

# 出る時はexit (deactivate でもOK)
(poetry-venv-test-py3.11) :poetry_venv_test$ exit

パッケージのインストール

では本題、パッケージのインストールです。

ためしにDhango 3.2 をインストールしてみます。

# パッケージを追加
$ poetry add django==3.2
Creating virtualenv poetry-add-pachage-sample in /home/y-uchiida/poetry_add_pachage_sample/.venv

Updating dependencies
Resolving dependencies... (0.1s)

Writing lock file

Package operations: 4 installs, 0 updates, 0 removals

  • Installing asgiref (3.5.2)
  • Installing pytz (2022.6)
  • Installing sqlparse (0.4.3)
  • Installing django (3.2)

# poetry.lock ができてる!
$ ll
total 28
drwxr-xr-x 5 y-uchiida y-uchiida 4096 Nov 22 16:02 ./
drwxr-xr-x 5 y-uchiida y-uchiida 4096 Nov 22 16:01 ../
drwxr-xr-x 4 y-uchiida y-uchiida 4096 Nov 22 16:02 .venv/
-rw-r--r-- 1 y-uchiida y-uchiida    0 Nov 22 15:42 README.md
-rw-r--r-- 1 y-uchiida y-uchiida 2131 Nov 22 16:02 poetry.lock
drwxr-xr-x 2 y-uchiida y-uchiida 4096 Nov 22 15:42 poetry_add_pachage_sample/
-rw-r--r-- 1 y-uchiida y-uchiida  356 Nov 22 16:02 pyproject.toml
drwxr-xr-x 2 y-uchiida y-uchiida 4096 Nov 22 15:42 tests/

poetry.lock の中身は長いので載せませんが、テキストファイルになっているので普通に読めます。

[[package]] と [package.dependencies] がセットになって、依存関係を表現しているようです。

Poetry にタスク実行機能はないのか

さて、ここまでくると、開発中に利用できるタスクランナーの機能が欲しくなってきます。

結論から言うと、Poetry はタスクランナーの機能は付いていません。

poetry run でそういうことができないのか調べてみたのですが、どうも目的が違うようです。

別のツールを使うか、Makefileなどでショートハンドを作ったりするのがよさそうです。

まとめ

今回はPoetry を利用してパッケージの依存関係ができるようにしてきました。

ウチイダはとても便利だと思ったのですが、公式の強さか、最も利用されているのはpipのようです。

依存関係が管理できないとなんだか不安なのは、Node.js やPHP での経験があるからこそでしょうか…

いずれにしても、効率的なチーム開発にはあったほうがよいでしょうし、導入している例も結構多いようなので、触っておいて損はないかなと思います。

以上です。あなたのお役に立てればうれしいです。

Python, Django をきちんと使いたい 01: Pythonのバージョン管理のためにpyenv を導入【Win11/WSL2-Ubuntu】

皆さまこんにちは、ウチイダです。

Python/Djangoの案件にかかわることになりそうで、改めて勉強しなおそうと思っています。

Djangoはチームの開発で使ったことがなかったので、これを機に周辺ツールの知識もまとめておくことにしました。

ウチイダの作業環境は以下です。

  • Windows 11 21H2
  • WSL2 Ubuntu20.04
  • GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

以降の内容は、この環境にPython/Djangoの開発環境を導入していく手順メモとなります。

まずはPythonのバージョン管理ツールから

何はともあれ、ランタイムのバージョン管理を入れることにします。

Node.js のnodenv やvolta とか、PHP のphobrew みたいなものを探してみます。

調べたところ、pyenv がよくつかわれているようです。

https://github.com/pyenv/pyenv

anyenv にも含まれているツールです。rbenv をフォークしてPython 用にしたものだとのこと。

メンテナンスも継続されてるようなので、pyenvを使うことにしました。

インストールする

未来の自分が別の環境でコピペ利用できるように、なるべく汎用的なやり方にしておきます。

GitHubのREADMEに情報がまとまっているので、これに沿って進めれば大丈夫そうです。

https://github.com/pyenv/pyenv#basic-github-checkout

GitHub のリポジトリをクローンする方法で進めます。

READMEに書いてあるのそのままですが、実行するコマンドと出力結果例は以下です。

以下のコマンドをコピペで大丈夫だと思うのですが、いくつか留意すべき点があります。

# 1. リポジトリをclone する
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
Cloning into '/home/y-uchiida/.pyenv'...
remote: Enumerating objects: 22214, done.
remote: Counting objects: 100% (282/282), done.
remote: Compressing objects: 100% (154/154), done.
remote: Total 22214 (delta 141), reused 237 (delta 112), pack-reused 21932
Receiving objects: 100% (22214/22214), 4.49 MiB | 4.40 MiB/s, done.
Resolving deltas: 100% (15003/15003), done.

# 2. 高速化のためのBash拡張のコンパイル(やらなくてもOK)
$ cd ~/.pyenv && src/configure && make -C src
make: Entering directory '/home/y-uchiida/.pyenv/src'
gcc -fPIC     -c -o realpath.o realpath.c
gcc -shared -Wl,-soname,../libexec/pyenv-realpath.dylib  -o ../libexec/pyenv-realpath.dylib realpath.o
make: Leaving directory '/home/y-uchiida/.pyenv/src'

# 3-1. ~/.bashrc にpyenv の設定を追加(pyenv がデータを保存するディレクトリを指定)
$ echo "#setting for pyenv" >> ~/.bashrc
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# 3-2. 同じ内容を、 ~/.bash_plofile にも追加する
$ echo "#setting for pyenv" >> ~/.bash_profile
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

# 4. 設定を読み込み
$ source ~/.bashrc

# .5 pyenv が実行できれば完了!
$ pyenv -v
pyenv 2.3.6-15-g13d85686

補足・留意点

1. Bash 設定ファイルについて

上記コマンドの中で、.bashrc と.bash_profile にpyenv の設定を追加していますが、READMEによると$HOMEにあるbashの設定ファイル全部に書いとくと安心、とのことです。

ウチイダは自身の$HOME ディレクトリに上記の2つだけしか存在してなかったので、これだけ設定しています。

人によっては .profile とか、.bash_login があるかもしれないので、その場合は同じように追記しておくとよさそうです。

2. $BASH_ENV 環境変数について

$BASH_ENV が .bashrc に設定されてる場合の注意点が記載されてます。

この場合、eval “$(pyenv init -) を .bashrc に記述しておくと、pyenv が無限ループを起こしてしまうとのこと…

echo $BASH_ENV で設定値を確認して、もし.bashrc になっていたら、eval の行は .bashrc から取り除いておきます。

pyenv でPythonをインストール

いくつかの罠を越えてpyenv をインストールできたら、さっそく使っていきましょう。

# 1. インストール可能なバージョンの一覧を表示
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4.0
# ... 以下略

# 2. バージョンを指定してインストール(3.10.x)
$ pyenv install 3.10
Downloading Python-3.10.8.tar.xz...
-> https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tar.xz
Installing Python-3.10.8...
Installed Python-3.10.8 to /home/y-uchiida/.pyenv/versions/3.10.8

# 3. デフォルトで動作するバージョンを設定
$ pyenv global 3.10
$ python --version
Python 3.10.8

# 4. 現在のディレクトリで動作するバージョンを指定
$ pyenv local 3.10

pyenv local は、実行したディレクトリに.python-version というファイルを作って、そこに利用するバージョンを書き込んでいます。

.python-version ディレクトリ階層をみて、直近の上位ディレクトリの.python-version に記載されたバージョンを使ってくれます。

そのほかの使い方は、pyenv –help を実行すると詳しく出てきます。

まとめ

pyenv を導入して、バージョン切り替えできるようにしました。

これで万が一、複数バージョンが必要になった場合も安心です。

それにしても、Pythonってサポート期間長いんですね…どのバージョンも5年ある…

ライブラリも、過去バージョンのサポートを長めに続けているようなので、意外とプロジェクトごとに厳密にバージョン分けする機会ってないのかも…と感じてます。

本当にきっちりやるなら、Dockerとか仮想マシン使うでしょうし…

とはいえ、pythonに限らないですが、OSの公式リポジトリだと最新バージョンをインストールできない場合も多いです。

気軽に最新バージョンに追従できるようにしておくのは悪くなんじゃないかと思います。

以上です。あなたのお役に立てればうれしいです。

ESLint の初期設定時、Airbnb のスタイルガイドが選択肢に表示されない – 手動インストールする

みなさんこんにちは、ウチイダです。

最近フロントエンドをきちんと学ぼうと思って、Reactのキャッチアップを進めています。

せっかくなのでTypeScriptで開発するようにしているのですが、その際の環境構築でつまづくことがあったので書き留めておきます。

環境

  • Windows 11 21H2
  • WSL2 Ubuntu20.04
  • Node.js v18.12.0
  • npm 8.19.3

事象:Airbnbのスタイルガイドを選択できない

JavaScriptのスタイルガイドとしてポピュラーなものに、Airbnb が作成しているものがあります。

これをESLintでのチェックに利用しようと思いました。

ESLint を導入する際、以下のコンフィグファイルの初期化コマンド を実行します。

$ npm init @eslint/config 

手順を説明しているページなどを見ると、スタイルガイドの選択時にAirbnbが出てくるようだったのですが、ウチイダの環境だとそれが表示されませんでした。

選択肢が2つしか表示されない

原因:AirbnbのスタイルガイドがTypeScriptに対応していないため

初期設定を行うコマンド eslint-config で行われた修正が原因でした。

ここで、TypeScriptに標準で対応していないスタイルガイドを表示しないように変更されていました。

https://github.com/eslint/create-config/pull/33

自分の作業手順漏れを疑っていたのですが、仕様変更だったんですね。。。

ちなみに、これは最近参加しているコミュニティの方が調べて教えてくれました。感謝!

対応:手動でAirbnbのスタイルガイドを追加する

自動でインストールしてくれないのは仕方ないので、とりあえずeslintrc の生成を済ませて、あとからAirbnbのスタイルガイドを読み込ませるように設定していきます。

1. eslintrc を生成する

スタイルガイドでStandard を選択して、設定を進めます。

次に「依存パッケージをインストールするか」を聞かれるので、no を選んでおきます。

Standardのスタイルガイドのパッケージを後から削除するのであれば、yes でもよいです。

$ npm init @eslint/config
✔ How would you like to use ESLint? · style

✔ What type of modules does your project use? · esm

✔ Which framework does your project use? · react

✔ Does your project use TypeScript? · No / Yes

✔ Where does your code run? · browser

✔ How would you like to define a style for your project? · guide

✔ Which style guide do you want to follow? · standard-with-typescript

✔ What format do you want your config file to be in? · JavaScript

Checking peerDependencies of eslint-config-standard-with-typescript@latest
Local ESLint installation not found.
The config that you've selected requires the following dependencies:

eslint-plugin-react@latest eslint-config-standard-with-typescript@latest @typescript-eslint/eslint-plugin@^5.0.0 eslint@^8.0.1 eslint-plugin-import@^2.25.2 eslint-plugin-n@^15.0.0 eslint-plugin-promise@^6.0.0 typescript@*

✔ Would you like to install them now? · No / Yes

A config file was generated, but the config file itself may not follow your linting rules.
Successfully created .eslintrc.cjs file in /home/y-uchiida/develop/eslint_airbnb_none

2. Airbnb のスタイルガイドのパッケージを追加する

npm で、スタイルガイドのパッケージを導入します。

Airbnb のTypeScript のスタイルガイドは本家の設定の拡張なので、本家も含めてインストールします。

$ npm install --save-dev eslint-config-airbnb eslint-config-airbnb-typescript

3. eslintrc にスタイルガイドを読み込ませる

eslintrc を編集して、Airbnb のスタイルガイドを読み込みさせます。

    "extends": [
        "plugin:react/recommended",
        // "standard-with-typescript" // standard スタイルガイドは使わないので消す
        'airbnb', // 追加
        'airbnb-typescript' // 追加
    ],

ちなみに、Reactのプロジェクトかそうでないかによって、利用するパッケージが違うので注意が必要です。

詳しくはGitHubのREADMEをご確認ください…

https://github.com/iamturns/eslint-config-airbnb-typescript#setup

まとめ

ESLintの初期設定を自分でやったことがなかった&比較的最近の変更で、見つかる情報と齟齬があった(Airbnbが出てくると書いてあるものが多かった)ことでハマってしまいました。

ツールチェイン周りのキャッチアップは大変です…

ちなみに、ウチイダと同じ疑問を持った人がGitHubでissueを立てていました。

やり方を覚えてしまえばなんてことはないですが、手作業インストールするのちょっとだけ面倒ですね…

上記のissueの中で、「将来的に –config オプションを実装する予定があるので、それができたら簡単になるよ」といった旨のコメントがついていました。

https://github.com/eslint/create-config/issues/35#issuecomment-1216457480

早く利用できるようになるといいですね。

それでは以上となります。あなたのお役に立てれば幸いです。

composer self-update がnot defined になってしまう – 最新版を別インストールする

こんばんは、ウチイダです。

ご依頼いただいている案件で、XserverにLaravelアプリケーションをデプロイするときにちょっとつまづいたのでメモしておきます。

Xserverにはもともとcomposer がインストールされているのですが、バージョンが古くてうまくいかないことが発生します。

サーバを立てたタイミングによるかもしれませんが、2022年5月時点で、以下のバージョンが動きます。

$ composer -V
Composer version 1.9.1 2019-11-01 17:20:17

v1系ですね…

最新はv2.3 なので、これだといろいろエラーが出てしまいます。

というわけでアップデートをかけたいのですが、self-updateができないように設定されていました。

$ composer self-update

  [Symfony\Component\Console\Exception\CommandNotFoundException]
  Command "self-update" is not defined.

レンタルサーバだし仕方ない。

というわけで、最新版をインストールします。

多くのサイトでComposerのインストールコマンドが紹介されているのですが、バージョンが古いものだと、ハッシュチェックでエラーになってしまうので、必ず公式サイトのコマンドを参照するようにしましょう…

https://getcomposer.org/download/

このページにインストールコマンドを掲載すると、時間がたったときにここを見ていただいた方をエラーに導いてしまうことになるので、あえて書かないことにします。

上記の公式サイトに掲載されている最新のコマンドでcomposer-setup.php を取得して、ハッシュも最新のファイルのものを利用してください。

あとはインストールするだけです。

/usr/bin には先住Composerがいるので、ここには配置できまん。

パスが通っている別のディレクトリに置くか、新たにパスを通したディレクトリに配置します。

今回はホームディレクトリ配下に.composer を作って、そこに住まわせることにしました。

同じルールでnodebrewとかもインストールされていたので、それに合わせる形です。

composer-setup.php には、インストール先を指定するオプションがついているので、これを利用しました。

$ php composer-setup.php --install-dir=~/.composer --filename=composer;

パスは通してくれなかったので、手動で追加しました。

$ echo "export PATH=$HOME/.composer:$PATH" >> ~/.bashrc

バージョンチェックをして、最新版になっていれば完了です!

$ composer -V
Composer version 2.3.5 2022-04-13 16:43:00

Xserverはレンタルサーバーのくせにいろいろカスタマイズできて便利ですが、ひと工夫必要な場面もあるので、落ち着いてデプロイ作業を行いたいですね。

以上です。あなたのお役に立てれば幸いです。

Azure SQLをエクスポートしたbacpacファイルを、ローカルのMSSQLサーバにインポートする手順

こんばんは、ウチイダです。

最近、Azureクラウドの案件に携わっています。

クライアントから報告されたバグの事象を再現するために、データベースをローカルに取り込むのに苦労したので、手順をまとめておきます。

Visual Studioのインストールが必要です。

Azure SQLデータベースをエクスポートする

まずはデータベースをエクスポートします。

直接ダウンロードはできず、いったんAzure ストレージに保存する仕様です。

ストレージがない場合は作成する必要があります。

エクスポートが完了したら、指定したストレージからbacpacファイルをダウンロードします。

インポート時にこのファイルのパスを利用するので、フルパスで控えておいてください。

ローカルSQLサーバの設定を変更する

Azure のSQLをエクスポートすると、bacpacという種類のファイルが出力されます。

SQLクエリのダンプファイルができるわけではなく、そのままではローカルに取り込みできません。

まず、bacpacファイルをインポートできるように設定を変更します。

Visual Studio などMSSQL サーバに接続できるソフトウェアから、以下のクエリを実行します。

sp_configure 'contained database authentication', 1;
GO
RECONFIGURE;
GO

SqlPackage.exeでインポート処理を行う

bacpac ファイルをインポートできる機能を持ったプログラム SqlPaclage.exe が、Visual Studioに同梱されています。

Visual Studioをインストールしたくない方は、以下のページからSqlPackageだけインストールできます。

https://docs.microsoft.com/ja-jp/sql/tools/sqlpackage/sqlpackage-download?view=sql-server-ver15

Visual Studioをデフォルトの設定でインストールした場合、以下のフォルダにSqlPackage.exeが入っています。

Program Files Microsoft Visual Studio 2022 Community Common7 IDE Extensions Microsoft SQLDB DAC

PowerShellやcmdでこのフォルダを開いて、以下のコマンドを実行します。

> .\SqlPackage.exe /a:Import /sf:"*** bacpacファイルのパス ***" /tcs:"Server=(localdb)\\MSSQLLocalDB;Database=データベース名; Integrated Security=true;"
サーバー '(LocalDB)\MSSQLLocalDB' のデータベース '(入力したデータベース名)' にインポートしています。
配置計画を作成しています
配置の初期化中
配置計画を検証しています
# ... 中略
データベースのインポートが完了しました。
経過時間 0:00:16.29

これで完了です。

覚えてしまえば大した手間ではないですが、ひと手間かかりますね。

以上です。あなたのお役に立てれば幸いです。

WSL2のnpm install がめちゃ遅い、git clone ができない → resolv.confの設定を変更して解決

こんにちは、ウチイダです。

いつ頃からかわからないのですが、WSLでの通信が怪しいな…と思うことが増えていました。

たとえばnpm install をするとき、コンソール上のスピナーが止まってしまって、そのまま10分以上動かなくなったりすることが頻発していました。

それだけなら、コーヒーブレイクを兼ねて気長に待つか…と思っていたのですが、先日からGitHubからリポジトリのクローンができなくなるという事態も発生しました。

y-uchiida@LUMIERE:/test_clone$ git clone git@github.com:y-uchiida/my_test_repo.git
Cloning into 'my_test_repo'...
ssh: Could not resolve hostname github.com: Temporary failure in name resolution
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

このリポジトリは絶対にあるし、同じPCでPowershell経由でgit clone したら問題なくローンできるのです。

そして不可解なことに、何回か同じコマンドを繰り返していると、成功することがあります。謎だ…

原因究明と対応

さすがにGitHubが使えないのは困ってしまうので、きちんと対応することにしました。

エラーメッセージを見る限り、どうやら名前解決の問題のようなので、それらしいキーワードで色々検索してみます。

すると以下のページを発見。

https://www.reddit.com/r/bashonubuntuonwindows/comments/nt8asc/npm_install_extremely_slow_on_wsl2/

最後のコメントに、「いろいろ試して、ついに解決方法を見つけた」(意訳)と書かれています。

I tried every solutions here, but nothing works for me. But I found solutions.

in wsl, type below.

sudo rm /etc/resolv.conf
sudo bash -c ‘echo “nameserver 8.8.8.8” > /etc/resolv.conf’
sudo bash -c ‘echo “[network]” > /etc/wsl.conf’
sudo bash -c ‘echo “generateResolvConf = false” >> /etc/wsl.conf’
sudo chattr +i /etc/resolv.conf

After that, type below in cmd with administrator.

wsl –shutdown

https://www.reddit.com/r/bashonubuntuonwindows/comments/nt8asc/comment/hk7zpbw/?utm_source=share&utm_medium=web2x&context=3

このコメントの通り、resolv.confで指定するネームサーバーを変更したら解決しました。

変更前に色々と実験をしてみたものの、やはりネームサーバの問題のようです。

実験した内容は、おいおいどこかで書くかもしれません。

とりあえずこの変更により、困りごとが色々解消しました。

npm install が止まってしまうのも、git cloneが名前解決できないのも直ったので、とても快適になりました。

こころなしか、Docker pullまで早くなったような気がします。

免責

この変更による副作用が出てくるのか、現時点ではなんとも言えません。

設定変更の際は、バックアップを取るなどしてください。

まとめ

実はnpm install が遅い件については以前からちょくちょくググったりしていたのですが、それらしい情報がなかなか見つからなかったんですよね…

Cドライブ側にデータを置いていると遅い、という情報はたくさん出てきたのですが。

今回は英語の情報に絞って検索をかけて、上記のページに辿り着きました。

英語での検索、やっぱり大事ですね。。。

以上です。あなたのお役に立てば嬉しいです。

WSL2 Ubuntu に、nodenv 環境を作る簡単な手順(作業時間10分未満)

こんにちは、ウチイダです。

PCをセットアップするときにいつも調べている、nodeの環境構築。

そろそろ打ち止めにしたいので、メモリークリップに書き留めておきます。

今回の手順は、以下の環境で動作させました。

  • Windwos 11 Pro (21H2 ビルド 22000.194)
  • WSL カーネル バージョン: 5.10.60.1-microsoft-standard-WSL2
  • Windows Terminal バージョン: 1.10.2714.0
  • Ubuntu バージョン: 20.04.3 LTS (Focal Fossa)

nodenv installerを使うのがおすすめ

併せてanyenvを使う方法とか、homebrew経由でインストールする方法などが紹介されているサイトも多いですが、とにかく最短でnodeのマルチバージョン環境を整えたいのであれば、nodenv installerを利用するのが良いです。

必要に応じて、各種言語の管理ツールを入れるので良いかなーと思っています。

nodenv の公式リポジトリでも紹介されています。

https://github.com/nodenv/nodenv-installer#nodenv-installer

1. nodenv installer を実行する

使い方はとても簡単で、スクリプトをダウンロードしてきて、実行するだけです。

nodenv installerのgithubのREADMEでは、curlを使ったサンプルコマンドが紹介されているので、それの通りに実行します。

$ curl -fsSL https://raw.githubusercontent.com/nodenv/nodenv-installer/master/bin/nodenv-installer | bash
Installing nodenv with git...
Initialized empty Git repository in /home/y-uchiida/.nodenv/.git/

# ...(中略)...

Running doctor script to verify installation...
Checking for `nodenv' in PATH: /home/y-uchiida/.nodenv/bin/nodenv
Checking for nodenv shims in PATH: OK
Checking `nodenv install' support: /home/y-uchiida/.nodenv/plugins/node-build/bin/nodenv-install (node-build 4.9.59)
Counting installed Node versions: none
  There aren't any Node versions installed under `/home/y-uchiida/.nodenv/versions'.
  You can install Node versions like so: nodenv install 2.2.4
Auditing installed plugins: OK

All done!
Note that this installer doesn't yet configure your shell startup files:
1. You'll want to ensure that `~/.nodenv/bin' is added to PATH.
2. Run `nodenv init' to see instructions how to configure nodenv for your shell.
3. Launch a new terminal window to verify that the configuration is correct.

# nodenvがインストールできているか、バージョンを確認
$ /home/y-uchiida/.nodenv/bin/nodenv -v
nodenv 1.4.0+3.631d0b6

「All done」の表示が出たら、nodenvのインストールは完了です。

2. nodenvのインストールディレクトリにパスを通す

nodenv installerは、パスの追加までは行わないので、パスの追加を行います。

Ubuntuの初期設定であれば、ログインシェルはbashになっていると思いますので、ホームディレクトリの.bashrcの末尾に、以下を追記します。

# nodenv のインストールディレクトリをPATHに追記
export PATH="$HOME/.nodenv/bin:$PATH"

# nodenvを動作させるための設定を実行
eval "$(nodenv init -)"

追記が終わったら、bashを立ち上げなおすか、sourceコマンドで変更を反映します。

$ source ~/.bashrc

# コマンド名だけでバージョン確認できたら、パスの追加は完了
$ node -v
nodenv 1.4.0+3.631d0b6

3. node のインストール

nodenvがインストールできたので、nodeをインストールします。

とりあえずLTSの最新版を入れてみます。

LTSのバージョン情報は、下記のNode.js公式サイトのトップに書いてあるので、それを見るのが早いです。

https://nodejs.org/ja/

2,021年10月現在だと、ちょうどv14系からv16系に安定板が切り替わるタイミングです。

https://nodejs.org/ja/about/releases/

10月26日からがv16のLTSのスタートなので、ちょっと早いですが(執筆時点では10月14日です)、v16を入れておくことにします。

# nodenvで、最新版をインストール(公式サイトでバージョン番号を確認してください)
$ nodenv install 16.11.1
Downloading node-v16.11.1-linux-x64.tar.gz...
-> https://nodejs.org/dist/v16.11.1/node-v16.11.1-linux-x64.tar.gz
Installing node-v16.11.1-linux-x64...
Installed node-v16.11.1-linux-x64 to /home/y-uchiida/.nodenv/versions/16.11.1

# インストールしたバージョンを、システム全体で利用するように設定
$ nodenv global 16.11.1

# 設定できたか、バージョンを確認
$ node -v
v16.11.1

nodeがインストールできていれば、npmも入っています。

ちょっとした開発や検証なら、ここまでの設定で不自由することはないと思います。

バージョンを分けて管理したい場合は、nodenv local コマンドで、動作させるバージョンを切り替えてください。

もっと本格的に使うのであれば、Dockerなどを使って環境を分離することをお勧めします。

アンインストール

ホームディレクトリ内に追加されている「.nodenv」ディレクトリに関連データが入っていますので、それを削除すればOKです。

# nodenv のアンインストール、削除
$ rm -r ~/.nodenv

.nodenvディレクトリを削除すると、今までインストールしたnodeのバージョンとか設定とか全部まとめて消えてしまいます。

必要に応じてバックアップをしてください!

まとめと余談

以上でnodejs/nodenvの環境構築は完了です。

検索結果の上位に出てくる方法は、brewをインストールしたり、anyenvの中のnodenvを使うような網羅的な方法が出てくることが多いように思います。

ちょっとnodeのバージョン管理がしたいだけなのに手間が多いな~と思っていたので、シンプルな方法をまとめました。

ここからバリバリ開発していきましょう!

ちなみに、ウチイダは過去にanyenvをWSL Ubuntuで利用していて、起動がとても遅くなった経験をしたことがあります。

最近では、本格的に開発をする場合Dockerに環境を用意することが多いのではないでしょうか。

そのため、anyenvでまとめて管理しないといけないほど、WSL上で直接いろいろな言語の開発環境が必要になることは少ないと思っています。

起動時間のことなどもかんがみて、ホスト側(厳密には、WSLはホストじゃないですが…)の環境はシンプルに保っておきたいです。

以上です。あなたのお役に立てればうれしいです。