子育てしながらエンジニアしたい

現在 7 歳 女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

OpenCV + Python 3.7 が動かなかった

Python 3.7 on Windows 10 の環境に、OpenCV をインストールしました。

qiita.com

conda install -c conda-forge opencv==3.3.1

これ自体は問題なく通るのですが、import cv2 をすると以下のエラーが出ました。

ImportError: DLL load failed

以下の Stack Overflow を参考に、Dependency Walker なる依存関係調査ツールなどを試してみましたがだめでした。

stackoverflow.com

結局のところ、対処方法は Python を 3.6 系にすることでした...
どうも Python 3.7 系だとまだいろいろ問題があるみたいです。

PostgreSQL - 現在のアクティビティ取得

PostgreSQL で、今どんなクエリが走っているのかを知るためには、pg_stat_activity が使えます。

コマンド

select * from pg_stat_activity;

使い方の例

index を作ったり消したりをしていたのですが、なぜか消すのが遅い、というかフリーズしていました。
なんでかな~と調べていたら、以下の Stack overflow がヒット。

stackoverflow.com

pg_stat_activity を使って、index を消そうとしているテーブルに誰かがアクセスしていないか調べてみな!
ということでした。

まさにこれが原因で、pg_stat_activity を見ると、当該テーブルにクエリが走っていました。
そこでこのクエリを出しているプロセスを一度止めて、drop index をしたら一瞬でできました...

というわけで小技でした。

Python で自身の IP アドレスを取得したい - Ubuntu 編

以前、Python から自身の IP アドレスを取得するという記事を書きました。

edosha.hatenablog.jp

これは Windows ではいけたのですが、Ubuntu ではループバックアドレスしか取得できないことがわかりました。
そこで Ubuntu で IP アドレスを取得する方法を見つけたので、改めて公開します。

Python socket モジュールで自身の IP アドレスを取得する (Ubuntu)

実行環境は Python 3.6.5 / Ubuntu 18.04.1 LTS です。

$ python3 --version
Python 3.6.5 :: Anaconda, Inc.

標準ライブラリの socket モジュールを使います。

リモートソケットに接続する socket API

以下の2種類の API があります。

  • socket.connect(address)
  • socket.connect_ex(address)

どちらも address に示されるリモートソケットに接続されます。
違いは、connect_ex ではエラーが発生した場合でも例外が送出されないところです。
詳しくは以下のリンクをご覧ください。

socket --- 低水準ネットワークインターフェイス — Python 3.8.2rc1 ドキュメント

たとえばデフォルトゲートウェイ(192.168.100.1とか)の80番ポートなどを指定するには

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((192.168.100.1, 80))

こんな感じで接続できます。

接続中の IP アドレスとポートを取得する socket API

  • socket.getsockname()

上記の API でどこかに接続されているとき、その接続元である自分自身の IP とポートを表示します。
上の例に続いて s.getsockname() を実行すると下記のようになります。

s.getsockname()
# ('192.168.100.10', 60321) 等が出力される

上記を組み合わせて、自身の IP アドレスを取得する

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((192.168.100.1, 80))
ip = s.getsockname()[0]

こんな感じで、ip に IP アドレスの文字列が取得できました。