mieki256's diary



2016/01/11(月) [n年前の日記]

#1 [dxruby][dxrubyws] DXRubyWSを試してみる

自作キャラグラエディタを書いてる際、「これがもし、DXRubyWS を使っていたら、もう少し楽に書けるのだろうか…」と気になってきたわけで。ということで、少し触ってみて雰囲気だけでも掴んでみようかなと。

DXRubyWS って何だ? …Ruby + DXRuby を使って、GUIアプリを書けるようにするためのライブラリ、という説明でいいのでしょうか。ちょっと違う気もするけど。

初心者向けに、入門記事っぽくなるように、少し細かくメモっていきますよ、と。いや、自分がそもそも初心者だけど。

環境構築その1。 :

DXRubyWS は、以下から入手。

_mirichi/DXRubyWS

右上のほうに「Download ZIP」というボタンがあるのでクリック。DXRubyWS-master.zip をDL(ダウンロード)。

ちなみに、そのうち DXRubyWSの開発が進んで、どの時期の版か分からなくなると困るので、DXRubyWS-master_20160111.zip てな感じに日付を入れてリネームしておくことにする。

さて。DXRubyWS の readme.md には、 「DXRuby1.5.16dev用」 と書いてある。どうやら、動かすためには DXRuby 1.5 開発版(dev版)が必要らしい。

DXRuby開発版(dev版)は、以下から入手できる。

_DXRuby プロジェクトWiki - ファイル置き場

現在公開されてるのは、DXRuby 1.5.19dev (Ruby 2.1.0, 32bit用)。上記ページ内の該当リンクをクリックすれば、dxruby1519dev-mswin32-ruby21.zip をDLできる。

もし、Ruby 2.1 をインストール済みで、かつ、常用してる環境なら…。dxruby1519dev-mswin32-ruby21.zip を解凍後、中に入ってる install.rb を実行するだけで DXRuby dev版のインストールは終了して、DXRubyWS を動かせる状態にできる。

が、しかし。

環境構築の続き。複数のRubyバージョンを共存させる。 :

自分は普段、Ruby 2.0.0 + DXRuby 1.4.2 を使っていて。

DXRuby 1.5.19dev は、Ruby 2.1 用なので、Ruby 2.0.0 を常用してる自分の環境ではインストールできない。

なので、Ruby 2.1 もインストールして、Ruby 2.0.0 と共存させることにする。

以下から、Ruby 2.1 Windows版を ―― rubyinstaller-2.1.7.exe をDLして実行してインストールする。

_Downloads - RubyInstaller for Windows

注意点としては…。
  • Ruby 2.0.0 とは違う場所を指定してインストールする。Ruby 2.0.0と共存させたいので。
  • 「Rubyの実行ファイルへ環境変数PATHを設定する」「.rbと.rbwファイルをRubyに関連付ける」のチェックは外す。普段は Ruby 2.1 ではなく、Ruby 2.0.0 を使いたいため。

Ruby 2.0.0 と 2.1 の切り替えは、pik か uru を使う。以下の記事を参考にして、インストール方法や使い方を把握。

_pikの替わりにuru〜windowsで複数バージョンのrubyを切り替える〜 - Qiita
_Windows7にRubyInstaller+Pikで複数バージョンのRuby環境を整える - ひろうぃんの雑記

ところで、pik や uru を使って Ruby のバージョンを切り替えた時は、Rubyスクリプト(.rb) をいきなり実行せず、
ruby hoge.rb
といった形で実行しないといけない。.rb をいきなり実行すると、常用してる Ruby のほうが使われてしまうので。

とりあえず、これで Ruby 2.1 を使えるようになったはず。pik か uru で、Ruby 2.1 に切り替えて、Ruby のバージョンを確認。ruby --version で確認できる。ruby 2.1.7p400 と表示されたら、Ruby 2.1 に切り替えができてる。

DXRuby dev版を、ruby install.rb を実行してインストール。

インストールされた DXRuby のバージョンを、irb上で確認してみる。

irb は、Rubyを対話的に入力して実行するためのツール。…「対話的」って、どゆこと? インタラクティブってこと。(命令を伝えたら)その場で反応が返ってくるものを、「対話的」とか「インタラクティブ」と呼んだりします。たぶん。
> irb
irb(main):001:0> require 'dxruby'
=> true
irb(main):002:0> DXRuby::VERSION
=> "1.5.19dev"
irb(main):003:0> exit
DXRuby::VERSION には、"1.5.19dev" が入ってたので、ちゃんと DXRuby dev版がインストールできていることが分かる。

と、ここまでメモったところで気が付いた。DXRubyWS の readme.md には「DXRuby1.5.16dev用」と書いてある…。DXRuby 1.5.19dev、じゃなくて、1.5.16dev…。

_DXRuby プロジェクトWiki - ファイル置き場 には、DXRuby1.5.16dev ruby2.0.0(32bit)用があるわけで。

つまり、Ruby 2.0.0 を使ってるなら、1.5.16dev をインストールすれば DXRubyWS を使えた可能性が。わざわざ Ruby 2.1 までインストールする必要は無かったのかもしれない…。

まあ、何かしらで Ruby 2.1 が必要になる時もあるだろうから、各バージョンを共存させといても別にいいよな。などと嘯いて自分を納得させるのでした。

DXRubyWSのサンプルを動かしてみる。 :

DXRubyWS-master.zip を解凍すると、sampleフォルダが入ってる。中に入って、一通り動かしてみる。

ruby minsample.rb
minsample_ss.png
色んなウィジェット(GUI部品/コントロール)が出てきた。
  • ボタン
  • ラベル
  • テキストボックス
  • ドロップダウンリスト
  • チェックボックス
  • ラジオボタン
  • リストボックス
  • リストビュー
少なくとも、これだけのウィジェット種類が、用意されているのだな…。

各ウインドウは、位置変更のみならず、サイズ変更もできる。サイズ変更に追随しないレイアウトと、サイズ変更に追随するレイアウトが実現できているらしい。

ただし、一番大元の、背景色が黒のウインドウは、サイズ変更ができなかった…。

DXRubyを使ったスクリプトも、ウインドウサイズを変更すると中の描画がおかしくなる時があるので、DXRubyWSも似たような制限があるのかもしれない。が、それってつまり、デスクトップサイズに合わせてウインドウサイズを変更できない、作業しやすいウインドウサイズに変更できないということで、GUIアプリを作る場合は少々厳しい場面が出てくるような気もするのだけど、今はそのあたり考えないことにする。


ruby rubima.rb
rubima_ss.png
ウインドウの中で、おそらくは60FPSのゲームが動いてる…。敵オブジェクトをクリックすると、そのオブジェクトが選択されて、右側のウインドウ内に敵の情報(HP)が表示される。自爆ボタンを押すと選択中の敵が爆発して画面から消えたので、ゲーム内のオブジェクトに対して外部から制御ができるよ、というデモなのかもしれない。


ruby rubima3.rb
rubima3_ss.png
ウインドウの中でゲームを動かしながら、BGの表示位置を別ウインドウ内に表示できている。しかも、タイルチップを選んで、真ん中のウインドウ内でBGマップに書き込むと、ゲーム内のBG表示もソレに合わせて変化する。

ゲームを動かしながら、リアルタイムでその見た目を変更できてしまうあたり、凄いというか、面白いというか。Unityも、ここまではできなかったような気がする。…と言っても、Unityは、GUIでかなりの設定・指定ができるあたりが売りだろうから、比べるのもおかしい気がするけど。提供してる便利さが、そもそも違うというか。


ruby soundblock.rb
soundblock_ss.png
音の波形っぽいものが出てきた。Playボタンを押すと音が鳴る。スライダー、スピンボタン(スピンボックス?)が表示されていて、それぞれを変更してからPlayボタンを押すと音が変化することが分かる。

ソース内には、「簡易FM音源」と書いてあった。FM音源…懐かしい…。いや、今もDTMの世界ではフツーに現役ですが。


ruby splitcontainertest.rb
splitcontainertest_ss.png
もしかすると、コンテナを実現できているというデモだろうか…。「パネルE」と書かれてる部分はグループボックス? ラベル付パネル? なのかもしれない。パネルの中に、複数のウィジェットを配置できますよ、ということなのかな。


ruby statuswindow.rb
statuswindow_ss.png
これは何のデモか分からなかった…。


ruby tabtest.rb
tabtest_ss.png
タブの表示ができていて、かつ、スクロールバーもついていて中身をスクロールできる。


ruby test_autolayout.rb
test_autolayout_ss.png
各ウインドウのサイズを変更すると、中のウィジェットのサイズもソレに合わせて追随する。自動レイアウトのデモだろうか。


てなわけで、既に色々なウィジェットが使えそうなことが伝わってきた。

長くなってきたので、続きは別記事に分けて書こう…。

#2 [dxruby][dxrubyws] DXRubyWSのチュートリアル文書に従って試してみる

DXRubyWS を解凍すると、中に doc フォルダが入っていて、そこに説明文書が置いてある。

_tutorial01.txt と、 _tutorial02.txt が、チュートリアル文書(= 使用方法や機能を解説する教材のようなもの)らしい。

まずは、tutorial01.txt を写経して動作確認してみることにする。

ちなみに、スクリプトの置き場所は、libフォルダと同じ階層。
place.png

最も簡単なコード。 :

_tuto01.rb
require_relative './lib/dxrubyws'

Window.loop do
  WS.update
end
tuto01.png
真っ黒な画面が表示された。

要するに、DXRubyWS を使いたい時は、
  • 最初のほうに、「require_relative './lib/dxrubyws'」と書いておく。
  • 最後のほうで、「Window.loop do」「WS.update」「end」と書いておく。
としておけばいいんだよ、ってことなんだろう…。

マウスに反応させてみる。 :

_tuto02.rb
require_relative './lib/dxrubyws'

font = Font.new(32)

WS.desktop.add_handler(:mouse_push) do
  # マウスボタンが押されたら(「:mouse_push」のシグナルが来たら)…
  
  # 画面に「click!」と表示する
  Window.draw_font(0, 0, "click!", font)
end

Window.loop do
  WS.update
end
tuto02.gif
マウスボタンを押すと、画面に「click!」と表示された。たしかに、マウスに反応している。

DXRubyWS は、 _イベントドリブン で書いていく、らしい。…イベントドリブンって何だ? 何かのイベントが起きた時、そのイベントに対応した処理をするよ、ってこと。

例えば、このサンプルの場合は、「マウスボタンが押された」というイベントが発生したら、「画面に文字を描画する」という処理をしろや、と、WS.desktop.add_handler 〜 end のあたりで設定してある。だから、マウスボタンを押すと、画面に「click!」と表示されたわけで。

もし、イベントドリブンでは無い書き方をするとしたら…。例えば DXRuby で同じ処理を書くとしたら、たぶんこうなる。

_tuto02_b.rb
require 'dxruby'

font = Font.new(32)

Window.loop do
  
  # マウスボタンが押されたか、毎フレームチェックし続けて
  if Input.mousePush?(M_LBUTTON)
    # ボタンが押されてたら、画面に「click!」と表示する
    Window.draw_font(0, 0, "click!", font)
  end
  
end
毎フレーム、毎フレーム、「マウスボタンが押されたか?」「マウスボタンが押されたか?」と、飽きもせず、毎回毎回、延々と監視し続けて、もし押されてたら…という感じになる。

まあ、おそらく内部的には、イベントドリブンとやらも似たようなことを ―― 何かしらをずっと監視し続けて、とかやってると思うのだけど。プログラムを書く人間様としては、「○○が起きた時に、○○せよ」てな感覚でソースを書いていったほうが分かりやすいところがあるので、イベントドリブンなる概念があるのだろうな、などと想像してみたり。人間様が分かるように、面倒臭いところを上手に隠して、分かりやすいところだけ提供するってのは、プログラミングにおいては大事。

コントロールを作って、マウスで動かす。 :

コントロールって何だ? GUI部品、ウィジェットのこと。ボタンとか、ラベルとか、チェックボックスとか、そういうGUI部品を、ウィジェットとかコントロールとか呼んだりする、のだと思います。たぶん。ちょっと自信ないけど。

tuto03.rb
require_relative './lib/dxrubyws'

control = WS::WSControl.new(200, 100, 100, 100)
control.image = Image.new(100, 100, C_WHITE)
WS.desktop.add_control(control)

Window.loop do
  WS.update
end
tuto03.png
画面の真ん中に、白い何かが表示された。たぶん、この白い何かが、コントロール、なんだろう。

このサンブルの場合、
  • WS::WSControl.new() でコントロールを作って、
  • Image.new() で真っ白な画像を作り、ソレをコントロールが持ってる画像として設定して
  • WS.desktop.add_control() で、画面に登録。
しているのだろうな…。

このコントロールを、マウスで動かしてみる。

_tuto03_b.rb
require_relative './lib/dxrubyws'

control = WS::WSControl.new(200, 100, 100, 100)
control.image = Image.new(100, 100, C_WHITE)

control.extend WS::Draggable
control.add_handler(:drag_move) do |obj, dx, dy|
  control.x += dx
  control.y += dy
end

WS.desktop.add_control(control)

Window.loop do
  WS.update
end
tuto03_b.gif
白い画像を、マウスドラッグで移動できるようになった。

そろそろ分からなくなってきた。以下が追加された部分。
control.extend WS::Draggable
control.add_handler(:drag_move) do |obj, dx, dy|
  control.x += dx
  control.y += dy
end
tutorial01.txt によると…。control.extend WS::Draggable てのが、サポートモジュールとやらを使う指定っぽい。名前からしてマウスドラッグ関係の何かなんだろうな。

:drag_move というシグナルが来たら(イベントが発生したら)、マウスカーソルの移動量を得られるから、それをコントロールの座標値に加算してやることで、コントロールの表示位置が変更できている、のだろう。

ドラッガブル豆腐クラスを作る。 :

tutorial01.txt によると、この後、「ドラッガブル豆腐クラス」とやらを作ってみるよ、てことになってるのですが。ここで問題発生。

ちなみに、豆腐って何? …DXRubyでは、例の白い画像を「豆腐」と呼んでることが多くて。要するに、「ドラッガブル豆腐」=「マウスでドラッグできる白い画像」、なんだと思います。たぶん。

_tuto04.rb
require_relative './lib/dxrubyws'

module WS
  class DraggableTofu < WSControl
    include Draggable

    def initialize(x, y, width, height)
      super
      self.image = Image.new(width, height, C_WHITE)
      self.add_handler(:drag_move, self.method(:on_drag_move))
    end

    def on_drag_move(obj, dx, dy)
      self.x += dx
      self.y += dy
    end
  end
end

tofu = WS::DraggableTofu.new(200, 100, 100, 100)
WS.desktop.add_control(tofu)

Window.loop do
  WS.update
end

動かしてみたら、エラーが。
> ruby tuto04.rb

tuto04.rb:17:in `on_drag_move': wrong number of arguments (2 for 3) (ArgumentError)
        from C:/home/prg/ruby/test_dxruby/dxrubyws_test/lib/module.rb:132:in `on_mouse_move'
        from C:/home/prg/ruby/test_dxruby/dxrubyws_test/lib/core.rb:112:in `mouse_event_dispatch'
        from C:/home/prg/ruby/test_dxruby/dxrubyws_test/lib/dxrubyws.rb:118:in `update'
        from C:/home/prg/ruby/test_dxruby/dxrubyws_test/lib/dxrubyws.rb:165:in `update'
        from tuto04.rb:28:in `block in <main>'
        from tuto04.rb:27:in `loop'
        from tuto04.rb:27:in `<main>'
on_drag_move ってところで、何かを間違えてるっぽいけど…。

_Rubyのエラーメッセージwrong number of arguments (a for b)の意味 - Qiita によると、
tuto04.rb:17:in `on_drag_move': wrong number of arguments (2 for 3) (ArgumentError)
てのは、3つ引数が来るはずなのに、2つ来たよ、という意味なのかな…。

つまり、def on_drag_move(obj, dx, dy) は、obj, dx, dy の、3つの引数が書いてあるけど、この名前のメソッドは、本当は2つしか引数が無いはずやで? 間違えてるで? みたいな?

lib/module.rb を開いて、on_drag_move で検索してみたり。

    def on_drag_move(tx, ty)
      signal(:drag_move, tx, ty)
    end
うむ。引数は2つですね。なら、2つに修正すればいいのかな。

_tuto04_b.rb
require_relative './lib/dxrubyws'

module WS
  class DraggableTofu < WSControl
    include Draggable

    def initialize(x, y, width, height)
      super
      self.image = Image.new(width, height, C_WHITE)
      self.add_handler(:drag_move, self.method(:on_drag_move))
    end

    # def on_drag_move(obj, dx, dy)
    def on_drag_move(dx, dy)
      self.x += dx
      self.y += dy
    end
  end
end

tofu = WS::DraggableTofu.new(200, 100, 100, 100)
WS.desktop.add_control(tofu)

Window.loop do
  WS.update
end
tuto04_b.gif
動いた。豆腐をマウスでドラッグできてる。

要するに、こんな感じでコントロール(ウィジェット/GUI部品)を、クラスとして作って増やしていけますよ、ということなのかな…。

これで _tutorial01.txt の内容は一通り試せた。

_tutorial02.txt では標準GUIの使い方が説明されているらしい。明日、眺めてみることにしよう…。

2016/01/12(火) [n年前の日記]

#1 [dxruby][dxrubyws] DXRubyWSのチュートリアル文書に従って試してみる。その2

_DXRubyWS の、 _doc/tutorial02.txt を写経して動作確認してみる。

最も簡単なコード。 :

_tuto21.rb
require_relative './lib/dxrubyws'
require_relative './lib/standardgui'

WS.desktop.add_control(WS::WSWindow.new(100,100,300,200,"TutorialWindow"))

Window.loop do
  WS.update
end
tuto21.gif
ウインドウが表示された。マウスでドラッグ移動、サイズ変更ができるし、閉じるボタンを押せばウインドウを閉じることもできる。

標準GUIを使う時は、
require_relative './lib/standardgui'
を、最初のほうに書いておくものらしい。

WS::WSWindow.new() でウインドウを作って、WS.desktop.add_control() で画面に登録しているのかな。たぶん。

ボタンを配置して、ボタンを押したら反応させる。 :

まずは、ボタンを配置。

_tuto22.rb
require_relative './lib/dxrubyws'
require_relative './lib/standardgui'

# ウインドウを生成
window = WS::WSWindow.new(100,100,300,200,"TutorialWindow")

# 画面に登録
WS.desktop.add_control(window)

# ボタンを生成
button = WS::WSButton.new(10,10,100,20,"TutorialButton")

# ウインドウ(のクライアント領域)に登録
window.client.add_control(button)

Window.loop do
  WS.update
end
tuto22.png
ボタンを表示することができた。

tutorial02.txt には…。
  • WSWindowオブジェクトはコンテナの集合体。タイトルバーとクライアント領域に分かれてる。
  • ユーザがコントロールを配置するのはクライアント領域のほう。
  • クライアント領域は、WSWindow#clientでアクセスすることができる。
と書いてある。

ボタンに反応させてみる。

_tuto23.rb
require_relative './lib/dxrubyws'
require_relative './lib/standardgui'

window = WS::WSWindow.new(100,100,300,200,"TutorialWindow")
WS.desktop.add_control(window)

button = WS::WSButton.new(10,10,100,20,"TutorialButton")
window.client.add_control(button)

# ボタンをクリックしたときに呼ばれる処理を登録
button.add_handler(:click) do
  # ボタンの表示位置を、右下に10ドット変更する
  button.x += 10
  button.y += 10
end

Window.loop do
  WS.update
end
tuto23.gif
ボタンを押すと、ボタンの表示位置が変わっていく。たしかに、ボタンが反応してる。

ボタンがクリックされたら ―― :click シグナルが来たら、処理がされるように設定されてる。

TutorialWindowクラスを作ってみる。 :

_tuto24.rb
require_relative './lib/dxrubyws'
require_relative './lib/standardgui'

module WS
  class TutorialWindow < WSWindow
    def initialize(*args)
      super
      button = WS::WSButton.new(10,10,100,20,"TutorialButton")
      client.add_control(button, :btn)
      button.add_handler(:click, self.method(:on_click))
    end

    def on_click(obj, tx, ty)
      client.btn.x += 10
      client.btn.y += 10
    end
  end
end

window = WS::TutorialWindow.new(100,100,300,200,"TutorialWindow")
WS.desktop.add_control(window)

Window.loop do
  WS.update
end
tuto24.gif
tuto23.rb と同じことを、クラスを作ることで実現できた。

これで、 _tutorial02.txt の内容を一通り試せた。

#2 [dxruby][dxrubyws] DXRubyWSで画像ボタンを表示してみる

DXRubyWS上で、ツールバーだか、ツールボックスだか、そんな感じの表示をしてみたい。そのためには、最低限、画像ボタンが表示できないといけない。画像ボタンを表示する方法はあるのかな。調べてみる。

画像ボタンを1つだけ表示。 :

_sample/minsample.rb を眺めると、WS::WSImageButton なるものがあるらしい。おそらくコレが、名前からして、画像ボタンなのだろう…。

_lib/StandardGUI/button.rb の中に、WSImageButton の定義がある。ソレによると…。
WS::WSImageButton.new(tx, ty, image, width, height, caption)

x : 表示位置 x
y : 表示位置 y
image : 画像オブジェクト(DXRuby の Imageオブジェクト)
width : 横幅。nil なら自動調整
height : 縦幅。nil なら自動調整
caption : キャプション文字列
こんな感じなのだろう。たぶん。おそらく。

サンプルソースを書いてみることにしよう。以下の画像を使って、画像ボタンを表示してみる。この画像は、CC0 / Public Domain ってことで。

toolbar.png


_imagebutton_test.rb
# ImageButton(画像ボタン)を表示してみる

require_relative 'lib/dxrubyws'
require_relative 'lib/standardgui'

module WS

  # 画像ボタンを表示してみるウインドウのクラス
  class ImageButtonWindow < WSWindow

    # コンストラクタ。初期化処理
    def initialize(*args)
      super

      # 画像を用意する。アイコンが、8x3個、並んでる
      imgs = Image.loadTiles("toolbar.png", 8, 3)

      # 画像ボタンを生成
      # 引数として、(x, y, Imageオブジェクト, ボタン横幅, ボタン縦幅, caption) を渡す
      # 横幅、縦幅の指定が nil なら、画像サイズ+αで調整してくれる
      x, y = 10, 10
      w, h = nil, nil
      imgbtn = WS::WSImageButton.new(x, y, imgs[1], w, h, "Open")

      # 画像ボタンをクライアント領域に追加
      client.add_control(imgbtn, :btn)

      # ボタンが押された時の処理を設定
      imgbtn.add_handler(:click, self.method(:on_click))
    end

    # ボタンを押した時の処理
    def on_click(obj, tx, ty)
      # ファイル選択ダイアログを開いてみる
      filter = [
        ["PNGファイル(*.png)", "*.png"],
        ["すべてのファイル(*.*)", "*.*"]
      ]
      filepath = Window.openFilename(filter, "ファイルを選択してください")

      unless filepath
        # キャンセルされた
        puts "Cancel."
      else
        # ファイルが選ばれた
        puts filepath
      end
    end
  end
end

# ウインドウを生成
window = WS::ImageButtonWindow.new(8, 8, 320, 96, "ImageButtonWindow")

# 画面に追加
WS.desktop.add_control(window)

Window.loop do
  WS.update
end
imagebutton_test.png
画像ボタンが表示できた。

マウスカーソルをボタンの上に持ってくると、説明のためのバルーン表示(?)までしてくれるのだな…。素晴らしい。

けど、マウスカーソルでバルーン表示が隠れちゃって、文字が読めないから、イラッとするのだな…。微妙に残念。バルーンの表示位置については、改善が必要な予感。

画像ボタンをたくさん表示。 :

画像ボタンが表示できたので、ツールバーだか、ツールボックスだか、そんな感じのウインドウも表示してみたい。

_imagebutton_test2.rb
# ImageButton(画像ボタン)を表示して、ツールボックスっぽく並べてみる

require_relative 'lib/dxrubyws'
require_relative 'lib/standardgui'

module WS

  # ツールボックスっぽく表示してみるウインドウクラス
  class ToolBoxWindow < WSWindow

    # コンストラクタ。初期化処理
    def initialize(*args)
      super

      # アイコン画像を読み込む。アイコンが、8x3個、並んでる
      imgs = Image.loadTiles("toolbar.png", 8, 3)

      # アイコン種類を定義
      icon_list = [
        # 画像番号, caption, 押された時の処理名
        [0, "New", :create_new_data],
        [1, "Open", :load_data],
        [2, "Save", nil],
        [3, "Export", nil],

        [11, "Zoom +", nil],
        [12, "Zoom -", nil],
        [13, "Brush Size +", nil],
        [14, "Brush Size -", nil],

        [17, "Swap Fg/Bg Color", nil],
        [16, "Grid on/off", nil],
        [15, "Undo", nil],

        [4, "Pen", nil],
        [5, "Erase", nil],
        [6, "Line", nil],
        [7, "Rectangle", nil],

        [8, "Rectangle Fill", nil],
        [9, "Fill", nil],
        [10, "Text", nil],
      ]

      # アイコンの数だけループする
      x = 0
      y = 0
      i = 0
      icon_list.each do |d|
        idx, caption, job_sym = d

        # マウスカーソルでバルーン表示が隠れてしまうので、少し修正
        caption = "    " + caption + " "

        # 画像ボタンを生成
        # 引数として、(x, y, Imageオブジェクト, ボタン横幅, ボタン縦幅, caption) を渡す
        # 横幅、縦幅の指定が nil なら、画像サイズ+αで調整してくれる
        imgbtn = WS::WSImageButton.new(x, y, imgs[idx], nil, nil, caption)

        # 画像ボタンをクライアント領域に追加
        client.add_control(imgbtn, :btn)

        if job_sym != nil
          # ボタンが押された時の処理を設定
          imgbtn.add_handler(:click, self.method(job_sym))
        end

        i += 1

        # 次のボタンの表示位置を決める
        if i % 11 == 0
          x = 0
          y += imgbtn.height
        else
          x += imgbtn.width
        end
      end
    end

    # Newボタンを押した時の処理
    def create_new_data(obj, tx, ty)
      puts "create new data"
    end

    # Openボタンを押した時の処理
    def load_data(obj, tx, ty)

      # ファイル選択ダイアログを開いてみる
      filter = [
        ["PNGファイル(*.png)", "*.png"],
        ["すべてのファイル(*.*)", "*.*"]
      ]
      filepath = Window.openFilename(filter, "ファイルを選択してください")

      unless filepath
        # キャンセルされた
        puts "Cancel."
      else
        # ファイルが選択された
        puts filepath
      end
    end
  end
end

# ツールボックスウインドウを生成
window = WS::ToolBoxWindow.new(8, 8, 320, 96, "ToolBoxWindow")

# 画面に追加
WS.desktop.add_control(window)

Window.loop do
  WS.update
end
imagebutton_test2.png
それらしい表示ができた。

ウインドウのサイズを、値を直接指定して決めてるあたりが、なんだかダサイ…。
  • ボタンをずらずら並べていったら、自動でウインドウサイズも変わってほしいし、
  • 逆に、ウインドウサイズを変更したら、ボタンが横に並ぶ個数も自動で変わったりしてほしい。
けど、そのあたりの処理は、今後の課題ってことで。

#3 [dxruby][dxrubyws] DXRubyWSでチェックボックスを表示してみる

DXRubyWS で、チェックボックスを表示してみたい。

_sample/minsample.rb を眺めると、WS::WSCheckBox なるものがある。名前からして、コレがチェックボックスだな…。

さらに、 _lib/StandardGUI/checkbox.rb を眺めると…。
WS::WSCheckBox.new(tx, ty, width, caption)

tx : 表示位置 x
ty : 表示位置 y
width: 横幅
caption : キャプション文字列
他にも…。 それらを踏まえてサンプルソースを書いてみる。

_checkbox_test.rb
# DXRubyWSでチェックボックスを表示してみるテスト

require_relative 'lib/dxrubyws'
require_relative 'lib/standardgui'

module WS

  # チェックボックスを表示してみるウインドウクラス
  class CheckBoxWindow < WSWindow

    # コンストラクタ。初期化処理
    def initialize(*args)
      super

      @chkbox = []

      chkbox_list = [
        "Character",
        "Fg Color",
        "Bg Color",
      ]

      x, y = 8, 8
      w, h = 0, 0
      chkbox_list.each do |caption|

        # チェックボックスを生成
        # (x, y, width, caption) を渡す
        cb = WS::WSCheckBox.new(x, y, 120, caption)

        # あらかじめチェックを入れておく
        cb.checked = true

        # クライアント領域に追加
        client.add_control(cb, :chkbox)

        # 状態が変更された時の処理を登録
        cb.add_handler(:change, self.method(:on_change))

        # 後で参照するかもしれないから一応記憶しておく
        @chkbox.push(cb)

        # 次の表示位置を求める
        y += cb.height + 4
      end
    end

    # 状態が変更された時の処理
    def on_change(obj, checked)
      puts "#{obj.caption}, #{checked}"
    end
  end
end

# ウインドウを生成して画面に登録
window = WS::CheckBoxWindow.new(8, 8, 120, 120, "CheckBoxWindow")
WS.desktop.add_control(window)

Window.loop do
  WS.update
end
checkbox_test.png
それらしく表示された。

チェックを入れたり外したりすると、on_change メソッドが呼ばれて、キャプションとチェック状態が標準出力に出力される。

#4 [vine][linux] Apache2にDOS攻撃対策のモジュールを入れてみたり

最近、たまに、自宅サーバにDOS攻撃っぽいアクセスがあって、自宅サーバが無反応になってしまう時があるのです。

DOS攻撃と言っても、おそらくはSPAM業者が、投稿可能なページだの、リンク元が残るページだのを見つけて、宣伝URLを書き込もうと大量アクセスして失敗してるとかそんな感じだろうと勝手に想像してるのですが。何にせよ、HTTPサーバも含めて、自宅サーバが沈黙しちゃうのは困るわけで。

何か対策は無いのかとググってみたら、Apache2 に mod_evasive なるモジュールを入れると対策らしきことができるそうで。

_Apache,Linux - ApacheのDOS攻撃対策 - Qiita
_Apache DoS攻撃にそなえる | Developers.IO

てなわけで、自宅サーバ、Vine Linux 6.x にもインストールしてみたり。

wget でソースを入手して、tar で解凍して、解凍したフォルダに入って。
wget http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz
tar zxvf mod_evasive_1.10.1.tar.gz
cd mod_evasive

ここから、apxs という、apache にモジュールを追加するためのツールを使って、コンパイルして .so を作ってモジュール追加をするのだけど。
*1

ここで、ちょっとハマってしまった。今現在の Vine Linux上で apxs を使う時は、/usr/sbin/apxs ではなく、/usr/bin/apxs を使わないとダメなようで。前者は apache 1.x 用で、後者が apache 2.x 用なのではないかと。たぶん。分かんないけど。単に apxs -i -a -c mod_evasive20.c と打ってみたら、エラーがバンバン出て困り果ててしまった。/usr/bin/apxs と打たないとダメ。

# /usr/bin/apxs -i -a -c mod_evasive20.c
なんか色々メッセージが表示されてるけど、追加されたっぽい。

/var/log に mod_evasive というフォルダを作って、そこにログを入れることにする。
mkdir /var/log/mod_evasive
chown か chmod も必要なのだろうか。

/etc/apache2/conf/httpd.conf に設定を追加。
# この行は自動で追加されているはず
LoadModule evasive20_module   /usr/lib/apache2/modules/mod_evasive20.so

# 同一ページに2秒間で3回アクセスされたら、
# あるいは、同一サイトに1秒間で30回アクセスされたら、
# 180秒間ブロックする例
<IfModule mod_evasive20.c>
    DOSHashTableSize 3097
    DOSPageCount 3
    DOSSiteCount 30
    DOSPageInterval 2
    DOSSiteInterval 1
    DOSBlockingPeriod 180
    DOSWhitelist 127.0.0.1
    DOSWhitelist 192.168.1.*
    DOSLogDir "/var/log/mod_evasive"
    DOSEmailNotify "-s 'DoS Alert' hoge@fuga.com"
</IfModule>

設定ファイルに問題が無いかチェック。
# apache2 -t
Syntax OK

apache2 を再起動。
# service apache2 restart

テストスクリプトが動かない。 :

mod_evasive には、test.pl というテスト用スクリプトがついてきているのだけど、コレがどうもうまく動かない。

Windowsが動いてる別PCに持ってきて、アクセス先のURL? URI? を修正して、AcivePerl を使って動かしてみたものの、いきなり最初から403しか返ってこない。変だな…。ホワイトリストに入れてるから、200が返ってくるはずだけど…。

自宅サーバ上で、ホワイトリスト行を無効にして apache2 を再起動してから test.pl を走らせてみたものの、これも最初から403。200なんて一度も出てこない。何故。

かといって、ブラウザでアクセスできないかというとそんなことはなく。フツーにページが見れてるわけで。

test.pl の中身は、こんな感じで。
# test.pl: small script to test mod_dosevasive's effectiveness

use IO::Socket;
use strict;

for(0..100) {
    my $response;

    my $SOCKET = new IO::Socket::INET( Proto => "tcp",
                                       PeerAddr => "127.0.0.1:80");

    if (! defined $SOCKET) { die $!; }

    print $SOCKET "GET /?$_ HTTP/1.0\n\n";
    $response = <$SOCKET>;
    print $response;
    close($SOCKET);
}
もちろん、PeerAddr => "127.0.0.1:80" は書き換えて試してるけど。何がおかしいんだろう…。

サーバ側のログを眺めてみたけど、別のログに記録が残っていて、首を捻ったり。test.pl は、"GET /?0 HTTP/1.0" とか "GET /?1 HTTP/1.0" という形でなんかくれよーくれくれくれー、とアクセスしてるわけだけど。その手のアクセスは、Nimdaウイルス等からアクセスされた時に残るログのほうに記録されてる。なんでそっちに行っちゃうんだ…?

_2004/04/19 にやってた設定が効いてるみたい。ホストが不明なアクセスは隔離するようにしていることで、こういうことになっている、のかも。よく分かってないけど。

*1: apxs を使う際、Linuxディストリによっては、httpd-devel だか apache2-devel だかのパッケージが必要になる時もあるらしいので、apt-get だか yum だかでインストールしておく必要があるのかもしれないがよくわかってない。

2016/01/13(水) [n年前の日記]

#1 [dxruby][dxrubyws] DXRubyWSでテキストボックスを表示してみる

自作キャラグラエディタを作っていた際に、困ってしまった点があって。テキストボックス(1行分のテキスト入力ができるGUI部品)を実装するかどうかで悩んだというか。

新規キャンバスを作る際に、キャンバスサイズを入力して新規作成したかったのだけど。サイズを入力するためには、テキストボックスが必要だよなと。でも、実装が絶対に大変だよなと。なので、そのへん、結局諦めてしまったのですが。しかし、DXRubyWSを使えば、そこらへんを解決することができるのかもしれない…。

ということで、DXRubyWSでテキストボックスを表示できるか試してみようと。

ググってみたら、DXRuby, DXRubyWS作者様の、はてな日記記事がヒットした。

_DXRubyWSでのアプリ開発を考える - mirichiの日記

サンプルとして書かれてるソースの中で、テキストボックスが使われてる。ありがたや。ほとんどそのまま写経させてもらって動作確認してみたり。

_textbox_test.rb
# DXRubyWSでテキストボックスを表示してみるテスト

require_relative 'lib/dxrubyws'
require_relative 'lib/standardgui'

module WS

  class TextBoxWindow < WSWindow

    def initialize(*args)
      super

      # テキストボックスを生成して追加
      x, y = 16, 16
      w, h = 200, 24
      @txtbox = WS::WSTextBox.new(x, y, w, h)
      client.add_control(@txtbox)

      # テキストボックスの内容を設定
      @txtbox.text = "320"

      # ボタンを生成して追加
      x += @txtbox.width
      w, h = 80, 24
      @btn = WS::WSButton.new(x, y, w, h, "Button")
      client.add_control(@btn)

      # ボタンが押された時の処理を登録
      @btn.add_handler(:click, self.method(:on_click))
    end

    # ボタンが押された時の処理
    def on_click(obj, tx, ty)
      # メッセージボックスを生成して画面に登録
      msgbox = WS::WSMessageBox.new("Message", "TextBox = #{@txtbox.text}")
      WS.desktop.add_control(msgbox)
    end

  end
end

window = WS::TextBoxWindow.new(8, 8, 360, 96, "TextBoxWindow")
WS.desktop.add_control(window)

Window.loop do
  WS.update
end
textbox_test.png
テキストボックスが表示された。ボタンを押した時の処理の中で、テキストボックスの内容を取得することもできている。

_lib/StandardGUI/textbox.rb を眺めると、
WS::WSTextBox.new(tx, ty, sx, sy)
の引数を渡して生成するらしい。tx, ty は表示位置だろうけど、sx, sy は何だろう? その2つを、Image.new() に渡してるから…おそらく横幅、縦幅みたいなものかしら。

#2 [nitijyou] 歯医者に行ってきた

詳細はGRPでメモ。

#3 [pc] A8-3850機の動作確認を開始

Amazonに注文していたシルバーグリス *1 が届いたので、正月に弟が持ってきてくれた、AMD A8-3850 + M/B GIGABYTE GA-A75M-UD2H 等の一式を、まな板上で組んで動作確認開始。

CPUクーラーは、弟がゴイスなクーラーも持ってきてくれたのだけど。親父さんPCの省スペースケースに収まるとは思えないので、AMD CPU に同梱されてるリテールCPUクーラーを素直につけてみたり。音がうるさいらしいけど…どのくらいうるさいのだろう…。

組んでから、USBメモリに入ってるUBCDを起動して、memtest86+ をかけてるけど、今のところエラーはない模様。

と思ったけど、BIOS設定で、Load Fail-Safe Defaults を設定してからチェックをしたことを忘れてた。できれば Load Optimized Defaults のほがうがいいかな…。そっちにしてエラーが出なければいいけど。

2016/01/15追記。 :

A8-3850 と書くべきところを、A8-3650 と書いてたので修正。

*1: シルバーグリスは、CPUとCPUクーラーの間に塗って熱伝導を高めるグリス。一般的にはシリコングリスが使われるけど、それよりちょっとは熱伝導が良いらしい。

2016/01/14(木) [n年前の日記]

#1 [dxruby][dxrubyws] DXRubyWSのウインドウの中で60FPSのゲームを動かしたい

要するに、 _DXRubyWS/sample/rubima.rb のようなことをしてみたいのです。どういう仕組みで、ウインドウ内にゲーム画面を表示できているのだろう…。

眺めているうちに、なんとなく分かってきた。もしかすると、こういうことかな…。
rubima.rb を改造して、少しだけ短めのサンプルソースにしてみたり。

_game_and_info.rb
# DXRubyWSのウインドウ内に、60FPSで動くゲーム画面を表示してみるテスト
# sample/rubima.rb を参考に作成

require 'dxruby'
require_relative 'lib/dxrubyws'
require_relative 'lib/standardgui'

# ----------------------------------------
# ゲーム画面用クラス
# ゲーム画面内で画像がバウンドするだけの処理
class GameMain

  attr_accessor :width, :height, :image

  # 初期化
  def initialize
    @x, @y = 100, 100
    @dx, @dy = 8, 4

    @width = 360
    @height = 480

    @image = Image.new(64, 64, C_WHITE)
  end

  # 更新
  def update

    # 座標に速度を加算
    @x += @dx
    @y += @dy

    # 画面外に出そうなら速度の向きを反転させる
    @dx *= -1 if (@x <= 0 and @dx < 0) or ((@x + @image.width) >= @width and @dx > 0)
    @dy *= -1 if (@y <= 0 and @dy < 0) or ((@y + @image.height) >= @height and @dy > 0)
  end

  # 描画
  def draw
    # グローバルなRenderTargetに対して描画してる
    $rt.draw(@x, @y, @image)
  end
end

# ----------------------------------------
# ウインドウシステム用のクラス定義
module WS

  # ----------------------------------------
  # ゲーム画面が表示されるウインドウ
  class GameWindow < WSWindow

    def initialize(*args)
      super
    end

    # サイズ変更されたら再描画
    def resize(*args)
      super
      self.client.image.draw(0, 0, $rt)

      # ゲーム画面サイズも変更しておく
      $gamemain.width = self.width
      $gamemain.height = self.height - 32
    end

    # 描画
    def draw
      super
    end
  end

  # ----------------------------------------
  # ゲーム画面ではないほうのウインドウ
  class DetailWindow < WSWindow

    def initialize(*args)
      super

      # ラベル生成と登録
      x, y, w, h = 8, 8, 100, 16
      @label = WSLabel.new(x, y, w, h, "TEST")
      self.client.add_control(@label)

      # ボタン生成と登録
      x, y, w, h = 8, 32, 150, 20
      button = WSButton.new(x, y, w, h, "画像読み込み")
      self.client.add_control(button)

      # ボタンが押された時の処理を登録
      button.add_handler(:click, self.method(:on_click))

      @count = 0
    end

    # 状態更新
    def update
      # カウントアップをラベルで表示してみる
      @label.caption = @count.to_s
      @count += 1
      super
    end

    # ボタンが押された時の処理
    def on_click(obj, tx, ty)
      # ファイル選択ダイアログを開く
      filter = [
        ["PNGファイル(*.png)", "*.png"],
        ["すべてのファイル(*.*)", "*.*"],
      ]
      filepath = Window.openFilename(filter, "画像ファイルを選択")
      if filepath
        # ゲーム画面用クラスの画像を差し替える
        $gamemain.image = Image.load(filepath)
      end
    end
  end
end


# ----------------------------------------
# ここから、ゲームのメイン処理

font = Font.new(24) # フォント生成

Window.width, Window.height = 800, 600 # 画面サイズ変更

# ゲーム画面を描画するための RenderTarget を生成して
# グローバル変数に入れておく
$rt = RenderTarget.new(360, 480, [0, 0, 0])

# ゲーム画面クラスを生成
$gamemain = GameMain.new()

# ゲーム画面用ウインドウを生成して画面に登録
gamewindow = WS::GameWindow.new(50,100,360,480)
WS::desktop.add_control(gamewindow, :gamewindow)

# ゲーム画面ではないウインドウを生成して画面に登録
detailwindow = WS::DetailWindow.new(450,100,200,200)
WS::desktop.add_control(detailwindow, :detailwindow)

# メインループ
Window.loop do
  break if Input.key_push?(K_ESCAPE) # Esc キーで終了

  # ここでゲームの処理をする
  $gamemain.update
  $gamemain.draw

  # ここまで来れば、グローバルなRenderTargetに、
  # ゲーム画面の内容が描画されてるはず

  # ゲーム画面用ウインドウに、グローバルなRenderTargetの内容を描画する
  WS.desktop.gamewindow.client.image.draw(0, 0, $rt)

  WS.update # ここで WS.update を呼んでる

  # 各種情報を画面に出力
  s = "CPU : #{Window.get_load.to_i} %"
  Window.draw_font(0, 0, s, font, :z => 100)
end
game_and_info.gif
DXRubyWSのウインドウの中で、ゲーム画面っぽいものが動いてくれた。なるほど…こういう仕組みなのか…。

他のサンプルはどうなのだろうと思って、 _DXRubyWS/sample/rubima3.rb を眺めてみたら、こちらは GameWindowクラスの中身がもっと短くなっていた。drawメソッドの中で描画しちゃえば済むのか…。なるほど…。

こういうことができるなら、リアルタイムに何かを動かしながら調整していく感じのツールが作りやすいであろう予感。

#2 [dxruby][dxrubyws] ツールチップだかバルーン表示だかについて見え方を確認してみたり

DXRubyWSで画像ボタンを表示した際、ツールチップ表示? バルーン表示? まで実装されていて感心したのだけど、その表示位置がマウスカーソルと重なって文字列が一部読めなかったのが気になったのです。

このあたり、他のアプリやOSは、どうやって解決してるのだろう…。今まで全く気に留めたことがなかった…。てなわけで、いくつかのアプリの、そのあたりの見え方を確認してみたりして。

Excel 2003 の場合。
tooltip_ss_excel2003.png


Excel 2007 の場合。
tooltip_ss_excel2007.png

tooltip_ss_excel2007_2.png

Excel 2007 においては、なんだか凄いところに表示してるな…。ほとんど簡易ヘルプを表示してるようなものだから、通常のツールチップ表示の位置では問題があると判断して、作業領域内に表示するようにしたのだろうか?

Mozilla Thunderbird の場合。
tooltip_ss_thunderbird.png


Explorer の場合。
tooltip_ss_explorer_01.png

tooltip_ss_explorer_02.png

tooltip_ss_explorer_03.png

中には、ウインドウをはみ出して表示されてるものもある…。これを DXRubyWS で実現しようとすると面倒なことになりそうなので、DXRubyWS は、画面内に表示されるように補正する、といった処理が必要になるのだろうか。

さておき、それぞれをざっと見た感じ、どうもマウスカーソル画像の縦幅分ずらしたところに表示してる、というか、マウスカーソル画像に追随して表示位置を決めているような気がしてきたり。

ただ、表示位置をどうやって求めてるのかが今一つ不明。例えば以下のスクリーンショットを見ると…。縦位置はともかく、横位置は何を基準にして求めてるのか…。
tooltip_ss_explorer_04.png

tooltip_ss_explorer_05.png


待てよ? もし、マウスカーソル画像の縦幅分、ずらして表示してるとしたら…。例えば大きいマウスカーソル画像を使ってる場合は、ツールチップがマウスカーソルで隠れてしまうのだろうか?

大きいマウスカーソルに変更して確認してみたり。

tooltip_ss_larecursor_01.png

tooltip_ss_larecursor_02.png

tooltip_ss_larecursor_03.png

tooltip_ss_larecursor_04.png

どうやらマウスカーソル画像の縦幅を、その都度取得して、縦位置を決めているっぽい。

今まで気にしてなかったけど、巷のソレは、こういう仕様になってたのか…。

ツールチップとバルーンって何が違うんだろう。 :

画像ボタンの上にマウスカーソルを合わせると表示されるソレって、何と呼ぶのだろう。ツールチップ、でいいのかな。ツールヒント、と呼ぶのかな。バルーン、ではないよな。

そのあたりの違いがよくわからなくてググってたら、気になる記事に遭遇。

_中小W: 深夜、家に帰る途中のWebディレクター: それはバルーンヘルプなのか?ツールチップなのか?

ツールチップは Microsoftの発明で、バルーンはAppleの発明だったのか…。

#3 [pc] A8-3850機でWinodws10が起動するか実験した

A8-3850機に、親父さんPCのSSDをクローンしたHDD、を、eSATAで接続して、Windows10 x64が起動するかどうか実験してみたり。ちなみに、LANケーブル等は差してない状態で確認した。

起動時に、例の青いWindowsマークと共に、「デバイスの準備をしています」と表示されて…。その後しばらく経ったら起動してくれた。M/Bが違っても、起動してくれるのか…。素晴らしい。であれば、親父さんPCのM/B交換をしても、OS再インストールまでせずに済むかもしれない。

ただ、ライセンス認証・再アクティベーションは、やはり必要なようで。システム情報を確認したら「ライセンス認証が必要です。インターネットに接続してください」と表示されていた。「これは今までと違うハードウェアだろ?」と、しっかり認識されてる模様。

#4 [windows] Windows7 x64上で Excel 2003 が終了できなくなっていた

Excel 2003上で作成された.xlsが外部から送られてきた際、見た目のみを確認するため、一応まだ、Excel 2003をWindows7 x64上にインストールしてあるのだけど。 *1

ふと、たまたま Excel 2003 を起動して見た目を確認していたら、閉じるボタンを押しても終了できなくなっていることに気が付いた。ファイル → 終了も、グレーアウトしている。何だコレ。

ググってみたら、どうやら Visual Studio が絡んでるらしい。

_【解決】Microsoft Office Excel 2000 2003 終了時にエラーが発生する。(Visual Studio ) | 吉田Style-MindShare-

そんな罠があるのか…。
*1: 常用してる表計算ソフトは LibreOffice Calc だし、Excel を使わないといけない場合でも Excel 2007 を使っているのだけど。Excel はバージョンによって、.xls の「見た目」が異なるので、過去のバージョンをなくすわけにはいかないという…。

#5 [pc][neta] hjklに矢印が印刷されてるキーボードってないのだろうか

前にも書いたかもしれないけど、Vimユーザの専用キーボードとして、hjklに矢印が印刷されてるキーボードを発売したら微妙なヒット商品に…。ならないか。ならないよな。ならないですね。

先輩プログラマー(以下、先輩)「どうだい? Vimの操作には慣れたかな?」
新人プログラマー(以下、新人)「いやー、これがなかなか…。特にhjklでカーソル移動がツラくて」
先輩「そうかー。じゃあ、このキーボードを貸してあげよう」
新人「?! な、な、なんスかコレ! hjklに矢印が印字されてる! こんなキーボードがあるんスか!?」

尊敬のまなざしゲット、ですよ。

ていうか、キーボードの各キーにペタペタ貼れるシール、みたいな商品って無いのかな。

以前、耐水シールっぽい用紙にプリントアウトしてキーに貼って試したことがあるけど、キーのサイズに合わせてテンプレート作るあたりが、地味に面倒くさいんだよな…。

viのカーソル移動について。 :


2016/01/15(金) [n年前の日記]

#1 [nitijyou] 雪が積もった

朝、うっすらと雪が積もってた。しかし雪だるまを作れるほどは積もってなくて。やっぱり今年は雪が少ないのだろうか…。

#2 [anime] 天空の城ラピュタを途中まで視聴

金曜ロードショーで放送されてたので途中まで視聴。やっぱり凄いな…よく出来てる…。

今作ったら、フラップターが飛ぶシーンの背景動画は3DCGになったりするのだろうか。いや、そもそもフラップターが3DCGで描かれるかもしれないか…。その場合、受ける印象は変わるのだろうか。

飛行石の出す怪しい光の不思議な模様も、今ならCGだろうな…。当時は色んな素材を試して模様が出るように工夫していたらしいけど…。

例えば ufotable がこのシーンを作ったらどうなるだろう、などと妄想しながら各カットを眺めてると、また違う面白さがあるなと。このカットは撮影段階で部屋の中の塵パーティクルを追加するだろうな、ufotableの撮影さんなら絶対追加するぞ、とか、朝日が昇るシーンはレンズフレアを絶対入れてくるだろう、とかそういう。…いや、そういう見方って面白いのかな。どうなんだ。

レイアウトが同じでも、おそらく今のアニメスタジオがAEを駆使しながら作り直したら、全く違う印象を受ける画面になるんだろうな。などと思いながら眺めてました。

2016/01/16() [n年前の日記]

#1 [dxruby][dxrubyws] DXRubyWSで画像を表示してみるテスト

DXRubyWSで画像を表示してみたい。

_doc/tutorial01.txt を眺めれば、画像の表示はできるのだけど、できればウインドウに ―― WSWindow で表示してみたい。どうやれば表示できるのかなと。

_sample/rubima3.rb を参考にすれば表示できそうな予感。試してみたり。

_image_load_test.rb
# 画像を読み込んで表示してみるテスト

require_relative 'lib/dxrubyws'
require_relative 'lib/standardgui'

module WS

  # 画像選択ウインドウクラス
  class ImageSelectWindow < WSWindow

    # コンストラクタ。初期化処理
    def initialize(*args)
      super

      # ボタンを生成して登録
      x, y, w, h = 4, 4, 120, 24
      @btn = WSButton.new(x, y, w, h, "画像読み込み")
      client.add_control(@btn)
      @btn.add_handler(:click, self.method(:on_click))

      # タイトルバー上の閉じるボタンを無効化
      self.window_title.close_button = false

      # ESCキーで閉じないようにする
      @key_handler.delete(K_ESCAPE)

      # 次のウインドウ発生位置
      @x_pos = self.x
      @y_pos = self.y + self.height
    end

    # ボタンを押した時の処理
    def on_click(obj, tx, ty)
      # ファイル選択ダイアログを開いてみる
      filters = [
        ["画像ファイル(*.png;*.jpg;*.bmp)", "*.png;*.jpg;*.bmp"],
        ["すべてのファイル(*.*)", "*.*"]
      ]
      filepath = Window.openFilename(filters, "画像ファイルを選択")
      create_image_window(filepath) if filepath
    end

    # 画像を表示するウインドウを生成して画面に追加
    def create_image_window(filepath)
      img = Image.load(filepath)
      w, h = img.width, img.height
      bsname = File.basename(filepath)

      wdw = WS::ImageWindow.new(@x_pos, @y_pos, w + 48, h + 48, bsname)
      WS.desktop.add_control(wdw)
      wdw.image = img

      @x_pos += 32
      @y_pos += 32
    end
  end

  # 画像を表示するだけのウインドウクラス
  class ImageWindow < WSWindow

    attr_accessor :image

    def initialize(*args)
      super
      @image = nil
    end

    def draw
      x = (client.image.width - @image.width) / 2
      y = (client.image.height - @image.height) / 2
      client.image.draw(x, y, @image) if @image
      super
    end
  end

end

Window.width, Window.height = 1024, 600

wdw = WS::ImageSelectWindow.new(8, 8, 200, 56, "ImageSelectWindow")
WS.desktop.add_control(wdw)

Window.loop do
  WS.update
end
image_load_test.png
表示できたっぽい。たぶん、無駄な行がたくさんありそうな気もするけれど…。

ウインドウのタイトルバーの閉じるボタンを無効にしたい。 :

画像読み込みボタンが置いてあるウインドウの、閉じるボタンを無効にしたかったのだけど。 _lib/StandardGUI/window.rb を眺めていて、もしかするとコレかなと思えてきたので試してみたら、非表示になってくれた。
  # タイトルバー上の閉じるボタンを無効化
  self.window_title.close_button = false

ただ、ウインドウは ―― WSWindow は、ESCキーでウインドウを閉じる仕様にもなっているようで。ESCキーで閉じる仕様を無効にするにはどうしたら…。こんな感じでいいのだろうか。
  # ESCキーで閉じないようにする
  @key_handler.delete(K_ESCAPE)
WSWindow が持ってる、@key_handler というハッシュに、どのキー入力を受け付けるかが登録されてるっぽいので、K_ESCAPE だけ delete してみたら、一応無効になってくれたように見える。

#2 [dxruby][dxrubyws] DXRubyWSでスクロールバーを表示させたい

DXRubyWS でスクロールバーを表示させたい。ウインドウ内に表示しきれないサイズの何かを表示してる時は、スクロールバーでスクロールを可能にしたいわけで。

これも、 _sample/rubima3.rb を参考にして試してみたり。

_scrollbar_test.rb
# 画像を読み込んで表示してみるテスト
# スクロールバーを追加してみる

require_relative 'lib/dxrubyws'
require_relative 'lib/standardgui'

module WS

  # 画像選択ウインドウクラス
  class ImageSelectWindow < WSWindow

    # コンストラクタ。初期化処理
    def initialize(*args)
      super

      # ボタンを生成して登録
      x, y, w, h = 4, 4, 120, 24
      @btn = WSButton.new(x, y, w, h, "画像読み込み")
      client.add_control(@btn)
      @btn.add_handler(:click, self.method(:on_click))

      # タイトルバー上の閉じるボタンを無効化
      self.window_title.close_button = false

      # ESCキーで閉じないようにする
      @key_handler.delete(K_ESCAPE)

      # 次のウインドウ発生位置
      @x_pos = self.x
      @y_pos = self.y + self.height
    end

    # ボタンを押した時の処理
    def on_click(obj, tx, ty)
      # ファイル選択ダイアログを開いてみる
      filters = [
        ["画像ファイル(*.png;*.jpg;*.bmp)", "*.png;*.jpg;*.bmp"],
        ["すべてのファイル(*.*)", "*.*"]
      ]
      filepath = Window.openFilename(filters, "画像ファイルを選択")
      create_image_window(filepath) if filepath
    end

    # 画像を表示するウインドウを生成して画面に追加
    def create_image_window(filepath)
      img = Image.load(filepath)
      w, h = img.width, img.height
      bsname = File.basename(filepath)

      wdw = WS::ImageWithScrollBarWindow.new(@x_pos, @y_pos, 320, 240, bsname)
      wdw.set_image(img)
      WS.desktop.add_control(wdw)

      @x_pos += 32
      @y_pos += 32
    end
  end

  # 画像を表示するだけのウインドウクラス
  class ImageWithScrollBarWindow < WSWindow

    attr_accessor :image

    def initialize(*args)
      super
      @v_pos = 0
      @h_pos = 0
      @image = Image.new(512, 512)

      w, h = self.width, self.height

      # 縦スクロールバー
      vsb = WSVScrollBar.new(w - 20, 0, 16, h)
      client.add_control(vsb, :vsb)

      vsb.total_size = 512 + 16 # 全体サイズ
      vsb.shift_qty = 32 # ボタンを押した時に動く量
      vsb.view_size = client.height # 表示範囲

      # スライダーを動かした時の処理
      vsb.add_handler(:slide) { |obj, pos| @v_pos = pos }

      # 横スクロールバー
      hsb = WSHScrollBar.new(0, h - 20, w - 16, 16)
      client.add_control(hsb, :hsb)

      hsb.total_size = 512 + 16 # 全体サイズ
      hsb.shift_qty = 32 # ボタンを押した時に動く量
      hsb.view_size = client.width # 表示範囲

      # スライダーを動かした時の処理
      hsb.add_handler(:slide) { |obj, pos| @h_pos = pos }

      # 画像
      wsimg = WSImage.new(0, 0, 512, 512)
      wsimg.image = RenderTarget.new(512, 512)
      client.add_control(wsimg, :wsimg)

      # リサイズされた時の処理
      wsimg.add_handler(:resize) do
        wsimg.image.resize(wsimg.width, wsimg.height)
        hsb.view_size = client.width
        vsb.view_size = client.height
      end

      # マウスホイール入力時の処理
      wsimg.add_handler(:mouse_wheel_up) {  vsb.slide(-32 * 3) }
      wsimg.add_handler(:mouse_wheel_down) {  vsb.slide(32 * 3) }

      # オートレイアウトで画像表示部やスクロールバーを調整してもらう
      client.layout(:vbox) do
        # 縦方向に並べる
        layout(:hbox) do
          # 横方向に並べる
          add wsimg, true, true # 横サイズも縦サイズも可変
          add vsb, false, true # 横サイズは固定、縦サイズは可変
        end
        add hsb, true, false # 横サイズは可変、縦サイズは固定
      end
    end

    # 画像を設定
    def set_image(img)
      @image = img

      # スクロールバーに与える全体サイズ値を更新
      client.hsb.total_size = img.width + 16
      client.vsb.total_size = img.height + 16
    end

    # renderをオーバーライドすれば描画されるが、
    # drawをオーバーライドすると描画されない
    def render
      client.wsimg.image.draw(-@h_pos, -@v_pos, @image)
      super
    end
  end

end

Window.width, Window.height = 1024, 600

wdw = WS::ImageSelectWindow.new(8, 8, 200, 56, "ImageSelectWindow")
WS.desktop.add_control(wdw)

Window.loop do
  WS.update
end
scrollbar_test.png
一応表示できたように見える。たぶん。
スクロールバー.total_size に画像横幅、縦幅をそのまま与えると、画像の全てを表示できなかったので、勘で、16ドット加えた値を指定してみたり。それだと、画像が全て表示された。おそらく、縦スクロールバーの横幅が16ドット、横スクロールバーの縦幅が16ドットだったりするだろうから、その分を加えると合ってくれるのかなと。自信無いけど。もしかすると、スクロールバーの幅が16ドットになるとは限らない可能性もあるから、スクロールバーの幅を取得して、ソレを加えるような書き方をしたほうがいいのかもしれない。

最初、画像表示ウインドウの draw をオーバーライドしたのだけど、それだと画像が表示されなくて。rubima3.rb では、draw ではなく render をオーバーライドしてたので、それに従ってみたら画像が表示された。このあたり、自分は仕組みがまだ分かってないです。

ここまでメモってから気が付いたけど、 _lib/StandardGUI/scrollbar.rb の中に、WSScrollableContainer というクラスがある…。コレを使えばもっと短く書けるのだろうか。

2016/01/17() [n年前の日記]

#1 [pc] 親父さんPCのM/Bを交換した

親父さんPCのM/Bを、AMD A8-3850 + GIGABYTE GA-A75M-UD2H に交換した。

ケースは IN-WIN IW-BK623 なのだけど、省スペースなので、メモリがカバーにぶつかって収まらなくて。入らなくなるのでは、仕方ない。カバーをつけることは諦めた。冷却がどうなるか不安だけど…。

SSDに入ったWindows10 x64 は、HDDで実験した時と同様にちゃんと起動してくれた。SSDで動いてるせいか、「デバイスを準備しています」の表示も、HDDに比べるとあっという間に終わった。また、ネット接続できていれば、APU用のビデオドライバもネットからDLしてインストールしてくれる模様。

ただ、予想通り、ライセンス認証はされてない状態になった。親父さんにしばらく使ってもらって、不具合が無さそうならライセンス認証を、かな…。

DVD-Rドライブが使えないと報告が。 :

USB接続のDVD-Rドライブで、DVD-Rが焼けなくなったと親父さんから報告が。

焼きミスをしたDVD-Rを見せてもらったら、読み取り面に親父さんの指紋がべったりと。そのせいじゃないかな…。読み取り面に触らないようにドライブにセットして焼いてもらったら、フツーに焼けた模様。

安心してたら、今度はCD-Rが焼けなくなったという報告が。たしかに3枚ぐらい連続で失敗し続ける。親父さんは B's Recorder GOLD9 を使ってDVDやCDを焼いてるのだけど、そのせいだろうか…。Windows10に対応してないのかな…。いや、でも、DVDは焼けたんだよな…。どうしてCD-Rがダメなんだろう…。

そのドライブを自分のメインPCに繋いで、Windows7の標準機能でCD-Rを焼いてみたけど、フツーに焼けてしまった。となると、ドライブが壊れたというわけではナサゲ。

もしかして、Windowsの標準機能でCD/DVDを焼くと成功するのだろうか…? 明日試してもらおう…。

ちなみに、Windows XPの頃はCD-Rしか焼けなかったけど、Vista からDVD-Rも標準機能で焼けるようになってたのですな。恥ずかしながら今まで知りませんでした。

#2 [nitijyou] 自転車で買い物に

夕方、犬の散歩から帰ってきてから、自転車で買い物に。近所のホームセンター(ホーマック)、ヨークベニマルまで。

先日ホーマックで買った、首のあたりにつける防寒具を装備して犬の散歩や買い物に行ったのだけど。最初のうちは暖かくていいなと思ったものの、なんだか不安になってきた。体はフツーに寒いはずだけど、首を暖かくしてることで感覚がおかしくなって、なんだか無理をしちゃったり、ということはないのだろうか。

#3 [anime] 昭和元禄落語心中を視聴

落語家を主人公にした漫画原作のアニメ化作品、という説明でいいのだろうか。

BS-TBSの放送では、1話目は1時間放送してたのだけど。Wikipediaを確認したらOVA版2話分が存在していたようで。もしかするとTV放送の1話=OVA版2話分、だったのだろうか。よくわかりません。

たしか1話の、若手落語家が落語を演じてたシーンで、熱気を帯びてきた体から湯気が立ち昇ったり、尻や膝のあたりが汗でびっしょりになってたり、そういう見せ方をしていたあたりで唸ってしまったり。漫画原作にそういうコマがあったのか、それとも落語をテーマにしたドラマや映画でそういうカットがあって取り込んだのか分からんけど…。

演者の背中から薄暗い観客席を捉えてるからこそ、かろうじてうっすら見えてくる空気のゆらめき。観客席側からは分からないけど、楽屋裏から見ることで気づくことができる汗のかき具合。裏にカメラを置いたことで可能になる伝え方、なのだなと。こんな見せ方によく気づいたなと感心。考えてみたら、落語家の喋りや台詞は落語を演じることで既に使ってるのだから、後は視覚情報で伝えていくしかないんだよな…。「首から上さえ描けてればいいだろ」と業界人自身が言っちゃうぐらいにアレな作りが多いアニメ業界の中で、ちゃんとこういう描写を試みるあたり、真摯に作られてる作品なのだろうと感じてしまったり。

1話では、師匠キャラを演じる石田彰氏が、師匠と呼ばれるに相応しい上手な落語を演じて見せてたのだけど。2話目・過去の回想編になると、若い頃の師匠が無残な前座を披露していて。惚れ惚れする落語と、聞くに堪えない落語の両方を、一人で見事に演じ切っているあたりに、なんだかゾクゾクしてしまった。昔、若手声優さんの中には石田氏の演技を見て衝撃を受けて声優を目指した人も居るとどこかで聞いた記憶もあるけど、たしかにコレは…凄い…。

そして直後に、師匠キャラのライバルを演じる山寺宏一氏が、豪快、大胆、天賦の才を感じさせる落語の演技を披露するわけだから…。これはとんでもないアニメだなと。声優さん達の技の凄さを再認識させられるというか。

そもそも落語は、一人の話者が、複数のキャラを演じることで成り立つわけで。そこに上乗せする形で、ベテラン時代の上手い演技と、駆け出し時代の下手な演技を、声優さんが披露しなければならないという…。2進数で考えれば、上位ビットが1ビット増えちゃった状態。単純に、演じるキャラの数が2倍になったも同然で。しかもこの後、おそらくは徐々に上達していく様子も見せていくのだろうから…。

音楽と落語の違いはあれど、「坂道のアポロン」「響け!ユーフォニアム」等がチャレンジしてた、「本物を見せれば、それだけで視聴者に十分伝わるはず」てな姿勢を感じたというか。これはかなり高度なことをしてる作品ではあるまいか。

さておき。1話も2話も熊谷脚本だったので、個人的にちょっとビックリ。SFっぽい作品が得意な脚本家さんとばかり勝手に思い込んでいたので、こういうジャンルもイケるなんて幅広く書ける方なんだなと…。この調子でゆくゆくはプリキュアを…いや、なんでもないです。

2016/01/18(月) [n年前の日記]

#1 [pc] Windows10 x64上でCD-Rが焼けなくてハマった

親父さんPC、Windows10 x64機で、CD-Rが焼けなくて悩んだり。

スペックは…。 CD-Rの書き込みは、Windows標準機能で試したり。

積んでる光学ドライブは、てっきり親父さん自身が買ってきた _IO-DATA DVR-AN18GLVB だと思い込んでたけど、 _2010/07/19 の日記に、IO-DATA DVR-AN20GL (Sony Optiarc AD-7203A) とメモしてあった。…すると、DVR-AN18GLVB は、家の中のどこにあるんだろう。まあいいか。

症状としては…。親父さんのPC = Windows10機で、USB接続外付けケースに入れたIDE接続のDVDドライブを使ってCD-R書き込みを行うと、プログレスバーが最後のあたりまで伸びかかったところで、
ディスクへの書き込み中に問題が発生しました

ディスクは正常に書き込まれませんでした。コンピューターを再起動して、再試行してください。
と表示されてしまう。みたいな。

CD-Rの中身はちゃんと焼けてない。ファイル管理領域だけは焼けてるのか、ファイル一覧は見れるけど、ファイルを開こうとすると中身が読み取れないとエラーが出たり、エクスプローラが固まったり。昨晩から5〜6枚ほど、速度を変えて試してみたり等してるけど、全部失敗。

しかし、DVD-Rならフツーに焼けてしまうわけで…。CD-Rだけが焼けない。なんでや。

また、自分のメインPCに接続して試したら、フツーにCD-Rが焼けてしまった。つまり、DVDドライブが壊れているわけではナサゲ。

そうなると…。 どれなんだろう…。

親父さんPCにインストールされている B's Recoreder GOLD9 が何か悪さをしているのではないかとアンインストール・OS再起動をしてみたけど、症状は変わらず。

試しに、 _ポータブルDVD-Rドライブ IO-DATA DVRP-U8XLE2 を親父さんPCに繋いでCD-Rを焼いてみた。…アレ? これだと焼けてしまった。一体どうなってるんだ。

とりあえず、親父さんPCに、IO-DATA DVR-AN20GL + サイズ 鎌蔵2 5IDEを接続すると不具合が起きることは間違いないので…。仕方ないから、しばらくはポータブルDVDドライブを使ってほしい、という話に。 *1

しかし、どうして、大きいほうの光学ドライブでは不具合が起きるのか…。

電源が弱まっているのかなあ。しかし…。 となると、電源ではないよな。たぶん。

USB周りで何か不具合が…。しかし…。 となると、USB周りでも無さそうな気がする。たぶん。

仮想PC上のWindows10 x64 で試してみた。 :

VMware Workstation 12 Player + Windows10 x64 Enterprise 評価版に、USB接続で AD-7203A を繋いで CD-Rに書き込みできるか試してみた。

エラーが出た。48倍速のみならず、8倍速で焼いてみてもダメ。エクスプローラ上から「取り出し」もできない。

ホストOSの Windows7 x64 で焼いてみた。やっぱり、Windows7なら、CD-Rを焼けるなあ…。

Windows8.1で焼いてみたらどうなるだろう。VMware Workstation 12 Player + Windows 8.1 x64 Enterprise評価版で、CD-R書き込みができるか試してみた。

これも Windows10 と同様に、最後のあたりでエラーが出た。取り出しができない云々のエラーメッセージが表示されて、そのうちタイムアウトになるのか、関連ウインドウが閉じてしまう。

VMware上で試してるからエラーが出たのか、それとも Windows 8.1以降では軒並みエラーが出るようになったのか…。これじゃよくわからんな…。

IDE接続のDVDドライブを、USB接続の外付けケースに入れて使ってるから問題が出ているのだろうか。VMware Workstation 12 Player では、光学ドライブの型番ではなく、Cypress USB Mass Storage Device と表示されてるし…。Cypress製の変換チップが Windows 8.1 や Windows 10 に対応していないとか? いや、Windows8.1 や Windows10 が対応してないと言うべきだろうけど。

実機に直接IDEで接続して試すだけの気力はないな…。手持ちのCD-Rも5〜6枚ほど無駄にしちゃってるし。それも太陽誘電の日本製を謳うCD-Rですよ。残り3枚になっちゃったよ…。

ググってみると、Windows10は、光学ドライブ関係の不具合が結構あるみたいで。外付けならともかく、PC本体付属の光学ドライブが使えなくなった、てな事例も見かけて、それはあまりにあんまりだ、酷過ぎると思えてきたり。USB接続の外付けDVDドライブが、今では3,000円ぐらいで入手できるとか、(CD|DVD)-Rを焼く場面がめっきり少なくなってる等あるにしても、今まで使えていたものがWindows10にしたらなんで使えなくなるの、てな不満はあるよなと。

一応ドライババージョンのスクリーンショットをメモ。 :

役に立つとは思えんけど一応メモ。

_Windows 10 + AD-7203A
_Windows 8.1 x64 + AD-7203A
_Windows 7 x64 AD-7203A

Windows7 だけ、他にもドライバが入ってるみたいだけど、ググっても各ファイルの正体が分からなかった。Intelチップセットを使ってるM/Bだから、Intelの何かじゃないかと思うのだけど…。

*1: このポータブルDVDドライブは、本来、ノートPC用に確保したドライブなので、親父さんPCのところに置きっぱなしにするのは若干不満もあるのだけど。しかし今時、親父さんも、自分も、光学ドライブを使う場面はほとんど無いし。自分がノートPCを外に持ち出す時や、何かをセットアップしなきゃいけない時だけ、親父さんPCのところから回収する感じでもなんとかなるかな、てな予感も。

#2 [nitijyou] 雪が積もった

結構積もった。雪だるまを作れるレベル。

体調悪い。 :

起きたらどうも体がだるくて。歯医者の予約を入れていたのだけど、申し訳ないけどキャンセルさせてもらった。以前、こんな感じの体調の時に無理して歯医者に行って治療してもらったら、そこから数日は原因も分からずグッタリしちゃったので…。こういう時は、無理をしないほうがいい…。いや、歯医者さんの受付の方は、「こんなに雪が積もってるからキャンセルしたんだな」とか思ってそうだけど。

2016/01/19(火) [n年前の日記]

#1 [nitijyou] 体調が少し復活

昨日の夕方頃から喉のあたりがイガイガしてきて、これはちょっとマズいなと。一日中布団の中で横になって休んでみたら、夕方頃になんとか復活。

#2 [pc] 足元のPCを入れ替えた

今までPCデスクの足元に、旧メインPC(MicroATXケース)を置いてたのだけど、正月に弟が持ってきてくれたATX機と入れ替えてみたり。旧メインPCのCPUは Core2Duo E8400だけど、ATX機は Core2Quad Q9550 だから、どうせなら性能の高いほうを足元に置いといて動かせるようにしといたほうがいいだろうと。旧メインPCは、動作がなんだか怪しいところもあるし。

でも、使い道が無い。

誰か貰ってくれないものか。しかしWindowsは入ってないし、前面パネルを固定する棒が折れてるから変なものでくっつけてあるし…。中古パーツとして売ってみても全部で500円で売れればいいほうで、下手すると買い取り拒否だし。…自分で何か使い道を探すしかないか。

ATX機の消費電力を測ってみた。 :

ワットチェッカーでATX機の消費電力を測ってみたけど、アイドル状態で160W前後。サクサク動くと言っても、これはちょっと…食い過ぎじゃないのか…でもないのかな…。

Ubuntuを入れて動かしてるけど、Ubuntuって省電力設定はないのかな。ググってみたら、laptop-mode-tools とか tlp とかその手のツールがあるらしい。もう少し調べてみないと。

BD-RドライブとUSB3.0増設ボードの型番を調べた。 :

ATX機の構成パーツの一部を把握してなかったので、ケースを開けて確認。
  • BD-Rドライブ: Pioneer BDR-203BK (SATA接続, 12=V1.0A, 5V=1.4A)
  • USB3.0増設ボード: PLANEX PL-US3IF02PE (Renesas uPD720200F1 使用品, PCI Express x1(Rev.2)接続)
BD-Rドライブは、M/Bの Intel ICH10R側のSATA端子に接続すると何故か起動しないらしい。M/Bに追加された別のSATAチップ側に接続すれば使える、との話。それと、BD-RだかDVD-Rだか何か特定のメディアが書き込めない、との話も聞いた。とメモ。

USB3.0増設ボードに積んであったコントローラは Renesas uPD720200 だった。弟には悪いけど、これはゴミボードだな…。uPD720201 や uPD720202 はともかく、uPD720200は、人柱チップ…。どうにか使えないものかと色々試したのに安定動作しなくて途方に暮れたから分かる。このコントローラは使い物にならない。USB3.0で苦労したくないなら、後継チップを使ってる品に買い替えたほうがいい…。

2016/01/20(水) [n年前の日記]

#1 [ubuntu] Ubuntuを入れたATX機のセットアップをアレコレ試してたり

Ubuntu 14.04LTS を入れたPCに対して、色々試した。

tlpをインストールして試したり。 :

Ubuntu Linux に tlp なるソフトを入れると省電力設定にできるらしいので入れてみたり。

アイドル状態で、160Wが140Wぐらいになってくれた。たしかに効果があるっぽい。けど、それでも140Wも使っちゃうのか…。

その後ググっていたら、どうやらビデオカードに AMD/ATI Radeon を使っていて、かつ、オープンソース版ドライバを使ってる場合は、常時電力を食いっぱなしになる、という話を見かけたり。

AMDが提供してるクローズドソースのドライバを使えれば省電力にしてくれるらしいけど、AMD提供ドライバは比較的新しいビデオチップしかサポートしてないそうで。今回 Ubuntu を動かしてるATX機には、ATI Radeon HD 4850 が載ってるビデオカードを積んでいる ―― Radeon HD 4850 は、GeForce 9800 GTX+ と同時期のビデオチップだから、結構古い。おそらくAMD提供ドライバは非対応のはず。

てなわけで、これはビデオカードが電気を馬鹿食いしてるのかなと。

ATIビデオカードのドライバを入れる方法が分からない。 :

Ubuntu 14.04 に、ATIビデオカードのドライバをどうやって入れたらいいのか…。aptitude search ati とか打ってみたりして眺めてたけど、どうも xserver-xorg-video-ati なるパッケージがそれっぽい。が、インストールしようとすると「依存関係が」「競合が」と言われてインストールできなくて。

_UbuntuTips/Hardware/RadeonDriver - Ubuntu Japanese Wiki を眺めると、「最新のUbuntuは、ATIドライバに対して特別な設定は要らんよ」と書いてあるけど。ATIドライバが使われてるかどうかは何でチェックすればいいのやら。lspci | grep VGA で、以下の表示になるから、既に使われているのだろうか…? どうなんだろう?
$ lspci | grep VGA
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] RV770 [Radeon HD 4850]

ログイン画面の設定でハマったり。 :

Ubuntu 14.04 にVNC(vnc4server or tightvncserver)をインストールして、Windows7 x64 + UltraVNC からアクセスしてGUI画面を出そうと試みていたのだけど。その関係で LXDE だの lubuntu-desktop だの入れて弄ってたら、Ubuntu のログイン画面が Lubuntu のソレから元々のUbuntu標準のソレに戻せなくて悩んだり。

おそらく、ログイン画面のソレは、Ubuntu標準の lightdm から lxdm になったのだろうなと。であれば、sudo dpkg-reconfigure lxdm とか打てば切り替えられるんじゃないかな。などと思い込んでいたのだけど。sudo dpkg-reconfigure lxdm と打っても、「lxdmなんてインストールされてないですけど?」と言われてしまう。インストールされてないならインストールしてやろうじゃないか、と、sudo aptitude install lxdm 等を打ってインストールしてみたら、sudo dpkg-reconfigure lxdm で切り替えられるようにはなった。と思ったが、画面の見た目が切り替わってる気配が無い。おかしい。

ググってたら、以下の記事に遭遇。謎が解けた。

_lightDMの設定: たわごと

  • lightdm は見た目を結構自由自在に変えられるヤツらしい。
  • なので、Ubuntu とか Lubuntu とか Kubuntu に合わせて、lightdm はログイン画面の見た目を変えてしまうのだとか。
  • 自分はてっきり、lxdm でログイン画面が表示されてると思ってたけど。実はずっと lightdm が、ちょっと lxdm のふりをしてみた画面を表示してたっぽい。たぶん。
  • そして、lightdm の設定が書き換えられて、lxdm風の画面を表示する設定になってしまっていたから、lightdm に戻してみても見た目がさっぱり変化しなかったのだな…。

巷の解説記事によると、/etc/lightdm/lightdm.conf というファイルがあって、そこを書き換えれば見た目を変更できるらしいけど。lubuntu-desktop をインストールしてしまった自分の環境では、そのようなファイルは見当たらず。その代り(?)、/etc/lightdm/lightdm.conf.d/20-lubuntu.conf というファイルがなんだか関係してそうで。中身は以下。
[SeatDefaults]
user-session=Lubuntu

試しに、/etc/lightdm/lightdm.conf.d/20-lubuntu.conf の最後に、以下の一行を追加してみた。
greeter-session=unity-greeter

Ubuntuを再起動してみたところ、Ubuntu標準のログイン画面の見た目になってくれた。これで合ってんのかなあ…? わかんねえなあ…。

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

Ubuntu 14.04LTS を使ってはみたものの、なんだかパッケージが古いあたりが気になってきて、せっかくだから最新の15.10を入れてしまおうか、多少は違ってくるだろ、てな気分に。

_Ubuntu日本語Remix版 のISOをDLして、 _UNetbootin でISOの内容が入った起動可能なUSBメモリを作成。そのUSBメモリで起動して、HDDの中身を Gparted で削除。HDDにUbuntuインストール。

とりあえず、ssh と samba と aptitude と _synaptic ぐらいをインストール。ssh でログインすれば、Windows上から Ubuntu の設定作業ができるし。samba を入れておくことで、WindowsからPC名(NetBIOS名?)でアクセスできるようになるはず。

sshでログインできない。 :

Ubuntu 15.10 をインストールしてみたけど。Windows7 x64 + PuTTY から、sshでログインできないことに気が付いた。なんでや…。

Windows から ping hogehoge を打ってみた。反応がちゃんと帰ってくる。ということは、PC名でアクセスできなくて ssh ログインできない、と言うことではナサゲ。

15.10あたりはファイアウォールが動く設定になってるのかなと ufw のあたりを確認してみたけど。ファイアウォールを動かさない設定にしても PuTTY は無反応なので、これでもナサゲ。

実はポートが開いてないのかと、Windows側に Nmap をインストールしてポートスキャンしてみたけど、開いてるように見える…。

_ポートスキャンツール「Nmap」を使ったセキュリティチェック - さくらのナレッジ

なんでsshが使えないのじゃ。

以上、10 日分です。

過去ログ表示

Prev - 2016/01 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project