mieki256's diary



2023/11/01(水) [n年前の日記]

#1 [hsp] hsp3dishの勉強を再開

hsp3dish について、改めて勉強を再開。環境は Windows10 x64 22H2 + HSP 3.7beta7。

hsp3dish を使ってスクリーンセーバが作れそうか実験してみたいと思っているのだけど。その前に、多少は見た目がソレっぽい処理を書いておいて、ソレをスクリーンセーバとして移植できるか試したほうがいいのかなと思えてきた。

処理内容としては、フルスクリーン表示にして、画面の奥から手前にたくさんの星を飛ばす、例のアレ。昔のWindowsには星を飛ばすスクリーンセーバが標準で入っていた気がするけれど、要はアレを再現するプログラム。

余談。今頃になって気づいたけれど、Windows10には、あの星を飛ばすスクリーンセーバが入っていないような気がする…。一体どの時点で無くなったんだろう…? もう入手できないのだろうか?

ソース :

_fullscreen_zoom.hsp
    ; hsp3dish + fullscreen test. move stars.
    ;
    ; Windows10 x64 22H2 + HSP 3.7beta7
    ; 2023/11/01 by mieki256
    ; Licence : CC0 / Public Domain
    
    #include "hsp3dish.as"
    #include "d3m.hsp"
    
    #packopt name "fullscreen_zoom"
    #packopt type 0
    
    #define TEX_FILE    "star.png"
    ; #define TEX_FILE    "star2.png"
    #pack   TEX_FILE
    
    #define KB_ESC      $000080
    #define FRAMERATE   60
    
    fps_display_enable = 1
    
    ; get desktop size
    dispw = ginfo_dispx
    disph = ginfo_dispy
    
    ; initialize window without frame
    ; bgscr WindowID, width, height, mode, x, y
    bgscr 0, dispw, disph, 0, 0, 0
    
    ; load image
    imgid = 3
    celload TEX_FILE, imgid

    ; split image. set orign
    celdiv imgid, 512, 512, 256, 256

    ; Set the buffer to draw from. Windows ID 0
    gsel 0, 1
    
    ; Set screen clear color to be performed when redraw 0 is called.
    ; 0 or 1, color ($000000 - $ffffff)
    ; setcls CLSMODE_SOLID, $4080c0
    setcls CLSMODE_SOLID, $000000
    
    font "Tahoma", 24, 1
    
    randomize
    
    star_size = 0.75
    dist = 150.0        ; screen distabce
    area_z = 5000
    zmax = double(area_z) + dist
    
    ; rnd() only accepts 1 to 32768.
    ; adjust the value to stay within that range.
    area_m = 4.0
    area_w = int((double(dispw) * zmax) / dist / area_m)
    area_h = int((double(disph) * zmax) / dist / area_m)
    
    objmax = 512
    
    ; initialize stars work
    ddim posx, objmax       ; position x
    ddim posy, objmax       ; position y
    ddim posz, objmax       ; position z
    dim px, objmax          ; display position x
    dim py, objmax          ; display position y
    ddim scalev, objmax     ; scale
    dim alpha, obj_max      ; alpha value
    repeat objmax
        gosub *get_newpos_xy
        posx(cnt) = nx
        posy(cnt) = ny
        posz(cnt) = double(rnd(area_z)) + dist
        px(cnt) = 0
        py(cnt) = 0
        scale(cnt) = 0.0
        alpha(cnt) = 0
    loop
    
    time_start = d3timer()
    endfg = 0
    
; ----------------------------------------
*mainloop
    while endfg == 0
        tm = d3timer() - time_start
        fps = d3getfps()                ; get FPS
        
        ; ESC key to exit
        stick key, 0
        if key & KB_ESC : endfg = 1
        
        ; move stars
        spd = 40.0
        repeat objmax
            posz(cnt) -= spd
            if posz(cnt) < (dist / 2.0) {
                posz(cnt) += zmax
                gosub *get_newpos_xy
                posx(cnt) = nx
                posy(cnt) = ny
            }
            
            ; get display x, y position
            px(cnt) = int(posx(cnt) * dist / posz(cnt)) + (dispw / 2)
            py(cnt) = int(posy(cnt) * dist / posz(cnt)) + (disph / 2)
            scalev(cnt) = star_size * dist / posz(cnt)
            
            size = int(512.0 * scalev(cnt))
            x0 = px(cnt) - (size / 2)
            y0 = py(cnt) - (size / 2)
            x1 = px(cnt) + (size / 2)
            y1 = py(cnt) + (size / 2)
            if x1 < 0 or x0 > dispw or y1 < 0 or y0 > disph {
                ; out of display area. position reset
                posz(cnt) += zmax
                gosub *get_newpos_xy
                posx(cnt) = nx
                posy(cnt) = ny
                px(cnt) = int(posx(cnt) * dist / posz(cnt)) + (dispw / 2)
                py(cnt) = int(posy(cnt) * dist / posz(cnt)) + (disph / 2)
                scalev(cnt) = star_size * dist / posz(cnt)
            }
            
            ; get alpha value
            az = double(area_z) * 0.7
            if posz(cnt) < az {
                alpha(cnt) = 255
            } else {
                ; fade in
                z = posz(cnt)
                if z > zmax : z = zmax
                v0 = z - az
                v1 = zmax - az
                alpha(cnt) = int(255.0 - (255.0 * v0 / v1))
            }
        loop
        
        ; ----------------------------------------
        ; draw start
        redraw 0
        
        ; clear screen
        ; color 64, 128, 192
        ; boxf
        
        ; draw stars
        repeat objmax
            rot = 0.0
            idx = 0
            
            ; draw image by celput
            gmode gmode_add, 512, 512, alpha(cnt)
            pos px(cnt), py(cnt)
            rot = 0.0
            idx = 0
            celput imgid, idx, scalev(cnt), scalev(cnt), rot
        loop

        ; draw text
        if fps_display_enable {
            gmode gmode_rgb0
            color 255, 255, 255
            pos 10, 10
            mes strf("[%dx%d] %d/%dFPS", dispw, disph, fps, FRAMERATE)
        }
        
        ; draw end. screen refersh
        redraw 1
        
        await (1000 / FRAMERATE)
        ; await 12
    wend
    
*jobend:
    end
    
*get_newpos_xy
    nx = double(rnd(area_w) - (area_w / 2)) * area_m
    ny = double(rnd(area_h) - (area_h / 2)) * area_m
    return

使用画像は以下。どちらか片方でいい。好きなほうをどうぞ。

_star.png
_star2.png

動作させたら以下のような感じになった。縮小したので見辛いけれど、「ああ。アレね」と思ってもらえるかなと…。

余談。星を飛ばすスクリーンセーバ :

星を飛ばす、例のスクリーンセーバはもう入手できないのだろうか?

ググってみたら、以下のページでそれらしいものを見かけた。Windows95という文字列が見えるから、Windows95の頃には存在していたスクリーンセーバということかな…。

_ssstars : mike : Free Download, Borrow, and Streaming : Internet Archive
_Starfield Screensaver for Windows - Screensavers Planet
_windows 95 "starfield" screensaver : r/Windows10


以下のやり取りでスクリーンセーバ名が分かった。「宇宙飛行」という名前だったらしい。ファイル名は ssstars.scr。冒頭の「ss」は、ScreenSaverの省略形だろう。さておき、この「宇宙飛行」、Windows XP の頃までは入っていた模様。

_WindowsXpの元々入っているスクリーンセーバーについてお願いしま| OKWAVE


以下のページによると、Windows98 - XP時代のスクリーンセーバはビンテージ云々と書いてある。ということは、その後の Windows で ―― Windows Vista の段階でごっそりと削除されてしまったということかな。

_Windows 11 でクラシック スクリーン セーバーを使用する方法 | 最高の家
_Windows XP And 98 Screensavers ( 1) : Free Download, Borrow, and Streaming : Internet Archive

思い返してみれば、Windows Vista の頃は液晶ディスプレイが主流になっていた気もしてきた。CRTの焼き付き防止を期待してスクリーンセーバを動かす必要も無くなっていったのが大体その時期だったのかもしれない。

#2 [anime][neta] 魔女キャラのコラボ回ってどうだろう

妄想メモ。

「ひろがるスカイ!プリキュア」を見ていたら、ハロウィンネタでメインキャラ達が魔女の扮装をする展開が出てきたのだけど。その光景を見ていて、「魔女云々の回を作れるなら、いっそ、おジャ魔女どれみのキャラがゲスト出演するのはどうだろうか」と妄想してしまった。そういうのって難しいのかな。どちらも権利は東映アニメーションが持っているのだろうから、そのあたりは問題無さそうだけど…。

そういえば、そもそも魔女設定のプリキュアが居たような…?

_魔法つかいプリキュア! - Wikipedia

あのプリキュアがゲストで出てきてもいいよな…。ハロウィン回では必ずカメオ出演(?)するとかそんな感じでも十分楽しいかも。「ウォーリーをさがせ」ならぬ…なんだろな。なんかそんな感じで。

東映アニメーションと言えば、かつては東映魔女っ子シリーズを繰り出していたっけ。例えば、プリキュアに「魔女っ子メグちゃん」が出てくるのもアリだったりしないか…。

_東映魔女っ子シリーズ - Wikipedia

もっとも、「魔法使いサリー」は横山光輝先生が原作だし、「キューティーハニー」は永井豪先生が原作だろうから、登場させるのは難しそう。いや、一覧を眺めてみると、東映魔女っ子シリーズの大半は原作者が別に居たのだな。「メグちゃん」も原作は東映じゃなかった…。となるとゲスト出演は難しそう。

プリキュアに、あのあたりの作品のキャラが出てきたらちょっと面白そうと思ったけれど、権利的に難しいのではなあ…。なんだか残念。

只の妄想メモでした。オチは無いです。

「ひろみプロ」って何だろう :

「メグちゃん」の原作は「ひろみプロ」となってるけれど、どういう会社だったのだろう…?

_ミラクル少女リミットちゃん - Wikipedia
本作は、手塚プロアシスタント経験者らで構成された企画集団「ひろみプロ」が企画した「少女版SF変身物作品」を具体化したものである。

ミラクル少女リミットちゃん - Wikipedia より


なるほど。企画集団だったのか…。「パトレイバー」の「ヘッドギア」みたいな感じなのかな。

東映動画のアニメーターさん達が虫プロに移籍したり、手塚先生の元アシスタントさん達が東映に企画を持ち込んだり、そのあたりの流れが興味深い気もする。昔から色んな人材があちこちを行き来してアニメを作ってたんだなと…。

それにしても、「ひろみプロ」についてググっても情報が全く出てこない。Googleの検索精度が悪化してるのだろうか。それとも情報を誰もアップしてないぐらいに謎の集団なのだろうか…。設立の経緯、活動実績、最終的にどうなったのか等々、気になる…。関わっていた作品群の権利はどうなってるんだろう。今となっては権利面の問題でリメイク不可能だったりするんだろうか。まあ、当時見ていた人は、もうお爺さんお婆さんだろうし。今の時代にリメイクしてもアレかな…。

2023/11/02(木) [n年前の日記]

#1 [cg_tools][hsp] BDFフォント関係のツールについて調べてた

HSP の HGIMG3 を使用する際にビットマップフォント一覧画像が必要になって、BDFフォントを利用できないかと試してたのだけど、BDFフォントを扱えるツールがないものかと気になってきたのでそのあたりを調べてみた。具体的には、どういう感じのフォントなのか、見た目で確認したい。できれば拡大表示ができればありがたいのだけど。

BDFフォントと言うのは、昔の *NIX界隈で使われていたビットマップフォントのフォーマットの一つ。テキストファイル形式で内容が記述されている。

Chortkeh BDF Font Viewer :

chortkehbdffontviewer_ss.png

_Chortkeh BDF Font Viewer

BDfフォントビューワ。Windows上で動作する。入手できるバージョンは 2.0.0.0。ただし日付は 2009/05/14 になってる。

chortkeh-bdf-font-viewer.zip を入手して解凍すると、中に BDFViewer.exe というファイルが1つだけ入ってる。コレを実行すれば起動する。

エクスプローラからのドラッグアンドドロップには未対応。File → Open でBDFフォントを開くと、等倍表示される。

フォントを拡大表示できないのはちょっとツライ。Windwosの拡大鏡を使って確認するしかなさそうだなと…。

Fony :

fony_ss.png

_fony

ビットマップフォントエディタ。Windows上で動作する。入手できるバージョンは 1.4.7-WIP と 1.4.6。WIPというのは、Work In Progress、Work In Process の略で、制作途中、鋭意制作中、みたいな意味。

Fony-wip.zip を入手して解凍。Fony.exe を実行すると起動する。

BDFフォントは、Open では開けない。File → Import → BDF Font... で開く。ドラッグアンドドロップも未対応。

Bits'N'Picas :

bitsnpicas_ss.png

_kreativekorp/bitsnpicas: Bits'N'Picas - Bitmap & Emoji Font Creation & Conversion Tools
_Releases - kreativekorp/bitsnpicas

ビットマップフォントエディタ。Java製。Windows上でも動作する。入手できるバージョンは 2.0.2。

BitsNPicas.jar を入手して実行すると起動する。Javaランタイムがインストールされている環境なら、.jar が関連付けされているはずなので、.jar をダブルクリックするだけでも実行できるはず。

File → Open で BDFフォントを開ける。ドラッグアンドドロップには未対応。

View → Zoom In で拡大表示ができる。ただ、ショートカットキーが Ctrl + = になっているので、日本語キーボードではショートカットキーを利用できない。英語キーボード(「-」の右に「=」がある)なら使えるのだろうけど…。

File → Preview で、プレビュー表示ができることに気づいた。任意の文字列でプレビュー表示できる模様。Ctrl + P で呼び出せるし、拡大率も指定できるので、この機能を使ったほうが確認しやすいかもしれない。

BDF Font viewer (BDF View) :

bdf_font_viewer_ss.png

_MRz-NET.org
_emurenMRz/bdf_view: This software is a BDF font viewer. PNG export is supported.

Webサービス。BDFフォントを開いて閲覧することができる。Webブラウザページを開いて、Webブラウザ上にBDFフォントをドラッグアンドドロップすれば一覧が表示される。

左下の「Export PNG」を選べば、画像にして保存することもできる。

bdf2bmp、bmp2bdf :

_bdf2bmp
_bmp2bdf

BDFフォントをbmp画像に、bmp画像をBDFフォントにできるコマンドラインツール。Windows上で動作する。

bdf2bmp06.zip、bmp2bdf02.zip を入手。解凍すると、bdf2bmp.exe や bmp2bdf.exe が得られる。

一旦 bmp にすることで、Adobe Photoshop や GIMP 等で開いて、ドット打ち感覚でフォント編集ができるから快適に作業できるはず。ということらしい。

BDFフォントの入手先 :

ついでに、BDFフォントの入手先についても、ググって辿り着いたページをメモしておく。

ちなみに、BDFフォントは、英数字部分(半角フォント)と日本語フォント(全角フォント)に分かれて配布されてる場合が多い模様。

_shinonome font family (東雲ビットマップフォント。12x12, 14x14, 16x16)
_12dot-width JIS X 0213 BDF font (蕨12, warabi12, 12x12)
_JISX0213 16x16 public fonts (JISX0213(第3,4水準漢字)用bdfフォント, jiskan16, 16x16, 14x14, 12x12)(WebArchive)
_X11fonts-14/font-jis-misc/font-jis-misc-1.0.3/ - Source Browser
_Index of /~yasuoka/ftp/fonts
_Index of /dist/fonts/BDF/JISX0213
_Debian Fonts Task Force / xfonts-jisx0213 - GitLab
_farsil/ibmfonts: IBM Fonts in BDF format
_Folder: font-adobe-75dpi | Debian Sources
_A very tiny, monospace, bitmap font (3x5 dot)
_uzkbwza/viii: a small bitmap font for coding (8x8 dot)
_M+ BITMAP FONTS | DOWNLOAD (10x10, 12x12 dot)

ライセンスが Public Domain か CC0 の英数字(半角)フォントが欲しいのだけど、検索の仕方が良くないのか、なかなか辿り着けず…。

M+フォントはOSDNで公開されてたけれど、そのOSDNは死んでしまったらしくてアクセスできなかった。mplus_bitmap_fonts-2.2.4.tar.gz というファイル名でググって入手するしかないっぽいなと…。いや、github のソレを入手すればいいのだろうか?

_MPLUS_FONTS/obsolete at master - coz-m/MPLUS_FONTS
_coz-m/MPLUS_FONTS: M+ FONTS
_Index of /Linux/gentoo/distfiles/94
_Index of /lookaside/pkgs/fonts-japanese/mplus_bitmap_fonts-2.2.4.tar.gz/a97a99acbee54976407dec828d03850c

githubから入手できる版はMac用のファイルも同梱されていた。*NIX界隈のサイトから入手した版にはそれらのファイルは入ってないので混乱しなくて済むかもしれない。

BDFフォント用エディタについて :

かつては Linux上で動作する以下のエディタがあったらしいのだけど。
  • xfed2
  • XmBDFEditor (xmbdfed)
  • gbdfed

_JISX0213 16x16 public fonts (WebArchive)
_XmBDFEditor Bitmap Font Editor (WebArchive)
_xmbdfed 4.7 - Download, Browsing & More | Fossies Archive
_andrewshadura/gbdfed: gbdfed - tentative history, do not expect it to not be rebased!

もはやソースすら入手しづらいツールも…。ただ、gbdfed だけは Ubuntu Linux 20.04 LTS、22.04 LTS でもパッケージがありそう。

_Ubuntu - jammy の gbdfed パッケージに関する詳細

余談 :

今現在、ゲーム制作等でフォントをわざわざ画像化したい場合、ttfフォントを使って画像化して、ソレを使う場合が多そうな気もする。どうしても BDFフォントを使いたいという場面は、まず無さそうな気も…。

とは言え、選択肢は多いほうがいいよなと…。Public Domain を謳ってるフォントがいくつかあるので、そういったフォントを選べばライセンス面で不安にならなくても済むし。めちゃくちゃ小さいフォントもあるし。

2023/11/03(金) [n年前の日記]

#1 [cg_tools] ビットマップフォント画像を作れるツールについてメモ

ttfフォントを元にして、ビットマップフォント画像を作れるツールについてメモ。

昨日はBDFフォント関係のツールを探していたけど、本来は以下のようなツールを使ってビットマップフォント画像を作るのが妥当なのだろうなと…。

環境はWindows10 x64 22H2。

どれもグリッド状に各文字を配置してくれるわけではない点に注意。テクスチャ画像の中に各文字をギチギチに詰めて、どこにどの文字があるかは別途テキストファイルやxmlファイルで出力してくれる。らしい。まだそこまで試してないけど…。

こういった、文字をギチギチに詰めて、別途テキストファイルで位置情報を示すフォーマットを、bmfontと呼んでいるらしい。

github上で、bmfont、または bitmap-font-generator というタグで探すと色々見つかる模様。github はタグをつける機能があったのか。知らなかった…。

_bmfont - GitHub Topics
_bitmap-font-generator - GitHub Topics

Hiero :

_Hiero - libGDX

Java製アプリ。runnable-hiero.jar を入手してダブルクリックすれば実行できる。動作には Javaランタイムのインストールが必要。

右側に効果一覧が表示されてるので、それぞれ選んで「Add」をクリックしていくと、文字色以外にも、縁取り(Outline)、影付き(Shadow)の見た目にできる。ただ、下のほうの padding値を増やさないと、影が途中で切れてしまったりした。また、各効果の順番を意識しないと、思ったような見た目にはならないようにも見えた。効果の順番は、「Up」ボタンをクリックすれば変更できる。

BMFontX :

_anyicomplex/bmfontx: Cross-platform bitmap font packing tool. Based on Hiero (https://github.com/libgdx/libgdx/wiki/Hiero)'s open source.

Java製アプリ。Hiero の fork版らしい。bmfontx-0.0.3.jar を入手してダブルクリックすれば実行できる。

ただ、自分の環境で動かしたら、動作が異様に重くて…。何故か途中で応答なしになってしまった…。しかも、githubのプロジェクトページはReadonlyになってるし。放棄されたプロジェクトっぽい…。何を変更したのかも分らないし、Hiero を使ったほうがいいかもしれない。

BMFont (Bitmap Font Generator) :

_BMFont - AngelCode.com

bmfont1.14a.zip と bmfont64_1.14b_beta.zip を入手。解凍すると、bmfont32.exe や bmfont64.exe があるので、ダブルクリックすれば実行できる。

縁取りはできるけど、それ以外はできないっぽい?

使い方は以下が参考になりそう。

_BMFont(Bitmap Font Generator) で NGUI 向けのビットマップフォントを作る方法 - 強火で進め
_BMFont(Bitmap Font Generator) での高さ設定(Size [px])の注意点 - 強火で進め

snowb-bmf (Bitmap Font Generator Online) :

_Bitmap Font Generator Online - SnowB Bitmap Font
_SilenceLeo/snowb-bmf: Bitmap Font Generator Online

Webブラウザ上で動作するアプリ。昔、Littera という、Adobe Flash で実装されたビットマップフォント画像生成サービスがあったのだけど、ソレを今現在のWebブラウザ技術で再現したものっぽい。

ShoeBox :

_ShoeBox

Adobe AIR製。

これはちょっと毛色が違うツールで、いきなりビットマップフォント画像を作れるわけではない。あらかじめ、画像編集ソフト(Adobe Photoshop、GIMP等)で、所定の並びのフォント画像を作っておいて、そのフォント画像をこのツールに渡してやることで、各文字を切り出して1つのテクスチャ画像にギチギチに詰めてくれる。自分が使い慣れた画像編集ソフトを使って、好きなようにフォントを化粧(?)してから、その後の文字の切り出しと配置だけを自動化してくれるあたり、なかなか現実的な処理内容のように思える。

しかし、Adobe AIR製というのが、今となっては…。いつまで使えるのやら…。

font2bitmap (Font To Bitmap Converter) :

_Font To Bitmap Converter by stmn
_stmn/font2bitmap: This tool allows you to convert fonts (ttf, otf, woff) into bitmap fonts (png) just in your browser.

Webブラウザ上で動作するアプリ。これはビットマップフォントをグリッド上に並べて画像化してくれる模様。

任意のフォントを指定するには、ローカル側で持っているフォントファイルをアップロードする必要がある。

#2 [cg_tools] ShoeBoxを試用

ゲーム制作時に必要になりそうな機能をまとめてある、ShoeBox というツールがある。Adobe AIR 製。

_ShoeBox

動かそうとして ShoeBox_3.6.5_public.air をダウンロードして実行してみたのだけど、Windows上でインストール済みのはずの Adobe AIR がエラーを出してしまって…。解決できないものか試行錯誤。

環境は Windows10 x64 22H2。

以下のページが参考になった。ありがたや。

_ShoeBoxを使用したビットマップフォントの作成方法とGodot Engineでの設定方法 | 2dgames.jp

Adobe AIRの最終版をインストール :

Adobe AIR は、Adobe が手放してしまって、samsung の子会社、HARMAN なる会社が権利を持ってる。

_Adobe、「AIR」のサポートと機能開発をサムスンの子会社に移管 - 窓の杜
_Adobe、「Adobe AIR」の技術や資産をHARMANに移管 - Impress Watch

以下のページからランタイムだけならダウンロードできるっぽい。

_Adobe AIR SDK from HARMAN

AIR Runtime 50.2.1.1 を入手。ファイル名は AdobeAIR.exe。実行して、インストール済みの Adobe AIR をアップデートした。

ちなみに、WebKit同梱の最終版は 33.1.744 らしい。今のうちに落として残しておいたほうがいいのかもしれない…。

ShoeBoxをインストール :

この状態で ShoeBox_3.6.5_public.air を実行したところ、インストール処理が先に進んでくれた。インストール先のフォルダを途中で指定する。

これでようやく動いてくれた…。

余談。AIRやFlashについて思うこと :

ポエムです。

Adobe AIR製のツールは、別の何かで書き換えないと怖いところがあるなと…。かつては Adobe Flash製のツールもいくつか存在していたけど、今ではもう動かせないわけで…。

_jsroads/Littera-bitmap-font-generator: Littera - bitmap font generator

Adobe AIR製のツールも、いずれそうなりそうな不安が…。

今になって思うと、Flash関係の流れは全く納得できないところがあるなと。その技術がなんとなく自然消滅していくなら分かるけど、全世界でよってたかって叩きまくって、明確な意思を持って殺していったあたりが、かなり異常な展開だった気がする。全世界規模でのイジメとでもいうか。

もっとも、これがオープンソースのプロジェクトだったら、必要性を感じた人達が引き継いで、しかしモチベが続かなくなって開発停滞、というありがちな流れぐらいにはなったのだろうけど。一企業が提供していた技術だから、ソースも見れないしで…。いやまあ、大半の場合、ソースが見れたからと言ってどうにかなるものでもないけど。

なんというか、一番最悪な形になった技術消失事例のように思える。Adobe Flash上で動いてた様々なソフトウェアが問答無用で実行不可能な状態にされてしまった。そのソフトウェアが有用かどうかの精査も一切無く、「お前はユダヤ人だから生きてる資格無し」ぐらいの勢いで皆殺し。人種差別、民族差別ならぬ、技術差別だろうか。あるいは、どこか宗教戦争らしさも感じるわけで…。やっぱり異常だと思う…。

そのくせ、Flashの代替技術が未だに無かったりするし。例えば2Dベクターデータをリアルタイムに表示してアニメーションさせる技術は普及してないわけで。いやまあ、一応、SVG表示が各ブラウザでサポートされてるし、ブラウザ上でSVG使ってアニメ再生してたデモページも過去には存在していたから、基礎技術は既に内包されてるし一部では活用してる事例もあるのだろうけど、しかし誰でもソレを使えるほどにはアレコレがまとまってないというか…。詳しい人しか使えない状態じゃないのかと。

昔は非プログラマーのアマチュアさん達が色んなFlashコンテンツを作って皆でワイワイ遊んでたけど、今はもう、そういうことできないよな…。いや、むしろあの時期が異常だったのだろうか…。もう二度と、あんな面白い時期は訪れないのかもしれないなあ…。と思ったけどそうでもないか。動画をアップしてワイワイやってるソレはあの感覚に近いか。単に場所が変わっただけなんだろうか。

只のポエムでした。

#3 [windows] Windows10がBSODになって困ってる

VMware Player をアップデートしようとしたらWindows10 x64 22H2がBSOD(ブルースクリーン)に。何度試してもBSODになるので、セーフモードで起動して、msiサーバ(サービス?)を有効にして、VMware Player をアンインストールしてから Windows10 を通常起動して、VMware Player 17.5.0 をインストールした。

自分のメインPCのWindows10は、管理者権限を要求してくるインストール作業/アンインストール作業をすると高い確率でBSODになることが分かってきたのだけど、何が原因なのやら…。セーフモードでアンインストール作業を行うとBSODにならないあたり、通常起動してる際の、何かしらのサービスが悪さをしてるのではないかと思うのだけど。

とりあえず、システムに食い込んでそうな、怪しそうなアプリを少しだけアンインストールしてみることにした。 MSI Afterburner と N&P Remote Mouse and Keyboard は、うっかりしてバージョンをメモしておくのを忘れた…。この手の検証ではバージョンの把握が大事なのに…。

Npcap は今まで 1.76 をインストールしてあった。ググっていたら、Npcap がBSODの原因になるというバグ報告があって、1.77 で修正したというやり取りがあったので、まさかコレでは、と思ったのだけど…。

_BSoD SYSTEM_SERVICE_EXCEPTION - Issue #679 - nmap/npcap

Npcap の現行版は 1.78 なので、Npcap をインストールしてない状態でしばらく様子を見てから、後で 1.78 をインストールしてみるつもり。もし、未インストール状態でもBSODになったら、原因は Npcap じゃないと分かるはず。

もっとも、日記を検索してみたら、Npcap をインストールした時期には既にBSODが発生する状態になってた気配もあって…。どうもコレが原因じゃなさそうな予感も…。

明らかにWindows10の状態がおかしいと感じたのは、 _2022/08/03頃。 PowerToys がアンインストールできなくて困った、とメモしてある。つまり、それ以前にインストールしたアプリが悪さをしている可能性が高いのだろうなと…。Npcap をインストールしたのは _2022/11/26 だから、やはりコレが原因じゃない可能性が濃厚…。

あふの設定ファイルが破損してしまった :

今までBSODになっても、目に見えた実害に遭遇してなかったのだけど、とうとう損害発生。普段使ってる二画面ファイラー、あふw の設定ファイル、afxw.ini、afxw.his の中身がおかしくなって、あふwが変な動作になってしまった。

外付けHDDにバックアップしていた2023/08/24頃の設定ファイルを発掘して、多少は以前の動作に戻せたけれど。こんなことがまた起きたら困る…。いい加減、BSODになる原因を突き止めないと…。参ったなあ…。

2023/11/04() [n年前の日記]

#1 [hsp] hsp3dishでスクリーンセーバを作れそうか試したけど無理っぽい

Windows10 x64 22H2 + HSP 3.7beta7 で、hsp3dish を使ってスクリーンセーバを作れそうなのか試していた。

結論を先に書くと、無理っぽい。

無理な理由 :

HSP には多数のサンプルが同梱されていて、sample\ssaver\arusave.hsp がスクリーンセーバ作成のサンプルになってる。そのサンプルでは、スクリーンセーバのフルスクリーン表示モード時に、以下の処理が書かれてる。
  • HSP製プログラム実行時にデフォルトで作られる表示ウインドウ(ウインドウID0)には、一切手を付けない。
  • ウインドウID2の表示ウインドウをフルスクリーン表示で新規に作成して、そちらに描画をしていく。
HSPの標準命令のみを使ってプログラムを作れば、複数の表示ウインドウを作ることも可能だから、そういうことができるわけだけど…。

しかし、hsp3dish を使う場合は、以下の制限がある。
  • 表示ウインドウは1つしか持てない。複数の表示ウインドウは作れない。
  • プログラム実行時に作られるウインドウID0の表示ウインドウだけが、描画可能なウインドウになる。

それを踏まえた上で。

hsp3dish を使ってスクリーンセーバを作るなら…。ウインドウID2の表示ウインドウを新規作成せずに、既に存在するウインドウID0をフルスクリーン表示にして、そこに描画していけばスクリーンセーバを作れるのではないかな、などと甘いことを考えていたのだけど…。

実際にやってみたら、そうは問屋が卸さなかった。見た目だけはそれらしくなったけど、マウスを動かしたりキーボードを叩いても終了してくれないプログラムになってしまった。これではスクリーンセーバにならないわけで…。

どういう仕組みになっているのか分からないけれど、HSPでスクリーンセーバを作る際、フルスクリーンモード時では、手付かずのウインドウID0と、ガンガン描画をしていくウインドウID2、この2つの表示ウインドウが存在してる状態じゃないといけないようだなと…。

では、hsp3dish ではなく、HGIMG4 ならどうだろう。HGIMG4 なら複数の表示ウインドウを作れたりしないか? 調べてみたけれど、サンプルを眺める限り、表示ウインドウを1つしか持てないのは hsp3dish と同じらしい。HGIMG4 は hsp3dish を拡張して作られたプラグインなので、hsp3dish と同じ制限を引き継ぐ模様。

ならば HGIMG3 ではどうかとサンプルを眺めてみたら、screen命令でもう1つの表示ウインドウを確保しているサンプルが見つかった。ひょっとすると HGIMG3 を使えばスクリーンセーバが作れるのでは、と期待しているところ。実験してみないと…。

ソース :

スクリーンセーバにはならなかったけれど、デモプログラムとしては動かせるので、一応ソースを置いておく。

_h3dshscr.hsp
    ; screensaver sample for hsp3dish.
    ; fork arusave.hsp
    ;
    ; This program does not work.
    ;
    ; hsp3dish を使ってスクリーンセーバが作れるか実験したが、失敗に終わった。
    ;
    ; Windows10 x64 22H2 + HSP 3.7 beta7
    ;
    ; 2023/11/04 by mieki256
    
    #include "hsp3dish.as"
    #include "d3m.hsp"
    
    ; 以下の行のコメントアウトを外すとスクリーンセーバとして実行ファイルを作成する
    ; #define SCREENSAVER_ENABLE
    
    #define TITLE_STR   "Screensaver sample for hsp3dish"
    #define VER_STR     "0.0.1"
    
    #packopt name "h3dshscr"
    
#ifdef SCREENSAVER_ENABLE
    #packopt type 2
#else
    #packopt type 0
#endif
    
    #packopt xsize  640     ; 設定画面横幅
    #packopt ysize  360     ; 設定画面縦幅

    #define TEX_FILE        "star.png"
    #define PREVIEWFILE     "preview.png"
    #pack TEX_FILE
    #pack PREVIEWFILE
    
    #define KB_ESC      $000080
    #define FRAMERATE   60
    
    fps_display_enable = 1
    
    ; ----------------------------------------
    ; parse command line option
    
    s = dir_cmdline         ; get command line option
    i = instr(s, 0, "/")    ; "/" の出現位置を検索
   
    if i = -1 {
        ; not option
#ifdef SCREENSAVER_ENABLE
        goto *config_mode
#else
        goto *fullscreen_mode
#endif
        ; goto *preview_mode
    }
    
    a = strmid(s, i, 2)     ; 2文字だけ取り出し
    
    if a == "/p" or a == "/P" : goto *preview_mode      ; プレビュー
    if a == "/s" or a == "/S" : goto *fullscreen_mode   ; フルスクリーン
    if a == "/c" or a == "/C" : goto *config_mode       ; コンフィグ
    
    ; コマンドラインがどれでもない時はエラー表示
    dialog "Unknown switch [" + s + "]"
    end

*config_mode
    ; 設定画面
    
    screen 0, 640, 360, 0
    gsel 0
    cls
    
    tt = "Config - " + TITLE_STR + " " + VER_STR
    title tt
    font "Tahoma", 24, 1
    
    redraw 0
    color 0, 0, 0
    
    pos 20, 20
    mes "Config - " + TITLE_STR
    
    pos 20, 50
    mes "Version : " + VER_STR
    
    pos 520, 300
    button "OK", *ssend
    
    redraw 1
    stop
    
*ssend
    end

*preview_mode
    ; プレビュー画面
    ; スクリーンセーバー選択時の、小さな画面内でのプレビューの処理。
    ; HSPのWindow ID0がプレビュー画面に合わせて小さくなっているので、
    ; ginfo_winx, ginfo_winy で画面サイズを取得後、その中に描画する。
    ; 経験上、単に画像を表示してstopしたほうが不具合が起きにくい。
    wdw_w = ginfo_winx
    wdw_h = ginfo_winy
    
    ; load preview image
    imgid = 3
    w = 152
    h = 112
    buffer imgid, w, h
    picload PREVIEWFILE
    iw = ginfo_winx
    ih = ginfo_winy
    
    ; draw
    gsel 0
    redraw 0
    cls 4
    gmode gmode_gdi, iw, ih
    gzoom wdw_w, wdw_h, imgid, 0, 0, iw, ih, 1
    redraw 1
    
    stop

; ----------------------------------------
*fullscreen_mode
    ; フルスクリーン描画処理
    
    ; get desktop size
    dispw = ginfo_dispx
    disph = ginfo_dispy
    
    ; initialize window without frame
    ; bgscr WindowID, width, height, mode, x, y
    bgscr 0, dispw, disph, 0, 0, 0, dispw, disph
    
    ; load image
    imgid = 3
    celload TEX_FILE, imgid

    ; split image. set orign
    celdiv imgid, 512, 512, 256, 256

    ; Set the buffer to draw from. Windows ID 0
    gsel 0, 1
    
    ; Set screen clear color to be performed when redraw 0 is called.
    ; 0 or 1, color ($000000 - $ffffff)
    ; setcls CLSMODE_SOLID, $4080c0
    setcls CLSMODE_SOLID, $000000
    
    font "Tahoma", 24, 1
    
    randomize
    
    star_size = 0.75
    dist = 150.0        ; screen distabce
    area_z = 5000
    zmax = double(area_z) + dist
    
    ; rnd() only accepts 1 to 32768.
    ; adjust the value to stay within that range.
    area_m = 4.0
    area_w = int((double(dispw) * zmax) / dist / area_m)
    area_h = int((double(disph) * zmax) / dist / area_m)
    
    objmax = 512
    
    ; initialize stars work
    ddim posx, objmax       ; position x
    ddim posy, objmax       ; position y
    ddim posz, objmax       ; position z
    dim px, objmax          ; display position x
    dim py, objmax          ; display position y
    ddim scalev, objmax     ; scale
    dim alpha, obj_max      ; alpha value
    dim patidx, obj_max     ; pattern index
    repeat objmax
        gosub *get_newpos_xy
        posx(cnt) = nx
        posy(cnt) = ny
        patidx(cnt) = idx
        posz(cnt) = double(rnd(area_z)) + dist
        px(cnt) = 0
        py(cnt) = 0
        scale(cnt) = 0.0
        alpha(cnt) = 0
    loop
    
    time_start = d3timer()
    endfg = 0
    
; ----------------------------------------
*mainloop
    while endfg == 0
        tm = d3timer() - time_start
        fps = d3getfps()                ; get FPS
        
#ifndef SCREENSAVER_ENABLE
        ; ESC key to exit
        stick key, 0
        if key & KB_ESC : endfg = 1
#endif
        
        ; move stars
        spd = 40.0
        repeat objmax
            posz(cnt) -= spd
            if posz(cnt) < (dist / 2.0) {
                posz(cnt) += zmax
                gosub *get_newpos_xy
                posx(cnt) = nx
                posy(cnt) = ny
                patidx(cnt) = idx
            }
            
            ; get display x, y position
            px(cnt) = int(posx(cnt) * dist / posz(cnt)) + (dispw / 2)
            py(cnt) = int(posy(cnt) * dist / posz(cnt)) + (disph / 2)
            scalev(cnt) = star_size * dist / posz(cnt)
            
            size = int(512.0 * scalev(cnt))
            x0 = px(cnt) - (size / 2)
            y0 = py(cnt) - (size / 2)
            x1 = px(cnt) + (size / 2)
            y1 = py(cnt) + (size / 2)
            if x1 < 0 or x0 > dispw or y1 < 0 or y0 > disph {
                ; out of display area. position reset
                posz(cnt) += zmax
                gosub *get_newpos_xy
                posx(cnt) = nx
                posy(cnt) = ny
                patidx(cnt) = idx
                px(cnt) = int(posx(cnt) * dist / posz(cnt)) + (dispw / 2)
                py(cnt) = int(posy(cnt) * dist / posz(cnt)) + (disph / 2)
                scalev(cnt) = star_size * dist / posz(cnt)
            }
            
            ; get alpha value
            az = double(area_z) * 0.7
            if posz(cnt) < az {
                alpha(cnt) = 255
            } else {
                ; fade in
                z = posz(cnt)
                if z > zmax : z = zmax
                v0 = z - az
                v1 = zmax - az
                alpha(cnt) = int(255.0 - (255.0 * v0 / v1))
            }
        loop
        
        ; ----------------------------------------
        ; draw start
        redraw 0
        
        ; clear screen
        ; color 64, 128, 192
        ; boxf
        
        ; draw stars
        repeat objmax
            rot = 0.0
            idx = 0
            
            ; draw image by celput
            gmode gmode_add, 512, 512, alpha(cnt)
            pos px(cnt), py(cnt)
            rot = 0.0
            idx = patidx(cnt)
            celput imgid, idx, scalev(cnt), scalev(cnt), rot
        loop

        ; draw text
        if fps_display_enable {
            gmode gmode_rgb0
            color 255, 255, 255
            pos 10, 10
            mes strf("[%dx%d] %d/%dFPS", dispw, disph, fps, FRAMERATE)
        }
        
        ; draw end. screen refersh
        redraw 1
        
        await (1000 / FRAMERATE)
        ; await 12
    wend
    
*jobend:
    end
    
*get_newpos_xy
    nx = double(rnd(area_w) - (area_w / 2)) * area_m
    ny = double(rnd(area_h) - (area_h / 2)) * area_m
    idx = rnd(4)
    return

使用画像は以下。

_preview.png
_star.png


実行画面は以下。静止画ではさっぱり伝わらないけれど、星が奥から飛んでくるアレ。昔のWindowsに入ってた「宇宙飛行」スクリーンセーバみたいなソレ。

h3dshscr_ss.png

#2 [anime][neta] 主人公がジョブチェンジするロボットアニメはどうだろう

妄想メモ。

BS11で放送されている「ガンダムSEED」を眺めていたら、コーディネーター(遺伝子操作で作られためっちゃ頭のいい人間)の主人公がガンダムのOSを調整したことで、コーディネーターだけではなくナチュラル(遺伝子操作されてない頭の悪い人間)もそこそこ操縦できるガンダムが出来ちゃいました、というシーンが出てきた。

そのシーンを見ていて、なんとなく妄想。ひょっとしたら、あの主人公、途中でパイロットなんか辞めさせて、その後はずっとMSのOSの改良に専念させたら、軍全体の戦力が著しく増強されたのではないか、そのほうが効率良く使えたのではないかなと思えてきた。いやまあ、フィクション作品に効率がどうとか言い出してもアレなんだけど。ただ、ハードウェアは変えてないのに、ソフトウェアを変えただけで戦力増強というのは、それはそれで夢がある展開のような気もする。…ところが、その夢のOS、実はとんでもないものが仕込まれていて…って方向で話を転がしたら 「パトレイバー」になっちゃうか。

さておき。上記のような展開になるとしたら、作品としては「パイロット編」と「開発者編」で構成されることになるだろうなと…。主人公のジョブチェンジで構成されるガンダムシリーズ、もしくはロボットアニメって新規性があったりしないだろうか。

そういえば、韓国ドラマ「チャングム」も、前半は「料理人編」、後半は「医者編」で構成されてたっけ。いや、考えてみたら、NHKの朝ドラでもそういう構成はたまにある気もする。途中から、当初目指していた職業とは別の方向に行くヒロインという設定は、それなりにあったような…。であれば、ロボットアニメの類でソレをやってもおかしくはないよな…。

などと妄想していたのだけど。考えてみたら「ガンダムAGE」が結構近いのかもしれないと思えてきた。アレは世代が変わって主人公も変わるという構成だけど、初代のフリット爺さん(?)にだけ注目すると、「パイロット編」「司令官編」「老兵編」に分けられそうでもあるなと…。

あるいは、「グレンラガン」もそうかもしれない。「最前線の一兵士編」と「指導者編」になってた気もする。

ということで、主人公のジョブチェンジで各編に分かれる構成というのは、探せば結構あるのかもしれないと思えてきた。新規性は特にないなと…。

でもまあ、「主人公がジョブチェンジすることで各章が分かれる構成を考えてみましょう。さて、主人公は一体どんな職種/ポジションを経由していくでしょう?」というお題もアリかも。スポーツアニメなら「選手編」「監督編」。アイドルアニメなら「アイドル編」「事務所社長編」。色々思いつきそう。「全編通して主人公は同じ職業でなくてもよい」という点を頭の片隅に置いておくだけも何か違ってきそうな気もする…。

妄想メモです。オチはないです。

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

#1 [hsp] HGIMG3について再勉強中

Windows10 x64 22H2 + HSP 3.7 beta7 + HGIMG3 を使って、スクリーンセーバが作れそうか実験中。

HSPでスクリーンセーバを作るためには、ウインドウ ID=2 の表示ウインドウを新規に作成できないといけない。hsp3dish や HGIMG4 ではそれができないので、HGIMG3 を使って実験しているところ。

HGIMG3 を使って、表示ウインドウID0 と ID2 の2つを持てるか試してみたところ、これは上手くいった。そのまま記述を追加して、スクリーンセーバの処理が書けるか試したけれど、どうやらこれも見た感じでは動いてくれている気がする。Windwosのイベントビューアに変なエラーが残ったりもしない。

ということで、HGIMG3を使えば、おそらくスクリーンセーバを作ることができそうな気配がする。

せっかくだから .ini ファイルを読み書きして、スクリーンセーバ設定の読み書きができるように処理を追加中。

2023/11/06(月) [n年前の日記]

#1 [hsp] HGIMG3を使ってスクリーンセーバを作成してみた

Windows10 x64 22H2 + HSP 3.7 beta7 + HGIMG3 を使って、スクリーンセーバが作れそうか実験中。

一応、ここまでの経緯について再度メモ。
そんなわけで、HGIMG3 を使ってもスクリーンセーバを作れた、ような気がする。たぶん。github にサンプルを ―― 「宇宙飛行」スクリーンセーバと似た感じの見た目になってるスクリーンセーバをアップロードしてみた。

_mieki256/ssstarshsp: Screensaver like ssstars.scr created by HGIMG3.


余談。かなり昔にHSPで作ったスクリーンセーバは、プレビュー画面を終了する度に、Windowsイベントビューアにエラーを残してしまう状態になってしまったので、今回はそういう不具合が発生してないか気にしながら動作確認しているのだけど、今のところWindowsイベントビューアに変な記録は残っていない。スクリーンセーバとしては正常に動作している状態なのではないかなと。たぶん。そうであってほしい…。

別サンプル :

せっかくだから、ソースをもっとシンプルにしたサンプルも載せてみる。1つのボールが画面の中を跳ね回るだけの、いつもの処理にしてみた。

_sshgimg3.hsp
    ; screensaver sample for HGIMG3. fork arusave.hsp
    ;
    ; HSP + HGIMG3を使ってスクリーンセーバを作れるか実験
    ;
    ; Windows10 x64 22H2 + HSP 3.7 beta7, 2023/11/06 by mieki256
    
    #include "hgimg3.as"
    #include "d3m.hsp"
    
    ; 以下の行をコメントアウトすればexeになる
    ;#define SCREENSAVER_ENABLE
    
    #define TITLESTR    "Screensaver for HGIMG3"
    #define VERSTR      "0.0.1"
    #packopt name       "sshgimg3"
   
#ifdef SCREENSAVER_ENABLE
    #packopt type 2         ; generate ".scr"
#else
    #packopt type 0         ; generate ".exe"
#endif
    
    #packopt xsize  640     ; 設定画面横幅
    #packopt ysize  320     ; 設定画面縦幅

    #define TEXFILE         "ball.png"
    #define PREVIEWFILE     "preview.png"
    #define FONTFILE        "font.png"
    
    #pack   TEXFILE
    #pack   PREVIEWFILE
    #pack   FONTFILE
    
    #define KB_ESC      $000080
    
    #define NWDW_ID     2
    
    ; paramater
    framerate = 60
    fps_disp_enable = 1
    
    ; ----------------------------------------
    ; コマンドラインオプションを解析
    
    s = dir_cmdline         ; コマンドラインオプション文字列を取得
    i = instr(s, 0, "/")    ; "/" の出現位置を検索
    if i == -1 {
        ; オプション無し
#ifdef SCREENSAVER_ENABLE
        goto *config_mode
#else
        goto *fullscreen_mode
#endif
        ; goto *preview_mode
    }
    
    a = strmid(s, i, 2)     ; 2文字だけ取り出し
    if a == "/p" or a == "/P" : goto *preview_mode      ; プレビュー
    if a == "/s" or a == "/S" : goto *fullscreen_mode   ; フルスクリーン
    if a == "/c" or a == "/C" : goto *config_mode       ; コンフィグ
    
    ; コマンドラインがどれでもない時はエラー表示
    dialog "Unknown switch [" + s + "]"
    end

*config_mode
    ; 設定画面モード
    goto *display_config_dialog_only
    
*preview_mode
    ; プレビュー画面モード
    goto *display_preview

; ----------------------------------------
*fullscreen_mode
    ; フルスクリーン描画処理
    
    ; デスクトップサイズを取得
    dispw = ginfo_dispx
    disph = ginfo_dispy
    
    ; ウインドウID=2で枠無しウインドウを新規作成
    ; これができないとHSPでスクリーンセーバを作れない
    ; bgscr WindowID, width, height, mode, x, y, width, height
    bgscr NWDW_ID, dispw, disph, 0, 0, 0, dispw, disph
    
    ; HGIMG3初期化
    hgini
    
    ; ビットマップフォントを設定。フォント画像を読み込み
    setfont 20, 20, 18, 1   ; 20x20 font
    texload FONTFILE
    
    ; 画像を読み込み
    texload2 TEXFILE
    texid = stat        ; get texture ID
    texw = 128
    texh = 128
    
    gsel NWDW_ID, 1
    
    clscolor $000000    ; set clear color
    
    ; clsblur 24        ; set blur. 0 - 255
    
    randomize
    
    ; ワーク初期化
    x = dispw / 2
    y = disph / 2
    dy = double(disph) / double(framerate)
    dx = dy
    
    time_start = d3timer()          ; get time
    
    endfg = 0
    
; ----------------------------------------
*mainloop
    while endfg == 0
        tm = d3timer() - time_start
        fps = d3getfps()            ; get FPS
        
#ifndef SCREENSAVER_ENABLE
        ; ESC key to exit
        stick key, 0
        if key & KB_ESC : endfg = 1
#endif
        
        ; move ball
        x += dx
        y += dy
        
        wh = texw / 2
        hh = texh / 2
        if (x - wh) < 0 or (x + wh) > dispw : dx *= -1
        if (y - hh) < 0 or (y + hh) > disph : dy *= -1
        
        ; ----------------------------------------
        ; draw start
        hgdraw
        
        ; clear screen
        ; color 64, 128, 192
        ; boxf
        
        ; draw ball
        src_w = texw
        src_h = texh
        dst_w = texw
        dst_h = texh
        rot = 0.0
        
        gmode gmode_rgb0, texw, texh
        pos x, y
        hgrotate texid, src_w, src_h, rot, dst_w, dst_h

        ; draw text
        if fps_disp_enable {
            gmode gmode_rgb0
            fprt strf("[%dx%d] %d/%dFPS", dispw, disph, fps, framerate), 10, 10
        }
        
        ; draw end. screen refersh. wait
        t = (1000 / framerate) - 1
        if t <= 0 : t = 1
        hgsync t
    wend            ; end main loop
    
*jobend:
    end
    
; ----------------------------------------
; プレビュー画面表示
; 「スクリーンセーバの変更」ウインドウ内で表示されるプレビュー処理。
; HSPのWindow ID0がプレビュー画面に合わせて小さくなっているので、
; ginfo_winx, ginfo_winy で画面サイズを取得後、その中に描画する。
;
; 経験上、単に画像を表示してstopしたほうが不具合が起きにくい。
; ここでアニメーションさせると、プログラム終了時に、
; Windowsイベントビューアにエラーが残る状態になったりする。
;
; ここではHGIMG3の描画機能を使わず、
; HSP標準の描画機能を使ってレイアウトしている。

*display_preview
    
    ; get preview window size
    wdw_w = ginfo_winx
    wdw_h = ginfo_winy
    
    ; load image
    imgid = 3
    w = 152
    h = 112
    buffer imgid, w, h      ; reserve image buffer
    picload PREVIEWFILE     ; load image file
    iw = ginfo_winx         ; get image size
    ih = ginfo_winy
    
    ; draw
    gsel 0
    redraw 0    ; draw start
    cls 4
    
    ; 画像をウインドウ全体に引き延ばして描画
    gmode gmode_gdi, iw, ih
    gzoom wdw_w, wdw_h, imgid, 0, 0, iw, ih, 1
    
    redraw 1    ; draw end. Refresh
    
    stop

; ----------------------------------------
; 設定画面を描画
; 本来は動作パラメータを設定できるウインドウになるはず。
; 今回は、プログラム名、バージョン、終了のためのOKボタンを表示しかしない。
;
; ここではHGIMG3の描画機能を使わず、
; HSP標準の描画機能を使ってレイアウトしている。

*display_config_dialog_only
    
    screen 0, 640, 320, 0           ; Reset window ID=0
    
    title TITLESTR + " " + VERSTR   ; set window title
    
    gsel 0, 1                       ; select window
    cls                             ; clear window
    font "Tahoma", 18, 1            ; set font kind, font size, bold
    
    redraw 0                        ; draw start
    
    gmode gmode_rgb0
    color 0, 0, 0
    pos 20, 20
    mes "Config - " + TITLESTR
    pos 20, 50
    mes "Version : " + VERSTR
    
    pos 520, 260
    button "OK", *config_end
    
    redraw 1                        ; draw end. refresh
    
    await 15
    stop
    
*config_end
    end

使用画像は以下。

_ball.png
_font.png
_preview.png


動かすと以下のような感じになる。この手のソレでよく見かける処理。

#2 [tv] 「X年後の関係者たち あのムーブメントの舞台裏 #53 山崎貴と日本VFX」を視聴

BS-TBSで放送されてる番組を TVer で視聴。日本の映画/VFX監督、山崎貴監督をゲストに迎えて、日本のVFXについて語ってもらう回。

山崎監督が語っていた、ハリウッドと日本のVFXはトライアンドエラーの回数が一桁違うという話が興味深かった。ハリウッドは1カットにつき200回以上トライアンドエラーができる予算を最初から組むけれど、日本はせいぜい10〜15回できたらマシなほう、だそうで…。そりゃ最終的に出来上がる映像のクオリティが違ってくるわなと…。何故そんなに予算が違うのかと言えば市場規模の違い故だそうで、日本の映画は国内だけで元が取れれば良しと考えるから、最初からそれに見合った予算しか用意しない、と…。国内市場が中途半端(?)に成立していることは幸せなことなのか、それとも不幸なことなのか…。なかなか難しいものだなと…。

昨今出てきたAIがクリエイティブ面に与える影響についても多少語っていて、そのあたりも興味深かった。監督さん曰く、既存のアイデアの組み合わせを考えていくことがクリエイティブとされていたし、それは人間にしかできない行為と今まで思われていたけれど、実はAIのほうがそのあたりは得意なのだと分かってきて、さてどうしたものか、今はまだ仕事に使えないレベルだけど、この先どうなるか…。みたいな話で。このあたり、当初は使い物にならなかったCG技術がモリモリと力をつけて進歩して、やれる範囲を広げていった、その展開/光景をずっと目の当たりにしてきた監督さんだからこそ、AIの将来についても容易に想像できる面がありそうだなと…。

2023/11/07(火) [n年前の日記]

#1 [nitijyou] 体調が悪い

左胸のあたりに痛みがあって、どうも調子が…。早く寝ることにする。

2023/11/08(水) [n年前の日記]

#1 [anime] 「100カメ アニメ「進撃の巨人」最終話 トップ声優たちのアフレコに完全密着!」を視聴

NHKで放送されていた番組を録画して視聴。様々な業界の現場に100台のカメラを設置して撮影していく番組。今回はアニメ版進撃の巨人最終話のアフレコの様子を取材したということらしい。

音響監督さんの妙な(?)注文に次々に応えていく声優さん達の凄さを再認識。完全に特殊能力だよなあ…。もちろん日頃から何度も何度も練習して、要求されたら即座に出せる状態に鍛え上げつつ収録現場に挑んでいるはずで。後天的な努力無しには獲得できない能力…。

#2 [nitijyou] 床下の水が大変なことになってた

昨日の午前中、かなりの豪雨が降ったので、これは床下にも水が溜まってるんじゃないかと不安になって朝食後に確認してみた。

ウチは床下に水が溜まり易くて。ある時期に床下を工事して、水が穴? 堀? に溜まるようにしてあるので、大体1ヶ月前後の間隔で床下をチェックして、小さいポンプで水を汲み上げて捨てている。

普段は焼酎用ペットボトル(4L)で1.5〜1.8本分ぐらい捨てれば済むのだけど、今回は桁違いの水量。焼酎用ペットボトルで、51本分…。新記録なんてものじゃない…。水を溜める穴に周囲からチョロチョロと水が流れ込んでくる状態なので、1本分を汲んで捨てに行って戻ってくると、また1本分溜まってる…。3時間以上、ひたすら水汲み作業をする羽目に…。

元々、「こんなところに穴を配置して、排水は一体どうするつもりなのか」と自分は疑問を呈していたのだけど。ホースを床下に這わせて外に排水する予定と当時の親父さんお袋さんが言っていて、だったらまあいいか、と思っていたらいつのまにかその話が無くなっていて…。なんでこんな作業を自分がやることになってるんだか…。その位置はマズいのではないかと言ってた人間がやらされてるのはおかしい…。

#3 [nitijyou] メダカを買ってきた

ホーマック(DCM須賀川店? 店名が変わったんだっけ?)で、メダカ(めだか)を6匹購入。1匹税込52円だった。

家の周りに置いてある水瓶3つに、それぞれ2匹ずつ入れておいた。どのくらい生きていてくれそうか、そこはちょっと分からんけど…。とりあえず、ボウフラの類を食べてくれないものかなと…。

2023/11/09(木) [n年前の日記]

#1 [hsp] HGIMG3で仮想画面を作れるのかどうか調べてる

Windows10 x64 22H2 + HSP 3.7 beta7 で、HGIMG3 を使った際に、仮想画面が作れるのかどうかを調べているところ。小さい仮想画面に HGIMG3 で描画して、それをデスクトップサイズの大きな表示ウインドウに拡大描画する、といったことをしたい。

ただ、調べた範囲では、そういうことは無理っぽい気配がしてきた…。

一応、 _sample\hgimg3\settex.hsp が、少し似ているサンプルに見えなくもない。以下のような処理をしているっぽい。
  1. メイン表示ウインドウ(ID=0)とは異なるサブ表示ウインドウ(ID=1)を新規作成
  2. そのサブ表示ウインドウ(ID=1)に文字列を描画
  3. そのサブ表示ウインドウをテクスチャとして登録
  4. そのテクスチャを HGIMG3 でメイン表示ウインドウ(ID=0)に拡大描画

ただ、この settex.hsp というサンプルは、テクスチャ部分をHSPの標準機能で描画しているようで…。HGIMG3 で描画してるのは、テクスチャをメイン表示ウインドウに拡大描画するところだけ…。

テクスチャ部分も HGIMG3 で描画できないかと、settex.hsp を改造しながら動作確認してみたけれど、どうもダメっぽい。イメージバッファに描画してほしいのに、表示ウインドウのほうに描画されているように見える…。

このあたり、おそらく、HGIMG3 を使って描画できるウインドウは1つだけで、複数のウインドウ、もしくは複数のイメージバッファに HGIMG3 で描画するのは無理。ということじゃないのかなと。

そもそも、HSP が buffer命令で確保したイメージバッファは、メインメモリ上に置かれるイメージバッファであって…。HGIMG3 が使っている DirectX は GPUが管理してるVRAM上に描画処理をしているのだろうから、buffer で確保したイメージバッファに対して描画せよと HGIMG3 に指示を出してみても無視されて、その時たまたま描画先になっている表示ウインドウ(VRAM上)に描画されてしまうような気もする。

HGIMG4なら一部実現できる :

これが HGIMG4 なら仮想画面を作って描画して、といったことができるっぽい。 _sample\hgimg4\buffer.hsp というサンプルで、以下の処理をしている。
  1. 小さいイメージバッファ(ID=1)を新規作成
  2. その小さいイメージバッファ(ID=1)に HGIMG4 (hsp3dish) を使って描画
  3. そのイメージバッファの内容をメインの表示ウインドウ(ID=0)に拡大描画

しかし、HGIMG4 (hsp3dish) は表示ウインドウを1つしか持てないわけで…。
  • 複数の表示ウインドウを持てるけど、描画先は1つのウインドウに限られてしまう HGIMG3。
  • 複数のイメージバッファに描画できるけど、表示ウインドウは1つに限定されてしまう HGIMG4 (hsp3dish)。
なかなか難しい。

#2 [nitijyou] ホースだかチューブだかを買ってきた

ホーマックで、内径8mm、外径10mmの、透明タイプのホースだかチューブだかを6m分購入。1mで税抜き140円だった気がする。税込924円。

今までは、床下の水汲みをする際に、焼酎用ペットボトル(4L) x 2本に水を入れて、一々玄関まで持っていて水を捨てていたのだけど、その行き来がシンドイ。先日は51本分も運んだわけで…。こんな馬鹿げた作業を何度も何度もやってられるか。そこで、ポンプの排水ホースを延長して、直接、縁側に排水できないかと考え始めた。

本来なら床下にホースを這わせたいけれど、床下に潜って移動するのはスペース的に無理っぽいので、それについては諦めることにした。もはや、茶の間の畳の上にホースがそのまま置いてある状態でも構わない。作業が済んだらホースを丸めて床下に入れておく、みたいな感じではどうか。

ただ、ポンプの排水ホースと、今回買ってきたホースが繋げられるかどうか…。先日、ノギスで測った際は、内径8mmに見えたのだけど…。一応、内径8mmのホース同士を繋ぐプラスチック製のコネクタ(税込217円)も買ってきたので、すんなり差さってくれたら助かるのだけど、さてはてどうなることやら。

2023/11/10(金) [n年前の日記]

#1 [nitijyou] ホースをポンプに繋いでみた

昨日ホーマックで買ってきた、内径8mm、外径10mm、6mのチューブだかホースだかを、床下のポンプに繋いでみた。内径8mm用のコネクタも買ってきたので、ソレを使って接続。ホースは、コネクタに中途半端にしか差さらなかったけど、自己融着テープで何回かグルグル巻いたので、水漏れせずに済みそう。

ホースを茶の間の畳の上で這わせていって縁側まで伸ばしてみた。ポンプを動かしてみたところ、一応水を送り出してくれた。さすがに6mも長くなると、抵抗がかなり増えたのか、出る水量は少なくなったけど…。それでも一応動いてくれたので、汲み出した水を入れたペットボトルを一々玄関まで運ばなくて済む…。

2023/11/11() [n年前の日記]

#1 [hsp] HGIMG3のhgcaptureについて調べてる

Windows10 x64 22H2 + HSP 3.7 beta7 で、仮想画面相当に HGIMG3 で描画して、その結果をメイン表示ウインドウに持ってこれないか実験中。

hgcapture なる命令を使えば、HGIMG3 で描画した結果を、別のバッファだかウインドウだかに持っていくことができるらしいと知ったのだけど。hgdraw、hgsync、hgcapture、redraw 0, redraw 1、それぞれをどういう順番で呼べばいいのかがよく分からなくて…。画面(表示ウインドウ)が真っ白のまま…。おかしいなあ…。

2023/11/12() [n年前の日記]

#1 [hsp] HGIMG3のhgcaptureについて調べてる。その2

Windows10 x64 22H2 + HSP 3.7 beta7 で、仮想画面相当に HGIMG3 で描画して、その結果をメイン表示ウインドウに持ってこれないか実験中。

たぶんできたような気がする。ただ、ちと問題はあるけれど、それについては後述。

要するに以下のような仕組みにすれば、それらしくなるのかなと。

07_hgcapture_02_ss.png

ソース :

_07_hgcapture_02.hsp
    ; hgcapture使用サンプルその2
    ; 表示ウインドウを2つ新規作成して、片方を仮想画面相当、片方をメイン表示にする
    
    #include "hgimg3.as"
    #include "d3m.hsp"
    
    ; 以下の行をコメントアウトするとウインドウ表示になる
    ;#define FULLSCR
    
    #packopt name   "07_hgcapture_02"   ; file name
    #packopt type   0                   ; generate ".exe"

    #define TEXFILE     "chara.png"
    #pack   TEXFILE
    
    #define KB_ESC  128
    #define KB_LEFT     $00001
    #define KB_UP       $00002
    #define KB_RIGHT    $00004
    #define KB_DOWN     $00008
    #define KB_CURSOR   (KB_LEFT | KB_UP | KB_RIGHT | KB_DOWN)
    
    framerate = 60
    
    title "Screen 0"
    
    ; メイン表示ウインドウを確保。HSPの標準描画機能で描画していく
    dispid = 2
    
#ifdef FULLSCR
    ; get desktop size
    dispw = ginfo_dispx
    disph = ginfo_dispy
    bgscr dispid, dispw, disph, 0, 0, 0, dispw, disph
#else
    dispw = 1280
    disph = 720
    screen dispid, dispw, disph, 0
    title "Screen " + dispid
#endif
    
    ; hgcapture用バッファを確保
    tbufid = 6
    vscrw = 512
    vscrh = 288
    buffer tbufid, vscrw, vscrh
    
    ; 仮想画面相当の表示ウインドウを確保。HGIMG3で描画していく
    vscrid = 5
    ; modevalue = screen_hide
    modevalue = 0
    screen vscrid, vscrw, vscrh, modevalue
    title "Screen " + vscrid
    
    hgini
    
    ; load texture
    texload2 TEXFILE
    texid = stat            ; get texture ID
    texw = 16
    texh = 16
    
    clscolor $4080c0        ; set clear color
    
    count = 0
    x = (vscrw / 2)
    y = (vscrh / 2)
    
    time_start = d3timer()
    
*mainloop
    repeat
        ; get FPS
        tm = d3timer() - time_start
        fps = d3getfps()
        
        ; ESC key to exit
        stick k, KB_CURSOR
        if k & KB_ESC : break
        
        ; move character
        spd = 3
        if k & KB_LEFT : x -= spd
        if k & KB_RIGHT : x += spd
        if k & KB_UP : y -= spd
        if k & KB_DOWN : y += spd
        
        hgdraw
        
        ; draw images (HGIMG3)
        gmode gmode_rgb0, texw, texh
        pos x, y
        src_x = ((count / 16) \ 2) * texw
        src_y = 0
        rot = 0.0
        scale = 3
        dst_w = texw * scale
        dst_h = texh * scale
        hgrotate texid, src_x, src_y, rot, dst_w, dst_h

        ; HGIMG3 の描画結果をキャプチャしてbuffer(ID=tbufid)にコピー
        ; 右端と下端に数ドット黒部分が出るのはバグらしい
        gsel tbufid
        hgcapture
        
        ; メイン表示ウインドウにHGIMG3の描画結果を描画していく
        gsel dispid
        redraw 0
        
        ; zoom copy tbufid -> dispid (HSP標準描画機能)
        if 1 {
            gmode gmode_gdi
            pos 0, 0
            gzoom dispw, disph, tbufid, 0, 0, vscrw, vscrh, 1
        } else {
            gmode gmode_gdi, vscrw, vscrh
            pos (dispw / 2), (disph / 2)
            grotate tbufid, 0, 0, 0.0, dispw, disph
        }
        
        ; draw text (HSP標準描画機能)
        if 1 {
            font "Tahoma", 20, 1, 2
            objcolor 255, 255, 255
            color 16, 16, 16
            pos 16, 16
            mes strf("[%dx%d] %d FPS", vscrw, vscrh, fps), 4
        }
        
        redraw 1
        
        t = (1000 / framerate) - 1
        if t <= 0 : t = 1
        hgsync t
        
        count++
    loop
    
*mainloop_end
    end

使用画像は以下。

_chara.png

問題点 :

問題点としては…。処理が遅い…。そのせいか、動きもガクガクしてしまう…。

前述のソースでは違いが分からないかもしれないけれど、以下に示すような描画面積がそれなりに大きい処理の場合、明らかに遅くなる。

_07_hgcapture.hsp
_tex.png


仮想画面相当を経由させずに直接描画すれば60FPSが出る処理内容でも、仮想画面を経由させると60FPSが出なくなったりする。一旦仮想画面を経由することで、描画面積はかなり少なくなって、処理時間が短くなるのではないかと予想していたのだけど、実際には真逆の結果に ―― 速くなるどころか、むしろ遅くなる状態になってしまった。

実際に測定したわけではないから、たしかなことは言えないけれど、どうも hgcapture が遅いのではないかという気がしている。関連情報を眺めると、VRAM からメインメモリに内容をコピーしてくる関係でどうしても遅くなる、と言及されているようだし…。

#2 [nitijyou] 選挙に行ってきた

福島県議会議員一般選挙とやらで、近所の下宿公会堂まで行って投票してきた。電動自転車で10:30頃に行ったような気がする。今回のこの地域の立候補者は4人。

傘を新調 :

帰りに、ホームセンターサンデーに寄って、新しい傘を購入。70cmと書いてある。色は深緑。税抜970円。

今まで持っていた自分用の傘は、いつのまにか骨組みがボキボキに折れていて。親父さんがたまに使ってたらしいのだけど、その際壊れてしまったらしい。そんなわけで、新しく購入。

今まで使っていた傘はかなり鮮やかな緑だったけど、今回購入したのは黒に近い緑で…。ダサい。もっと原色に近い色の傘が欲しいけど、ホームセンターではそんなの売ってないわけで…。ホーマックにも寄って探したけれど、長さが70cmぐらいの商品は置いてなかったわけで…。ひょっとして、ファッションセンターしまむらとかそういうところを回って探したほうが良かったのだろうか。失敗したかも。

2023/11/13(月) [n年前の日記]

#1 [hsp] hgcapture2を試用

Windows10 x64 22H2 + HSP 3.7 beta7 で、仮想画面相当に HGIMG3 で描画して、その結果をメイン表示ウインドウに持ってこれないか実験中。

hgcapture という命令を使うことで、HGIMG3 で描画した結果を、HSP標準のイメージバッファに持ってくることができると分かったものの、 hgcapture の処理時間が遅いのではないかという不安があって。

関連情報をググっていたら、hgcapture2 という追加機能を目にした。

_hgimg3のhgcapture命令の速度使い勝手を改良したhgcapture2を追加するモジュール - HSPTV!掲示板
_HGIMG3で描画した画面を、別のウィンドウにコピーする時の挙動。 - HSPTV!掲示板
_HSP標準命令とHGIMG3同時使用可能ですか? - HSPTV!掲示板

上記の書き込みの、NO.59057 で書かれているソースがそれらしい。hgcapture より軽いとの評。また、hgcapture は右端と下端に1ドット黒い部分が出てしまうバグがあるけれど、hgcapture2 はそのバグが修正されている模様。

手元の環境で試用してみることにした。
    #include "hgimg3.as"
    #include "d3m.hsp"
    #include "hgcapture2.as"

hgini 等を hgcapture2 に対応した内容に書き替えるので、必ず #include "hgimg3.as" を読んでから hgcapture2 関係を include せよとのこと。

動作確認 :

以下のソースと画像で動作確認してみた。

_07_hgcapture_03.hsp
_tex.png


なんだか妙な結果になった。フレームレートが安定しない…。30 - 60 FPS の間で変化する感じで。グググッと重くなったと思ったら、そのうち 60 FPS近辺に戻ってきてするすると動いて、と思っていたらまたグググッと重くなって、みたいな状態を繰り返す。

しかし、必ずそうなるわけでもないようで、OSを再起動したらフレームレートが安定し始めたりして…。一体何が起きてるのか…。分らん…。

ただ、hgcapture が持ってた、右端と下端に黒いドットが入ってしまうバグは、たしかに解消されている模様。

2023/11/14(火) [n年前の日記]

#1 [hsp] HGIMG3のhgcaptureについて調べてる。その3

Windows10 x64 22H2 + HSP 3.7 beta7 で、仮想画面相当に HGIMG3 で描画して、その結果をメイン表示ウインドウに持ってこれないか実験中。

hgcapture を使えば、HGIMG3 で描画した結果を、HSP標準のイメージバッファに持ってくることができるわけだけど、フレームレートが安定しなくてそのあたりを試していた。hgsync で時間待ちをせずに await で時間待ちをしたら比較的安定しているように見えたのだけど…。こういう呼び方で正しいのかどうか…。

ハードウェアスペックは、CPU : AMD Ryzen 5 5600X (6C12T、3.7 - 4.6GHz)、GPU : NVIDIA GeForce GTX 1060 6GB、RAM : 16GB。

ソース :

とりあえず以下のようなソースになった。

_07_hgcapture.hsp
    ; hgcapture使用サンプル
    
    #include "hgimg3.as"
    #include "d3m.hsp"
    
    ; 以下の行をコメントアウトするとウインドウ表示になる
    #define FULLSCR
    
    #packopt name   "07_hgcapture"  ; file name
    #packopt type   0               ; generate ".exe"
    
    #define TEXFILE     "tex.png"
    #pack   TEXFILE
    
    #define KB_ESC  128
    
    framerate = 60
    
    title "Screen 0"
    
    ; メイン表示ウインドウを確保
    dispid = 2
    
#ifdef FULLSCR
    ; get desktop size
    dispw = ginfo_dispx
    disph = ginfo_dispy
    bgscr dispid, dispw, disph, 0, 0, 0, dispw, disph
#else
    dispw = 1600
    disph = 900
    screen dispid, dispw, disph, 0
    title "Screen " + dispid
#endif

    ; hgcapture用バッファを確保
    vscrw = 800
    vscrh = 450
    tbufid = 6
    buffer tbufid, vscrw, vscrh
    
    ; 仮想画面相当の表示ウインドウを確保
    vscrid = 5
    ;modevalue = screen_hide
    modevalue = 0
    screen vscrid, vscrw, vscrh, modevalue
    title "Screen " + vscrid
    
    hgini
    
    ; load texture
    texload2 TEXFILE
    texid = stat            ; get texture ID
    texw = 512
    texh = 512
    
    clscolor $4080c0        ; set clear color
    
    angle = 0.0
    
    time_start = d3timer()
    
*mainloop
    repeat
        ; get FPS
        tm = d3timer() - time_start
        fps = d3getfps()
        
        ; ESC key to exit
        stick k, 0
        if k & KB_ESC : break
        
        angle += 0.5
        
        hgdraw
        
        ; draw images (HGIMG3)
        objmax = 96
        repeat objmax
            r = double(vscrh) * 0.5
            a = angle + (270.0 / double(objmax)) * double(cnt)
            x = int(r * cos(deg2rad(a))) + (vscrw / 2)
            y = int(r * sin(deg2rad(a))) + (vscrh / 2)
            d = double(cnt) / double(objmax)
            
            src_x = (idx \ 2) * texw
            src_y = ((idx / 2) \2) * texh
            idx = (cnt \ 4)
            rot = deg2rad(angle * 2.0 + 360.0 * d)
            ; scale = 1.0 - (0.75 * d)
            scale = 2.0 - (1.75 * d)
            dst_w = int(double(texw) * scale)
            dst_h = int(double(texh) * scale)
            
            ; draw image by celput
            gmode gmode_rgb0, texw, texh
            pos x, y
            hgrotate texid, src_x, src_y, rot, dst_w, dst_h
        loop
        
        if 0 {
            t = (1000 / framerate) - 1
            if t <= 0 : t = 1
            hgsync t
        } else {
            hgsync 12
        }
            
        ; HGIMG3 の描画結果をキャプチャしてbuffer(ID=tbufid)にコピー
        ; 右端と下端に数ドット黒部分が出るのはバグらしい
        gsel tbufid
        ; redraw 0
        hgcapture
        ; redraw 1
       
        ; メイン表示ウインドウにHGIMG3の描画結果を描画していく
        gsel dispid
        redraw 0
        
        ; tbufid から dispid に拡大描画 (HSP標準描画機能)
        if 1 {
            gmode gmode_gdi
            pos 0, 0
            gzoom dispw, disph, tbufid, 0, 0, vscrw, vscrh, 0
        } else {
            gmode gmode_gdi, vscrw, vscrh
            pos (dispw / 2), (disph / 2)
            grotate tbufid, 0, 0, 0.0, dispw, disph
        }
        
        ; draw text (HSP標準描画機能)
        if 1 {
            font "Tahoma", 20, 1, 2
            objcolor 255, 255, 255
            color 16, 16, 16
            pos 16, 16
            mes strf("[%dx%d] %d FPS", vscrw, vscrh, fps), 4
        }
        
        redraw 1
        
        await (1000 / framerate)
    loop
    
*mainloop_end
    end

使用画像は以下。

_tex.png


実行結果は以下。




ポイントとしては…。hgdraw → hgrotate で描画 → hgsync で時間待ちをした後、hgcapture を呼んで、そこからHSPの標準描画機能で各描画をして、最後に await で本来待つべき時間待ちをする、みたいな流れになっているところだろうか。色々順番を入れ替えてみたけど、この順番ならフレームレートが安定してくれたように見えた。

ただ、hgsync や await が具体的にどんな処理をしているのか、そのあたり自分は全く分かってないので…。もし分かってる人が見たら、「あ…それをやられてしまうとマズイんだけど」と眉をしかめる状態になっている可能性もあるかもしれない。あるいは他の環境で動かしたらかえってフレームレートが不安定になる可能性もあったりするかもしれない。

余談。上記のソースでは、仮想画面相当のウインドウも画面に表示しているけれど。screen 命令でウインドウを新規作成する際に、screen_hide というモード値を指定すれば、非表示のウインドウになる。実際に本番(?)の処理として書く場合は、仮想画面相当のウインドウは非表示にするだろうなと。

2023/11/15(水) [n年前の日記]

#1 [pc] サブPCが起動しなくなっていた

久々にメンテナンスをしようと思って、サブPC (AMD A6-3500機) の電源を入れたところ、HDMIで接続しているはずの画面が映らなくて困ってしまった。電源LEDは点いているけれど、OS (Linux Mint) が立ち上がっている感じはしない。本来ならOSが起動すると無線LAN子機でLANに接続して、メインPCからサブPCにアクセスできるはずなのだけど…。

たぶん、M/B上の内蔵電池(CR2032)が切れたのかなと、ケースを引っ張り出して、蓋を開けて、電池をチェックしてみたら、完全に電池が切れていた。新品と交換したらすんなり起動してくれた。

ずっと電源を入れてなかったのだから、そりゃ電池も切れるわな…。

PCを整理したい :

考えてみたら、普段滅多に電源を入れないLinux機が部屋の中に5台、いや、ノートPCも含めたら7台、Raspberry Pi機も入れたら9台もある…。

使ってないPCを置きっぱなしにして埃をかぶらせているのもアレなので整理したいところだけど、どれもまだ動くし…。動くと言っても、その手のお店に売れるほど優秀なスペックのPCパーツではないので、整理するとなったら捨てるしかないのだけど。でも、まだ動くし…。動くのに捨てるのもなんだかもったいないと思ってしまって…。

以前はそれらの古いPCを分散レンダリングに使ったりもしたのだけど。レンダラーのバージョンが上がったらIntel製CPUじゃないと計算できない・昔のAMD製CPUは使えない状態になってしまったし。そもそも、古いCPUを総動員してレンダリングするより、真っ当なGPUを使ってレンダリングしたほうがはるかに速いというのが分かってしまって…。こうなると、古いPC群の使い道が…。

2023/11/16(木) [n年前の日記]

#1 [windows] Windows10が起動しなくなってしまった

Windows10 x64 22H2 をインストールしてあるメインPCが、またブルースクリーン(BSOD)に。

bsod_ss.jpg

今月の Windows Update が降りてきて、そのインストール処理を試みるたびに、BSODになっている模様。

先日 Npcap をアンインストールしたので状況が変わるかと期待していたけれど、またBSODになったということは、Npcap が原因でBSODになってたわけではなさそうだなと…。

ちなみに、メインPCのハードウェアスペックは以下。

BSODになるたびに、chkdsk C: /offlinescanandfix /f と chkdsk D: /offlinescanandfix /f を走らせていたのだけど、そのうち再起動時に修復云々のメッセージが出て「winload.exeが見つからないから修復できない」みたいなことを言ってきた。

winload_botfound_ss.jpg

Windows ブート マネージャー

windowsを開始できませんでした。最近のハードウェアまたはソフトウェアの変更が原因の可能性があります。問題を修正するには次の方法があります:

1. Windowsインストールディスクを挿入してコンピュータを再起動します。
2. 言語の設定を選んでから、「次へ」をクリックします。
3. 「コンピューターの修復」をクリックします。

このディスクが無い場合は、システム管理者またはコンピューターの製造元にお問い合わせください。

ファイル: \Windiws\system32\winload.exe
状態: 0xc0000225
情報: 必要なファイルが見つからないか、ファイルにエラーがあるため、アプリケーションまたはオペレーティングシステムをロードできませんでした。

Enter=OS選択

Enterを叩くと一応 Windows10 が選択肢に出てきたのだけど、それを選ぶと必ずブルースクリーンになる。困った。どうしたものか。

巷の解説記事によると、bootrec なるツールを使って、ブート関連情報を再設定してやると改善される場合もあるらしいのだけど…。なんか色々やってるうちにコマンドプロンプトが表示されるところまでは行ったけど、bootrec と打っても「そんなプログラムは無い」と言われてしまう。後になって知ったけど、WinRE なる環境で起動してないと、bootrec は使えないらしい。

Windows10のインストールディスクを入手 :

Ubuntu Linux 22.04 LTS をインストールしてあるサブPCを使って、Windows10のセットアップディスクをUSBメモリ上に作れないか試した。以下のページを参考にしつつ作業。

_UbuntuでWindows 10インストールメディアを作成する | 竹のしんのテック日記

「Windows10 iso」でググったら、Microsoft の iso 配布ページが出てきたので、そこから iso を入手。ファイル名は Win10_22H2_Japanese_x64v1.iso だった。入手には数時間かかった気がする。

Ubuntu LinuxでUSBメモリにWindows10インストールディスクを書き込む :

32GBのUSBメモリを発掘してきて、その中に Windows10 のセットアップディスクを入れることにした。

Ubuntu 機にUSBメモリを差してから、「disk」と打って「ディスク」を探して起動。USBメモリを選んで、右上の縦の「・・・」を選んで、「ディスクを初期化」。

Ubuntu Linux の場合、WoeUSB なるツールを使えば、ブート可能なUSBメモリを作れるらしい。

前述の解説記事を見習って、以下を入力してインストール、かつ、起動。
sudo apt update
sudo apt upgrade
sudo add-apt-repository ppa:tomtomtom/woeusb
sudo apt update
sudo apt install woeusb woeusb-frontend-wxgtk

woeusbgui

手元のサブPC上でも、昔 woeusb をインストールして使ってたらしいのだけど、バージョンが古いせいか途中で何度もエラーが出て処理がまったく先に進まなかった。一度アンインストールして、現行版を再インストールしたら、処理が進むようになった。

書きこむ際のファイルシステムは FAT ではなく NTFS を選んだ。

USBメモリをUSB2.0ポートに差して作業したせいか、途中で止まってるのではないかと不安になったぐらいに、かなり時間がかかった。それでも一応ブート可能なUSBメモリが出来た。たぶん。

メインPC上でセットアップディスクから起動 :

メインPCにUSBメモリを差して、USBメモリから起動。

最初は「コンピューターの修復」→「スタートアップ修復」を選んだけれど効果無し。

「詳細オプション」を選んで、コマンドプロンプトを起動して、以下の3つを打ち込んだ。

bootrec /fixmbr
bootrec /fixboot
bootrec /rebuildbcd 

「要素が無い」等、不安になることも言ってきたけれど、多少は効果があったようで、次回からはWindows10が起動してくれるようになった。

セーフモード上でWindows Updateできるようにする :

Windows10が起動するようになったものの、また Windows Update が走ってしまってBSODになる…。どうにかして、Windows Update を終わらせないといけない…。

セーフモード+ネットワークの状態で、Windows Update を実行できるように設定を変更してみた。本来、セーフモードの時は、Windows Update は動かないのだけど、いくつかのサービスが動いてる状態にできれば、Windows Update も動くらしい。

_Windows 10 をセーフモードで起動して Windows Update を実行できるようにする | 雑廉堂の雑記帳

上記ページによると、レジストリに以下を追加することで、セーフモード+ネットワークの際にサービスが動くようになるらしい。
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer /ve /d Service
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\wuauserv /ve /d Service
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\BITS /ve /d Service
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\EventSystem /ve /d Service
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\UsoSvc /ve /d Service
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\DoSvc /ve /d Service
REG ADD で、レジストリに項目を追加している。

削除する時は以下らしい。試してないけど…。
REG DELETE HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer /f
REG DELETE HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\wuauserv /f
REG DELETE HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\BITS /f
REG DELETE HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\EventSystem /f
REG DELETE HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\UsoSvc /f
REG DELETE HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\DoSvc /f

上記のソレは「Network」を指定しているので、セーフモード+ネットワークの時の指定になっているけれど、「Network」を「Minimal」にすれば、セーフモードオンリーで起動した際の指定になる模様。

この状態で、セーフモード+ネットワークで立ち上げて、Windows Update をしてみたところ、BSODにならずに処理が終わってくれた。

BIOSやオーディオドライバをアップデート :

GIGABYTE B450M S2H のページに行って、BIOS やドライバの新版が無いかチェック。

BIOSを、f63(2022/11/17, mb_bios_b450m-s2h_f63.zip)から、f65b(2023/09/21, mb_bios_b450m-s2h_8a16bg0c_f65b.zip)にアップデートした。ちなみに GIGABYTE製M/Bの場合、USBメモリのルートに B450MS2H.F64 や B450MS2H.F65b というBIOSのファイルを入れて、BIOS設定画面で Q-Flash という機能を呼び出せば更新できる。

オーディオドライバを、6.0.9225.1 (2021/10/05, mb_driver_realtekdch_6.0.9225.1.zip) から、6.0.9373.1 (2022/07/25, mb_driver_audio_realtek_6.0.9373.1.zip) にアップデートした。一旦セーフモード+ネットワークで起動して、コントロールパネル経由で、Realtek Audio Driver をアンインストールしてから、そのままオーディオドライバの新版をインストールしてみた。

たしか Realtek のオーディオドライバは、インストール時に古いドライバをアンインストールして、直後にOS再起動を要求して、再起動後に新版をインストールする作りになっていたと思うけど。OSを再起動する際に Windowsがあらかじめ持ってるドライバをインストールされてしまって、再起動後にまた古いドライバが入ってるから Realtek のインストーラが古いドライバをアンインストールしようとして…。延々と同じ処理を繰り返して先に進まなかった記憶がある。今回はセーフモードで無理矢理作業してしまったけれど、本来はどうやって解決すべきなんだろう…。

スリープ復帰時にBSODが出るようになった :

BIOSとオーディオドライバを更新して何か変わるかなと思ったけれど、スリープから復帰する際にBSODになった。コレ、悪化してないか…。

アプリをアンインストール :

セーフモード+ネットワークで、システムに食い込んでそうなアプリをいくつかアンインストールしてみた。

  • ImgDrive 2.0.6 : isoを仮想ドライブにマウントできるツール。2.0.6 をアンインストールした直後に 2.1.2 を再インストール。
  • ORAKUIN : キー入力・マウス操作を画面上で視覚化してくれるツール
  • ELECOMらくちんプリント3.0 : ラベル印刷用ソフト。OSのstartup時に何かしてるので…。
  • SVG See 1.1.0 ... エクスプローラ上でSVGのサムネイル表示をしてくれるツール。PowerToysが同機能を持ったので、こちらは開発停止状態になってる。
  • Defraggler 2.22 : デフラグソフト
  • UltraDefrag (Ultra Defragmenter) 7.1.4 : デフラグソフト
  • iTunes : Apple のアレ。

ImgDrive だけ、アンインストール後に現行版の 2.1.2 をインストールし直した。

他に怪しいのは…。Alcohol 52% 2.1.1 Build 2201 だろうか…。でもコレが無いと iso の類が作れないし…。

ELECOMらくちんプリント3.0 をアンインストールしたのに、C:\Program Files (x86)\ELECOM\ELECOM PrintServer\rakuchinprintsub.exe が、まだスタートアップに残っている。これは一体何なんだろう…。ググっても情報が出てこない。

グラフィックドライバをインストール :

NVIDIA グラフィックドライバを再インストールしてみた。もしかして、ここしばらくクリーンインストールをしていないことで不具合が起きてるんじゃないかと疑ったので…。

546.17-desktop-win10-win11-64bit-international-dch-whql.exe を入手。セーフモード+ネットワークで起動してから実行。カスタムインストールを選んで、クリーンインストールにチェックを入れてインストール。NVIDIA GeForce Experience はインストールしない。というか、セーフモード上では項目として出てこなかった。

グラフィックドライバとオーディオドライバのインストール項目しか無かったのが気になる。本来もうちょっと項目が多かったような…。OSを通常起動してから、再度インストーラを実行したら、PhysX と GeForce Experience のインストール項目が増えた。BSOD になることを覚悟しつつ再インストール。幸い BSOD にはならなかった。

#2 [digital] NASが届いた

数日前(2023/11/14の夜)、EC-CURRENT に注文していた、DTCP-IP、DLNA対応のNASが届いた。BUFFALO LinkStation LS210D0201G。2TB。税込11,704円。

経緯 :

使っているHDDレコーダ、TOSHIBA RD-BZ710の空き容量が厳しくなってきた。しかし、このHDDレコーダ、BDドライブが故障してしまっているので、BD-Rに焼いて番組データを逃がすことすらできない。

USB接続の外付けHDDをつけてそちらに録画ファイルを逃がすことも考えたけど、もしHDDレコーダ本体が故障したら、外付けHDDに保存したファイル群は全て再生不可能な状態になってしまう…。まあ、今時のHDDレコーダなら、SeeQVault なる規格に対応していればそういった不安はないらしいけど、このHDDレコーダは古いから、そんな規格には未対応。HDDレコーダ本体と外付けHDDは一蓮托生。

どうしたものかと悩んだけれど、ここは DTCP-IP対応のNASを購入するしかないのかなと…。そういったNASに番組ファイルをムーブできれば、他の環境からファイルを再生することもできなくはないだろうし…。仮にHDDレコーダ本体が故障してもどうにかなりそう。いや、NAS本体が故障したら、その時は泣くしかないんだけど。

ということで、NASを購入した次第。

2TBでは足りないのではないかとも思ったけれど、どうせこのHDDレコーダ、扱えるタイトル数の制限があるので、2TBも使えないかもしれない…。

感想 :

とりあえず箱から出した。この手のNASは初めて購入したけれど、結構小さいのだな…。フツーのUSB接続外付けHDDと大して変わらない大きさ。

まだセットアップは全然できてない。メインPCの不調をどうにかするのが先なので…。

2023/11/17(金) [n年前の日記]

#1 [windows] メインPC上でアプリをいくつかアンインストールした

Windows10 x64 22H2を動かしてるメインPCが不調。何かの拍子にBSOD(ブルースクリーン)になる。

とりあえず、使っていないアプリをCドライブからアンインストールしてみた。


システムに食い込んでそうなのは、Apple関係のソレぐらいだろうか…。他はたぶん関係無さそう…。

PxHlpa64.sys を削除した :

色々ググってるうちに、PxHlpa64.sys というファイルがよろしくない、といった記事を見かけたので、それも削除してみることにした。

なんでも、古いAdobe製ソフトについてくることが多いらしい。たしかに自分の環境は Adobe Photoshop Elements 8 をインストールしてあった…。

C:\Windows\System32\drivers\ 内の PxHlpa64.sys を削除すればいいらしいけど…。後で必要になったら怖いので、該当ファイルを別フォルダに移動しておくことにした…。 *1

加えて、C:\Windows\System32\CatRoot\ 内の、pxhlpa64.cat も削除しないといかんらしいけど、そちらは探しても見つからなかった。

以下のレジストリも変更する必要があるらしい。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e965-e325-11ce-bfc1-08002be10318}
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}
LowerFilters または UpperFilters に、PxHlpa64 という記述があるので、値を削除、とのこと。

以下、参考ページ。

_備忘録 : PxHlpa64.sysを削除してメモリ整合性をONにする(Windows11)
_メモリ整合性(コア分離)がオフのpxhlpa64.sysとは?削除は?|windows 11更新 | 令和の知恵袋
_「pxhlpa64.sys」、お前なのか!: ASAKAIの部屋
_Windows10/11にて古いAdobeソフトをインストール後にPC起動できない時の対策法(PhotoshopやCS6等)|alicetale
_仮想ドライブにISOファイルをマウント出来なくなった件 Windows10 | 豆腐の角
_CD/DVDドライブが認識されなくなったら (WebArchive)
_第6世代CPUのPCで Windows11に挑戦 3 アップグレードから二月経過: のんびり写真館

この PxHlpa64.sys、CD/DVDドライブのドライバとして登録されてしまっていることが多いらしい。デバイスマネージャで「DVD/CD-ROM ドライブ」を確認すると、ドライバとして登録されていたりするそうで。各ドライブの「ドライバーの詳細」をクリックして、記述が無いか確認。

pxhlpa64_sys_ss01.png

pxhlpa64_sys_ss02.png

pxhlpa64_sys_ss03.png

pxhlpa64_sys_ss04.png

たしかに、自分のメインPCでもドライバとして登録されてしまっていた。

PxHlpa64.sys を別のどこかに移動して、レジストリを修正してからOS再起動したところ、登録されない状態になった。

pxhlpa64_sys_ss05.png

pxhlpa64_sys_ss06.png

2023/11/18追記 :

PxHlpa64.sys はサービスとして起動するようになってるようなので、レジストリを弄って無効化しておいたほうがいいのかもしれない。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PxHlpa64
Start を 0x00000000 から 4 に変更して、サービスとして起動しないようにしておいた。

_Question - Can only boot Windows 11 Pro in Safe Mode after installing Adobe CS6 and Windows Update ... Auto-Repair, System Restore, etc. all fail | Tom's Hardware Forum

*1: 今回は、D:\home\AppliData\pxhlpa64_sys_bkup\ に保存しておいた、と念のためにメモ。

#2 [digital] BUFFALO製NASを設置して初期設定をした

昨日届いたNAS (Network Attached Storage)、BUFFALO LinkStation LS210D0201G (2TB) を設置して初期設定をした。

_LS210D0201G : ネットワーク対応HDD(NAS) : LinkStation | バッファロー

LANハブにLANケーブルで繋いでから電源を入れたら、白色LEDがしばらく点滅して、その後点灯状態になった。点滅しているときは起動中の処理が行われているらしい。

管理ソフトをインストール :

Windows10 x64 22H2機に、管理ソフト NAS Navigator2 をインストール。

_LS210D0201G : ソフトウェア | バッファロー

「NAS Navigator2 (Windows) 2021/03/09 3.0.4」、nasnavi-304.exe を入手して実行。C:\Program Files (x86)\BUFFALO\NASNAVI\ にインストールされたっぽい。NasNavi.exe が NAS Navigator2 らしい。

起動すると、LAN上に存在するNASの一覧が表示された。機器名は、LS210D29A になっていた。エクスプローラ上の「ネットワーク」からも、同じ名前で見えている。

機器のアイコンを右クリックして、「Web設定画面を開く」を選択。Webブラウザで設定画面が開く。

管理者ユーザ名は admin で決め打ちされていた。管理者パスワードはデフォルトで password になっているらしいので変更しておく。加えて、ユーザを追加。

ホーム画面 → 詳細設定 → 管理 → アップデート、を選択。ファームウェアは最新版になっていた。

ファイル共有 → 共有フォルダ―、を選択。共有フォルダとして、pub を追加。

ワークグループを WORKGROUP から変更。ネットワーク → ワークグループ/ドメイン、を選択。ウチのLANは別のワークグループ名になっているので…。このあたり、デフォルトの WORKGROUP にしておけば楽だっただろうな…。

NASにアクセスする際は、ユーザ名: guest、パスワード: 空欄、にすれば、ゲストユーザとしてアクセスできるらしい。フォルダを作成したり、ファイルを作成したりできることを確認した。

とりあえず、PCからアクセスする分にはフツーに使えそう。問題はHDDレコーダからどう見えるのか…。

シリーズ名がよく分からない :

型番からすると LS210DG になるのかなと思ったけれど、各所で表示されるソレは LS210D になってる。どちらが正しいのか…。まあ、使えてるみたいだからいいか。

Linux機から管理できないのだろうか :

この製品、Windows と Mac は管理ソフトが用意されているけれど、Linux からは設定できないのだろうか…?

ただ、アクセス自体は、smb://(IPアドレス) でできる模様。ファイラー thunar のアドレス欄に smb://(IPアドレス) と打ったら開けたし、匿名ユーザを選んだらアクセスもできた。

2023/11/18() [n年前の日記]

#1 [windows] メインPCがまたブルースクリーンになった

Windows10 x64 22H2 をインストールしてあるメインPCがブルースクリーン(BSOD)になる件について。昨日 PxHlpa64.sys を削除したことで多少は改善しないかと期待していたけれど、ダメだった。今日も何かの拍子にBSODになった。ということは、PxHlpa64.sys が原因ではないのだな…。

Autoruns 14.1 x64 を使って、Windowsが起動する際に読み込まれているファイル群を眺めて、怪しいファイルが無いか探しているところ。sptd2.sys が怪しい気もするのだけど…。

_Autoruns for Windows - Sysinternals | Microsoft Learn

2023/11/19() [n年前の日記]

#1 [windows] Windows10のBSOD関係をまだ調べている

Windows10 x64 22H2機が、まだブルースクリーン(BSOD)になる。PxHlpa64.sys をアンインストールしたのに BSOD になるということは、別の何かが原因なんだろう…。

とりあえず、以下をアンインストールしてみた。通常モードでWindows10を起動すると、アンインストール時にまたBSODになりそうなので、セーフモード+ネットワークで起動してアンインストールしていった。


これでCD/DVD関係のアプリは、大体アンインストールしたはず…。

sptd2.sysを削除したらOSが起動しなくなった :

Alcohol 52% をアンインストールしたのに、まだ C:\Windows\System32\drivers\sptd2.sys が相変わらず存在していて、Windows10の起動時に読み込まれている…。

該当ファイルを別フォルダに移動してみたら、Windows10 が起動しない状態になった…。

win10_bsod.jpg

デバイスに問題が発生したため、再起動する必要があります。再起動できます。

停止コード : INACCESSIBLE_BOOT_DEVICE

Windows10インストールディスク(USBメモリ)で起動して、コマンドプロンプトで起動して、Dドライブにバックアップしておいた sptd2.sys を、本来あったはずの場所(G:\Windows\System32\drivers\)にコピーしたところ、起動してくれるようになった。ちなみに、コマンドプロンプト上でTABキーを使ったら、パスの補完をしてくれた。
dir G:\Windows\System32
dir D:\home\AppliData\sysbkup\sptd2_sys_bkup\2.13.0.0
copy D:\home\AppliData\sysbkup\sptd2_sys_bkup\2.13.0.0\sptd2.sys G:\Windows\System32\drivers


その後ググってみたところ、どうやら sptd2.sys を一度組み込んでしまった Windows10 は、該当ファイルを削除するとブートすらできなくなるようだなと…。

_INACCESSIBLE_BOOT_DEVICE - Microsoft Community


「該当ファイルを使わないようにしたい時は、安易にファイルを削除するな。レジストリを編集して使わないように変更せよ」という話も見かけた。

_please fix the windows 10 inaccessible device boot issue - Page 2 - Alcohol Trial Technical Support - Alcohol Software Official Support Forum

以下のレジストリの「start」を4にすることで、レジストリの値は残しておきつつ、サービスとしては無効にできる模様。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\sptd
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\sptd2

2023/11/22追記 :

レジストリを修正して sptd2.sys を無効にしようと試してみたら、Windows10が起動しない状態になった。このあたり下手に弄らないほうがまだマシかもしれない。

どうも自分の環境では、一度インストールされてしまった sptd2.sys について、アンインストールも無効化もできない状態になっている模様。つまるところ、Alcohol 52% はインストールしちゃいけない…。インストール前の状態に戻せなくなる可能性が高い…。

2023/11/20(月) [n年前の日記]

#1 [nitijyou] LEDライトを修理してみた

玄関に置いてあった、ランタン風のLEDライトが点かなくなっていた。蓋を上に引き出すと点灯して、下に縮めるとオフになる、単3電池3本を使うタイプ。

底面の4つのネジを外してみたら、電池ボックスの金具とスイッチを繋いでいたコードが外れていた。コードの両端の半田付けが剥がれてしまった模様。

とりあえず半田付けして修理してみたけど、そのうちまた剥がれてしまうだろうなと…。

それにしても、結構簡単な構造なのだなと…。引き出した蓋の固定は、溝にはめ込んだシリコンゴムで実現していた。実にアナログ…。

せっかくだから、LEDの周りにトレーシングペーパーを巻いて、光が多少は拡散するようにしてみた。今まではLEDが直接見えていて眩しかったので…。熱がちょっと不安だけど、電池で光るLEDライトだし、そこまで熱くはならないだろう…。たぶん。

#2 [movie] 「ミラベルと魔法だらけの家」を視聴

金曜ロードショーで放送されてたソレを録画していたので視聴。ディズニーの3DCGアニメ。初見。

相変わらず映像が凄いなと…。そしてディズニーアニメだからミュージカルシーンが…。個人的にミュージカルは苦手なのでちょっと辛かった。でもまあ、ディズニーアニメだし。

ヒロインの設定が面白そうと思ったのだけど、あまり活かせてなかったような気もした。これといった才能が無くても云々と訴えるのかなと思ったらそういうわけでもなく…。いやまあ、 最後は当主から存在が肯定されていたようだから、それで十分なのかな。

Wikipediaの記述を見ると、企画段階、脚本制作の段階でかなり迷走していたようで…。全然違う設定や展開も検討されていたのだな…。「家族」というテーマは最後までブレなかったようではあるけれど…。

_ミラベルと魔法だらけの家 - Wikipedia

2023/11/21(火) [n年前の日記]

#1 [cg_tools] svgでエクスポートできるCGソフトを試用

Windows10 x64 22H2上で、ベクターレイヤーをSVGでエクスポートできるCGソフトについて、使い勝手を確認していた。

普段は、Inkscape 1.3 x64 というドローソフトを使っているのだけど、どうも使い勝手の面でしっくりこない感じがあって、もっとサクサク作業できるソフトがあるならそっちを使ってみたいなと思えてきたので…。

CLIP STUDIO PAINTを試用 :

CLIP STUDIO PAINT PRO 1.13.2 はベクターレイヤーを扱えるけれど、そのベクターレイヤーを、svgでエクスポートすることもできる。1.10.0 の時点で svg の読み書きに対応していたらしい。

_CLIP STUDIO PAINTはSVG形式に対応していますか? - CLIP STUDIO 公式サポート

エクスポートできるのはあくまで線画のみ、ということらしい。塗りはエクスポートされない。

使い方としては、まずベクターレイヤーを新規作成して、その上に色々描いて、ファイル → ベクター書き出し、を選べばいい。現在選択中のベクターレイヤーをsvgとして保存できる。

少し触ってみたけれど、図形の類を描く分には問題無く使えそうだなと…。ただ、フリーハンドで描くと、制御点の数が膨大になって、これはちょっとどうなんだという感じに…。補正をもっと強くかけたら違ってくるのだろうか。

線修正ツールの、「ベクター線単純化」を使って線をなぞれば、制御点の数を減らすことができなくもないけれど、かなりアバウトな感じの作業になるので、そこは単純化されると困るなあ、みたいな場面がちょくちょくあって…。ちょっとしっくりこなかった。

CLIP STUDIO の場合、曲線はベジェ曲線ではなくてスプライン曲線相当になってるようにも見えた。絵描きさんにとってはそのほうが分かりやすいのだろうか。

Kritaを試用 :

Krita 5.2.1 x64 もベクターレイヤーをsvgでエクスポートできるので試用してみた。4.0 の時点でsvgのインポートとエクスポートに対応してたらしい。

_Krita 4.0 リリースノート | Krita
_高機能ペイントソフト「Krita」がv4.0に 〜SVGやPythonスクリプティングをサポート - 窓の杜

使い方としては、ベクターレイヤーを新規作成して、その上に色々描いてから、レイヤー → インポート/エクスポート → ベクターレイヤーをSVGとして保存、を選択。

Krita のベクターレイヤーはsvgで管理されているそうで、線だけではなく塗りもエクスポートすることができる。単色塗りはもちろん、グラデーション塗りもエクスポートできた。

ベクターレイヤー上で描く際、利用できるツールは限られてくるので注意。もっとも、svg画像を作成するには十分なツール種類が揃ってるので問題無さそう。

制御点を移動する際に、移動前の位置に一瞬戻るのがちょっと気になる。これはこういう仕様なんだろうか?

フリーハンドパスツールを使えば、フリーハンドで描いた線を自動的にパスにしてくれる。ツールのオプションで、補正 → 描画精度をカーブにすれば、イイ感じに制御点を減らしつつパスにしてくれるように見えた。

2023/11/22(水) [n年前の日記]

#1 [windows] sptd2.sysを無効化できなかった

Windows10 x64 22H2をインストールしてあるメインPCが、またブルースクリーン(BSOD)になった。sptd2.sys が悪さをしているのかなと思えてきたので、レジストリを修正して無効化できないものかと試してみた。

以下のレジストリの「start」を4にすることで、sptd2.sys のファイルや各種レジストリ値は残しつつ、サービスとしては無効にできる、という話を見かけたので試してみたのだけど…。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\sptd2

レジストリを修正後、再起動してみたら、Windows10が起動しなくなった…。「停止コード : INACCESSIBLE_BOOT_DEVICE」が表示された。SSDにもHDDにもアクセスしている気配が無い。そもそもアクセスLED自体が全く光っていない。

今回はファイル(sptd2.sys)を移動したわけではなく、レジストリを修正してこうなってしまったので、元に戻すためにはレジストリを修正しないといけない。しかし、Cドライブにインストールした Windows10はセーフモードすら起動しないので、どうやってレジストリを修正したらいいのか…。

USBメモリに入れてあるWindows10インストールディスクで起動して、コマンドプロンプトが起動するところまでは行けたけど。そこで試しに regedit と打ってレジストリエディタを起動してみても、インストールディスクから起動したWindowsのレジストリ内容しか表示されない。修正したいのは、SSDにインストールされてるWindows10のレジストリ内容なわけで…。

本来のCドライブはGドライブになっているので、G:\Windows\regedit.exe を起動してみたものの、やはりインストールディスク版のレジストリ内容しか表示されない。参った。

レジストリエディタのハイブ機能を使って解決 :

以下のページの解説が参考になった。

_Windowsを起動せずにレジストリを修正する - PCと解

レジストリエディタには「ハイブの読み込み」という機能があって、コレを使えば別ドライブ/別パーティションに保存されているレジストリを一時的に読み込んで編集できるらしい。

  1. コマンドプロンプト上で regedit と打って、レジストリエディタを起動。
  2. HKEY_LOCAL_MACHINE を選択した状態で、ファイル → ハイブの読み込み、を選択。
  3. G:\Windows\System32\config\SYSTEM というファイル(レジストリファイル)を選択。
  4. マウントキー名の入力を求められるので temp と打った。
  5. HKEY_LOCAL_MACHINE\temp 以下に、G:\Windows\System32\config\SYSTEM の内容が読み込まれた。

HKEY_LOCAL_MACHINE\temp\ 以下の、ControlSet001\Services\sptd2 内の、start の値を 0 に修正して、レジストリエディタを終了してみた。

この状態で再起動したら、修復はできないと一旦表示されたものの、Enter を叩いて Windows 10 を選んだらOSが起動してくれた。

再度、USBメモリ内のインストールディスクから起動して、コマンドプロンプトを起動。bootrec を使って、起動関係のアレコレを修復してみた。

bootrec /FixMbr
bootrec /FixBoot
bootrec /RebuildBcd

再起動したところ、いつものように Windows10 が起動してくれた。助かった。

stpd2.sysはヤバイ :

Alcohol 52% 等のソフトをインストールすることで、一度、Windows10に stpd2.sys をインストールしてしまうと、sptd2.sys のアンインストールも、無効化も、できなくなってしまうようだなと…。

参った。これはもうOSを再インストールするしかないよな…。

#2 [nitijyou] 金網を購入

家の裏の排水溝に設置してた、ゴミが流れていくのを防いでた金網がボロボロになったらしいので、代わりになりそうな金網をダイソーで購入。30x50cmのサイズを2枚。バーベキュー網と書かれてる。焼き網の類が置かれてる売り場に置いてあった。

以前購入して設置したのは、2021/11/15, 11/16頃。最初に設置してあったのは30x45cmの網だったらしい。

_mieki256's diary - 金網を探してる
_mieki256's diary - 金網を購入

メモを残しておいたことで、わざわざ実物を測り直さなくて済んだ。なんでも書き残しておくものだなと…。

#3 [anime] 「呪術廻戦 渋谷事変 41話 霹靂-弐-」を視聴

録画してたソレを視聴。渋谷がアレになる回。

とんでもないな…。こんな映像をTVアニメと称して作られちゃったら、これからのアニメは一体何をどうしたらいいのか…。本当にこういう方向で作り続けていくのだろうか。ヤバイな…。

正直なところ何が起きてるのかさっぱり分からない映像だったのだけど、人ではない者同士がバトルしてるわけだから、これはこれで正しい見せ方なのかもしれないと思えてきた。実際その場に人間が居てその様子を眺めていたらきっとこんな風に見えるよな、みたいな。ただ、見ていて疲れる…。何が何だか分からない、何をしているのかも分らない映像を延々見せられているわけだから、そりゃ疲れるだろうと…。しかしどのカットも気合いが入ってる作画なわけで…。何もかもスゴイ。凄いんだけど、疲れる。見ていてシンドイ。

まあ、とにかく、とんでもないなと…。よくまあこんなアニメを作ったもんだなあ…。恐ろしいなあ…。

#4 [nitijyou] 郵便局に行ってきた

詳細はGRPでメモ。

2023/11/23(木) [n年前の日記]

#1 [windows] うっかり作業でWindows10が起動しなくなった

以下のページを眺めていたら、パーティションに対して、diskpart を使って active にする作業が目に入った。

_MBRでインストールしたWindowsの「ブート領域」の復旧方法 - ぼくんちのTV 別館

これは自分もやっておいたほうがいいのかな、と安易に思って試してしまったのだけど。再起動後、Windows10が起動しなくなってしまった…。

てっきり、「Windowsフォルダが入ってるパーティションをアクティブにするのかな?」と思い込んで作業してしまったけれど、そうではなかった…。どうやら、Windows10が入ってるドライブの、一番最初のパーティションをアクティブにしないとダメだったらしい…。いやまあ、自分の環境は GPT ではなく MBR で Windows10 をインストールしてあるので、GPT の場合はまた違うのかもしれんけど。

何にせよ、一番先頭のパーティションを diskpart を使って active にすることで、また Windows10 が起動するようになった。助かった。かなり焦った…。

念のため、現状の「ディスクの管理」のスクリーンショットを置いておく。

win10_mbr_partition_ss.png

「*」の意味 :

余談。前述のページでは、アクティブになったパーティションに「*」がつくと認識しているようだけど、何度か試した感じでは、そうではなさそうだなと…。

diskpart で、select partition N や select disk N を使った際に、現在選択中のパーティションやドライブに「*」が表示されているように思えた。「そのパーティションがアクティブになっている」という印では無いと思う。たぶん。

#2 [windows] メインPCのメモリチェックをしておいた

memtest86+ 6.20 を使って、メインPCのメモリが壊れてないかチェックしてみた。

_Memtest86+ | The Open-Source Memory Testing Tool

3回パスが通ったので、おそらくメモリは壊れていないのだろう…。たぶん。

ただ、メモリが Slot 2 と Slot 3 に差さっている、と表示されていた点が気になった。そこでいいのだろうか…。自分、間違えて変なスロットにメモリを差してたりするのかな。

M/B、GIGABYTE B450M S2H のマニュアルを確認してみた。メモリスロットは2つしか無かった。であれば、間違いようがないよな…。たまたま表示がそうなってしまっただけなのかもしれない。

#3 [ubuntu][linux] Ubuntu LinuxでKeePassを利用

足元に置いてある Ubuntu Linux 22.04 LTS機上で、パスワード管理ソフト KeePass を使えるようにしておいた。というか、タイムスタンプを見る限り、2020年頃に既にインストールしてあった模様。

実際にインストールしてあるのは、KeePassXC。KeePass の派生ソフトらしい。コレもKeePassのデータベースファイルを読み込むことができる。インストールは以下。
sudo apt install keepassxc

データベースファイルは、Documents/ 以下に適当な名前のフォルダを作成して、そこに入れておいた。

GUIファイラー(thunar等)で、該当ファイルを右クリックして、「KeePassXC で開く」を選べば開ける。一度開いて、KeePassXC を終了すれば、次回 KeePassXC を起動した際、前回開いたファイルを自動で開いてくれた。

参考ページ :

Microsoft Store版は注意 :

この KeePassXC、一時期は Microsoft Store で偽アプリが配信されてた時期があるそうで。

_今度はパスワード管理アプリに偽物が……「Microsoft Store」でまた偽アプリが出没 - 窓の杜
_「KeePassXC」の偽アプリ問題が解決 〜「Microsoft Store」で公式バイナリが利用可能に - 窓の杜

他にも色々な偽アプリが Microsoft Store で公開されていたらしいので、そのあたり、注意しないと…。

フォントが小さ過ぎる問題 :

このアプリ、表示されてるフォントが小さ過ぎる。読み辛いから大きくしたいのだけど…。フォントの設定はできないのだろうか…。

_Increasing Font Size - Issue #7260 - keepassxreboot/keepassxc
_Allow to change font size - Issue #621 - keepassxreboot/keepassxc
_[Solved] Wrong / smaller font size in KeepassXC - Linux Mint Forums
_[SOLVED] Trying to display larger font in KeepassXC / Applications & Desktop Environments / Arch Linux Forums
_Ubuntu 17.04 で qt5 アプリケーションのフォントなどを変更する - Sickly Life Blog

Qtの問題で、フォントが小さくなるらしい。qt5ct というQt設定ツールをインストールして、更に環境変数を設定すれば変更できなくもないっぽい。
sudo apt install qt5ct

~/.profile や ~/.bashrc 等で以下を指定。
export QT_QPA_PLATFORMTHEME="qt5ct"
export GTK2_RC_FILES="$HOME/.gtkrc-2.0"
GTK2_RC_FILES は設定しなくてもいいのかもしれない。~/.gtkrc-2.0 というファイルは無かったので…。

これで、qt5ct を起動してフォント設定をしておいて、bash上で keepassxc & と打って起動すれば、フォント設定内容が反映される。

ただ、スタートメニューから KeePassXC を起動したときは反映されない…。

#4 [digital] NASに移動した番組データをPCで再生したかった

先日、BUFFALO LinkStation LS210D0201G という、DTCP-IP対応、DLNAサーバになるNASを購入したのだけど。HDDレコーダ TOSHIBA RD-BZ710 で録画したTV番組データを、件のNASにムーブして、PCから再生しようとしたところで四苦八苦してしまった。

ちなみに、TV放送を録画した場合、著作権保護の関係で、DTCP-IP対応のDLNAサーバ、DLNAクライアントが無いと、番組データのコピーや移動や再生ができない。DTCP-IP非対応で良ければ、フリーで使えるDLANサーバやDLNAクライアントが存在するのだけど…。

HDDレコーダからNASに番組データをムーブ :

RD-BZ710上で、編集ナビ画面からダビングを選ぶことで、LAN上の LS210D0201G に番組データをムーブ(移動)することはできた。

30分の番組を15分ぐらいでムーブできたので、移動にかかる時間は、ほぼ倍速みたいな感じだろうか…。

PowerDVD 12 Ultraではダメだった :

NAS上に移動したTV番組データを、PCから再生したい。そのためには、DTCP-IP対応のDLNAクライアントソフトが必要になるはず。

CyberLink PowerDVD 12 Ultra を持っているので、ソレを使えば再生できるかなと期待していたのだけど…。試したところ、真っ暗な画面のまま、うんともすんとも言わない。何かの拍子に静止画は出てくるけれど、そこで PowerDVD 12 自体が無反応になってしまう。

ちなみに、NASではなくて、RD-BZ710内のHDDに記録されている番組なら、PowerDVD 12 Ultra を使って再生することはできる。PowerDVD 12 が販売されていた当時の、極一部のDTCP-IP対応DLNAサーバには対応しているということなのだろう…。

現行版の PowerDVD はバージョンが22だけど、そちらなら再生できるのだろうか?

余談。PowerDVDで動作確認していたら、インターネットにアクセスできなくなった ―― Webブラウザ上で、各サイトのページが開けない状態に陥った。もしかすると以下で紹介されているように、PowerDVD が Windows のネットワーク設定を変更してしまうのかもしれない。

_PowerDVD 17 Ultra の使い方−DTCP-IP対応DLNAクライアント機能− | ホームネットワーク構築方法
さらに、こちら(192.168.0.8)から、インターネット上のサーバーに送信しているTCPパケットの IPヘッダ中の TTL(Time to live)の値を確認したところ 3 になっていた。Windowsの Time to live の値は、デフォルトでは 128 である。

そのため、インターネットアクセスできなくなった直接の原因は、PowerDVDが、Windowsが、TCPアクセス時に使用する TTL(Time to live) の値を変更してしまったためであると思われる。

PowerDVD 17 Ultra の使い方−DTCP-IP対応DLNAクライアント機能− | ホームネットワーク構築方法 より

(2) コマンドプロンプトが管理者モードで起動する。
(3) 以下のコマンドを実行。
netsh int ipv4 set glob defaultcurhoplimit=129
netsh int ipv6 set glob defaultcurhoplimit=129

PowerDVD 17 Ultra の使い方−DTCP-IP対応DLNAクライアント機能− | ホームネットワーク構築方法 より

RD-BZ710でもダメだった :

NAS上に移動した番組データを、RD-BZ710 から再生できないかと色々メニューを辿ってみたけれど、どうもそういうことはできないようだなと…。RD-BZ710 は、サーバにはなれるけど、クライアントにはなれない、ということなのだろう…。

困った。NASに番組データを移動できることは分かったけれど、その番組データを一切再生できないのでは、移動する意味がない。これは困ったぞ…。

SONY PC TV Plusなら再生できそう :

SONY TV PC Plus というソフトの体験版をインストールしてみた。14日間、体験版として利用できるらしい。

_パソコンでテレビ視聴、かんたんダビング「PC TV Plus (Lite)」 | 関連ソフトウェア | ソニー

コレを使ったところ、LS210D0201G 内に入ってる番組データを再生することができた。良かった。対応ソフトさえあれば、たしかにPC上でも再生はできるらしい。となると、このソフトを追加で購入するしかなさそうだな…。

2023/11/24(金) [n年前の日記]

#1 [windows] Windows10上のバックアップ作業を始めてる

Windows10 x64 22H2がやたらとブルースクリーン(BSOD)になるので再インストールしたい。その前に各アプリのバックアップを取らないと…。

バックアップしておくべきデータについて、思いつく範囲でメモ。


Windows10メールは、設定の類をバックアップすることはできないらしい。メールアドレスとパスワードをメモしておくしかなさそう。

Thunderbirdのバックアップ :

以下のページが参考になりそう。

_Thunderbird のデータを新しいコンピューターに移動する | Thunderbird ヘルプ

バックアップ手順を引用してメモ。
  1. ヘルプ → トラブルシューティング情報 → プロファイルフォルダー → フォルダーを開く。
  2. Thunderbirdを終了。
  3. 3回上位階層に移動。
  4. Thunderbirdフォルダをコピーしてバックアップ。

移行先のPCでは、Thunderbird をインストールして同じ作業をしてプロファイルフォルダを開き、保存しておいたプロファイルフォルダの内容で上書きすればいいらしい。

Firefoxのバックアップ :

_設定情報のバックアップ | Firefox ヘルプ

  1. ヘルプ → 他のトラブルシューティング情報 → プロファイルフォルダー → フォルダーを開く。
  2. Firefoxを終了。
  3. 1回(2回?)、上位階層に移動。
  4. Profileフォルダをコピーしてバックアップ。

MbaXtermのバックアップ :

_MobaXterm configuration settings - Mobatek blog

(ドキュメント)\MobaXterm\ に設定ファイル等が入ってる模様。

#2 [pc][windows] SSDを購入するかどうかで悩んでる

Windows10 x64 22H2を再インストールしたいけど、インストール先のSSDをどうするかで悩んでる。今現在は Crucial MX500 CT500MX500SSD1JP (500GB, 2.5インチSSD) を使ってるけど、どうもこのSSD、動作が怪しいのではないかという不安もあって…。 どうしたもんか…。

新規購入するとしても、2.5インチSSD以外に、M.2 SSDという選択肢もあるわけで…。でも、M.2 SSD を使ったことがないので、種類や注意点も分からず。ヒートシンクも追加で必要になるのだろうか。自分が使ってる M/B、GIGABYTE B450M S2H (rev. 1.x) で、NVMe とやらは使えるのかどうか…。

_B450M S2H (rev. 1.x) サポート | マザーボード - GIGABYTE Japan

「M.2 サポートリスト」のpdfを眺めたけれど、SATA、AHCI、NVMe で分かれてる。どれも使えるということなんだろうか。

とりあえず、価格comでSSDの値段を眺めてみたけど、気になってる製品の在庫が無くて…。入荷したと思ったら、あっという間に在庫無しになってる…。できれば温度センサがついてる製品がいいのだけど、安い製品は温度を固定で返してくるようで…。

2023/11/25() [n年前の日記]

#1 [pc] M.2 SSDについて調べてる

2.5インチSSDとM.2 SSDの違いについてググってた。スペックだけ見ると転送速度が数倍違うのに、値段が似たようなものだったりするので、2.5インチSSDよりM.2 SSDを選んだほうがいいのだろうかと気になったので…。

_【特集】同じSSDでもこれだけ違う。SATAから第4世代PCIeまで速度差を検証 - PC Watch
_結論:M.2 NVMEとSATA SSDの違いは体感できない…が、気分はいい! - ぱんはげメモ
_SATA3 SSDからNVMeのM.2 SSDに変えるとどのぐらい爆速になる?ゲームのロードは?〜Western Digital SN750レビュー | 萌えるパノラマ島
_M.2 SSDは速いのか?通常のSSDと比べて体感は?ゲーム性能には? | こまたろPC
_【アップグレード後の性能が知りたい!】SSDのヒートシンク、変えたらもっと冷えるのでは?大型/薄型タイプに付け替えて性能・温度を検証 - PC Watch

ベンチマークソフト上ではたしかに転送速度は違うのだけど、OSやアプリの起動時間はどちらを選んでも違いが無いらしい。HDDからSSDにしたら劇的に変わるのは間違いないけれど…。

となると、悩んでしまうなと…。M.2 SSDの場合、ヒートシンクも必要になるだろうから、その分追加コストがかかりそう。でも、SATAケーブルを使わなくて済むから、動作が怪しい時にケーブル不良を疑わずに済むのはヨサゲ。場所も取らない。ただ、M/Bには M.2 SSD用のスロットが一つしかないから、後から M.2 SSDを追加で増設するのは難しい。となると、どこかのPCに使い回すことまで考えたら 2.5インチSSDのほうがいいのだろうか。まあ、とにかく悩むなと…。

#2 [anime] 「ノートルダムの鐘」を視聴

金曜ロードショーで放送されてたソレを録画していたので視聴。ディズニーの手描きアニメ。一応、ディズニールネサンスの最後の作品ということになるのだろうか。

てっきり初見だろうと思い込んだまま見ていたけれど、日記を検索したら2010/08/11にNHK-BS2で見ていたらしい。ただ、当時の自分は感想メモをGRP指定にしていたようで…。「ポカホンタス」と一緒に視聴して、ジプシー vs 白人という構図と、インディアン vs 白人という構図が共通しているように感じた、とメモしてあった。要はディズニーアニメが民族差別をテーマにしていた時期がありそう、みたいな話なのだろうか。

デジタル制作の恩恵 :

それはさておき、映像を見ていて制作状況が気になった。
  • 馬車、風車、塔のてっぺん等、CGで作られてるように見えた。CGの出力結果を手描きでなぞってる可能性もありそうだけど…。
  • 群衆はトゥーンレンダリングのCGキャラだった。
  • キャラにつけてある影の輪郭線が全カットぼかしてあった。
それらから察するに、デジタル仕上げ、デジタル撮影で作られていたのかなと想像したのだけど…。いや、もしかすると、当時はまだそこまで行ってないのかもしれんけど。

「ノートルダムの鐘」は1996年公開の映画。そこで思い出すのが、アニメ映画「MEMORIES」の「大砲の街」(1995年公開)。大友克洋監督+片渕須直さんが、光学合成(オプティカル合成)というフィルム関連技術を駆使して作り上げたアニメなのだけど、関わった方々が「アレはデジタル撮影で作るべきだった。時期的に早過ぎた」と言及していて。

_小原秀一(2) - WEBアニメスタイル アニメの作画を語ろう

もし、「ノートルダムの鐘」がデジタル撮影で作られていたのだとしたら…。あるいは逆に、旧来の撮影台+フィルム撮影で作られていたのだとしたら、「大砲の街」の映像と比較してみるのも面白いのかもしれないなと…。

元々ディズニーは、マルチプレーンカメラを活用した映像制作が得意だった印象もあって。

_マルチプレーン・カメラ - Wikipedia

道具について熟知しているというか、ソレを使えばどんな見せ方ができるのか豊富なノウハウを持っていたと思うので、それがデジタル撮影になったことでどう変化していくのか、どういった制約から解放されていくのか、という見方もできそうな気がする。

#3 [anime] 日本初のTVアニメは「鉄腕アトム」ではなかったらしい

恥ずかしながら今まで知らなかったのでメモ。ずっと間違った知識を持ってました…。

_90分のアニメを200人で1年かけて作っていた時代に、30分のアニメを年間52本作ろうとした手塚治虫。「日本初のテレビアニメは鉄腕アトムではなかった」 | 集英社オンライン | 毎日が、あたらしい
『鉄腕アトム』は「日本初の連続テレビアニメ」と称されるが、正確には「日本初」ではない。内容も規模も異なるが、「日本初の連続テレビアニメ制作者」の栄誉は、横山隆一のおとぎプロダクションが持つ。

手筭治虫がアニメーション作りに乗り出したころ、1961年5月1日に始まった『インスタント・ヒストリー』こそが、「国産テレビアニメ第1作」だった。フジテレビで毎日17時47分から50分までの3分間の番組で、そのなかの1分間がアニメで、1日ごとにその日に起きた歴史的な出来事を紹介する内容だった。

_常設展2 「作家、手塚治虫」 2|常設展|手塚治虫記念館|手塚治虫 TEZUKA OSAMU OFFICIAL
1963年1月1日から全国のフジテレビ系で国産最初の長編連続テレビアニメ「鉄腕アトム」の放映が始まる。 国産テレビアニメの第一号は前年9月にスタートしたおとぎプロ制作の「ヒストリーカレンダー」だが、こちらは5分の帯番組で、30分の長編連続ものとしてはアトムが初の試みだった。

おとぎプロの「インスタント・ヒストリー」「ヒストリーカレンダー」が、日本初のTVアニメだったのね…。

もっとも、自分達が今現在TVアニメと聞いてイメージする30分番組のフォーマットは、たしかに「鉄腕アトム」から始まっているらしい。「30分番組としての日本初のTVアニメ」「一般的にイメージされるTVアニメ」という条件をつければ、「アトム」で正しいよ、ということにもなるのかな。

2023/11/26() [n年前の日記]

#1 [pc] SSDの購入候補で悩んでる

SSDを新規購入しようかどうか検討しているところだけど、どの容量を選んだらいいのかで悩んでる。

どうせなら960GB以上のSSDを買ったほうがいいかなと思ってたけど、システムドライブとして大容量のSSDを選ばないほうがいいのかな、とも思えてきた。もしもまた、Windows10がブルースクリーンになってしまって、chkdsk をかけた際、1TB近くのSSDの内容が壊れてしまったら、そのダメージはとんでもなくでかいだろうなと…。

そう考えると、システムドライブは容量が少なめのほうがいいのかもしれない…。何にせよ、価格comで各商品の値段一覧を眺めて、どれがいいのやらと悩んでる最中。どうしたものか…。

2023/11/27(月) [n年前の日記]

#1 [hsp] HGIMG3のhgrotateやhgrectのバグについて調べてた

プログラミング環境 HSP には、DirectXを利用して描画できる HGIMG3 プラグインが同梱されているのだけど。この HGIMG3 で直接描画(ダイレクト描画)ができる hgrotate や hgrect という命令について、奇数サイズを指定して描画しようとしても偶数サイズになってしまうというバグがあると今頃になって知った。 *1

_hgimg3のhgrotate命令で奇数サイズのコピーが出来ません - HSPTV!掲示板

本当にそうなるのか、Windows10 x64 22H2 + HSP 3.7 beta 7 で動作確認してみた。

結果 :

hgrotate で、16x16 の画像を、14x16, 15x16, 16x16, 17x16, ... 21x16 と描画してみたところ、以下のようになった。

hgrotate_bug2_ss.png


8倍に拡大。

hgrotate_bug2_ss_all_x8.png

たしかに、奇数サイズを指定しても、偶数サイズになってしまっている…。


hgrect はどうなるだろう。これも、14x16, 15x16, 16x16, 17x16, ... 21x16 のサイズで描画してみた。

hgrect_bug_ss01.png

hgrect_bug_ss01_x8.png

こちらも、奇数サイズを指定しているのに偶数サイズになってしまっている…。

これは参った…。hgrotate さえあれば、やりたい描画処理はおおよそできるだろうと安易に思っていたけれど、こんなバグがあるのでは…。

つまるところ、HGIMG3を使って拡大縮小描画をすると、画像の外枠と言うか、輪郭に関しては、ウインドウ解像度の約1/4の解像度でしか描画できませんよ、という状態になるのだな…。 *2

HGIMG3 は開発終了ということになっているので、このバグは修正されない可能性が高いのだろうな…。困る…。hsp3dish や HGIMG4 でスクリーンセーバを作れるなら HGIMG3 を使う必要も無さそうなのだけど、今のところ高速描画するスクリーンセーバを HSP で作りたいとなると HGIMG3 を使うしかないわけで…。まあ、「高速描画できる代わりに解像度は1/4相当」と割り切っちゃうのもアリかもしれんけど…。

ソース :

hgrotate の検証に使ったソースは以下。

_10_hgrotate_bug2.hsp
    ; hgimg3 hgrotate bug
    ; hgrotateで奇数サイズを指定しても偶数サイズにされてしまうバグの動作確認
    ; 16x16ドットの画像を、14x16, 15x16, 16x16, ... 21x16 で描画してみた
    ; たしかに、奇数サイズは偶数サイズになってしまった
    ; 2023/11/27, use HSP 3.7 beta 7
    
    #include "hgimg3.as"
    
    #packopt name   "10_hgrotate_bug2"  ; file name
    #packopt type   0   ; generate ".exe"
    
    #define TEXFILE     "tex.png"
    #pack   TEXFILE
    
    #define KB_ESC      $00080
    
    screen 0, 512, 288, 0       ; initialize screen
    wdw_w = ginfo_winx          ; get window size
    wdw_h = ginfo_winy
    hgini                       ; initialize hgimg3
    
    ; load texture
    ; * texload : alpha channel not support
    ; * texload2 : alpha channel support
    texload2 TEXFILE
    texid = stat            ; get texture ID
    
    clscolor $4080c0        ; set clear color
    
*mainloop
    stick k, 0                      ; check keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    hgdraw          ; draw start
    
    repeat 8
        ; draw image
        
        ; set src size 16x16
        gmode gmode_rgb0, 16, 16
        
        ; set position
        x = wdw_w / 2
        y = 80 + (16 + 4) * cnt
        pos x, y
        
        src_x = 0
        src_y = 0
        rot = 0.0
        dst_w = 14 + cnt
        dst_h = 16
        hgrotate texid, src_x, src_y, rot, dst_w, dst_h   ; draw texture
    loop
    
    hgsync 15       ; draw end and wait
    goto *mainloop

*job_end
    hgbye       ; release HGIMG3 plugin
    end

使用画像は以下。

_tex.png


hgrectの検証に使ったソースは以下。

_12_hgrect_bug.hsp
    ; hgimg3 hgrect bug
    ; 2023/11/27
    ; hgrectで奇数サイズを指定しても偶数サイズにされてしまうバグについて動作確認
    ; 14x16, 15x16, 16x16, ... 21x16 で描画してみる。
    
    #include "hgimg3.as"
    
    #packopt name   "12_hgrect_bug"  ; file name
    #packopt type   0   ; generate ".exe"
    
    #define KB_ESC      $00080
    
    screen 0, 512, 288, 0       ; initialize screen
    wdw_w = ginfo_winx          ; get window size
    wdw_h = ginfo_winy
    hgini                       ; initialize hgimg3
    
    clscolor $4080c0        ; set clear color
    
*mainloop
    stick k, 0                      ; check keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    hgdraw          ; draw start
    
    repeat 8
        gmode 0
        color 1, 1, 1
        
        ; draw rectangle
        x = wdw_w / 2
        y = 80 + (16 + 1) * cnt
        rot = 0.0
        dst_w = 14 + cnt
        dst_h = 16
        hgrect x, y, rot, dst_w, dst_h
    loop
    
    hgsync 15       ; draw end and wait
    goto *mainloop

*job_end
    hgbye       ; release HGIMG3 plugin
    end

dxgrotateを使ってみる :

前述の掲示板でのやり取りの中で、奇数サイズを指定しても正しく反映して描画できる、dx8_grot.as (dxgrotate) という追加ライブラリが紹介されている。

_hgimg3のhgrotate命令で奇数サイズのコピーが出来ません - HSPTV!掲示板 (NO.88437 を参照のこと)

コレを使えば正しく描画されるのかどうか確認してみた。

hgrotate_bugfix2_ss.png

hgrotate_bugfix2_ss_x8.png


たしかに、奇数サイズも正しく反映されているように見えた。素晴らしい。

ただ、若干動作が怪しいところもあって…。横方向のサイズのみを変化させているのに、縦方向の描画内容までずれてしまう時がある。上記のスクリーンショットで言えば、25x16 を指定して描画した際に、描画結果がおかしくなっている。

また、d3dx9_39.dll を要求するあたりも少し厳しいかもしれない。OSによってはDirectXランタイムのインストールが別途必要になりそうなので…。

検証に使ったソースと画像は以下。dx8_grot.as は、掲示板で紹介されていたものを、ほぼそのまま利用。(*main 以下は除外してある。) ありがたや。

_11_hgrotate_bugfix2.hsp
_dx8_grot.as
_tex.png

hglineはどうだろう :

画像を描画する hgrotate、矩形を描画する hgrect は奇数サイズが反映されないのは分かったけれど、線を描画する hgline はどうだろう。気になったので確認してみた。

hgline_bug_ss.png


ドットエディタ EDGE2 で該当部分(左上部分)を拡大表示。

hgline_bug_ss_xn.png


さすがに hgline は奇数サイズも描画できるっぽい…。良かった。

いや。ちょっと待て。コレもしかして描画位置がずれてないか…? (0,0)-(0,0), (0,2)-(1,2), (0,4)-(2,4), ... と描いてるはずだけど、始点座標は描画されていないように見える…。

検証に使ったソースは以下。

_13_hgline_bug.hsp
    ; hgimg3 hgline bug sample
    ; hglineで奇数サイズを指定した場合も偶数サイズにされるかどうか動作確認
    ; 2023/11/27, use HSP 3.7 beta 7
    
    #include "hgimg3.as"
    
    #packopt name   "13_hgline_bug"  ; file name
    #packopt type   0   ; generate ".exe"
    
    #define KB_ESC      $00080
    
    screen 0, 512, 288, 0       ; initialize screen
    wdw_w = ginfo_winx          ; get window size
    wdw_h = ginfo_winy
    hgini                       ; initialize hgimg3
    
    clscolor $4080c0        ; set clear color
    
*mainloop
    stick k, 0                      ; check keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    hgdraw          ; draw start
    
    gmode 0
    color 128, 128, 128
    hgrect 8, 8, 0.0, 16, 16
    
    repeat 8
        gmode 0
        color 1, 1, 1
        
        ; draw rectangle
        x = 0
        y = 0 + (2 * cnt)
        w = cnt
        hgline x + w, y, x, y
    loop
    
    hgsync 15       ; draw end and wait
    goto *mainloop

*job_end
    hgbye       ; release HGIMG3 plugin
    end


標準機能の line を使うとどうなるだろう。試してみた。

normalline_ss.png

normalline_ss_xn.png

_13_normaline.hsp

こちらは逆に、終点座標が描画されない模様。

line にしろ、hgline にしろ、始点座標か終点座標のどちらかは描画されないのだろう…。

*1: バグなのか仕様なのか分らんけど、ドキュメントに制限事項として書いてないあたり、フツーにバグじゃないかな…。
*2: 横が2ドット単位だから、横解像度は半分になるし、縦も2ドット単位なら、縦解像度も半分になる。縦横合わせれば、1/4の解像度。もっとも、表示位置については1ドット単位でずらせるだろうから、単純にそのまま1/4の解像度になるわけでもない。

2023/11/28(火) [n年前の日記]

#1 [hsp] HSPDXについて調べている

プログラミング環境 HSP は、HGIMG3 を使うと DirectX で描画できるけど、直接描画時に奇数サイズを指定しても偶数サイズになってしまうバグがある。DirectX を使って描画できるプラグインとして、HGIMG3 の他に HSPDX があったことを思い出したので、そのあたりを調べてた。

_Divide by 0
_HSPDXFIX for HSP2.6x&3.x Ver 0.19c 2007/06/19 - ソフトウェアダウンロードコーナー
_緊急企画DirectXを使おうの巻
_緊急企画DirectXを使おうの巻
_緊急企画DirectXを使おうの巻
_DirectXスクリーンセーバー3分クッキングの巻
_OHDL - Reference - hspdxfix

ちなみに、HSPDX と HSPDXFIX があるけれど、HSPDXFIX の内容はHSPに同梱されている HSPDX に反映されているらしい。

注意点その1 :

HSPDX の利用について、いくつか問題がある。まず、HSP 3.5以降では、HSPDX は古いプラグインということで、使用は非推奨になっていた。ちなみに、HSPの現行版は HSP 3.6。

_HSP3.5 アップデートガイド
llmod3,HGIMG/HGIMGX,HSPDXのプラグイン・モジュールは非推奨となっています

HSP3.5 アップデートガイド より

5. パッケージの同梱終了について

(中略) また、以下のプラグイン・モジュールは、非推奨として扱われているため、マニュアル及びヘルプは、提供されません。

* llmod3 -> HSP3に対応した各種モジュールをご使用ください
* HGIMG / HGIMGX (3D描画用プラグイン) -> HGIMG3/HGIMG4をご使用ください
* HSPDX (2D描画用プラグイン) -> HSP3DISHをご使用ください

これらのプラグイン・モジュールは、コードが古くなっており、現行のWindows上での動作が保証されません。既存コードのコンパイル及び実行はサポートされますが、将来のバージョンでは対応されない可能性があります。

HSP3.5 アップデートガイド より


_HSP3 アップデートガイド (HSP3.6アップデートガイド)
4. パッケージの同梱終了について

これまでのフルセットに同梱されていたllmod3、HGIMG / HGIMGX (3D描画用プラグイン)/HSP3MT(ランタイム)/HSPLetパッケージは、同梱されません。 古いパッケージに含まれているランタイムを引き続き使用することは可能ですが、非推奨として扱われているため、マニュアル及びヘルプは、提供されません。

* llmod3 -> HSP3に対応した各種モジュールをご使用ください
* HGIMG / HGIMGX (3D描画用プラグイン) -> HGIMG3/HGIMG4をご使用ください
* HSPDX (2D描画用プラグイン) -> HSP3DISHをご使用ください
* HSP3MTランタイム -> hsp3utfやhsp3_64をご使用ください
* HSPLetランタイム -> HSP3Dish(html5)をご使用ください

これらのプラグイン・モジュールは、コードが古くなっており、現行のWindows上での動作が保証されません。 既存コードのコンパイル及び実行はサポートされますが、将来のバージョンでは対応されない可能性があります。

HSPDXプラグインは、古くからの利用者も多く現在のシステムでも実行可能なため、プラグインファイル自体は同梱されていますが、新規で使用することは推奨されません。

HSP3 アップデートガイド より


HSP 3.5 以降は、hspdx.dll と hspdx.as はかろうじて同梱されているものの、HSPDX のヘルプファイルやマニュアルページは同梱されてない。そのあたりが欲しかったら、HSP 3.4 (hsp34a.zip) を入手するか、hspdxfix を別途入手して HDP3.x のインストールフォルダにコピーしないといけない。

_HSP3.4でのセキュリティソフト誤認識について(技術情報)
_HSPDXFIX for HSP2.6x&3.x Ver 0.19c 2007/06/19 - ソフトウェアダウンロードコーナー

それにしても、「HSP3DISHを使え」と言われても…。HSP3DISHではスクリーンセーバを作れないから他のプラグインを検討してるわけで…。 *1

注意点その2 :

HSPは実行ファイル(.exe)を作れるけれど、拡張プラグインと呼ばれる .dll を利用している場合、作成した .exe と同じ場所に .dll を置いておかないといけない。hspdx.dll や hspdxfix.dll も拡張プラグインなので、生成した .exe と同じ場所に hspdx.dll or hspdxfix.dll を置いておくことになる。

もし、HSPDX を使ってスクリーンセーバを作った場合、利用者に対して、スクリーンセーバと同じ場所に hspdx.dll も置くことも要求しないといけない。それはちょっとアレだなと…。

ちなみに、HGIMG3 や hsp3dish は、拡張プラグインとは別の扱いらしい。HSP で生成した .exe の中に、おそらく HGIMG3 や hsp3dish の機能も含めてくれるようで、別途 .dll を置いておく必要はない。

注意点その3 :

HSPDX を使うには、MSVCR71.DLL が必要らしい。作者様のサイトで配布されているようなので、入手して hspdx.dll と一緒に配布したほうがいいのかもしれない。

_ソフトウェアダウンロードコーナー

自分の環境、Windows10 x64 22H2 の場合、C:\Windows\SysWOW64\ 以下に msvcr71.dll が入っていた。タイムスタンプは 2003/02/21。ファイルバージョンは 7.10.3052.4 になっていた。

HSPDXの動作確認をした :

HGIMG3 は、hgrotate や hgrect を使った際、奇数サイズが偶数サイズになってしまうけれど、同じことを HSPDX で行ったらどうなるのか確認してみた。環境は Windows10 x64 22H2 + HSP 3.7 beta 7。

hspdx_es_excopy_ss.png


以下は8倍に拡大した図。

hspdx_es_excopy_ss_x8.png


HSPDX は、奇数サイズはちゃんと奇数サイズで描画してくれる模様。描画速度に関してはまだ調べてないけれど、少なくとも見た目に関しては、HGIMG3 より真っ当な描画結果を返してくれるようだなと…。

検証に使ったソースと画像は以下。.

_01_hspdx_es_excopy.hsp
_tex_image.zip (tex.bmp, tex.png を入れてあるので解凍して利用)

ウインドウモードの動作について :

HSPDX は、es_screen命令を使って、フルスクリーンモードかウインドウモード(ウインドゥモード)を指定できるけれど、ウインドウモード時のサイズ指定が反映されないことに気づいた。

初期ウインドウサイズ(640x480)より小さいサイズを ―― 例えば 512x288等なら指定が反映されるけど。初期ウインドウサイズより大きいサイズを ―― 例えば 1280x720 を指定しても無視されてしまって、初期ウインドウサイズの中に指定したサイズが縮小表示されてしまう状態になった。描画内容が妙に小さくなってしまったので、最初は結構焦った…。

でもまあ、ドキュメント(HSPDXFIX.TXT)内で以下の記述があるので…。
このモードを使用することにより、デバッグをよりスムーズに行うことができますが、フルスクリーンモードでの動作に比べていろいろと制約があり、環境によってはパフォーマンス面で HSPの標準ウィンドウでの動作とほとんど変わらないことがあるため、デバッグ専用のモードだと割り切って使用した方がよいでしょう。

HSPDX は、あくまでフルスクリーン描画を前提としたプログラムを作るためのプラグイン、と思っておいたほうがいいのかもしれない。

フルスクリーンモードが不安 :

Windows10 x64 22H2上でフルスクリーンモードを試してみたけれど、画面が出てくるまで妙に時間がかかる…。終了時も即座に終了せず、結構待たされる…。

DirectX等でフルスクリーンモードに切り替えると、デスクトップ上のアイコンの位置が盛大に変わってしまう問題が起きたりもするので、フルスクリーンモードへの変更は、ちと怖い…。

*1: いやまあ、「今時スクリーンセーバ作るヤツなんて居ねえだろ」と思われてる可能性もありそうだけど。スクリーンセーバをまだ比較的簡単に作れそうだから、あえてわざわざHSPを使おうとしているわけで…。スクリーンセーバにしないで、単にデモプログラムの類を作るなら、HSPじゃなくて別言語+別ライブラリを選んだほうがいい…。HSPの言語仕様は正直ツラいものがあるので…。

2023/11/29(水) [n年前の日記]

#1 [hsp] HSPDXのウインドウモードで大きいサイズが指定できた

HSP で DirectX を利用して描画できる拡張プラグイン、HSPDX (HSPDXFIX) について、まだ色々調べている。

HSPDXのウインドウモードのサイズ指定について :

昨日実験していた際は、HSPDX で、es_screen を使ってウインドウモードのサイズ指定をしようとしても、初期ウインドウより大きくできなかったのだけど。大きいサイズの別ウインドウを screen 命令で新規作成してから es_screen を呼んだところ、その新規作成された大きいウインドウを描画ウインドウとして利用できることが分かった。

ということは…。screen 命令で、初期ウインドウID=0 を目的のサイズに変更してから、es_screen で設定しても、狙ったサイズにできそうな気もする…。試してないけど。

また、HSP は bgscr 命令を使えば枠無しウインドウを新規作成することができるので…。デスクトップサイズと同じサイズの「枠無し」ウインドウを新規作成しつつ、(0, 0) の位置に表示するようにしてやれば、フルスクリーンモードに切り替えなくても、ウインドウモードのままで、フルスクリーン表示をしているように見せかけることができると分かった。

そんなわけで、そのあたりを反映させたソースは以下のようになった。

_01_hspdx_es_excopy2.hsp
    ; HSPDX es_excopy sample 2
    ; ウインドウモードをフルスクリーンモードのように見せかける
    ; Window ID=2 を描画対象にしている
    ;
    ; 2023/11/29, use HSP 3.7 beta 7, Windows10 x64 22H2
    
    #include "hspdx.as"
    
    #packopt name   "01_hspdx_es_excopy2"   ; file name
    #packopt type   0       ; generate ".exe"
    
    #define TEXFILE     "tex.bmp"
    #pack   TEXFILE
    
    #define KB_ESC      $00080
    
    ; 以下の行をコメントアウトするとウインドウモードになる
    #define FULLSCR
    
    ; hspdx.dllが存在するか確認
    exist "hspdx.dll"
    if strsize < 0 {
        dialog "Not found hspdx.dll"
        end
    }
    
#ifdef FULLSCR
    ; get desktop size
    wdw_w = ginfo_dispx
    wdw_h = ginfo_dispy
    ; scmode = 0              ; set fullscreen
    scmode = 1              ; set window mode
    use_d3d = 1
#else
    ; wdw_w = 512
    ; wdw_h = 288
    wdw_w = 1600
    wdw_h = 900
    scmode = 1              ; set window mode
    use_d3d = 1
#endif

    ; 最初に作られる Window ID=0 を非表示にする
    gsel 0, -1
    
    actid = 2   ; Window ID=2 を表示ウインドウにする
    
#ifdef FULLSCR
    ; フルスクリーン相当。枠無しウインドウを作成
    bgscr actid, wdw_w, wdw_h, 0, 0, 0, wdw_w, wdw_h
#else
    ; ウインドウモード。通常のウインドウを作成
    screen actid, wdw_w, wdw_h, 0, 20, 20, wdw_w, wdw_h
#endif
    
    es_ini              ; initialize HSPDX
    onexit *job_end
    
    es_screen wdw_w, wdw_h, 32, 0, scmode, use_d3d
    if stat == 1 {
        dialog "Error : DirectX initialization failed."
        end
    }
    if stat == 2 {
        dialog "Error : Screen initialization failed."
        end
    }
    
*start
    ; load texture image file
    buffer 5, 256, 256
    picload TEXFILE
    
    texid = 0
    es_buffer texid, 0  ; copy buffer to VRAM
    if stat {
        es_bye
        wait 100
        dialog "Error : Not enough VRAM."
        end
    }
    
    gsel actid, 1           ; Activate window
    es_cls                  ; screen clear
    es_sync (1000/60), 1    ; wait
    wait 100
    
    font "Tahoma", 16, 1
    
    tt = 0
    k = 0
    x = double(wdw_w / 2)
    dx = double(wdw_w) / double(60 * 3)
    now_fps = 0
    
*mainloop
    ; get fps
    es_getfps now_fps
    ; title strf("%d/50 FPS", now_fps)
    
    stick k, 0                      ; chekc keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    x += dx
    if x <= 0.0 or (x + 16.0) >= wdw_w {
        ; flip direction
        dx *= -1
    }
    
    ; draw start
    gsel actid
    es_cls $40, $80, $c0        ; screen clear
    
    ; draw image
    gmode gmode_rgb0, 16, 16
    pos int(x), 10
    es_copy texid, 0, 0, 16, 16
    ; es_excopy texid, 0, 0, 16, 16, 64, 64
    
    repeat 8
        ; draw image
        px = 0
        py = 40 + (16 + 2) * cnt
        sx = 0      ; source x, y
        sy = 0
        sw = 16     ; source width, height
        sh = 16
        dw = 14 + cnt   ; dest width, height
        dh = 16
        gmode gmode_rgb0, sw, sh
        objsize dw, dh
        pos px, py
        
        ; es_zoom texid, sx, sy, sw, sh, dw, dh
        es_excopy texid, sx, sy, sw, sh, dw, dh
        
        ; box fill
        px = px + dw + 2
        gmode 0, sw, sh
        color 32, 32, 32
        pos px, py
        es_boxf px, py, px + dw - 1, py + dh - 1
    loop
    
    pos (wdw_w / 2) - (16 * 4), 0
    color 255, 255, 255
    es_fmes strf("%d/60FPS", now_fps)
    
    es_sync (1000/60), 1    ; draw and wait
    tt = stat
    await 1
    goto *mainloop

*job_end
    es_bye
    end

使用画像は以下。

_tex_image.zip

余談 :

ここまで調べてみたものの。HSPDX を利用するためには、以下を要求されるわけで…。
  • hspdx.dll を .exe (あるいは .scr) と同じ場所にコピーしてもらわないといけない。
  • MSVCR71.DLL を、もしかすると Windows のシステムフォルダにコピーしてもらうことになるかもしれない。
この2点を鑑みつつ、最終的にはスクリーンセーバにしたいことを考えると…。描画結果に難はあるけれど HGIMG3 を利用したほうがまだマシだろうかと思えてきた。スクリーンセーバをインストールする際の手間暇は極力少ないほうがいいだろう…。HGIMG3 で作れば、scrファイル1つをコピーするだけでインストールが済むだろうし…。

もっとも、今時スクリーンセーバを作ってみたところで、そんなものを一体誰が使うのかと考え始めると…。どうせ誰も使わないだろうから自分の環境でひとまず動いてるならそれでいいのではないか、配布やインストールの手間暇まで考えなくてもいいのでは、などと思えてきたりもして。

hsp3dish を使ってスクリーンセーバを作れたら、このあたり悩まずに済むのだろうけど。何か裏技(?)が無いものか。

#2 [hsp][prog] テキストエディタ Mery のHSP用設定をカスタマイズした

今現在、HSPのスクリプトソースを書く際には、Mery (3.6.1, x64) というエディタを利用させてもらっている。Ctrl + Space で単語補完ができる点がありがたい。いやまあ、VSCode (Visual Studio Code) も単語補完ができるから、そちらを使ってもいいのだけど、VSCode に比べたら Mery は動作が軽いので…。

_「Mery」の記事一覧 - Haijin Boys Online
_MeryWiki
_「Mery」フリーの高機能テキストエディター - 窓の杜

ただ、この Mery、HSPDX の各命令については色付け表示してくれないので、そのあたりをカスタイマイズしてみた。

構文ファイルをカスタマイズ :

Mery で HSPのソースを開いた際、表示 → 編集モード、が「HSP」になる。その、表示 → 編集モード、で、一番下の「編集モードの設定」を選べば、各言語の構文ファイルの一覧が表示される。

mery_hsp_msy_ss01.png


「HSP」を選んで、「プロパティ」ボタンをクリックすれば、構文ファイルの内容を修正できる。ちなみに、構文ファイルの拡張子は、.msy らしい。

mery_hsp_msy_ss02.png


不足している単語を一つ一つ追加していってもいいのだけど…。とりあえず、hsp.msy としてエクスポートして、HSPDX関連の命令を追加してみた。

_hsp.msy

これをインポートして、「上書き」してしまえば、HSPDX の命令にも対応する。たぶん。

mery_hsp_msy_ss03.png

mery_hsp_msy_ss04.png


元に戻したい時は、「リセット」をクリックして、「既定にリセット」をチェックして「HSP」を選んで「OK」をクリックすればいい。

mery_hsp_msy_ss06.png

mery_hsp_msy_ss05.png


ちなみに、オリジナルの内容をエクスポートしたら以下の内容だった。

_hsp.orig.msy.txt

補完用ファイルもカスタマイズ :

補完ファイルについてもメモしておく。Mery は、インストールフォルダ\Ext\ フォルダ内の hsp.txt を読み取って、HSPソースを開いている際の単語補完をしているようなので、hsp.txt に単語を追加しておけば、その追加した単語でも補完が効くようになるはず。たぶん。

一応、以下に修正したファイルを置いておく。最後のあたりに追加されている、es_ から始まる文字列が追加した単語群。

_hsp.txt

余談 :

ここまでメモしておいてなんだけど。HSP 3.5 以降は HSPDX の利用が非推奨になっているので、本来なら HSPDX の各命令の色分け表示や、単語補完にまで対応させる必要は無いはずで…。

でもまあ、どうしても HSPDX を使いたい場合は、上記のようにカスタマイズできますよ、ということで…。

2023/11/30(木) [n年前の日記]

#1 [cg_tools] InkscapeにExtensionを追加する手順を再度メモ

WindowsやLinux上で、無料で利用できるドローソフト、Inkscape について。

_Draw Freely | Inkscape


Inkscape 0.92.3 を使っていた頃に、ユーザエクステンション(拡張機能, Extension)をインストールする手順を少しメモしていたのだけど。

_mieki256's diary - InkscapeにExtensionを追加する手順をメモ

現行版 Inkscape 1.3 x64 を使って、そのあたりの動作確認をしていたら、「エクステンション管理」を使うとインストール作業が楽になることを今頃知ったので、とりあえずメモしておく。

環境は、Windows10 x64 22H2 + Inkscape 1.3 x64。

ユーザエクステンションフォルダの場所 :

ユーザエクステンションが入る場所は、以下で確認できる。

Inkscape を起動して、編集 → 環境設定、を選ぶ。

inkscape_ext_ss01.png


システム、を選択。ユーザーエクステンションという項目に、場所が表示されてる。右のほうの「開く」ボタンをクリック。

inkscape_ext_ss02.png


エクスプローラが起動して、ユーザーエクステンションの保存場所が開かれる。

inkscape_ext_ss03.png


手作業でユーザエクステンションをインストールしていく時は、このフォルダの中に各ファイルをコピーしていけばいい。

手作業でインストールする手順 :

順番がちょっと逆になるけど、手作業でインストールする手順をメモしておく。後述の「エクステンション管理」機能を経由してインストールができるなら、そちらを使ってインストールしたほうがはるかに楽。

今回は、「Mirror」というエクステンションをインストールしてみる。これは、任意の直線を基準にして、図形を対称になるように移動/変形してくれる拡張機能。

_Mirror - Inkspace(Inkscapeのギャラリー) | Inkscape


ページを開くと下向きの矢印ボタンがあるのでクリックすると、zipファイルをダウンロードして入手できる。2023/11/30 の時点では、mirror_It7es4K.zip が得られる。

inkscape_ext_ss04.png


mirror_It7es4K.zip が入手できた。これをエクスプローラで開く。ちなみに、Windows10 x64 22H2 のエクスプローラは、zipファイルの中を覗ける機能を持っている。

inkscape_ext_ss05.png


zipファイル内には、Inkscape のバージョンに合わせたフォルダ群が入っていた。今回は Inkscape 1.3 で使いたいので、比較的バージョンが近い v1.2 をダブルクリック。

inkscape_ext_ss06.png


mirror.inx, mirror.py の2つのファイルが入ってる。両方選択して右クリック。メニューの中から「コピー」を選ぶ。

inkscape_ext_ss07.png


ユーザエクステンション保存フォルダの中で、右クリック。メニューの中から「貼り付け」を選ぶ。

inkscape_ext_ss08.png


mirror.inx と mirror.py が、ユーザエクステンション保存フォルダの中にコピーされた。ちなみに、何かフォルダを作っておいて(この場合は「Mirror」とか)、その中に入れたほうが管理は楽かもしれない。フォルダの中に入れてあっても Inkscape 上で反映される。

inkscape_ext_ss09.png


この状態で Inkscape を再起動すれば、追加したユーザエクステンションが、エクステンションメニュー内で項目として追加される。


一応、Mirror エクステンションの使い方もメモしておく。
  1. 図形と、対称線になる線分を作っておく。
  2. 図形をクリックして選択してから、対称線を Shift + クリックして、複数選択。
  3. エクステンション → パスの変形 → Mirror、を選択。

inkscape_ext_ss10.png


対称線を基準にして、図形が移動した。

inkscape_ext_ss11.png

エクステンション管理を使ってインストール :

上記では手作業でインストールしたけれど、「エクステンション管理」を使ってインストールできるなら、そちらを使ったほうが簡単。

今回は、「Guide Creation Tools」という拡張をインストールしてみる。コレを使うと、色々な種類を選んでガイドを作成できる。

_Guide Creation Tools - Inkspace the Inkscape Gallery | Inkscape


エクステンション → エクステンション管理、を選択。エクステンション管理のウインドウが表示される。

inkscape_ext_ss12.png


  1. Install Packages を選択。
  2. 検索入力欄に単語を入力。「guide」と打ち込んで Enterキー。
  3. 「Guide Creation Tools」がリストアップされたので、クリックして選択。
  4. 「Install Package」ボタンをクリック。

inkscape_ext_ss13.png

もし、拡張の詳細を知りたい時は、拡張名を選択した状態で、左下の「Details and Comments」をクリックすれば、Inkscape公式サイトの該当ページがWebブラウザで表示される。


「Guide Creation Tools」がインストールされた。

inkscape_ext_ss14.png

ちなみに、この画面で該当項目をクリックして選択して、右下の「Uninstall Package」をクリックすれば、アンインストールすることもできる。


Guide Creation Tools の使い方もメモしておく。何か図形を選択した状態で、エクステンション → ガイド → Guide Creation Tools、を選択。

inkscape_ext_ss15.png


設定ダイアログが表示される。ここでは「プリセット」の中から「Centered」を選んで、「適用」をクリックしてみた。

inkscape_ext_ss16.png


選んでいた図形の中心線になるようなガイドが作成された。

inkscape_ext_ss17.png

#2 [hsp] hsp3dishでスクリーンセーバを作れないか再度挑戦したがダメだった

HSP の hsp3dish を使ってスクリーンセーバを作れないものかと考えていたけれど、名案(?)が閃いたので、再度試してみた。

結果を先に書くと、やっぱりダメだった。

環境は、Windows10 x64 22H2 + HSP 3.7 beta 7。

経緯 :

以前、hsp3dish を使ってスクリーンセーバが作れるのか実験してみたけれど、その時の実験は失敗に終わった。

HSPの標準機能を使ってスクリーンセーバを作成する場合、フルスクリーン表示モードにおいては、以下のような状態で作ることになっている。
  • HSP起動時に作られるウインドウID0には一切手を触れない。
  • 表示ウインドウID2を新規作成して、そのウインドウID2に描画していく。
そういう仕組みにしておくことで、Windows用のスクリーンセーバに求められる細かい仕様は、HSP側でイイ感じに処理してくれるのだろう。たぶん。

しかし、hsp3dish は、表示ウインドウが必ず1つであることを強制する上に、必ずウインドウID0に描画するという制限がある。ウインドウID2が作れないし、ウインドウID2に描画していくこともできない…。

hsp3dishを使って、ウインドウID0をデスクトップサイズに変更して描画してみたが、一見それらしく表示されたものの、通常のスクリーンセーバのようには動作してくれなかった。マウスを動かしても、キーボードを叩いても、終了してくれない。これではスクリーンセーバにならない。

と、ここまでが前回の実験結果だった。

そこでふと、自前でキー押しやマウスカーソル移動を判定して、自分で勝手に終了してしまえばいいのではないかと思いついた。

また、多重起動禁止も盛り込んでおいた。と言うのも、Windowsのスクリーンセーバは多重起動されてしまう時があるらしいので…。このあたりも、HSP側がイイ感じに処理してくれないだろうから、自前で処理しなければならない可能性がある。

そんなわけで、それで上手くいくのか、実験をしてみたのだけど…。

ソース :

実験に使ったソースは以下。

_ssstarh3d.hsp

使用画像は以下。

_star.png
_preview.png

動作させると以下のような画面になる。昔のWindowsに標準で入ってた「宇宙飛行」みたいなソレ。

ssstarh3d_scr_ss01.png

結果 :

この実験も失敗に終わった。

フルスクリーン表示モードは、一見それらしくなってるし、何かのキーを押すか、マウスを動かせば終了するようになったのだけど。

Windows10の、「スクリーンセーバーの変更」ウインドウで、hsp3dish を使って作ったスクリーンセーバを選んだところ、ウインドウ内の小さな窓に収まるようにプレビュー画像を表示することができなかった。別ウインドウが表示されてしまって、その中にプレビューが表示されてしまう。

ssstarh3d_scr_ss02.png

HSPの標準機能を使ってスクリーンセーバを作る場合は、「スクリーンセーバーの変更」から与えられたウインドウハンドルに従って、ウインドウID0が小さな窓に収まるようにサイズその他が調整されるのだけど…。

hsp3dish を使った場合は、与えられたウインドウハンドルも、ウインドウハンドルから得られる情報もガン無視して、いつものように通常ウインドウを表示してしまうのだろう…。

そんなわけで、HSp 3.7 beta 7 の時点では、hsp3dish を使ってWindows用のスクリーンセーバは作れない ―― そう断言してもいいのかもしれない。無念。

多重起動禁止について :

多重起動禁止処理については、以下のページが参考になった。

_二重起動の防止(1) - Advanced HSP
_HSP講座 - プログラ広場 (mutex.as)

Windows の kernel32.dll が持っている、CreateMutex関数を利用することで、多重起動しているかどうかを判別できるので、ソレを使って多重起動禁止処理が作れるらしい。

紹介されているソースをコピペさせてもらって、手元でも動作確認してみた。

_test_createmutex_b.hsp
; 多重起動禁止テストその2
;
; 二重起動の防止(1) - Advanced HSP
; http://chokuto.ifdef.jp/advanced/singleton1.html    
;
; 2023/11/30, Windows10 x64 22H2 + HSP 3.7 beta 7

#packopt name "test_createmutex_b"  ; filename
#packopt type 0     ; generate ".exe"

; 多重起動をチェックするためのミューテックスオブジェクト名を定義。
; アプリ固有の名前であること。
#define MUTEX_NAME  "HSP_WinAPI_Test_Mutex"

; ----------------------------------------
; アプリケーションの起動チェックを行うモジュール
#module

#uselib "kernel32.dll"
#cfunc CreateMutex  "CreateMutexA" int, int, sptr
#cfunc GetLastError "GetLastError"
#func  CloseHandle  "CloseHandle"  int

#define ERROR_ALREADY_EXISTS    183

; アプリがすでに起動されているか取得する関数
#defcfunc AlreadyAppRunning str name
    if (hMutex == 0) {
        ; 名前付きミューテックスオブジェクトの作成
        hMutex = CreateMutex(0, 0, name)

        ; オブジェクトがすでに作成されていたかどうかの判別
        if (GetLastError() == ERROR_ALREADY_EXISTS) {
            ; すでに同じ名前のオブジェクトが存在する
            alreadyRunning = 1
        } else {
            ; オブジェクトが新しく作成された
            alreadyRunning = 0
        }
    }
    return alreadyRunning

; クリーンアップ処理(終了時に自動実行)
#deffunc CleanupAppRunChecker onexit
    if (hMutex != 0) {
        ; ミューテックスオブジェクトハンドルのクローズ
        CloseHandle hMutex
        hMutex = 0
    }
    return

; ----------------------------------------
#global

*start
    if (AlreadyAppRunning(MUTEX_NAME)) {
        dialog "すでに起動されています。"
        end
    }

    mes "二重起動してしません。"
    stop

生成された .exe を最初に実行すると以下のような表示になる。

test_createmutex_b_ss01.png


その状態で、同じ .exe をまた実行すると、以下のような表示になる。OKボタンをクリックすれば終了する。

test_createmutex_b_ss02.png


たしかに、多重起動禁止が実現できた。

マウスカーソル座標の取得 :

デスクトップ上のマウスカーソル座標の取得でちょっとハマったのでメモ。

HSP の場合、ginfo_mx, ginfo_my で、デスクトップ上のマウスカーソル座標が得られる。

当初、mousex, mousey でマウスカーソル座標を取得しようとしたのだけど。これはアプリウインドウ内にマウスカーソルがある場合に、アプリウインドウ内のマウスカーソル座標を取得できる変数だった。アプリウインドウの外でマウスカーソルを動かして、反応しないな、おかしいなと悩んでしまった…。

以上、30 日分です。

過去ログ表示

Prev - 2023/11 - 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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project