mieki256's diary



2022/05/01() [n年前の日記]

#1 [python][gimp] Pythonのstructを使った時の処理時間を調べてた

以前 GIMP の Python-Fuスクリプトを書いた際に、pycairo で描画したサーフェイス内容をGIMPのレイヤーに転送できる状態に変換する処理で時間がかかってしまっていたのだけど、そのあたりを改善できないか実験してみた。

_mieki256's diary - GIMPのPython-fu + pycairoで描いた画像をGIMPのレイヤー用に変換する処理について
_mieki256's diary - Ubuntu Linux 16.04LTS上でGIMPのPython-fuに関して試行錯誤中

上記のメモの中に出てくる、get_rgba_str() という関数が、問題の処理。struct を使って、ARGB(BGRA) で並んでいるデータを、RGBA に変換しているのだけど、ここがとにかく遅い。どうにかしたい。

ベンチマークを取ってみた。 :

Python のモジュール、Benchmarker を使うと、各処理に対してベンチマークが取れるらしい。pip install Benchmarker でインストールできる。

_Benchmarker - PyPI
_Pythonのベンチマークライブラリ「Benchmarker」 - DISTRICT 37

これを利用して実験用のスクリプトを書いてみた。

環境は、Windows10 x64 21H2 + Python 2.7.18 32bit。CPU は AMD Ryzen 7 1700 (3GHz, 8コア16スレッド)。

_03_argb_rgba_conv.py
from benchmarker import Benchmarker
import struct

LOOP = 5


def create_src_data():
    print("start.")
    rgba = []
    w, h = 2048, 2048
    r, g, b, a = 0, 32, 64, 128
    for y in range(h):
        for x in range(w):
            rgba.append(struct.pack('4B', b, g, r, a))
            r += 1
            g += 1
            b += 1
            a += 1
            if r > 255:
                r = 0
            if g > 255:
                g = 0
            if b > 255:
                b = 0
            if a > 255:
                a = 0
    src = ''.join(rgba)
    print("create source data.")
    return src


def get_rgba_str_slow(src):
    buf = ""
    size = len(src)
    for i in range(size / 4):
        i0 = i * 4
        i1 = i0 + 4
        bgra = struct.unpack('=L', src[i0: i1])[0]
        a = (bgra >> 24) & 0x0ff
        r = (bgra >> 16) & 0x0ff
        g = (bgra >> 8) & 0x0ff
        b = bgra & 0x0ff
        rgba = struct.pack('4B', r, g, b, a)
        buf += rgba
    return buf


def get_rgba_str(src):
    unpack = struct.Struct('=L').unpack_from
    pack = struct.Struct('>L').pack
    lmax = len(src) / 4
    rgba = [None] * lmax
    for i in range(lmax):
        d = unpack(src, i * 4)[0]
        rgba[i] = pack(((d & 0x00ffffff) << 8) | ((d >> 24) & 0x0ff))
    return ''.join(rgba)


def get_rgba_str_b(src):
    unpack = struct.Struct('=L').unpack_from
    pack = struct.Struct('>L').pack
    lmax = len(src) / 4
    rgba = []
    for i in range(lmax):
        d = unpack(src, i * 4)[0]
        rgba.append(pack(((d & 0x00ffffff) << 8) | ((d >> 24) & 0x0ff)))
    return ''.join(rgba)


def get_rgba_str_c(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    spack = struct.Struct('>L').pack
    rgba = [None] * lmax
    for i, d in enumerate(argb):
        rgba[i] = spack(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff))
    return ''.join(rgba)


def get_rgba_str_d(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = [None] * lmax
    for i, d in enumerate(argb):
        rgba[i] = ((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff)
    return struct.pack(">%dL" % lmax, *rgba)


def get_rgba_str_e(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = []
    for d in argb:
        rgba.append(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff))
    return struct.pack(">%dL" % lmax, *rgba)


src = create_src_data()

# dst0 = get_rgba_str_slow(src)
# dst1 = get_rgba_str(src)
# dst2 = get_rgba_str_b(src)
# dst3 = get_rgba_str_c(src)
# dst4 = get_rgba_str_d(src)
# if dst1 == dst4:
#     print("Success")
# else:
#     print("Failure")


with Benchmarker(LOOP, width=20) as bench:

    @bench("argb split")
    def check_use_split(bm):
        get_rgba_str_slow(src)

    @bench("rgb shift A")
    def check_use_rgb_shift(bm):
        get_rgba_str(src)

    @bench("rgb shift B")
    def check_use_rgb_shift_b(bm):
        get_rgba_str_b(src)

    @bench("rgb shift C")
    def check_use_rgb_shift_c(bm):
        get_rgba_str_c(src)

    @bench("rgb shift D")
    def check_use_rgb_shift_d(bm):
        get_rgba_str_d(src)

    @bench("rgb shift E")
    def check_use_rgb_shift_e(bm):
        get_rgba_str_e(src)


結果は以下。

> py -2 03_argb_rgba_conv.py
start.
create source data.
## benchmarker:         release 4.0.1 (for python)
## python version:      2.7.18
## python compiler:     MSC v.1500 32 bit (Intel)
## python platform:     Windows-10-10.0.19041
## python executable:   C:\Python\Python27\python.exe
## cpu model:           AMD64 Family 23 Model 1 Stepping 1, AuthenticAMD
## parameters:          loop=5, cycle=1, extra=0

##                        real    (total    = user    + sys)
argb split             15.2580   15.2656   11.4844    3.7812
rgb shift A             4.7980    4.7969    4.7812    0.0156
rgb shift B             5.0360    5.0312    4.9688    0.0625
rgb shift C             2.6200    2.6094    2.5156    0.0938
rgb shift D             2.0820    2.0938    2.0156    0.0781
rgb shift E             2.1110    2.1094    2.0469    0.0625

## Ranking                real
rgb shift D             2.0820  (100.0) ********************
rgb shift E             2.1110  ( 98.6) ********************
rgb shift C             2.6200  ( 79.5) ****************
rgb shift A             4.7980  ( 43.4) *********
rgb shift B             5.0360  ( 41.3) ********
argb split             15.2580  ( 13.6) ***

## Matrix                 real    [01]    [02]    [03]    [04]    [05]    [06]
[01] rgb shift D        2.0820   100.0   101.4   125.8   230.5   241.9   732.9
[02] rgb shift E        2.1110    98.6   100.0   124.1   227.3   238.6   722.8
[03] rgb shift C        2.6200    79.5    80.6   100.0   183.1   192.2   582.4
[04] rgb shift A        4.7980    43.4    44.0    54.6   100.0   105.0   318.0
[05] rgb shift B        5.0360    41.3    41.9    52.0    95.3   100.0   303.0
[06] argb split        15.2580    13.6    13.8    17.2    31.4    33.0   100.0

これから分かることは…。
  • 空リストに .append() で要素を追加していくよりも、事前に必要な分のリストを [None] * lmax で確保しておいて、xxx[i] = xxx で代入していったほうが速い。
  • forループで4バイトずつ、struct.unpack_from("=L", src, i * 4)[0] で取り出して処理をしていくより、list(struct.unpack("=%dL" % lmax, src)) のように、フォーマット文字列内にカウント数を入れてしまって、forループを使わずに一気に取り出してリスト化したほうが速い。
  • ''.join(rgba) でリストを結合して文字列を作るより、struct.pack(">%dL" % lmax, *rgba) のように、フォーマット文字列内にカウント数を入れて、リストをバイナリデータにしたほうが速い。
  • forループの enumerate を無くしても、処理速度はそんなに変わらない。


何にせよ、書き方を変えることで2倍ほど処理を速くできる ―― 半分の処理時間にすることができそうだなと分かった。

それでも、2048 x 2048 ドット分の変換処理に2秒以上かかってしまうのは残念だけど…。

でもまあ、一番最初に書いた版では15秒かかってた処理が、2秒にまで短縮できたのだから、これでもマシかもしれない。でも…もっと速くできないものかな…。

参考ページ。 :

以下のやり取りが参考になった。ありがたや。

_python - How can I struct.unpack many numbers at once - Stack Overflow

メカっぽいテクスチャを生成するPython-Fuも更新。 :

メカっぽいテクスチャを生成できる、GIMP の Python-Fuスクリプトも更新しておいた。

_mieki256/sci-fi-texture-generator: Sci-Fi bump mapping texture generator with GIMP Script-fu.

ちなみに、動作確認していたら、以前の版は画像の右端と下端に、1ドットの透明な隙間ができてしまっていることに気が付いたので、そこも修正しておいた。

GIMP の選択範囲作成と、pycairo の矩形範囲の指定は、与えるパラメータの仕様がちょっと違っていたらしい。pycairo版は、GIMP描画機能使用版と比べて、全体的にあらゆる箇所で、右端と下端が1ドット少なくなっているのかもしれない…。でもまあ、それっぽい見た目になっていれば十分だろうし、これでもいいだろう…。

余談。Windows版GIMPにはNumPyが入ってない。 :

この手の処理をPythonでする場合、NumPy を使うのが当たり前っぽいのだけど…。Windows版GIMP 2.8.x や 2.10.x には、NumPy が入ってないので使えないのだった…。

これがLinux版GIMPなら、システムに NumPy をインストールしておけば GIMP からも使えるらしい。

2022/05/02追記。 :

リスト内包表記を試してみたら、もうちょっとだけ処理を速くできた。とメモ。

2022/05/02(月) [n年前の日記]

#1 [python][gimp] Pythonのリスト内包表記を試してみた

昨日、Pythonスクリプトのベンチマークを取りながら、ARGBのデータをRGBAに変換する処理を速くできないか試していたのだけど。

_Pythonのstructを使った時の処理時間を調べてた

高速化に関するページを眺めていたら、リスト内包表記とやらにするだけでも高速化できるという話を見かけたので試してみた。

環境は、Windows10 x64 21H2 + Python 2.7.18 32bit。CPU は AMD Ryzen 7 1700 (3GHz, 8コア16スレッド)。

ベンチマークをとってみた。スクリプトは以下。

_03_argb_rgba_conv.py
from benchmarker import Benchmarker
import struct
import sys

LOOP = 5


def create_src_data():
    print("start.")
    rgba = []
    w, h = 2048, 2048
    r, g, b, a = 0, 32, 64, 128
    for y in range(h):
        for x in range(w):
            rgba.append(struct.pack('4B', b, g, r, a))
            r += 1
            g += 1
            b += 1
            a += 1
            if r > 255:
                r = 0
            if g > 255:
                g = 0
            if b > 255:
                b = 0
            if a > 255:
                a = 0
    src = ''.join(rgba)
    print("create source data.")
    return src


def get_rgba_str_slow(src):
    buf = ""
    size = len(src)
    for i in range(size / 4):
        i0 = i * 4
        i1 = i0 + 4
        bgra = struct.unpack('=L', src[i0: i1])[0]
        a = (bgra >> 24) & 0x0ff
        r = (bgra >> 16) & 0x0ff
        g = (bgra >> 8) & 0x0ff
        b = bgra & 0x0ff
        rgba = struct.pack('4B', r, g, b, a)
        buf += rgba
    return buf


def get_rgba_str(src):
    unpack = struct.Struct('=L').unpack_from
    pack = struct.Struct('>L').pack
    lmax = len(src) / 4
    rgba = [None] * lmax
    for i in range(lmax):
        d = unpack(src, i * 4)[0]
        rgba[i] = pack(((d & 0x00ffffff) << 8) | ((d >> 24) & 0x0ff))
    return ''.join(rgba)


def get_rgba_str_b(src):
    unpack = struct.Struct('=L').unpack_from
    pack = struct.Struct('>L').pack
    lmax = len(src) / 4
    rgba = []
    for i in range(lmax):
        d = unpack(src, i * 4)[0]
        rgba.append(pack(((d & 0x00ffffff) << 8) | ((d >> 24) & 0x0ff)))
    return ''.join(rgba)


def get_rgba_str_c(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    spack = struct.Struct('>L').pack
    rgba = [None] * lmax
    for i, d in enumerate(argb):
        rgba[i] = spack(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff))
    return ''.join(rgba)


def get_rgba_str_d(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = [None] * lmax
    for i, d in enumerate(argb):
        rgba[i] = ((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff)
    return struct.pack(">%dL" % lmax, *rgba)


def get_rgba_str_e(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = []
    for d in argb:
        rgba.append(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff))
    return struct.pack(">%dL" % lmax, *rgba)


def get_rgba_str_f(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = [(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff)) for d in argb]
    return struct.pack(">%dL" % lmax, *rgba)


def get_rgba_str_g(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = [(((d & 0x0ffffff) << 8) + ((d >> 24) & 0x0ff)) for d in argb]
    return struct.pack(">%dL" % lmax, *rgba)


def check_result(src):
    dst = []
    dst.append(get_rgba_str(src))
    dst.append(get_rgba_str_slow(src))
    dst.append(get_rgba_str_b(src))
    dst.append(get_rgba_str_c(src))
    dst.append(get_rgba_str_d(src))
    dst.append(get_rgba_str_e(src))
    dst.append(get_rgba_str_f(src))
    dst.append(get_rgba_str_g(src))
    for i in range(len(dst)):
        if i == 0:
            continue
        if dst[0] == dst[i]:
            print("Success [%d]" % i)
        else:
            print("Failure [%d]" % i)


src = create_src_data()

# check_result(src)
# sys.exit()

with Benchmarker(LOOP, width=20) as bench:

    @bench("argb split")
    def check_use_split(bm):
        get_rgba_str_slow(src)

    @bench("rgb shift A")
    def check_use_rgb_shift(bm):
        get_rgba_str(src)

    @bench("rgb shift B")
    def check_use_rgb_shift_b(bm):
        get_rgba_str_b(src)

    @bench("rgb shift C")
    def check_use_rgb_shift_c(bm):
        get_rgba_str_c(src)

    @bench("rgb shift D")
    def check_use_rgb_shift_d(bm):
        get_rgba_str_d(src)

    @bench("rgb shift E")
    def check_use_rgb_shift_e(bm):
        get_rgba_str_e(src)

    @bench("rgb shift F")
    def check_use_rgb_shift_f(bm):
        get_rgba_str_f(src)

    @bench("rgb shift G")
    def check_use_rgb_shift_g(bm):
        get_rgba_str_g(src)


py -2 03_argb_rgba_conv.py で実行。結果は以下。

D:\home\prg\python\_test_sample\benchmarker> py -2 03_argb_rgba_conv.py
start.
create source data.
## benchmarker:         release 4.0.1 (for python)
## python version:      2.7.18
## python compiler:     MSC v.1500 32 bit (Intel)
## python platform:     Windows-10-10.0.19041
## python executable:   C:\Python\Python27\python.exe
## cpu model:           AMD64 Family 23 Model 1 Stepping 1, AuthenticAMD
## parameters:          loop=5, cycle=1, extra=0

##                        real    (total    = user    + sys)
argb split             16.1320   16.1094   11.1250    4.9844
rgb shift A             4.7300    4.7344    4.7031    0.0312
rgb shift B             4.8720    4.8750    4.7656    0.1094
rgb shift C             2.5780    2.5781    2.5000    0.0781
rgb shift D             2.0750    2.0625    2.0156    0.0469
rgb shift E             2.1690    2.1719    2.0000    0.1719
rgb shift F             1.7300    1.7344    1.5781    0.1562
rgb shift G             1.6780    1.6875    1.5781    0.1094

## Ranking                real
rgb shift G             1.6780  (100.0) ********************
rgb shift F             1.7300  ( 97.0) *******************
rgb shift D             2.0750  ( 80.9) ****************
rgb shift E             2.1690  ( 77.4) ***************
rgb shift C             2.5780  ( 65.1) *************
rgb shift A             4.7300  ( 35.5) *******
rgb shift B             4.8720  ( 34.4) *******
argb split             16.1320  ( 10.4) **

## Matrix                 real    [01]    [02]    [03]    [04]    [05]    [06]    [07]    [08]
[01] rgb shift G        1.6780   100.0   103.1   123.7   129.3   153.6   281.9   290.3   961.4
[02] rgb shift F        1.7300    97.0   100.0   119.9   125.4   149.0   273.4   281.6   932.5
[03] rgb shift D        2.0750    80.9    83.4   100.0   104.5   124.2   228.0   234.8   777.4
[04] rgb shift E        2.1690    77.4    79.8    95.7   100.0   118.9   218.1   224.6   743.8
[05] rgb shift C        2.5780    65.1    67.1    80.5    84.1   100.0   183.5   189.0   625.8
[06] rgb shift A        4.7300    35.5    36.6    43.9    45.9    54.5   100.0   103.0   341.1
[07] rgb shift B        4.8720    34.4    35.5    42.6    44.5    52.9    97.1   100.0   331.1
[08] argb split        16.1320    10.4    10.7    12.9    13.4    16.0    29.3    30.2   100.0


「rgb shift F」「rgb shift G」が、リスト内包表記を使った版。たしかに、2.0750秒が、1.7300秒になった。リスト内包表記にするだけでも高速化はできるらしい。

また、論理和(OR)演算子(|)を使っていたところを、+演算子に変えてみたところ、それだけでもほんのちょっとだけ処理が速くなった。ビット演算は微妙に遅いということだろうか…?

つまるところ、以下のように変更したことで、ある程度高速化できた、ということになるのかなと。

def get_rgba_str(src):
    unpack = struct.Struct('=L').unpack_from
    pack = struct.Struct('>L').pack
    lmax = len(src) / 4
    rgba = [None] * lmax
    for i in range(lmax):
        d = unpack(src, i * 4)[0]
        rgba[i] = pack(((d & 0x00ffffff) << 8) | ((d >> 24) & 0x0ff))
    return ''.join(rgba)
def get_rgba_str_g(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = [(((d & 0x0ffffff) << 8) + ((d >> 24) & 0x0ff)) for d in argb]
    return struct.pack(">%dL" % lmax, *rgba)


ただ、これは GIMP の Python-Fu に限定した話だけど、少々問題もあって…。リスト内包表記にしたことで、GIMPのプログレスバーを更新して処理の進行具合をユーザに伝えることができなくなってしまった。今まではforループで処理してたから、forループ内でプログレスバーを更新する処理を呼ぶことができていたのだけど…。でもまあ、5秒近くかかっていた処理が1.7秒になるのだから、プログレスバーを更新しなくても許されるかなと…。

さておき。もっと高速化できないものだろうか…。

スクリプトを動かしている環境がビッグエンディアンなのかリトルエンディアンなのか分からないので、struct.unpack("=L", xxx) を使って処理をしているけれど、どちらのエンディアンなのか事前に判別すれば、struct を使わなくても済むのではないか…? データの並びが BGRABGRA...、あるいは ARGBARGB... になっているものと決め打ちできれば、もっとシンプルに書けて高速化できないか。

2022/05/03(火) [n年前の日記]

#1 [nitijyou] 弟が帰省

ゴールデンウィークということで弟が帰省。ただ、自分と弟は3回目のワクチン接種をしていないので、コロナウイルス関係が不安だなと…。いつもなら数日泊まっていくけれど、今回は日帰りで、ということになった。

PM01:00頃に到着。PCパーツを色々持ってきてくれた。親父さんのPCはSSD以外全部新調することになったし、自分のメインPC用に Ryzen 5 3600 まで持ってきてくれた。ありがたや。パーツの型番等をちゃんとメモしておかないと…。

夜のほうが高速道路が空いてそうとのことで、PM08:00頃に帰っていった。

2022/05/04(水) [n年前の日記]

#1 [pc] 弟から貰ったPCパーツについてメモ

昨日帰省した弟からPCパーツを譲ってもらえたので忘れないうちにメモ。

親父さん用PCについてメモ。 :

親父さん用PCは、SSDを除いてほとんど新調することになった。

  • CPU : AMD Ryzen 5 2400G (4コア8スレッド, 3.6-3.9GHz, Socket AM4, TDP 65W, コア世代: 第1世代, 2次キャッシュ: 2MB, 3次キャッシュ: 4MB, 内蔵ビデオ: Radeon RX Vega 11 Graphics)
  • CPUクーラー : ainex IS-40X (Intel, AMD用, Socket AM4対応, TDP100Wまで, 45mm高)
  • M/B : ASUS PRIME A320I-K (Mini-ITX, Socket AM4 (Ryzen第2世代まで対応), AMD A320, DDR4 x 2, 最大32GB, DisplayPort x 1, HDMI x 1)
  • RAM : G.Skill F4-3200C16D-16GFX, 8GB x 2 (DDR4-3200 8GB x 2m CL16-18-18-38, 1.35V)。DDR4-3200で動かすためには電圧を1.35Vにする必要有。
  • CASE : IN WIN Chopin IW-BQ696S (Silver, Mini-ITX対応, 幅84 x 高さ244 x 奥行き217mm, 高さ43mmのCPUクーラーまで対応)
  • 電源 : IN WIN Chopin IW-BQ696S付属の150W電源、だと思う。
  • SSD : 今まで使っていた SanDisk Ultra II 240GB SDSSDHII-240G-J26 をそのまま流用。

CPU は、今まで使ってた Ryzen 3 2200G (4コア4スレッド, 3.5 - 3.7GHz)から、Ryzen 5 2400G (4コア8スレッド, 3.6 - 3.9GHz)にパワーアップした。内蔵GPUも強力になっているらしい。

メモリも、8GB から 16GB になった。ただ、今回使ったメモリの設定には要注意。DDR4-3200 まで対応してるメモリだけど、BIOSのデフォルト設定では DDR4-2400 で動いてしまう。電源投入直後にDELキーを叩いてBIOSに入って、「メモリー周波数 : DDR4-3200MHz」「DRAM電圧 : 1.35V」に設定すれば、DDR4-3200 で動いてくれる。

各パーツの詳細情報ページへのリンクもメモしておく。

_Radeon RX Vega 11グラフィックス搭載AMD Ryzen 5 2400G | AMD
_IS-40X | Ainex
_PRIME A320I-K|マザーボード|ASUS 日本
_G.Skill F4-3200C16D-16GFX (DDR4-3200 CL16 8GB×2) | OCMEMORY | オーシーメモリ
_Chopin|In Win|株式会社aiuto PCパーツ・周辺機器 総合代理店
_これで全てが分かる。In Win「Chopin」徹底解説 - エルミタージュ秋葉原

省電力PCについてメモ。 :

AMD Athlon Quad-Core 5350 を載せているPC一式も貰った。今となってはCPUスペックが低過ぎて使い道がないとのことらしい。TDP 25W のCPUなので、かなり省電力。

  • CPU : AMD Athlon Quad-Core 5350 (4コア, 2GHz, Socket AM1, TDP 25W, Kabini, Jaguarコア, 2次キャッシュ: 2MB, SSE4.1/4.2, AVX, GPU内蔵, GCN世代, Radeon R3 (Radeon HD 8400))
  • M/B : ASRock AM1H-ITX (Socket AM1, Mini-ITX, DDR3-1066/1333/1600 x 2, 最大16GB, シングルチャネルのみ, SATA x 4, DisplayPort x 1, HDMI x 1, DVI-D x 1, D-SUB x 1, ACアダプタでも駆動可能)
  • RAM : 4GB x 1 (M/Bがシングルチャネルのみ対応なので、2枚載せてもアクセスは速くならない)
  • SSD : SanDisk Ultra II SDSSDHII-240G (240GB 2.5インチSSD, TLC, 厚さ7mm, SATA 6Gb/s)
  • CASE : IN WIN Wavy II IW-BMR651 (Mini-ITX/Mini-DTX対応スリムケース, 幅112 x 高さ264 x 奥行き230 mm)
  • 電源 : ACアダプタ iBUFFALO BSACA01TO19, FSP090-D2CA1 (19V, 4.74A, TOSHIBA 19V用)。ケース付属の電源は壊れてしまったので、 ACアダプタで動くM/Bを入れて、ノートPC向けのACアダプタを電源として利用していたとのこと。

OSはWindows10。Windows8.1 Home OEM (DSP?)からのアップグレード。

CPUが古くてWindows10のアップグレードも難しいと弟は言ってたけど、以下の一覧表を眺めた感じでは、Windows10 21H2 までは一応アップグレードできそうだなと…。

_Windows のプロセッサの要件 - Windows 10 21H2 でサポートされている AMD プロセッサ | Microsoft Docs

各パーツの詳細情報ページへのリンクもメモ。

_【レビュー】自作PC初のソケット式SoC、Athlon 5350をテスト - PC Watch
_ACアダプタ推奨、ASRock「AM1H-ITX」とAthlon 5350で組む省電力PC - エルミタージュ秋葉原
_AMD デスクトップCPU スペック・性能比較 | パソコン工房 NEXMAG
_IW-BMR651:In Win MiniITX対応 PCケース 「Wavy II」 | CFD販売株式会社 CFD Sales INC.
_BSACA01TO19 : ノートPC用ACアダプター | バッファロー

その他のパーツをメモ。 :

  • CPU AMD Ryzen 5 3600 (6コア12スレッド, 3.6 - 4.2GHz, Socket AM4, 第3世代コア, TDP 65W, 2次キャッシュ3MB, 3次キャッシュ32MB)
  • CPUクーラー Thermaltake MeOrb II CL-P004-AL08BL (Socket AM1対応, TDP 65Wまで, 高さ35mm)
  • ワイヤレスキーボードセット Logicool MK240 (省スペースワイヤレスキーボード+3ボタンマウス, MK245より受信機が大き目らしい)
  • ビデオカード RD-RX550-E2GB/LP (Radeon RX 550, PCI-Express 3.0, ロープロファイル対応, VRAM 2GB, HDMI x 1, SL-DVI-D x 1)
  • HDDリムーバブルケース RATOC REX-SATA SA-RC1 x 3個。トレイ x 6個。
  • 3.5インチHDD TOSHIBA MD04ACA300 (3TB, 7200rpm, SATA600)
  • 3.5インチHDD TOSHIBA DT01ACA200 (2TB, 7200rpm, SATA600, CMR, Cahce 64MB) x 4台
  • M.2 2280 PCIe Gen3x4 SSD ADATA XPG SX6000 Lite ASX6000LNP-512GT-C (512GB, M.2 Type2280, PCI-Express Gen3, 3D NAND, MTBF 180万時間, 240TBW, 厚さ2.15mm)

_MeOrb II
_コンパクトでも打鍵感しっかり!Logicool ワイヤレスコンボ MK240 / MK245 NANO | ジユウメモメモ
_玄人志向 | RD-RX550-E2GB/LP:Radeon RX 550 搭載 グラフィックボード (PCI-Express)
_SATAリムーバブルケース SA-RC1-LG/BK/WH/SV[RATOC]
_価格.com - ADATA XPG SX6000 Lite ASX6000LNP-512GT-C スペック・仕様

Logicool製ワイヤレスキーボードセットは、茶の間に置いてあるPC用に使うことにした。今まで置いてあった Logicool K400r はタッチパッド付きだけど、親父さんはマウスじゃないと操作ができないと不満を漏らしていたので、キーボード+マウスセットのほうが都合がいいはず。

M.2 SSD は…どこに使おうか…。メインPC周りに使うか、サブPC周りに使うか…。

弟の話では、3.5インチHDD、TOSHIBA MD04ACA300 は旧富士通系のHDDで、DT01ACA200 はHGST系のHDDらしい。前者についてググってみたら、数年で壊れたという報告がチラホラ…。うーん。

#2 [pc] CR2032ホルダーを半田付けした

弟から貰った Mni-ITX M/B ASRock AM1H-ITX についてるコイン型電池(CR2032)は、電池が切れてしまっていて、時刻やBIOS設定が保持されない状態になっていた。

ただ、このM/B、電池交換が簡単なタイプではない…。ノートPCやMini-ITX M/Bで多いタイプ ―― コネクタ+コードの先で、コイン型電池が直接コードに半田付けされてしまっているタイプなので、交換が面倒臭い。

_インテルデスクトップ・ボードの CMOS バッテリー

ちなみに、上記ページによると、コネクタは Molex * 1x2コネクター(51020-0200) らしい。

今後のことを考えて、CR2032電池ホルダーをコードの先に半田付けして、電池交換作業が多少は簡単にできる状態にしたい。幸い、電池ホルダーは、以前、共立エレショップさんから通販で予備を購入してあったので、その気になればすぐにでも作業を始められるけど…。

_コイン型電池ホルダ / GS074A-021G

しかし、スイッチ+リード線がついてるタイプのほうが、電池の絶縁について深く考えないで済むので、そちらを再度注文したほうがいいのだろうかと悩み始めてしまった。どうしたもんか。

_コイン電池ホルダ スイッチ&リード線タイプ / CR2032-1CL

でもまあ、ひとまず、この電池ホルダーを使って作業してしまおうか…。通販で注文すると時間がかかるし、せっかく電池ホルダーが手元にあるのに埃を被ってたらもったいないし…。

ちなみに、コイン型電池ホルダ GS074A-021G の端子をテスターで調べたら、以下のような配置になっていた。もちろん、「+」と刻印されている側に、電池のプラス面を合わせて差し込まないといけない。

cr2032_holder_ss01.jpg

元のコイン型電池を取り出した。 :

M/B についていたコイン型電池を取り外してみた。電池の周りのビニールを剥がしてみたら以下のような見た目だった。

cr2032_holder_ss02.jpg

CR2032にしっかりと半田付けされてしまっている。どうしてこういうことをするかなあ…。電池交換できないじゃん…。いやまあ、何か理由があるんだろうけど。

電池ホルダーを繋いだ。 :

コードをニッパーで切断して、先端に電池ホルダーを半田付けで繋いでみた。

cr2032_holder_ss03.jpg

半田付けをした部分は、直径1.5mmの熱収縮チューブで囲んでおいた。ちょっと緩いけど、何もつけないよりはマシかな…。ちなみに、熱収縮チューブの周りで半田ごてを直接触れずにウロウロさせれば、ある程度は収縮してくれる。

端子は3つあるけれど、そのうち2つしか使わないので、残り1つの端子はニッパーで短く切断。

CR2032を差し込んでから、テスターを使って、コネクタ端子に3Vの電圧が出ていることを確認した。CR2032の上から、自己融着テープを巻いて、更にその上からビニールテープをぐるぐる巻きにした。

cr2032_holder_ss04.jpg

なかなかに酷い見た目…。とは言えこんな状態でも、M/Bに取り付けたら、ちゃんとBIOS設定や時刻が記憶されるようになった。一応、目的は果たせた。

問題点。 :

これで一応、電池交換はできたけれど、少々問題が…。

この電池ホルダーは、CR2032を一度はめ込んでしまうと、外すのが容易ではない模様。試しに取り外そうとして頑張ってみたけれど、自分の握力では歯が立たなかった。次回、電池交換をする時に困りそう。

やはり、蓋とスイッチ付きの電池ホルダー(CR2032-1CL)を入手して作業したほうが良かったかもしれない。そちらなら間違いなく、蓋を開ければ電池を容易に取り外すことができるし、電池ホルダーのコードが30cmぐらいあるので好きな位置に設置することもできる。

2022/05/15追記。 :

「電池ホルダーのコードが30cmぐらいある」と書いてしまったけど勘違いだった。5〜10cmぐらいだった。

2022/05/05(木) [n年前の日記]

#1 [pc] CPU交換前の下準備中

メインPCのCPUを交換したいので下準備中。

ちなみに、今現在使っているのは AMD Ryzen 7 1700。これを、AMD Ryzen 5 3600 にしたい。

BIOSをアップデート。 :

使っているM/B、GIGABYTE B450M S2H (rev. 1.x) のBIOSを、F50 から F63a にアップデートした。

  1. GIGABYTE のサイトから、mb_bios_b450m-s2h_f63a.zip を入手して解凍。
  2. 中に入ってる B450MS2H.63a をUSBメモリのルートディレクトリ直下にコピー。
  3. PCを再起動。
  4. 起動時にDELキーを叩いてBIOS設定画面に入って、USBメモリを差してある状態で、Q-Flash を選択。
  5. USBメモリ内のファイルを選択して、BIOSアップデート。数分待たされる。
  6. アップデートが終わると、自動で2回ほど再起動する。
  7. BIOS設定は初期化されているので、DELキーを叩いてBIOS設定画面に入って、元の設定に戻しておく。自分の場合、仮想PC関係(SVM Mode)を有効にした。

Chipset driverをアップデート。 :

BIOSをアップデートしたので、ついでに Chipset driver もアップデートしておいた。

  1. GIGABYTEのサイトから、mb_driver_597_chipset_3.10.22.706.zip を入手して解凍。
  2. 中に入っている mb_driver_597_chipset_3.10.22.706.exe を実行。

これも結構待たされた。

CPUグリスを発掘。 :

部屋の中からCPUグリスを発掘。3つほど見つかったけど、2つは MMX Pentium時代のCPUグリスだから、もう使えないのでは…? 中身が固まってなかったとしても、熱伝導率が低かったりしないか…。

一番新しいのはシルバーグリスと書いてあったけど、中身がどの程度残っているのか…。

_mieki256's diary - A8-3850機の動作確認を開始

グリスの型番をメモしてないな…。Amazonの履歴を辿ったら、AD-DA シルバーグリス Arctic Silver 5.0 【 定番 】、と書いてあった。現在価格は 1,893円…。3.5g入りとは言え、高い…。ちなみに当時は 1,080円で購入したらしい。値上がりしてるのだな。

2022/05/06(金) [n年前の日記]

#1 [pc] メインPCのCPUをRyzen 5 3600に交換してみた

メインPCのCPUを、Ryzen 7 1700 (8コア16スレッド, 3.0GHz) から Ryzen 5 3600 (6コア12スレッド, 3.6 - 4.2GHz)に交換してみた。作業に1時間半ぐらいかかった気がする。

CPUクーラーについて。 :

Ryzen 7 1700 のリテールCPUクーラーは、バックプレートに4ヶ所ネジ止めするタイプ。Ryzen 5 3600 のリテールCPUクーラーも同じタイプ。つまり、バックプレートのあたりに ―― M/Bの裏側に手が届かないと作業ができない。

幸い、使ってるMicroATXケース、Cooler Master Elite 342 RC-342-KKN1-GP は、バックプレートのあたりに穴が開いていたので、ケースの両面を外してしまえば作業ができた。もし穴が開いてなかったら、一旦 M/B を外して作業することになって、もっと面倒臭かったはず。

Ryzen 5 3600 のリテールCPUクーラーは、AMD Wraith Stealth Cooler という最下位のクーラーらしい。Ryzen 7 1700 のクーラーと違って、LEDはついてないし、ヒートシンクも背が低い形だった。

ただ、巷のレビュー記事によると、このCPUクーラーは冷却性能が弱いのか、あるいは Ryzen 5 3600 の発熱が凄いのか、Ryzen 5 3600 が80度〜90度まで行ってしまう時があるらしい…。違うCPUクーラーを入手するべきだろうか…。ただ、自分が使ってるPCケース、Elite 342 は、幅180 x 高さ352 x 奥行き440 mm なので、12cmファンを使ったCPUクーラーはおそらく入らない。9cm前後のファンを使っているCPUクーラーを探してみることになるのかな…。

CPUグリスについて。 :

CPUグリスは、手持ちのシルバーグリス、AD-DA シルバーグリス Arctic Silver 5.0 の残りでなんとかなった…気がする。たぶん。量的に足りているのか、若干不安だけど…。

今回は、CPUの周辺5mmほどを、100円ショップで買ってきたマスキングテープを使ってマスクしてから、CPUグリス付属のへらを使って塗ってみた。キッチリと真四角な見た目でグリスを塗れた。次回この手の作業をする時も、このやり方を試そう…。

余談。Ryzen 7 1700についたCPUグリスは、キッチンペーパー+消毒用エタノールで拭き取ってみた。CPUグリスの拭き取りにエタノールは効果無し、アレは迷信みたいなものという話や、灯油をつけて拭き取ると完璧に落ちるという話も見かけたけれど、それはなんだかちょっと怖い…。

_CPUに付いている古いグリスの落とし方〜エタノールは間違いだった! | 創造の館
_CPUグリスの拭き取りって無水エタノールよりIPAの方が良いらしいんだけど皆どうしてる? : 汎用型自作PCまとめ

今頃気づいたけど、キッチンペーパーの類は銅部分に傷をつけると書いてある…。自分はやらかしてしまった…?

fTPMについて。 :

CPU交換後、最初の起動時に、「CPUが変わった」「fTPMをリセットするか?」と尋ねてきた。今までfTPMは無効にした状態で使っていたので、とりあえず「Y」を押してリセットを選んでみたけど…。本来はどうするのが正しいのだろう…。

ベンチマークを取ってみた。 :

Cinebench R15, R20, R23 でベンチマークを取ってみた。

* AMD Ryzen 7 1700 (8core, 16thread, 3GHz)
* AMD Ryzen 5 3600 (6core, 12thread, 3.6 - 4.2GHz)

Cinebench R15
-------------

* AMD Ryzen 7 1700 Cinebench R15 multi : 1406 cb
* AMD Ryzen 7 1700 Cinebench R15 single : 146 cb
* AMD Ryzen 5 3600 Cinebench R15 multi : 1528 cb
* AMD Ryzen 5 3600 Cinebench R15 single : 192 cb

Cinebench R20
-------------

* AMD Ryzen 7 1700 Cinebench R20 multi : 3017 pts
* AMD Ryzen 7 1700 Cinebench R20 single : 361 pts
* AMD Ryzen 5 3600 Cinebench R20 multi : 3508 pts
* AMD Ryzen 5 3600 Cinebench R20 single : 473 pts

Cinebench R23
-------------

* AMD Ryzen 7 1700 Cinebench R23 multi : 8135 pts
* AMD Ryzen 7 1700 Cinebench R23 single : 934 pts
* AMD Ryzen 5 3600 Cinebench R23 multi : 8963 pts
* AMD Ryzen 5 3600 Cinebench R23 single : 1220 pts

Ryzen 5 3600 にしたことで、たしかに処理が速くなった模様。コア数やスレッド数は、8コア/16スレッド → 6コア/12スレッドと減ってるけれど、シングルコアの性能が上がったし、クロック周波数も高くなったので、トータルでは上回ったのだろうなと…。

2022/05/07() [n年前の日記]

#1 [pc] HDDの中身を確認中

先日弟から貰った中古HDDの中身を確認中。手持ちの外付けHDDケース、COREGA CG-HDCU3000F (USB2.0接続) に、TOSHIBA MD04ACA300 (3TB, 7200rpm, SATA600) を入れて、Windows10 x64 21H2 に繋いで確認。

空じゃなかった…。800GBほど、なんか色々入ってる…。これは消していいのか、消したらマズいのか…。よく分からんから、一応残しておくか…。

ついでに、部屋の片隅で埃を被ってた、別の外付けHDDケースの中身も確認。玄人志向 GW3.5AA-SUP3/MB (USB3.0接続) + WESTERN DIGITAL WD20EZRX (2TB, 5400rpm)。中には、以前の親父さんPCのSSDのバックアップ、150GBほどが入ってた。

それぞれ、HDDケース CENTURY CLS35EU3BF (USB3.0 or eSATA) + HGST HDS723020BLA642 (2TB, 7200rpm) にコピーすることにした。WD20EZRX の中身をコピーして、WD20EZRX はクイックフォーマット。HDDケースから取り出した。

GW3.5AA-SUP3/MB に MD04ACA300 を入れて、これも HDS723020BLA642 にコピー。MD04ACA300 もクイックフォーマット。

せっかく 3TB のHDDが手に入ったのだから、手元に3つほどある、1TB の外付けHDDの中身を移して、外付けHDDの台数を少し減らしてみたい…。ただ、手持ちの 1TB外付けHDD群は、どれもUSB2.0接続なので転送速度が遅い。一応コピー作業を始めてみたけれど、1TBの転送は8時間以上かかる模様。

eSATA接続のHDDケースの扱いに困ってる。 :

手元には、USB3.0/eSATA接続のHDDケースが3つほどあるけれど、今現在使ってるPCではeSATA端子が無くなってしまったので扱いに困ってる。

M/B上で余ったSATAポートがあれば、そこから外にケーブルを出してeSATA端子として使えるけれど、現在使ってるM/Bの、4つのSATAポートは、既に全部使ってしまっている…。昔のM/BはSATAポートが6つぐらいあったり、バックパネル側にeSATA端子がわざわざ用意されていたのだけどなあ…。

USB3.0とeSATAの両方をサポートしたHDDケースが販売されていた時期は、USB3.0への対応がまだちょっとアレな時期で、eSATA接続なら安定動作するけれど、USB3.0接続では問題が発生するHDDケースがほとんどだったそうなので、USB3.0/eSATA両対応と言っても、実際には迂闊にUSB3.0接続で使うわけにもいかない。まあ、USB2.0で接続すれば問題回避できるらしいのだけど、もちろん転送速度は遅くなる…。とは言え、転送中にファイルが壊れたら話にならないし、我慢するしかない…。

ググってみたら、10年ぐらい前に「なぜeSATAは普及しなかったのか」等々言われていたようで。遥か昔に廃れていた規格なのだな。道理でどのM/Bにもついてないわけで…。そりゃまあ、今ではUSB3.0を使えば済むもんな…。今から eSATA をどうにか使うべく何かしらを追加購入するより、USB3.0接続HDDケースを買ったほうが安いのであろう予感も…。

コンセントが足りない。 :

外付けHDD用の電源コンセントが足りない。6個口の個別スイッチ付き電源タップだけでは足りなくて、仕方なく、更に3個口のタップを差してどうにかしているけど…。

PC周辺機器の電源ってどうにかならないのかな…。特に外付けHDD。ACアダプタの出力は、えてしてDC12V、1.5 - 2.0Aなのだから、規格を作って数ポート給電できるようにすればコンセント一つで済みそうな気もする。

もっとも、2.5インチモバイルHDDを選択すれば、USB3.0ケーブル1本で済んでしまうか…。あるいは、今は大容量の3.5インチ外付けHDDがあるのだから、そういった製品に移行していけば台数も少なくて済むのかな…。でも、こういった部分で規格を作らずに、各製品が独自の形状で電源を用意してたあたりに、なにかこう…。

リチウムイオン充電池もそうだけど、どうして規格を作らないのか…。

#2 [movie] 「シティーハンター THE MOVIE 史上最香のミッション」を視聴

BS12で放送されていたので視聴してみた。初見。フランスで実写化された「シティーハンター」。監督さんと奥さんが、主人公+ヒロインを演じているらしい。

面白かった…。次から次へと「もっこり」なネタが…。また、日本の漫画/アニメのパロディ? オマージュ?も多々織り交ぜられていて、なんとなく宝探し感覚も味わえた。それでいて、アクションシーンでは結構凝った見せ方を提示していたりもして、かなり感心してしまった。 *1

監督さんの、原作への愛が感じられる映画だった。見れて良かった…。この映画は、良い。素晴らしい。
*1: 特に、主人公が一人称視点でアクションするところはシビレタ。彼は毎回あんな光景を目にしつつ活躍していたのかもしれないのだな…。みたいな。

2022/05/08() [n年前の日記]

#1 [moho] Moho 13.5.4が公開されたらしい

2Dアニメーション作成ソフト Moho の 13.5.4 が公開されたらしい。DLしてアップデート。

変更点は以下。

_Moho 13.5.4 is available! Update now! - Moho Forum

ボーン表示の太さを設定で変えられるようになった模様。

#2 [pc] HDDの中身をコピー中

手持ちの外付け1TB HDD群の中身を、3TBのHDD、玄人志向 GW3.5AA-SUP3/MB + TOSHIBA MD04ACA300にコピーしようとしているところ。

まず、転送先のHDDに対して、HDD-Scan 2.0 でセクタチェックをした。不良セクタは見つからなかった。

コピーを始めたけれど、USB2.0接続HDDからUSB3.0接続HDDにコピーしているので、USB2.0接続の速度しか出ないわけで…。1台あたり、8時間以上かかる…。

2022/05/09(月) [n年前の日記]

#1 [pc] HDDの中身をまだコピー中

手持ちの外付けHDDの中身を別のHDDにコピー中。

1TBの外付けHDD、BUFFALO HD-HES1.0TU2 の電源が入らなくて、一瞬目の前が真っ暗になったけれど、HD-HES1.0TU2 の背面を眺めたら「POWER MODE」というスイッチがあって、そこが「Auto」になっていた。試しに「Manual」に切り替えてみたところ、電源が入ってくれてホッとした。おそらくだけど、かなり古いHDDなものだから、今時のPCとの電源連動機能が正常に働かなかったのではないかと…。「Manual」にして、PC側の状態など関係なく電源を入れる設定にすれば電源が入るのだろう。たぶん。

Windows10 x64 21H2上で、Fire File Copy を使ってベリファイをしながらコピーしているけれど、結構時間がかかる…。でもまあ、ベリファイしながらコピーしないと、万が一ファイルが正常にコピーできてなかった時に泣いてしまうので、仕方ないよな…。

2022/05/10(火) [n年前の日記]

#1 [pc] イソプロピルアルコールを入手

ホームセンターサンデーに寄って、ガソリン用水抜き剤なるものを購入してきた。古河薬品工業株式会社 KYK 鮮烈 ガソリン用水抜き剤。税込216円。

成分・含有量の欄には「イソプロピルアルコール(99wt%)、防錆剤」と書いてある。内容量200ml。用途の欄には、「自動車用燃料タンク内の水溶解のための燃料助剤」と書いてあった。

どうしてコレを買ってきたかというと…。なんでも、CPUグリスを拭き取る際にイソプロピルアルコール(IPA)が有効らしいと聞いたから。

いやまあ、CPUグリス拭き取り用を謳う薬品は、AINEX から販売されているのだけど、30cc で 900円前後のお値段なので…。お試しで買うのは、ちょっと…。

_IPA-CLN2 | Ainex

要するに IPA とやらを入手できればいいのではないかとググってたら、ガソリン用水抜き剤にも IPA 99%のものがあると知り、更に、人によってはソレを使ってキーボードを掃除したという話も見かけたので、値段が安いのであれば試しにゲットしてみようかと。

ただ、防錆剤とやらも一緒に入っているのが気になる。それが何か悪さをしたりしないのだろうか…。

他にも、イソプロパノールなる成分が入った消毒液も見かけたのだけど…。イソプロピルアルコールとイソプロパノールは違うのだろうか…? よく分からん…。

#2 [pc] HDDスタンドその他を入手

Amazonに注文していた、HDDスタンドその他が届いたのでメモ。


_LGB-1BSTU3 - ロジテック株式会社

HDDスタンドについて。 :

ここ数日、HDD数台の中身について確認作業をしているけれど、一々外付けHDDケースの中にHDDを入れたり抜いたりするのが面倒臭くて…。ここはHDDスタンドの類を入手して作業したほうが良さそうだなと。

一応、そういった作業をするために、裸族の頭という製品を持っていたのだけど。ACアダプタが劣化してしまったのか、繋いだHDDが動いてくれない場面が多くなってしまって、ほとんど使えない状態で。ACアダプタだけを入手したくても、特殊な仕様のACアダプタなので入手も難しく。

初期の裸族の頭のACアダプタは、出力端子が4ピンペリフェラルコネクタ(IDE接続時代に使われていた電源コネクタ)の形状、かつ、12Vと5Vを出力する、ちょっと特殊な仕様なので、そんなACアダプタは入手しづらい。ただ、現行製品の裸族の頭シリーズは、ACアダプタも一般的なDC12V/2Aのモノに変わっているらしい。やはり入手性が悪かったんだろう…。

そんなわけで、裸族の頭の代替としてHDDスタンドを使えたらいいな、と思っているところ。IDE接続HDDは繋げられないけれど、今からIDEを使う場面はほとんど無いだろうし…。

ブザーユニットについて。 :

ブザーユニットは、手持ちのブザー用スピーカがとうとう無くなってしまったので、さすがに買わないとダメだなと。

こういうパーツを電子工作のノリで自作できればいいのだけど、どういうブザーを入手したらいいのかが分からない。いかにもなスピーカを繋ぐ手もあるけど、今時あの大きさはちょっと勘弁な気もするし。

USB3.0ハブについて。 :

USB3.0ハブは前々から欲しかったので、せっかくAmazonで注文するならこの際一緒に注文してしまおう、と。

USB3.0関連機器を接続し直す際に、PCデスクの裏側にゴソゴソと潜り込んで、PCの背面を弄るのはシンドイ。これで、裏に潜らずに繋ぎ直すことができるはず。

PCIブラケットについて。 :

USB3.0 PCIブラケットは、M/B背面のUSB3.0ポートが4つしかなくて足りなくなってきたので、少しでもポートを増やしたくて購入。

自分が使ってるPCケース、Cooler Master Elite 342 RC-342-KKN1-GP は、結構古いPCケースだから、ケース前面にUSB3.0ポートがついてなくて、M/B上のUSB3.0ピンヘッダが無駄になってた。これでUSB3.0ピンヘッダを有効活用できる。

ただ、実際に使ってみたら、ちょっと問題が…。USB3.0ケーブルを差し込もうとして少し力を入れたら、金属のブラケット部分が曲がりそうになってしまった…。自分は握力の類がほとんどないはずなのに、それでもこんなに反り曲がってしまうとは…。この手の製品で一番安いものでいいだろうと注文してみたけれど、おそらくこういう部分で違いが出てくるのだろうな…。

とりあえず、少しぐらい差し込みが甘くても問題が出にくいであろう、USB2.0ハブを繋いでおいた。そのUSB2.0ハブは、今までM/B背面のUSB3.0ポートに繋いでいたので、これで1ポートは空きができる…。

2022/05/11(水) [n年前の日記]

#1 [nitijyou] 網戸を張替えてみた

玄関の網戸が破れてボロボロになっていて、お袋さんから張替えを要望されてたので、試しに作業してみた。

事前に、張替え作業について、YouTubeの動画等を眺めて確認。

_一人でも簡単にできる 網戸の張り替え方 | ホームセンター ビバホーム
_【網戸の張替え】1人で簡単にできる網戸の張り替え方法|コツ&道具 - YouTube

必要な品を購入。 :

ホームセンターホーマックで、以下の3つを購入。
  • 張替え用の網。網目の細かさは32。サイズ 91cm x 2m。色はグレー。税込701円。
  • 張替え用のゴム。直径5.5mm。長さ7m。税込217円。
  • 張替え作業用の専用カッター。税込327円。

網には目の細かさがあるらしい。店頭で一番多かったのは24メッシュで、値段も300円台で一番安かったけど、お袋さんから、「空気の流れが多少悪くなっても、虫が入ってこないほうが良い」と言われたので、32メッシュを選んでみた。

色は、黒のほうが外の風景も中の風景も良く見えるらしいけど、これまたお袋さんから、「玄関につけるものだから、外から中があまり見えないほうが良い」と言われたので、グレーを選んだ。

ゴムの太さは5種類あるらしい。今まで使われていたゴムを一部切り出してノギスで測定。直径5.5mmのものが使われていた模様。

専用カッターについては、親父さんから「そんなものは要らない」「ハサミとカッターでどうにかなるだろ」と言われたけれど…。親父さんは見栄えを全く気にしない人なので、その言に従ったら酷い見た目になりそうだなと…。今後何度も使う可能性を考えて、一応購入。ただ、現物を見た感じでは、自作できそうな気もする…。いや、自作の手間暇を考えたら数百円で買ったほうが安いかな…。

本来は、これらに加えて、ゴムを埋め込んでいくためのローラーが必要になるのだけど、何故か親父さんがローラーだけは持っていた。ということは、以前親父さんもこの手の作業をしたことがあるのではないかと思うのだけど、当人には全く記憶が無いそうで。

作業してみた。 :

洋間に新聞紙を引いて、玄関の網戸を置いて、自分と、お袋さんと、妹の3人であーだこーだ言いながら作業。

ゴムを埋め込んでいくあたりで結構な力が必要なのと、どうしても網がたるんでしまうあたりがアレだったけど、一応それっぽく張替えができた。3人とも、結果に満足。

いやまあ、作業の半分ぐらいは妹がやってくれて、自分とお袋さんは、手順を把握するためにちょっとだけ作業した感じだったけど…。何にせよ、今回の作業で、道具と材料さえあれば自分達でも ―― 例えば女性一人でも張替え作業ができそうだなと分かった。

2022/05/12(木) [n年前の日記]

#1 [pc] HDDの確認がやっと終わった

弟から貰った中古HDDの中身の確認がやっと終わった。

HDDスタンド Logitec LGB-1BSTU3 を入手して正解だった。外付けHDDケースにHDDを入れて確認する場合と比べると、圧倒的に作業が楽。まるでファミコンカセットのようにHDDを差し込んで、電源を入れれば、すぐに中身が見れるあたりはとても便利。

ただ、この手のHDDスタンドは、ちゃんとコネクタが刺さってるのか見た目で分からないので、その点は若干不安。もしかするとケースが透明なほうが、コネクタの刺さり具合を目視で確認できて便利なのかもしれない。海外メーカの製品ならそういうのもあるっぽいけど。どうしてこの手の製品は、えてして黒くて不透明のケースにするのだろう。美観の問題だろうか。まあ、そのあたりが気になるなら、裸族の頭シリーズのような変換コネクタを入手してしまえば、コネクタの刺さり具合も確認できて安心できるのかも。

とりあえず、今回中身を確認して空にしたHDDを、録画用PCに追加したい。ただ、各個体の使用時間は、60、180、7000、8000時間とバラバラ。使用時間が長い個体を使ったほうが安心できるのか、それとも短いほうが安心できるのか、どっちなんだろう。

#2 [pc] HDDリムーバブルケースを増設しようとして失敗

録画用PCに、先日弟から譲ってもらったHDDリムーバブルケース、RATOC REX-SATA SA-RC1 を増設しようとしたのだけど、残念ながら失敗。

HDDリムーバブルケースが、5インチベイに入らない…。無理矢理押し込んでいったら、今度はなかなか外れない状態になって、汗だくで抜き取る羽目になった。シルバーの個体が2つ、無塗装の個体が1つあるけど、どれも入らない。これ、元々の寸法がおかしいのとちゃうか。

それとも、おかしいのはPCケース側なのだろうか。使ってるケースは、かなり昔にハードオフで買った中古のMicroATX対応ミニタワーケースなので、5インチベイのあたりが歪んでる可能性も否定できない。でも、おそらくは IN WIN製のケースだろうから、元々それほどおかしい作りではなさそうだけど。

リムーバブルケースの奥行きが長い点も困る。ATX電源とぶつかってしまう。いやまあ、PCケースの奥行きが短いのがいかんのかもしれんけど。

仕方ないので、リムーバブルケース増設は諦めた。3.5 - 5インチ変換マウンタをHDDにつけて、5インチベイ2つに入れて固定することにした。

PCケースを一々開けずにHDD交換ができるようにしたかったのだけど…。残念。

追加したHDD等についてメモ。 :

今回追加したHDDは、3.5インチHDD TOSHIBA DT01ACA200 (2TB, 7200rpm, SATA600, CMR, Cahce 64MB) x 2台。

今までは500GBのIDE HDDに録画していたので、ふと気づくと空き容量が無くなっていて、番組が軒並み録画できてなかった、てな状況がちょくちょくあったのだけど。録画用HDDが2TBもあれば、そういう状態も多少は避けられるはず。HDDが一杯になったら、もう片方の2TBに移動してしまえばいいし。

500GB HDDとは別に今まで付けていた2TB HDD、Western Digital WD20EARS (2TB, SATA300, Cache 64MB) は、空き容量がほとんど無くなっていたはずなので取り外すことにした。USB2.0接続外付けHDDケースに入れて、Read only で使ってみたい。tsファイルの再生だけならUSB2.0接続でもなんとかなるだろうし。

#3 [anime] 「機動警察パトレイバー 2 the Movie」を視聴

BS12で放送されていたソレを録画していたので視聴。何回目の視聴だろう…。

やっぱり面白いな…。いやまあ、実を言うと初見時は難しくて何だかよく分からなかったのだけど、何度も見てるとさすがに面白さが少しずつ分かってきたというか。

それにしても押井守監督は、うる星やつらも、パトレイバーも、攻殻機動隊も、1作目は比較的バランスが取れているけど、2作目は暴走して作家性全開になる傾向があって、そのあたりもなんだか面白い…。

2022/05/13(金) [n年前の日記]

#1 [pc] CR2032電池ホルダーを購入

今まで親父さん用PCに使っていた、Mini-ITX M/B BIOSTAR RACING B350GTN 上のコイン型電池(CR2032)が、Mini-ITX M/B にありがちな、半田付けされたソレだった。このままだと後々電池交換する時に絶対に困る。ここは電池ホルダーをつけないといかんなと…。

そんなわけで、共立エレショップさんで、CR2032ホルダーその他を通販で購入。せっかくだから、他の電子部品も注文した。

ネコポス便で、送料310円。

一応、届いた各パーツの写真も撮っておいた。

01_eparts_ss.jpg

CR2032ホルダーと交換。 :

材料が届いたので作業してみた。

まず、BIOSTAR RACING B350GTN の写真を撮っておいた。赤と黒の線の位置を覚えておかないといけないので…。

02_b350gtn_cr2032.jpg


取り外してみた。電池部分は両面テープでM/BのLAN端子の横に貼り付けてあったので、カッターで少しずつ切れ目を入れて剥がしていった。

03_b350gtn_cr2032_2.jpg

黒いビニール(?)で覆われている部分の中に、CR2032が入っていて、そのCR2032には、端子が直接半田付けされている。この手の電池に対して半田付けすると、失敗した時に爆発したり火を吹いたりするので、そんな作業はやりたくない…。


赤と黒の線をニッパーで切断して、電池ホルダーをはんだ付け。ホルダーは自己融着テープでぐるぐる巻きにしておいた。

04_b350gtn_cr2032_3.jpg

写真では見辛いけれど、電池ホルダーから出ている2本の線のうち、白い模様がついてる線がプラス側。ついてない線がマイナス側。

半田付けした部分は熱収縮チューブで覆っておいた。半田付けする前に熱収縮チューブを線に通しておかないといけない点に注意。熱収縮チューブの周辺を、半田ごてでウロウロさせれば、余熱(?)で少しずつ縮んでくれる。半田ごてが直接触れないように、ギリギリでウロウロさせるあたりでちょっと時間がかかるけど…。

そのうち電池交換が必要になっても、この状態なら安心して交換できるはず。ただ、どこに固定しておけばいいのか、そのあたりで悩むけど。

#2 [movie] 「デビルマン」実写映画版を視聴

GYAOで無料配信中と知ったので視聴してみた。初見。未だに語り継がれる怪作、という説明でいいのだろうか。ずっと気になってた映画なのだけど、おかげさまでようやく見れた。

世間の皆様があまりにも叩いていたものだから、どうやら自分の中ではハードルがかなり下がっていたようで。そのせいか、実際に見てみたら結構そこそこ楽しめてしまった。こんなはずでは…。ううーん。

戦隊やライダーの映像に、更に予算を追加した感じの映像だった気がする。後で知ったのだけど、戦隊やライダーで活躍している特撮監督、佛田洋監督も参加していたそうで。そのあたりで近いものを感じたのだろうか。いや、そもそもコレも東映作品だったか…。

主役の人の演技が云々という話だったけど、個人的にはそれほど気にならなかった。何せ、毎年毎年、戦隊やライダーで新人さんの演技を目にしてきた身なので、「いや…新人さんならこのくらいがフツーの演技じゃね?」みたいな。もちろん、戦隊やライダーの新人さん達は1年通して演じているうちにグングンと成長するわけで、継続は力なりというか…。

3DCGによるバトルシーンはなかなかイイ感じだった気がする。東映アニメーションが手描きアニメのノウハウを投入してみた映像、との話だったけど、ハニメーションより全然見れる映像になってたよなと…。背景の、崩壊していく建物や地面はミニチュアに見えたけど、後で調べてみたら実際にミニチュア撮影で、その手前に3DCGキャラを合成していたそうで。ハイブリッドな作りだったのだな…。そういう試みは大好物。

暴徒のシーンや、ヒロインのアレを目にして、個人的にはそこだけでも結構満足してしまった。いやー、これはかなり頑張ったなあ…。ただ、できれば原作の見た目を再現してほしかったけど、そこまでやっちゃうと何か問題が出てくるのかな、とも。

この映画にゴーサインが出た経緯を知りたくて関連情報をググったら、めっちゃ濃い解説/考察まとめに遭遇。これは…。素晴らしい。

_実デビTIPSに関連する12件のまとめ - Togetter

上記の解説を横に表示しつつ、タイミングを合わせながら映像を見ていったのだけど、これがめちゃくちゃ楽しめた。適度なツッコミを入れつつ眺めると、こんなにも楽しめる映画になるのか…。

監督さんは嫌々作ってたのかなと勝手に想像してたけど、監督さん自身が持ち込んだ企画らしいと知ってかなり印象が変わった。また、企画としては流れてしまったけれど、セーラームーン実写版の企画を持ち込んだこともある監督さんと知って、そのあたりでも印象が変わってきた。結構変わったこと(?)を考える方だったんだなあ…。故人になられてしまったのがなんだか残念。もっと色々作ってみて欲しかった…。

「あー」について。 :

そういえば、「あー」が当時は話題になったらしいけど。自分、あそこで、脚本にはなかった「あー」を入れてみた感覚が、なんとなくうっすらと分かるというか。

これはちょっと危ない話かもしれないけど。自分、深夜に自室で、過去にやらかした失敗を何故か突然何の脈絡もなく思い出して、「あー」と叫びたくなる(けど自制する)場面があったりして。なんであの場面であんなことをやらかしてしまったんだ、どうしてこんなことになってしまったんだ、もっとどうにかできたんじゃないのか、いくらでもやりようがあっただろ、何をやってるんだ俺は、どんだけ馬鹿なんだ、みたいな強烈な自責の念。

たぶん、ああいう気持ちの「あー」を、監督さんもイメージしてたんじゃないのかなと…。

そのように想像したので、世間様の反応とはおそらくずれているけれど、自分はあの「あー」に感心したのでした。アレって、演技どうこうはもはや関係ないというか、ただ記号としてそこにインサートされただけでも妙なリアルさがある…。などと説明しても分からない人には分かってもらえないだろうけど。夜中に何故か突然「あー」と叫びたくなった危ない(?)人じゃないと分からんよな…。

もっとも、リアルさを感じる「あー」なんて、おそらくほとんどの人は実際に見たことないだろうから、何が正解なのか分からないのだよな…。自分だって、心の中では何度も「あー」と叫んでしまっているけれど、本当に表面に出してやってるわけでもないし。

見た瞬間に、「あ、そういう『あー』なのね」とピンとくる「あー」ってどういう「あー」なんだろう。ちょっと自分もイメージできない。「演技どうこうは関係ない」という感想とは矛盾するけど、新人さんに求める演技としては難易度が高過ぎたのだろうな…。たぶん。

2022/05/14() [n年前の日記]

#1 [pc] B350GTNのBIOSをアップデートした

親父さん用PCが新調されたので、今まで親父さん用PCに使っていた Mini-ITX M/B、BIOSTAR B350GTN が浮いたのだけど、せっかくだからBIOSをアップデートしておこうと思い立った。

_Best Gaming Motherboards Recommend, Computer Components Manufacturers

  1. 部屋の中から M/B固定用の板を発掘してきた。B350GTN を固定。SFX電源、電源ボタン、電源LEDを接続。HDMI接続で画面を表示しながら作業。
  2. 別PCで、BIOSアップデート用ファイル(B35AK720.BSS) を入手。USBメモリのルートディレクトリにコピー。
  3. BIOSアップデート用ファイルが入ったUSBメモリをB350GTNのUSBポートに差し込む。
  4. 起動時にDELキーを押してBIOS画面を表示。BIOSのバージョンを確認。
  5. BIOS画面でF12キーを押すと、BIOSアップデート用のプログラムが起動する。USBメモリ内のファイルを選択して処理を実行。

今までは、B35AK417.BSS (2018/04/17公開)が入ってた。最新版の B35AK720.BSS (2020/07/20公開)にアップデートしておいた。

最新版と言っても、2年前のBIOSだけど…。それでも、例えば Ryzen 5 3600 は B35AK603.BSS (2019/06/03公開)以降のBIOSで対応してるらしいので、今回のアップデートで Ryzen 5 3600等も動くようになったはず。

B350GTN のCPUサポートリストを眺めた感じでは、Ryzen 3000番台までは動くらしい。第3世代まで対応、第4世代(Ryzen 5000番台)は非対応ということなのだろう…。

念のために、Memtest86 9.4 Build 1000 を実行して、4回パスするところまで確認しておいた。

#2 [pc] Memtest86を使用

メモリが壊れてないかチェックできるツール、Memtest86 を試用してみた。Windows10 x64 21H2 上で、USBメモリに入れて使ってみた。

_MemTest86 - Official Site of the x86 and ARM Memory Testing Tool

有料版(Pro)と、無料版(Free)があるらしい。無料版の 9.4 Build 1000、memtest86-usb.zip を入手。

解凍すると、中に imageUSB.exe というファイルがある。これを実行するとUSBメモリに Memtest86 を書き込んでくれる。自分の環境では、転送先として、USBメモリ以外に、USB接続HDDも表示された。USBメモリを必ず選ぶことに注意。

BIOSTAR B350GTN + Ryzen 3 2200G で動かしてみたけれど、メモリチェックが始まるまで、体感で10分ぐらい待たされた。数分毎に、1行ずつ、何かをチェックしてる旨が表示されていたけれど…。なんでこんなに起動時間がかかるんだろう…。

それでもまあ、とりあえず、メモリチェックは実行できた。チェック中、DDR4メモリを載せていることや、どのCPUコアを使っているか等も表示されていたので、たしかに比較的新しいハードウェアに対応しているっぽい。

Memtest86 から fork した、Memtest86+ の 6.0ベータ版も公開されたという話を見かけたので、そちらも気になるところ。

#3 [linux] KNOPPIX 9.1 DVDを試用

BIOSTAR B350GTN + Ryzen 3 2200G の動作確認をするために、KNOPPIX 9.1 DVD をUSBメモリに入れて使ってみた。

USBメモリに入れる手順は以前の日記にメモしてあったので、同じように作業。

_mieki256's diary - KNOPPIX 9.1 DVDをUSBメモリにインストールした

B350GTN上で、KNOPPIX 9.1 DVD がフツーに起動してくれた。問題は無さそう。

それはともかく。手持ちの空きUSBメモリが無くなってしまった…。何かしらを買ってきたほうがいいかな…。どうしたもんか…。

#4 [pc] UBCD 5.3.9をUSBメモリに書き込んだ

PCのハードウェアチェックをするツール群をまとめてある、UBCD の 5.3.8 をUSBメモリに書き込んで使っていたけれど、5.3.9 が公開されていたのでアップデートしておいた。

_Ultimate Boot CD - Overview

作業手順は以前の日記にメモしてあった。

_mieki256's diary - UBCD 5.33 をUSBメモリにインストール
_mieki256's diary - USBメモリ内のUBCDを5.2.9にアップデートした

2022/05/15() [n年前の日記]

#1 [pcem] PCem V17を試用

昔のPC/AT互換機をエミュレーションできる、PCem の V17 が公開されていたと知ったので試用してみた。ちなみに、HDDの中には V16 が入ってた模様。

_PCem

動作には、各ハードウェアと対応したROMが必要らしい。「pcem roms v17」でググってみたところ、github上でそれらしいファイル群を見かけたので、DLして roms フォルダに上書きコピーしてみた。

以前 PCem V16 で動かした Windows98 のHDDイメージを使って動作するか確認。

環境は、Windows10 x64 21H2 + PCem V17。ホストPCのCPUは、AMD Ryzen 5 3600。

余談。PCem からホストPCにマウスのフォーカスを戻したい場合は、キーボードの Ctrl + End を押す。

PDFの閲覧。 :

Windows98上でPDFの閲覧ができるのか確認した。

Adobe Reader (Acrobat Reader ?) 5.0.5 (ar505jpn.exe, 10361792byte, md5:f20320e4c94e1d66dff73a7dac245467) までなら Windows98 でも動くらしいのでインストールしてみた。ar505jpn.exe を HFS経由で Windows10 から Windows98 に転送。実行してインストール。

_HFS - HTTP File Server

とりあえず、これでPDFの閲覧はできた。

ただ、今となっては、Adobe Reade 5.0.5 を入手する術があるのかどうか…。自分の場合、手元のHDDにインストーラが残ってたからソレを使えたけれど、少しググった感じでは、もう入手先が見当たらない…。仮にあっても、マルウェアやスパイウェアが混入してるインストーラかもしれない。ちょっと怖い。

それと、Adobe Reader 5.0.5 はバージョンが古いので、今時のPDFを開こうとすると「自分のバージョンが古くて正常に表示できない」「最新版があるならそちらをインストールしてほしい」と言ってくる。おそらく、PDFフォーマットにもバージョンがあって、そこを見てメッセージを出しているのだろう。PDFの見た目の再現性は期待できないと思っておいたほうが良さそう。

※ 2022/05/16追記。英語版なら以下で入手できそう。

_https://archive.org/details/acrobat-reader-5.0.5-multi-language

PrimoPDF 3.1が動かない。 :

仮想PDFプリンタをインストールして、PDF出力ができそうかどうか確認した。

しかし、仮想PDFプリンタ PrimoPDF 3.1 (FreePrimo32Setup_JP.exe) をインストールしても動かなかった。本来、プリンタ一覧の中から PrimoPDF を選んで印刷すればファイル保存ダイアログが開くはずだけど、何の反応もない。印刷キューには印刷要求が入って処理されているように見えるのだけど。

昔は、VMware Player + Windows98上で使えた記憶があるのだけどな…。

CutePDF Writer 3.0を試用。 :

PrimoPDF 3.1 の代替として、CutePDF Writer という仮想PDFプリンタを試してみた。

_CutePDF :: Product :: CutePDF Writer (WebArchive)

WebArchive で、CutePDF Writer 3.0 を配布している時期のページを探して、converter.exe と CuteWriter.exe を入手。converter.exe を実行してインストール後、CuteWriter.exe を実行してインストールした。

CutePDF Writer 3.2 は「OSのバージョンが違う」と言われてインストールできなかったけれど、CutePDF Writer 3.0 なら Windows98上でもインストールができた。

CutePDF Writer 3.0 なら、PCem + Windows98上でもPDF出力ができた。更に、日本語文字列を含んでいても、出力PDFに反映されていた。

ただ、CuteWriter.exe は、若干怪しいソフトなのかもしれない。と言うのも、インストーラファイル CuteWriter.exe に対して、Windows10 x64 21H2 + Windows Defender が、「Ask Toolbarが含まれている」と警告を出してくる。Ask Toolbar はブラウザハイジャッカーと呼ばれるプログラムで、IE (Internet Explorer) の設定を書き換えてしまう危ないプログラムらしい。

_Microsoft、「Ask Toolbar」をマルウェアとして扱う方針を明らかに - 窓の杜
_「Ask Toolbar」をインストールする原因と削除する方法 | ネットセキュリティブログ

しかし、今回、それらしいプロセスもプログラムも見つからなかった。ひょっとすると、Windows2000 や XP 等で猛威を振るう(?)作りだったのだろうか…? Windows98という、非常に古いOSには対応してない、ということなら嬉しいのだけど。

日本語入力ができない。 :

「半角/全角」キーを押せば、日本語IMEのON/OFFが切り替わるはずだけど、PCem V17 + Windows98上で件のキーを叩いてみたら、IMEツールバーが高速にON/OFFを繰り返す状態になってしまった。

一応、IMEツールバーをマウスクリックして、IMEのON/OFFを切り替えて使う分には、日本語入力ができるようだと分かった。ただ、ついつい癖で、「半角/全角」キーを叩いてしまっておかしなことになるだろうなと。自分のことだから絶対にやらかす。そこで、キー設定で、IME ON/OFFのキー割り当ては全部削除しておいた。これでうっかり叩いても問題は起きないはず。

もっとも、記憶力が怪しい自分のことだから、数日後には設定したことを忘れてしまって、そのうち「半角/全角」キーを叩いて「アレ? IMEがONにならないぞ?」と言い出すのだろうけど。

PCemからプリンタを使うのは難しそう。 :

ツッコミ欄で、「PCem + Windows98 で昔のプリンタが使えないか」という質問を見かけて、「そんなことできるのかな?」と気になって少し調べてみたけれど、どうやら無理っぽい。

そもそも PCem は、ハードウェア設定ダイアログの中にUSBポート関係の設定項目が存在しない。エミュレータ側にUSBポート関連が用意されてないのだから、USB接続のプリンタは使えないのではないか。たぶん。

また、サウンド関係の設定ダイアログの中に LPT という記述があったけれど、リストアップされた選択項目を眺めた感じでは、どうやらサウンド関係の項目のように見えた。

大昔のPC/AT互換機では、プリンタ接続用のパラレルポートを利用してサウンド関連機器を制御する何かがあった、という話を見かけたような気もするので、もしかするとソレ用の設定なのかもしれない。プリンタ利用を念頭に置いた設定ではない気がする。

そもそも、PCem は今時のPC上で動かすものだと思うけれど、今時のPCのM/Bには、プリンタ接続用のパラレルポートなんてついてない。昔のプリンタとやらが、パラレルポート接続のプリンタだとしたら、今のPCには接続することすらできない。 *1

そんなわけで、「Windows98用ドライバしかないプリンタをどうにか使いたい」「PCemを利用できないか」という問いに対しては、「たぶん無理」「大昔のPC実機を入手して、その実機にWindows98をインストールして使うしかなさそう」という答えになるのかなと。自信無いけど。

※ 2022/05/16追記。ググってたら、LPT Device にプリンタ名が表示されているスクリーンショットを見かけた。

_Dot-matrix printing in PCem - PCem

もしかして、PCem からプリンタを制御することもできるのかなと期待したけれど、よく読んでみたら、これはプリンタのエミュレーションっぽい。プリンタの印刷結果に近い見た目の画像ファイルを出力する、と書いてあるように見える。やはり実存しているプリンタから印刷することは考えてないのではないか…。どうなんだろう。

設定画面をメモ。 :

どんな設定をしてWindows98を動かしたのか自分自身が忘れそうなので、一応スクリーンショットをアップロードしておく。

PCem を起動すると以下のウインドウが開く。機種(?)を選択して、設定ボタンをクリックすれば、ハードウェア構成を設定するダイアログが開く。

pcem_v17_win98_ss01.png


M/Bの種類は「[Socket 7] Shuttle HOT-557」、CPU種類は「Intel Pentium MMX 233」、メモリ128MBにしてみた。ちなみに、Ryzen 7 1700上で PCem V16 を動かした際は、「Pentium 75」にしてみてもちょっと動作が厳しかった。

pcem_v17_win98_ss02.png


ビデオカードデバイスは、「S3 ViRGE/DX」にした。当時はかなりメジャーなビデオカード(ビデオチップ)だったらしい。横にある設定ボタンをクリックすれば、VRAM容量その他を指定できる。一応、Voodoo Graphics にもチェックを入れたけれど、チェックを入れないほうが、画面描画がおかしくならないと後になって気づいた。

pcem_v17_win98_ss03.png


「S3 ViRGE/DX」のメモリサイズは4MBに。

pcem_v17_win98_ss04.png


Voodoo Graphics の設定は、Voodoo 2、4MB、4MB、と言った感じにした。

pcem_v17_win98_ss05.png


余談。Voodoo Graphics と言うのは3D描画に特化したビデオカードのシリーズ。大昔のビデオカードは、えてして3D描画機能を持ってなくて、2D描画しかできなかった。そこで3D描画に特化したビデオカードとして Voodooシリーズが出てきたのだけど、このビデオカードは2D描画機能を持ってなかったので、別のビデオカードに2D描画をさせて、3D描画はVoodooで行って、両方を重ね合わせて表示する、という仕組みになっていた。


サウンドデバイスは、「Sound Blaster AWE32」。Address: 0x220, EMU8000 Address: 0x620, Onboard RAM: 8MB、等に設定。

pcem_v17_win98_ss06.png


LPT Device (LPT = (Line PrinTer)という項目もあって、これがプリンタ関係かなと思ったけれど、選べる項目を眺めると、サウンド関係っぽい文字列ばかり。「Sound Source」だの、「DAC」だの、「Stereo」だの。これはサウンド関係だよな…。たぶん。

pcem_v17_win98_ss07.png


ストレージ関係は以下のような感じに。4GBのHDDイメージを指定してある。

pcem_v17_win98_ss08.png


マウスは、一応「Microsoft Intellimouse (PS/2)」にしてみた。

pcem_v17_win98_ss09.png


ジョイスティックは、よく分からないのでそのまま。

pcem_v17_win98_ss10.png


NICは、「Novell NE2000」。Address: 0x300, IRQ: 10 に。

pcem_v17_win98_ss11.png

以前の日記をメモ。 :


*1: USB - パラレル変換ケーブルがあれば別かもしれない。例えば、 _ELECOM UC-PGT のような製品があるらしい。

#2 [nitijyou] 日記をアップロードした

2021/10/19を最後に日記をアップロードしてなかったので、アップロードしてみた。ただ、結構な量を溜め込んでいたので、校正作業が…。誤字脱字があったらゴメンナサイ。それと、炎上しそうな記事をアップロードしてないか、ちょっと不安。問題があったら削除しますので…。

2022/05/16(月) [n年前の日記]

#1 [pcem] PCem+Windows98上で仮想PDFプリンタを試用

_昨日、 PCem + Windows98 上で、仮想PDFプリンタ、PrimoPDF 3.1、CutePDF Writer 3.0 の動作確認をしていたわけだけど。他に、Doro PDF Writer、PDFCreator という仮想PDFプリンタがあることも知ったので試用してみた。

環境は、Windows10 x64 21H2 + PCem V17 + Windows98無印。ホストPCのCPUは、AMD Ryzen 5 3600。

Doro PDF Writerを試用。 :

Doro PDF Writer という仮想PDFプリンタも Windows98上で利用できる。今回試用したバージョンは 2.19。

_Doro PDF Writer - k本的に無料ソフト・フリーソフト
_Doro::Create PDF files for free - the sz development

Windows95 から Windows10 まで対応しているのが売りらしい。

DoroSetup.zip をDLして解凍。中に入っていた DoroSetup.exe をWindows98上に HFS を使って転送。実行してインストール。

CutePDF Writer と同様に、プリンタ一覧の中に Doro PDF Writer が表示されるようになった。

何かしらのアプリから印刷指示をすると、ダイアログが開く。上のほうに、ファイルの保存先、保存ファイル名が表示されている。他にも、PDFのタイトル等を指定できる。

ただ、項目名が盛大に文字化けしている。おそらく、今時のOSに合わせた文字コードになっているのだろう。これならまだ英語表記のほうが読めるだけマシな気がする。

インストールフォルダ、C:\Program Files\DoroPDFWriter\Doro.ini 内で、言語設定ができるらしい。メモ帳で開いて、「'Language=en」の先頭の「'」を削除してコメントアウトを外す。これでダイアログが英語表記になった。

生成されたPDFは、ジャギー(?)が目立つ印象を受けた。文字も画像にして出力しているようで、拡大表示するとドットが見えてしまう。これが CutePDF Writer なら、文字は文字のままPDF出力しているようで、拡大表示してもドットが見えたりしない。

PDFCreator を試用。 :

PDFCreator という仮想PDFプリンタも見かけた。1.2.3 より前のバージョンなら、Windows98 でも使える模様。

_PDFCreator - Browse /PDFCreator/PDFCreator 0.9.3 at SourceForge.net
_PDFCreator - Browse /PDFCreator/PDFCreator 0.8 at SourceForge.net
_PDF Creator on Windows 98? - PDFCreator / PDFCreator English - pdfforge forums

今回は、PDFCreator-0_9_3_GPLGhostscript.exe を入手してインストールしてみた。これも、プリンタとして登録される。

利用する際は、スタート → プログラム → PDFCreator → PDFCreator を事前に起動しておいて、その状態で各アプリから、PDFCreator という仮想プリンタを選んで印刷しないといかんような気がする。事前にウインドウを出しておかないと、仮想プリンタから印刷しても無反応と言うか、印刷キューに溜まるだけで処理が進んでくれないように見えた。

この仮想プリンタは、文字を文字としてPDF出力してくれるように見えた。拡大表示しても文字は奇麗なままだった。

ただ、ドローソフト G.CREW で作ったA4サイズの図をPDF出力しようとしたら、PDF保存ダイアログが表示されるまで6分ぐらいかかった。印刷しようとしている内容によっては、結構な処理時間がかかるのかもしれない。

qvPDFその他は利用できなかった。 :

qvPDFという仮想PDFプリンタも知ったのでインストールしてみようかと思ったけれど、インストーラ、qvPDF_310_setup.exe、 qvPDF_v280_RC8_setup.exe、どちらとも、「Windows NTじゃないとインストールできない」と言ってきた。Windows98 には非対応らしい。

_qvPDF download | SourceForge.net


PDF24 Creator という仮想PDFプリンタも見かけたけれど、これも Windows2000以降に対応とのこと。

_Installation unter windows 98 | PDF24 Hilfezentrum


pdf995というものも見かけたのでDLして試してみたけど、21.1 はインストーラを実行しても、自己解凍する段階で「システムに装着されたデバイスは動作していません」とエラーメッセージを出して終了してしまった。これも現行版は Windows98 に対応してない気配を感じる。

_windows 98 - Printing to a file in windows98 - Stack Overflow

上記の掲示板でのやり取りによると、他の環境でもインストール出来てないらしい。

それはともかく。上記のやり取りの中で、「ウチは GhostScript (GhostPDF) を使ってる」という話が出ている。どうやって導入すればいいのだろう。

#2 [pcem] NE2000互換のNICの速度

PCem のNIC(ネットワークカード)としては、Novell NE2000、Realtek RTL8029AS のどちらかが選べるみたいなのだけど、転送速度がどのくらいなのか気になる。今のところ NE2000 を選んでいるけれど、HFS を使ってファイルをやり取りしていると、めっちゃ遅い…。

_ネットワークコントローラ雑考
_NE2000互換 - MEMO:はてな支店

上記のページを眺めた感じでは、NE2000、RTL8029AS、どちらも 10BASE-T相当と思っておけばいいのだろうか? だとしたら、そりゃ遅いよな…。

余談。昔話。自分語り。 :

自分が、PC-9821cb3 と自作PCを初めてLANケーブルで繋いでファイル転送した時は、たしか 10BASE-T を使ってた気がする。今となってはとんでもない遅さだったけど、2台のPC間でファイル転送できることに感動した記憶がある。いやまあ、会社で使ってたPC群では、LAN経由でファイル転送なんて当たり前だったけど、そこはそれ、自分で選んで買ったPC同士が目の前で通信する様子を目にするのは、また違った感動があったというか。秋葉原のなんだかよく分からない店で、ダンボール箱に乱雑に突っ込まれて安売りされてたLANハブを手に取って、「これ本当に使えるのかな」「自分、間違った機器を選んでないかな」と不安になりながらレジに持って行ったことも思い出す。

LANで転送する前は、フロッピーディスク等、物理メディアを使ってファイルのやり取りをしてたわけで。PC同士が通信し合うなんて夢のような話だったなと。それが今では、スマホだの何だので、通信できて当たり前。しかも有線どころか無線で…。いやはや…。

2022/05/17(火) [n年前の日記]

#1 [pc] Webページの見た目をそのまま印刷したい

昨日、某所の方から電話で相談を受けた。「Microsoft Edge でWebページを印刷しようとすると、見た目と全然違う印刷結果になる。どうにかならんか」みたいな。

おそらく、ディスプレイに表示される際の見た目と、印刷される際の見た目が、違う状態になるCSSが指定されているWebページを印刷しようとして、そうなってしまったのだろうけど…。たしかに、どうにかできるならどうにかしたい。

そんなわけで少しググってみたけれど、Webページの見た目を、そのまま一旦画像にして、その画像を印刷する、という拡張機能があるらしい。awesome screenshot という拡張機能らしいけど…。元々は Google Chrome 用の拡張機能として公開されていたけれど、Microsoft Edge用にも移植されている模様。

_素晴らしいスクリーンショットとスクリーンレコーダー - Chrome ウェブストア
_Microsoft Edge アドオン - 仕事効率化

ただ、日本語名が…。「素晴らしいスクリーンショットとスクリーンレコーダー」って…。その拡張名はどうかと…。まあ、自動翻訳がそのまま表示されているのだろうけど。

試しにインストールして試用してみたけれど、たしかにコレを使えば、ブラウザで表示されてる見た目そのままで、ページが印刷できるように見えた。

ちなみに、関連情報をググっていたら、この拡張機能は開いているサイトの情報をどこかに送信している、という話を見かけた。2014/08頃の話。

_Awesome Screenshot が閲覧したサイトのURLを収集している疑い - 秋元@サイボウズラボ・プログラマー・ブログ

使う場合は自己責任で。

ブラウザの標準機能でキャプチャ。 :

一応、今時のWebブラウザは、標準機能でWebページを画像としてキャプチャすることができる。

Firefox 100.0.1 x64 の場合、ページの中で右クリックしたら、メニューの中に「スクリーンショットを撮影」という項目があった。Ctrl + Shift + S でもキャプチャできるらしい。

_Firefox 上でスクリーンショットを撮る | Firefox ヘルプ


Microsoft Edge 101.0.1210.47 x64 も、ページの中で右クリックして、「Webキャプチャ」を選べばいい。あるいは Ctrl + Shift + S。

_Microsoft Edge - Webページ全体をスクリーンショット撮影する方法 | PC設定のカルマ

ただし、一旦Webページを一番下までスクロールさせないと、途中にある画像が表示されないWebページもあったりするので、そういったページをキャプチャすると、画像部分が空白状態になったりする。上記の解説ページは、まさにそういう例だった…。


Vivaldi 5.2.2623.46 x64 も、キャプチャ機能を持っている。ウインドウ左上のアイコンをクリックしてメニューを出して、ツール → キャプチャー、で色々選べる。あるいは、ステータスバー上のカメラのアイコンを ―― 「ページキャプチャー」アイコンをクリックしてもいい。

_スクリーンキャプチャー | Vivaldi Browser Help


Google Chrome も機能を持っているらしい。

_「Google Chrome」にスクリーンショット機能がこっそり実装 〜さっそく使ってみよう - やじうまの杜 - 窓の杜
_WEBサイトのキャプチャーはChrome実装機能を使うのが安全で簡単! - おっさんポスト

ただ、隠し機能だから設定のカスタマイズが必要とか、Webページ全体のキャプチャはできないとか、開発ツールモードにしないといかんとか、他のブラウザと比べると…。うーん。

何にせよ、Webブラウザ上に表示されたページの見た目を、そのまま画像としてキャプチャする機能は、多くのWebブラウザが持っているので、そのキャプチャ画像をイイ感じに分割して印刷できるツールさえあれば、「Webページの見た目そのままで印刷したい」という要望は満たせそう。

一応、画像を分割して印刷できる、PosteRazor というツールがあることを知ったのだけど。

_PosteRazor - Make your own poster!
_PosteRazor - Make your own poster! download | SourceForge.net

Webブラウザでキャプチャした画像を、このツールに持っていくまでの流れが、一般の方々(?)にとっては面倒臭いと思われそうな気もする。

ペイント、あるいはExcelを使って画像を複数ページで印刷する方法も見かけた。

_縦に長い画像を分割して印刷する方法(Windows) - ウェブ屋の備忘録
_長い画像を簡単に印刷する方法|スタッフブログ|デジタルバンク株式会社
_長い画像を分割して印刷したいときはエクセルが便利 | バシャログ。

ペイントを使うやり方を試してみたけど、たしかにこれでも目的は果たせそう。ただ、これもまた、一般の方々には以下略。

#2 [pc] AMD Ryzen Masterがインストールできなくて悩んだ

メインPCのCPUを、AMD Ryzen 7 1700 から Ryzen 5 3600 に交換したことだし、AMD Ryzen Master でCPUの動作状態を確認しておきたい。どのコアが、どのくらいのクロック周波数で動いているのか等々を把握したい。

_オーバークロック制御用AMD Ryzen Masterユーティリティ | AMD

環境は、Windows10 x64 21H2。古い AMD Ryzen Master がインストールされている状態。

現行版の AMD Ryzen Master (2.9.0.2093? AMD-Ryzen-Master.exe) をダウンロードしてアップデートをしようとしたのだけど、これが上手く行かなくて。インストーラを実行して、Update? Upgrade? のボタンをクリックしても、「インストールに失敗」みたいなメッセージが英語で表示されて終わってしまう。

旧バージョンをアンインストールしないとダメなのかなと、コントロールパネル → プログラムのアンインストール → AMD Ryzen Master を選んでみたけど、「もうアンインストールされている」「項目を消すか?」と出てきてしまう。指示に従って項目を消してから再度インストールを試みたけど、相変わらずインストールできない。

色々ググってみたところ、MicrosoftProgram_Install_and_Uninstall.meta.diagcab なるツールを入手して実行すると、アンインストール関連情報を調べておかしな項目を削除してくれる、という話を見かけた。おそらく、以下で紹介されているツールだろうか。

_「プログラムのインストールとアンインストールのトラブルシューティング ツール」ソフトの導入・削除時の問題を解決 - 窓の杜
_プログラムのインストールまたは削除がブロックされる問題を解決する

DLして実行。「インストール」「アンインストール」のうち、「アンインストール」を選んだところ、その先の画面で「AMD Ryzen Master」がリストアップされたので、選択して処理を進めてみた。

このツールで対処してから、AMD Ryzen Master のインストーラを実行したところ、今度はちゃんとインストールができた。助かった。

この記事へのツッコミ

Re: AMD Ryzen Masterがインストールできなくて悩んだ by GM    2022/07/17 00:14
同じ状況でハマってましたが、ご紹介の方法で解決できました。
助かりました!本当にありがとうございます。

RyzenMaster Upgrade failed みたいなキーワードがあると更に探しやすくなるのではないかと思います。ご一考いただければ幸いです。

#3 [nitijyou] キムワイプを入手

M/B上のCPUを交換する際に、CPUグリスを拭き取るわけだけど。「ティッシュ等で拭き取るとチリやホコリがついてしまってよろしくないから不織布ワイパーを使うべし」という話をどこかで見かけて、その不織布ワイパーなる商品が気になってきた。

色々ググってたら、「キムワイプなら毛羽立ったりしないから、その手の研究室等で掃除をする時によく使われる」という話を見かけた。ソレって入手できないものだろうか。田舎だから無理かな。

などと思っていたのだけど、妹から、「キムワイプならダイユーエイトの工具コーナーで見かけた」という情報を入手。ちなみに、妹も大学時代に研究室で使っていたらしい。

そんなわけで、ホームセンターダイユーエイト須賀川東店(メガステージ内の店舗)に立ち寄ってみた。たしかにキムワイプが工具コーナーのあたりに置いてあった。早速購入。税込195円。

ただ、原材料がパルプと書いてある。不織布って、ポリエステル等で出来ているものではなかったか…。つまりキムワイプは、不織布ワイパーなるものとは、また違う種類の商品ということだろうか。

でもまあ、ティッシュより毛羽立たないなら、これでもなんとかならないか。どうなんだろう。

2022/05/18(水) [n年前の日記]

#1 [pc] GeForce Driverを更新してみた

メインPCは、NVIDIA GeForce GTX 1060 6GB のビデオカードを積んでいるのだけど、ドライバーに脆弱性が見つかった云々の話を目にしたので、Game Ready Driver を 457.51 から 512.77 にアップデートしておいた。

_NVIDIA製GPUディスプレイドライバーに複数の脆弱性 〜GeForceユーザーはv512.77への更新を【16:00追記】 - 窓の杜

変更点を確認してみたところ、3D設定の管理 → グローバル設定の項目の中に、「シェーダーキャッシュサイズ」という項目が増えていた。結構前のバージョンから追加されていた項目らしい。

ちなみに、512.77 も、色々不具合があるようで…。

_GeForce 512.77 ドライバ 不具合情報 | ニッチなPCゲーマーの環境構築Z

2022/05/19(木) [n年前の日記]

#1 [python][gimp] Python-FuでARGB(BRGA)をRGBAにしたい

GIMP の Python-Fu + pycairo を使って、何かしらを描画して、GIMPのレイヤーに転送したい。

pycairo の surface は、1ドットにつきARGB(リトルエンディアンならBRGA)の並びで格納されている。対して、GIMPのレイヤーは1ドットにつきRGBAの並びになっているので、ARGB(BRGA)からRGBAに並びを変更する処理を書かないといけない。

以前、そういった処理に関してベンチマークを取りながら、16秒かかってた処理を1.7秒まで短くできたけれど。

_mieki256's diary - Pythonのリスト内包表記を試してみた
_mieki256's diary - Pythonのstructを使った時の処理時間を調べてた

リトルエンディアン、ビッグエンディアンを事前に判定してその後の処理を変えれば、もっとシンプルに書けるのではないか、処理時間も短くならないかと思えてきたので、そういう処理を試してみた。

環境は、Windows10 x64 21H2 + Python 2.7.18 32bit。ちなみに、前回実験した時は CPU が Ryzen 7 1700 だったけど、Ryzen 5 3600 に変わっているので、処理時間が少し短くなってる。

以下が、実験用スクリプト。

_04_argb_rgba_conv_2.py

関係ありそうなところだけを引用。get_rgba_str_g() が、今のところ最短時間で処理できる書き方。get_rgba_str_(h|i|j)() が、今回試した書き方。

def get_rgba_str_g(src):
    lmax = len(src) / 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = [(((d & 0x0ffffff) << 8) + ((d >> 24) & 0x0ff)) for d in argb]
    return struct.pack(">%dL" % lmax, *rgba)


def get_rgba_str_h(src):
    dst = list(src)
    if sys.byteorder == "little":
        for i in range(0, len(src), 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3]
    else:
        for i in range(0, len(src), 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i]
    return ''.join(dst)


def get_rgba_str_i(src):
    dst = list(src)
    if sys.byteorder == "little":
        for i in range(0, len(src), 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3]
    else:
        for i in range(0, len(src), 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i]
    return struct.pack("%dc" % len(src), *dst)


def get_rgba_str_j(src):
    cnt = len(src)
    dst = bytearray(cnt)
    if sys.byteorder == "little":
        for i in range(0, cnt, 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3]
    else:
        for i in range(0, cnt, 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i]
    return dst


ベンチマークを取ってみた。

> py -2 04_argb_rgba_conv_2.py
start.
create source data.
## benchmarker:         release 4.0.1 (for python)
## python version:      2.7.18
## python compiler:     MSC v.1500 32 bit (Intel)
## python platform:     Windows-10-10.0.19041
## python executable:   C:\Python\Python27\python.exe
## cpu model:           AMD64 Family 23 Model 113 Stepping 0, AuthenticAMD
## parameters:          loop=5, cycle=1, extra=0

##                        real    (total    = user    + sys)
argb split              9.7370    9.7344    7.6094    2.1250
rgb shift A             3.0880    3.0781    3.0625    0.0156
rgb shift G             1.2940    1.2969    1.2188    0.0781
rgb shift H             1.6870    1.6875    1.6875    0.0000
rgb shift I             1.8540    1.8594    1.7812    0.0781
rgb shift J             1.4470    1.4531    1.4531    0.0000

## Ranking                real
rgb shift G             1.2940  (100.0) ********************
rgb shift J             1.4470  ( 89.4) ******************
rgb shift H             1.6870  ( 76.7) ***************
rgb shift I             1.8540  ( 69.8) **************
rgb shift A             3.0880  ( 41.9) ********
argb split              9.7370  ( 13.3) ***

## Matrix                 real    [01]    [02]    [03]    [04]    [05]    [06]
[01] rgb shift G        1.2940   100.0   111.8   130.4   143.3   238.6   752.5
[02] rgb shift J        1.4470    89.4   100.0   116.6   128.1   213.4   672.9
[03] rgb shift H        1.6870    76.7    85.8   100.0   109.9   183.0   577.2
[04] rgb shift I        1.8540    69.8    78.0    91.0   100.0   166.6   525.2
[05] rgb shift A        3.0880    41.9    46.9    54.6    60.0   100.0   315.3
[06] argb split         9.7370    13.3    14.9    17.3    19.0    31.7   100.0

今回の書き方で、元々は10秒ほどかかってた処理を1.45秒にすることはできたけど、それでも、前回辿り着いた(?)書き方なら1.29秒で終わるので、struct.pack()、struct.unpack()、リスト内包表記を使った書き方が今のところベストっぽい。

もっとも、また違う書き方をすれば、更に高速化できるかもしれない。自分は Python について詳しくないのでアレだけど。

ちなみに、以下の Python-Fuスクリプトにも、このあたりの書き方を反映させておいた。

_mieki256/sci-fi-texture-generator: Sci-Fi bump mapping texture generator with GIMP Script-fu.

bytearrayを知った。 :

当初、バイト文字列をインデックス値を使って変更しようとしたらエラーになって、一旦リスト化しないと変更できないのかなと思ったのだけど。Python2.7 にも bytearray というものがあって、それを使えばバイト文字列相当をインデックス値で指定して変更できると知った。

Python では、通常のバイト文字列は変更不可だけど、bytearray なら変更可能、ということらしい。

前述の関数で言えば、get_rgba_str_h() が一旦リスト化している例で、get_rgba_str_j() がbytearray を使った例。

def get_rgba_str_h(src):
    dst = list(src)
    if sys.byteorder == "little":
        for i in range(0, len(src), 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3]
    else:
        for i in range(0, len(src), 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i]
    return ''.join(dst)

def get_rgba_str_j(src):
    cnt = len(src)
    dst = bytearray(cnt)
    if sys.byteorder == "little":
        for i in range(0, cnt, 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3]
    else:
        for i in range(0, cnt, 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i]
    return dst

Python 3.x では動かない。 :

上記のスクリプトは、Python 2.7 では動いたけれど、Python 3.x ではエラーが出て動かなかった。

どうも join() の処理が違っているようだなと…。おそらく以下で紹介されている事例に引っ掛かっている予感。str は結合できるけど int は結合できないのだとか。

_TypeError: sequence item 0: expected string, int found - せつないぶろぐ

また、Python 3.x は「/」を使って除算をした時に float になってしまう点もよろしくなかった。「//」を使って結果を整数に限定するべきだった。

2022/05/20(金) [n年前の日記]

#1 [gimp][linux][ubuntu] Linux版GIMPはPython-Fuが使えなくなってた

最近の Linux版GIMP は Python-Fu (Gimp-Python) が使えない状態になっていたらしい。恥ずかしながら今頃になってようやく知った。

正確には、Debian Linux 11 bullseye や Ubuntu Linux 20.04 LTS の公式リポジトリからインストールできる GIMP 2.10 は、Python-Fu (Gimp-Python)が利用できない状態で何年も放置されている模様。

理由としては、Pythonが絡んでいるっぽい。Debian も Ubuntu も、Python 2.x から 3.x への移行を進めているので、Python 2.x を利用するパッケージを切り捨てる方向で動いているそうで。そして、GIMP の Python-Fu (Gimp-Python) は Python 2.x に依存しているので、関連パッケージも公式リポジトリからあっさり削除されてしまったのだとか。

昔は gimp-python というパッケージが存在していて、sudo apt install gimp-python をするだけで使えるようになったらしいけど…。今は、そんなパッケージは存在しない。Debian 11、Ubuntu 20.04、どちらも見つからなかった。

回避策は無いのかとググってみたら、flatpak (flathub) 版GIMPなら Python-Fu もサポートしているので、「Python-Fu が使いたければ公式リポジトリ版ではなく flatpak版を使いましょう」ということになっているっぽい。

そんなわけで試してみた。環境は、Ubuntu Linux 20.04 LTS 64bit。Xubuntu関連パッケージをインストールして、デスクトップ環境は Xfce4 で利用している。ちなみに CPU は AMD A8-3850。

flatpakをインストール。 :

Ubuntu Linux 20.04 LTS 上で flatpak をインストールする手順は以前の日記でメモしてあった。

_mieki256's diary - wxPython関係をUbuntu 20.04上で試用

sudo apt install flatpak
sudo apt install gnome-software-plugin-flatpak
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
sudo reboot

GIMPをインストール。 :

基本的には以下のページに従えば良い。

_GNU Image Manipulation Program - Linux Apps on Flathub
flatpak install flathub org.gimp.GIMP


ただ、今回は、GUIアプリ上から ―― gnome-software (ソフトウェア)経由でインストールしてみた。
  1. スタートメニュー(?)の検索欄に「software」と打ち込んだら「ソフトウェア」がリストアップされたので起動。
  2. 左上の虫メガネアイコンをクリックして、「gimp」で検索。
  3. リストアップされた「GIMP (GNU Image...」をクリックして詳細説明(?)を表示。
  4. 右上の「ソース」の項目が「Flathub」になっていることを確認して、「インストール」をクリック。

flatpak_gimp_install_ss01.png

flatpak_gimp_install_ss02.png

flatpak_gimp_install_ss03.png


インストールが終了したら、インストールしたアプリの一覧を表示して確認してみる。端末を開いて以下を打つ。
flatpak list

中に、以下の行がある…はず。
GIMP (GNU Image Manipulation Program)  org.gimp.GIMP  2.10.30  stable  flathub  system

これで、GIMP 2.10.30 がインストールされた。

GIMPを起動。 :

実行は、端末上で以下を打つ。
flatpak run org.gimp.GIMP

しかし、一々こうして打ち込んで起動するのは面倒臭い。

本来、flatpak 経由でインストールすると、スタートメニューの類にも登録されるらしいのだけど、何故か自分の環境では、メニューに登録されなかった。

ただ、メニューに登録されるべき、.desktop ファイル (Windowsのショートカットファイルみたいなもの?)は、以下の場所に存在している。

ls /var/lib/flatpak/exports/share/applications/

中に、org.gimp.GIMP.desktop というファイルが存在する。これを、自分のアカウントの、所定の場所にコピーする。

cp /var/lib/flatpak/exports/share/applications/org.gimp.GIMP.desktop /home/(USERNAME)/.local/share/applications/

これで、Ubuntu (Xubuntu) のスタートメニュー(?)の、「グラフィックス」の項に、GIMPの項目が追加された。

GIMPのプラグインの場所。 :

GIMP を起動してみたところ、フィルターメニューの中に、Python-Fu が存在していた。

flatpak_gimp_install_ss04.png

ということで、たしかに flatpak版GIMPなら Python-Fu が使えるらしい。

また、編集 → 設定 → フォルダー → プラグイン or スクリプト、で、Python-Fuスクリプトや Script-Fuスクリプトを置く場所が指定されているはずだけど、自分の環境では、記述が無いのに、何故か以下のフォルダの内容も読み取っていた。

~/.config/GIMP/2.10/plug-ins/*.py
~/.config/GIMP/2.10/scripts/*.scm

この2つのフォルダは、Ubuntu公式リポジトリ版の GIMP をインストールした際に参照される場所なのだけど…。でもまあ、動いてるから良しとする。

ちなみに、 *.py や *.scm に実行権限がついてないとGIMPがプラグインとして認識しない、という話もどこかで見かけたので、一応、念のため、各スクリプトファイルに対して実行権限をつけておいた。

cd ~/.config/GIMP/2.10/plug-ins/
chmod +x *.py


flatpak版GIMPを導入することで Python-Fu も使えると分かったので、以下のスクリプトが動作することも確認できた。

_mieki256/sci-fi-texture-generator: Sci-Fi bump mapping texture generator with GIMP Script-fu.

以下、証拠画像。

flatpak_gimp_install_ss05.png


このスクリプトが動いたということは…。flatpak版GIMP は、pycairo も使える状態になっているようだなと。Python-Fuコンソールを開いて、import cairo と打ってみても、エラーが出ないし。

>>> cairo.version
'1.10.0'

>>> cairo.cairo_version_string()
'1.16.0'

pycairo の現行バージョンは 1.21.0 だけど、それと比べると、GIMP同梱の pycairo は 1.10.0 と結構古い。

また、Ubuntu公式リポジトリ版の python-cairo は、バージョンが 1.16.2-2ubuntu2 と表示されたので *1 、flatpak版GIMP には、公式リポジトリ版とは違う pycairo が含まれているのだろう。たぶん。

2022/05/21追記。 :

Ubuntu Linux 18.04 LTS 上でも動作確認してみた。Ubuntu 18.04 LTS なら、公式リポジトリ版 GIMP 2.8.22 でも Python-Fu (Gimp-Python) が利用できた。また、Python-Fuコンソール上で import cairo もできた。cairo.version は '1.16.2'。cairo.cairo_version_string() は '1.15.10'。

*1: sudo apt show python-cairo と打てばバージョンが確認できる。

#2 [python][gimp] Python 3 でARGBからRGBAに変換

Windows10 x64 21H2 + Python 3.9.12 64bit の環境で、ARGB(BRGA)からRGBAに変換する処理を試してみた。

ちなみに、Python 2.7.18 を使って処理する版は、 _昨日 試した。

とりあえず、Python 3.9.12 で動く処理だけ抜き出してベンチマークを取ってみた。

_05_argb_rgba_conv_py3.py
from benchmarker import Benchmarker
import struct
import sys

# check_data_enable = True
check_data_enable = False

LOOP = 5

if sys.version_info.major != 3:
    print("This script is compatible only with Python3.")
    sys.exit()


def create_src_data():
    print("start.")
    r, g, b, a = 0, 1, 2, 3
    w, h = 2048, 2048
    rgba = bytearray(w * h * 4)
    for i in range(0, len(rgba), 4):
        rgba[i], rgba[i + 1], rgba[i + 2], rgba[i + 3] = b, g, r, a
    src = rgba
    print("create source data. %d byte" % len(src))
    # for i in range(8):
    #     print(src[i])
    return src


def get_rgba_str_g(src):
    lmax = len(src) // 4
    argb = list(struct.unpack("=%dL" % lmax, src))
    rgba = [(((d & 0x0ffffff) << 8) + ((d >> 24) & 0x0ff)) for d in argb]
    return struct.pack(">%dL" % lmax, *rgba)


def get_rgba_str_j(src):
    cnt = len(src)
    dst = bytearray(cnt)
    if sys.byteorder == "little":
        for i in range(0, cnt, 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3]
    else:
        for i in range(0, cnt, 4):
            dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i]
    return dst


def check_result(src):
    print("compare")
    dst = []
    dst.append(get_rgba_str_g(src))
    dst.append(get_rgba_str_j(src))
    for i in range(1, len(dst)):
        if dst[0] == dst[i]:
            print("Success [%d]" % i)
        else:
            print("Failure [%d]" % i)


src = create_src_data()

if check_data_enable:
    # compare result data
    check_result(src)
    sys.exit()

with Benchmarker(LOOP, width=20) as bench:

    @bench("rgb shift G")
    def check_use_rgb_shift_g(bm):
        get_rgba_str_g(src)

    @bench("rgb shift J")
    def check_use_rgb_shift_j(bm):
        get_rgba_str_j(src)

ベンチマーク結果は以下。

> py -3 05_argb_rgba_conv_py3.py
start.
create source data. 16777216 byte
## benchmarker:         release 4.0.1 (for python)
## python version:      3.9.12
## python compiler:     MSC v.1929 64 bit (AMD64)
## python platform:     Windows-10-10.0.19044-SP0
## python executable:   C:\Python\Python39-64\python.exe
## cpu model:           AMD64 Family 23 Model 113 Stepping 0, AuthenticAMD
## parameters:          loop=5, cycle=1, extra=0

##                        real    (total    = user    + sys)
rgb shift G             0.8407    0.8438    0.7344    0.1094
rgb shift J             1.4964    1.5000    1.4844    0.0156

## Ranking                real
rgb shift G             0.8407  (100.0) ********************
rgb shift J             1.4964  ( 56.2) ***********

## Matrix                 real    [01]    [02]
[01] rgb shift G        0.8407   100.0   178.0
[02] rgb shift J        1.4964    56.2   100.0

やはり、bytearray を使って入れ替えていく書き方は、struct.pack や unpack、リスト内包表記を使う書き方と比べると、ちょっと遅い模様。

また、Python 2.7 より 3.9 で処理するほうが、処理時間が短くなる場合もあるらしい。Python 2.7 では 1秒台だった処理が、Python 3.9 では 0.84秒になった。

2022/05/21() [n年前の日記]

#1 [ubuntu] サブPCのメンテナンス中

サブPC群に対してメンテナンス中。メンテナンスというか、OS構成について試行錯誤中。

Ubuntu Linux 20.04 LTS をインストールしてあるサブPC(CPU: AMD A8-3850)上で、VirtualBox をインストールして、更にその上で Ubuntu Linux 18.04 LTS をインストールして動作確認をしていたのだけど、どうも動作が遅い。ここは実機で動かすべきだろうかと思えてきた。

そこでふと、別のサブPC(CPU: AMD A6-3500)で、パーティションをいくつか分けて、Linux Mint、Uubuntu 18.04 LTS、Ubuntu 16.04 LTS、Ubuntu 14.04 をインストールしてあることを思い出した。久々に起動して sudo apt update 等をしていたのだけど、そのサブPCは、ちょっと離れた場所に置いてあるので、電源を入れる行為自体がなんだか億劫になってきた。

やはりメインPC上で動作確認出来たほうが気楽でいいのではないか…。メインPCに繋いでいる外付けHDDにVMware用の仮想HDDイメージを作って、Ubuntu 18.04 LTS のインストールを始めてみた。

しかし、サブPC群に積んでいるHDDが1TBや2TBなので、空き容量を考えたら、サブPC上で動作確認環境を作れたほうがいいよなと…。足元に置いてある A8-3850機でパーティションを区切って、色々インストールしたほうがまだ便利だろうか。

そこで、A8-3850機のHDDのパーティションサイズをリサイズ/縮小して未割り当て領域を作ろうと試みたのだけど、これが上手く行かない。USBメモリに入れてUSBブートできる状態にした KNOPPIX 9.0.1 DVD を使って起動して、GParted を起動して、ext4 でフォーマットして使ってるパーティションのリサイズを試みたけれど、エラーが出てしまう。

GParted を使って、パーティションリサイズはできないのかな…。もう少し調べてみよう…。

2022/05/22() [n年前の日記]

#1 [ubuntu] GPartedでUbuntu 20.04 LTSのパーティションをリサイズした

サブPCにインストールしてある Ubuntu Linux 20.04 LTS のパーティションをリサイズしたい。USBメモリから起動した KNOPPIX 9.0.1 DVD 内の GParted ではエラーが出て処理ができなかったけど、GParted だけを起動できる、GParted Live なるものがあると知り、そちらではどうだろうと試してみた。

_GParted -- Download

gparted-live-1.4.0-1-i686.iso をDL。これはライブCDで、CD-R に焼けばCDから起動できる。これをUSBメモリに入れてUSBブートできるようにしたい。手順については以下のページで紹介されている。

_GParted Live on USB

今回は UNetbootin を使って、USBブート可能なUSBメモリを作った。

_UNetbootin - Homepage and Downloads

unetbootin-windows-702.exe をDLして実行。ISOの場所と、書き込むべきドライブ名を指定。USBブートできるUSBメモリが作れた。

サブPCにUSBメモリを差して、電源投入時にブートメニューを表示して *1 、USBメモリから起動。

この GParted を使ったところ、Ubuntu Linux 20.04 LTS が入っているパーティションに対してもリサイズができた。15分ぐらいかけて、縮小リサイズ作業ができるように中身も移動してくれた模様。
*1: GIGABYTE製M/Bなので、F12キーを押してブートメニューを表示。

2022/05/23(月) [n年前の日記]

#1 [ubuntu] サブPCにUbuntu Linux 16.04 LTSをインストール

動作確認用に、サブPC(CPU: AMD A8-3850)のHDDのパーティションを変更して、Ubuntu Linux 16.04 LTS をインストールしてみた。

たしかOS自体のサポートは切れていたような気がする…。

_Ubuntu 16.04 その332 - Ubuntu 16.04 LTSの標準サポート終了のお知らせ - kledgeb
「Ubuntu 16.04 LTS」は2016年4月にリリースされ、5年間の標準サポート期間が設定されています。そのため2021年4月30日に標準サポートが終了しました。

Ubuntu 16.04 その332 - Ubuntu 16.04 LTSの標準サポート終了のお知らせ - kledgeb より


やはり切れていた。でもまあ、Ubuntu 20.04 や 18.04 と動作が違うかどうかを確認するためだけに使う予定だし…。

Ubuntu Desktop 日本語 Remix版、ubuntu-ja-16.04-desktop-amd64.iso を、8GBのUSBメモリに入れてインストールしようとしたけど、これが上手く行かなくて。Rufus 3.18 portable や、UNnetbootin 702 を使って書き込んでみたものの、起動途中で止まってしまう。

アレコレ試してみたけど、もしかするとサブPCのUSBハブが抜けかかってただけのような気がする…。このPCケースのフロントのUSBコネクタはどうも接触具合が怪しい…。

最終的に、本家のiso、ubuntu-16.04.7-desktop-amd64.iso と、Rufus 3.18 Portable の組み合わせ、かつ、ISOモードでUSBメモリに書き込んで、インストール処理が進むUSBメモリが作れた。とメモ。

#2 [debian] Debian Linux 10 busterをVMware上でインストール

Debian Linux 10 buster を、Windows10 x64 21H2 + VMware Workstation 16 Player 16.2.3 build-19376536 上でインストールしてみた。ホストPCのCPUは、AMD Ryzen 5 3600。

今回は、Debian 32bit版、debian-10.12.0-i386-netinst.iso をDLしてインストールした。以下から入手。

_Index of /mirror/cdimage/archive
_Index of /mirror/cdimage/archive/10.12.0/i386/iso-cd

インストールしてみて分かった点。 :

  • Debian 10 buster で、デスクトップ環境を特に選ばずにインストール作業を進めると、GNOME がインストールされる。
  • VMware上、open-vm-tools* をインストールした環境で、GNOME と Xfce はクリップボード共有が動いたけれど、KDE はクリップボード共有が動かなかった。ググった感じではバグっぽい。
  • Debian 10 buster なら、gimp-python (2.10.8-2) パッケージが存在する。インストールすれば、公式リポジトリ版 GIMP (2.10.8-2) でも Python-Fu が使えるようになる。
  • Debian 11 bullseye は、gimp-python パッケージが削除されたので、公式リポジトリ版 GIMP で Python-Fu は使えない。

_1953472 - VMWare copy&paste broken on KDE spin + X

インストール時の覚書。 :

VMware上で、仮想PCのスペック等を設定。
  • ゲストOSの選択は、「Linux」「Debian 10.x」。32bit版をインストールするから「Debian 10.x」を選んだけれど、64bit版をインストールするなら「Debian 10.x 64ビット」を選ぶのだろう。
  • ディスク最大サイズは20GBにした。「仮想ディスクを複数のファイルに分割」を選択。
  • 「ハードウェアをカスタマイズ」で、メモリ3GB(3072MB)に。
  • プロセッサコア数は3にしてみた。
  • プリンタは削除。
  • ネットワークアダプタはブリッジ接続を選択。「物理ネットワーク接続の状態を複製」にはチェックを入れてない。
  • 「3Dグラフィックスのアクセラレーション」のチェックは外した。
  • インストールCDのisoを光学ドライブで指定。

  • Debian起動後、「Graphical Install」を選択。
  • 「Select a language」で「Japanese」を選択。
後は質問に答えていくだけ。ドメイン名は空欄にしてみた。

ディスクのパーティショニングは、「ガイド - ディスク全体を使う」「すべてのファイルを1つのパーティションに」。

「ソフトウェアの選択」では、SSHサーバだけ追加。後から apt install tasksel をして tasksel を動かせば似たようなことができそう。あるいは apt install task-kde-desktop みたいな感じでインストールしてもいい。

デスクトップ環境で、新たにチェックを入れない場合、GNOME がインストールされる。

grub は /dev/sda にインストールした。

Debianインストール直後の設定。 :

VMware上で動かしているので、open-vm-tools* をインストール。これをインストールすると、画面解像度を変更したり、ホストOSとゲストOS間でクリップボード共有やファイル共有ができるようになる。
sudo aptitude search open-vm-tools
sudo apt install open-vm-tools*
sudo reboot

Debian は、デフォルトでは sudo が入ってないのでインストール。Ubuntuのノリに慣れてしまった…。
su -
apt updateapt install sudo
gpasswd -a USERNAME sudo
reboot
ログアウトして再ログインしないと設定が反映されないことに注意。

自分の作業に必要になりそうなツールをインストール。
su -
apt install vim aptitude ranger byobu build-essential wget git make neofetch

/etc/apt/sources.list 編集。各行に「contrib non-free」を追加して、フリーではないパッケージもインストールできるようにする。
vi /etc/apt/sources.list
apt update

フォントをインストール。
sudo apt -y install fonts-ipafont fonts-ipaexfont fonts-takao fonts-mplus fonts-migmix fonts-mmcedar fonts-umeplus fonts-motoya-l-maruberi fonts-motoya-l-cedar fonts-horai-umefont fonts-droid-fallback fonts-ricty-diminished fonts-vlgothic fonts-noto fonts-urw-base35 fonts-liberation fonts-texgyre
sudo apt -y install xfonts-mplus xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xfonts-shinonome xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname xfonts-intl-arabic xfonts-intl-asian xfonts-intl-chinese xfonts-intl-chinese-big xfonts-intl-european xfonts-intl-phonetic emacs-intl-fonts
sudo apt -y install xfonts-naga10 ttf-mscorefonts-installer fonts-urw-base35 fonts-liberation fonts-texgyre

GNOMEはどうもしっくりこなかった。Xfceをインストール。
sudo apt install task-xfce-desktop

ディスプレイマネージャ gdm3 で自動ログインを設定。
sudo vi /etc/gdm3/daemon.conf
[daemon]
# Enabling automatic login
AutomaticLoginEnable = true
AutomaticLogin = USERNAME

ユーザディレクトリ内の日本語フォルダ名を英語にする。
sudo apt-get install xdg-user-dirs-gtk
LANG=C xdg-user-dirs-gtk-update

2022/05/24(火) [n年前の日記]

#1 [xscreensaver][linux] xscreensaverについて少し調べてる

Ubuntu Linux や Debian Linux をインストールして設定を弄っているうちに、xscreensaver についてちょっと気になってきた。コレって自分で作れないのかなと。

xscreensaver は、Linux や Mac 上で動くスクリーンセーバ。インストールすると数十種類のスクリーンセーバが選べる。

_XScreenSaver
_XScreenSaver: Screenshots

自分は、8bit PCの各種デモ画面を眺めてワクワクしてた世代なので、こういうのが大好きで。どれがいいかなと選んでるだけでも楽しいです。

サンプルをコンパイル。 :

以下のページで xscreensaver の作り方が紹介されていたので眺めてみた。

_How to Write a Screensaver Module
_Simplesquares
_How to install a module

Ubuntu Linux 20.04 LTS上で、simplesquares.c をDLしてコンパイルしようとしたけれど、vroot.h が見つからないと言ってくる。

$ gcc -o simplesquares simplesquares.c -L/usr/lib -lX11
simplesquares.c:4:10: fatal error: vroot.h: そのようなファイルやディレクトリはありません
    4 | #include "vroot.h"
      |          ^~~~~~~~
compilation terminated.

Ubuntu の場合、vroot.h は何のパッケージに入っているのか…。ググったけど見つからない…。

と思ったら、前述のページ内に vroot.h へのリンクがあった。つまり、simplesquares.c と同じ場所に vroot.h を置いてコンパイルすればそれで良かった模様。

$ gcc -o simplesquares simplesquares.c -L/usr/lib -lX11
simplesquares.c:6:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
    6 | main ()
      | ^~~
simplesquares.c: In function ‘main’: simplesquares.c:43:7: warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration] 43 | usleep (10); | ^~~~~
$ ls simplesquares simplesquares.c vroot.h

simplesquares という、実行権限がついたファイルが生成された。

これを、~/.xscreensaver に登録してやればいいらしいのだけど…。

Pythonで作れたりもするらしい。 :

ググってたら、xscreensaver用のモジュールをPythonで作る事例も見かけた。

_A Python screensaver for xscreensaver (Linux) | alvinalexander.com

作者様はスゴイ人だった。 :

xscreensaver が Windowsに移植されない理由は以下で書いてあるわけだけど。

_XScreenSaver: Windows Version

「Micorosoftは俺が作った会社を潰した。許せねえ」ってどういうことだろうとググってみたら…。

_Jamie Zawinski - Wikipedia
_resignation and postmortem-j

xscreensaverの作者様、Jamie Zawinski さんは、Netscape社を作った方々の一人だったと今頃知った。それで Microsoft をひたすら憎んでいるのね…。

とは言え、その Microsoft の IE (Internet Explorer)も Google Chrome に殺されてしまったし。今の Windows は WSL2 で Linux が動いちゃったりするし。色んな Micorosoft製アプリがオープンソースで公開されてるし。当時と今とでは色々と違ってるよな…。それでもまだ Microsoft が憎くてたまらないのか…。

Windowsユーザって一番数が多いと思うのだけど、その、一番数が多いユーザ達に「xscreensaverってスゲエな」と思わせる機会を失ったあたりはなんだかもったいない気もする。憎しみは正常な判断能力を奪ってしまうもの。なのだろうか。

もっとも、今となってはスクリーンセーバなんてそもそも動かさないことが多いだろうし、今更な話かも。誰もそのPC使ってないし画面も見てないのにわざわざCPUを動かして描画する電力がもったいないから画面真っ暗にして省電力状態にするのが合理的だよね。みたいな。色々なディストリで、単に画面をフェードアウトさせるだけのアレコレが標準で入ってるのは、そういうことなんだろう…。スクリーンセーバをアレコレ選んで楽しむ時代は過ぎ去ってしまった…。

2022/05/25(水) [n年前の日記]

#1 [xscreensaver][linux] xscreensaverの作り方を勉強中

xscreensaver(のモジュール)の作り方を勉強中。以下のチュートリアル記事を、自動翻訳を使って眺めつつ、サンプルソースをDLしてコンパイルして動作確認。

_How to Write a Screensaver Module
_How to install a module

環境は Ubuntu Linux 20.04 LTS。Windows10 x64 21H2 + VMware Player上で動かした。

コンパイルについて。 :

Ubuntu上でビルドの類をするには、build-essential をインストールしておけばいいのかな。たぶん。gcc や make がインストールされるはず。
sudo apt install build-essential

サンプルソースのコンパイルには、vroot.h が必要。以下のページから入手できる。サンプルソースと同じ場所に置いておく。

_Simplesquares

コンパイルは、以下のような感じ。

gcc -o simplesquares simplesquares.c -L/usr/lib -lX11
これで、実行ファイル(実行権限がついたファイル)、simplesquares が生成される。

注意点。後々、画像ファイル(.xpm)を描画するサンプルソースが出てくるけれど、その場合はコンパイル時のオプションに -lXpm を追加する。
gcc -o image image.c -L/usr/lib -lX11 -lXpm

実行ファイルが出来上がったら、パスが通った場所にコピーしておく。自分の場合は、~/bin/ というディレクトリを作って、そこにパスを通してあるので、~/bin/ にコピーした。
cp simplesquares /home/(USERNAME)/bin

ちなみに、パスは ~/.bashrc の中で通してあった。最後のあたりに以下の行を追加したような気がする。
export PATH="/home/(USERNAME)/bin:$PATH"

xscreensaverに追加登録。 :

xscreensaver が実行ファイルを呼び出せるように、隠しファイル、~/.xscreensaver に実行ファイル名を追加しておく。「programs:」と書かれた行の直後から、呼び出す実行ファイル名が列挙されているらしいので、その一番最後に、「 hoge \n\」といった感じで追記する。

ちなみに、~.xscreensaver は、TAB幅が8文字、TABはスペースで置き換えずにTAB文字のままだった。記述ルールが古い。さすが、1992年に産まれたプログラム…。
programs:                                                                     \
                                maze -root                                  \n\
  GL:                           superquadrics -root                         \n\
...
...
...
  GL:                           razzledazzle -root                          \n\
                                vfeedback -root                             \n\
                                simplesquares                               \n\


これで、xscreensaver から simplesquares という実行ファイルが呼び出せるようになったはず。

動作確認。 :

端末上で xscreensaver-demo と打って実行。xscreensaver の設定ウインドウ(?)が開くので、追加した「Simplesquares」を選んで「プレビュー」ボタンをクリック。これで動作確認ができる。終了はESCキー。

とりあえず、前述のチュートリアルの、画像を描画するあたりまでは動作確認ができた。サンプルソースをコピペしまくって、以下のようなソースになった。

_sampless.c

使用画像は以下。

_geisya.xpm
_star5.xpm

実際に動かしてみると、以下のような見た目になる。

問題点。 :

自分は Ubuntu のデスクトップ環境として Xfce (Xubuntu) を使ってるけれど、~/.xscreensaver への変更内容は、Xfceの設定画面から呼び出せるスクリーンセーバ設定には反映されない模様。xscreensaver-demo を呼び出すと、そちらには反映されているけれど。

ふと、Xfceの設定画面に、「スクリーンセーバー」が2つ表示されていることにも気づいた。何故こんな状態に。

少し調べてみたら、Xfce はスクリーンセーバを xscreensaver ではなく xfce4-screensaver で管理しているらしい。

_apps:xfce4-screensaver:start [Xfce Docs]

また、Xfce の設定画面 → セッションと起動 → 自動開始アプリケーション、を眺めたら、以下の2つが登録されてた。
  • xfce4-screensaver
  • /usr/share/xscreensaver/xscreensaver-wrapper.sh -no-splash
どうやら2種類の管理プログラムが起動しちゃってるようで…。

少なくとも、xfce4-screensaver は ~/.xscreensaver を見ていない気がする。xfce4-screensaver が、どの設定ファイルを見ているのかが分かれば、そこを修正することでこういった実験ができるのかもしれない。

とりあえず、sudo apt purge xfce4-screensaver で、xfce4-screensaver をアンインストールして、xscreensaver だけを動かしてみた。一応この状態でもスクリーンセーバは動いてくれる模様。

また、試しに sudo apt remove xscreensaver、sudo apt install xfce4-screensaver で、xscreensaver をアンインストール、xfce4-screensaver をインストールした状態にしてみたけれど、この状態でもスクリーンセーバは動いた。

つまり、使うだけなら、どちらかを選んでインストールするだけでいいのかもしれない。まあ、今回は、自作の何かしらを動かしてみたいので、xscreensaver を残しておくつもりだけど…。

Makefileも書いた。 :

サンプルソースを弄ってコンパイルするたびに gccナンタラカンタラなんて打ち込んでられないので、簡単な Makefile を書いて、make と打てばコンパイルできるようにした。また、make install と打てば、~/bin/ に、実行ファイルや画像ファイルをコピーできるようにした。

ちなみに、Makefile内のインデントは、TAB文字で記述する。スペースにしちゃいけない。
CC = gcc
CFLAGS = -L/usr/lib -lX11 -lXpm

sampless: sampless.c monalisa.xpm
	$(CC) -o $@ $< $(CFLAGS)
	
ball: ball.c
	$(CC) -o $@ $< $(CFLAGS)
	
double: double.c
	$(CC) -o $@ $< $(CFLAGS)

trans: trans.c star5.xpm
	$(CC) -o $@ $< $(CFLAGS)

framechars: framechars.c
	$(CC) -o $@ $< $(CFLAGS)

.PHONY: install
install: sampless
	cp sampless /home/(USERNAME)/bin
	cp double /home/(USERNAME)/bin
	cp ball /home/(USERNAME)/bin
	cp trans /home/(USERNAME)/bin
	cp monalisa.xpm /home/(USERNAME)/bin
	cp star5.xpm /home/(USERNAME)/bin
	cp framechars /home/(USERNAME)/bin

本当は、どれかしらの *.c が更新されたらコンパイルするような記述にしたいのだけど、Makefile の書き方がよく分かってなくて、今のところ一番最初に記述したファイルしかチェックしてくれない。そのへんは今後の課題。

XPM画像について。 :

今回、初めてxpm画像を扱ったのだけど、C言語のソース内で「#include "monalisa.xpm"」と書いてしまえば、実行バイナリに画像データを含めることができると知って驚いてしまった。

xpmの中身を覗いてみたら、フツーにテキストファイルで、しかもC言語の変数として扱える記述になってたのですな…。恥ずかしながら、今まで知らなかった…。これは結構便利な気がする。

ただ、XnView を使って、自分でxpm画像を作ってみようとしたら、256色までしか指定できなくて。フルカラーは扱えないのだろうか。それと、透過部分を持ったxpmはどうやって作ればいいのだろう。

_XPM - Wikipedia
_X PixMap - Wikipedia

XPMフォーマットには XPM1、XPM2、XPM3 があって、C言語で扱えるのは XPM1 と XPM3 らしい。

とりあえず、GIMP で xpm をエクスポートしてみたら、透過部分を持ったxpmを出力できた、ような気がする。

描画の仕方がちょっと怪しい。 :

前述のチュートリアルを読み進めていったら、アニメーションの実現方法のあたりで、なんだかちょっと内容が怪しくなってきた。「見た目が変化する場所だけを書き換えて描画を高速化しよう!」云々の話が…。

昔の pygame のチュートリアルでもそういう話が出てたけど、その手の苦労はもうしたくないなあ…。でも、OpenGL を使うのも、自分にとってはちょっとハードルが高そう…。いや、描画速度を気にしなくて済む分、OpenGL を使うほうが、むしろ楽なのだろうか。どうなんだろう。

余談。テキストエディタのタブ文字幅変更が不便。 :

自分は普段、xyzzy、サクラエディタ、Mery、Notepad++、といったあたりのテキストエディタを使っているのだけど。今回、どのエディタも、TAB文字幅が即座に切り替えられなくて不便さを感じてしまった。設定画面を出して、全体の共通設定としてTAB文字幅を変更しないといけないのはツラい…。

ちなみに、Ubuntu Linux 20.04 LTS 上で動く gedit は、ステータスバーのあたりに「タブ幅」が表示されていて、しかも、そこをクリックすると、2,4,8等を選べたり、「スペースを使用」の有効無効を切り替えられる。

gedit_ss.png


geditのような機能を、他のエディタも持ってたら助かるのだけどな。

更に余談。隠しファイルが開けなくて悩んだ。 :

gedit で ~/.xscreensaver のような隠しファイルが開けなくて悩んでしまったのだけど、ファイル選択ダイアログで右クリックをすると、「隠しファイルを表示する」という項目が選べるので、そこにチェックを入れれば良かったらしい。

でも、こういうのは、一目見て「コレかな」と予想できるメニューボタンみたいなものをダイアログ上に用意したほうが良さそうな…。いやまあ、*NIX文化圏では、端末から gedit ~/.xscreensaver & と打って済ませちゃう人が多いのだろうか。

というかLinuxユーザなら、vim か emacs を使って済ませちゃうのかな…。

2022/05/26(木) [n年前の日記]

#1 [xscreensaver][linux][ubuntu] xscreensaverについてまだ調べてる

Ubuntu Linux 20.04 LTS + Xfce で、xscreensaver や xfce4-screensaver をインストールした際に、どこに何が置かれるのか調べているところ。

xscreensaver から呼び出される各プログラム、というか、それぞれの実行バイナリは、/usr/lib/xscreensaver/ 以下に置いてある模様。

/etc/X11/app-defaults/XScreenSaver は、デフォルトの設定ファイルだろうか。

/usr/share/xscreensaver/config/*.xml が、各モジュールの設定関連ファイルっぽい。もしかすると、ここにファイルを追加してやれば、スクリーンセーバの設定画面のリスト項目が増えるのだろうか。

README.hacking を眺めてる。 :

xscreensaver の公式サイトで、「新しいスクリーンセーバを作りたいなら README.hacking を読め」と書いてあった気がするので、xscreensaver-6.03.tar.gz をDLして解凍して、中に入ってた README.hacking を自動翻訳を通しつつ眺めてみた。

たぶんコレ、わざわざDLして解凍して取り出して読むのは面倒だろうから、一応、 _ココ にも置いてみる。日本語部分は utf8n で記述。

ざっと眺めてみたけれど、コレは困った。先日試してたチュートリアル記事の内容とは、結構異なることが書いてあるように見える。

例えば、「hoge_draw という関数を作れ」「その関数には、1フレーム分だけ描画する処理を書け」「usleep()は呼ぶなよ。絶対呼ぶなよ」と書いてある。先日のチュートリアルのサンプルソースでは、while(1) { } でメインループを書いて、その中で usleep() を呼んで時間待ちをしていたわけで。全然違うやん。やったらダメな書き方やん。みたいな。

それはともかく。以下の3つが「非常にシンプル」なので参考になるであろう、とも書いてあるのだけど。
  • hacks/greynetic.c
  • hacks/deluxe.c
  • hacks/glx/dangerball.c

眺めてみたら、「どこがシンプルやねん!」と床に叩きつけたくなるソースのように思えた。作者様の「は? こんなソースも読めないの?」的嘲笑が聞こえてくる…(幻聴)。いやまあ、Netscape Navigator を作って世界を変えてみせたプログラマーさんの作だから、自分のようなゴミカス底辺プログラマーがスラスラ読めるわけもないのですけど。

せめて雛形でもあればなあ…。helloworld ならぬ helloxsaver.c とか無いのかな。無いだろうな。

ビルドを試した。 :

Ubuntu Linux 20.04 LTS上で、xscreensaver-6.03.tar.gz のビルドができそうか試してみた。

tar zxvf xscreensaver-6.03.tar.gz
cd xscreensaver-6.03
./configure --prefix=/usr
make

./configure を実行した際、最後のあたりで、以下のメッセージが出てきた。
    #################################################################

    Warning: The systemd library was not found.

             This means that xscreensaver-systemd won't be built.
             Without that, xscreensaver will not be able to auto-lock
             before the system is suspended (e.g., closing laptop lid)
             and might activate while video playback is in progress.

    Warning: Your system seems to have PAM, but PAM is not being used.
             That is probably not going to work out well.

    #################################################################

    Warning: There is already an installed package of xscreensaver
             version "5.42+dfsg1-1ubuntu1", in these directories:

             User programs: /usr/bin/
             Screen savers: /usr/lib/xscreensaver/ (DIFFERS)
             Configuration: /usr/share/xscreensaver/config/
             Extra fonts:   none
             App Defaults:  /etc/X11/app-defaults/

    #################################################################

    XScreenSaver will be installed in these directories:

             User programs: /usr/bin/
             Screen savers: /usr/libexec/xscreensaver/ (DIFFERS)
             Configuration: /usr/share/xscreensaver/config/
             Extra Fonts:   /usr/share/fonts/xscreensaver/
             App Defaults:  /etc/X11/app-defaults/

「systemdが見つからない」「xscreensaverがインストール済みなんだけど?」みたいなことを言ってるのだろうか。

それでも一応 make を走らせてみたら、hacks/ 以下に実行バイナリが出来上がったように見えた。

sudo make install は怖いからやってない。前述のメッセージからすると、/usr/lib/xscreensaver/ に入れなきゃいけないのに /usr/libexec/xscreensaver/ に入れてしまいそうでもあるし…。

もしかして、./configure --prefix=/usr --libexecdir=/usr/lib と打てば、インストール先が Ubuntu のソレと一致するのだろうか。Linuxのこういうのって、よく分からん…。

仮で新しいスクリーンセーバを置いてみた。 :

hacks/deluxe.c をコピーして、hacks/helloxsaver.c というファイルを作成してみることにする。加えて、マニュアルに相当するらしい .man や、設定ダイアログを定義する .xml も同様に増やす。

cp hacks/deluxe.c hacks/helloxsaver.c
cp hacks/deluxe.man hacks/helloxsaver.man
cp hacks/config/deluxe.xml hacks/config/helloxsaver.xml

それぞれ、エディタで中を開いて、「deluxe」「Deluxe」と書かれた、それらしい文字列を、「helloxsaver」「Helloxsaver」に書き換えてみた。

後は、これらのファイルをコンパイルする Makefile があればいいはず。

./configure --prefix=/usr --libexecdir=/usr/lib を実行したら、自動で hacks/Makefile に追加してくれないかなと期待したけど、そんなことはなかった。

どうやら、hacks/Makefile.in を、手作業で書き換えないといけないっぽい。

hacks/Makefile.in をエディタで開いて、「deluxe」で検索。見つかった場所の最後のあたりに、「helloxsaver.c」「helloxsaver.o」「helloxsaver」等々を追加してみた。

この状態で、make clean をして作業用ファイルを削除してから、./configure --prefix=/usr --libexecdir=/usr/lib を実行。Makefile.in の内容に従って Makefile が生成された。と思う。たぶん。この状態で、make。

一応、hacks/helloxsaver という実行バイナリが出来上がったように見える。

インストールしてみた。 :

Ubuntu Linux 20.04 LTS 上で作業しているけれど、どうせ VMware Player上で仮想PCとして動かしているわけだし、もし環境が壊れたらまた再インストールすればいいや、ぐらいのノリで sudo make install をして、公式リポジトリ版 xscreensaver に上書きしてみた。

tar zxvf xscreensaver-6.03.tar.gz
cd xscreensaver-6.03

(helloxsaver.c 等を追加。Makefile.in を修正。)

./configure --prefix=/usr --libexecdir=/usr/lib
make
sudo make install

killall xscreensaver

xscreensaver &
xscreensaver-settings &

xscreensaver & を打った時点で、スプラッシュ画面が表示されて、「XScreenSaver 2022, V6.03」と表示された。おそらく最新版で置き換わったのだろう…。更に、xscreensaver-settings & と打ったら、スクリーンセーバの種類が選べるウインドウが表示された。

しかし、自分で勝手に追加した helloxsaver (Helloxsaver) は、リストの中に表示されていなかった。

古い ~/.xscreensaver が残っているせいだろうか。rm ~/.xscreensaver で削除。xscreensaver-settings & を打ってみたけど、やはりリストに登録されない。

これはもしかして、別のどこかでリストに登録されるべき項目が記述されているのではなかろうか。それはどこだ。なんというファイルなのか。分からん。

とりあえず、自分で、~/.xscreensaver を編集して、programs: の最後のあたりに、「 helloxsaver -root \n\」を追加してみた。

programs:                                                                     \
                                maze -root                                  \n\
  GL:                           superquadrics -root                         \n\
...
...
  GL:                           squirtorus -root                            \n\
                                helloxsaver -root                           \n\

この状態なら、リストに Helloxsaver が出てくる。

2022/05/27追記。 :

~/.xscreensaver を削除しても、helloxsaver がリストに登録されない理由が分かった。

  • ./configure --prefix=/usr --libexecdir=/usr/lib を実行すると、driver/XScreenSaver.ad.in から、driver/XScreenSaver.ad が作られる。
  • sudo make install をすると、driver/XScreenSaver.ad が、/etc/X11/app-defaults/XScreenSaver にコピーされる。
  • xscreensaver-settings を起動した際、~/.xscreensaver が存在しなければ、/etc/X11/app-defaults/XScreenSaver が ~/.xscreensaver としてコピーされる。

つまり、driver/XScreenSaver.ad.in に、" helloxsaver -root \n\" を追記しておく必要があった。「deluxe」で検索してみて、その行を複製して、「deluxe」を「helloxsaver」に書き換えておけばいい。

driver/XScreenSaver.ad.in を修正後、以下を打つ。
make clean
./configure --prefix=/usr --libexecdir=/usr/lib
make
sudo make install
rm ~/.xscreensaver
xscreensaver-settings &

これでリストに Helloxsaver が出現してくれた。

#2 [pc] CPUが届いた

パソコン工房に注文していたCPU、メモリ、CPUグリスが届いた。

送料無料。合計 39,660円。コスト的にかなりキツイけど、今使ってるM/Bでは最後のアップグレードになるだろうし…と自分で自分を説得してしまった。

今現在、Intel製CPU 12000番台が、Ryzen より性能が高いのに、Ryzenより値段が安いので、この時期に Ryzen を買うのもどうなんだと思ったけれど。Intelに乗り換えるとなるとM/Bは買い替えになって、しかしLGA1700対応M/Bの値段は高いので、トータルの値段を考えると悩んでしまう。まあ、今から新規に組むならIntelを選ばない理由は無いけれど…。

Ryzen 5 5600 (平均27,500円)と 5600X (平均32,500円)のどちらがいいかで、かなり悩んでしまった。クロックが数百MHzしか違わないけど、価格差は5,000円。ゲームを動かしてみると、軒並み1FPSぐらいしか差が出ないという話も見かけた。たった1FPSの差に5,000円払いますか。みたいな。などと悩んでいたら、パソコン工房が平均より1,000円ほどお値段を下げたので、背中を押されてしまった…。まあ、Socket AM4対応CPUのシングルコア性能は Ryzen 5 5600X が上限だろうし。仮に某ゲームのフレームレートが出なくても、「5600じゃなくて5600Xにしておくべきだったか…」と悩まずに済むし。諦めもつくだろう…。

とりあえず、CPUとメモリの交換が上手く行ったら、今使ってる Ryzen 5 3600 と DDR4-2400メモリ 8GB x 2 は、以前の親父さん用PCのM/Bに載せてしまって、妹に渡してしまおうと考えてるところ。

2022/05/27(金) [n年前の日記]

#1 [xscreensaver][linux][ubuntu] xscreensaver用スクリーンセーバを作れないか実験中

Ubuntu Linux 20.04 LTS上で、xscreensaver用のスクリーンセーバを作れないか実験中。

ダブルバッファで描画処理をしているらしい hacks/deluxe.c を別名で保存して、中身をガシガシ削って、骨の部分だけ残せないか試していたけど、ある程度それっぽく動く状態になってきた。後で手順をメモしておくつもり。

#2 [pc] メインPCのCPUを交換した

昨日、CPU とメモリが届いたので、メインPCのCPUとメモリを交換してみた。 CPUやメモリのスペックについては、 _昨日メモした。

M/B は、GIGABYTE B450M S2H (rev. 1.x)。Socket AM4対応、MicroATXサイズ。Ryzen 5000番台まで対応。

交換作業。 :

先日入手したIPA(イソプロピルアルコール)、「古河薬品工業 鮮烈水抜き剤 ガソリン用」を使って、CPUグリスを拭き取ってみたところ、固まってたCPUグリスがみるみる溶けて驚いた。IPA、スゴイ。ここまで落とせるのか…。何か悪影響が出てこないか、ちょっと不安になってくるレベル…。

どのCPUグリスを使うか悩んだけれど、せっかくだから今回購入した、熱伝導率が高いと謳う、親和産業 SMZ-01R (熱伝導率13.2W/m・K) を使ってみた。CPUの周辺5mmほどをマスキングテープで囲んでから、米粒ほどの量を載せて、別のCPUグリスに付属していたヘラを使って塗り広げていった。広げる時に空気が入ってそうな気もするけど…。

交換後。 :

起動してみたら、Ryzen 7 1700 から Ryzen 5 3600 に交換した時と同様に、「CMOSをクリアするか」「fTPM をリセットするか」と尋ねてきた。今のところ fTPM は使っていないはずなので、Yを押してリセットした。

とりあえず、USBメモリから起動できる PASSMARK MemTest86 9.4 Build 1000 を使って、メモリが壊れてないかチェックした。2時間半ほどかけて、4回PASSしたので、初期不良品ではなさそう。

_MemTest86 - Official Site of the x86 and ARM Memory Testing Tool

後でベンチマークを取ってみないと。

メモリにヒートシンクがついていて目論見が外れた。 :

今までメインPCで使っていた、Ryzen 5 3600 + DDR4-2400メモリ(8GB x 2枚、CL15)を、以前親父さんが使っていた M/B、BIOSTAR RACING B350GTN (Socket AM4, B350チップセット, Mini-ITX) に載せようと企んでいたのだけど、目論見が外れてしまった。

この M/B、CPUは Ryzen 3000番台まで対応してるので、そこは問題無い。しかし、今まで使ってた DDR4-2400メモリにはゴツイ感じのヒートシンクがついていた。このヒートシンクが Ryzen 5 3600 のリテールCPUクーラーとぶつかる。これではCPUクーラーを取り付けられない。気づいた瞬間、目の前が真っ暗になった…。

この M/B は、ヒートシンクがついてない、シンプルな見た目のメモリしか載せられなかったのだな…。おそらく、Mini-ITX M/B だから、CPUソケットやメモリスロットの配置がスペース的に厳しくて、こんなトラップが出現するのだろう。これが MicroATX M/B だったら問題が出にくいのかもしれない。あるいは、背の高いヒートシンクがついてるCPUクーラーなら大丈夫だったかも。もっともその場合、スリムPCケースに入らなくなる展開もあり得る。

さて、どうしたもんか…。

BIOSTAR B350GTN に今まで積んでいたメモリは 4GB x 2枚 = 8GB。妹に渡す予定のM/Bなのだけど、今の妹のPCは16GB積んでいるので、できればこのM/Bのメモリも16GB にしたい。そして目の前に 16GB のメモリが浮いている。しかし、コレは利用できない…。ホント、どうしたもんか。

何が何でもこのメモリを使うべく、CPUクーラーの新規購入を検討するか。それともメモリ自体を新規購入してしまうか。あるいは、妹には8GBで諦めてもらうか…。

とりあえず、CPUだけでも交換しておくことにした。どう考えても、B350GTN に今載せている Ryzen 3 2200G、あるいは浮いている Ryzen 7 1700 より、Ryzen 5 3600 のほうがいいだろう…。2200G も 1700 も第1世代コアだけど、3600 は第3世代コアだし。

まあ、Ryzen 5 3600 はGPUを内蔵してないので、別途ビデオカードが必要になるのだけど、「ビデオカードは持ってる」と妹は言ってたから、そこは問題無いはず。

2022/05/28() [n年前の日記]

#1 [xscreensaver] xscreensaver用のスクリーンセーバを作りたい

xscreensaver用のスクリーンセーバを自分で作れるのかどうか気になって、少し調べていたのでそのあたりをメモ。

公式サイトは以下。

_XScreenSaver

動作確認環境は、Ubuntu Linux 20.04 LTS。Windows10 x64 21H2 + VMware Workstation Player 16.2.3 build-19376536 上で動かしてる状態。

公式リポジトリ版のインストール。 :

作り始める前に、まずは、Ubuntu公式リポジトリ版の xscreensaver をインストールできるか試す。

おそらく、端末上で以下を打てばインストールできるはず。
sudo apt install xscreensaver*

どんなパッケージがあるのかは、以下で確認できる…かな…。たぶん。
$ sudo apt install aptitude

$ sudo aptitude search xscreensaver
i A libopengl-xscreensaver-perl          - Perl module for writing OpenGL-based XScreenSaver hacks
i   xscreensaver                         - X11 向けスクリーンセーバデーモンおよびフロントエンド
i   xscreensaver-data                    - Screen saver modules for screensaver frontends
i   xscreensaver-data-extra              - スクリーンセーバーフロントエンド用の追加のスクリーンセーバーモジュール
i   xscreensaver-gl                      - GL(Mesa) screen saver modules for screensaver frontends
i   xscreensaver-gl-extra                - Extra GL(Mesa) screen saver modules for screensaver frontends
i   xscreensaver-screensaver-bsod        - XScreenSaver の BSOD スクリーンセーバーモジュール
i   xscreensaver-screensaver-dizzy       - Graphics demo that makes you dizzy (XScreenSaver hack)
i   xscreensaver-screensaver-webcollage  - Webcollage screen saver module from XScreenSaver

xscreensaver は、GNOME や Xfce4 が標準で持ってるスクリーンセーバと若干競合するらしいので、xscreensaver をインストールする際に、もしそれらのスクリーンセーバがインストールされているなら、アンインストールしておく。
sudo apt remove gnome-screensaver
sudo apt remove xfce4-screensaver
sudo apt remove cinnamon-screensaver

ちなみに、xscreensaver の設定画面を出すのは以下。
xscreensaver-settings &

xscreensaver が起動している状態で、xscreensaver のプロセスを終了させたいなら以下。
xscreensaver-command -exit

$ ps aux | grep xscreensaver
username    1421  0.0  0.0   6920  3596 ?        S    21:51   0:00 xscreensaver -no-splash
username    1896  0.0  0.0  10084   720 pts/0    R+   21:59   0:00 grep --color=auto xscreensaver

$ xscreensaver-command -exit
xscreensaver-command: exiting

$ ps aux | grep xscreensaver
username    1901  0.0  0.0  10084   652 pts/0    S+   21:59   0:00 grep --color=auto xscreensaver
xscreensaver-command -exit を実行すると、プロセスが無くなってることが分かるかなと。

ソースからビルド。 :

ソースからビルドできるか試してみる。ソースは以下から入手できる。

_XScreenSaver: Download

Ubuntu Linux 20.04 LTS の場合、ソースからのビルドは以下のような感じでできそうな気配がする。本当にこれで合ってるのか分からないけれど。
wget https://www.jwz.org/xscreensaver/xscreensaver-6.03.tar.gz
tar zxvf xscreensaver-6.03.tar.gz
cd xscreensaver-6.03

./configure --prefix=/usr --libexecdir=/usr/lib
make

ビルドした実行バイナリ群を所定の場所にインストールするなら以下。公式リポジトリ版 xscreensaver をインストール済みなら、それらが最新版のバイナリで上書きされる。
sudo make install

既に存在する設定ファイルを消去。
rm ~/.xscreensaver

xscreensaver を再設定。設定すると、~/.xscreensaver が作られる。
xscreensaver-settings &

ちなみに、./configure --prefix=/usr --libexecdir=/usr/lib を実行すると、ビルドに必要な Makefile を自動生成してくれるけど、その際表示されるメッセージの最後のあたりで、「ビルドした実行バイナリその他をコピーする場所はここだよ」と一覧表示してくれる。
...
config.status: creating po/Makefile
config.status: executing po/stamp-it commands

    #################################################################

    Warning: The systemd library was not found.

             This means that xscreensaver-systemd won't be built.
             Without that, xscreensaver will not be able to auto-lock
             before the system is suspended (e.g., closing laptop lid)
             and might activate while video playback is in progress.

    Warning: Your system seems to have PAM, but PAM is not being used.
             That is probably not going to work out well.

    #################################################################

    Warning: There is already an installed package of xscreensaver
             version "5.42+dfsg1-1ubuntu1", in these directories:

             User programs: /usr/bin/
             Screen savers: /usr/lib/xscreensaver/
             Configuration: /usr/share/xscreensaver/config/
             Extra fonts:   none
             App Defaults:  /etc/X11/app-defaults/

    #################################################################

    XScreenSaver will be installed in these directories:

             User programs: /usr/bin/
             Screen savers: /usr/lib/xscreensaver/
             Configuration: /usr/share/xscreensaver/config/
             Extra Fonts:   /usr/share/fonts/xscreensaver/
             App Defaults:  /etc/X11/app-defaults/

  • xscreensaver本体がインストールされる場所 : /usr/bin/
  • 各スクリーンセーバの実行バイナリが入る場所 : /usr/lib/xscreensaver/
  • 各スクリーンセーバの設定画面定義ファイル (.xml) : /usr/share/xscreensaver/config/
  • xscreensaverが使うフォント : /usr/share/fonts/xscreensaver/
  • xscreensaver本体のデフォルト設定ファイル (XScreenSaver) : /etc/X11/app-defaults/

何か妙なことになったら、このあたりの場所を眺めてみると、何か分かるかもしれない。

新しいスクリーンセーバ用のファイルを追加する。 :

xscreensaver用の新しいスクリーンセーバを作る場合は、ソース群に同梱されている _README.hacking が参考になる。

例えば、ここでは helloxsaver という名前のスクリーンセーバを作ってみることにする。

必要になるファイルは、3つ。
  • helloxsaver.c : スクリーンセーバの処理が書かれたC言語のソースファイル
  • helloxsaver.man : マニュアルファイル
  • helloxsaver.xml : 設定画面の項目等を定義したxmlファイル

それぞれ、以下の場所に追加する。
  • *.c, *.man : hacks/ ディレクトリ内に入れる。
  • *.xml : hacks/config/ ディレクトリ内に入れる。

README.hacking の中で、「Greynetic と Deluxe がシンプルだから参考になるだろう」と書かれているので、deluxe.c、deluxe.man、deluxe.xml を、helloxsaver.c、helloxsaver.man、helloxsaver.xml として別名コピーして、それらのファイルの中身を書き換えて実験するのが良いのではないか、と思う。
cp -v hacks/deluxe.c hacks/helloxsaver.c
cp -v hacks/deluxe.man hacks/helloxsaver.man
cp -v hacks/config/deluxe.xml hacks/config/helloxsaver.xml

Makefileを修正。 :

追加した *.c をコンパイルしてくれるように、hacks/Makefile を ―― Makefileそのものは ./configure を実行すると自動生成されて修正内容が消えてしまうので、自動生成時の元になる hacks/Makefile.in を修正する。

念のために、別名コピーしてバックアップを取っておく。
cp -v hacks/Makefile.in hacks/Makefile.in.orig

エディタ(ここでは geditを使用)で開く。
gedit hacks/Makefile.in &

ファイル内を、「deluxe」で検索。(gedit なら、Ctrl + F でファイル内検索ができる。)

「deluxe.c」「deluxe.o」「deluxe」「deluxe.man」等々の文字列が書かれてる場所が見つかるので、「helloxsaver.c」「helloxsaver.o」「helloxsaver」「helloxsaver.man」を追記してみたり、あるいは、行をコピーして、「deluxe」を「helloxsaver」に書き換えたりする。

書き換えが終わったら、./configure を実行して、Makefile を自動生成し直す。
./configure --prefix=/usr --libexecdir=/usr/lib

hacks/Makefile をエディタで開いて、helloxsaver という文字列が入ってるようなら、Makefile の修正はOK。

一応、今回書き換えた部分も載せておく。
--- Makefile.in.orig	2022-05-28 22:48:43.739400524 +0900
+++ Makefile.in	2022-05-28 22:55:42.960593626 +0900
@@ -105,7 +105,7 @@ SRCS		= xscreensaver-getimage.c \
 		  rotor.c ant.c xjack.c xlyap.c \
 		  cynosure.c moire2.c flow.c epicycle.c interference.c \
 		  truchet.c bsod.c crystal.c discrete.c distort.c kumppa.c \
-		  demon.c loop.c t3d.c penetrate.c deluxe.c compass.c \
+		  demon.c loop.c t3d.c penetrate.c deluxe.c helloxsaver.c compass.c \
 		  squiral.c xflame.c wander.c spotlight.c critical.c \
 		  phosphor.c xmatrix.c petri.c shadebobs.c xsublim.c ccurve.c \
 		  blaster.c bumps.c ripples.c xspirograph.c \
@@ -144,7 +144,7 @@ OBJS		= attraction.o blitspin.o bouboule
 		  rotor.o ant.o xjack.o xlyap.o xscreensaver-getimage.o \
 		  cynosure.o moire2.o flow.o epicycle.o interference.o \
 		  truchet.o bsod.o crystal.o discrete.o distort.o kumppa.o \
-		  demon.o loop.o t3d.o penetrate.o deluxe.o compass.o \
+		  demon.o loop.o t3d.o penetrate.o deluxe.o helloxsaver.o compass.o \
 		  squiral.o xflame.o wander.o spotlight.o critical.o \
 		  phosphor.o xmatrix.o petri.o shadebobs.o xsublim.o ccurve.o \
 		  blaster.o bumps.o ripples.o xspirograph.o \
@@ -174,7 +174,7 @@ EXES		= attraction blitspin bouboule bra
 		  fadeplot rdbomb coral mountain triangle \
 		  xjack xlyap cynosure moire2 flow epicycle \
 		  interference truchet bsod crystal discrete distort kumppa \
-		  demon loop penetrate deluxe compass squiral xflame \
+		  demon loop penetrate deluxe helloxsaver compass squiral xflame \
 		  wander spotlight phosphor xmatrix petri shadebobs \
 		  ccurve blaster bumps ripples xspirograph \
 		  nerverot xrayswarm zoom whirlwindwarp rotzoomer \
@@ -216,7 +216,7 @@ MEN		= anemone.man apollonian.man attrac
 	          blaster.man blitspin.man bouboule.man braid.man bsod.man \
 	          bumps.man ccurve.man compass.man coral.man \
 	          crystal.man cynosure.man decayscreen.man \
-	          deco.man deluxe.man demon.man discrete.man distort.man \
+	          deco.man deluxe.man helloxsaver.man demon.man discrete.man distort.man \
 	          drift.man epicycle.man euler2d.man fadeplot.man \
 	          flame.man flow.man fluidballs.man galaxy.man \
 	          goop.man grav.man greynetic.man halo.man helix.man \
@@ -706,6 +706,9 @@ penetrate:	penetrate.o	$(HACK_OBJS) $(CO
 deluxe:		deluxe.o	$(HACK_OBJS) $(ALP) $(COL) $(DBE)
 	$(CC_HACK) -o $@ $@.o	$(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS)
 
+helloxsaver:	helloxsaver.o	$(HACK_OBJS) $(ALP) $(COL) $(DBE)
+	$(CC_HACK) -o $@ $@.o	$(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS)
+
 compass:	compass.o	$(HACK_OBJS) $(DBE)
 	$(CC_HACK) -o $@ $@.o	$(HACK_OBJS) $(DBE) $(HACK_LIBS)
 
@@ -1612,6 +1615,22 @@ deluxe.o: $(UTILS_SRC)/visual.h
 deluxe.o: $(UTILS_SRC)/xdbe.h
 deluxe.o: $(UTILS_SRC)/xft.h
 deluxe.o: $(UTILS_SRC)/yarandom.h
+helloxsaver.o: ../config.h
+helloxsaver.o: $(srcdir)/fps.h
+helloxsaver.o: $(srcdir)/recanim.h
+helloxsaver.o: $(srcdir)/screenhackI.h
+helloxsaver.o: $(srcdir)/screenhack.h
+helloxsaver.o: $(UTILS_SRC)/alpha.h
+helloxsaver.o: $(UTILS_SRC)/colors.h
+helloxsaver.o: $(UTILS_SRC)/font-retry.h
+helloxsaver.o: $(UTILS_SRC)/grabscreen.h
+helloxsaver.o: $(UTILS_SRC)/hsv.h
+helloxsaver.o: $(UTILS_SRC)/resources.h
+helloxsaver.o: $(UTILS_SRC)/usleep.h
+helloxsaver.o: $(UTILS_SRC)/visual.h
+helloxsaver.o: $(UTILS_SRC)/xdbe.h
+helloxsaver.o: $(UTILS_SRC)/xft.h
+helloxsaver.o: $(UTILS_SRC)/yarandom.h
 demon.o: $(srcdir)/automata.h
 demon.o: ../config.h
 demon.o: $(srcdir)/fps.h

xscreensaverの設定ファイルを修正。 :

xscreensaver は、~/.xscreensaver を設定ファイルとして読み書きするけれど。元ファイルは /etc/X11/app-defaults/XScreenSaver。~/.xscreensaver が存在しない場合、/etc/X11/app-defaults/XScreenSaver を ~/.xscreensaver としてコピーする。

その、/etc/X11/app-defaults/XScreenSaver は、ソースファイル群の中の driver/XScreenSaver.ad が元になってる。更に、driver/XScreenSaver.ad は、driver/XScreenSaver.ad.in から自動生成される。

そんなわけで、XScreenSaver.ad.in に「helloxsaver」を追記すれば、xscreensaver の選択リストの中に「helloxsaver」も表示されるようにできる。

オリジナルをバックアップしておく。
cp -v driver/XScreenSaver.ad.in driver/XScreenSaver.ad.in.orig

エディタで開く。ちなみに、タブ文字幅は8。
gedit driver/XScreenSaver.ad.in &

「deluxe」で検索して、行を複製して、「helloxsaver」に書き換える。

書き換えが終わったら、./configure を実行して、XScreenSaver.ad を自動生成し直す。
./configure --prefix=/usr --libexecdir=/usr/lib

driver/XScreenSaver.ad をエディタで開いて、「helloxsaver」の文字列があったら、修正はOK。

一応、今回書き換えた部分を載せておく。
--- XScreenSaver.ad.in.orig	2022-05-28 23:05:16.965155973 +0900
+++ XScreenSaver.ad.in	2022-05-28 23:07:40.161214058 +0900
@@ -397,6 +397,7 @@ XScreenSaver.bourneShell:		/bin/sh
 				ccurve -root				    \n\
 				compass -root				    \n\
 				deluxe -root				    \n\
+				helloxsaver -root			    \n\
 -				demon -root				    \n\
 @GLE_KLUDGE@ GL: 				extrusion -root				    \n\
 -				loop -root				    \n\

*.c や *.man や *.xml を修正。 :

現在、helloxsaver.(c|man|xml) の中身は、deluxe.(c|man|xml) のままになっている。修正していく。

_README.hacking によると、xscreensaver用のスクリーンセーバ(のC言語ソース)は、以下が定義されている必要があるらしい。
  • 2つのグローバル変数。
  • 5つの関数。
  • 一番最後の行で、XSCREENSAVER_MODULE ("YourSaverName", yoursavername) が書かれていること。

つまり、今回、helloxsaver.c 内の、2つのグローバル変数の名前は以下になる。
  • helloxsaver_defaults : 使用リソースのデフォルト値を列挙しておく。
  • helloxsaver_options : 受け入れるコマンドラインオプションを列挙しておく。

5つの関数の名前は以下になる。
  • helloxsaver_init : 初期化処理。グローバルな状態を保持するオブジェクトを返す。
  • helloxsaver_draw : 1フレーム分の描画処理。
  • helloxsaver_free : 処理に使っていたメモリ領域を全て解放。
  • helloxsaver_reshape : ウィンドウサイズが変更されたときに呼び出される。
  • helloxsaver_event : キーボードやマウスのイベントが発生したときに呼び出される。

helloxsaver.c の中で「deluxe」で検索して、変数名、関数名、及び、一番最後の行を、「deluxe_xxxx」から「helloxsaver_xxxx」に書き換えておく。

同様に、helloxsaver.man や helloxsaver.xml も修正。中に書かれている「deluxe」「Deluxe」を「helloxsaver」「Helloxsaver」に書き換えておく。

makeする。 :

make を実行。
make

hacks/ディレクトリの中に、helloxsaver という、実行権限がついたファイルが生成されていたらビルドは成功。
$ ls -al hacks/helloxsaver*
-rwxrwxr-x 1 username username 328464  5月 28 23:37 hacks/helloxsaver
-rw-rw-r-- 1 username username  14024  5月 28 23:35 hacks/helloxsaver.c
-rw-rw-r-- 1 username username   1973  5月 28 23:35 hacks/helloxsaver.man
-rw-rw-r-- 1 username username  64608  5月 28 23:37 hacks/helloxsaver.o

インストールしてみる。 :

出来上がった実行バイナリ群をインストールしてみる。公式リポジトリ版がインストール済みの環境では、公式リポジトリ版が上書きされてしまうので注意。
sudo make install

自分のアカウント内に保存されている設定ファイルを削除。
rm ~/.xscreensaver

xscreensaverの設定画面を出してみる。ここで、新しい ~/.xscreensaver がコピーされて作られる。
xscreensaver-settings &

リストの中に「Helloxsaver」があれば上手く行ってる。選択して、「プレビュー」ボタンを押して動いてくれたら、更にOK。まあ、表示される画面は、「Deluxe」と同じなわけだけど…。

後は、helloxsaver.c を修正して、自分がやってみたい処理を書いてみて、以下を実行して動作確認していけばよい。
make
sudo make install
xscreensaver-settings &

もっとも、その、「処理を書いていく」ところが、まだちょっと分からないわけだけど…。

#2 [pc] CPUを交換したのでベンチマークを取ってみた

メインPCのCPUを、Ryzen 5 3600 から Ryzen 5 5600X に交換したので、Cinebench でベンチマークを取ってみた。ちなみに、メモリも DDR4-2400 CL15 から DDR4-3200 CL22 に変更してある。

* AMD Ryzen 5 5600x (6core,12thread, 3.7 - 4.6 GHz) + DDR4-3200 CL22
* AMD Ryzen 5 3600 (6core,12thread, 3.6 - 4.2 GHz) + DDR4-2400 CL15
* AMD Ryzen 7 1700 (8core,16thread, 3.0 - 3.7 GHz) + DDR4-2400 CL15


Cinebench R15
-------------

### multi

* AMD Ryzen 5 5600x Cinebench R15 multi : 1601 cb
* AMD Ryzen 5 3600 Cinebench R15 multi : 1528 cb
* AMD Ryzen 7 1700 Cinebench R15 multi : 1406 cb

### single

* AMD Ryzen 5 5600x Cinebench R15 single : 253 cb
* AMD Ryzen 5 3600 Cinebench R15 single : 192 cb
* AMD Ryzen 7 1700 Cinebench R15 single : 146 cb


Cinebench R20
-------------

### multi

* AMD Ryzen 5 5600x Cinebench R20 multi : 3711 pts
* AMD Ryzen 5 3600 Cinebench R20 multi : 3508 pts
* AMD Ryzen 7 1700 Cinebench R20 multi : 3017 pts

### single

* AMD Ryzen 5 5600x Cinebench R20 single : 586 pts
* AMD Ryzen 5 3600 Cinebench R20 single : 473 pts
* AMD Ryzen 7 1700 Cinebench R20 single : 361 pts


Cinebench R23
-------------

### multi

* AMD Ryzen 5 5600x Cinebench R23 multi : 9461 pts
* AMD Ryzen 5 3600 Cinebench R23 multi : 8963 pts
* AMD Ryzen 7 1700 Cinebench R23 multi : 8135 pts

### single

* AMD Ryzen 5 5600x Cinebench R23 single : 1509 pts
* AMD Ryzen 5 3600 Cinebench R23 single : 1220 pts
* AMD Ryzen 7 1700 Cinebench R23 single : 934 pts

とりあえず、CPUを交換して、たしかに速くなったことが分かった。遅くなったらどうしようと、ちょっと不安だった…。ホッとした。

計算上は、DDR4-3200 CL22 (レイテンシ 13.75ns) より、DDR4-2400 CL15 (レイテンシ 12.5ns) のほうが、レイテンシは短いのだけど…。

_見れば全部わかるDDR4メモリ完全ガイド、規格からレイテンシ、本当の速さまで再確認 - AKIBA PC Hotline!

CPUの性能アップが、メモリのレイテンシの違いを上回っている、ということだろうか。いやまあ、Cinebench はCPUの性能差が強く出るということかもしれんけど。

2022/05/29() [n年前の日記]

#1 [xscreensaver] xscreensaver用のスクリーンセーバを作りたい。その2

_昨日 に続いて、xscreensaver用のスクリーンセーバを自分で作れないか実験中。

_README.hacking に、新しいスクリーンセーバを作る際に意識することが書かれてあるので、眺めながら作業。

環境は Ubuntu Linxu 20.04 LTS。

とりあえず、hacks/ディレクトリ内で、deluxe.c、deluxe.man、config/deluxe.xml をコピーして、helloxsaver.c、helloxsaver.man、config/helloxsaver.xml の3ファイルを作ったけれど。まだ中身が deluxe.c のままだし、deluxe.c は色々と複雑な処理をしているように見えるので、ガシガシ削って、ダブルバッファ描画処理の骨の部分だけを残して、更に、画面の中でボール(円)が跳ね回るだけの処理を書いてみた。

実行結果は以下のような感じ。どこでもよく見かけるアレ。

ソースファイル。 :

ソースは以下。長い。長いけど、「ball」で検索すれば、肝心の処理部分だけがなんとなく見えてくるかなと。それ以外はダブルバッファ描画関係の処理なので、極端な話、気にしなくいい。ダブルバッファ処理をしたいなら、まるっとコピペして、後は独自の処理だけを書き加えればいいのではなかろうかと。

_helloxsaver.c
/* xscreensaver, Copyright (c) 2022 YOURNAME <YOURNAME@example.com>
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation.  No representations are made about the suitability of this
 * software for any purpose.  It is provided "as is" without express or
 * implied warranty.
 */

#include <math.h>
#include "screenhack.h"
#include "alpha.h"

#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
#include "xdbe.h"
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */

#define PI 3.141592

/* degree to radian */
static double deg2rad(double angle)
{
  return (angle * PI / 180.0);
}

/* screensaver state */
struct state
{
  Display *display;
  Window window;

  int nplanes;
  unsigned long base_pixel;
  unsigned long *plane_masks;

  Bool monochrome;
  Bool use_dbuf;

  int delay;
  int speed;

  double x, y;   /* ball position */
  double dx, dy; /* ball direction */
  int w, h;      /* ball width, height */
  GC gc;         /* graphics context */

  XWindowAttributes xgwa;

  XColor color;
  GC erase_gc;

  /* double-buffer to reduce flicker */
  Pixmap backbuf;
  Pixmap ba;
  Pixmap bb;

#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
  Bool dbeclear_p;
  XdbeBackBuffer backb;
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
};

/* initialize ball position */
static void
init_ball_pos(struct state *st)
{
  int sw, sh;
  sw = st->xgwa.width;  /* window width */
  sh = st->xgwa.height; /* window height */

  /* set width and height */
  st->w = st->h = ((sw > sh) ? sh : sw) / 16;

  /* set position */
  st->x = (random() % (sw / 2)) + (sw / 4);
  st->y = (random() % (sh / 2)) + (sh / 4);

  /* set direction */
  {
    double rad;
    rad = deg2rad(random() % 360);
    st->dx = st->speed * cos(rad);
    st->dy = st->speed * sin(rad);
  }
}

/*
 * init screensaver.
 * Return an object holding your global state.
 */
static void *
helloxsaver_init(Display *display, Window window)
{
  struct state *st = (struct state *)calloc(1, sizeof(*st));

  st->display = display;
  st->window = window;

  /* get parameter */
  st->delay = get_integer_resource(st->display, "delay", "Integer");
  st->speed = get_integer_resource(st->display, "speed", "Speed");
  st->use_dbuf = get_boolean_resource(st->display, "doubleBuffer", "Boolean");
  st->monochrome = get_boolean_resource(st->display, "mono", "Boolean");

#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
  st->dbeclear_p = get_boolean_resource(st->display, "useDBEClear", "Boolean");
#endif

#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
  st->use_dbuf = False;
#endif

  /* get window attributes */
  XGetWindowAttributes(st->display, st->window, &st->xgwa);

  /* define colors */
  st->color.pixel = get_pixel_resource(st->display, st->xgwa.colormap,
                                       "foreground", "Foreground");

  if (st->use_dbuf)
  {
    /* init double buffer */

#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
    if (st->dbeclear_p)
      st->backbuf = xdbe_get_backbuffer(st->display, st->window, XdbeBackground);
    else
      st->backbuf = xdbe_get_backbuffer(st->display, st->window, XdbeUndefined);
    st->backb = st->backbuf;
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */

    if (!st->backbuf)
    {
      /* create buffer A, B */
      st->ba = XCreatePixmap(st->display, st->window, st->xgwa.width, st->xgwa.height, st->xgwa.depth);
      st->bb = XCreatePixmap(st->display, st->window, st->xgwa.width, st->xgwa.height, st->xgwa.depth);
      st->backbuf = st->ba;
    }
  }
  else
  {
    st->backbuf = st->window;
  }

  /* init graphics context. use erase. */
  {
    XGCValues gcv;
    gcv.foreground = get_pixel_resource(st->display, st->xgwa.colormap,
                                        "background", "Background");
    st->erase_gc = XCreateGC(st->display, st->backbuf, GCForeground, &gcv);
  }

  /* clear buffer A, B */
  if (st->ba)
    XFillRectangle(st->display, st->ba, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);

  if (st->bb)
    XFillRectangle(st->display, st->bb, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);

  /* initialize ball position */
  init_ball_pos(st);

  /* init graphics context */
  {
    XGCValues gcv;
    unsigned long flags;

    flags = GCForeground;
    gcv.foreground = st->color.pixel;
    gcv.line_width = 2;
    gcv.cap_style = CapProjecting;
    gcv.join_style = JoinMiter;
    flags |= (GCLineWidth | GCCapStyle | GCJoinStyle);
    st->gc = XCreateGC(st->display, window, flags, &gcv);
  }

  return st;
}

/* Draw a single frame */
static unsigned long
helloxsaver_draw(Display *display, Window window, void *closure)
{
  struct state *st = (struct state *)closure;

  /* clear double buffer  */
#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
  if (!st->dbeclear_p || !st->backb)
    XFillRectangle(st->display, st->backbuf, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
#else
  XFillRectangle(st->display, st->backbuf, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */

  /* ball move and draw */
  {
    /* draw circle */
    XFillArc(st->display, st->backbuf, st->gc, st->x, st->y, st->w, st->h, 0, 360 * 64);

    /* move */
    st->x += st->dx;
    st->y += st->dy;

    /* change directon */
    if (st->x <= 0 || (st->x + st->w) >= st->xgwa.width)
      st->dx *= -1;
    if (st->y <= 0 || (st->y + st->h) >= st->xgwa.height)
      st->dy *= -1;
  }

  /* draw double buffer */
#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
  if (st->backb)
  {
    XdbeSwapInfo info[1];
    info[0].swap_window = st->window;
    info[0].swap_action = (st->dbeclear_p ? XdbeBackground : XdbeUndefined);
    XdbeSwapBuffers(st->display, info, 1);
  }
  else
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
    if (st->use_dbuf)
    {
      XCopyArea(st->display, st->backbuf, st->window, st->erase_gc, 0, 0,
                st->xgwa.width, st->xgwa.height, 0, 0);
      st->backbuf = (st->backbuf == st->ba ? st->bb : st->ba);
    }

  return st->delay;
}

/* Called when the window is resized. */
static void
helloxsaver_reshape(Display *display, Window window, void *closure,
                     unsigned int w, unsigned int h)
{
  struct state *st = (struct state *)closure;
  if (!st->use_dbuf)
  { /* #### more complicated if we have a back buffer... */
    XGetWindowAttributes(st->display, st->window, &st->xgwa);
    XClearWindow(display, window);
    
    init_ball_pos(st);
  }
}

/* Called when a keyboard or mouse event happens. */
static Bool
helloxsaver_event(Display *display, Window window, void *closure, XEvent *event)
{
  return False;
}

/* Free everything you've allocated. */
static void
helloxsaver_free(Display *display, Window window, void *closure)
{
  struct state *st = (struct state *)closure;

  XFreeGC(display, st->erase_gc);

  if (st->ba)
    XFreePixmap(display, st->ba);

  if (st->bb)
    XFreePixmap(display, st->bb);

  if (st->plane_masks)
    free(st->plane_masks);

  XFreeGC(display, st->gc);
  free(st);
}

/* Default values for the resources you use. */
static const char *helloxsaver_defaults[] = {
    ".background:		black",
    ".foreground:		white",
    "*delay:		10000",
    "*speed:		15",
    "*doubleBuffer:	True",
#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
    "*useDBE:		True",
    "*useDBEClear:	True",
#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
#ifdef HAVE_MOBILE
    "*ignoreRotation:     True",
#endif
    0};

/* The command-line options you accept. */
static XrmOptionDescRec helloxsaver_options[] = {
    {"-delay", ".delay", XrmoptionSepArg, 0},
    {"-speed", ".speed", XrmoptionSepArg, 0},
    {"-db", ".doubleBuffer", XrmoptionNoArg, "True"},
    {"-no-db", ".doubleBuffer", XrmoptionNoArg, "False"},
    {0, 0, 0, 0}};

/*
 * The last line of the file should be
 * XSCREENSAVER_MODULE ("YourSaverName", yoursavername)
 */

XSCREENSAVER_MODULE("Helloxsaver", helloxsaver)


マニュアルファイル(.man)と、設定画面定義ファイル(.xml) は以下。

_helloxsaver.man
_helloxsaver.xml

  • *.c, *.man は、hacks/ 以下にコピー。
  • *.xml は、hacks/config/ 以下にコピー。

make でビルド。sudo make install でインストールして、xscreensaverの設定画面を出して動作確認。
make
sudo make install
xscreensaver-settings &

少し解説。 :

最初のあたりで state という構造体を定義している。これは、このスクリーンセーバが動いてる最中、ずっと保持されるべきワークエリアの定義。動作に必要な変数は、全てこの state の中に入れておくことになる。

helloxsaver_init() は初期化処理を担当する。state 分のメモリ領域を確保・初期化して、関数を抜けるときに return st; で、呼び出し元に state のポインタを返している。xscreensaver本体は、この返されたメモリ領域を、スクリーンセーバが動いてる最中、ずっと保持しているのだろう。たぶん。

helloxsaver_draw() は、1フレーム分の描画を担当する関数。引数として state のポインタが渡されているので、そのワークエリアを使って処理をする。

helloxsaver_reshape() は、ウインドウサイズが変更された時に呼ばれるらしい。ここでは、ウインドウの情報(横幅、縦幅等々)を取得し直して、画面クリアと、ボールの位置を初期化してる。

helloxsaver_event() は、キーボード等が押された時に呼ばれるらしいが、return False; だけを書いておけばいい。

helloxsaver_free() は、ワークエリアの開放処理を書く。

グローバル変数、helloxsaver_defaults は、パラメータのデフォルト値を列挙。helloxsaver_options には、コマンドラインオプションを列挙する。

そして、一番最後の行に、以下を書く。

XSCREENSAVER_MODULE("Helloxsaver", helloxsaver)

もし、hoge という名前のスクリーンセーバを書くなら、最後の行は以下になるはず。
XSCREENSAVER_MODULE("Hoge", hoge)

ちなみに、xscreensaver用のスクリーンセーバとして公開する時は、*.c、*.man、*.xml 内の日付(年)や YOURNAME の部分を自分のソレに書き換えるようにと、 _README.hacking には書かれていた。

もう一つ書いてみた。 :

helloxsaver2 という名前でもう一つ書いてみた。実行結果は以下。ボールが複数跳ね回る例のアレ。



ソースファイル等は以下。

_helloxsaver2.c
_helloxsaver2.man
_helloxsaver2.xml

ファイルが増えたので、以下の2つを修正する必要がある。
  • hacks/Makefile.in
  • driver/XScreenSaver.ad.in

_Makefile.in.patch
_XScreenSaver.ad.in.patch

各所に、helloxsaver2.* を追加する。

修正できたら、以下を実行して、Makefile や XScreenSaver.ad を自動生成し直す。
./configure --prefix=/usr --libexecdir=/usr/lib

make してビルドして、インストールして、設定画面を出して動作確認。
make
sudo make install
xscreensaver-settings &

課題。 :

X11の描画機能を使って、線のみで円を描いたり、塗り潰しで円を描いたりすることができると分かった。円が描けるなら、おそらく四角や線や点も描けそうな気がする。

ただ、できれば画像を描画したい。最低限、画像の描画さえできれば、大昔の2Dゲームっぽい画面を作れるだろうから、かなり表現の幅が広がるはず。

しかし、画像を描画する方法が分からない…。

C言語のソースに、xpm画像をインポートしてやれば ―― #include "images/hoge.xpm" とでも書いてやれば、実行バイナリに画像データを含めることができるのではないかと思ったけれど、試してみたら xpm画像は扱えないと怒られた。xscreensaver は、xpm関連ライブラリをリンクしているわけではないのかもしれない。

画像を読み込んで描画してそうなスクリーンセーバはどれかなと探してみたけど、これがなかなか…。noseguy.c あたりがソレっぽいかなと眺めてみたけど、何が何だか。

画像の扱い方について。 :

画像の扱い方について調べてたのだけど、少し分かってきた。

hacks/images/ の中に、大量の画像が入っている。これらが、xscreensaver が利用する画像なのだろう。

また、hacks/images/Makefile による指定で、.png を .h に変換してることも分かった。ワイルドカード(*.png)を使って対象ファイル群が指定されているので、とにかく hacks/images/ の中にpng画像を入れておけば、それだけで変換処理対象として扱ってくれるらしい。

hacks/images/gen/ の中に、大量の *.h が入ってるけれど、これが、hacks/images/*.png をC言語のソース形式に変換したもの。中では unsigned char で、png画像のバイナリが列挙されている。

static const unsigned char nose_f1_png[] =
 "\211PNG\015\012\032...\000IEND\256B`\202";

  • hacks/images/gen/*.h は、make 時に自動生成されるので、ソースファイル群を解凍した段階では存在していない。
  • png画像から *.h への変換は、utils/bin2c というシェルスクリプトで行われている。実際には、bin2c の中で、Perl のワンライナーを指定して変換処理をしている。


さておき。これら、images/gen/*.h を、スクリーンセーバの *.c の中で include すれば、スクリーンセーバの実行バイナリの中に、png画像データもまるっと含まれて、画像データにアクセスできるようになるのだろう。例えば、下記なら、nose-f[1-4].png が実行バイナリに含まれることになる。

#include "images/gen/nose-f1_png.h"
#include "images/gen/nose-f2_png.h"
#include "images/gen/nose-f3_png.h"
#include "images/gen/nose-f4_png.h"


画像の読み込みをする場合は、ximage-loader.h を include する模様。

#include "screenhack.h"
#include "ximage-loader.h"

ximage-loader.h の中を覗いたら、一番最初の行に、「ximage-loader.h --- converts XPM data to Pixmaps.」と書いてあった。もしかして、xpm画像も使える…? また、その下で、image_data_to_pixmap()、image_data_to_ximage() 等々、それらしい名前の関数が宣言されていた。これらの関数を使えば、png画像のバイナリを Pixmap や XImage に変換できそう。たぶん。

2022/05/30(月) [n年前の日記]

#1 [xscreensaver] xscreensaver用のスクリーンセーバを作りたい。その3

_昨日 に続いて、xscreensaver用のスクリーンセーバを自分で作れないか実験中。 _README.hacking に新しいスクリーンセーバを作る際に意識することが書かれてあるので眺めながら作業。

環境は Ubuntu Linxu 20.04 LTS。

画像を描画するスクリーンセーバを作りたい。hacks/*.c を眺めた感じでは、noseguy.c が画像を読み込んで描画しているように見えた。別名コピーして書き換えて、雛形っぽい状態に持っていきたい。

スクリーンセーバ名は、helloimgdraw にしてみる。

利用する画像を設置。 :

まず、利用する画像を用意する。今回は ufoimage256c.png を用意した。256色、透過部分アリのpng画像。

ufoimage256c.png

_ufoimage256c.png

これを hacks/images/ 以下に置いた。
$ ls -al hacks/images/ufo*
-rwxrwxr-x 1 username username 9276  5月 29 21:51 hacks/images/ufoimage256c.png

make すると、hacks/images/ 以下に置いてある各png画像は、hacks/images/gen/*.h として変換される。この .hファイルを、.cソースの中で include すれば、png画像のバイナリにアクセスできる状態になる。

そんなわけで、make して、hacks/images/gen/ufoimage256c_png.h が得られた。
$ ls -al hacks/images/gen/ufo*
-rw-rw-r-- 1 username username 27336  5月 29 21:51 hacks/images/gen/ufoimage256c_png.h

.cファイルを用意。 :

noseguy.(c|man|xml) を別名コピーして、新しいファイル、helloimgdraw.(c|man|xml) を作成。
cp hacks/noseguy.c hacks/helloimgdraw.c
cp hacks/noseguy.man hacks/helloimgdraw.man
cp hacks/config/noseguy.xml hacks/config/helloimgdraw.xml

これらのファイルを改造して実験していく。

今日はここで時間切れ。明日の日記に成果物を載せる予定。

2022/05/31(火) [n年前の日記]

#1 [xscreensaver] xscreensaver用のスクリーンセーバを作りたい。その4

_昨日 に続いて、xscreensaver用のスクリーンセーバを自分で作れないか実験中。 _README.hacking に新しいスクリーンセーバを作る際に意識することが書かれてあるので眺めながら作業。

環境は Ubuntu Linxu 20.04 LTS。Windows10 x64 21H2 + VMware Player 上で動かしてる。

円だの線だの四角だのを描画するだけではなくて、画像を描画するスクリーンセーバを作りたい。noseguy.(c|man|xml) と deluxe.(c|man|xml) を参考にして実験をした。

とりあえず、一応、画像描画できてるような感じにはなった。

ソース。 :

ソースは以下。

_helloimgdraw.c

相変わらず長い。長いけど、「obj」で検索すれば、肝心の処理部分だけを追えるかなと。

.man と .xml は以下。

_helloimgdraw.man
_helloimgdraw.xml

  • .c と .man は、hacks/ 以下に置く。
  • .xml は、hacks/config/ 以下に置く。


一応簡単に解説。

「#include "ximage-loader.h"」と書いて、ximage-loader.h をインクルードすれば、画像バイナリを Pixmap や XImage に変換する関数が使えるようになる。

ソースの最初のあたりに、「#include "images/gen/ufoimage256c_png.h"」を記述しているけれど、これで、ufoimage256c.png のバイナリに、ufoimage256c_png という変数を通じてアクセスできるようになる。

ちなみに images/gen/*.h は、make をすると自動生成される。そのあたりのルール(?)は、 _2022/05/29の日記 にメモしてある。

画像バイナリから Pixmap への変換は、image_data_to_pixmap() で行うことができる。

Makefile.in を修正。 :

hacks/Makefile.in を書き換えて、helloimgdraw.c もコンパイルできるようにする。

_Makefile.in.patch
_Makefile.in

「noseguy」で検索して、その周辺に helloimgdraw.* を追加していけばいい。具体的には…。
  1. SRCS に helloimgdraw.c を追記。
  2. OBJS に helloimgdraw.o を追記。
  3. EXES に helloimgdraw を追記。
  4. MEN に helloimgdraw.man を追記。

他に、以下の行を、noseguy 関係の記述行のすぐ下のあたりに追加。
helloimgdraw:	helloimgdraw.o	$(HACK_OBJS) $(COL) $(PNG) $(DBE)
	$(CC_HACK) -o $@ $@.o	$(HACK_OBJS) $(COL) $(PNG) $(PNG_LIBS) $(DBE) $(HACK_LIBS)
helloimgdraw.o: ../config.h
helloimgdraw.o: $(srcdir)/fps.h
helloimgdraw.o: images/gen/ufoimage256c_png.h
helloimgdraw.o: $(srcdir)/recanim.h
helloimgdraw.o: $(srcdir)/screenhackI.h
helloimgdraw.o: $(srcdir)/screenhack.h
helloimgdraw.o: $(UTILS_SRC)/colors.h
helloimgdraw.o: $(UTILS_SRC)/font-retry.h
helloimgdraw.o: $(UTILS_SRC)/grabscreen.h
helloimgdraw.o: $(UTILS_SRC)/hsv.h
helloimgdraw.o: $(UTILS_SRC)/resources.h
helloimgdraw.o: $(UTILS_SRC)/textclient.h
helloimgdraw.o: $(UTILS_SRC)/usleep.h
helloimgdraw.o: $(UTILS_SRC)/visual.h
helloimgdraw.o: $(UTILS_SRC)/xdbe.h
helloimgdraw.o: $(UTILS_SRC)/xft.h
helloimgdraw.o: $(UTILS_SRC)/yarandom.h
helloimgdraw.o: $(srcdir)/ximage-loader.h

注意点。noseguyの指定と比べて、一部、必要になるライブラリ(?)が違ってる。
noseguy:	noseguy.o	$(HACK_OBJS) $(PNG) $(TEXT)
	$(CC_HACK) -o $@ $@.o	$(HACK_OBJS) $(PNG) $(TEXT) $(PNG_LIBS) $(TEXT_LIBS)

helloimgdraw:	helloimgdraw.o	$(HACK_OBJS) $(COL) $(PNG) $(DBE)
	$(CC_HACK) -o $@ $@.o	$(HACK_OBJS) $(COL) $(PNG) $(PNG_LIBS) $(DBE) $(HACK_LIBS)

noseguy はテキストメッセージを表示する処理が入っているので、$(TEXT) や $(TEXT_LIBS) が必要になるけれど、今回のソースはテキストメッセージを表示しないので、そのあたりの記述は無くていいはず。また、deluxe.c の中身をコピペしていたりもするので、deluxe.c が必要としていた $(COL) や $(DBE) や $(HACK_LIBS) も追加してみた。

XScreenSaver.ad.in を修正。 :

スクリーンセーバのリストに、Helloimgdraw も追加したい。driver/XScreenSaver.ad.in も修正する。

_XScreenSaver.ad.in.patch
_XScreenSaver.ad.in

「 deluxe -root \n\」と書かれた行のすぐ下にでも、「 helloimgdraw -root \n\」を追加しておけばいいのではないかと思う。

make等を実行。 :

ここまでできたら、Makefile 等を自動生成し直し。
./configure --prefix=/usr --libexecdir=/usr/lib

そして、make してビルド。エラーが出ずにビルドができたら、インストール。
make
sudo make install

xscreensaver の設定ファイルを削除してから、設定画面を表示して動作確認。
rm ~/.xscreensaver
xscreensaver-settings &

問題点。 :

一見すると、画像が描画できてるように見えるし、透過部分もちゃんと透過になっているので、これで目的は果たせたぞ、と思ったのだけど。設定ダイアログを出して、オブジェクトの数を増やしてみたところ、画面がやたらとちらつくことに気づいてしまった。




どう見ても、どこかで何かがバグってる。

もしかすると、ダブルバッファ描画処理のあたりで頓珍漢なことをしている予感。仕組みも分からないまま deluxe.c からコピペしてきたけど、その際、妙なところを書き換えてしまったのかもしれない…。

仮想PC (VMware Player) 上で動かしてるからこうなるのだろうか、実機で動かしたら違う見た目になるのかなと、Core2Duo E8400(2コア2スレッド、3.0GHz) + Ubuntu Linux 20.04 LTS上でも動かしてみたけれど、そちらでも同様に画面がちらついた。やはりプログラムがバグってるな…。

バグを修正できた。 :

ダブルバッファを使っているらしい、deluxe.c や anemone.c を眺めながらコピペを繰り返していたら、画面のちらつきは治った模様。やはりダブルバッファ関連がおかしかったらしい。




_helloimgdraw.c
_helloimgdraw.man
_helloimgdraw.xml

どこらへんがおかしかったのかはさっぱり分かってない…。まだバグがあるかも…。でもまあ、ダブルバッファで処理すればちらつかない状態が実現できるし、ちらついたらどこかでバグってる、ということだけは分かった。

xscreensaverのビルドに必要なパッケージについて。 :

OSインストール直後の状態に比較的近い Ubuntu Linxu 20.04 LTS上で、xscreensaver 6.03 をソースからビルドしようとして以下を打ってみたら、警告がたくさん出てきてしまった。

./configure --prefix=/usr --libexecdir=/usr/lib
Warning: The GTK libraries do not seem to be available; the `xscreensaver-settings' program requires them.
Warning: The Xt library was not found.  It is required.
Warning: The XFreeType library was not found.  It is required.
Warning: The systemd library was not found. This means that xscreensaver-systemd won't be built. Without that, xscreensaver will not be able to auto-lock before the system is suspended (e.g., closing laptop lid) and might activate while video playback is in progress.
Note: The OpenGL 3D library was not found. Those demos which use 3D will not be built or installed. That is most of them.
Warning: Your system seems to have PAM, but PAM is not being used. That is probably not going to work out well.

Gtk、Xt、XFreeType、OpenGL等々が見つからねえぞと言われてしまっている…。今ままでは色々なパッケージをインストールした環境で試してたから、こういう状況に遭遇しなかったのだな…。

解消できないものかと、関係がありそうな気配がするパッケージを片っ端からインストールしていったら、警告数は少なくなった。

ただ、どのパッケージが何と関係しているのか、そのあたりが分かってない。でもまあ、とりあえず、インストールしたパッケージを一応メモしておく。不要なパッケージもインストールしちゃってるはずだけど、気にしないことにする。

intltool libsdl2-dev libgimp2.0-dev libxml2-dev
libgtkextra-dev libgtkmm-2.4-dev libgtkmm-3.0-dev
python3-dev python3-setuptools libjpeg-dev zlib1g-dev libfreetype6-dev
python-pygame python3-pygame
libgles2-mesa-dev mesa-utils
libgdk-pixbuf2.0-dev

それでもまだ、以下の警告が出てるけど…。

    #################################################################

    Warning: The systemd library was not found.

             This means that xscreensaver-systemd won't be built.
             Without that, xscreensaver will not be able to auto-lock
             before the system is suspended (e.g., closing laptop lid)
             and might activate while video playback is in progress.

    Warning: Your system seems to have PAM, but PAM is not being used.
             That is probably not going to work out well.

    #################################################################

    Warning: There is already an installed package of xscreensaver
             version "5.42+dfsg1-1ubuntu1", in these directories:

             User programs: /usr/bin/
             Screen savers: /usr/lib/xscreensaver/
             Configuration: /usr/share/xscreensaver/config/
             Extra fonts:   none
             App Defaults:  /etc/X11/app-defaults/

    #################################################################

    XScreenSaver will be installed in these directories:

             User programs: /usr/bin/
             Screen savers: /usr/lib/xscreensaver/
             Configuration: /usr/share/xscreensaver/config/
             Extra Fonts:   /usr/share/fonts/xscreensaver/
             App Defaults:  /etc/X11/app-defaults/


ここまでメモしてから気が付いたけど、README の最初のあたりで、必要なパッケージについて書いてあった…。そっちを見てから試せば良かった。

===============================================================================
To compile for a Unix system with X11:
===============================================================================

    ./configure --help

    ./configure --prefix=/usr
    make
    sudo make install
    make clean

    xscreensaver &
    xscreensaver-settings

  There are many compilation dependencies.
  The configure script will tell you what is missing.
  At the least, you will need development versions of these libraries:

    perl pkg-config gettext intltool libx11 libxext libxi libxt
    libxft libxinerama libxrandr libxxf86vm libgl libglu libgle
    libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam
    dbus libsystemd elogind

  BSD systems might need gmake instead of make.


もっとも、README には、Ubuntu (Debian) には存在していないパッケージ名ばかりが書かれているようで…。

E: パッケージ libx11 が見つかりません
E: パッケージ libxext が見つかりません
E: パッケージ libxi が見つかりません
E: パッケージ libxt が見つかりません
E: パッケージ libxft が見つかりません
E: パッケージ libxinerama が見つかりません
E: パッケージ libxrandr が見つかりません
E: パッケージ libxxf86vm が見つかりません
E: パッケージ libgl が見つかりません
E: パッケージ libglu が見つかりません
E: パッケージ libgle が見つかりません
E: パッケージ libgtk2 が見つかりません
E: パッケージ gdk-pixbuf-2.0 が見つかりません
E: パッケージ gdk-pixbuf-xlib-2.0 が見つかりません
E: パッケージ libpam が見つかりません
E: パッケージ libsystemd が見つかりません
E: パッケージ 'elogind' にはインストール候補がありません
パッケージ elogind は使用できませんが、別のパッケージから参照されます。これは、パッケージが欠落しているか、廃止されたか、または別のソースからのみ利用可能であることを意味します。

README に従ったら、ほとんど全滅。

「Debian は古いバージョンの xscreensaver を配布しているから警告メッセージ出して嫌がらせしてやる!」とかやっておきながら、その Debian でビルドするための情報をまとめておかないあたり、なんだかちょっと引っ掛かるなあ…。

_Debian 8 jessie + xfce 4 で xscreensaver から light-locker に移行する方法 - 怠惰の形而上学

ちなみに、(Ubuntu|Debian) の場合、おそらく上記のパッケージ名の後ろに「-dev」とつければ、それっぽいパッケージが見つかりそうな気配はあるなと…。

sudo apt install libx11-dev libxext-dev libxi-dev libxt-dev libxft-dev libxinerama-dev
sudo apt install libxrandr-dev libxxf86vm-dev libgl-dev libglu-dev libgle-dev libgtk2.0-dev
sudo apt install libgdk-pixbuf2.0-dev 
sudo apt install libpam-dev

ただ、これで本当にビルドできる状態になるのか分からない。別途、Ubuntu をインストールし直して、ほとんどの素の状態から試さないと分からんなと…。そりゃまあ、xscreensaver の作者様も、一々そんな検証作業をやってられないよな…。

Debian や Ubuntu の xscreensaver パッケージ説明に、ビルド時に必要になる依存パッケージが書かれてたりしないのだろうか。自分、そのあたりの取り決めが分かってないので、なんとも…。

_Debian -- bullseye の xscreensaver パッケージに関する詳細
_Ubuntu - focal の xscreensaver パッケージに関する詳細

ここで出現するパッケージ名の後ろに「-dev」をつけて探してみればいいのだろうか。

2022/06/01追記。 :

VMware Player上で Ubuntu Linux 20.04 LTS を新規にインストールして、xscreensaver 6.04 のビルドに必要になるパッケージを確認してみた。

ちなみに、公式サイトからソース群をDLしようとしたら、6.03 が 6.04 に更新されてた。

_jwz: XScreenSaver 6.04 out now

さておき。Ubuntu Linux 20.04 LTS の場合、xscreensaver 6.04 のビルドに必要になりそうなパッケージは以下の模様。これで全部の警告が消えるわけではないけれど、ある程度は消えてくれた。

sudo apt install build-essential make git wget intltool
sudo apt install libx11-dev libxext-dev libxi-dev libxt-dev libxft-dev libxinerama-dev
sudo apt install libxrandr-dev libxxf86vm-dev libgl-dev libglu-dev libgle-dev
sudo apt install libgtk2.0-dev libgdk-pixbuf2.0-dev libpam-dev libxml2-dev libjpeg-dev

ソース群を入手。
wget https://www.jwz.org/xscreensaver/xscreensaver-6.04.tar.gz
tar zxvf xscreensaver-6.04.tar.gz
cd xscreensaver-6.04

以下を打って、Makefile を自動生成。ビルド。インストール。設定画面を表示して動作確認。
./configure --prefix=/usr --libexecdir=/usr/lib
make
sudo make install
xscreensaver-settings &

以上、31 日分です。

過去ログ表示

Prev - 2022/05 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project