社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Pygame マウスカーソル に合わせて Paddle が動く

f:id:blueskyarea:20200813171747g:plain

def main():
    # Initialize pygame screen
    pygame.init()
    screen = pygame.display.set_mode(GAME_RECT.size)
    pygame.display.set_caption("Game Title")

    # Create sprite group
    sprite_group = pygame.sprite.RenderUpdates()
    Paddle.containers = sprite_group
    Paddle()

    # Game loop
    while True:
        screen.fill((0,0,0)) # fill with black
        sprite_group.update()
        sprite_group.draw(screen)
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()

# Paddle inheritance Sprite class
class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        # Default sprite group
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image, self.rect = load_image("paddle.png")
        self.rect.bottom = GAME_RECT.bottom
    def update(self):
        self.rect.centerx = pygame.mouse.get_pos()[0]
        self.rect.clamp_ip(GAME_RECT)

def load_image(filename):
    filename = os.path.join("resource", filename)
    try:
        image = pygame.image.load(filename)
    except pygame.error:
        print ("Failed to load image:", filename)
        raise SystemExit()
    return image, image.get_rect()

if __name__ == "__main__":
    main()

補足

    # Create sprite group
    sprite_group = pygame.sprite.RenderUpdates()
    Paddle.containers = sprite_group
    Paddle()

Paddle のインスタンス生成前に、sprite_group を Paddle.containers メンバ変数に登録。
複数のスプライトをグループにまとめると更新と描画がシンプルになる。

class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        # Default sprite group
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image, self.rect = load_image("paddle.png")
        self.rect.bottom = GAME_RECT.bottom

Paddle インスタンス生成時、init() (コンストラクタ)で pygame.sprite.Sprite.__init__()を呼び出し、Spriteを継承。
引数にグループリスト(containers)を渡す。
(自身のメンバ変数をクラスの外部から定義し、インスタンス化時にそれをコンストラクタ内で使用するような書き方に個人的に慣れない)

Pygame Zero スクリーン表示

f:id:blueskyarea:20200811155045p:plain

#!/usr/bin/env python

import os
import sys
import pygame
from pygame.locals import *

GAME_RECT = Rect(0, 0, 384, 384)

def main():
    pygame.init()
    screen = pygame.display.set_mode(GAME_RECT.size)
    pygame.display.set_caption("Game Title")

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()

if __name__ == "__main__":
    main()

補足
1

#!/usr/bin/env python

envコマンドの効果で、PATH環境変数の通っている場所から、Pythonインタープリタを探索する。

2

#coding: utf-8

Python 3 の場合、ソースが UTF-8 の時は記載は不要(PEP-8 では記載はむしろ非推奨)

3

pygame.Rect

四角形の描写情報を保持したpygameのオブジェクト

4

(u"Game Title")

リテラル表記に違いがあり、uを文字列の前につけなくてはならなかった「Python2のユニコード文字列」に対して「Python3の文字列」はそれが不要。

CentOS 6 curl: (35) SSL connect error

症状

centos6 上 curl でファイルダウンロードしようとしたらエラー発生。
具体的には elastic filebeat をダウンロードしようとしていた。

--verbose でデバッグ

curl で問題が発生したら、--verbose でデバッグしてみる。

$ curl --verbose -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.0-linux-x86_64.tar.gz
* About to connect() to artifacts.elastic.co port 443 (#0)
*   Trying 2a04:4e42:1a::734... connected
* Connected to artifacts.elastic.co (2a04:4e42:1a::734) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS error -12190
* Error in TLS handshake, trying SSLv3...
> GET /downloads/beats/filebeat/filebeat-7.8.0-linux-x86_64.tar.gz HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: artifacts.elastic.co
> Accept: */*
> 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connection died, retrying a fresh connect
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Closing connection #0
* Issue another request to this URL: 'https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.0-linux-x86_64.tar.gz'
* About to connect() to artifacts.elastic.co port 443 (#0)
*   Trying 2a04:4e42:1a::734... connected
* Connected to artifacts.elastic.co (2a04:4e42:1a::734) port 443 (#0)
* TLS disabled due to previous handshake failure
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS error -12286
* Closing connection #0
* SSL connect error

curl: (35) SSL connect error

以下のメッセージから、TLS handshake に失敗しているのが分かる。
TLS1.2 以上でないとダメだが、nss のバージョンが古い可能性。

* NSS error -12190
* Error in TLS handshake, trying SSLv3...

NSSバージョン確認

CentOS6系では、curlの暗号化ライブラリにNSSが標準で用いられていますが、このバージョンが、3.19.1-6以降であればTLS1.2に標準で対応している。
1) curl や nss のバージョン

$ rpm -qa --queryformat="%{NAME:shescape},%{VERSION:shescape}\n" | egrep -i -w "curl|nss|libcurl"
'nss-softokn','3.14.3'
'libcurl','7.19.7'
'nss-tools','3.18.0'
'nss-softokn-freebl','3.14.3'
'nss-sysinit','3.18.0'
'curl','7.19.7'
'nss-util','3.18.0'
'nss','3.18.0'

2) nss のバージョン
現在のバージョンと最新バージョンはこのコマンドで調べた方が便利。

$ yum info nss
(省略)
Installed Packages
Name        : nss
Arch        : x86_64
Version     : 3.18.0
Release     : 5.3.el6_6
Size        : 2.6 M
Repo        : installed
From repo   : updates
Summary     : Network Security Services
URL         : http://www.mozilla.org/projects/security/pki/nss/
License     : MPLv2.0
Description : Network Security Services (NSS) is a set of libraries designed to
            : support cross-platform development of security-enabled client and
            : server applications. Applications built with NSS can support SSL v2
            : and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509
            : v3 certificates, and other security standards.

Available Packages
Name        : nss
Arch        : i686
Version     : 3.44.0
Release     : 7.el6_10
Size        : 889 k
Repo        : updates
Summary     : Network Security Services
URL         : http://www.mozilla.org/projects/security/pki/nss/
License     : MPLv2.0
Description : Network Security Services (NSS) is a set of libraries designed to
            : support cross-platform development of security-enabled client and
            : server applications. Applications built with NSS can support SSL v2
            : and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509
            : v3 certificates, and other security standards.

NSSバージョンアップ

$ yum update nss
(省略)
Updated:
  nss.x86_64 0:3.44.0-7.el6_10                                                                                                                       

Dependency Updated:
  nspr.x86_64 0:4.21.0-1.el6_10                  nss-softokn.x86_64 0:3.44.0-6.el6_10           nss-softokn-freebl.x86_64 0:3.44.0-6.el6_10          
  nss-sysinit.x86_64 0:3.44.0-7.el6_10           nss-tools.x86_64 0:3.44.0-7.el6_10             nss-util.x86_64 0:3.44.0-1.el6_10                    

Complete!
$ yum info nss
Installed Packages
Name        : nss
Arch        : x86_64
Version     : 3.44.0
Release     : 7.el6_10
Size        : 2.6 M
Repo        : installed
From repo   : updates
Summary     : Network Security Services
URL         : http://www.mozilla.org/projects/security/pki/nss/
License     : MPLv2.0
Description : Network Security Services (NSS) is a set of libraries designed to
            : support cross-platform development of security-enabled client and
            : server applications. Applications built with NSS can support SSL v2
            : and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509
            : v3 certificates, and other security standards.

Available Packages
Name        : nss
Arch        : i686
Version     : 3.44.0
Release     : 7.el6_10
Size        : 889 k
Repo        : updates
Summary     : Network Security Services
URL         : http://www.mozilla.org/projects/security/pki/nss/
License     : MPLv2.0
Description : Network Security Services (NSS) is a set of libraries designed to
            : support cross-platform development of security-enabled client and
            : server applications. Applications built with NSS can support SSL v2
            : and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509
            : v3 certificates, and other security standards.

------------------------------

$ rpm -qa --queryformat="%{NAME:shescape},%{VERSION:shescape}\n" | egrep -i -w "curl|nss|libcurl"
'nss','3.44.0'
'libcurl','7.19.7'
'nss-util','3.44.0'
'nss-softokn','3.44.0'
'nss-sysinit','3.44.0'
'curl','7.19.7'
'nss-softokn-freebl','3.44.0'
'nss-tools','3.44.0'

あらためてダウンロード

エラーなく動作します。

$ curl --verbose -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.0-linux-x86_64.tar.gz
* About to connect() to artifacts.elastic.co port 443 (#0)
*   Trying 2a04:4e42:1a::734... connected
* Connected to artifacts.elastic.co (2a04:4e42:1a::734) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* 	subject: CN=*.elastic.co,O="Elasticsearch, Inc.",L=Mountain View,ST=California,C=US
* 	start date: Mar 07 00:00:00 2019 GMT
* 	expire date: Apr 22 12:00:00 2021 GMT
* 	common name: *.elastic.co
* 	issuer: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
> GET /downloads/beats/filebeat/filebeat-7.8.0-linux-x86_64.tar.gz HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: artifacts.elastic.co
> Accept: */*
> 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Length: 28738425
< Last-Modified: Thu, 18 Jun 2020 12:38:25 GMT
< ETag: "8e22cc92de1c2d832feed6e6a5642b08"
< Content-Type: application/x-gzip
< Accept-Ranges: bytes
< Age: 102
< Accept-Ranges: bytes
< Date: Mon, 20 Jul 2020 01:19:34 GMT
< Via: 1.1 varnish
< X-Served-By: cache-tyo19925-TYO
< X-Cache: HIT
< X-Cache-Hits: 0
< X-Timer: S1595207975.571326,VS0,VE1
< server: ElasticInfrastructure
< 
{ [data not shown]
100 27.4M  100 27.4M    0     0  10.1M      0  0:00:02  0:00:02 --:--:-- 11.0M* Connection #0 to host artifacts.elastic.co left intact

* Closing connection #0

補足

curl
サーバとのデータの転送のやりとりに使われるツール。

NSS
https://ja.wikipedia.org/wiki/Network_Security_Services

rpm - RPM パッケージマネージャ
レッドハットが開発したソフトウェアのパッケージを管理するためのシステム (パッケージ管理システム)、及びコマンド

SSLと『TLS
https://www.idcf.jp/rentalserver/aossl/basic/ssl-tls/

CentOS 7 に Docker, docker-compose インストール

Install docker

公式ドキュメント
https://docs.docker.com/engine/install/centos/

Set up the repository

1. yum-utils のインストール (未インストールの場合)

sudo yum install -y yum-utils

2. docker のリポジトリが登録されていないことの確認

yum repolist all | grep docker
->(empty)

3. docker のリポジトリを追加

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

4. docker のリポジトリが追加されたことの確認
docker-ce-stable/x86_64 以外はデフォルトで disable になっている。

yum repolist all | grep docker
docker-ce-edge/x86_64               Docker CE Edge - x86_64      disabled
docker-ce-edge-debuginfo/x86_64     Docker CE Edge - Debuginfo x disabled
docker-ce-edge-source               Docker CE Edge - Sources     disabled
docker-ce-nightly/x86_64            Docker CE Nightly - x86_64   disabled
docker-ce-nightly-debuginfo/x86_64  Docker CE Nightly - Debuginf disabled
docker-ce-nightly-source            Docker CE Nightly - Sources  disabled
docker-ce-stable/x86_64             Docker CE Stable - x86_64    enabled:     79
docker-ce-stable-debuginfo/x86_64   Docker CE Stable - Debuginfo disabled
docker-ce-stable-source             Docker CE Stable - Sources   disabled
docker-ce-test/x86_64               Docker CE Test - x86_64      disabled
docker-ce-test-debuginfo/x86_64     Docker CE Test - Debuginfo x disabled
docker-ce-test-source               Docker CE Test - Sources     disabled

5. docker engine のインストール

sudo yum install docker-ce docker-ce-cli containerd.io

6. インストールされたパッケージ(docker-ce)確認

yum list docker-ce --showduplicates | sort -r
 * updates: ty1.mirror.newmediaexpress.com
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, langpacks
Installed Packages
 * extras: ty1.mirror.newmediaexpress.com
 * epel: nrt.edge.kernel.org
docker-ce.x86_64            3:19.03.9-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.1-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.12-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:19.03.12-3.el7                   @docker-ce-stable
docker-ce.x86_64            3:19.03.11-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:19.03.10-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:19.03.0-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.9-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.1-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:18.09.0-3.el7                    docker-ce-stable 
docker-ce.x86_64            18.06.3.ce-3.el7                   docker-ce-stable 
docker-ce.x86_64            18.06.2.ce-3.el7                   docker-ce-stable 
docker-ce.x86_64            18.06.1.ce-3.el7                   docker-ce-stable 
docker-ce.x86_64            18.06.0.ce-3.el7                   docker-ce-stable 
docker-ce.x86_64            18.03.1.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            18.03.0.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.12.1.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.12.0.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.09.1.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.09.0.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.06.2.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.06.1.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.06.0.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.03.3.ce-1.el7                   docker-ce-stable 
docker-ce.x86_64            17.03.2.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable 
docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable 
 * base: ty1.mirror.newmediaexpress.com
Available Packages

Install docker-compose

公式ドキュメント
https://docs.docker.com/engine/install/centos/https://docs.docker.com/compose/install/

1. download package

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2. 実行権限を付与

sudo chmod +x /usr/local/bin/docker-compose

3. バージョン確認

$ docker-compose --version
docker-compose version 1.26.2, build eefe0d31

Kibana UI から Index へ document の投入

Indexの作成

Index 名: products
shardsの数: 2
replicasの数: 2
f:id:blueskyarea:20200708230423p:plain

Document の投入

実行するクエリ
/index名/_doc に続いて Json 形式で指定する。
f:id:blueskyarea:20200708232339p:plain

レスポンス
shards がトータルで3つ(メイン1つ、レプリカ2つ)出来ていることが分かる。
_id は自動的に生成される。
f:id:blueskyarea:20200708232347p:plain

Document の投入(_id 指定)

実行するクエリ
REST API の慣習として、_id を指定する場合は、PUT にする必要がある。
f:id:blueskyarea:20200708232832p:plain

レスポンス
_id が指定した番号になっていることが分かる。
f:id:blueskyarea:20200708232841p:plain

Document の投入(存在しない index に対して)

存在しない index(ここでは books) に対して document を投入しようとした場合。
実行するクエリ
f:id:blueskyarea:20200708233218p:plain

レスポンス
自動的に index が生成され、ドキュメントが投入される機能がデフォルトで有効になっている。
この時に作成される shards の数は設定ファイルで定義されているデフォルト数になる。
f:id:blueskyarea:20200708233256p:plain

Kibana UI から Index の作成と削除 (elasticsearch)

Index の作成

Index 名: products
shardsの数: 2
replicasの数: 2

実行するクエリ
f:id:blueskyarea:20200708230423p:plain

レスポンス
f:id:blueskyarea:20200708230517p:plain

Index の削除

実行するクエリ
f:id:blueskyarea:20200708230705p:plain

レスポンス
f:id:blueskyarea:20200708230723p:plain

テスト用に Index を作成・削除するだけなら非常に簡単に出来る。
本番環境用に作成する場合、shardsやreplicasの数は設定ファイルで定義されている方が望ましい。

Master node (elasticsearch)

Master node とは

Elasticsearch のノードの役割の一つで、クラスタ全体の処理(シャードの配置等)を行うノード。

Master-eligibleとは

master に候補になるノード。
master node が死んだときには master eligible node から新たな master が選ばれる。

設定 (elasticsearch.yml)

node.master: true | false

役割

主にクラスター全体に対するアクションを行う。
インデックスの生成、削除などを含む。

選定方法

クラスタ全体のノード中で、master eligible node の中から 1ノードが投票によって選定される。
master の役割に選任させることも可能だが、他の役割と兼任させることも出来る。
ただし、master 以外の役割で忙しいと、master としての処理が間に合わず、クラスター全体の安定性に影響を与えてしまう。
大きなクラスタでは、安定したノードで master ノードとして選任させることが多い。
master ノードのCPUやメモリの使用率、およびI/Oの使用率を監視し、もし高い値を示しているのであれば、master ノードの選任を検討するべき。