合理主義的グルメブログ

学生起業家の日常をツラツラと書いています。主に食事情報です。

LinuxでCPUコア数を確認する

マルチスレッド化するときに, PCの最大スペックまで出したいので,CPUコア数を知りたかった.

今回はUbuntu環境で動作を確認しました.

物理CPU の個数

まずはCPUの物理的な個数を確認します.

$ grep physical.id /proc/cpuinfo | sort -u | wc -l
2

僕の場合は2つですが,多分,普通は1個だと思います.

CPUごとのコア数

次に各CPUが何コア持っているかを確認します.

$ grep cpu.cores /proc/cpuinfo | sort -u
cpu cores       : 20

僕の環境は,intel xeonを使っているので,こんなものです.

論理プロセッサーの数

コンピュータから見たときに,存在するように見えるCPUのコア数です.
ハイパースレッド処理が有効になっている場合,
物理的なCPUのコア数よりも,多く表示される場合があります.

$ grep processor /proc/cpuinfo | wc -l
40

僕の環境では,物理的なコア数(2 * 20=40)と同じ数になりました.

「Fランクの暴君」を読んだ

天鏡のアルデラミン」が完結してしまったので, また頭脳戦系のラノベが読みたくなり探し出したのがコレ

ダークヒーロー系の学園内頭脳戦で面白かった.

帝王学を引用しながら,無慈悲な主人公がガンガン頭脳戦を仕掛けるのが読んでて爽快感があります.
手段を選ばない感じの主人公なので,僕はすごい楽しめました.

個人的には,2巻での戦いが主人公無双していて,かつ作戦自体もよく考えられていて,非常に面白かったです.

本当に面白い作品なのですが,一点残念なことがあります.
それは,2巻で打ち切りになっていることです.

どう見ても,2巻で続きのある終わり方をしているのですが,
諸事情により打ち切りになっているらしいです.

Pythonで環境変数を参照する

最近はどっぷりとPythonに浸かっているので,
別々のコンピュータで,互換性の高いプログラムを書きたいことが多いです.

その時に,環境変数が参照できると便利なので,
N番線時になりますが,メモっておきます.

結論から言うと,os.environ.get(varname[, value])でできます.

僕のuse caseで言うと,こんな感じで使いました.
openAIのbaselinesと言うライブラリを浸かっていましたが,
ログのフォーマットを確認したい時に使いました.

os.environ.get('OPENAI_LOG_FORMAT', 'tensorboard')

OPENAI_LOG_FORMATが,参照する環境変数名になります.
後ろにくっついているtensorboardは,OPENAI_LOG_FORMATが存在しない場合に,セットする値になります.
返り値はOPENAI_LOG_FORMATの値になります.

コレをもう少し書き加えると,こんな感じで,loggerの設定をすることができます.

# logger
if args.tensorboard:    # for tensorboard
    # logのformatを確認
    if os.environ.get('OPENAI_LOG_FORMAT', 'tensorboard') != 'tensorboard':
        logger.warn(
            "Overwriting OPENAI_LOG_FORMAT to 'tensorboard', which was '{}'".format(os.environ['OPENAI_LOG_FORMAT']))
    os.environ['OPENAI_LOG_FORMAT'] = 'tensorboard'
    # logを保存するpathを確認
    if os.environ.get('OPENAI_LOGDIR', args.tensorboard) != args.tensorboard:
        logger.warn(
            "Overwriting OPENAI_LOGDIR to '{}', which was '{}'".format(args.tensorboard, os.environ['OPENAI_LOGDIR']))
    os.environ['OPENAI_LOGDIR'] = args.tensorboard
    # launch tensorboard
    logger.warn('Launching Tensorboard...')
    tensorboard_pid = Popen(['tensorboard', '--logdir', args.tensorboard]).pid
    def kill_tb():
        os.kill(tensorboard_pid, signal.SIGTERM)
    atexit.register(kill_tb)
logger.configure(format_strs=['tensorboard', 'log'])

RaspberryPi同士でbluetooth通信した

タイトルどおり,ラズパイ同士で情報のやりとりをしたく, bluetooth通信を行いました.

基本的には,以下の記事通りにやれば動きます.

qiita.com

いくつか引っかかる点があったので,メモっておきます.

sudoで実行しよう

bluetoothctlを動かすとき,sudoで実行しないとペアリングなどのコマンドを受け付けてくれなかったです.

$ sudo bluetoothctl
[bluetooth]# 

Failed to pair: org.bluez.Error.AuthenticationFailed

hciconfigを使って,ペアリングの実験をおこなう際に以下のようなエラーが発生しました.

(server)$ sudo bluetoothctl
[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller SERVER_ADDR Discoverable: yes
(client)$ sudo bluetoothctl
[bluetooth]# pair SERVER_ADDR
Attempting to pair with SERVER_ADDR
Failed to pair: org.bluez.Error.AuthenticationFailed

解決策は以下のサイトで見つけました.

askubuntu.com

結局,client側のbluetoothバイスはoffになっていただけでした.
僕の環境では以下のようにしたら動くようになりました.

(client)$ sudo bluetoothctl
[bluetooth]# power on
Changing power on succeeded
[CHG] Controller CLIENT_ADDR Powered: yes
[bluetooth]# pair SERVER_ADDR
Attempting to pair with SERVER_ADDR
[CHG] Device SERVER_ADDR Connected: yes
[CHG] Device SERVER_ADDR Paired: yes
Pairing successful

Bluetooth自動起動設定

「電源切れてました٩( ᐛ )و」なんて,アホっぽい間違いを犯さないように, 自動で電源が入るように設定しておきます.

/etc/bluetooth/main.confに以下を追記.

[Policy]
AutoEnable=true

/etc/systemd/system/bluetooth.service.d/policy.confに以下を追記.

[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --plugin=policy

これで電源起動直後に,Bluetoothバイスが自動的にオンになります(ソースはここ).

VSCodeで複数サーバーに対して,ファイルをアップロードする

サーバーを使ったプログラムを書くときは, ローカルでファイル編集して,ある程度になったらサーバー(リモート)側にファイルをアップロードするみたいなときがあると思います.

ここで,アップロード先のサーバーが複数台ある場合には, イチイチSFTPの接続先の設定を変えるのは面倒です.

そのときの,VSCodeでの設定に少し手間取ったので,メモしておきます.

結論から言うと
Deployパッケージを使いましょう

marketplace.visualstudio.com

僕は普段はSFTPパッケージを利用していたのですが, 以下のリンクにもあるように,複数サーバーにはまだ対応していないらしいです.

github.com

僕は以下のように.vscode/setting.jsonに設定を追記しました.
伏せ字はいい感じに設定してください.

{
    "deploy": {
        "packages": [
            {
                "name": "HOGE",

                "deployOnSave": true,

                "files": [
                    "**/*.sh",
                    "**/*.py"
                ],

                "targets": [
                    "remote1",
                    "remote2"
                ]
            }
        ],
        "targets": [
            {
                "name": "remote1",
                "type": "sftp",
                "description": "A SFTP folder",

                "dir": "/workspace",
                "host": "ip address",
                "user": "*****",
                "password": "********"
            },
            {
                "name": "remote2",
                "type": "sftp",
                "description": "A SFTP folder",

                "dir": "/workspace",
                "host": "ip address",
                "user": "*****",
                "password": "********"
            }
        ]
    }
}

targetsにhostを追加することで,アップロード先を増やすことが出来ます.

ラズパイの「* failed to open vchiq instance」エラーを解決

ラズパイでカメラを使おうとしていたときに,以下のようなエラーが発生した.

$ raspistill -o image.png
* failed to open vchiq instance

調べてみると,色々解決策が出るけど,以下のstackoverflowの解決法で解決した.

stackoverflow.com

権限を変えるだけのシンプルな解決策.

$ sudo chmod 777 /dev/vchiq

セキュリティ的には問題あるけど, 一瞬だけ動かすだけなので,ひとまずこれで良しとしました.

【Python】一行で値を確認する

コマンドライン引数の値を確認したいなっと思っていて, assertが思い出せなかったのでメモする.

assert文の使い方は,以下の通り

assert [条件式], [Falseの場合に出力するメッセージ]

今回はこんな感じで,コマンドラインの引数確認に使いました.

assert args.mode is 'sim' or args.mode is 'real', 'ERROR'

ま〜よく考えると,argparseモジュールのchoicesオプションをつけたほうがスマートですが

parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--mode',
    type=str,
    choices=['sim', 'real'],
    required=True,
    help='select mode, [sim] or [real]')