Qstairs

現役AIベンチャーCTOの知見、画像認識(人工知能、Deep Learning)を中心とした技術ノウハウをアップしていきます

広告

【Python】決定版!dict(辞書型)を値でsortするワンライナー

dictの値でソート(sort)してdictを返すワンライナーです。
(dictをソートしてlist型に変換して終了している記事が多いと感じました。)

昇順:

dict_data = {k:v for k,v in sorted(dict_data.items(), key=lambda x : x[1])}

降順:

dict_data = {k:v for k,v in sorted(dict_data.items(), key=lambda x : x[1], reverse=True)}

動かす

dict_data = {
    "A":10,
    "B":5,
    "C":20
}

dict_data = {k:v for k,v in sorted(dict_data.items(), key=lambda x : x[1])}

dict_data = {
    "B":5,
    "A":10,
    "C":20
}

以上。お役に立てれば幸いです。

【Docker】コンテナ間の通信はdocker-composeのnetworksを上手く使おう

概要

コンテナ間で通信するために、docker-composeのnetworksを使うことができます。

コードはこちら

テスト準備

docker-compose build
docker-compose up -d

テスト用docker-compose

version: '3.2'
services:
  test_service_one:
    image: ubuntu:latest
    container_name: test_service1
    build: ./
    networks:
      - test_network
    tty: true
    stdin_open: true
    privileged: true
  test_service_two:
    image: ubuntu:latest
    container_name: test_service2
    build: ./
    networks:
      - test_network
    tty: true
    stdin_open: true
    privileged: true
networks:
  test_network:

テスト実行結果

pingを実行すると双方のコンテナ内から通知できていることが分かります。

user@wsl:~/develop/dockers/docker_network_sample$ docker exec -it test_service1 ping test_service2 -c 5
PING test_service2 (172.18.0.3) 56(84) bytes of data.
64 bytes from test_service2.docker_network_sample_test_network (172.18.0.3): icmp_seq=1 ttl=64 time=0.157 ms
64 bytes from test_service2.docker_network_sample_test_network (172.18.0.3): icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from test_service2.docker_network_sample_test_network (172.18.0.3): icmp_seq=3 ttl=64 time=0.060 ms
64 bytes from test_service2.docker_network_sample_test_network (172.18.0.3): icmp_seq=4 ttl=64 time=0.097 ms
64 bytes from test_service2.docker_network_sample_test_network (172.18.0.3): icmp_seq=5 ttl=64 time=0.041 ms

--- test_service2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4130ms
rtt min/avg/max/mdev = 0.041/0.080/0.157/0.043 ms
user@wsl:~/develop/dockers/docker_network_sample$ docker exec -it test_service2 ping test_service1 -c
5
PING test_service1 (172.18.0.2) 56(84) bytes of data.
64 bytes from test_service1.docker_network_sample_test_network (172.18.0.2): icmp_seq=1 ttl=64 time=0.286 ms
64 bytes from test_service1.docker_network_sample_test_network (172.18.0.2): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from test_service1.docker_network_sample_test_network (172.18.0.2): icmp_seq=3 ttl=64 time=0.042 ms
64 bytes from test_service1.docker_network_sample_test_network (172.18.0.2): icmp_seq=4 ttl=64 time=0.044 ms
64 bytes from test_service1.docker_network_sample_test_network (172.18.0.2): icmp_seq=5 ttl=64 time=0.082 ms

--- test_service1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4152ms
rtt min/avg/max/mdev = 0.040/0.098/0.286/0.094 ms

最後に

docker-composeのnetworksを使うことでコンテナ間の通信ができることが分かりますね。

【Docker】UbuntuのDockerを最新バージョンにアップデートする

環境

アップデート前のDockerバージョン

Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:02:36 2020
 OS/Arch:           linux/amd64
 Experimental:      false

アップデート方法

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

アップデート後のDockerバージョン

Client: Docker Engine - Community
 Version:           20.10.6
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        370c289
 Built:             Fri Apr  9 22:46:01 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

pipを実行すると「Did not provide a command」になる場合

WindowsPython環境を構築し、
ちゃんとPATHも通しているが
コマンドプロンプトでpipを実行すると

「Did not provide a command」

になる場合があります。

原因

恐らく、環境変数Pythonより上位に以下のパスがあるため、
PythonのpipよりもPerlのpipが優先されていることが原因です。

C:\strawberry\perl\bin\pip
C:\strawberry\perl\bin\pip.bat

対処

perlを削除するか、Pythonのpipをperlよりも上位に設定すると解消されます。
ただ、perlのpipが使えなくなるため、注意が必要です。

【顔検出】超簡単PythonとOpenCVを使った顔検出

はじめに

最近ではコモディティ化したといえる顔認識技術。
顔認識技術では一般的に
顔検出(どこに顔があるか)→顔照合
という流れで登録済みの顔を特定しています。

今回は顔検出を超簡単にPythonOpenCVを用いて実現しました。
(なんと118行!)

ソースコード

今回作成したコードは以下になります。
事前にPython(pipenv)環境が整っていれば3ステップで顔検出可能になります。

github.com

使用した技術

OpenCVに搭載されているdnnライブラリを使い、
学習済みの顔検出用caffeモデルを用いて顔を検出しています。

顔検出前:

顔検出結果:

最後に

顔検出だけで何か面白いものを作るのは難しいかもしれませんが、
他の技術やサービスと組み合わせてみると良いかもしれません。
例えば、SNSに画像をアップするためのモザイク処理や
Alexaスキルと連携して顔をみつけたら挨拶する(つまらない。。。)等でしょうか。

何にせよ、こんなに簡単に顔検知を実装できる時代って便利ですね。

これからITエンジニアを目指す人が覚悟すべき重要3ポイント

はじめに

ここ1年でITエンジニアにジョブチェンジしようと考えている人がかなり多くなっています。 既に華麗にジョブチェンジできた方も出てきているでしょう。 まだどうすべきか迷っている方も多いのではないでしょうか?

私としてはより多くITエンジニアが増えることを望んでいますし、 ITエンジニアになって良かったと思える人が多いことを願うばかりです。 ただ、ITエンジニアで食い続けることはそんなに楽ではないということも知っておいてほしいと考えています。

ということで、今回は現役CTOの私が考える、これからITエンジニアを目指す人が覚悟すべき重要3ポイントを挙げようと思います。

これからITエンジニアを目指す人が覚悟すべき重要3ポイント

  • 習うより慣れよだよ
  • 勉強し続けなければならないよ
  • 技術だけでは年収は頭打ちだよ(一部の天才エンジニアは除く)

習うより慣れよだよ

頭の中で論理を組み立てていくという点でプログラミングは将棋に似ています。 なので、将棋を勉強しているだけで実際に打たない人が強くなることは無いように、 ITエンジニアも知識だけ習得していては成長しません。 少しでも多くコードを書く人が強くなります。 また、実際にコードを書いていると多くの壁にぶつかります。 そういった壁の乗り越え方を実践していくことで強くなっていきます。 まるで筋繊維が切れて筋肉が大きくなるかのように。

とはいえ、知識は必要になるので勉強はしましょう。

勉強し続けなければならないよ

15年前にはiOSAndroidアプリ開発者はいなかった 10年前にAWSを使っている開発者はほとんどいなかった 5年前ではAIが民衆化しておらず扱える開発者はほんの一部だった

このように、次にどのような技術が流行するかわからないのがITの世界で、 ITエンジニアは都度習得・理解していく必要が出てきます。 習得していかない人は食いっ逸れることは少ないかもしれませんが、収入が上がりにくくなるでしょう。

とはいえ、新しいモノ好きでないと勉強し続けることはかなり大変です。。 なので、自分には厳しいかなと思ったらPM等、IT知識が多少あればこなせるポジションに移ることもありと思います。(最近ではエンジニアよりマネージャー職がかなり不足しています。)

技術だけでは年収は頭打ちだよ(一部の天才エンジニアは除く)

これまでの開発は分業度合い(営業、業務設計、システム設計、実装等)がかなり強くありました。 しかし、これから社会の流れが加速する中で分業していくと時間がかかりすぎてしまいます。 それぞれの境界線が薄くなっていき、マルチで仕事を遂行できる人の重要性が高くなっていきます。

この点、ジョブチェンジの方は有利です。 現在の仕事の知識・ノウハウを持ってITエンジニアになるので、 関連する業界、事業を顧客に持つ企業に携わると重宝されるでしょう。 ITエンジニアは良くも悪くもオタク気質が強い人が多いので、 差別化して収入アップできると考えています。

最後に

今回は現役CTOの私が考える、これからITエンジニアを目指す人が覚悟すべき重要3ポイントを挙げました。

少し脅しのように感じる方もいるかもしれませんが、 私としてはより多くITエンジニアが増えることを望んでいますし、 ITエンジニアになって後悔する人が出てきてほしくないと思っています。

とりあえずITエンジニアに挑戦し、自分に向いてなければ以前の業種に戻っても良いと思います。 少なくともITに関する知識は増えていると思うので、 マイナスにはならないでしょう。

人生100年時代。色々挑戦していきましょう!

【Docker】/home/****/.docker/config.json: permission deniedが発生したらやること

Ubuntu 18.04LTSにて、
docker ps
等のコマンドで以下が発生した。

WARNING: Error loading config file: /home/****/.docker/config.json: open /home/****/.docker/config.json: permission denied
上記「****」はユーザー名

その場合は、以下を実行しましょう。

sudo chown ${USER}:${USER} /home/vaak/.docker/config.json

他のサイトで以下のようにして対応している方もいるようですが、
誰でもアクセスできるようにはセキュリティ的にしない方が良いです。
(というか、777を設定すれば何とかなるという考え方が危険です。)

sudo chmod 777 /home/****/.docker/config.json

広告