Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

URIにおけるQueryとSearchは同じもの(だと思う)

ちょっとだけJavaScriptを勉強中。

URIのクエリ(query)とは、URIの文字列中で?の後に続くキーバリューの値で、RFC 3986では以下のように説明されている。

   The following are two example URIs and their component parts:

         foo://example.com:8042/over/there?name=ferret#nose
         \_/   \______________/\_________/ \_________/ \__/
          |           |            |            |        |
       scheme     authority       path        query   fragment
          |   _____________________|__
         / \ /                        \
         urn:example:animal:ferret:nose

JavaScriptでクエリを処理する場合は、location.searchで取得したり、URLSearchParamsで分解したりするようだ。 しかし、searchという単語が聞き慣れず不安になったので調べてみた。

正確な情報は見つからなかったが、どうもqueryとsearchは同じものを指しているようで、表記ゆれっぽい。

www.robinwieruch.de

Visual Studio CodeにPythonのコードのパスを認識させる

はじめに

諸般の事情で、Gitのリポジトリの少し奥の方にあるPythonのコードを開発することになった。 例えば、以下のような感じ。

python-path-on-vscode
`-- calc
    |-- src
    |   `-- calc.py
    `-- tests
        `-- test_calc.py

Visual Studio Codeで開発するのだが、Pythonコードのパスについての環境変数PYTHONPATHを設定しておかないと不便なので、調べたことをメモしておく。

Python Extension用の設定

Microsoftが提供しているPython Extensionに環境変数PYTHONPATHを認識させるためには、Gitのリポジトリに以下の内容で.envを作成する。

PYTHONPATH=calc/src

この設定をしていないと、Python Extensionがコードの位置を認識できず、関数の定義位置にジャンプができないなどの不便が生じる。

Terminal用の設定

Visual Studio CodeのTerminalで環境変数PYTHONPATHを有効にするには、Gitのリポジトリに以下の内容で.vscode/settings.jsonを作成する。

{
    "terminal.integrated.env.linux": {
        "PYTHONPATH": "${workspaceFolder}/calc/src"
    }
}

この設定をしていないと、Terminalから実行したpytestがコードの位置を認識できず、テストコードのimport文でエラーが起きるなどの不便が生じる。

最終的なファイル構成

python-path-on-vscode
|-- .env
|-- .vscode
|   `-- settings.json
`-- calc
    |-- src
    |   `-- calc.py
    `-- tests
        `-- test_calc.py

参考

code.visualstudio.com

pymongoでのコネクションプールについて

PythonのWebアプリ(Flask)からMongoDBを利用する際に、コネクションプールはどう扱ったらいいんだろうと思って調べた。 すると、MongoDBに接続するドライバpymongoそのものに、コネクションプールの機能があることが分かった。 以下のpymongoのFAQを参照。

pymongo.readthedocs.io

GitHub Actionsでワークフローと同じリポジトリにあるComposite Actionを利用する

はじめに

GitHub Actionのワークフローの一部を再利用したくて、いくつかのステップをComposite Actionとして利用できるように切り出した。 その際に、usesの指定方法を見つけるのに苦労したので、メモしておく。

usesの記載方法

ドキュメントの以下に記載があった。

以下にドキュメントからYAMLの記述例を抜粋する。

jobs:
  my_first_job:
    steps:
      - name: Check out repository
        uses: actions/checkout@v3
      - name: Use local my-action
        uses: ./.github/actions/my-action

参考

アクションの配置場所

ドキュメントには明確には記載されていないが、YAMLの記述例を参考にすると.github/actionsに配置するのがよさそう。

PHPのデバッグ

PHPは殆ど触れたことがないが、諸事情でデバッグすることになった。 PHPに標準的なログ出力の機能があるのかどうか(そして当該Webアプリで使っているのかどうか)は、よく分からない。 とにかく、エラーが発生したコンテキストが分かればいい。

デバッグ対象のWebアプリはExceptionを握りつぶすような実装になっているので、catch句のところにfile_put_contents()の呼び出しを加えて、例外の情報を独自にファイル出力するようにした。

catch(Exception $e) {
    file_put_contents('/tmp/log.txt', $e, FILE_APPEND | LOCK_EX);
}

systemdの管理下にあるApache HTTPDでファイル出力したためか、ログは/tmp/log.txtには出力されず、/tmp/systemd-private-f7be22cd34b84aeea9431ded8ca53541-php-fpm.service-8WLt2f/tmp/log.txtというファイルに出力されていた。 このファイルの内容を確認して、何とか原因の特定に成功した。

ちなみに、Exceptionには__toString()というメソッドが定義されていて、これはJavaでいうtoString()Pythonでいう__str__()にあたるもののように見えた。 なので、文字列が期待される場所で例外を引き渡すと、自動的に文字列化してくれるのではと推測する。

参考

www.php.net

www.php.net

www.php.net

Docker Composeの仕様

Docker Composeの仕様は、Compose Specとして以下の場所で標準化されている。

github.com

Compose Specの実装はDocker Compose、Kompose、Nerdctlなど幾つかあり、その中でもDocker ComposeはReference Implementation (参照実装) という位置づけのようだ。

Docker ComposeのマニュアルはSwarm modeなどの拡張にも言及していて、素のDocker Composeを使いたいときはマニュアルとしては少し読みづらいので、そういった場合はCompose Specを参照するのがよいのかも。