paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

ubuntu desktopのメモリを8GB増設した

私の家のデスクトップは古いONKYOのPCが2台あり、

  • Windows10: 映画、ゲーム等のメディア用
  • ubuntu desktop 20.04LTS: プログラミングの勉強、Linux検証等

という使い分けをしています。

プログラム書いて遊ぶときはubuntuを使うのですが、メモリが4GBでパワー不足を感じていたのでこの度増強しました。

ヤフオクでsanmax ddr3 4gbを2枚買いました。
2000円ちょっとでした。
規格が古いのもありますが、安く手に入ってラッキーです。

1枚のみ追加でもう1枚はWindowsに付けてもいいんですが、Windowsは今のところ問題ないので2枚ともubuntuに付けます。

増設前の環境

  • CPU

第2世代Corei5です。
クアッドコア

masashi@PC-ubuntu:~$ grep model\ name /proc/cpuinfo
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
  • メモリ

買った時のまま4GBです。

masashi@PC-ubuntu:~$ grep MemTotal /proc/meminfo
MemTotal:        3940748 kB

買ったメモリ

f:id:paloma69:20210309214656j:plain

じゃーん。
増設シーンは割愛します。

増設後

起動します。
メモリが1枚半差しになっていてBIOSが上がらなかったので差し直しました。

  • メモリ

12GBに増えました!

masashi@PC-ubuntu:~$ grep MemTotal /proc/meminfo
MemTotal:       12179820 kB

Conkyからも12GBで見えてます。

f:id:paloma69:20210309215914p:plain

ブラウザを使うとハングることが多かったのでこれで解消されるといいなあ。

ついでにWindowsと比較

HW系のコマンドを使うにあたりついでにWindowも調べてみました。
Windowはタスクマネージャーで確認できますが、(気分的に)公平を期すためPowerShellで取りました。
もっと適切なコマンドがあるかもしれませんが、いったんこれで記載します。

筐体

マザーボードの情報までは取っていませんが、ONKYOの全く同じマシンです。

PS C:\Users\tsuru> get-wmiobject win32_computersystemproduct


IdentifyingNumber : To be filled by O.E.M.
Name              : ONKYOPC
Vendor            : ONKYO CORPORATION
Version           : To be filled by O.E.M.
Caption           : コンピューター システム製品
masashi@PC-ubuntu:~$ sudo lshw -class system | head
pc-ubuntu
    詳細: デスクトップコンピューター
    製品: ONKYOPC (To be filled by O.E.M.)
    ベンダー: ONKYO CORPORATION
    バージョン: To be filled by O.E.M.
    シリアル: To be filled by O.E.M.
    幅: 64 bits
    性能: smbios-2.7 dmi-2.7 smp vsyscall32
    設定: boot=normal chassis=desktop family=To be filled by O.E.M. sku=To be filled by O.E.M. uuid=00020003-0004-0005-0006-000700080009
  *-pnp00:00
CPU

ubuntuは先ほど記載しましたがもう一回。

1コアしか見えてないので何かオプションがあるかも。

PS C:\Users\tsuru> get-wmiobject win32_processor


Caption           : Intel64 Family 6 Model 42 Stepping 7
DeviceID          : CPU0
Manufacturer      : GenuineIntel
MaxClockSpeed     : 3101
Name              : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
SocketDesignation : SOCKET 0
masashi@PC-ubuntu:~$ grep model\ name /proc/cpuinfo
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
メモリ

これもどちらも12GBです。
若干差分があるのでX windowの確保分でしょうか。

PS C:\Users\tsuru> get-wmiobject win32_computersystem


Domain              : WORKGROUP
Manufacturer        : ONKYO CORPORATION
Model               : ONKYOPC
Name                : DESKTOP-986MNSO
PrimaryOwnerName    :
TotalPhysicalMemory : 12866777088
masashi@PC-ubuntu:~$ grep MemTotal /proc/meminfo
MemTotal:       12179820 kB

まとめ

これでどちらのPCも同じCPU、同じメモリのスペックになりました。
違うのはグラボ搭載の有無と、ディスクのサイズだけです。

どちらもメモリ12GBというちょっと半端な値ですが、
私の用途で止まって困ったということはないのでこのままでいきたいと思います。

ubuntuも4GBで頑張ってきましたが、スペックアップしたのでもっと検証して遊ぼうと思います。
CPUは流石に第2世代と言っても張り付くことも無く快適ですよ。(マイニングしたら別だが)

ちなみにこの子らです。

f:id:paloma69:20210309215047j:plain

pythonのリスト内包表記内でprintするとNoneが帰ってくるけどこれは何だ?

最近NW設計でサブネットを計算するときにipcalcではなくpythonのipaddressモジュールを使ってます。
prefix内のサブネットが一気に出せて便利です。 昔は各Prefixのサブネットも暗記してましたが、pythonで一発で出せるのでもう覚える気が無くなってしまいましたw

リスト内包表記が便利です

python3系で実行してます。

Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import ipaddress

サブネット分けの構文を使っただけだとgenerator objectが返ってきて中身が見えません。

>>> ipaddress.IPv4Network('10.0.0.0/24').subnets(new_prefix=26)
<generator object _BaseNetwork.subnets at 0x0307D990>

ループさせれば見えますが、pythonのプロンプト内でサクッと計算したいところです。
こういう時はリスト内包表記にすると値も見れますので便利です。

>>> [x for x in ipaddress.IPv4Network('10.0.0.0/24').subnets(new_prefix=26)]
[IPv4Network('10.0.0.0/26'), IPv4Network('10.0.0.64/26'), IPv4Network('10.0.0.128/26'), IPv4Network('10.0.0.192/26')]

リストで帰って来るのはいいんですが、他の資料にコピペ出来るよう値だけ取り出したいですよね。
という訳でprintを挟んだものがこちら。

>>> [print(x) for x in ipaddress.IPv4Network('10.0.0.0/24').subnets(new_prefix=26)]
10.0.0.0/26
10.0.0.64/26
10.0.0.128/26
10.0.0.192/26
[None, None, None, None]

値が出たのはいいですが、リスト内がNoneになっている。なんだこれ?

困ったらまずは公式ドキュメント

5. データ構造 — Python 3.8.8 ドキュメント

リスト内包表記は英語だとlist comprehensiveと言う様です。
簡素にリスト作成が出来る機能ですと。

これのアプリケーションの用途イメージがいまいちわかりませんが、私の様にgenerate objectの中身を見たいときは便利です。

しかし、なぜNoneが返ってくるかはわかりませんでした。

Stack Overflowで調べる

日本だとTeratailがありますが、やはり英語サイトの方がナレッジも多いので活用してます。
今回の件もバッチリ出てきました。

Understanding Python 3 lists printing None value for each element - Stack Overflow

Noneはprint関数の戻り値の様です。
print関数のreturnがNoneなので今回のリストはNoneが返ってくるということですね。
printはBuiltin関数なのでこういうものだと納得できますが、 値が出力されている部分はリスト内包表記がどう処理してるんですかね?謎が深まります。

謎ばかりを追っていても仕方ないので、Noneの件は一旦仕様ということで落とします。
また、リスト内包表記でprintをするのはよろしくなくて、forループをワンライナーで書くのが良いようです。
(何故良くないかは調べられてませんが)

>>> for x in ipaddress.IPv4Network('10.0.0.0/24').subnets(new_prefix=26) : print(x)
...
10.0.0.0/26
10.0.0.64/26
10.0.0.128/26
10.0.0.192/26

これだとワンライナーで書けるしスッキリですね。

まとめ

プログラミング言語は奥深く、今回の件一つ取っても謎が謎を呼び完全に理解できる回答にたどり着くのは大変です。
pythonに関してはなんとなく書けるようになり自分のやりたいことも実装できるようになってきましたが、
今回の様な事象が潜んでいると思うと極めるのは非常に難しそうですね。

でもこういうトラブルシュートも楽しかったりします。

私の知らない間にCisco ASAにClusterコマンドが追加されていた

ここ数年担当しているお客さんの環境ではFWにFortigateを導入することが多かったのですが、直近の案件でCiscoのASAを導入することになりました。

ASAは触ったことはありますが、1からの構築経験がなかったので調べていたところCluster構成なる機能が増えていたのでメモしておきます。
私は従来のFailoverしか知らなかったのでちょっと調べてみました。

詳しいことは公式サイトを見ればわかるのでメモ程度のまとめになります。

Failover

昔からあるHA構成です。

  • 2台のASAで構成
  • お互いの専用リンク
  • Active unitとインターフェースを監視し、フェイルオーバーの契機とする
  • モード
    • Active/Standby
    • Active/Active
  • HAの同期
    • Config同期
    • セッション同期

ASA Cluster

コマンドリファレンス見た感じだと9系から追加になったのでしょうか。
型番はASA5516Xから、それ以上のモデルで使用できるようです。

コンフィグレーションガイドより

2台で、とは書いていないので3台以上でもクラスタに組み込めそうですね。
設計思想は違いそうですが、スイッチで言うStack構成的な動きですかね。

パケットの転送

クラスタの場合は上下の機器がクラスタへロードバランスを行うようです。

方式は3通り。

  • Spanned EtherChannel
    • これがメーカ推奨
    • クラスタ内の機器をまたいでChannelを組めるようです (今どきどの機器でも出来るか)
  • Policy Based Routing
  • 等コストマルチパスルーティング
Unit role
  • master: コントロールユニット
  • member: データユニット

よくあるクラスタ内ユニット毎の役割分割ですね。
これもスタックみたいな役割です。

Cluster interface
  • Cluster Control Link

クラスタ用リンクは直結ではなくスイッチを咬ませてChannelでクラスタ組むのが一般的な構成のようですね。
複数台クラスタを組めるようにするからですかね。
このChannelはSpanned Channelとは別モノみたいです。

まとめ

ASAのClusterはSRXでいうシャーシクラスタみたいな感じですね。
柔軟で便利そうですが、逆にシンプルな構成例が出てこなくてある程度の規模向けの機能な感じがしました。
主系、副系の2台構成だと従来のFailover構成でもいいかなという感じです。

画像の貼り付けも無く、私の気になったところのメモになってすいませんが、
文字だけだと分からなくなってくるので主な機能をざっくりとまとめました。

Failover Cluster
冗長構成方法 2台 複数台可能
ユニットの役割 Active/Standyまたは
Active/Active
Master: コントロールユニット
Member: データユニット
クラスタ用インターフェース 専用リンク(直結が多い)
・ファイルオーバーリン
・ステートフルフェイルオーバーリン
専用リンク(SWを咬ませてChannelの例が多い)
クラスタコントロールリンク
HAのモニタ お互いのノードとインターフェース お互いのノードとインターフェース
パケットの転送 Active機が処理 クラスタ内でロードバランスする

細かい部分は確認できていませんが、冗長の方式はガラッと変わりましたね。
JuniperのSSG NSRPからSRX Chassis clusterへ変わったようなもんでしょうかw

ASA Clusterの構成例だとVSSのスイッチを介してClusterを組んでいるので、大規模システムに対応できるようやスケールアウトやパケット転送をより効率化できるようになったのかもしれませんね。

私のやっている案件では従来のFailoverを採用したのでClusterを試す機会が無く残念です。
NW屋をやっているとどうしてもアプライアンスが多く、予算の都合等で遊んでいい機器が無いんですよね。
直結でCluster構成とかできるのかやってみたいです。
いつもライセンスでぐぬぬとなるんですが、VIRL購入を検討したいですね。

参考サイト

ググってすぐ出てきた9.6を参考にしました。

CLI ブック 1:Cisco ASA シリーズ 9.6 CLI コンフィギュレーション ガイド(一般的な操作) - ASA クラスタ [Cisco ASA 5500-X シリーズ ファイアウォール] - Cisco

スリーカードポーカーゲームのGUI化への道4 マウスクリック処理の練習

前回まででゲームの処理を画像に紐づけて表示するところまでできました。
次からはボタンを押下してチップの処理やゲームの侵攻と言った処理を作りたいところです。

しかしまたまた未知の領域でボタン処理はどうすればいいのかわからないのでまずは練習です。

今回やること

  • ボタンを押して以下の処理を出力される
    • ボタンを押すとカウントアップする
    • ボタンを押した旨のメッセージが出る

コード

ちょっとずつ追記できればよかったんですが、一気に出してしまいます。
実際のコードに書くのは嫌だったので練習ファイルを作成しました。

  • mouseclick.py

ボタンはとりあえず描写だけして装飾は何もしてません。
ループ内に置いたものがうまく動かず、トライ&エラーになってしまいました。
ここをうまく設計出来て動くとカッコいいんですけどね。

import pygame
import sys
from pygame.locals import *


pygame.init()
DISPLAYSURF = pygame.display.set_mode((600, 400))

i = 1

font = pygame.font.Font(None, 50)
text = font.render('Button was pressed.', True, (0,0,0))

button = pygame.Rect(0, 50, 100, 50)

while True:

        # For counter update in a loop
        counter = font.render(str(i), True, (0,0,0))

        DISPLAYSURF.fill((255, 255 ,255))
        DISPLAYSURF.blit(counter, (10,10))
        pygame.draw.rect(DISPLAYSURF, (120, 120, 120), button)

        for event in pygame.event.get():

                if event.type == MOUSEBUTTONDOWN and button.collidepoint(event.pos):
                        i += 1
                        DISPLAYSURF.blit(text, (10,200))

                elif event.type == QUIT:
                        pygame.quit()
                        sys.exit()

                pygame.display.update()
メモ
  • MOUSEBUTTONDOWN
    • マウスが押されたかどうかの判定
    • 左クリック、ホイール、右クリックの判定ができる
  • button.collidepoint
    • 座標内の図形が押されたかどうか判別する
    • 仕組みはもう少し調べる

実行

実行します。
キャプチャだけとってノー編集なのでデスクトップ丸出しで恥ずかしいです。

f:id:paloma69:20210217213136g:plain

グレーのボタンが押されたら"Button was pressed."の文字が出力されてカウントが増えます。
とりあえずボタン処理が動きました!

まとめ

色々なサイトを調べましたがボタンの作成はRectで図形を作って処理をさせるものがほとんどでした。(ほとんどってか全て)
また、Rectで書いた図形に文字を入れようとすると引数がどっと増えるので、どう描くかもう少し勉強しなければいけません。

最悪ボタンは画像を使うのもありかもです。
なかなか進みませんねえ。

ubuntuのLXD環境の復旧のまとめ

今週頭に謎のアップデートで壊れてしまったLXD環境を復旧します。
復旧というかほとんど作り直しですが。

コンテナのsnapshotのパス

LXDをsnap版に入れ替えるときにパッケージがsnapshotを取っているメッセージが出ていました。 もしかしたらデータ残っているかもと思いサルベージしました。

  • snapshotのパス

/var/lib/snapd/snapshots/に一式固まっていました。

masashi@PC-ubuntu:~$ sudo ls -l /var/lib/snapd/snapshots/4_lxd_4.0.5_19188.zip
-rw------- 1 root root 8319636416  23 00:29 /var/lib/snapd/snapshots/4_lxd_4.0.5_19188.zip
masashi@PC-ubuntu:~/lxd_snapshots$ sudo zipinfo /var/lib/snapd/snapshots/4_lxd_4.0.5_19188.zip
Archive:  /var/lib/snapd/snapshots/4_lxd_4.0.5_19188.zip
Zip file size: 8319636416 bytes, number of entries: 5
-rw----     2.0 fat 8319630787 bX stor 80-000-00 00:00 archive.tgz
-rw----     2.0 fat      332 bX stor 80-000-00 00:00 user/root.tgz
-rw----     2.0 fat     3983 bX stor 80-000-00 00:00 user/masashi.tgz
-rw----     2.0 fat      585 bX defN 80-000-00 00:00 meta.json
-rw----     2.0 fat       97 bX defN 80-000-00 00:00 meta.sha3_384
5 files, 8319635784 bytes uncompressed, 8319635586 bytes compressed:  0.0%

archive.tgzの中にコンテナのパスが残っていました。
ディレクトリの下はrootfsがあってルートディレクトリになっています。

masashi@PC-ubuntu:~/lxd_snapshots$ sudo ls common/lxd/storage-pools/default/containers
cent7-wp  debian  firefly  lxdMosaic  transmission  ubuntu-pr  ubuntu16

コンテナの整理

復旧するコンテナの整理をします。
一度テスト的に作って使っていないものは作り直しません。

  • cent7-wp
    • ローカルWordpress 使わなかったので捨て
  • debian
    • 使う
  • firefly
    • 使う
  • lxdMosaic
    • コンテナWeb管理 使わなかったので捨て
  • transmission
    • Transmissionサーバ 使わなかったので捨て
  • ubuntu-pr
    • コンテナ練習用サーバ 使わない
  • ubuntu16

というわけでdebian、firefly、ubuntu16のコンテナ再作成とデータ復旧を行います。
インスタンス作成やパッケージインストールは割愛します。

debian

rogueプレイ用なので実は復旧する様なデータなしです。

スコアのデータがどこにあるかわからないので作り直して完了。
rogueのスコアは遊び直して伸ばします。

firefly

これは実は復旧できませんでした。
DBのディレクトリをサルベージできたので、mysqlのフォルダ(/ver/lib/mysql)配下に突っ込んでみましたが、オン中にlxdの構成変更されてしまったのでテーブルにロックかかってしまったみたいです。

root@firefly:~/mysql# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 51
Server version: 10.3.25-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| fireflyiii         |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

ちゃんとdatabaseは見えてるのですが、

root@firefly:~# mysqldump -u root -p --databases fireflyiii > fireflydb
Enter password: 
mysqldump: Got error: 1932: "Table 'fireflyiii.2fa_tokens' doesn't exist in engine" when using LOCK TABLES

mysqldumpもダメで、

MariaDB [fireflyiii]> check table accounts;
+---------------------+-------+----------+-----------------------------------------------------+
| Table               | Op    | Msg_type | Msg_text                                            |
+---------------------+-------+----------+-----------------------------------------------------+
| fireflyiii.accounts | check | Error    | Table 'fireflyiii.accounts' doesn't exist in engine |
| fireflyiii.accounts | check | status   | Operation failed                                    |
+---------------------+-------+----------+-----------------------------------------------------+
2 rows in set (0.000 sec)

MariaDB [fireflyiii]> 
MariaDB [fireflyiii]> select * from accounts;
ERROR 1932 (42S02): Table 'fireflyiii.accounts' doesn't exist in engine

色々テーブルをcheckしたのですが、スキーマが無いと言われてしまいました。

DBの復旧は明るくないため諦めました。
勉強代と思ってバックアップを定期的にやるようにします。

まあマネーフローを確認する目的で入れていて、How toは大体つかめたのでまた今月からやり直します。

Dokuwiki

これも新規コンテナでパッケージも新しいもので作り直しました。
php7.0 -> 7.4になりました。

Dokuwikiのデータファイルはディレクトリ丸ごとコピーすればOKなのでサルベージしたディレクトリをコピーして完了です。

root@dokuwiki:~# cp -pr dokuwikidir/data /var/lib/dokuwiki/

これだけで復旧完了です。
また、Markdownプラグインのmarkdowkuを入れていたのですが、これもバージョンアップされていてバグがあるらしく動きませんでした。

2021/02/06 03:33:26 [error] 19371#19371: *17 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Class 'Doku_Handler_Quote' not found in /var/lib/dokuwiki/lib/plugins/markdowku/syntax/blockquotes.php:95

https://chiilabo.com/2020/08/fatal-error-class-doku_ha/

これはレイアウトだけの問題なので他の入れるなり対策します。

f:id:paloma69:20210206192724p:plain

一応データ復旧しました。

まとめ

使っているコンテナのみの復旧作業を試みました。
作り直してデータをインポートすることを想定していましたが、救えたのはDokuwikiだけでした。
勝率33%ですね。

家だけで使うツールだからと言ってデータ消失は悲しいもので、バックアップの重要性を思い知らされました。
システムはどうにでもなるので、やはりデータを重点的にバックアップしておかないとですね。

ubuntuのLXDが勝手にsnap版LXDになって起動できなくなった

1日の終わりに以前コンテナにインストールしたrogue cloneを数回プレイしているのですが、
昨日プレイしようとしたらコンテナとの接続が切れていて、再接続もできませんでした。

ログを見る限りなぜかaptでインストールしたLXDがsnap版LXDに切り替わっており、
socketのエラーでコンテナに接続できなくなったというものです。

家の環境だし重要なデータは入っていなかったので結局snap版を再インストールしたのですが、ちょっと事象をメモしておきます。

環境

ubuntu20.04LTSのgnomeデスクトップ環境です。

自動アップデートはONにしてます。

masashi@PC-ubuntu:~$ lsb_release -a ; uname -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:        20.04
Codename:       focal
Linux PC-ubuntu 5.4.0-65-generic #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

事象

rogue用に常時コンテナに入っているターミナルがあるのですが、昨日切れていました。
まあいいかと思って再接続しようしたら以下のメッセージ。

masashi@PC-ubuntu:~$ sudo lxd init
Error: Failed to connect to local LXD: Get "http://unix.socket/1.0": dial unix /var/snap/lxd/common/lxd/unix.socket: connect: no such file or directory

syslog

何かヒントないかと思ったらsyslogファイルにこんなメッセージが。

snap版LXDが勝手に起動してapt版LXDを止めた?

Feb  2 00:48:15 PC-ubuntu systemd[1]: Mounting Mount unit for lxd, revision 19188...
Feb  2 00:48:15 PC-ubuntu systemd[1]: Mounted Mount unit for lxd, revision 19188.
Feb  2 00:48:18 PC-ubuntu systemd[1]: snap.lxd.daemon.unix.socket: Succeeded.
Feb  2 00:48:18 PC-ubuntu systemd[1]: Closed Socket unix for snap application lxd.daemon.
Feb  2 00:48:18 PC-ubuntu systemd[1]: Stopping Service for snap application lxd.daemon...
Feb  2 00:48:30 PC-ubuntu lxd.daemon[630563]: => Stop reason is: snap refresh
Feb  2 00:48:30 PC-ubuntu lxd.daemon[630563]: => Stopping LXD
Feb  2 00:53:51 PC-ubuntu lxd.daemon[630563]: ==> Forcefully stopping LXD after 5 minutes wait
Feb  2 00:53:51 PC-ubuntu lxd.daemon[630563]: ==> Stopped LXD
Feb  2 00:53:51 PC-ubuntu systemd[1]: snap.lxd.daemon.service: Succeeded.
Feb  2 00:53:51 PC-ubuntu systemd[1]: Stopped Service for snap application lxd.daemon.
Feb  2 00:54:18 PC-ubuntu systemd[1]: Listening on Socket unix for snap application lxd.daemon.
Feb  2 00:54:18 PC-ubuntu systemd[1]: Starting Service for snap application lxd.activate...
Feb  2 00:54:19 PC-ubuntu lxd.activate[631871]: => Starting LXD activation
Feb  2 00:54:19 PC-ubuntu lxd.activate[631871]: ==> Loading snap configuration
Feb  2 00:54:19 PC-ubuntu lxd.activate[631871]: ==> Checking for socket activation support
Feb  2 00:54:20 PC-ubuntu lxd.activate[631871]: ==> Setting LXD socket ownership
Feb  2 00:54:20 PC-ubuntu lxd.activate[631871]: ==> Checking if LXD needs to be activated
Feb  2 00:54:21 PC-ubuntu systemd[1]: Started Service for snap application lxd.daemon.

しかも何かのセッティングを始めています。
一体なにをやってるんだ…

Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: => Preparing the system (19188)
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Loading snap configuration
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Setting up mntns symlink (mnt:[4026532491])
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Setting up kmod wrapper
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Preparing /boot
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Preparing a clean copy of /run
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Preparing /run/bin
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Preparing a clean copy of /etc
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Preparing a clean copy of /usr/share/misc
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Setting up ceph configuration
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Setting up LVM configuration
Feb  2 00:54:59 PC-ubuntu lxd.daemon[632871]: ==> Rotating logs
Feb  2 00:55:00 PC-ubuntu lxd.daemon[632871]: ==> Setting up ZFS (0.8)
Feb  2 00:55:00 PC-ubuntu lxd.daemon[632871]: ==> Escaping the systemd cgroups
Feb  2 00:55:00 PC-ubuntu lxd.daemon[632871]: ====> Detected cgroup V1
Feb  2 00:55:00 PC-ubuntu lxd.daemon[632871]: ==> Escaping the systemd process resource limits
Feb  2 00:55:00 PC-ubuntu lxd.daemon[632871]: ==> Disabling shiftfs on this kernel (auto)
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: Closed liblxcfs.so
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: Running destructor lxcfs_exit
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: Running constructor lxcfs_init to reload liblxcfs
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: mount namespace: 5
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: hierarchies:
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   0: fd:   6:
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   1: fd:   7: name=systemd
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   2: fd:   8: cpu,cpuacct
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   3: fd:   9: freezer
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   4: fd:  10: net_cls,net_prio
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   5: fd:  11: devices
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   6: fd:  12: memory
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   7: fd:  13: pids
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   8: fd:  14: cpuset
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:   9: fd:  15: perf_event
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:  10: fd:  16: rdma
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:  11: fd:  17: blkio
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]:  12: fd:  19: hugetlb
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: Kernel supports pidfds
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: Kernel does not support swap accounting
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: api_extensions:
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - cgroups
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - sys_cpu_online
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - proc_cpuinfo
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - proc_diskstats
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - proc_loadavg
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - proc_meminfo
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - proc_stat
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - proc_swaps
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - proc_uptime
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - shared_pidns
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - cpuview_daemon
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - loadavg_daemon
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: - pidfds
Feb  2 00:55:00 PC-ubuntu lxd.daemon[1846]: Reloaded LXCFS
Feb  2 00:55:00 PC-ubuntu lxd.daemon[632871]: => Re-using existing LXCFS
Feb  2 00:55:00 PC-ubuntu lxd.daemon[632871]: => Starting LXD

IPアドレス

コンテナブリッジのエラーも出ていたのでIPアドレスも見てみました。

Feb  2 00:54:47 PC-ubuntu lxd.daemon[632370]: Error: Failed to load network "lxdbr0": Duplicate config row found for key "dns.mode" for network ID 1

IPを確認すると下記のコンテナブリッジインターフェースが無くなっていました。
初期化されてしまった?

3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:03:28:f7:83:09 brd ff:ff:ff:ff:ff:ff
    inet 10.94.47.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::9093:88ff:fed2:ce29/64 scope link 
       valid_lft forever preferred_lft forever

これはlxd initで作られるものなので、この時点で復旧は不可能と思い再インストールの決意を固めました。

コンテナのパス

起動エラーとは関係ないかもしれませんが、コンテナのパスも変わっていました。
これも勝手にマイグレーションされたということになります。

ディレクトリ名の通りsnapが絡んでいますね。

  • 以前の
/var/lib/lxd/containers/
  • 今回の
/var/snap/lxd/common/lxd/containers

エラーは見切れずここまで

大したエラーログも残せずすみませんが、結局LXDの復旧優先で全消しで再インストールしました。
なので解析はここまでです。

勝手にsnap版になったので再インストール時はsnapでインストールしました。
こっちの方を押してるんですかね?

自動アップデートを有効にしていたからですが、Linuxでもこんなことあるんですね。
同じパッケージが別々のマネージャで存在するときは気を付けないといけませんね。

使っていないコンテナもあったので、取り急ぎ再構築はdebianとfirefly iiiを行います。

firefly iiiのデータが消えたのはちょっと痛いですが、消す前にコンテナのディレクトリをコピーしておいたので復旧できたらまた書きます。

debianrogueもいいスコアが消えてしまったのは残念です。
あ、あとDokuwikiのデータも消えちゃいましたね。
勉強ログがなくなってしまった。
でも身についてるからそんなに問題ないのでこれも作り直しかな。

オペミスやハードウェア障害ではないのにデータ消失は悲しいですね。

スリーカードポーカーゲームのGUI化への道3 テキストの表示

テキストの表示は画像ファイルを用意しておいて出力するという方法もありますが、ゲーム中の処理結果を使いたい場合もあるのでテキストの出力もメモしておきます。

今回やること

  • 手役と勝敗のテキストを画面に表示する
  • テキストはターミナル版の出力をそのまま使用する

ターミナル版

ターミナル版の出力です。
Your Handの役、Dealer Handの役、最後のXXX WIN!をそのままGUI画面に出力させたいというワケです。

===== Open Your Hand =====

Your Hand: ['♢A', '♠K', '♠3'] ['High card!']

The same chips as Ante is required to match the dealer.
Do you play in your hand? (Costs $10): [y/n]y

===== Open Dealer Hand =====

Dealer Hand: ['♣8', '♠4', '♡J'] ["Less than Queen-high. Dealer can't play"]

You WIN!

コード修正

テキストの出力も画像とほとんど同じです。
画像読み込みの代わりにフォントを定義します。

一部の抜粋です。
ちょっと変数の補足。

  • winner
    • 手札を比較して勝者を出力する
  • p_role
    • プレイヤーの手役。タプルで手役、カードランクが格納されてます。[0][0]で手役の文字列を表示できます。
  • d_role
    • ディーラーの手役。内容はプレイヤーと同じ。
font = pygame.font.Font(None, 20)

winner_text = font.render(winner, True, (255,255,255))
p_role_text = font.render('Player hand: ' + p_role[0][0], True, (255,255,255))
d_role_text = font.render('Dealer hand: ' + d_role[0][0], True, (255,255,255))

       DISPLAYSURF.blit(p_role_text, (400, 260))
       DISPLAYSURF.blit(d_role_text, (400, 280))
       DISPLAYSURF.blit(winner_text, (400, 300))

font.Fontでフォントとサイズを定義。 font.renderでテキスト内容と位置の定義です。
blitは画像の時と同じ。

実行

実行させるとこんな感じ。

f:id:paloma69:20210131154745p:plain

f:id:paloma69:20210131155031p:plain

起動したら完全自動で終わってしまいますが、役と勝敗が出るようになりました。
思い描いていた形に近づいてきましたよ。

まとめ

とりあえず貼り付け系はひと段落ですかね。
ここからよりゲームらしくするためにボタン処理系を追加していかないといけません。

近づいたといいながらもまだまだかかりそうです。