mieki256's diary



2018/12/19(水) [n年前の日記]

#1 [gimp] GIMP 2.6.12 Portableをインストールして試行錯誤中

GIMP 2.6.12 Portable版を Windows10 x64上にインストールして、Python-Fu を動かせる状態にできないか実験中。

今時 GIMP 2.6.x をあえて動かす必要性は無いだろう、とは思うけど。一応メモ。

実験してる理由。 :

自分のメインPC、Windows10 x64 日本語版には、バージョンの異なるGIMPが複数インストールしてあって。
  • GIMP 2.6.12 通常セットアップ版
  • GIMP 2.8.x Portable
  • GIMP 2.10.x Portable
GIMP 2.6.x で Python-Fu を動かすためには、通常セットアップ版をインストールするしかなく。2.6 が通常セットアップ版なので、2.8 や 2.10 と共存させるためには、2.8 と 2.10 は Portable版をインストールしないといけない。

しかし、それはそれで問題が。GIMP Portable は32bit版のGIMPなのだけど、昨今の GIMP 2.10.x 32biti版は、日本語版 Windows上で動作させると数値入力欄やテキスト入力欄でキー入力ができないという、結構致命的なバグがあって。

_English input not accepted from Japanese keyboard (#2654) - Issues - GNOME / GIMP - GitLab
_Japanese input broken with glib 2.56 on Windows 32-bit (#1421) - Issues - GNOME / GLib - GitLab

これは、GTK+ 32bit版、glib (libglib-2.0-0.dll) に起因するバグらしく。64bit版なら不具合は発生しないのだけど、32bit版だけ、ずっとバグが取れてない状態で…。このあたり、GIMPに限った話ではなく、例えば GTK+ を使っている Geany というエディタでも発生してる問題で。

_Geany 1.31のWindowsにおける文字入力か表示の不具合 - 借りてきた猫のように静か

なので、せめて GIMP 2.10 だけは、64bit版を使いたい。となると、通常セットアップ版を選ぶしかなく。

しかし、GIMP 2.10 通常セットアップ版をインストールすると、GIMP 2.6.12 通常セットアップ版が強制的にアンインストールされてしまう。GIMP 2.6 でしか動かないプラグインがあったりするし、GAP (GIMP Animation Package) も GIMP 2.6用のバイナリしか無い状態だったりするので、できれば GIMP 2.6 も残しておきたい。 *1

そこでふと、GIMP 2.6 Portable 版でも Python-Fu が動かせれば、GIMP 2.6 を Portable版に、GIMP 2.10 を通常セットアップ版にできるなと。

しかし、GIMP 2.6 Portable 上で Python-Fu を動かすことはできるのだろうか…。てなわけでそのあたりを実験しているのだけど、これが上手くいかない。

動かせていた事例もあるらしい。 :

以下のやり取りを眺めた感じでは、GIMP 2.6.11 Portable 上で Python-Fu を動かせていた事例もあるらしい。

_How can you get python to function on the PortableApps version of Gimp - GIMP Chat

手順としては、たぶんこんな感じだろうか。
  1. Python 2.6.x をインストールしておく。
  2. pygtk-all-in-one-2.24.2.win32-py2.6.msi をインストールしておく。
  3. GIMP 2.6.x 通常セットアップ版を仮で一旦インストールしておく。その際、「GIMP Python extension」もインストールしておく。
  4. GIMP 2.6.x Portable版をインストールする。
  5. Protable版インストールフォルダ\App\gimp\ 以下に、Python 2.6 のインストールフォルダを、Python というフォルダ名でコピー。
  6. 通常版インストールフォルダ\lib\gimp\2.0\environ\*.env を、Portable版\App\gimp\lib\gimp\2.0\environ\ にコピー。
  7. 通常版インストールフォルダ\lib\gimp\2.0\interpreters\*.interp を、Portable版\App\gimp\lib\gimp\2.0\interpreters\ にコピー。
  8. Portable版\App\gimp\lib\gimp\2.0\interpreters\pygimp.interp を編集。python= の行と、/usr/bin/python= の行の右側を、Portable版\App\gimp\Python\\pythonw.exe に変更。
  9. 通常版\lib\gimp\2.0\plug-ins\ の中の .py ファイルを、Portable版\App\gimp\lib\gimp\2.0\plug-ins\ にコピー。
  10. 通常版\lib\gimp\2.0\python フォルダを、Portable版\App\gimp\lib\gimp\2.0\ 以下にコピー。
しかし、手元の環境、Windows10 x64 + Python 2.6.6 + GIMP 2.6.12 Portable では成功しなかった。フィルタ → Python → コンソールを選んでも、何も表示されない。該当メニューが出てくるあたり、ちょっと動きそうな気配は感じたのだけど…。

ちなみに、GIMP 2.6 通常セットアップ版では、以下の手順で Python-Fu が使えるようになるらしい。

_Installing Python for GIMP 2.6 (Windows) - Tutorials - gimpusers.com

gimp-painter- で Python-Fu を動かせていた事例もあるようで。

_the GIMP 2.6 + gimp-painter- readme
Pythonサポートを有効にするには、gimp-painter-\gimp\lib\gimp\2.0\pythonフォルダ内の

_gimpenums.pyd、 _gimpui.pyd、
gimp.pyd、
gimpcolor.pyd、
gimpthumbs.pyd
(その他、拡張子.pydのファイルがあれば全て)

をPythonのインストール先にある
Lib\site-packagesフォルダ
にコピーし、
gimp-painter-\gimp\lib\gimp\2.0\interpretersフォルダ内の
pygimp.interp
をテキストエディタなどで開き、
"python="と"/usr/bin/python="の右側をご自分の環境に合わせて修正してください。

ftp://ftp.jaist.ac.jp/pub/sourceforge.jp/gimp-painter/33685/readme_jp.xhtml the GIMP 2.6 + gimp-painter- readme より

これも試してみたけれど、ダメだった…。

gimp-painter- をインストールしたりして色々試しているうちに、GIMP 2.6.12 通常セットアップ版のPythonコンソール上で、文字入力ができなくなってることに気づいた。Enterキーだけは受け付けるけれど…。元からこういう状態だったのか、それとも色々試しているうちにこうなったのか…。

*1: 一応、GIMP 2.6用 GAP のバイナリを GIMP 2.8 にインストールしても、基本機能に関してはそこそこ動くのだけど、全ての機能が使えるわけではないらしい。全機能を使いたいなら、GIMP 2.6 が必要になりそう。

2017/12/19(火) [n年前の日記]

#1 [love2d] love2dのShaderで円柱っぽいBG描画を試したり

昔、 _DXRubyのShader機能で円柱だかパイプだかっぽいBG描画を試した ことがあったのだけど。それを love2d でもやれないものかなと思えてきたので試したり。環境は Windows10 x64 + love2d 0.10.2。

こんな感じに。

shader_test09_pipe_ss01.gif

shader_test09_pipe_ss02.gif

何かビミョーにおかしいような気もするけど…。まあ、それっぽくなってるから、いいか…。でも、考え方、あるいは計算式が間違ってる可能性も否定できず。

画像とソース。 :

画像は以下。

_grid_bg_640x640.png
_scifi_bg_640x640.png

ソースは以下。

_conf.lua
function love.conf(t)
  t.window.title = "Shader test 09 pipe"
  t.window.vsync = true
  t.window.resizable = true
  t.window.width = 640
  t.window.height = 480
  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- Shader test 09 pipe

function love.load()
  love.graphics.setDefaultFilter("nearest", "nearest")
  scr_w, scr_h = 640, 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)

  img = love.graphics.newImage("grid_bg_640x640.png")
  -- img = love.graphics.newImage("scifi_bg_640x640.png")
  img:setFilter("linear", "linear")

  -- make shader
  local shadercode = [[
    extern number scr_dist;
    extern number r;
    extern number angle_max;
    extern number start_x;
    extern number start_y;

    vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ) {
      float sx = texture_coords.x - 0.5;
      float sy = texture_coords.y - 0.5;
      float pz = r * cos(atan(sy, scr_dist));
      float u = sx * pz / scr_dist;
      float v = atan(sy, scr_dist) / angle_max;
      texture_coords.x = mod(u + 0.5 + start_x, 1.0);
      texture_coords.y = mod(v + 0.5 + start_y, 1.0);
      vec4 texcolor = Texel(texture, texture_coords);
      return texcolor * color;
    }
  ]]
  myshader = love.graphics.newShader(shadercode)
  local scr_dist = 0.6
  myshader:send("scr_dist", scr_dist)
  myshader:send("r", scr_dist + 0.3)
  myshader:send("start_x", 0.0)
  myshader:send("start_y", 0.0)
  myshader:send("angle_max", math.atan2(0.5, scr_dist))

  v = 0.0
  px = (scr_w - img:getWidth()) / 2
  py = (scr_h - img:getHeight()) / 2
end

function love.update(dt)
  v = v + dt
  myshader:send("start_x", v * 0.2)
  myshader:send("start_y", v * 0.4)
end

function love.draw()
  love.graphics.setCanvas(canvas)
  love.graphics.clear(0, 0, 0, 255)

  love.graphics.setColor(255, 255, 255)
  love.graphics.setShader(myshader)
  love.graphics.draw(img, px, py)
  love.graphics.setShader()

  love.graphics.setCanvas()

  -- draw canvas to window
  wdw_w, wdw_h = love.graphics.getDimensions()
  scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h))
  scr_ox = (wdw_w - (scr_w * scr_scale)) / 2
  scr_oy = (wdw_h - (scr_h * scr_scale)) / 2
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, scr_ox, scr_oy, 0, scr_scale, scr_scale)

  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
end

function love.keypressed(key, isrepeat)
  if key == "escape" then
    -- ESC to exit
    love.event.quit()
  elseif key == "f11" then
    -- toggle fullscreen
    if love.window.getFullscreen() then
      love.window.setFullscreen(false)
    else
      love.window.setFullscreen(true)
    end
  end
end

画像もソースも、License : CC0 / Public Domain ってことで。

Shader部分の仕組みというか考え方は、 _DXRuby版 と同じなのでそちらを参照してもらえればと。

余談。 :

HLSL にはatan2() があるけれど GLSL には atan2() が無くてどうしようと思ったら、GLSL の場合、atan() が atan2() 相当らしくて。 _GLSLをHLSLに書き換える - Qiita が参考になりました。ありがたや。ちなみに、件のページには atan(x,y) と書いてあるけど、たぶん atan(y,x) ではあるまいか。

今回、利用するテクスチャに linearフィルタを設定したら、見た目がちょっとマシになったように感じたり。処理内容によっては、その手のフィルタ設定が効果を発揮する場合もあるようだなと。

#2 [love2d] love2dのShaderでスカイドームっぽい描画を試したり

love2dのShaderで円柱だかパイプだかっぽい描画を試してるうちに、もうちょっとアレすれば某STGのスカイドームっぽい背景描画もできるんじゃないかと思えてきたので試したり。…スカイドームという呼び方で合ってるのかな。違うのかな。分からんけど。とりあえず、環境は Windows10 x64 + love2d 0.10.2。

こんな感じに。



ちょっと何をやってるか分かりづらいかな…。要は、1枚のテクスチャ画像を、以下のように歪めて描画する処理をしてるのだけど。

shader_test10_sphere_ss02.png

テクスチャをそのまま描画すると、2D絵を表示してますねー、てな印象しか受けないけれど。こういうことをすれば1枚絵でもビミョーに空間を感じられなくもない見た目にできる。かもしれない。みたいな。

ただ、考え方や計算式がこれで合ってるかどうかは自信無し…。この見た目で合ってるのかな…。どうなんだ…。

画像とソース。 :

使用画像は以下。

_star_bg_1024x1024.png

ソースは以下。

_conf.lua
function love.conf(t)
  t.window.title = "Shader test 10 sphere"
  t.window.vsync = true
  t.window.resizable = true
  t.window.width = 640
  t.window.height = 480
  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- Shader test 10 sphere

function love.load()
  love.graphics.setDefaultFilter("nearest", "nearest")
  scr_w, scr_h = 640, 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)

  img = love.graphics.newImage("star_bg_1024x1024.png")
  -- img = love.graphics.newImage("uvcheckermap01-1024.png")
  img:setFilter("linear", "linear")

  -- make shader
  local shadercode = [[
    extern number scr_dist;
    extern number r;
    extern number scale;
    extern number start_x;
    extern number start_y;

    vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ) {
      float sx = (screen_coords.x - (love_ScreenSize.x / 2)) / love_ScreenSize.x;
      float sy = (screen_coords.y - (love_ScreenSize.y / 2)) / love_ScreenSize.x;
      // float sx = texture_coords.x - 0.5;
      // float sy = texture_coords.y - 0.5;
      float ang_v = atan(sy, scr_dist);
      float ang_u = atan(sx, scr_dist);
      float pz = r * cos(ang_v);
      float qz = pz * cos(ang_u);
      float u = sx * qz / scr_dist;
      float v = sy * qz / scr_dist;
      texture_coords.x = mod((u + start_x) * scale + 0.5, 1.0);
      texture_coords.y = mod((v + start_y) * scale + 0.5, 1.0);
      vec4 texcolor = Texel(texture, texture_coords);
      return texcolor * color;
    }
  ]]
  myshader = love.graphics.newShader(shadercode)
  local angle_of_view = 60
  local scr_dist = math.cos(math.rad(angle_of_view/2))
  myshader:send("scr_dist", scr_dist)
  myshader:send("r", scr_dist + 0.1)
  myshader:send("scale", 0.4)
  myshader:send("start_x", 0.0)
  myshader:send("start_y", 0.0)

  ang_a = 0.0
  ang_b = 0.0
  px = (scr_w - img:getWidth()) / 2
  py = (scr_h - img:getHeight()) / 2
end

function love.update(dt)
  ang_a = ang_a + 10 * dt
  ang_b = ang_b + 16 * dt
  myshader:send("start_x", (1.0 - math.sin(math.rad(ang_a))))
  myshader:send("start_y", (1.0 - math.sin(math.rad(ang_b))))
end

function love.draw()
  love.graphics.setCanvas(canvas)
  love.graphics.clear(0, 0, 0, 255)

  love.graphics.setColor(255, 255, 255)
  love.graphics.setShader(myshader)
  love.graphics.draw(img, px, py)
  love.graphics.setShader()

  love.graphics.setCanvas()

  -- draw canvas to window
  wdw_w, wdw_h = love.graphics.getDimensions()
  scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h))
  scr_ox = (wdw_w - (scr_w * scr_scale)) / 2
  scr_oy = (wdw_h - (scr_h * scr_scale)) / 2
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, scr_ox, scr_oy, 0, scr_scale, scr_scale)

  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
end

function love.keypressed(key, isrepeat)
  if key == "escape" then
    -- ESC to exit
    love.event.quit()
  elseif key == "f11" then
    -- toggle fullscreen
    if love.window.getFullscreen() then
      love.window.setFullscreen(false)
    else
      love.window.setFullscreen(true)
    end
  end
end

ソースも画像も、License : CC0 / Public Domain ってことで。

処理の考え方。 :

考え方としては、テクスチャが貼ってある球の中から外を覗いている、てな状況と仮定して。

視線の向きについて、縦方向(垂直方向)の角度が a、横方向(水平方向)の角度が b、として…。

まず、横方向(水平方向)の角度が0度の状態で考えてみる。横方向から見た時の図は以下になる。

love2d_shader_sphere_about2.png
  • sz : 視点(0,0,0) から画面までの距離。
  • sy : 画面を通る直線のy値。
  • P : 球と交差する点。
  • pz : 球と交差する点のz座標。
  • a : 垂直方向の角度。
  • r : 球の半径。
a = atan(sy, sz)
pz = r * cos(a)

上から見た図で考える。球と交差する点 P は、半径 pz の円の上にあるはずだから…。

love2d_shader_sphere_about3.png
b = atan(sx, z)
qz = pz * cos(b)
これで、球と交差する点 P のz値、qz が得られた。

z値 pz と、画面上のx,y座標 sx, sy と、画面までの距離 sz が分かっているので、読み取るべきテクスチャ座標を求めることができる。
u = sx * qz / sz
v = sy * qz / sz

てな感じで求めたのだけど。球と直線が交差した点のz値を取得するあたりで、もっと簡単な方法がありそうな気もする…。

UVChecker-map画像について。 :

UVChecker-map画像は、以下で公開されてる画像を使わせてもらいました。ありがたや。この手の実験をする時はマジ助かるです。Public Domain 扱いになってる点もありがたい。

_Arahnoid/UVChecker-map: A collection of free images what can be used during unwrapping of 3D models

2016/12/19(月) [n年前の日記]

#1 [windows] Visual C++のランタイムについて調べていたのだけど

よく分からん…。

Windows10 x64 の C*\Windows\SysWOW64\ 内にある MSVCR120.dll だののバージョン番号を調べていたのだけど、そのあたりを最新版もしくは特定のバージョンで上書きする方法はあるのだろうかと気になってググり始めたり。

メインPCは 12.0.40649.5 が入ってるのだけど、先日 VMware Player 上にインストールした Windows10評価版では、12.00.21005.1 が入ってたりするわけで。もしかして後者のバージョンにしておいたほうが不具合は起きないのだろうかと。それとも新しければ新しいほうがいいのか。

一般的にはおそらく以下を入れればいいのだろうけど。

_Visual Studio 2013 の Visual C++ 再頒布可能パッケージ - 窓の杜ライブラリ
_最新版は、Visual C++ のダウンロードをサポートします。
_Download Visual Studio 2013 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Center

しかしコレ、Windows10は対象になってないのだよな…。試しにインストールしてみたけど、コントールパネル → プログラムのアンインストール、の一覧上では、12.0.30501 と表示されてる。

ググってるうちに、以下も見つけたりして。

_2013 の Visual C++ および Visual C++ の再頒布可能パッケージ用の更新プログラム (12.0.40649.5)
_2013 の Visual C++ および Visual C++ の再頒布可能パッケージ用の更新プログラム (12.0.40660.0)

すると一番バージョンが新しいのは、現時点では 12.0.40660.0 ということになるのかなと。

ということで試しに 12.0.40660.0 をインストールしてみちゃったのだけど。これで問題は起きないのだろうか…。

Visual Studio 2013 の Visual C++ ランタイムだけではなく、2012のランタイムも気になる。

_山市良のえぬなんとかわーるど: 1/13 以降、Visual C++ 2012 Update 4 の更新 KB3119142 が繰り返される問題 (解決)
_KB3119142問題に終止符を打つ: 部屋とバナナと私
_Microsoft Visual C++ 2012 Update 4 の再配布可能パッケージ用の更新プログラム
_Download Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Center

これも試しに 11.0.61030 をインストールして変更→修復までやってみたのだけど。どうも SysWOW64 以下が更新されてる気配が無くて。Windows10は対象外だよということで処理されてないのだろうか。

そのへん色々試したけど、相変わらず LibreOffice 5.2.3.3 が、msvcr120.dll で障害が起きてる的なイベントログを残す。どうすりゃいいんだ…。

Visual Studio の一部をアンインストールした。 :

複数の Visual Studio をインストールしてあるのがいかんのだろうかと思えてきたので、Visual Studio Community 2013 with Update 5 をアンインストール。Visual Studio Community 2015 は入ってるから、使いたくなったらそっちを使えばいいだろうと。

2015/12/19() [n年前の日記]

#1 [dxruby] キャラグラエディタを弄ってる

今まで、各処理を只のメソッドとしてずらずらと並べてたけど、もしかするとクラスを作ってその中にまとめたほうがいいのかなと。

例えばキャンバス関係の処理はキャンバスクラスを作ったほうがいいのだろうし、キャラ選択ウインドウはキャラ選択ウインドウクラスを作ったほうがいいのかもしれない。そんな感じでソースを変更中。

#2 [anime] ウルトラマンX、24時の回を視聴

素晴らしい。この回は素晴らしい。

一見笑える回のようでありながら、ウルトラマンと怪獣は一般市民の視点からはこう見えるであろう的カットが数カットさらりと挿入されていて唸ってしまったり。平成ガメラを見たときの感覚を思い出してしまった…。

Web上の感想を眺めていたら、人形になった怪獣を可愛がっている主人公と、地球人を○○して○○しようとしてる宇宙人の姿、その2つを重ねていたという指摘を目にして、「うわ…」てな気分になってきたり。本視聴時、ぼーっと見ていて気づかなかった…。考えさせられるというか、なかなかの皮肉というか。いや、最初の頃のウルトラマンもそういう脚本がチラチラあった気がするけど。こちらがやってることは正しく、相手がやってることは間違ってる。そういう思い込みを人間は持つけれど、本当にそうか? 実は同じことをしてるんじゃないのか? みたいなソレだよなと…。

2014/12/19(金) [n年前の日記]

#1 [dxruby] XAudio2についてググってたり

_DXRuby Advent Calendar 2014 ゲーム・プログラミングとサウンドについて を読んで、「Ayameってループ再生の開始場所を指定できなかったっけか?」と疑問が湧いて、検索を。

_DirectSoundサウンドドライバAyameを使ってみる を眺めたら開始場所を指定できると書いてあって一瞬喜んだのだけど、 _掲示板 - Project DXRuby にて、
Ayameさんはソースを見る限りループ機能が実装されておらず(インターフェイスだけはある)、

掲示板 - Project DXRuby より

という話を見かけてズコー。残念。

Ayame は DirectSound を使ってる、のであれば、DirectSound を使った別のサウンドドライバもあるのだろうな、と思ってググってみたら。そもそも Windows Vista 以降は DirectSound の利用は推奨されてなくて、XAudio2 を使おうぜ! という話になってると知り。てなわけで、そのへんググって、「うむ。何が何だかわからん」と嘆いてるところ。

_第8回〜oggファイルの読み込みとストリーミング再生〜 - 名古屋313の日記 によると、XAudio2 で ogg再生は可能ではあるらしい。もっとも、XAudio2 は PCM/ADPCM/xWMAしか扱えないらしいので…。その3つしかサポートしない、という話にすれば多少は実装が楽になるのかもしれないけど、手軽に音を鳴らすという目的からは外れていきそうな…。

#2 [nitijyou] 歩いて買い物に

雪があちこち積もっているので、自転車は無理だなと。歩いて買い物に。ホーマック、Seria(100円ショップ)、ヨークベニマルまで。

ホーマックで、超強力両面テープと布用両面テープを購入。Seriaで、大き目の画用紙やアルミホイルを購入。これで撮影ブースをもうちょっと改良できるはず。

#3 [pc] 撮影ブースを改良

目が覚めたら撮影ブースが崩壊してた。フツーの両面テープでは粘着力が弱過ぎてダンボールが剥がれてしまったらしい。仕方ないのでボンドでベタベタ接着し直し。

それと、100円ショップで買ってきた画用紙を下に引いた。これでようやく、それっぽい撮影ができる状態になったはず。

こんな感じの写真が撮れるようになった。PowerShot A300 で撮影したソレをそのまま置いてみたり。

_img_1213.jpg
_img_1219.jpg

どうも光量が足りなくて、Photoshop や GIMP でコントラスト調整等が必要っぽい感じではあるけど、それでも今までよりは全然マシな写真が撮れるようになった、ような気がする。

もっとも、この手の撮影をする機会がどの程度あるかというと、ビミョー。撮影ブースをバラして片づけよう…。

#4 [anime] PSYCHO-PASS2、最終回を視聴

面白かった…。

以下、ちょっとネタバレ入りで。

途中、こんな展開にして大丈夫なのかなと思ってたアレコレが、終わりのあたりで全部パタパタとひっくり返されていった印象。まるでオセロを見てるようだった。こうするためにアレを見せてたのか、なるほどなー、と感心してばかり。これならいくらでも続きを作れますわ…。

グロ表現が多過ぎると思ってたあたりも、作中で 一般市民にその映像を見せる展開が出てきたあたりで腑に落ちた。視聴者がちょっと引くぐらいの映像じゃないと、 作品世界の一般市民がソレを見て衝撃を受ける展開に説得力が出てこない。脚本を担当していた熊谷氏は、「その手の描写がストーリーに必要なら逃げずに描くべき」と以前どこかで力説していた記憶があるけど、なるほどこういうことなのですね、たしかにその通りだ、と納得。

シビュラシステムが単なる悪として描かれていたような気がしていたけれど、それが終盤で シビュラシステムの変化と繋がってくるわけで。自分、まんまとスタッフの手の平の上で踊らされてましたわ、みたいな。

なにはともあれ、面白かったです。素晴らしい。

2013/12/19(木) [n年前の日記]

#1 [dxruby][game] DXRubyと疑似乱数

_DXRuby Advent Calendar 2013 の 19日目です。

17日、18日目の記事は、GameKazuさんの、 _DXRubyでRPGを作る_DXRubyでRPGを作る(2) でした。自分、RPGは作ったことが無いので、大変勉強になりました…。

今回は、「DXRubyと疑似乱数」というお題で書かせていただきます。個人的に、前から少し気になってた部分なので、せっかくだからこの機会を利用して検証させてもらおうかなと。

「疑似乱数? DXRubyと関係ないじゃん」と思われる方もおられましょうが。 という流れで、全く関係ない話ではないよね? と。そんなわけで、大目に見てもらえればと。

とりあえず。 この流れで話を進めていこうかと。中級者以上の方は、「あーハイハイ。知ってる知ってる」と、全部読み飛ばしてしまってOKですよ。

最初に謝っておきます。やたらと長い記事になってしまってゴメンナサイ…。

それでは、初心者向けの解説から。

Q. 疑似乱数って何? :

A. 要するに、サイコロです。どんな数が出てくるのか予測できない数。でたらめな数。それを乱数と言います。「乱れた数」と書きますが、つまり、そこに、ルールだの法則だのが無いように見える数、ということですね。

ただ、コンピュータ上の乱数は、パッと見では乱数に見えますが、真の乱数ではありませんので、疑似乱数と呼ばれています。

ふと思いましたが、「乱れた数」があるなら、「みだらな数」「淫数」もあるのでしょうか? 例えば、隠しコマンドを入れると残機数が「69機」になるとか…。うむ。これは「淫数」な気がする。…どうでもいいか。

Q. 疑似乱数ってゲームのどこで使われてるの? :

A. 思いつくのは…。以下のような場面で使われたりします。
  • 敵の動きや、発生位置を、乱数を使って決めてたり。
  • 爆発等のエフェクト種類や、初期位置、速度を、乱数を使って決めてたり。
  • サイコロを振る時に使ったり。
  • じゃんけんする時に使ったり。
  • カードやマージャン牌を、かき混ぜる時に使ったり。(でも、実は…ちゃんとかき混ぜてないんですけどね…)
まあ、ゲームによって、色々です。

Q. ゲームに使う疑似乱数って、何を使ってもいいの? :

A. 個人的な印象ですけど、疑似乱数をゲームに使う場合、以下の3つの条件は満たしてないとダメかなあ、と思ってます。まあ、作るゲームにもよりますけど。
  • 処理時間が短いこと。
  • 再現性があること。(疑似乱数の種が初期化できること)
  • 妙な周期性がないこと。

処理時間は…。乱数一つゲットするのに、何フレームもかかってたら、ゲームになりませんよね。ですので、とにかく一瞬で得られること。この条件は、絶対に外せません。

再現性は…。「初期化してから使えば、毎回、同じ並びの乱数が得られるか?」ということですね。プログラミング言語によっては、疑似乱数の初期化メソッドがそもそも存在しないものもありまして。その場合、当然再現性なんか期待できませんから、乱数生成器を自作することになります。

周期性は…。「似たような乱数の並びが繰り返し出てきちゃったりしないか?」ということです。

Q. 疑似乱数の再現性って、大事なの? :

A. ゲームの仕様によりますが、ほとんどの場合は、大事だと思います。

例えば。昔風の2Dゲームにおいて、乱数の再現性は、リプレイ機能、デモプレイ画面を作る時に、とても重要です。敵が、再現性のない乱数を使って動いていたら、その画面に入るたびに、全然違う動きになるわけで…。
  • 誰も居ない虚無の空間を、気でも触れたかのごとく、執拗に撃ち続けるプレイヤーキャラ。
  • そんな異常状態をスルーして、プレイヤーキャラを容赦なく殺害する、一介の雑魚敵達。
  • あっという間に残機ゼロ。わずか数秒で、デモプレイ画面終了。
  • 「…アレ? 今、一瞬、デモプレイ画面っぽいものが映ったような…気のせい?」
乱数の再現性が無いばかりに、画面の中は、そりゃもう大惨事さ! …まあ、昔のゲーセンでは、そんな大惨事のデモプレイ画面を、たまーに目にしましたが。見ていて胸が痛んだものです。 *1 *2

難易度調整や、バグチェックをする際にも、乱数の再現性が無いと苦労します。
  • プレイするたびに難易度がガラリと変わってしまう。(そこまで乱数に頼った作りをしちゃってる時点で大問題、という話も…)
  • プレイヤーキャラのワーク(変数)をいくら整えても、敵が同じ動きをしてくれなくて、最悪、何度やってもバグが再現できない。
これは地獄です…。今日も泊まり込み…。椅子寝かな…。体が臭い…。風呂入りたい…。

つまり、風呂に入れる生活をしたいなら、乱数の再現性は重要なのですね。…や、コレ、冗談めかして書いてるけど、結構マジで死活問題で。

まあ、別に乱数に限った話でもなくて。「動かすたびに全然違う結果が出てくるプログラム」では、えてして大惨事になりますので、コンピュータの世界では、再現性は重要なのですが。

Q. 疑似乱数の周期性って、あったらマズイの? :

A. ゲームによっては、致命的ですね…。製品回収にすらなってしまう場合も。以下の記事が参考になるかと。

_「カルドセプトサーガ」にダイス目が偶数と奇数を繰り返すバグ | スラッシュドット・ジャパン
_カルドセプトサーガの乱数問題 | ψ(プサイ)の興味関心空間

サイコロの目が、偶数→奇数→偶数→奇数と出てくる周期性が ―― つまり、乱数の最下位ビットが、必ず 0→1→0→1 を繰り返す、という話で…。次に出てくるサイコロの目が、そこそこ予想できちゃうのは、ちょっと厳しいですね。

もっともこのあたり、サイコロを使うゲームだから問題になったのであって、シューティングゲームやアクションゲームでは、あまり関係ないんじゃないか、という気もしますけど。でも、どうせなら、妙な周期性がないほうが、安心して使えますよね。

Q. DXRuby で使える疑似乱数って、何があるの? :

A. DXRuby は Ruby のライブラリですから…。Ruby が標準で持ってる疑似乱数を使うのが一般的でしょう。

調べてみたら、以下の2つの書き方があると知りました。
srand(整数) # 疑似乱数を初期化する(種を設定する)

rand(整数) # 0〜(整数-1)の範囲で、疑似乱数を得る。


※ 以下は、Ruby 1.8.7 では使えない。

r = Random.new(整数) # 疑似乱数を初期化する(種を設定する)

r.rand(整数) # 0〜(整数-1)の範囲で、疑似乱数を得る。
  • 整数を指定する場合は、rand() も Random#rand() も同じ処理をするらしいです。
  • 浮動小数点数(float)を指定する場合もありますが、今回はゲームに使えるかどうかで考えてますので、とりあえず整数の乱数が得られれば、なんとかなるかなと。
  • Random クラスは、Ruby 1.8.7 では使えません。ただ、Ruby 1.8.7 は、2013/06末でサポートが打ち切られましたので、これから使う人は居ないでしょうし、気にしなくていいかも?
自分は Ruby 初心者なので、このあたり自信ありませんで。間違ってたらツッコミ入れといてくださいです。

Q. じゃあ、Rubyの rand() を使えばいいんだね? :

A. さて、どうなんでしょうね…。自分が気になっていたのは、このあたりで。

上にも書きましたが。
  • 処理時間が短いこと。
  • 再現性があること。(疑似乱数の種が初期化できること)
  • 妙な周期性がないこと。
この条件を満たしていれば、安心して使える疑似乱数だろうと思います。加えて、
  • Rubyのバージョンによって、違う乱数が出てこないか。
  • rand() と Random#rand() で、処理時間が大きく違ったりしないか。
このあたりも、気になるところ。作ったゲームを Ruby 1.9.3 上で動かす分には遊べるのに、Ruby 2.0.0 になったら乱数の並びが変わっちゃって難易度ハネ上がった、なんて展開は困ります。

実はそのあたり、Rubyのドキュメントに、答えは掲載されているのですが…。

_class Random

でも、ホント? ホントにそうなの? ここがもし間違ってると、後で泣くのはこっちだぜ?

そんなわけで、一応自分の手元でも検証してみることにしたのでした。

再現性についての検証。 :

まずは再現性について、ざっくり検証してみます。

検証に使ったスクリプトソースとその結果は、随分と長くなってしまったので、この記事の一番最後に載せておきますね。

また、使った環境は、以下の通りです。
  • CPU : Intel Core i5 2500 (3.3GHz)
  • Windows7 x64
  • Ruby 1.8.7 mswin32版
  • Ruby 1.8.7 mingw32版
  • Ruby 1.9.3 mingw32版
  • Ruby 2.0.0 mingw32版

さて、検証結果ですが。
  • 再現性はある。
  • 少なくとも、Ruby 1.8.7、Ruby 1.9.3、Ruby 2.0.0 は、同じ乱数が得られる。
  • rand(整数) と Random#rand(整数) は、同じ乱数が得られる。
  • rand(整数) と Random#rand(整数) の実行時間は、どちらもほとんど同じ。
  • 処理時間も…まあ、おそらく、大丈夫そう。乱数を得る際に、めっちゃ時間がかかってるようには見えません。
良かった良かった。ここまでは、一安心。

余談ですが、ついでに以下のことも分かりました。
  • Ruby はバージョンが上がると、グングン処理速度が速くなってる。
  • mswin32版より、mingw32版のほうが、処理速度は速い。かもしれない。(Ruby 1.8.7しか検証してないので、Ruby 1.9以降は、違ってるかも?)

周期性について検証。 :

周期性も確認しておきましょう。

とりあえず、某ゲームの乱数と同様に、乱数の最下位ビットが、0→1→0→1 を繰り返してないか、画像にして眺めてみましょうか。ついでに、乱数の種も変えてみて、同じ状態が続かないか確認してしまいましょう。

ちなみに、画像生成には、DXRuby を使ってます。
# 乱数の最下位ビットを画面に描画してみる

require 'dxruby'

Window.resize(160,120)

# 画像を新規作成
img = Image.new(Window.width, Window.height)

# 乱数初期化の種
lst = [
       [0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
      ]

# 乱数初期化の種を変えながら、画像に、乱数の最下位ビットを点として打つ
y = 0
lst.each do |dt|
  dt.each do |i|
    srand(i) # 乱数初期化
    puts "srand(#{i})"
    Window.width.times do |k|
      img[k, y] = ((rand(65536) & 0x01) == 0)? C_BLACK : C_WHITE
    end
    y += 1
  end
  y += 16
end

# 画像をファイル保存
img.save("rand_result.png", FORMAT_PNG)

Window.loop do
  break if Input.keyPush?(K_ESCAPE)
  Window.draw(0, 0, img) # 画面に描画
end

結果画像は以下になりました。見づらいので4倍に拡大してあります。
最下位ビットの検証画像

0→1→0→1 の周期性があれば、綺麗な市松模様が出てくるはずですが…そうは見えませんね。どうやら、最下位ビットが妙な周期性を持ってるわけではなさそうです。

だけど、まだ不安なので、乱数を使ってひたすらドットを打ってみます。

「そんな検証をして意味あるの?」と言われそうですが、意味がある時もあったりします。と言うのも、以前、自分で乱数生成器を作った際、こういった感じの検証をしたら、整然と並んだ綺麗な模様が出現しまして。それってつまり、妙な周期性があるということで…。

まあ、その時は、ビットシフトして下位ビットを捨ててみたら、乱数っぽい状態になってくれたので、それでお茶濁ししてしまったのですけど。疑似乱数を作るアルゴリズムによっては、下位ビットが妙な周期性を持つ場合も多く、そんな時は、ビットシフトして下位ビットを捨ててしまう手も使われるのだそうです。もちろん、上位ビット分にも周期性がないか、検証する作業が必要になりますが。
# 乱数でドットを打ってみる

require 'dxruby'

# 画像を新規作成
img = Image.new(Window.width, Window.height, C_BLACK)

srand(1)
Window.height.times do |y|
	Window.width.times do |x|
		c = rand(256)
		img[x, y] = [c, c, c]
	end
end

# 画像をファイル保存
img.save("rand_result2.png", FORMAT_PNG)

Window.loop do
  break if Input.keyPush?(K_ESCAPE)
  Window.draw(0, 0, img) # 画面に描画
end
ランダムにドットを打ってみた画像

整然と並んだ綺麗な模様は、別に出てきていませんよね…。どうやら大丈夫そうかな…。たぶん…。

Q. 結論としてどうなの? Ruby の乱数はゲーム制作に使えるの? :

A. 少なくとも、現時点では、安心して使えそうです。ただし、各シーンの、キリのいいタイミングで ―― 例えばステージ開始時の初期化処理中に、疑似乱数の種を初期化する、等をしてから使うことを忘れずに。

もっとも、コレ、ドキュメントに書いてある通りになっただけ、なんですけど…。まあ、自分で検証してその通りになりましたから、「よしっ! バッチグー!」ということで。

Ruby のバージョンが変わったら、また検証してみたほうがいいのかもしれません。もっとも、Ruby 1.8、1.9、2.0 と、結果は同じでしたから、今後も再現性は保証されるのではないかと予想しますけど。

そもそもゲームに乱数なんか使わないよ、という話。 :

ここまで、「ゲームに乱数を使う」という前提で話をしましたが。

実は、「ゲーム制作に乱数を使うべきではない」という主張もあります。以下の記事を読んでいただければ分かるかと。

_ゲーム作るのにまだ乱数使ってるの? - 2010-02-05 - ABAの日誌

要するに、「完璧なゲームデザインができているなら、乱数が入り込む隙など無いはずだ」という主張ですね。それはたしかに、そうかもしれない。自分も少し心当たりがあります。アクションゲームの類でも、敵の動きや、発生テーブルを作り込んでいくと、乱数を使う箇所がどんどん減っていく気がしますね…。 *3

とは言え。件の記事でも言及されていますが…。
  • プロトタイプをサクッと作ってる時に、なんとなく敵がそれっぽく動いてるようにしたいとか。
  • プレイヤーの必勝パターンができてしまうのを軽く防止したいとか。
等々、乱数使用が有効な場面もありますので、「絶対に乱数を使わないぞ!」と意固地になる必要もないだろうと自分は思います…。

DXRubyはゲーム制作以外にも使えますよ、という話。 :

上の方で、DXRubyを使って、検証結果を画像化したのですが。

DXRubyを使って、こういうことができるという点も、実は大事じゃないかと個人的には思っているのです。

「ゲーム制作ライブラリ」と銘打たれていると、「ゲーム制作? 俺には関係ないや」とスルーする方も多いと想像するのですが。それはおそらく早計で。

「ゲーム制作に使えるぐらいだから、こういうことだって軽くできちゃうはずだよな?」と思い直すことができれば、意外なところで、ソレを使って楽ができる…。そんな場面もあるだろうなと。

そして、それは、おそらく逆も成り立つのだろうと。「ゲーム制作には関係ないや」と思い込んでた、プログラミング言語やライブラリが、ゲーム制作を楽にしてくれる時だってあるはずだと。

そもそも、Rubyの作者様だって、Rubyを使って、グリグリ動くリアルタイムゲームが作れるなんて、夢にも思ってなかったはずですから…。DXRubyの存在自体が、「その発想は無かったわ」的事例の一つ、かもしれませんよね。

つまるところ、この記事は、検証作業に DXRuby を軽く使ってみることで、

「○○用と謳われていても、○○にしか使えないというわけじゃない」
「目の前の道具を、柔軟性を持って捉えることも、プログラマーには必要」
「そんな姿勢を心掛けていれば、いつかどこかで、その道具が自分に楽をさせてくれる、かもしれない」

―― そんな考え方を示すための、簡素な事例の一つとして書いてみたつもり、でもあるのでした。まあ、「立っている者は親でも使え」という話に過ぎませんが。

それでは、明日は、あおたくさんの _ゲーム作りました をお楽しみくださいませ。

関連資料。 :

疑似乱数、あるいは、Rubyで扱える乱数についての、解説ページも紹介しておきます。

_良い乱数・悪い乱数
_Ruby の標準乱数生成器とその改善案
_Rubyにおけるrand(乱数)の挙動について - yayuguのにっき

特に、乱数生成器を自分で実装する際には、 _良い乱数・悪い乱数 は必読ではないかなと個人的には思います。ありがたや。

再現性の検証に使ったソースと結果。 :

# 乱数の再現性を確認する

require 'benchmark'

n = 1024 * 1024 * 4 # 乱数を発生させる回数

lst_rand1 = Array.new(n)
lst_rand2 = Array.new(n)
lst_random1 = Array.new(n)
lst_random2 = Array.new(n)

# ベンチマークを取る
Benchmark.bm(14) do |x|

  unless /^1.8/ =~ RUBY_VERSION
    # Ruby 1.8.7 は Random クラスを持たないので
    # 処理をスキップする
    
    # 2回乱数を作ってみて、後で比較する
    r = Random.new(0) # 乱数を初期化
    n.times do |i|
      lst_random1[i] = r.rand(0x7fffffff)
    end
    
    r = Random.new(0) # 乱数を初期化
    n.times do |i|
      lst_random2[i] = r.rand(0x7fffffff)
    end

    tmp = 0
    x.report("random:") {
      n.times { tmp = rand(0x7fffffff) }
    }
    
    x.report("random:") {
      n.times { tmp = rand(0x7fffffff) }
    }
  end
  
  # 2回乱数を作ってみて、後で比較する
  srand(0) # 乱数を初期化
  n.times do |i|
    lst_rand1[i] = rand(0x7fffffff)
  end
  
  srand(0) # 乱数を初期化
  n.times do |i|
    lst_rand2[i] = rand(0x7fffffff)
  end

  tmp = 0
  x.report("rand:") {
    n.times { tmp = rand(0x7fffffff) }
  }

  x.report("rand:") {
    n.times { tmp = rand(0x7fffffff) }
  }

end

# 乱数を記録した配列の並びを比較してみる

if lst_rand1 == lst_rand2
  puts "rand は同じ並びです"
else
  puts "rand の並びは異なります"
end

unless /^1.8/ =~ RUBY_VERSION
  if lst_random1 == lst_random2
    puts "random は同じ並びです"
  else
    puts "random の並びは異なります"
  end

  if lst_rand1 == lst_random1
    puts "rand と random は同じ並びです"
  else
    puts "rand と random の並びは異なります"
  end
end

# バイナリファイルとして出力してみる

fn1 = "result_rand_" + RUBY_VERSION + ".bin"
File.open(fn1, 'w+b') do |file|
  file.write(lst_rand1.pack("N*"))
end

unless /^1.8/ =~ RUBY_VERSION
  fn2 = "result_random_" + RUBY_VERSION + ".bin"
  File.open(fn2, 'w+b') do |file|
    file.write(lst_random1.pack("N*"))
  end
end

結果はこうなりました。
> pik list
  187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]
  187: ruby 1.8.7 (2012-10-12 patchlevel 371) [i386-mingw32]
  192: ruby 1.9.2p290 (2011-07-09) [i386-mingw32]
* 193: ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
  200: ruby 2.0.0p353 (2013-11-22) [i386-mingw32]

# ----------------------------------------
# Ruby 1.8.7 mswin32版とmingw32版を比較
#
# ※ Ruby 1.8.7 は、2013/06/30にサポート対象外になっている

> pik 187
Select which Ruby you want:
1. 187: ruby 1.8.7 (2012-10-12 patchlevel 371) [i386-mingw32]
2. 187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]
?  2

> ruby rand1.rb
                    user     system      total        real
rand:           4.305000   0.000000   4.305000 (  4.308247)
rand:           3.838000   0.000000   3.838000 (  3.845220)
rand は同じ並びです

> pik 187
Select which Ruby you want:
1. 187: ruby 1.8.7 (2012-10-12 patchlevel 371) [i386-mingw32]
2. 187: ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]
?  1

> ruby rand1.rb
                    user     system      total        real
rand:           3.915000   0.000000   3.915000 (  3.915224)
rand:           3.557000   0.000000   3.557000 (  3.558204)
rand は同じ並びです

# mswin32版よりmingw32版のほうが処理速度は速い

# ----------------------------------------
# Ruby 1.9.7 mingw32版で検証

> pik 193
> ruby rand1.rb
                     user     system      total        real
random:          2.356000   0.000000   2.356000 (  2.353134)
random:          2.356000   0.000000   2.356000 (  2.356135)
rand:            2.465000   0.000000   2.465000 (  2.451140)
rand:            2.449000   0.000000   2.449000 (  2.449140)
rand は同じ並びです
random は同じ並びです
rand と random は同じ並びです

# Ruby 1.8.7 より Ruby 1.9.3 のほうが2倍近く速い

# ----------------------------------------
# Ruby 2.0.0 mingw32版で検証

> pik 200
> ruby rand1.rb
                     user     system      total        real
random:          2.121000   0.000000   2.121000 (  2.114121)
random:          2.122000   0.000000   2.122000 (  2.123121)
rand:            2.246000   0.000000   2.246000 (  2.247129)
rand:            2.278000   0.000000   2.278000 (  2.266129)
rand は同じ並びです
random は同じ並びです
rand と random は同じ並びです

# Ruby 1.9.3 より Ruby 2.0.0 のほうが僅かに速い

# ----------------------------------------
# ファイル保存した乱数列を比較

> fc /b result_rand_1.8.7.bin result_rand_1.9.3.bin
ファイル result_rand_1.8.7.bin と RESULT_RAND_1.9.3.BIN を比較しています
FC: 相違点は検出されませんでした

> fc /b result_rand_1.8.7.bin result_rand_2.0.0.bin
ファイル result_rand_1.8.7.bin と RESULT_RAND_2.0.0.BIN を比較しています
FC: 相違点は検出されませんでした

> fc /b result_rand_1.8.7.bin result_random_1.9.3.bin
ファイル result_rand_1.8.7.bin と RESULT_RANDOM_1.9.3.BIN を比較しています
FC: 相違点は検出されませんでした

> fc /b result_rand_1.8.7.bin result_random_2.0.0.bin
ファイル result_rand_1.8.7.bin と RESULT_RANDOM_2.0.0.BIN を比較しています
FC: 相違点は検出されませんでした

# Ruby 1.8.7、Ruby 1.9.3、Ruby 2.0.0 の結果は同じ
# Kernel.#rand(整数) と Random#rand(整数) の結果は同じ

*1: もっとも、太古のTVゲームは、CPUのリフレッシュカウンタ等を読んで ―― ハードウェアで乱数を作っていたそうで。それでは再現性が得られなかったから、大惨事な画面も、仕方なかったのかもしれません。
*2: これは、60FPSで動作することが保障されてる、昔ながらの2Dゲームの場合の話でして。3Dゲームになると、可変フレームレートになるので、事情が変わってくるはずです。フレーム毎の、プレイヤーのコントローラ操作を再現しても、毎回フレームレートが同じではないため、ゲーム展開にずれが出てきます。ですから、おそらく、座標値や状態を記録して、リプレイやデモプレイを実現している場合が多いのではないかと想像していますが…。
*3: 例えばですが、プレイヤーとの間合い、プレイヤーの位置、プレイヤーの状態をチェックして、自分の動作を決定していく、そういう敵の動かし方もあるわけです。たしか、「ワンダと巨像」は、地面に、巨像の動きを決定するための判定マップを設定して動作を決定してた、という記事を読んだ記憶が…。そういう動かし方なら、乱数が入ってくる箇所も少なくなりそうですよね…。

#2 [game] プレイヤーキャラを斜め床で走らせる時のポーズ問題

最近ちょっと、モヤモヤ考えてしまう問題がありまして。ゲームのプレイヤーキャラを、斜め床の上で走らせる際のポーズって、どういうポーズが適切なのかなあ、と。

昔のTVゲーム機における、「ソニック」「ストライダー飛竜」等は、斜め床の上を走る時に、体が斜めになった…記憶があるのですけど。当時はソレを見て、不自然とは思わなかったのですが。

随分前に、Xbox 360で「ストライダー飛竜」の新作が出るぞー、てな話を見かけまして、興味津々でプレイデモ映像を見たのです。3DCGになった「ストライダー飛竜」、チョーカッコええなと。パーティクル飛ばしまくりやなと。見ていてシビレたのですが。

しかし、そこでも、プレイヤーキャラは、斜め床の上で体が斜めになっていて。「うーむ、不自然だ…」と思ってしまったのです。

件のソレは、3DCGになったから、パッと見はチョーリアルになってるわけですけど。斜め床の上では、見た目をそれほどリアルにできなかった、2Dゲーム時代の文法を踏襲してる。そこに自分はギャップを感じてしまったのでは、と思うのですけど。

さりとて、斜め床の上で、垂直(?)にして走らせるわけにもいかない。件のゲームは、斜め床の上を高速で走っていくシーンもあるわけですよ。そういう場面では、身体が斜めになってるほうが、どう考えてもカッコイイ。そういうシーンを成立させるためには、普段から、「斜め床の上では体が斜めになる」というルールを適用しておかないといかんよなと。

でも、パッと見、やっぱりなんだか不自然で。

たぶんこのあたり、 その違いも絡んでそうな気もしますけど。日本のソレって、歌舞伎みたいなところがあるよなと。リアルであることより、抽象化・デフォルメしたほうがカッコイイ、みたいな。

何にせよ、そんな流れで、「斜め床の上を走らせる時って、どういうポーズがいいんだろう?」と、たまに思い出したようにモヤモヤ考えてしまうのでした。

ちなみに、新作「ストライダー飛竜」は、そんな細かいところがどうでもよくなるぐらいに、全編が超絶カッコイイと思います。ちゃんと売れてほしいなあ…。自分、横スクロールアクションというジャンルが好きなので。

「カリ城」はお手本になりそう。 :

このあたりモヤモヤ考えてると、「ルパン三世 カリオストロの城」の、屋根の上をルパンが走るシーンを思い出すのです。…ここから先は、どなたかが話してたソレの受け売りのような気もしますけど。

あの一連のシーンには、キャラが斜め床の上を走る際の、ありえるポーズの全てが凝縮されてるよなと。それでいて、不自然な映像とは感じない。…いや、もちろん、その後の展開は「ありえねえだろ…」な漫画的展開ですけど。走ってる最中は、不自然ではないよなと。

なので、おそらく「カリ城」に何かヒントがある、ような気がするのです。

とは言っても。ゲームのソレはキャラのポーズが全て連続しているけれど。映画はモンタージュで解決してるところもあるから、そう単純ではないのかな。でも、ちょっとした「ヒント」ぐらいは、混じってる気もするなあ。

速度と絵柄。 :

「カリ城」を思い返すと、問題解決に使えそうな2つの要素がありそうだと思えてきたり。
  • ルパンは、速度に応じて、ポーズが変わってる。ゲームのソレも、速度で各ポーズを繋いでいけないか。
  • 「カリ城」はアニメ。アレが実写だったら、不自然で見ていられない、かもしれない。であれば、ゲームのソレも、リアル方向ではなく、アニメ方向の見た目・絵柄にすれば、印象が変わらないか。
ただ、この2つとも、問題がありそうで。
  • 体を斜めにすべき速度を判定するのって、結構難しそう。速度と体の角度を比例させれば済む、というわけでもないよなと。結局、「ここは斜めに立たせるべき」「ここは垂直に立たせるべき」の判定って、速度程度じゃ足りないだろうと。
  • せっかく3DCG使ってリアルに見せられる時代になったのに、昔の2Dゲームの絵柄に戻してどうするんだと。お客さんの食いつきが悪くならないか。
やってみたら、「あら、これでイケるわ」となるかもしれないけど、「やっぱりコレじゃアレだな」ともなりそうな。

まあ、このあたり、そのうち「カリ城」が再放送されたら、件のシーンをじっくり見直して考えてみよう、と…。これも、自分にとっての宿題・今後の課題ってことで。

#3 [game] 斜め床の上で立ち止まってる時のプレイヤーキャラの足の角度

上の記事を書いたついでに、このあたりの自分の記憶を整理するために、覚えてることを今のうちにとりとめなくメモ。

ファミコン版の「悪魔城ドラキュラ」は、斜め床がそもそも存在せず、階段しかなくて。しかし、階段を昇り降りする時は、一歩一歩踏みしめて、じわじわ動いていくので…。階段の上で立ち止まってる時も、階段の地形にピタリと一致した足の角度で。ファミコン版のくせして(?)、地味にそういうところで、見た目がリアル。

この文法は、PS1版のドラキュラXで破棄されます。斜め床の上をスッタカスッタカと滑るように走る仕様になり、階段も全部、斜め床の扱いになった。そして、斜め床の上でも、ソレ専用のグラフィックは用意してなかった…ような気がします。勘違いしてるかもしれないけど。 *1

「ストライダー飛竜」は、斜め床の上で立ち止まると、床の角度に合わせた足の角度になります。つまり、地形に合わせたソレ専用のグラフィックが、わざわざ用意されていて。…まあ、斜め床の上を歩くと体が斜めになる時点で、「地形に合わせたポーズでなきゃダメなんだ!」てなこだわりが感じられますが。昔のハードで体を斜めにするってことは、体が斜めになってるグラフィックをわざわざ持たなきゃいかんはずで。元がアーケードとは言え、そこまでやるか…。

「魂斗羅」MD版以降も、(ディレクターさんが「ストライダー飛竜」大好き人間だったので)斜め床の上で立ち止まると、ちゃんと斜め床に合わせたグラフィックになります。…SFC版はどうだったか自分の記憶は怪しいのですが、MD版とPS2版はそうだったはず。PS2版を見て、「おお…相変わらず、こだわってる…」と思った記憶が。

「ソニック1」は…斜め床の上で立ち止まっても、普段と同じ立ちポーズだったような? どうでしたっけか。足をピシッと閉じたポーズだから、どんな地形の上でも不自然にならなかった、そんな記憶がありますけど。最初のソレは容量が4Mbitだったから、そういうところでも地味に容量節約してたのかなと想像してみたり。

「マリオ」は…ファミコン版のマリオって、斜め床ありましたっけか? どうだったかな。たしか無かったですよね?

そんな感じで、2D横スクロールアクションゲームにおいて、「斜め床の有無」や「斜め床の上でプレイヤーキャラがどんなグラフィックになってるか」は、ゲームによって色々違っていて。そのあたり、自分の中では、どれが適切なのか、悩んじゃうのでした。

例えば、 _Flixel という2Dゲームライブラリは、地形管理クラスに、斜め床が無いんですけど。おそらく、マリオをイメージしながら作った2Dゲームライブラリは、そうなるんだろうなと。

でも、自分は、横スクロールアクションというと、「ストライダー飛竜」あたりを連想しちゃうので…。「この仕様で足りるの?」とか思っちゃって。でも、「そもそも斜め床って必要なのだろうか?」という疑問も湧いたりもして。

「2Dゲームにおける斜め床とはなんぞや?」てなあたりを、誰か考察してくれないものかしら。「斜め床は必要なのか否か?」「あると、ゲームの何が違ってくるのか?」みたいな。

スマホゲーム全盛のこの時代にそんなの考えてみてもな、というところもありますかね…。
*1: PS1版ドラキュラのメインスタッフは、PCE版ドラキュラのメインスタッフでもありますから、階段をじわじわ昇るソレが実装できないはずはなく。PCE版で既にやってますから、やろうと思えばできたはずで。なので、「このタイトルは斜め床があったほうが面白い」とか「今時、階段をじわじわ昇るのはいかがなものか」とか「マップがとにかく広いから、作業量やプレイ時間を考えたら階段じわじわはキツイ」等の判断をして、あえて文法を破棄したんじゃないのかな、と想像してますけど。

#4 [ruby] Ruby 1.9.3 を再インストールした

irb や pry の動作が怪しいあたりが気になったので、Ruby 1.9.3 p484 を再インストールした。環境は Windows7 x64。

既に入ってる版をアンインストール。 :

コントロールパネルから、アンインストール。以前のインストールフォルダはリネームしてバックアップ。

RubyInstallerをインストール。 :

_RubyInstaller for Windows から、rubyinstaller-1.9.3-p484.exe と DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe をDL。

rubyinstaller-1.9.3-p484.exe を実行してインストール。今回は、C:\ruby193mingw にインストールした。

pik に登録。 :

一旦以前の版をリストから削除して、その後、インストールした版を登録。
pik remove 193
pik add C:\ruby193mingw\bin

pik は、Windows上でRubyの複数のバージョンを使うことができるツール。

DevKitをインストール。 :

  1. DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe を実行して任意のフォルダに解凍。
  2. フォルダに入って、ruby dk.rb init を実行。
  3. config.yml を編集。インストールしたい Ruby の版だけ残して他はコメントアウト。
  4. ruby dk.rb install を実行。

gemをアップデート。 :

gem install rubygems-update
update_rubygems

ruby-debug-base19をインストール。 :

NetBeans 上でデバッガを使えるようにするためにインストール。
  • gem install linecache19
  • ruby-debug-base19-0.11.26.gem をDLしてくる。
  • gem install ruby-debug-base19-0.11.26.gem -- --with-ruby-include=C:\ruby193mingw\include\ruby-1.9.1\ruby-1.9.3-p484
  • gem install ruby-debug-ide19
  • gem install ruby-debug19
C:\ruby193mingw\lib\ruby\gems\1.9.1\gems\ruby-debug-ide19-0.4.12\lib\ruby-debug\xml_printer.rb に以下を追加。
class String
  def is_binary_data?
    ( self.count( "^ -~", "^\r\n" ).fdiv(self.size) > 0.3 || self.index( "\x00" ) ) unless empty?
  end
end

その他のライブラリをインストール。 :

gem install hoge で。

結局 irb や pry はどうなったかというと。 :

やっぱり固まる。なんでや。

Ubuntu Linux 上で試してみた。 :

VMware Player + Ubuntu 13.10 で、Ruby 関係のアレコレを色々インストールして、その上で irb や pry を使ったのだけど。これだと、固まらない。うーん。

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

こっちだと irb がするする動く。うむむ。mingw32版が問題なのか、自分がインストールした gem が問題なのか…。

ActiveScriptRuby 2.0.0 上では、pry はインストールしても動かなかった。win32console が無いよと言われる…。gem install win32console をしたら、エラーがたくさん出てきた。

ActiveScriptRuby 1.8.7 もインストールしてある環境なので、そちらでも irb を動かしてみた。コレもするする動く。むむむ。どういうことだろう。

とりあえず、普段 irb を使う場合は、ActiveScriptRuby 版を使うことにしようかな…。

#5 [dxruby] ActiveScriptRuby版は同梱のDXRubyじゃないと動かないのかな

ActiveScriptRuby 2.0.0 版に入ってる DXRuby のバージョンを確認したら ―― irb 上で require 'dxruby' 後に DXRuby::VERSION と打ったら 1.3.7dev と出てきた。結構古い…。

先日公開された、DXRuby 1.5.8dev版をインストールしようとしたら、「msvcrt-ruby200.dll が無いからプログラムを動かせないよ」とエラーダイアログが表示された。

なら、DXRuby 1.4.0 Ruby 2.0対応版はどうだろう。これも、インストールしようとしたら、同じエラーが出た。

どうやら、件の Ruby は、同梱されてる DXRuby じゃないと動かないらしい…。というか、おそらく DXRuby 公式サイトで配布されてるバイナリは、mingw32版でしか動かないのかもしれない。

なんだか環境を色々壊してしまったような気がしてきたので、とりあえず ActiveScriptRuby 2.0.0 版をアンインストールして、また再インストール。

#6 [ruby] Ruby/SDLとruby-openglをインストール

Ruby 1.9.3 p484 mingw32 版上にインストールしようと試みたのだけど、チラチラ問題が。

Rubyforge.orgに繋がらないのですが。 :

Ruby/SDL の Windows用バイナリをDLしようと思ったら、Rubyforge.org に繋がらず。困った。

「Windowsへのインストールは、バイナリを利用するのが楽」と公式サイトのドキュメントには書いてあるけど、そのバイナリが入手できないのでは…。

gem でインストール。 :

gem install rubysdl-mswin32-1.9 でインストールしても、手元のスクリプトが動いてくれず。

あ。「install_rubysdl.bat を実行せよ」とメッセージが表示されてることに、今気がつきました。

実行したら、エラーが出た。
> install_rubysdl.bat

C:/ruby193mingw/lib/ruby/gems/1.9.1/gems/rubysdl-mswin32-1.9-2.1.1.1/dll/install_rubysdl:7:in `<top (required)>': uninitialized
constant Gem::GemPathSearcher (NameError)
        from C:/ruby193mingw/bin/install_rubysdl:23:in `load'
        from C:/ruby193mingw/bin/install_rubysdl:23:in `<main>'
困ったな。

C:\ruby193mingw\lib\ruby\gems\1.9.1\gems\rubysdl-mswin32-1.9-2.1.1.1\ をDOS窓で開いて、ruby install_rubysdl.rb を実行してみたり。インストールできたっぽい。

ただ、このままだと、ruby-opengl と競合するはずだから…。 _2013/05/08の日記 を参考にして、opengl.so をリネームしたり等。

gem install opengl 後、gem install ruby-opengl を実行したら、ruby-opengl (0.61.0) が入ってくれた。

Ruby/SDL も ruby-opengl も動いてるように見える。これで大丈夫そうかな…。

まあ、Ruby/SDL は、Ruby 1.8〜1.9 上でしか動かないんだけど。

Ruby/SDLのドキュメントがグチャグチャ。 :

_File: README ・ Documentation for rubysdl (2.1.3) を眺めたら、ほとんどの文字が「???」になっていて。どういうことだろう…。

#7 [python] PyGameって開発終了してたのか…

_Pygameの後継らしいPySDL2をインストール - ばぐばぐわーるど を見て、PyGame が開発終了してたことを今頃知ったわけで。

_PySDL2 ってのが後継なのか…。入れてみるか…。

む。Python 2.7 か Python 3.2 以降じゃないと動かん、と書いてあるような。自分の環境は、gimp-python を動かす関係で、Python 2.6 がデフォルトなわけで。困った。

_#84 複数バージョンのPythonをインストールする << Python << a wandering wolf によると、バッチファイルを作成することで、複数のPythonを使い分けることもできなくもないらしい。であれば、試せるかな…。

PySDL2 のドキュメントを読むと、PyPy なるものも必要、というか、PyPyでも動かせる、と書いてあるように見える。名前だけは見かけてたけど、それもインストールしてみるか…。

PyPyをインストール。 :

PyPy というのは… Python が爆速になったもの、らしい。よく分からないけど。

とりあえずインストール。環境は Windows7 x64。

_PyPy - Download and install から、pypy-2.2.1-win32.zip をDLしてきた。解凍して、任意のフォルダにおいておく。

環境変数PATHが通ってるフォルダの中に、pypy.bat というバッチファイルを作ることにした。中身は以下のような感じ。
@echo off
C:\pypy\pypy.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
とりあえず、DOS窓で、pypy と打ってみた。…なんだか python.exe を実行した時と同じ画面になった。exit() で終了。

_PyPyを試してみた @ Project Euler Problem 92 - matsulibの日記 で紹介されてるスクリプトを実行してみた。

うわ。Python 2.6 だとめちゃくちゃ待たされるのに、PyPy だとあっという間に処理が終わった。これはたしかにスゴイ…。

さておき、次は何をすれば…?

setuptools と pip をインストール。 :

なんだかよく分からないけど、setuptools と pip なるものが必要らしい。

_WindowsにPythonのツール: setuptools(easy_install), pipをインストールする | ユニキャストラボ を参考に作業。 _setuptools 2.0.1 : Python Package Index から、ez_setup.py なるファイルをDLして、
python ez_setup.py
を実行。なんか色々入った。これが setuptools だか easy_install だかなのだろうか。

easy_install pip
を実行。またなんか色々入った。これで pip がインストールされたのかな?

Python 2.6 でやったこの流れを、Python 2.7, 3.2 でも実行。環境変数PATHを書き換えて、その都度行ってみたり。

Python 2.7 と 3.2 をアップデートしたら面倒なことに。 :

Python 2.7 と 3.2 の新しい版があったので、ついでにアップデート。

やっかいなことになった。各Python をインストールしてたフォルダは、シンボリックリンクを使って、Cドライブにあるように見えながら実体はDドライブに置いていたのだけど。インストーラが、フォルダを削除、再作成をしたようで、CとDの両方に Python がある状態に。もうグチャグチャだー。

面倒臭くなったので、全部アンインストールして、もう一度再インストールすることに。モジュールの再インストール作業を考えると、気が重い。

ez_setup.pyがエラーを出す。 :

_Issue 9291: mimetypes initialization fails on Windows because of non-Latin characters in registry - Python tracker に書いてある症状と同じ。

_2013/12/19 Python-2.7.6がWindows環境でmimetypes.init()に失敗する場合がありsetuptoolsがインストールできない話 - 清水川Web に書いてあった状態になってた。レジストリの HKEY_CLASES_ROOT 以下に、日本語文字列のキーが…。
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\カート]
@="カート"

[HKEY_CLASSES_ROOT\カート\DefaultIcon]
@="C:\\Program Files (x86)\\FUJIFILM\\MyFinePix Studio\\MyFinePixStudio.exe,0"

[HKEY_CLASSES_ROOT\カート\shell]

[HKEY_CLASSES_ROOT\カート\shell\open]

[HKEY_CLASSES_ROOT\カート\shell\open\command]
@="C:\\Program Files (x86)\\FUJIFILM\\MyFinePix Studio\\MyFinePixStudio.exe \"%1\""

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\フォトブックファイル]
@="フォトブックファイル"

[HKEY_CLASSES_ROOT\フォトブックファイル\DefaultIcon]
@="C:\\Program Files (x86)\\FUJIFILM\\MyFinePix Studio\\MyFinePixStudio.exe,0"

[HKEY_CLASSES_ROOT\フォトブックファイル\shell]

[HKEY_CLASSES_ROOT\フォトブックファイル\shell\open]

[HKEY_CLASSES_ROOT\フォトブックファイル\shell\open\command]
@="C:\\Program Files (x86)\\FUJIFILM\\MyFinePix Studio\\MyFinePixStudio.exe \"%1\""

FUJIFILM製デジカメに付属してきたソフトをインストールしたときに作られてしまったものと思われます。

が、しかし、該当キーをバックアップ後削除してみても、やっぱりエラーが出る。うーん。

python-2.7.5.msi を _Python 2.7.5 Release からDLして上書きインストールしてみた。これならエラーが出ない、けど、動作が怪しくなりそうな。モジュールも含めて全てアンインストールして、Python 2.7.5 を再インストールすることに。助けて。

とりあえず PySDL2 をインストール。 :

PySDL2 も、 _Pygameの後継らしいPySDL2をインストール - ばぐばぐわーるど を参考に、インストールしてみた。

_Installing PySDL2 ・ PySDL2 0.7.0 documentation によると、SDL2 の他に、SDL2_image、SDL2_mixer、SDL2_ttf、SDL2_gfx もインストールしないといけないらしい。しかし、SDL2_gfx だけは、ソースのみの公開で。Windows用のバイナリは無いのかな…。ググってみても、「この SDL gfx ってバイナリがないぞ…」みたいな話しか出てこなくて。

とりあえず、SDL2_gfx 以外は全部入れてみた。 _Integrating PySDL2 ・ PySDL2 0.7.0 documentation に従って、環境変数 PYSDL2_DLL_PATH に、SDL2 関係の .dll が入ったフォルダを設定しておく。

おお。たしかにサンプルが動いた。と思ったけれど、DOS窓に、「今、ソフトウェアでレンダリングしてるよ」とメッセージが表示されてる。

ソフトウェアでレンダリングするのでは、PyGame と変わらず、描画が遅いのではあるまいか…。設定でどうにかできるのかもしれないけど、デフォルトでソフトウェア描画されてしまう仕様では、他の環境に持っていって動かしたときに、一々設定してもらう羽目になりそう。とは言え、最初からハードウェアを使って描画する設定だと、環境によってはそもそも起動しないとか、OSが落ちるとかありそうだし。

PySDL2 になったことで、ソースの書き方も、全然 Python らしくないノリになってるし。サンプルソースを見て萎えた人の気持ちも分かる。

現段階では、ちょっとビミョーなライブラリだなと思えてきたり。でも、もちろん、今後に期待。

GIMP 2.6 がおかしい。 :

Python 2.6.6 をインストールしたはずなので、GIMP 2.6 上で Pythonスクリプトが動くはず、と思ったのだけど、これが動かない。うーん。

2012/12/19(水) [n年前の日記]

#1 [zatta] 昔のゲームってそんなにバグったかな

某所で、MDの某ゲームがガンガンバグってフリーズしてる映像を目にして、なんだか変だなと思ったり。当時自分も件のタイトルはかなり長時間プレイしてたはずだけど、フリーズバグに遭遇した記憶がなくて。

その映像を見てると、途中でBGグラフィックがおかしくなってたようにも見えたのだけど。ファミコンにROMカセットをちゃんと差し込んでないと、そういう症状が出たような気もするので、もしかしてMDも、ROMカセットがちゃんと刺さってないとそうなるのかな、と思えてきたり。

それとも、初期型のMDに起因する不具合だろうか。初期のMDでランドストーカーがバグる、みたいな話があったような記憶もあるし。

あるいは単に、MD本体が故障してる可能性もあるのだろうか。考えてみたら、昔のゲーム機が壊れてるかどうかをチェックする術は無いような気もする。これがPCなら、memtest86+ のような、メモリが壊れてないかチェックするツールなどがあったりするわけだけど。ひょっとすると、memtest_nes とか、memtest_md とか、memtest_ps1 とか、そういうツールが存在していれば助かる場面もあるのだろうか。…ROMカセットからして自作しないといけないから厳しいだろうな。

2011/12/19(月) [n年前の日記]

#1 [zatta] 高校時代のクラブ活動について唐突に思い出したのでなんとなくメモ

ただの懐古話なのでオチは無いです。唐突に思い出したのでメモ。

高校時代、「クラブ活動」という授業時間があった。たぶんそんな感じの授業名だったと思う。放課後の部活動ほどではないけれど、毎週、1回、本業(?)とは違うことに触れる時間が用意されていた。

色々な選択肢があったけれど、コンピュータ大好きっ子だった自分は、「コンピュータクラブ」を選んだ。工業高校だったので、実習室には40台ほどコンピュータが並んでいた。そのコンピュータを使わせてもらえるかもしれない。ワクワクした。

当時、そこに置かれていたのは、SHARP製のマイコン、MZ-2000。グリーンディスプレイだから緑1色しか表示できないが、640x200ドットのグラフィック画面が使える凄いヤツ。MZ-80Bの系譜だ。

SHARPのMZシリーズには2つの系譜があった。1つは、文字しか表示できない MZ-80K2E、MZ-1200、MZ-700等。もう1つは、グラフィックも表示もできるが、更にお値段が張るMZ-80B、MZ-2000。…今調べてみたら、後者はグラフィックRAMを追加しないとグラフィック表示できなかったらしいが。もう一つ、ビジネス用の系譜もあったと思うが、そちらは値段が更に凄いことになるのでほとんど覚えていない。また、後にSHARP製マイコンは、TV事業部の出したX1シリーズが主流になってしまい、MZシリーズは落ち目になっていくのだけど、それはまた別の話。

自分は、MZ-80Bに妙な思い入れがあった。

自分が住んでいた福島県須賀川市周辺では、SHARP製マイコンは滅多に見かけなかった。置いてあるのはNEC製マイコンばかり。自然と、「MZシリーズってどんなマイコンなんだろう」と夢が膨らんだ。唯一、須賀川商店街に向かう坂の途中にあった、小さな電気屋さんの店内に、MZ-80Bが置いてあるのを見つけたけれど。個人でやっているお店のようで、店内は暗くて狭く、とてもじゃないが見た目貧乏そうな子供が「触らせてください」なんて言える雰囲気ではなかった。

だからいつも、店の前を通る度に、ガラス越しにMZ-80Bを1〜2分ぐらいじっと見つめて、「いつか触ってみたいなあ…」と思いを募らせていた。まるで、ショーウインドウに飾ってあるトランペットの前で、いつかソレを手に取ってみたいと憧れ続ける黒人少年のようだった。

後に自分は、親にMZ-731を買ってもらったのだけど。当時の自分は、マイコンのスペックについて全く無知だったので、値段が安いのにプリンタがついているという理由でMZ-731を選んでしまった。MZ-731は、グラフィック画面が存在せず、文字しか出せないことを認識できたのは、購入後のこと。かなり後悔した。広告内で表示されていたスタートレック・エンタープライズ号の画面は、全部キャラグラ(キャラクターグラフィック)だった。見事に騙された。いや、それはそれで匠の技ではあるのだが。

そんなわけで、MZ-80Bの系譜には憧れがあった。だから、コンピュータクラブを選んだ。ガラス越しにじっと見ていたあのマイコンが使える。憧れていたグラフィック画面が使える。さあ、何をしてやろうか。何を表示してやろうか。

ところが。クラブ活動の時間になって実習室に行ってみると、既に満席だった。どのコンピュータの前にも別の生徒が座っていた。空いているコンピュータは1台も無い。どうやらコンピュータクラブは、定員オーバー状態だったらしい。仕方がないので、隣の実習準備室(?)で暇を潰すしかなかった。

実習室と、実習準備室は、ガラスで区切られていた。ガラス越しに、他の生徒がMZ-2000を弄るのを、ぼーっと見ているしかなかった。せっかく何十台も、憧れの、MZ-80Bの系譜が目の前に並んでいるのに。自分がやれることは相変わらず同じだった。

次の週も、次の週も、いつまで経っても、実習室は満席だった。

あぶれる生徒も固定してしまったようで、実習準備室は、少年漫画雑誌を読み耽る生徒、友人とトランプゲームに興じる生徒、教科書を開いて勉強している生徒、そんな感じの風景が当たり前になった。あぶれることが前提でなければ、それらアイテムをわざわざ持ってこないはず。だから、あぶれる生徒は固定していたのだと思う。

自分は、マイコン雑誌を持ち込むことにした。キーボード配列が印刷された紙を机の上に広げて、それを叩いて時間を潰した。トレーシングペーパーの方眼紙に漫画キャラをトレスして、LINE文用の座標値を一つ一つ調べて、ノートにメモしていった。そんなことしかできなかった。

ガラスの向こうでは、おそらく上級生なのであろう、体格のいい生徒達が、MZ-2000でいつもゲームをしていた。それも、キャラグラのみのゲームだった。

見ていて腹が立った。文字だけのゲームなら、MZ-80K2Eでも動かせるではないか…。どうしてそんなものをわざわざMZ-2000で動かすのか。こっちはグラフィック画面を使ってみたくてたまらないのに。どうせやるならグラフィック画面を使ったゲームで遊べよ。だったらまだ納得するのに。

いや、そもそも、せっかくマイコンが自由に使えるのに、どうしてプログラミングをしないのか。君達、カーソルキーとスペースバーしか押してないじゃないか。ゲームだけならファミコンで十分だ。わざわざ何十万もするマイコンでしょぼいゲームを遊ぶ必要はないだろう。

おそらくその時期に、マイコン・パソコンを使ってゲームしかしない層への憎しみのようなものが、自分の心の中で生まれてしまったのだと思う。この気持ちは、後々まで尾を引いてしまった。

大学のマイコンクラブに顔を出した時も、MSXで市販ゲームしか動かしていない先輩達の姿に幻滅してしまって、次第に足が遠ざかってしまうことになった。ここには仲間は居ない。自分が軽蔑するタイプの人間しか居ないのだと。しかし実際には、自分と同様、何かしらを作ることに価値を見出し、在学中、プログラミングその他にずっと熱を上げていた先輩・同学年の学生が多々参加していたのだけど。それに気づくのは、卒業間際になってから。今考えると、少し惜しいことをしたように思う。

閑話休題。高校時代のクラブ活動の時間は、1年、2年と、そんな感じだった。あの時間帯にMZのキーを叩くことができた記憶はない。

もっとも、2年間ひたすら悶々としていたわけでもなかったように思う。実習準備室でノートにメモした座標値データは、家のMZ-731のプロッタプリンタで絵を描くことに使えたし。また、高校2年だか3年だかの時期に、親に頼んで SHARP X1 turbo を買ってもらった記憶もある。640x200(400?)で8色表示ができるマイコン。しかもPCGつき。グラフィック画面でアレコレ描くことに夢中になったが、もしかすると、MZ-2000に一切触れなかったある種の恨みのようなものを、X1 turbo にぶつけて解消していたのかもしれない。また、ある意味ではこの時期に、コンピュータグラフィックというジャンルへの想いのようなものを、妙にこじらせてしまったのかもしれない。それが結果的に良かったのか悪かったのかは分からないけれど。いや、今の状態を考えると、結果としては悪かったのだろうか。

高3時は、コンピュータクラブを選ばなかった。もうこんな時間の潰し方は嫌だと思って、自主的に変えたのか。それとも定員オーバーで選べなかったのか。そのあたりの記憶がない。もし、先生が選別するとしたら、2年間も同じクラブを選択し続けた生徒は、率先して外すだろう。今まで十分過ぎるほどコンピュータに触ったはずだから。まあ、実際には一度も触ったことが無かったわけだが…。何にせよ、後者だった可能性はあり得る。

とにかく、3年時は、漫画クラブを選んだ。今まで、ノートの片隅に落書きする程度で、本格的な漫画なんて描いたことは無かったけれど。ずっとそういう分野に興味はあった。

漫画クラブは、ちゃんと先生が教室に現れて、毎回お題を出してくれた。コンピュータクラブの放置状態とは雲泥の差。ただし、お題にはゲンナリした。基本的に、1コマ漫画か4コマ漫画の形で描けという。

当時の自分にとって、漫画と言えばストーリー漫画。1コマ漫画や4コマ漫画なんて、まともに取り組むものじゃない、とすら思っていた。なんてつまらないお題を出すんだろう、このクラブを選んで失敗だったかもしれない。そう思った。

しかし。実際にやってみたら、とにかく頭を抱えた。自分の描いたものは、全然これっぽっちも何一つ面白くない。普段つまらないと切り捨てていた新聞の4コマ漫画が、いかに優れた作品群なのか思い知らされた。しかも4コマ漫画家は、これを1日1本分必ず描くのかと。まとめて描き貯めるのか、毎日1本ずつ描いていくのかは知らないが、なんという偉業なのだろう。

約1年間 ―― いや、3年時だから、期間は1年2年時より短いはずだが ―― 4コマ漫画を描いてみて、その難しさを知ることはできた。楽しい時間だったかと言うとそんなことはなく、ひたすら辛い時間だった。自分には4コマ漫画の才能なんてこれっぽっちもないのだと毎週思い知らされるのだから、楽しいわけがない。…本当は、漫画は才能で描くのではなく、ある程度のレベルまでは知識量と訓練で描くのだけれど。当時の自分はそんなことを欠片も知らなかったので、ただひたすら才能が無いのだと結論付けるしかなかった。何にせよ、漫画クラブのソレは、方眼紙の上に描かれた漫画絵の座標取り作業に比べれば、はるかに得るものが多い時間だったと思う。

あの時期に、もっと真剣に4コマ漫画を描くことにのめり込んでいたらと思ったりもする。まさかこれほど、萌え4コマ漫画が普及する時代が来るとは夢にも思ってなかった。あの時期に、この状況を予測して、何か身につけられていたら、その後の展開も多少違ったのではあるまいか。…いや、そんなに甘いものではないだろう。

そんなことを思い出してしまったのでメモ。オチはないです。スミマセン。

2010/12/19() [n年前の日記]

#1 [windows] Perl+Tkxでまだハマってる

ハマってます。

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

Tkx で Iwidgets が使えない問題をどうにかしたいわけで。ActivePerl をアンインストールして、Starwberry Perl 5.12.1.0 をインストールしてみた。DL・インストールしたのは、strawberry-perl-5.12.1.0.msi。

インストール後、cpan Tk と打ってみた。…コレは上手く行ったみたい。テスト時に次々と Tk っぽいウインドウが開いて、なんだか感動した。

cpan Tkx と打ってみた。これはダメだった。Tcl だかが入らないみたい。検索してみたけど、英語圏のほうでも「入らねえス」みたいな話が。Strawberry Perl で Tkx はダメ、ということか。

というかxxxx/Tk自体がダメなんじゃないのか。 :

もう疲れたよ。Tkを使うからには Tcl/Tk を学べ、みたいな状況なのか。参ったな。

まだ wxPerl を習得したほうがいいだろうか。それとも Python + Tkinter のほうがマシか。どうして Perl は、こうもGUI関係が…。ソースの中身を見れて、修正も簡単で、かつGUIツールも作れるような何かはないものだろうか。

ActivePerlを入れ直した。 :

Strawberry Perl はアンインストールして、ActivePerl 5.12.2 build 1203 を再インストール。

昨日メモしたソレにプラスして、以下のモジュールも ppm で追加。
  • Perl-Tidy ... Perlスクリプトを整形してくれる。
  • dmake ... CPANを使うのに必要らしい。
  • MinGW ... CPANを使うのに必要らしい。
  • EXtUtils-XSpp ... wxPerlが依存?
  • PAR ... Perlスクリプトをexe化するのに必要。
  • PAR-Dist ... Perlスクリプトをexe化するのに必要。
  • Getopt-AtgvFile ... Perlスクリプトをexe化するのに必要。
  • Parse-Binary ... Perlスクリプトをexe化するのに必要。
  • Win32-Exe ... Perlスクリプトをexe化するのに必要。
  • Win32-GUI ... Windows上でGUIのプログラムを作れる。
  • Tk-CursorControl ... Tk-ToolBarが依存。
  • Tk-ToolBar ... ZooZ.plを動かすのに必要。
更に、
cpan Module::ScanDeps
cpan PAR::Packer
を。

以下で動作確認。
  • wxperl_demo.bat で、wxPerl のデモを起動。
  • widget で Perl/Tk のデモを起動。
  • ptked で Perl/Tk を使ったエディタのデモを起動。
  • tkx-ed で Perl + Tkx を使ったエディタのデモを起動。
最初、Wx 0.98 をインストールしたら wxperl_demo が動いてくれなくて。Wx 0.97.x をインストールしたら動いてくれた。

Iwidgetsはなんとかなったかも。 :

_Getting Tkx to use arbitrary Tcl/Tk installs | ActiveState Community Site

以下の指定が目に入った。
set PERL_TCL_DL_PATH=C:\Tcl\bin\tcl85.dll
環境変数 PERL_TCL_DL_PATH に、ActiveTclインストールフォルダ/bin/tcl85.dll を指定すればなんとかなる、ということ…?

試してみた。む。Iwidgets を使ってるスクリプトがエラーを出さずに起動した。上手く行ったのか…?

と思ったが、今度は Tkx::package_require("ctext"); を使ってるスクリプトが動かなくなった。ctext なんて見つからない、と文句を言われる。うーん。

ActiveTcl に ctext とやらをインストールしてみたり。teacup install ctext みたいな。その後、ctext とやらを使ってるPerlスクリプトを実行してみたところ、起動してくれた。なんとかなりそうな予感。

PARも試した。 :

PARを使うとPerlスクリプトをexe化できる。pp -o hoge.exe hoge.pl みたいな。一応exe化できた模様。しかし、255Byte、標準出力に文字列を出力するだけののスクリプトなのに、出来上がった exe は 4.2MB。デカ過ぎる。

Win32::GUIとWin32::GUI::Loftをインストール。 :

Windows上でGUIのプログラムが作れるらしい。

Win32::GUI は ppm で Win32-GUI をインストール。

Win32::GUI:Loft は、 _The GUI Loft -- a Win32::GUI designer/builder for Windows User Interface creation in Perl から Loft_binary.zip をDLして解凍。PPMフォルダでDOS窓を開いて、
ppm install -force AdHoc\Win32-GUI-AdHoc.ppd
ppm install -force Loft\Win32-GUI-Loft.ppd
をした。

参考ページ。
_【Perl】Win32::GUI::LoftでGUIプログラミング - blog.remora.cx

GUIビルダーを2つほど見かけた。 :

vptk (Visual Perl/Tk) と VisualCamel というのを見かけた。vptk はCPANに、VisualCamel は sourceforge にあった。


_vptk - search.cpan.org
_VisualCamel - WYSIWYG Perl/Tk GUI Design | Download VisualCamel - WYSIWYG Perl/Tk GUI Design software for free at SourceForge.net

VisualCamel.exe をDLして実行してみたけど、まだ完成度は低い感じ。しかし2010年の版が置いてあった=新しいツールのように見えるので、今後の改良・機能追加に期待大。

vptk は、前述のページから vptk_w_2_38b.tgz をDLして解凍。適当なフォルダに入れて、vptk_w.pl を実行。左側に出ているリスト項目の上で右クリックして色々追加していけるらしい。

ついでに、CPAN?から _ZooZ.pl というGUIビルダーもDLして解凍。ZooZ.pl を実行。Excelで文書作成でもするかのように、マス目の中にWidgetを入れていくので分かりやすい気もする。が、scrollbar の入れ方が分からない…。

#2 [pc] Amazonからキーボードが届いた

今までサンワサプライのSKB-WL12BKを使っていたのだけど。極稀に無反応になるのと、キーの押下げに結構力が入るような感じがしていたので、違うキーボードが欲しいなと思っていたわけで。

今現在届いたソレで打っているけど。メインキー部分はすんなり移行が出来ている感じ。打鍵音もかなり静か。鉄板が入っているらしいので、薄い割には結構重い。その分設置時は安定しているし、しなり等も感じない。店頭で確認せずにいきなり注文したけれど、ワイヤレスキーボードの中では比較的評判がいいだけあって、これはかなりイイ感じ。不安点は、今までフルキーボードを使っていたため、カーソルキー,Insert,Delete,ファクションキーの位置や、Home,End,PgUp,PgDnの押し方に慣れることができるかどうか。このタイプのキーレイアウトは、ノートPCをたまに使う時しか触ってないので、さて、どうなることやら。

テンキーは、手元にあるワイヤレスキーボード(テンキー無し)を使う際に必要だなと思えたので。キーのサイズが16mm程度のモノを選んだ。はず。

2009/12/19() [n年前の日記]

#1 [comic] BOOK-OFF Onlineに注文してた漫画単行本が届いた

続きが気になっていたけど、続きを買ってなかった漫画単行本を、この際ごっそりと購入。

EXIT 8〜11巻 (藤田貴美著)を読んだ。 :

4〜7巻は持っていたのだけど、その後の巻を店頭で見かけることも無く。先日本棚を整理してたときにいっそ処分しようかと思って読み直したら続きが気になってしまったわけで。検索してみたら、どうやら掲載誌・出版社が変わっていたらしい。もはや、バンド漫画?版超人ロック。というほどでもないか…。今時、掲載誌が変わる連載も、そんなに珍しくはないだろうし。

相変わらず楽しんで読めたのだけど。この作品、続きは一体どこで連載されているのだろう…。もはや、バンド漫画版ガラスの仮面。いつ完結するのやら。

BREAK-AGE 9,10巻 (馬頭ちーめい著)を読んだ。 :

やっと最後まで読めた。大団円だった。

今だったら、メカに関しては3DCGで作画するのだろうな…。

本気のしるし5,6巻 (星里もちる著)を読んだ。 :

星里もちるはどこに行ってしまうんだ、そっちの路線はなんだか個人的に違うのだが、と不安になりながら手持ちの1〜4巻を読んでたけれど。ラストのあたりはちょっと星里もちる作品らしくなってくれて一安心。

ルナハイツ1〜4巻 (星里もちる著)を読んだ。 :

星里作品お得意?の同居モノ。帰ってきた。帰ってきてくれた、という印象。やっぱりこっちの路線の方が個人的に好き。

最終兵器彼女 6,7巻 (高橋しん著)を読んだ。 :

なるほど、こういうラストだったのか…。Sランクの豚の背中系漫画だなと思ったり。

2008/12/19(金) [n年前の日記]

#1 [nitijyou] 体調悪い

なんだか判らんけど異様に眠い。ファンヒータ使ってるから空気が悪くなってるのかな。

#2 [digital] ひかりTVについて少し調べたり

親父さんが、ひかりTVの電話セールス ―― 2ヶ月間は無料で見れますから、という文句に引っ掛かってしまった。

昔、4thMediaのセールスを受けたときに調べた範囲では、その手のサービスはIPv6で提供されてるため、IPv4のみに対応してるルータがある環境では手前にHUBを入れないと使えない、てな話があったような記憶が。そのあたりを調べてみたら、今も同じで、IPv6対応ルータが必要らしい。

ウチで現在使用してるのは、IO-DATA NP-BBRL。検索したところ、LANケーブルを、LANポート→WANポートに繋ぐ、てな接続にすれば、一応IPv6対応ルータっぽくなるらしい。が、自宅サーバを公開してるウチの場合、本当に問題は出ないのだろうか…? LANポートに接続された各PCは、IPv4で今までどおりに接続できるのだろうか…?

無線LANアクセスポイントとして、NEC Aterm WR6670S も使ってるのだけど。それをルータとして使えば、LANポートに _STB を繋ぐような、単純な構成にするだけで済むらしい。となると、NP-BBRL を箱にしまって、Aterm WR6670S で置き換え、てな作業をしたほうがいいだろうか。ルータ2台を動作させるより、1台だけ動作させたほうが、電気代も少なくて済むかもしれんし。

ひかりTVの場合、マルチキャストなる方法?でパケットを送るらしい。接続されてる全ての機器に、問答無用でパケットを送りつけてしまうことで、送出側の機器の負担を少なくするのだとか。しかしそのことで、無線LANを使ってる環境などでは、無線LANの帯域のほとんどをそのパケット送信で使い果たしてしまい、ひかりTVを使ってTVを見ている間はPCがインターネットに接続できなくなる、てな話も見かけた。ルータ側の設定を変更して、帯域制限を変える・無線LAN側にパケットを投げないよう設定する等で改善する場合もあるらしいが…。しかし有線で繋がってる全機器に、無関係なパケットが送りつけられるという状況に変化はないのだろうから、それもそれでなんだか気持ち悪い。

親父さんはカモにされてる気がする。 :

ADSLから光ファイバーにしたときも、親父さんが電話セールスで契約しちゃったし。plalaのサイト上から申し込めば何ヶ月か無料で使えたのに、電話セールスに引っ掛かったために、その手の割引特典が一切付かなかったわけで。

ひかりTVの電話セールスは子供や老人ばかり狙って行われている、という話も某掲示板で見かけたり。子供を狙ってもソレダメなんじゃないかという気もするが、今回の親父さんの例を鑑みると、少なくとも老人を狙ってテキトーなことばかり並べ立ててセールスしてる輩が居るのは間違いない、のかもしれないとも思ったり。いやまあ、電話セールスで老人を狙うのはデフォかもしれんとも思うのだけど。

2007/12/19(水) [n年前の日記]

#1 [nitijyou] ヤマダ電機を覗いてきた

須賀川にも出店したのだとか。夜食を買いにスーパーに行ったついでに覗いてきた。

結構広い。ケーズデンキ須賀川店と同じくらい広いかも。品数もそれなりにありそう。たぶん。

ただ、自転車で行くにはちょっとツライ。途中に坂がたくさんあるので。

#2 [nitijyou][digital] ドアスコープを買ってきた

ヤマダ電機を覗いたついでにビバホーム(ホームセンター系のお店)まで足を延ばした。期待せずに探してたら、180度タイプのドアスコープを発見。この店に置いてあったとは…。灯台下暗し(?)。1,980円で購入。 _株式会社ノムラテックの製品。 超広角空転式ドアスコープ。

帰宅後、少し弄くりまわしてみたけど、デジカメに流用するには防犯用の機構が障害に。ドアの外側から回せないように、外側に位置する部分がくるくると空転するようになってるのだけど、そのせいで最も外側のレンズ部分がふらふらして固定できない。つまりは視界が安定しない。該当部分を外してみたけれど、今度は視野が狭くなった。どうやら、該当部分についてるレンズも利用することで、180度の視界を得ている模様。何かしら上手い固定の仕方を考えないと…。

#3 [nitijyou][ubuntu] ktからチラシファイルが届いた

サイトにアップロードしてほしいとのこと。今回からpdfで構わないとの話だったはずなので、Excel 2007 で開いて pdf 出力。

出力した pdf を、VMware 上の素の WinXP で表示確認。文字等はちゃんと表示されてるように見える。

さらに、VMware 上の Ubuntu 7.04 で表示確認…しようとしたところでつまづいた。DLしたpdfをダブルクリックすると、「このソフトを使えばこのファイルが開けると思うよ」と教えてくれる。そこまでは賢いのだけど、いざ、その表示用ツールをインストールしようとすると、依存ライブラリのパッケージが404。どないせーちゅうんじゃ。

#4 [ubuntu] Ubuntu 7.10 のVMwareイメージを落とそうと試行錯誤

Ubuntu 7.04 でパッケージをインストールしようとすると404と言われてしまったのだけど。これはたぶん 7.10 が出ちゃったから、以前のバージョンはもう誰も面倒を見てないんだろう、7.10 にするしかないのだろう、と思ったわけで。

ところが、7.10 の VMware 用イメージは、BitTorrent なる方法でしか配布していないらしい。サーバに負荷がかかる・回線の転送容量制限を超えてしまう等あるのだろうから、仕方ないのだろうけど。ウチはplala使ってるから、P2P関係のポートが使えないようになってたり、使えても速度的な制限を設けられたりするらしいという話もあるわけで、極力やりたくないのだけどなぁ。うーむ。

Opera には BitTorrent 関係の機能が入ってるらしいのでそれを試す。 :

が、Operaのソレを使うには、どうやらポートを開けておく必要があるらしい。

ルータ IO-DATA NP-BBRL のポート設定で、Operaが使うポートをメインPCに充てるように設定。しかし、ルータの再起動が必要なわけで。家族の様子を見て回って、全員がネットに接続してない頃合いを見計らってルータ再起動。面倒だな。

OperaでDLし始めたものの、めちゃくちゃ遅い。DL完了までに30時間、などと予測表示されてる。ダメだこりゃ。

つーかルータのポートを手動で開けることを要求する機能なんて一般的に普及するわけねえだろと思うんだけど、どうなんだろうな。

BitCometなるクライアントを試してみた。 :

UPnP を使うように設定しておけばルータ側でアレコレしなくて済むらしいので、導入してみた。

インストール・起動したら、「同時接続数が少なすぎるがな。TCPIP.SYS にパッチを当てて増やしますぜ」と言ってくる。なんだか怖いな。でも、当てなきゃ使えないのだろうし。泣く泣く(?)パッチを当てる。

DL開始したものの、こちらもなんだか時間がかかりそうな雰囲気。そのままにして寝る。

_Intelligent TCPIP.SYS patcher / EventID 4226 patchの使い方 :

_[220] BitComet detect that your current setting of Half-Open TCP Connection

パッチを当てなくても使えることは使えるのか。これは失敗したかもしれん。

2006/12/19(火) [n年前の日記]

#1 [cg_tools] ユーザIDが2つある件についてAdobeに電話で質問

確認してもらったところ、電話口で知らされたユーザIDは正しいけれど、メールで届いたユーザIDは別の人のIDだったらしい。むぅ。そんなことがあるのか。

話の流れで、名前で検索してもらったら、自分のユーザIDは複数登録されているらしい。将来的には AdobeID に集約したいと考えてる旨を伝えたら、担当の方が今回の電話で集約作業の受付をしてくれるとのことで。用紙に記入してFAXしなきゃいけないものかと思っていたので、助かった。ただ、集約作業は、連絡手段の都合もあって、数週間かかるとの話。

電話を切った後で、Adobe サイトで関連FAQを眺めたら。「トラブル防止のために集約作業の申込みは文書で行ってほしい」と書いてあった。ええのかな…。まあ、Adobeに電話すると、電話でのやり取りを録音してると最初に言ってくるし。録音データを調べれば、トラブル回避もできるんだろう。と、勝手に思い込むことにする。ていうか、文書で送ろうにもこちらはその複数あるというユーザIDを把握してない状態なんだし。特例?として作業するしかないんだろうな…。

#2 [web] Yahoo! JAPANの迷惑メールフィルタって

どういう処理をしてるんだろう。ユーザごとに学習させなきゃいけないような気がするんだけど。SPAM業者が「これは迷惑メールじゃない」「これも迷惑メールじゃない」と情報を送信してたら、全く効果が得られなくなってしまうような予感が。

#3 [iappli][cg_tools] コーヒーブレイク画面を作成中

画像が届いたので引き続き差し替え作業を。背景アニメ用の画像が届いたので、これでようやく背景がそれっぽくなる。

以前送られてきたデータの中に、コーヒーブレイク的画面に使うらしき画像が入っていたものの。仕様が知らされてないのでどうしたものか判らず。とりあえず表示しておかないとアレかなと思ってテキトーに表示…をしていたところで画面イメージが届いたので助かった。相変わらず仕様は判らないけど。

容量オーバー。 :

送られてきたgifの合計サイズが、505シリーズのスクラッチパッド容量、200KByte を超えている。ハイスコアの記録や、サウンドデータの格納にも使っているので、実際にはそれより10〜20KByte少ないわけで。厳しい。厳しいというか、そもそも入らない。

画像を編集。
  • 画像の中で、同じ部分と思われるところを切り出し・分割。>画像面積を減らすことでバイト数を削減。
  • 同じパレットを使ってると思われるものを結合・連結。>パレットデータを個別に持たないことでバイト数を削減。
ある程度容量削減できたものの、ロゴ画像が入らない。これは標準フォントで表示するしかないよな…。

利用したツールは、
EDGE・ 256色画像編集ツール。画像分割・パレット値変更・ドット編集に使用。
ViX・ 画像管理・変換ツール。画像結合に使用。マウスの右ボタンでD&Dすると複数画像を指定方向に結合できる。
Gcon・ 画像変換ツール。フルカラーbmpに変換するのに使用。フルカラーbmpにしないで、gifのまま ViX で結合しようとすると、各gifのパレットの並びが異なるので結合結果画像の色がおかしくなる。
IrfanView・ 画像ビューワ。減色に使用。
Giffy・ gif変換ツール。gifに戻すときに使用。EDGEによるgif保存では不要なパレットデータも含むので容量が増えてしまう。よって、一旦コレを通す。ただ、パレットナンバーは異なっていてもパレット値が同色だった場合、統合されてしまうので気をつける必要が。特に、透明部分の色を適当に指定してあるとまとめられてしまって困ってしまう。

#4 [anime] 幻魔大戦がNHK-BSで流れてた

全編を見たかったが、自分の部屋にはBSチューナーがないので見れない。かといって作業もあるので階下で見るわけにもいかない。ということでニューヨーク編のあたりまで見て諦めた。まあ、どうしても見たかったらDVDレンタルしてくればいいんだろうけど。…幻魔大戦のDVDなんて、今時レンタルで置いてあるのかよという気もするが。

台詞のセンスがなんだか凄い。今やったらギャグになりそう。

作画が凄い。セルだから、がたつき?等が気になるけれど。作画に関しては今見てもなかなか。爆発やエフェクトが当時のアレです。やっぱりいいなぁ。

ところどころで妙にガクガクと動くシーンが。もしかすると、1コマ単位での点滅、いわゆるポケモンショック的な効果が多用されていて、放送局のチェッカ?に引っ掛かってしまったのだろうか。当時は当たり前のように使ってたからなぁ…。自分もゲームで使ってたし…。

2005/12/19(月) [n年前の日記]

#1 [linux][firefox] Linux 版 Mozilla Firefox ではURLやページタイトルをコピーできない

この日記をLinux機上で書くにあたって、WebページのURLやタイトルをコピーするのが面倒だなと。そこで、JSActions や CopyURL+ を導入したのだけど。…URLもページタイトルもコピーできないのであります。どうもそのへんの機能は Windows 専用だったらしい。おそらく、Windows で言うところの、「クリップボード」に相当するモノが、Linux + X には存在してないんだろうなぁ。 *1

困った。極めて不便。目の前に「ページタイトル」というテキスト情報が表示されているというのに…。それがコピーできないというだけで、これほどストレスが溜るとは。Linuxを使用する限りは、blogを書くことすら苦行になってしまうのか。

もしかして、そのせいで w3m 等が流行るのであろうか。> Linux界隈。グラフィカルな表示をしてくれるブラウザを使っても、そこに表示されてる情報の流用が非常に難しい場面が多いから、故に全てをエディタ上で完結させるべく試行錯誤してしまうのであろうか。
*1: 各アプリが独自にそれら機能をもつように対応してるのではないかと勝手な想像。

#2 [linux] OpenOffice 2.0 を Vine Linux 3.2 にインストール

チラシを作らないといけないので、ワープロソフトが必要なのであります。

インストール作業は Redhat あたりと同じらしい。 _OpenOffice関連サイトで解説 されてた。

ああ。やっぱり、ページタイトルをコピーしたい…。URLクリップ作業すらできんのか…。一々ソースを表示してコピーしてたらアホだし。

#3 [linux][emacs] Gnomeエディタならコピーペーストができるみたい

emacs で貼り付けをしようとするからアレなのか。もしかして、XEmacs あたりなら Mozilla Firefox との連携ができるのかしら。

x-select-enable-clipboard とやらを設定すればいいらしい :

_Linuxメモ
インストールしたてのemacs21は、killやyankでxのclipboardにはアクセスしない。つまり、emacsと他のxアプリとの間で copy and pasteできない。これを回避するには、x-select-enable-clipboardオプションをonにすればよい。

killringとclipboard より

なるほど。問題は、どうやって on にするかわからんってことだな…。

_emacs/Tips - kotsuka
M-x clipboard-yank
というコマンドを使えば、x11のclipboadの内容を貼り付けることができる。

emacs/Tips - kotsuka より

おお!

逆に emacs のリージョンを clipboard に送るには、.emacs に以下のように書いておく必要がある。
(setq x-select-enable-clipboard t)

emacs/Tips - kotsuka より

なるほど…。

Gnome 上で emacs を起動すると立ち上がるのが速いのだけど、XFce4 上で起動するとめっちゃ時間がかかるのは :

何故なんでせう。それと、キーリピートがめっちゃ遅いのですが。emacs ってこんなもんなのだろうか。キーリピートに頼ったカーソル移動をするな、という尊師の教えですか。

見た目の行でカーソル移動ができないのもシンドイ。実際の行単位でしか移動できないのだろうか。物理行? 論理行? とやらの設定項目が存在するのかしら。

2004/12/19() [n年前の日記]

#1 [nitijyou] DVD-Rを買ってきた

自転車でK's電器まで。10枚入りスピンドルケースものを購入。maxell製。店頭にあった商品は、ほとんどが、1枚1枚ケースに入ってるものばかり。スピンドルケースのものは、それしかなかった。

途中、今までCD-Rをちょくちょく買ってたスーパー(?) *1 に寄って、DVD-Rの品揃えを確認したのだけど。置いてあるのは、録画用DVD-Rしかなく。120分とか240分とかそんなのばかり。つまりはそれだけ、DVDレコーダーが普及してるということなんだろうな。

5インチベイ用小物入れの材料になりそうなものを探す :

帰り、ダイユーエイトに寄って、探してみたけど。どれも値段的に高い。やはり、自作しようとすると、高くつきそうな感じ。

近所のグリーンモールに寄ってジュース等購入 :

めちゃ混んでた。何かの抽選をやってたようだけど、カップラーメンが山と詰まれていて、なんというか。…年末になると、必ずこの手の催しをするものなのですな。漫画なら、必ず何か当たって、登場人物達が海外だかどこだかに旅行をしますな。そのエピソードの何話か前に、作者と編集者が取材旅行するから、本編は少し休載。…んなこたどうでもいいか。

*1: カワチという名前のドラッグストア。

この記事へのツッコミ

Re: DVD-Rを買ってきた by けいと    2004/12/21 02:20
> 置いてあるのは、録画用DVD-Rしかなく。

メディアとしては録画用もデータ用も基本的には同じなんですけどね。
(確か「DVD-R for General規格Ver.2.0」とか言うやつ)

個人的には「私的録画保証金」を払いたくないので
意地でも録画用は買ってません:-P
(録画なんてしないし)
Re: DVD-Rを買ってきた by Y    2004/12/21 20:58
私の場合は安ければどっちでも良いって考えですので
同一メーカーでデータ用と録画用があれば安い方を
購入してますので結構録画用にデータ詰めてたりします。

個人的にFUJIFILMやTDKの4倍は比較的安い割に8倍で
焼けるので常用しております。
Re: DVD-Rを買ってきた by mieki256    2004/12/22 03:19
> メディアとしては録画用もデータ用も基本的には同じ

なんと。それはいい話を聞きました。
緊急時には録画用を入手してしのげる、ということですな。

> 私的録画保証金

あー、やはりそういうものがかかってますか…
自分も録画はしないので、(ていうか機材持ってないし)
それは払いたくないなぁ…

と思ったけど(続く)
Re: DVD-Rを買ってきた by mieki256    2004/12/22 03:22
> データ用と録画用があれば安い方を購入

録画用が安い場合もあるのですか!
録画用=値段が若干高い、と思い込んでましたよ。

考えてみれば、流通量が多いほうが安くなりそうだし、
そういう場合もあるのかもしれないなぁ…
Re: DVD-Rを買ってきた by けいと    2004/12/22 16:36
お店によるみたいですね。

私の近所でも、
録画用がやすい場合もあればデータ用が安い場合もありますし。

#パソコン屋なのに録画用の方が安く売ってるって
#言うケースもあったりするし。

で、私は意地になって、
データ用が安い店を探して買ってます。

と、いっても、DVD-Rメディアもちょっと買えば足りちゃうので
そんなにしょっちゅうじゃないんですが。

#そろそろVHSテープにとり貯めたやつもDVDに引っ越すかな。
#やっと録画用の用途が…

#2 [pc] 親父さんPCに AVG 7 free をインストール

今まで、親父さんPCでは、AVG 6 free + POPFile を利用してたのですが。AVG 7free + POPFile の設定方法がわからんので、もうしばらくは6でいいかなと思ってたのであります。が。最近、AVG 6 が、「新しい版が出てるデース」「有償版を購入するか、せめて新しいフリー版を入れてほしいデース」らしき英語メッセージをしょっちゅう表示するようになったわけで。メッセージが表示されるたび、親父さんから、「こりゃ一体なんだ? ウイルスか?」 *1 と声がかかったので、この際だからインストール。

AVG 6 のときの設定方法をメモって、AVG 7 でも同様に設定 :

変わったのは、「USER@COMPUTER」が、「USER/COMPUTER」になったぐらい。AVG 7 のサーバー設定を、 AVG 6 と同様にして、OEのメールアカウントの設定で「@」を「/」にしただけで、一応動いてくれた。ように見える。

*1: 「ウイルスか?」は、ちょっと話作ってます… (;´Д`)

2003/12/19(金) [n年前の日記]

#1 [nitijyou] 妹を眼科まで車で送っていったのだけど

朝の通勤ラッシュに鉢合わせ。交通量が多くてヘトヘト。しかし妹のほうが悲惨な状況だったらしく、受付開始10分前に行ったにも関わらず既に36番目だったりそれから1時間後が診察開始時間なのだけどそこから更に3時間待たされたあげくこのままじゃ午後の仕事に間に合わないと事情を話したら診察順をずらしてもらえたけど診察自体は5分で終了してなんだそりゃでしかも家に電話しても自分がバタンQ状態で連絡つかない上に *1 バスの時間も合わなくて歩いて帰ってきたと。あの眼科には行かんとプンプン怒っております>妹。…須賀川市には眼科が2つあるのだけど、片方はいつも空いてるけど完全にヤブ、もう片方は腕はまあまあだけど爺婆で待合室が埋め尽くされているわけで。隣の市の眼科まで行ったほうが状況的にはマシかも。
*1: それでも2時間ほど連絡を待ってたりはしたんだけど>自分。まさかそんなにかかるとは。

この記事へのツッコミ

Re: 妹を眼科まで車で送っていったのだけど by がんした    2003/12/25 08:06
オイラがガキの頃から、眼科や耳鼻科は、病院が開く前から外に並ぶのが
デフォです。やっぱ客単価が低いのが原因なの?

世間では小児科の専門医が不足してて、急患の命に関わるとかマスコミが
取り上げてますが、地味に耳鼻科や眼科なども減ってるような気がします、
少なくともウチの近所では。

未だ、市内に2件あるだけマシかも(1件しかなければ選択の余地が無い)しれない。
Re: 妹を眼科まで車で送っていったのだけど by mieki256    2003/12/27 01:34
>眼科や耳鼻科は、病院が開く前から外に並ぶのがデフォ
歯医者みたいに予約とかはできないものですかね。
患者の待ち時間さえ最小にできればそれほど問題は無いような。
…無理か。医者の側で、時間的な空きができてしまう。
なかなか難しい問題であります。

#2 [tv] 北の国から

地井氏の演技を見ていて、監督や脚本家という人種は人間の皮を被った鬼か悪魔の類だなと思った。

2002/12/19(木) [n年前の日記]

#1 今度のコミケ

というわけでこのサイトのTOPページでも、
コミケの参加スペースについて宣伝しておきましたです。

といっても…
このサイトって、その参加する友人達自身しか主に覗いてないんじゃないか?
という気もしてたりしますが… (;´Д`)
まあ、宣伝は多ければ多いほどいいよね、てことで一つ (^^;

私自身は相変らずアレなんで上京(?)できないんですけど…(爆)

コミケと言えば。なんでも今度のコミケは、
_何も知らない素人の方が万単位_混入する可能性が高い そうですね。
うーむ。たしかに事故が起こりそうな話…

いや。これはヲタクにとって千載一遇のチャンスかも。
死者が出かねないほどの危険な状況に遭遇しても…
冷静沈着理路整然。統率の取れた、迅速かつ的確な行動。
見た目に似合わず、いざとなると頼り甲斐のあるオタク達の姿を
強烈なまでに彼等(彼女達)の目に焼き付けることができれば…
オタクのイメージアップに確実に繋がる…

…てのはちと無理がある話ですか (;´Д`)

2001/12/19(水) [n年前の日記]

#1 PC講座の速度

炊事当番でした。
チンジャオロース(ピーマン切るだけ)と、マーボ豆腐(豆腐切るだけ)を作りました。
…料理になってないじゃん。ダメ過ぎ。


NHK教育の夜9:30から、中高年向けのPC講座を放映してるみたいです。
ちらっと見たけど、わかり易い説明してますね。
でも、一緒に見てた親父さん、寝ちゃった(泣
説明が遅すぎると寝る。早過ぎるとわからない。難しいですな。

そういやなんとなく、パソコンサンデーを思い出したりして。
副音声でプログラム流してたんだよなぁ…
故・宮永先生って、当時は一体何の職業してたんだろ?


湖川先生の「アニメーション作画法」を読んでました。
ポーズのつけ方がわからなくなったので。
…ますますわからなくなった(爆)

2000/12/19(火) [n年前の日記]

#1 無料レンタル掲示板

冷蔵庫、そのまま運ばずに修理できた模様。
冷却部分のパーツが壊れてて、あちこち交換したらしい。
しかし、冷凍室はともかく、冷蔵室はなんだか冷えてない感が。
もっとも、周りの温度が低くて、わからないだけかもしれない。

ちなみに、納豆パックは関係ないらしい。
冷風口を塞いでも故障したりはしない、との事。
単に冷えなくなるだけだそうで。
疑って申し訳無い >納豆パック

そっち系のサイト用に、無料レンタル掲示板を2つほど申しこむ。
自分でCGI設置する手間暇を考えると、ホント楽ちん。
デザイン的にスッキリしたものも多くなってきてるようだし。
普通に使う分には、こういうので充分かも。

親父さんが忘年会で飲んでしまったので、車を持ちかえる為にオイラが出動。免許取っといて良かった。
夜の須賀川商店街を走ったけど…
クリスマスも近いというのに、人っ子一人歩いてない。
皆、店のシャッター閉めてるから当たり前だけど。
…寂れた街だなぁ。

1999/12/19() [n年前の日記]

#1 (NoTitle)星里もちる著、オムラ...

星里もちる著、オムライス最終巻(5巻)を読む。なんだか最後が妙にあっさりしてるような気が。まあ、この作家さんの描くラストはいつもそんな感じですので今更という気もしますけど。しかし「家族」をテーマにした作品というとオイラはつい山本直樹のスピリッツで連載してた作品(タイトル忘れた)を思い出してしまうのだけど、小学館の同種の青年向け漫画雑誌での連載作品として二つを考えると全然違いますね。これが作家性の違いなのでしょうかって比べてどうする>オレ
巻末のおまけ漫画を読んで不安になったのだけど、「家族」をテーマにしてこういう系統の作品を描き上げるというのは、もしかすると実生活で伴侶を獲得し親になった人じゃないとわからない部分があるのかな、なんて無意味な事を思ったり。
なんだかそれは、オイラにはツライです <なぜ?
この不安はアニメでもそうで。佐藤順一監督や宮崎駿監督の作品を見てると同様の事を思ったり。実生活で子供を持っていることが作品に反映されてるように思えます。
子供に見せたときどんな反応をするだろうか、自分の子供に見せるとしたらどう作るか、そういう想像が他の独身の監督さん達に比べ的確なので子供が単純に喜べる作品を多く作れるのかもしれない、とか。
そういやゲームではどうなんでしょう。自分の子供が面白がってプレイしてくれるゲームを作ろう、なんて思いながら制作したら、またちょっと違うのでしょうか。

どうなんでしょうね。よくわかりません。私バカだから… (by ベターマン)

とか思う以前に、やることあるような。

以上、20 日分です。

過去ログ表示

Prev - 2019/09 - 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