mieki256's diary



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

#1 [ruby] FXRubyをWindows10上で試用

Windows10 x64 22H2上で、FXRuby を試用してみた。

_GitHub - larskanis/fxruby: FXRuby is an extension module for Ruby that provides an interface to the FOX GUI toolkit.
_fxruby | RubyGems.org | コミュニティのgemホスティングサービス
_File: README - Documentation for fxruby (1.6.46)

FXRubyは、Rubyから利用できるGUIライブラリ。 _FOX Toolkit というGUIライブラリをRubyから利用できるようにしたもの。かなり昔からあるけれど、他のRuby用GUIライブラリが軒並み開発停止になっている中、今でも開発が続いているあたり、かなり貴重なライブラリなのではないかと。

以下の環境で動作確認してみた。
ちなみに、自分、以前少しだけ試用してみたことがあるっぽい。

_mieki256's diary - FXRubyを勉強中

インストール :

gem install fxruby

Windowsの場合は、これだけでインストールできる。今回は fxruby 1.6.46 x86-mingw32 がインストールされた。

サンプルファイルで動作確認 :

以下のディレクトリにサンプルファイル群が入っている。
(Rubyインストールフォルダ)\lib\ruby\gems\2.6.0\gems\fxruby-1.6.46-x86-mingw32\examples\

examples\ を別の場所にまるっとコピーして、その中で一通り動かしてみたけれど、FXRuby だけを使っているサンプルについては大体動かせた。他のライブラリまで要求するサンプルについては動作確認していない。

ただ、一見動いているようでも、一部のスクリプトは終了時に Segmentation fault を吐く。例えば dctest.rb は、Ruby 2.6.10 x86、Ruby 3.2.2 x86、どちらも Segmentation fault を吐いた。

更に、一部のスクリプトは、終了時に以下のメッセージを吐く。
../../../../ext/fox16_c/FXRuby.cpp(164): FXASSERT(SWIG_CheckConvert(rbObj, ty)) failed.
例えば image.rb がこういうメッセージを吐いたりする。しかし、Ruby 2.6.10 x86 では吐くけれど、Ruby 3.2.2 x86 では吐かない。Ruby のバージョンによって問題が起きたり起きなかったりするっぽい。

問題点 :

少し触っているうちに、ふと気づいた。コレ、日本語入力ができないのでは…? scintilla-test.rb を動かして試した感じでは、IMEが無反応だった。

加えて、Alt + F4 でウインドウを閉じられない点も少し気になった。Windowsの作法に従ってないっぽい。でもまあ、他のアプリでもそういうのはあるから、そこらへんはまあいいか。

何にせよ、日本語入力ができない点は、日本語文化圏では結構痛い気がする。道理で日本国内では関連記事を全く見かけないわけで…。日本語入力を一切しないGUIアプリなら使えなくもない、みたいな話になるのだろうか。


以下の記事によると、入力はともかく、日本語表示はできるらしい。

_Rubyはじめました: rubyでGUIアプリ FxRubyのインストールとHello World!


更にググっていたら、大昔、2002年頃なら、パッチをあてることで入力できなくもない状態になってた時期もあるようで…。ただ、今ではパッチ関連のページすら消滅してる状況なので、もう誰も FOX Toolkit に日本語入力なんて期待していないということなのだろう…。

_Takahiro's inside out - fox-unicode (WebArchive)
_FOX Unicode 化 (WebArchive)
_Ruby de GUI

#2 [ruby] Ruby/GTK3を試用

Windows10 x64 22H2 + Ruby で使えるGUIライブラリ FXRuby を試用してみたものの、日本語入力できない点が気になるわけで。ruby-gtk3 ならそのあたりはどうなのかなと気になったので、試用してみることにした。

_gtk3 | RubyGems.org | コミュニティのgemホスティングサービス
_The source of https://ruby-gnome.github.io/ | ruby-gnome.github.io
_GitHub - ruby-gnome/ruby-gnome: A set of bindings for the GNOME libraries to use from Ruby.
_File: README - Documentation for gtk3 (4.2.0)

2023年になっても更新されている。今でもちゃんと開発が続いてるGUIライブラリらしい。

ところで、名称がよく分からんのだけど…。Ruby/GTK3、ruby-gtk3、Ruby-GNOME2 GTK3モジュール、どの名称が正しいのだろう?

環境は以下。

インストール :

gem install gtk3

以下が追加でインストールされた。
gobject-introspection-4.2.0.gem
glib2-4.2.0.gem
pkg-config-1.5.5.gem
cairo-gobject-4.2.0.gem
pango-4.2.0.gem
gio2-4.2.0.gem
gdk_pixbuf2-4.2.0.gem
gdk3-4.2.0.gem
gtk3-4.2.0.gem
atk-4.2.0.gem

ほとんどのパッケージはビルドされてからインストールされた。つまり、Windows上で Ruby + gtk3 を使うにあたっては、ビルドするための環境が ―― DevKitが必須になる模様。

サンプルを動かして動作確認 :

以前書いたままHDDに残ってたサンプルファイル群はそのまま動いてくれた。

また、以下のページ紹介されているサンプルも動かしてみた。

_noanoa 日々の日記 : Ruby/GTK2,GTK3 プログラミング Tips(6)- テキスト入力
_noanoa 日々の日記 : Ruby/GTK2,GTK3 プログラミング Tips(4)- 画像、アニメーション

  • テキスト入力欄(Entry)を使うサンプルを動かしてみたら、FXRuby と違って日本語入力も受け付けてくれた。
  • 画像表示するサンプルが動いたので、LibUI と違って Windows上でも画像表示可能らしい。

ただ、ウインドウが表示されるまでちょっと待たされる感じがする。自分が使ってる環境、AMD Ryzen 5 5600X ですら数秒待たされるので、もっとスペックが低いPCで動かしたらどうなることやら。起動時のもっさり感は尋常じゃない印象。

それでも、日本語入力ができるし、画像表示もできるし、何より開発停止になってないしで、Windows上のRubyでGUIアプリを作るなら、現状では ruby-gtk3 一択かもしれないと思えてきた。もっとも、まだexe化は試してないので、そのあたりは不安だけど…。exe化できるんかな…。

参考になりそうなページ :


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

#1 [mz][z80] X1やMZ-2000のモニタについて調べてる

X1エミュレータ上で、標準版 S-OS SWORD のバイナリが起動しない件についてまだ調べている。Huモニタなるものが無いと起動しないのではないか、というところまでは分かってきたけど、それって本当なのかなと気になったので…。

S-OS SWORD の前身となった S-OS MACE ではどうだったのだろうとググっていたら、MZ-2000版 S-OS MACE について気になる一文を見かけた。

_S-OS "MACE"
IPL起動は出来ず、MZ-1Z001Mが必要だった。

S-OS "MACE" より


MZ-1Z001M、とな…。それは一体なんですか?

_MZ型番考
MZ-1Z001 MZ-2000/2200 BASIC
MZ-1Z001M MZ-2000/2200 モニタ
MZ-1Z002 MZ-2000/2200 カラーBASIC
MZ-1Z003 MZ-2000/2200 倍精度BASIC

MZ型番考 より


MZ-1Z001M は「モニタ」と呼ばれるプログラムらしい。

モニタって…何? ディスプレイのことを _モニター って言ったりするけれど、それとは関係ありますか?

MZ-1Z009A MZ-700 ROMモニタ
MZ-1Z009B MZ-1500 ROMモニタ

MZ型番考 より


例えば、MZ-700の電源をONにした時に立ち上がってくる 1Z-009A というプログラムがあるけれど、それは「ROMモニタ」と呼ばれていたらしい。ROMに入ってるから、ROMモニタ。つまり、「モニタ」とは「ROMに入ってないモニタ」のことだろうなと。

ROMに入ってないなら、どこに入ってるんだよ? やっぱり、ストレージの類、カセットテープやフロッピーディスク(以下FDと記述)の中に入ってたんじゃないかな…。他に入れられそうなブツは無いし…。

MZ-700 のROMモニタでどんなことができるのかを思い浮かべると、おそらくここでモニタと呼ばれているものは…。 そういうことができるプログラム、なのだろう…。

要するに…。「当時、PCで、『対話的に』マシン語/機械語を扱える状態にするためのプログラムが、モニタと呼ばれいてた」 ―― ということじゃないかなと。たぶん。おそらく。

ところで、最初のあたりで「IPL」という単語が出てきたけれど、それって一体なんだろう? モニタとは違うものなの?

_MZ-2000 - Wikipedia
MZ-80Bの同様、MZ-2000ではInitial Program LoaderのみがROMに書き込まれており、CMT、FD、特定のメモリからの起動をサポートする。

MZ-2000 - Wikipedia より


IPL は、Initial Program Loader の略だったららしい。

つまり…。
では、MZ-2000 のモニタプログラム、MZ-1Z001M は、どうやって入手していたのだろう。単体販売されていたのかな?

システムソフトウェア

型番のハイフンの次が1で始まるものはカセットテープ、2で始まるものはフロッピーディスクによる供給である。 その多くが、モニタMZ-1Z001Mを含み、標準から拡張されている部分はBASIC本体で直接サポートされるため、データレコーダなしでバイナリを取り扱うことには制限があった。

MZ-2000 - Wikipedia より


BASIC や PASCAL などの、システムソフトウェアと呼ばれるジャンルのプログラム群に含まれていた、とある。

_S-BASIC (MZ-1Z001) Reference Manual
MON : 機械語モニタ(メモリを直接いじれる簡易エディタ あるいは 超機能限定版デバッガ のようなもの。 昔のパソコンには大抵ついていた。)に入る。モニタからBASICに戻るには J コマンドで $1300 にジャンプ。

S-BASIC (MZ-1Z001) Reference Manual より


BASIC をロードすると、モニタ MZ-1Z001M も一緒にロードされた状態になっていたらしい。そして、mon と打つと、モニタに切り替わる。更に、$1300 にジャンプすれば BASIC に戻れた、とある。となると、そのモニタとやらは、$1300 より前のメモリ領域に格納されていた可能性が高そうだなと…。

MZ-80B/2000/2200版 S-OS SWORD のメモリマップを確認してみたけれど、SWORD自体は $1300 から格納される模様。となると、モニタ MZ-1Z001M は、$0000 - $12FFH に入ってたプログラムなのだろう…。

X1についても調べてみた。

_X1 (コンピュータ) - Wikipedia
電源投入直後、最初にIPL (Initial Program Loader) が起動し、FDD、拡張ROMボード、CMTの順にブートを試みる。

X1 (コンピュータ) - Wikipedia より


ここでも IPL と言ってるから、MZ-2000 と同様の仕組みらしい。

_X1型番考
CZ-8CB01 : テープBASIC
CZ-8FB01 : ディスクBASIC, 5インチ、BASICそのものの型番でもある
CZ-8FB02 : turbo BASIC
CZ-8FB03 : Z-BASIC
CZ-8RB : ROM BASIC
CZ-8W301 : ディスクBASIC, 3インチ
CZ-8WB51 : X1ターボBASIC

CZ-112SF : NEW BASIC, カセット版
CZ-113SF : 3インチ版、当初5インチ版も同梱の予定だったらしい
CZ-124SF : NEW BASIC, 5インチ版

X1型番考 より


おそらくだけど、Huモニタと呼ばれるものは、これらのBASICに含まれていたのだろう。そして、mon と打ち込むとモニタモードに切り替わる。更に、例えば X1用の S-OS SWORD は $1500 から始まっているから、Huモニタとやらは $0000 - $14FF に入っているのではあるまいか。

つまり、標準版の X1用S-OS、MZ-2000用S-OS は…。
  1. 一旦BASICをロードして、
  2. mon と打ってモニタ(Huモニタや MZ-1Z001M)に切り替えて、
  3. そこでようやく S-OS SWORD をロードすることで、S-OS が起動する。
そんな操作手順で使ってたのかなと。あくまで想像だけど。実際どうだったのかは分からんけど。いや、自分もX1turboユーザだったのだから、当時触ってたはずなんだけど、完全に何もかも忘れているわけで…。

ということで、「X1 や MZ-2000 で標準版の S-OS を使いたかったら BASIC が必要ですよ」「BASIC の中に入ってるモニタを利用しますので」ということで間違いなさそう。

MZ-700 は ROMにモニタが入ってるんで、いきなり S-OS を読み込んで使うことができたのだな。しかし、X1 や MZ-2000 はそうじゃないよ、ROM に IPL は入ってるけど、それだけじゃ足りないよ、別途モニタが必要だよ、と…。

そして、そのモニタとやらは、今となっては正規に入手する術がない。CP/Mあたりと比べると、日本のレトロPCって不自由…。

2022/10/19追記。 :

上記が分かった上でググってみたら、そもそも S-OS SWORD のドキュメント(?)に、このあたりちゃんと書いてあることに気づいた…。

_S-OS Sword Ver2.0 (J)(1986-02)(Oh!mz) [mz80K][type-in].txt
S-OS“SWORD"は、
X1では BASIC CZ-8CB01/8FB01のモニタ、
MZ-80B/2000/2200/2500ではモニタSB-1520またはMZ-1Z001M、
MZ-80K/C/1200/700/1500ではROMモニタ上で動作します。
それぞれのマシン語モニタから入力してください。

最後のあたりに書いてあったから気づかなかった…。

2021/10/18(月) [n年前の日記]

#1 [gimp] GIMPのブラシファイルを作ってる

Windows10 x64 21H1 + GIMP 2.10.28 x64 Portable samj版上で、GIMPの矢印ブラシファイルを作成中。

今まで色々な矢印ブラシファイルを追加してきて、結果、ファイル数が多くなってしまったので少し整理していたのだけど。

_GIMP Arrow Brush set by Banekai on DeviantArt
_arrow brushes color 1
_arrow brushes color 2
_arrow brushes BW 1
_arrow brushes BW 2
_arrow brushes black gloss
_hand pointer brushes
_button arrow brushes
_gimphelp.org Arrow Action
_cursor brushes

それぞれのブラシについて改めて確認してみたら…。 これじゃ使い辛い…。

GIMP って昔からある画像編集ソフトだから、当時は何かにつけてファイルサイズが小さいほうが良しとされていたようで、故に、昔から配布されているブラシ画像も妙に小さいサイズになってる傾向があって…。また、どうも当時はブラシファイル(.gbr)のフォーマットに制限があったか、あるいは仕様についてよく知られてなかったのか、描画色を反映せず、ブラシ画像に含まれている色でしか描画できないタイプのブラシも多く…。

ということで、この際自作してしまおうかなと。せめて 512x512ぐらいの画像サイズにしたい。てな感じで作業を始めたところ。

2020/10/18() [n年前の日記]

#1 [zatta] 体調が悪い

お腹の調子がよろしくない…。午前中に怪しくなって、夕方になっても治らず。仕方なく、犬の散歩は親父さんに代わってもらった。そのぐらい危ない感じ。

なんか変なものを食べてしまったのだろうか…。家族は体調が悪くなってないので、自分が夜食で食べたアレコレの中によろしくないものがあったのかもしれず。

2019/10/18(金) [n年前の日記]

#1 [nitijyou] 腹痛が続いてる

昨日の昼頃から腹のあたりに重い痛み。この手の痛みは寝て起きると大体は治るのだけど、今回はまたぶり返してくる感じで。

洪水が起きた場所を自転車で呑気にウロウロしてたのがマズかったのだろうか…。土埃がスゴイし、何か変な菌やウイルスでも吸い込んでしまったのでは…。一応マスクはつけて走ってたのだけど…。

2018/10/18(木) [n年前の日記]

#1 [cg_tools] FreeCADで展開図

FreeCADを使ったモデリングのチュートリアル記事を一通り試してみて、なんとなく雰囲気は掴めてきた。要は、
  1. スケッチと呼ばれる2D的な図を描いて、
  2. それを押し出して3D形状を作って、
  3. 複雑な形は、シンプルな形状をブーリアン演算でまとめて作っていく。
みたいな感じっぽいなと。

それはさておき。FreeCAD を使って展開図のようなものは作れるのかなと気になってきたわけで。それができれば、ペーパークラフトっぽい何かにも使えるかもしれない。みたいな。

ググってみたら、以下のマクロに遭遇。コレはイイ感じかも…。ありがたや。

_blog:papiermodelle_erstellen [FreeCAD Buch]

一応簡単に導入と使い方をメモ。環境は Windos10 x64 + FreeCAD 0.17。

インストールの仕方。 :

_blog:papiermodelle_erstellen [FreeCAD Buch] の、下のほうのリンクから、unfold.py をダウンロード。

unfold.py を、ユーザマクロがインストールされてる場所にコピー。Windows 10 の場合、Win + R キーを押して以下を打ち込めばエクスプローラで開ける。
%APPDATA%\FreeCAD\Macro
要は以下の場所にあるのだけど。
C:\Users\ユーザアカウント名\AppData\Roaming\FreeCAD\Macro\

Linuxの場合は…どこになるんだろう…。以下が参考になるのかな。件のマクロが動くかどうかは分からんけど…。

_How to install macros - FreeCAD Documentation

使い方。 :

公式の動画を見たほうが分かりやすいとは思うけど…。

_unfold the shape to a papermodel - YouTube

一応、使い方を簡単にメモ。
  1. FreeCADを起動して何かモデルを作って…。
  2. Partワークベンチに変更。
  3. モデルを選択して、メニューの「部品」→コピーを作成。モデルのコピーが作成される。
  4. Draftワークベンチに変更。
  5. 先ほどコピーしたモデルを選択。
  6. ツールバー上のダウングレード(下向きの矢印のアイコン)をクリック。モデルが、面毎にバラバラになる。
  7. Ctrl + 左クリックで、展開したい複数の面を選択。
  8. メニューの「マクロ」→「マクロ...」か、ツールバー上の「記録されたマクロを実行するためのダイアログボックスを開く」(メモ帳っぽいアイコン。マクロ記録アイコンの右のほうにある)をクリック。
  9. unfold.py を選んで実行。
  10. 選んでおいた複数の面が展開される。

一々、unfold.py をマクロ一覧から呼び出すのが面倒臭いなと…。ググってみたら、マクロをツールバー上に登録しておくこともできるらしい。

_Macros/jp - FreeCAD Documentation

上記ページを参考にして、Draftワークベンチ上で、新規ツールバーを作成して登録してみたところ、使い勝手がかなり改善した。

他の展開の方法。 :

他にも展開のさせ方はあるっぽいけど…。

例えば、 FreeCAD には、Sheet Metal ワークベンチと言う、板金用のワークベンチもあって。ソレを導入すれば、厚みを考慮した状態で、Unfold ができるっぽい。

_FreeCADにSheetmetalワークベンチを登録する
_作成したベンド(Bend)をUnfoldで展開します

導入の仕方は…。FreeCAD 0.17 は、ツール → Addon manager、を選ぶと、ネットワーク経由で追加機能をダウンロード・インストールすることができるので、ソレを使えば簡単。

なのだけど。Windows10 x64 + FreeCAD 0.17 上では、動画の通りに操作をしても、Unfold ができなくて…。昔の版ならできたのだろうか…。状況がちょっとよく分からない。

もう一つ見つけた方法は、Unfold box というマクロを使う事例。

_Macro Unfold Box - FreeCAD Documentation

これも、Addon manager からインストールできるように見えた。

しかし、使い方が全く分からない…。呼び出すと、ステータスバー上にPython関係のエラーが出てしまう…。これも昔の版なら使えたのだろうか。あるいは、Windows上では動かないけどLinux上なら動くのだろうか。これまた状況がちょっとよく分からない。

2017/10/18(水) [n年前の日記]

#1 [raspberrypi] LuaでOpenGL ESを使えるらしいLjESを試用

Raspberry Pi上で Lua を使って OpenGL ES を制御する LjES なるライブラリがあるようで。

_jun-mizutani/ljes: LjES : 3D framework for LuaJIT on Raspberry Pi
_LuaJITでお手軽3Dプログラミング (1) (2013/03/29) - Raspberry Pi メモ (19) - Jun's homepage
_LuaJITでお手軽3Dプログラミング (2) (2013/04/14) - Raspberry Pi メモ (20) - Jun's homepage
_LuaJITでお手軽3Dプログラミング (3) (2013/06/23) - Raspberry Pi メモ (22) - Jun's homepage
_LuaJITでお手軽3Dプログラミング (4) (2013/12/23) - Raspberry Pi メモ (25) - Jun's homepage
_LuaJITでお手軽3Dプログラミング (5) (2014/03/31) - Raspberry Pi メモ (29) - LuaJITでお手軽3D (5)

Raspberry Pi Zero W上で試用してみたり。

インストールは…。件のライブラリは github でも公開されてるので、git でダウンロードできる。
mkdir ~/prg/lua
cd ~/prg/lua/
git clone https://github.com/jun-mizutani/ljes.git

以下でデモを動かせる。
cd ljes
cd examples
luajit demo_spheres.lua
たくさんの球がグルグル回りながら表示された。見た目は結構圧巻。

Lua が Python より軽ければいいな、60FPSが出たらありがたいな、などと期待しつつ動かしてみたけれど。Raspberry Pi Zero W、1280x720の画面解像度では、44FPS前後だった。60FPSは無理か…。

もちろん、Python + pi3d にしろ、Lua(LuaJIT) +LjES にしろ、比較的簡単な記述で3D描画が試せるのはありがたいわけで。

考えてみれば、大昔の3Dゲームは30FPSとか20FPSとかで動いてたから、そのぐらいの速度で動けばとりあえず御の字と捉えることができなくもない…かな。どうかな。どうなんだ。

#2 [raspberrypi] Raspberry Pi Zero WではFlashが動かないっぽい

ふと、もしかして Raspberry Pi Zero W上でFlash Playerが動くのであれば、ゲームの類はFlashで作ったほうが良かったりして、などと思えてきたわけで。

ということで、 Zero Wを起動して、Chromiumブラウザも起動して、Flash Player が動くのかどうか試してみたのだけど、色々やってみてもFlashが動く気配が無くて。

おかしいな。ググった感じでは、「昨今の raspbian なら Flash Player が動くよ」「最初から Flash Player が入ってるよ」と解説されてるページを見かけるのだけど。

_ラズベリーパイでFlash Playerを有効化にしてインタラクティブなコンテンツを楽しむ! - FABSHOP.JP -デジタルでものづくり! ファブショップ !
_【Raspberry Pi】Raspbian Jessie with PixelのChromiumにFlashを入れる

しつこくググっていたら、気になるページに遭遇。

_Flash Player now available for Chromium - Raspberry Pi Forums
_Flash Player on Debian - Raspberry Pi Forums

「Flash Player は Raspberry Pi2 や Pi3 なら動くけど Zero や Pi1 では動かんよ」
「Pi2 や Pi3は ARMv7 だけど、Zero や Pi1 は ARMv6 なんだよ」
「Adobe は ARMv6 で動く Flash Playerを出してないよ」
「だから、Zero や Pi1 上の Chromium は、Flash Player を動かさないフラグ設定にしてるよ」

と書いてあるように見える。

そういうオチか…。どうやら Zero系では Flash Player は動かせない、と思っておいたほうが良さそうだな…。

Scratchにも影響があるらしい。 :

更にググってるうちに、オンライン版 Scratch 2.x は動作に Flash Player が必要、という話を見かけた。

_ラズベリーパイの調理法 Raspbian アップデート - Scratch 2.0 および Thonny のサポート
なお、Pi 1 および Pi Zero はサポート対応外です。Chromium で Flash を動かすため Pepper Flash プラグインを使いますが、これは、Pi 1 および Pi Zero をサポートしていないためです。

ラズベリーパイの調理法 Raspbian アップデート - Scratch 2.0 および Thonny のサポート より


ということは、Zero上で Scratch を使おうとしたら、ちょっと困ったことになりそうな。

値段が安いからという理由で、学校等でお子さん達に Raspberry Pi Zero を配って、みたいな話をどこかで見かけた記憶があるけど。ソレ、本当に Zero で上手く回るのかしら。Scratch 2.x が動かないハードウェアを配ってしまうのは、プログラミング教育が目的ならマズい状況では。Pi2 か Pi3 を配ったほうが余計なトラブルを回避できそうな予感。

Zero系って、意外と制限があるなあ。「こんなに小さいのにLinuxが動くのか」と感心してたけど、こうもチラホラと問題があるとなると…。うーん。

#3 [raspberrypi] Raspberry PiでChumbyモドキを作れないかな

今から約10年ぐらい前に、Chumbyというガジェットが世に出ていたらしいのだけど。

3.5インチ320x240、タッチスクリーン付きの液晶を備えた小さなLinux機で、Wi-Fiでネット接続して色んな情報を取得して表示し続ける据え置き機、みたいなガジェットだったようで。ケースを、布製やビニール製の柔らかい何かでくるんでしまえるあたり、見た目もちょっとオシャレな感じで。

まあ、色々な事情があったようで、消滅しちゃったのだけど…。自分が Chumby の存在を知った時には、もう製造中止になってた記憶が。

_目覚まし、ゲーム機、YouTubeテレビ――多機能ネットガジェット「Chumby」日本上陸 - ITmedia NEWS
_チャンビー - Wikipedia
_chumbyとは (チャンビーとは) [単語記事] - ニコニコ大百科
_Chumby! | なべこら |株式会社ジークス(東京・大阪)

数年前に復活、という話も見かけたけど。今も販売されているのだろうか…。

_ASCII.jp:お帰りChumby、新モデルとともに復活
_Chumby が休止期間を経て復活、月額3ドルの課金制を導入。国内販売は未定 - Engadget 日本版

それはそれとして。Chumby っぽい何かしらを Raspberry Pi を使って作れないものかなあ、などと唐突に夢想してしまったわけで。まあ、ググってみると、英語圏では同じようなことをつぶやいてる人達をちょくちょく見かけたりもするのだけど。

Raspberry Pi Zero W なら基板が小さいから、作りやすいかな…。と思ったけれど、Chumby って Flash Lite 3 とやらが動いてたらしいから、そこまで再現するとなると Zero系ではダメだよな。Flashが動かないし。

Chumby は、サーバ上にユーザデータを保存とか、ウィジェットはサーバから入手するとか、そういう仕様になっていたから、公式サイトが消滅したら何も動かせなくなって只の時計と化してしまったらしいけど。そういった問題を回避しようとするなら、どういう仕様にしておくのが正解なんだろうと考え込んでしまったり。ユーザデータはどうにかして本体に保存しないといかんよなあ…。ウィジェットも、野良ウィジェットをインストールできるように、とか。今なら github あたりから入手可能に、てなことも検討するのだろうか。

アレかな。各ウィジェットを、Webブラウザ上で動く何かしらにしておいたほうがいいのかな。JavaScriptとHTML5のcanvasを使って描画して、Webブラウザをフルスクリーンで表示し続けておけば…。そういう仕様にしておけば、スマホやタブレットでも代替できそうな…。Chumby というガジェットを作るのではなくて、Chumby が提供していたアレコレを提供するサイトを作る、という形になるのかな。

2016/10/18(火) [n年前の日記]

#1 [python] Atomエディタ、落ちまくり

Visual Studio Code より、Atomエディタのほうが、Pythonスクリプトの補完をガンガンしてくれることに気が付いて、今現在 Atom 1.11.2 でPythonスクリプトのソースを書いてるのだけど。

Atomエディタ、落ちるな…。ガンガン落ちる…。何かの拍子にフッと落ちる。何が原因なのやら。

Windowsのイベントビューアで確認したけど、ログが残ってるようには見えなかった。

2015/10/18() [n年前の日記]

#1 [nitijyou] 某所から電話

詳細はGRPでメモ。

2014/10/18() [n年前の日記]

#1 [nitijyou] そろそろ寒い

部屋の温度、14度。そろそろファンヒーターを使わないとアレかな。

2013/10/18(金) [n年前の日記]

#1 [unity] 先日作った横スクロールアクションのテストサンプルを修正中

_先日作ったテストサンプル のあちこちを修正中。

角にめり込むバグを修正 :

天井と壁の角にめり込んでその後怪しい動作になってしまうバグを修正できた、ような気がする。以下のような状態になってたみたいで。
バグがあった状態

とりあえず頭のあたりでも補正するようにして、かつ、「天井があるか?」→「壁があるか?」の順番でモードを変えるようにしてみたり。
対策

一応、角にめり込まなくなったように見えるけど…。まだどこか見落としがありそうな…。

本来であれば、当たった地形ポリゴンの法線ベクトルの向きを調べて、壁か天井か判定したほうがいいような気もする。そういう処理にしておかないと、例えばス○ライダー飛竜のような色々な角度を持った地形に対応できないのではないのかなと。

地形ポリゴンの法線ベクトルは、 _RaycastHit.normal で得られそう。 _ベクトルの内積 を使えば、横向きか下向きかの判定もできそうな予感。

ジャンプ関係のバグを修正。 :

足場から横に移動してポトリと落ちてる最中、空中でジャンプが2回できてしまうバグがあったので修正。地面の上でジャンプしているなら1回目のジャンプ開始として扱って、空中でジャンプしているなら2段ジャンプ開始として扱うことに。

壁つかまりや天井ぶら下がり状態から下に落ち始めた直後にすぐさま空中でジャンプ(=2段ジャンプ)すると地形を突き抜けてしまうバグも修正。ジャンプ開始時に天井とぶつかってないかチェックしてぶつかってたら補正する、みたいな処理を入れてみたり。

細かいところで色々出てくるなと…。もしかすると、モードをもっと細かく分けたほうが ―― いわゆるステップ派のノリで書いたほうがいいのかもしれない。ポトリと落ちてる最中のモードとか、天井ぶら下がりから下に落ちてる最中のモードとか。似たような処理がずらずら並ぶことになるだろうけど、モード毎に対処していけばいいからバグは少なくなりそうな。今やってる書き方は、たぶんフラグ派に近いのではと。

Normal Mapを使ってみた。 :

Unity は Normal Map とやらを使えるらしいと知り、試しに貼ってみたり。Normal Map を使うと、表面に凹凸があるように見せかけることができるそうで。

_Unity - Unity Manual

白黒の画像(グレー画像)を用意して、白が高い部分、黒が低い部分で描いといて。Unityにインポートした際に、Texture Type を Normal Map にしておく。 Create from Grayscale にチェックが入っていれば、白黒画像からNormal Map用の画像を生成してくれるっぽい。
Normal Map に使うテクスチャ設定

後は、Normal Map を使いたいマテリアルの Shader を Bumped Diffuse にして、NormalMap に先ほど設定したNormalMap用テクスチャを指定する。

Normal Map ON OFF Screenshot
たしかに見た目、凸凹してるようになった。イイ感じ。

ただ、問題も。きっちり真面目にUVを指定してない場所がハッキリ分かるようになったような。手抜きモデルで Normal Map を使うと手抜きぶりが更にバレバレになるのだなと…。

一応ソースも貼ってみたり。 :

無駄に長い上にゲロ吐きそうな汚いソースだろうけど、Unity上でこういう感じに書いたらこういう操作仕様も一応作れる、てな実例の一つ、ということで…。

Player.cs
using UnityEngine;
using System.Collections;
using System.Linq;

public class Player : MonoBehaviour {

    public float Gravity = 120.0f;      // 重力加速度
    public float Speed = 12;            // 横方向移動速度
    public float SpeedClamber = 8;      // 壁つかまり・天井ぶら下がり時の移動速度
    public float JumpSpeed = 45;        // ジャンプ開始速度
    public float MaxSpeed = 120;        // 移動速度の最大値
    public float ShortJumpXspeed = 3;   // 軽くジャンプする際のx速度
    public float ShortJumpYspeed = 25;  // 軽くジャンプする際のy速度

    public float AdjustX = 0.6f;            // アタリ判定用。x方向の距離
    public float AdjustY = 1.2f;            // アタリ判定用。y方向の距離
    public float RealAdjustDiff = 0.01f;    // 補正値を微妙に少なくする値

    public int GroundLayerNumber = 9;       // 地形アタリレイヤー番号
    public string GroundTag = "Ground";     // 地形モデルのタグ名
    public string WallTag = "Wall";         // 通行止めの壁のタグ名

    public bool DUMP_SORT_HITS = false;     // 開発用


    private Vector3 vec;            // 現在の速度
    private Vector3 oldPos;         // 前フレームの座標
    private Vector3 nowFramePos;    // 次フレームの座標
    private Vector3 adjustPos;      // 補正後の座標格納用

    private int groundLayer;    // 地形アタリを取る際のレイヤーマスク値
    private int jumpCount;      // 0以外ならジャンプ中
    private bool isGrounded;    // 足場・地面に立っている
    private bool isCeiling;     // 天井にぶつかっている
    private int sideAdjustRL;   // 壁で横方向に補正されたかどうか
    private int SideAdjustRLold;
    private bool isWallTop;     // 通行止めの壁か(天井)
    private bool isWallSide;    // 通行止めの壁か(横方向)
    private bool jumpDown;      // 足場から飛び降り中

    private Vector3 targetPos;  // モード移行時の目標座標
    private float moveTimer;    // モード移行時用タイマー

    private bool hitEnemy;      // 敵オブジェクトと当たったかどうかのフラグ

    // モードの種類(歩行、壁つかまり、天井ぶら下がり等)
    enum Status {
        Walk, Clamber, Hanging, StepChangeing
    }

    private Status step;        // モード
    private Status nextStep;    // 次回のモード値

    // 初期化処理
    void Start() {
        vec = Vector3.zero;
        jumpCount = 0;
        isGrounded = false;
        sideAdjustRL = 0;
        isWallTop = false;
        isWallSide = false;
        jumpDown = false;
        groundLayer = 1 << GroundLayerNumber;
        hitEnemy = false;
        step = Status.Walk;
    }

    // 毎フレーム呼ばれる処理
    void Update() {
        float xd = Input.GetAxisRaw("Horizontal");  // 左:-1、右:+1
        float yd = Input.GetAxisRaw("Vertical");    // 下:-1、上:+1 
        nowFramePos = transform.position;
        adjustPos = Vector3.zero;

        switch (step) {
            case Status.Walk:
                // 歩行 or ジャンプ状態
                Walk(xd, yd);
                break;

            case Status.Clamber:
                // 壁つかまり状態
                Clamber(xd, yd);
                break;

            case Status.Hanging:
                // 天井ぶら下がり状態
                Hanging(xd, yd);
                break;

            case Status.StepChangeing:
                // ぶら下がり←→壁つかまりへの移行中
                nowFramePos += (vec * Time.deltaTime);
                moveTimer -= Time.deltaTime;
                if (moveTimer <= 0) {
                    step = nextStep;
                    nowFramePos = targetPos;
                    vec = Vector3.zero;
                    jumpCount = 0;
                }
                break;
        }

        Vector3 f = nowFramePos - transform.position;
        transform.Translate(f);
    }

    // 歩行 or ジャンプ中の処理
    void Walk(float xd, float yd) {
        // 左右キーで移動
        if (vec.y == 0 || xd != 0) vec = new Vector3(xd * Speed, vec.y, 0);

        // 重力加速度を速度に加える
        vec += (Vector3.down * Gravity * Time.deltaTime);

        // y方向の最大速度を超えないようにする
        if (vec.y < 0 && vec.y < -MaxSpeed) vec.y = -MaxSpeed;
        if (vec.y > 0 && vec.y > MaxSpeed) vec.y = MaxSpeed;

        // 新しい座標を算出
        nowFramePos += vec * Time.deltaTime;

        float trueVecX = vec.x;

        if (vec.y <= 0) {
            // 上に飛んでいないなら、天井とアタリ判定はしない
            isCeiling = false;
        }
        else {
            // 天井と補正
            isCeiling = AdjustCeiling(nowFramePos, 1.0f);
            if (isCeiling) nowFramePos = adjustPos; // 天井があったら実際に補正
            if (isWallTop) isCeiling = false;   // 通行止めの天井だったら、天井はなかったことにする
        }

        // 空中の足場から飛び降り中なら、一定距離は地面とのアタリ補正をしない
        // アタリ補正をしてしまうと、また空中の足場に補正されてしまうので。
        // 上向きに飛んでいる場合も、非飛び降り中にする。
        if (jumpDown && ((oldPos.y - nowFramePos.y) > (AdjustY * 2) || vec.y > 0)) jumpDown = false;

        int chkFg = (xd > 0) ? 0x02 : ((xd < 0) ? 0x01 : 0x03);
        bool sideAdjustEnable = true;
        if (!isCeiling && !jumpDown) {
            // 頭のあたりのy座標を使って一旦横方向に補正
            // これをしないと壁と天井の角に突っ込んでしまう
            Vector3 tpos = nowFramePos;
            tpos.y += AdjustY;
            if (AdjustSide(tpos, 1.0f, chkFg) != 0) {
                nowFramePos = adjustPos;
                nowFramePos.y -= AdjustY;
                if (isWallSide) {
                    sideAdjustRL = 0;
                    sideAdjustEnable = false;
                }
            }
        }

        // 体の中心y座標で横方向に補正
        if (sideAdjustEnable) AdjustSideUseCenter(chkFg);

        if (jumpDown) {
            isGrounded = false;
        } else {
            if (vec.y <= 0) {
                // 地面の上に居るか、下に向かって落ちている状態
                isGrounded = AdjustGround((isGrounded) ? 2.0f : 1.0f);    // 地面と補正
            }
            else {
                // 上に向かって飛んでいる状態
                isGrounded = false; // 地面とはぶつかってないことにする
            }
        }

        // 壁、キー入力、速度を見て、壁つかまりを要求されてるかをフラグにする
        bool reqClamber = false;
        if(sideAdjustRL != 0 && !isWallSide) {
            // 横に、通行止めではない壁がある
            if (yd > 0) reqClamber = true;  // 上キーを押された
            else {
                if ((sideAdjustRL & 0x02) != 0) {
                    // 右に壁がある
                    if ((trueVecX > 0 || xd > 0) && (jumpCount > 0 || vec.y != 0)) reqClamber = true;
                }
                if ((sideAdjustRL & 0x01) != 0) {
                    // 左に壁がある
                    if ((trueVecX < 0 || xd < 0) && (jumpCount > 0 || vec.y != 0)) reqClamber = true;
                }
            }
        }

        if (isCeiling) {
            // 天井にぶつかったので、天井ぶら下がりに移行
            step = Status.Hanging;
            vec = Vector3.zero;
            jumpCount = 0;
        }
        else if (reqClamber) {
            // 壁つかまり状態に移行
            step = Status.Clamber;
            vec = Vector3.zero;
            jumpCount = 0;
            SideAdjustRLold = sideAdjustRL;

            // 天井と補正
            // これをしないと、通行止めの天井に当たって落ちた後の動作がおかしくなる
            isCeiling = AdjustCeiling(nowFramePos, 1.0f);
            if (isCeiling) nowFramePos = adjustPos;
            if (isWallTop) isCeiling = false;
        }
        else if (Input.GetButtonDown("Jump")) {
            // ジャンプキーが押された
            if (jumpCount == 0) {
                // 未ジャンプ状態
                if (!jumpDown && isGrounded && yd < 0 && xd == 0) {
                    // 下キーも押されてるので、下に降りられるか調べる
                    RaycastHit[] hits = GetRayCastHits(nowFramePos, Vector3.down, 100.0f);
                    if (hits.Length >= 2) {
                        // 床ポリゴンが2つ以上見つかった
                        if (Mathf.Abs(hits[0].point.y - hits[1].point.y) > 2.0f) {
                            // 床ポリゴンは一頭身以上離れてるから、この場所は降りられそう
                            // 下に降りる
                            oldPos = nowFramePos;
                            jumpDown = true;
                        }
                    }
                }
                else {
                    // ジャンプする
                    vec.y = JumpSpeed;
                    jumpCount = (isGrounded)? 1 : 2;
                }
            }
            else if (jumpCount == 1) {
                // ジャンプ中に再度ジャンプボタンが押されたので二段ジャンプする
                vec.y = JumpSpeed * 0.8f;
                jumpCount++;
            }
        }
        else if (jumpCount > 0 && isGrounded) {
            // ジャンプ中に地面に着いたのでジャンプ終了
            jumpCount = 0;
        }
    }

    // 壁つかまり中の処理
    void Clamber(float xd, float yd) {
        // 上下キーで移動
        vec = Vector3.up * yd * SpeedClamber;
        nowFramePos += vec * Time.deltaTime;

        // 地形モデルとアタリ判定をして補正
        AdjustSideUseCenter(SideAdjustRLold);

        if (vec.y < 0) {
            isGrounded = AdjustGround(1.0f);
            isCeiling = false;
            isWallTop = false;
        }
        else if (vec.y > 0) {
            isGrounded = false;
            isCeiling = AdjustCeiling(nowFramePos, 1.0f);
            if (isCeiling) nowFramePos = adjustPos;
            if (isWallTop) isCeiling = false;
        }

        bool rlKeyEnable = false;
        if ((SideAdjustRLold & 0x01) != 0 && xd > 0) rlKeyEnable = true;
        if ((SideAdjustRLold & 0x02) != 0 && xd < 0) rlKeyEnable = true;

        if (sideAdjustRL != 0) {
            // 壁がまだある
            if (isGrounded && rlKeyEnable) {
                // 地面の上で左右キーが押された。歩行モードに移行
                step = Status.Walk;
                vec.y = 0;
            }
            else if (isCeiling && rlKeyEnable) {
                // 天井の下で左右キーが押された。ぶら下がりモードに移行
                step = Status.Hanging;
                vec.y = 0;
            }
            else if (Input.GetButtonDown("Jump")) {
                // Jumpボタンが押された。ジャンプする
                float dx = ((SideAdjustRLold & 0x02) != 0) ? -1 : 1;
                step = Status.Walk;
                sideAdjustRL = 0;
                jumpCount = 1;

                // 下キーも押されていたら、もしくは通行止めの壁なら落ちる。
                // そうでなければ、ジャンプする
                vec = new Vector3(dx * Speed, (yd < 0 || isWallTop) ? 0 : JumpSpeed, 0);

                nowFramePos.x += dx * Speed * Time.deltaTime;
            }
        }
        else {
            // 壁が無くなった
            float d = ((SideAdjustRLold & 0x01) != 0) ? -1 : 1;
            bool ret = AdjustCeiling(nowFramePos + new Vector3(d * 2.0f, -AdjustY, 0), AdjustY * 2.0f);
            if (ret && !isWallTop) {
                // 天井はあるので、ぶら下がりモードへ移行
                SetNextStep(Status.Hanging);
            }
            else {
                // 軽くジャンプ。足場に飛び乗る
                step = Status.Walk;
                Vector3 dir = ((SideAdjustRLold & 0x02) != 0) ? Vector3.right : Vector3.left;
                vec = new Vector3(dir.x * ShortJumpXspeed, ShortJumpYspeed, 0);
                jumpCount = 1;
            }
        }
    }

    // 天井ぶら下がり中の処理
    void Hanging(float xd, float yd) {
        vec = Vector3.right * xd * SpeedClamber;
        nowFramePos += vec * Time.deltaTime;

        isGrounded = false;

        isCeiling = AdjustCeiling(nowFramePos, 3.0f);
        if (isCeiling) nowFramePos = adjustPos;
        if (isWallTop) isCeiling = false;

        if (vec.x != 0) AdjustSideUseCenter((vec.x > 0) ? 0x02 : 0x01);

        if (isCeiling) {
            // 天井がまだある
            if (yd < 0) {
                // 下キーが押された
                if (Input.GetButtonDown("Jump")) {
                    // Jumpボタンも押された。飛び降りる
                    step = Status.Walk;
                    vec.y = 0;
                    oldPos = nowFramePos;
                    jumpDown = true;
                    jumpCount = 1;
                }
                else if (sideAdjustRL != 0) {
                    // 壁が横にある。壁つかまりモードに移行
                    step = Status.Clamber;
                    vec = Vector3.zero;
                    jumpCount = 0;
                    SideAdjustRLold = sideAdjustRL;
                }
            }
        }
        else {
            // 天井が無くなった
            int ret = AdjustSide(nowFramePos + (Vector3.up * 2.0f), 1.0f, 0x03);
            if (ret != 0 && !isWallSide) {
                // 壁はあるので、壁つかまりモードに移行
                SideAdjustRLold = ret;
                SetNextStep(Status.Clamber);
            }
            else {
                // 壁すらないので落ちる
                step = Status.Walk;
                vec.y = 0;
                oldPos = nowFramePos;
                jumpDown = true;
                jumpCount = 1;
            }
        }
    }

    // 壁つかまり←→天井ぶら下がりの移行モードを設定
    void SetNextStep(Status nextStepValue) {
        step = Status.StepChangeing;
        nextStep = nextStepValue;
        moveTimer = 0.3f;
        targetPos = adjustPos;
        vec = (adjustPos - nowFramePos) / moveTimer;
        jumpCount = 0;
    }

    // 動作状態表示
    void OnGUI() {
        string s = "";
        switch (step) {
            case Status.Walk:
                s += " 歩行   ";
                break;
            case Status.Clamber:
                s += " 壁登り  ";
                break;
            case Status.Hanging:
                s += " ぶら下がり";
                break;
            default:
                s += " 移行中  ";
                break;
        }
        s += ((isGrounded) ? "↓" : " ");
        s += ((isCeiling) ? "↑" : " ");
        s += ((sideAdjustRL & 0x01) != 0) ? "←" : " ";
        s += ((sideAdjustRL & 0x02) != 0) ? "→" : " ";
        GUI.Box(new Rect(10, 10, 400, 22), s);

        if (hitEnemy) {
            GUI.Box(new Rect(10, 30, 200, 22), "Hit Enemy");
        }
    }

    // 光線を飛ばして、交差した「ポリゴン」群との交点情報を配列で返す。
    // オブジェクト内に交差する面が複数あっても、その全てを返す。
    RaycastHit[] GetRayCastHits(Vector3 pos, Vector3 vec, float dist) {
        Vector3 ofs = vec.normalized;
        ArrayList a = new ArrayList();
        RaycastHit hit;
        while (Physics.Raycast(pos, vec, out hit, dist, groundLayer)) {
            a.Add(hit);
            pos = hit.point + ofs;
        }
        if (DUMP_SORT_HITS) {
            string s = "";
            foreach (RaycastHit h in a) s += h.point.y + " , ";
            Debug.Log(s);
        }
        return (RaycastHit[])a.ToArray(typeof(RaycastHit));
    }

    // 地面とアタリ判定して補正
    bool AdjustGround(float distMul) {
        Vector3 pos = nowFramePos;
        pos.y = transform.position.y + 0.01f;
        float dist = (AdjustY * distMul) + Mathf.Abs(vec.y * Time.deltaTime) + 0.02f;
        RaycastHit hit;
        if (Physics.Raycast(pos, Vector3.down, out hit, dist, groundLayer)) {
            if (vec.y <= 0) {
                // 上向きに飛んでない状態なら足元の補正をする
                nowFramePos.y = (hit.point.y + AdjustY - RealAdjustDiff);
                vec.y = 0;
            }
            return true;
        }
        return false;
    }

    // 天井とアタリ判定して補正
    bool AdjustCeiling(Vector3 pos, float distMul) {
        bool adjusted = false;
        isWallTop = false;
        float dist = (AdjustY * distMul) + Mathf.Abs(vec.y * Time.deltaTime) + 0.01f;
        RaycastHit hit;
        if (Physics.Raycast(pos, Vector3.up, out hit, dist, groundLayer)) {
            adjusted = true;
            pos.y = (hit.point.y - AdjustY + RealAdjustDiff);
            vec.y = 0;
            if (hit.transform.gameObject.tag == WallTag) isWallTop = true;
        }
        adjustPos = pos;
        return adjusted;
    }

    // 横方向で地形モデルとアタリ判定して補正
    // 返り値 : bit 0 on = 左側で補正、bit 1 on = 右側で補正
    // adjustPos に補正後の座標を格納して戻る。
    // 通行止めの壁にぶつかった際は isWall を true にする。
    int AdjustSide(Vector3 pos, float distMul, int CheckRL) {
        int adjusted = 0;
        isWallSide = false;
        float av = AdjustX * distMul;
        RaycastHit hit;
        if ((CheckRL & 0x02) != 0 && Physics.Raycast(pos, Vector3.right, out hit, av, groundLayer)) {
            pos.x = (hit.point.x - AdjustX + RealAdjustDiff);
            if (vec.x > 0) vec.x = 0;
            adjusted |= 0x02;
            if (hit.transform.gameObject.tag == WallTag) isWallSide = true;
        }
        if ((CheckRL & 0x01) != 0 && Physics.Raycast(pos, Vector3.left, out hit, av, groundLayer)) {
            pos.x = (hit.point.x + AdjustX - RealAdjustDiff);
            if (vec.x < 0) vec.x = 0;
            adjusted |= 0x01;
            if (hit.transform.gameObject.tag == WallTag) isWallSide = true;
        }
        adjustPos = pos;
        return adjusted;
    }

    // 体の中心y座標で横方向に補正
    void AdjustSideUseCenter(int chkFg) {
        sideAdjustRL = AdjustSide(nowFramePos, 1.0f, chkFg);
        if (sideAdjustRL != 0) nowFramePos = adjustPos; // 壁があったら実際に補正
        if (isWallSide) sideAdjustRL = 0;   // 通行止めの壁なら、壁は無かったことにする
    }

    // 敵その他との衝突判定
    void OnTriggerEnter(Collider other) {
        if (other.gameObject.tag == "Enemy") hitEnemy = true;
    }

    void OnTriggerExit(Collider other) {
        if (other.gameObject.tag == "Enemy") hitEnemy = false;
    }

}
Public Domainってことで。どうせこのままではまだまだゲームにならないから改造・改良が必須だし…。

このソースをくっつけたオブジェクトの、Inspector上の設定は…。
  • ○○○ Collider の Is Trigger は有効。
  • Rigidbody の Use Gravity は無効。Is Kinematic は有効。

地形モデルは…。
  • 地形アタリ判定用レイヤーに「Ground」というレイヤー名を設定。今回は9番レイヤーにした。
  • プレイヤーキャラと地形アタリを取るオブジェクトは、地形アタリ用モデルと、通行止め用モデルの2つだけにした。その2つに、Groundレイヤーを指定。
  • 地形アタリ用モデルには「Ground」というタグ名を、通行止め用モデルには「Wall」というタグ名を指定。
  • プレイヤーキャラは、z=0 で、xy平面上を移動。

以下が、地形アタリ用モデル。タグ名 = Ground。
地形アタリ用モデル

以下が、通行止め用モデル。タグ名 = Wall。
通行止め用壁モデル

2012/10/18(木) [n年前の日記]

#1 [tv] 学者達が「無理だ」って言ってんだからこれはたぶん無理

録画したままちゃんと見てなかった、クローズアップ現代「10万年の安全は守れるか〜行き場なき高レベル放射性廃棄物〜」の回をようやく消化。

内容は…。地質学者さん達が、「日本の地層は不安定で、解明されてない点がまだまだ多くて、先が予測できない」「使用済み核燃料の地層処分による『最終』処分は無理。後になって何が起こるか分からない」「暫定保管ならまだなんとか」と警告してます、てな話だったのだけど。

例えばの話。学者さんが「理論的には可能」と言っても、現実には問題があり過ぎて実現不可能、なんて話はたまにあるわけだけど。 *1 ましてや、学者さんが「科学的に無理」と言ったら、これはもう現実に出来ちゃうことなんてまずほとんどあり得ないわけで。それを踏まえれば、「今の科学では、日本で地層処分による最終処分は無理」と考えたほうが妥当だよなあ、と。学者さんが「理論的には可能」と言ってるならまだしも、何人もの学者さんが議論した上で「ヤバいよソレ」と警告してるんだから…。

かつて、湯川秀樹は、原発の早急な実用化に異を唱えてた。基礎研究からじっくりやってかないとダメだ、でないととんでもないことになる、と言ってたけれど、正力松太郎のような文系で無知な人間が強大な決定権持ってしまって、そういう意見をガン無視して、結果こういう事態になった。

そして今も、学者さん達が、「考え直せ」「ソレはヤバイって」と言っている。…“日本の地層を調べ上げる”ことに“人生を捧げてきた”男達が「無理だ」「やめとけ」と言ってるのだから、重く受け止めるべき。

なのにどうして、「総合的に見て日本でも地層処分はできると思う」なんて呑気に言える人が出てくるのか…。自分のほうが学者達より正しいことを知っている、真実を知っている、俺は学者より偉い、学者より博識だ、とでも思っているのだろうか。それとも、問題が出てくる頃には自分は死んでるから関係ねえや、俺が逃げ切れればそれでいい、とでも思っているのだろうか。

何にせよ。学者さん達が「今の科学じゃ無理だ」って言ってるんだから「そうか。無理なんだ」と認識しないと。いいかげんにしろよ、このプチ正力松太郎共。今度こそ学者の意見をちゃんと聞きやがれ。

てなことを思いましたよ、とメモ。
*1: 例えば、もんじゅとか。理論的には可能なんでしょうよ。あくまで理論的には。

#2 [zatta][anime] 偽記憶が怖い

氷菓の最終回で、遠近法を利用して主人公の心情表現をしているカットがあったような気がしていたのだけど。HDDレコーダから消す前に見直したら、そんなカットはまったく存在しておらず、自分の中で偽記憶が作られていたことに気付いたわけで。どうしてそんな脳内カットが作られてしまったのだろう…。

他の作品についても、かなり偽記憶が入ってしまっているのだろうなあ。自分の脳が怖い。この脳は本当にあてにならない。

#3 [anime] ガンダムAGE最終回を視聴

録画したままだったソレを、ようやく視聴。

当初、基本設定を知った時は、かなり期待してしまったり。3世代を描くとか、100年戦争とか、そういった時間軸が長めの設定は個人的に大好きなので。これは手塚治虫作品のように、壮大な時間の流れを感じさせる稀有なガンダム作品になるのではとワクワクしちゃったわけで。また、ガンダムの手足を交換して云々という設定もどこかで見かけて、それは子供がよくやる遊びだから大当たりしそう、と素人予想をしちゃったり。

しかし、本編を目にしたら…。こういうのは世代が変わったあたりからエンジンかかってくるものだろう、と思って見続けたけど、そうでもなくて…。うーん。

なんとなくだけど、イベントの発生と消化を延々繰り返していただけの印象が。キャラも、NPCの類にしか見えなかったというか。台詞を発しているこのシーン分しか仕様(?)は決まってないんだろうな、てな感じがしちゃって。喜怒哀楽も記号でしかなく、全キャラがただの駒に見えて、何かしら感情移入できそうなところも見つけられず。

TVゲームの良いところをアニメにも取り込もうとしたら逆に悪いところを取り込んでしまった、そんな感じも。TVゲームの場合はプレイヤーが何かしら操作をすることで、つまりは能動的な姿勢で話が進んでいくし、また、映像としての表現力が貧しい部分がある故に、逆にプレイヤーがかなり想像して補完するので、こういうのでもなんとか持つのかもしれないけど。アニメはただ見ているだけだし、映像の表現力がそれなりにある故に、視聴者側の想像力を引き出すための呼び水を事前にキッチリ盛り込まないと、他作品と比べてスカスカに見えてくるので、なんだか色々ツラかった。JRPGを誰かがプレイしている様子を後ろから眺め続けた、そんな感じ。

でも、おそらく、低年齢向けに作ろうという方針があったと思うので、その方針に従えばこういう作りもアリなのだろうか。ある程度は一話完結型で進めたほうが、とか、大量に難解な情報を提示してはいけない、とか、デジタル的な感情表現のほうが分かりやすい、とか、そういうことも最初の頃は意識して、わざとやってたんじゃないのかと想像したりもするわけで。関連グッズの売り上げはどうだったのか知らないのだけど、そのあたりが上手く行ったなら作りとしては成功と言えるし。…実際売れたんだろうか。どうなんだろう。

まあ、何だか色々ともったいない、そんな作品だったような。基本設定や玩具の試みは好みなんだけどなあ…。期待し過ぎてたのかなあ…。こんなはずでは、と思うのだけど、ならばどういう作りなら良かったのかと考えると、それも自分の中で見えてこなくてモヤモヤしたり。自分はどんなガンダムAGEを見たかったんだろうか。いやまあ、このガンダムに限って言えば、とにかく子供にウケればそれが正解だろうけど。

アニメの脚本とゲームの脚本は、何かが違う気もしてきたり。その何かが自分は分からなくて、やっぱりモヤモヤしたりもして。

2011/10/18(火) [n年前の日記]

#1 [windows] メインPCが起動しない状態になった

Windows7 Pro 64bit版を入れているメインPCが起動しない状態になった。いや、正確に言うと、起動するまでにとんでもなく時間がかかり、起動した後も動作が異様に重い感じで。どうもHDDにアクセスする際にとんでもなく遅くなっている雰囲気。CPU負荷率は全然高くない。10%にも達してない。…HDDが壊れ始めているんだろうか。

昨晩、HDDのデフラグをかけてしまったのがマズかったのかもしれず。それでなくてもメインPCのHDDは、日立製の7200rpmのHDDだから発熱や消費電力は高い方だし。それをリムーバブルラックに突っ込んで使っているのだから、アクセスを続けていると寿命が短くなってもおかしくはない、ような気もするし。

とりあえず外付けHDDに、メインPC内にしか入っていないデータをひたすらコピー。FireFileCopyでベリファイさせつつ作業したけど、途中で結構止まる。怪しい。ちゃんとコピーできているのかどうか。すんなりアクセスできる部分と、なかなか反応が帰ってこない部分がある感じ。

USBメモリに入れてある Ultimate Boot CD から起動して、Hitachi HDD 用のチェックツールを起動してみたり。SMART?は問題無しに見える。簡易テストも通った。特に問題無しと出てくる。

Windows7 のDVD-ROMから起動して、コマンドプロンプトを出して chkdsk /f D: を実行。本当はコレをやったらいけないのかもしれん。HDDが本当に壊れかけているなら、致命的な状態にしてしまう可能性が高い。が、そうでないならすんなり治るかもしれんし。結果は変わらなかった。

HDDに入っているWindows7で起動後、SystemExplorer を起動して、プロセスを見てみた。おかしい。普段は explorer の下に並んでいるはずの各プロセスが、vmauthd なるものの下に並んでいる。vmauthd って何だ? …どうも名前からして、VMware Player か VirtualBox 関係のような気がする。

どのみち、HDD交換だかOS再インストールだかになるなら、中身が少ないほうがいいだろう。色んなソフトをアンインストール。もちろん VMware Player や VirtualBox も。

2010/10/18(月) [n年前の日記]

#1 [sound] 爆発音系のSEを作成するのは大変

ヘッドフォンを使いながら、ジェット飛行機が加速していくようなSEを作ってるのだけど。最初に「ドン」という音が鳴るものだから、耳がおかしくなってくる。次第に頭痛もしてくるしで。この作業で、かなり耳を傷めてしまった予感。

SEを作ってる人は、本当に大変だと思う。音は時間とともに流れていってしまうものだから、絵のようにじーっと眺めてどこがおかしいかチェックするわけにはいかない。何度も何度も何度も何度も、繰り返し聞いて、ここが違うんじゃないか、みたいなところを探していかないといけない。絵描きやプログラマーとは全く異なる大変さがある。と思う。

2009/10/18() [n年前の日記]

#1 [nitijyou] 夢の中ですらKYな自分

KY発言をしつこく口にして周りをドン引きさせてしまう、てな夢を見て、あまりのやっちまった感で思わず目が覚めてしまいました。トホホ。

全てを空気が支配している状況というのは極めて危険とは常々思うものの、日本という国で日本人として生まれてしまったからには、空気の支配力に迎合していかないと社会・コミュニティから排除されるわけで、保身を考えるとそういう場面ではとにかく黙り込んでたほうがまだマシだよなあ、と寝起きのボーッとした頭で後悔することしきり。いやまあ、もう社会から排除済みの人間になってますから今更ですけどね…>自分。

2008/10/18() [n年前の日記]

#1 [iappli] 提出用バイナリ作成スクリプトを再作成

ほとんど全部書き直し状態に。前よりは行数が短くなったし、ディレクトリ名等の追加も楽になった。

ADF中のAppParamがどうしても255文字を超えてしまう。仕方ないので、各URIの後ろに付け足すパラメータはプログラム中で付加することにした。…サーバ側の仕様変更があったときにプログラム側の修正が必須になってしまうけど、仕方ないよな…。開発番号の桁数が増えたので、以前はギリギリで255文字に収まってたけど、今ではもう無理。

2007/10/18(木) [n年前の日記]

#1 [game] _全てのファミコン世代へ ■80年代後半〜90年代前半を回顧するブログ

凄い物量。 _(via 読書記録ChangeLog)

#2 [web] _俺が政府転覆を企む過激派だったらインターネットなんて信用しないね

パソ通は高度なクローズド環境が構築できるので、グーグルの検索ロボットも物理的にこれをサーチすることができない。それに暗号化技術を組み合わせれば、かなり難攻不落なセキュリティ通信が実現できるのではないか、俺が政府転覆を企む過激派だったらインターネットなんて信用しないね、と話していたのですが、そこで二人とも静かになってしまって、どちらからともなく「もう、やってるかもな」とポツリとつぶやいた次第です。

たけくまメモ : Gメールは確かに便利だった より

なんだか漫画のネタに(以下略。

#3 [web] _【圧力?】「初音ミク」でイメージ検索かけてもヒットせず。さらにwikipediaからも削除【TBS?】 - カジ速

ホントだ。出てこない…。

_初音ミク - Google イメージ検索 :

_“消えた初音ミク”問題 ヤフーとGoogle「原因を調査中」 - ITmedia News
_タレントの初音ミクさんが失踪─「キモオタに疲れた」とこぼす : bogusnews
_「初音ミク」の画像が検索できない〜発売元は「削除は依頼していない」
この問題について、グーグルでは「表示におかしい点があることは確認しており、現在調査を進めている。なんらかのバクなどの問題ではないかと考えており、正しい表示がされるよう対策中」とコメント。また、ヤフーでも同様に、なんらかの問題でこうした現象が起きていることについては確認しているが、いつからこのような結果が出るようになったのかは不明で、原因についても調査中だとしている。

「初音ミク」の画像が検索できない〜発売元は「削除は依頼していない」 より

初音ミクがキッカケでバグ発見ができたら、それはそれでなんだか面白い展開だなぁ。と呑気(?)なことを思ったり。

_「初音ミク」の画像検索結果消滅について各検索エンジンに電話してみた - GIGAZINE :

_話題の「初音ミク」の画像が検索結果から消滅中 - GIGAZINE
まとめると、とにもかくにも今回の件はどこかの企業や利権団体とかが圧力をかけて「初音ミク」をたたきつぶそうと画策して動いたわけではなく、どちらかというと「画像検索エンジンの技術力」の差が出てきただけ、ということです。今まではあらゆる検索について「Googleが一番」だと思っていましたが、どうやら認識を改める必要があるようです。

「初音ミク」の画像検索結果消滅について各検索エンジンに電話してみた - GIGAZINE より

なるほど。

ということで Live Search を Firefox の検索エンジンに登録。Googleと違う結果が出てきてなんだか面白いし。

#4 [jiji] _切込隊長BLOG(ブログ): 日本社会はフルボッコ先を求めている

一番大事だった安倍首相の政権放り投げ→テロ特措法延長問題とか完全に国民の目から逸らされて、国民生活の改善には何ら寄与しない亀田一家叩きとかに国民総出で熱中するというのもなんか凄いな。

切込隊長BLOG(ブログ): 日本社会はフルボッコ先を求めている より

たしかに…。

#5 [pc][digital] RD-H1+ネトモニでTVを見てたのだけど

使いづらいな…。デスクトップ内の、360x240前後の領域を絶えず占有してしまって、他のアプリウインドウが狭くなってしまうし。RD-H1の録画が始まるとLAN経由で動画データが流れなくなるし。かといって、一々視線をTVの置いてある場所=1m左にまで移すのも面倒。何かイイ手はないものか。

ワイドディスプレイやデュアルディスプレイなら、こういうときに便利なのだろうか…。自分の環境は、非ワイドのCRT x 1、だしなぁ…。

小さい液晶をCRTの横に置くのはどうだらう。…ビデオ入力端子付きの小さい液晶なんてあるのかな。いや、将来的にも使えるのかどうかが怪しいか。

2006/10/18(水) [n年前の日記]

#1 [iappli] 画像差し替え版を相手先に送った

サウンドデータは来てないけれど、進捗状況を知らせる必要があるということらしいので、現時点のバイナリを送ってみたり。

#2 [anime] ライダーカブト、HDDに溜まってた分を消化

ようやく追いついた。

赤い靴の回。 :

なかなか怖い話になってきた。それにしても、赤い靴に喩えるあたりが上手いなと。

黒いライダー二人組がイイ感じ。「相棒」「兄貴」という呼び方がグー。

学校に潜入操作の回。 :

カガミの人の演技がイイ感じ。感情を表に出すほうが、見てる分にも面白く見えるなと。

黒板消しを蹴り上げるカットに感心。どうやったんだ、コレ。CGだろうか。実際にやったのだろうか。3回ぐらい巻き戻してみたけど、判断つかず。CGだとしたら素晴らしい。いや、実際にやったとしても素晴らしい。

執事の人が連行されるシーンがグー。繰り返しがナイス。

2005/10/18(火) [n年前の日記]

#1 [nitijyou] ウチの日記のRSSでエラーが出るな…

_2005/10/14の記事 でエラーが出てるみたいではあるのだけど。うーむ。

該当記事のタイトルを修正したものの、RSSには反映されず。今日の日記を転送したら、RSSにも反映された。rss.cgi って何をキッカケに動くのだろう。うーむ。

この記事へのツッコミ

Re: ウチの日記のRSSでエラーが出るな… by otsune    2005/10/18 22:11
>今日の日記を転送したら、RSSにも反映された。rss.cgi って何をキッカケに動くのだろう。うーむ。
cache/rss.txtの日付でキャッシュされていたのかも?

rss.cgiが動くきっかけは、diary/rss.cgiへアクセスされたらです。(index.cgiと一緒)
rss.cgiで$rss->Update();を呼んでいればhnfファイルの日付を比較してrss.txtのキャッシュを更新するはず。
Re: ウチの日記のRSSでエラーが出るな… by mieki256    2005/10/19 19:30
> cache/rss.txtの日付でキャッシュされていたのかも?

情報ありがとうございます。
なるほど、cache/rss.txt ってのがあったのか…
これを消せば更新された、のかな。

> rss.cgiで$rss->Update();を呼んでいればhnfファイルの日付を比較してrss.txtのキャッシュを更新するはず

なるほど、呼んでますね。これが肝、ですか。
RSS.pm 中の該当部分を、眺めてみるであります。

#2 [linux] _UNIX 今日の技

_UNIX 今日の技/実演vi

わかり易い…。これは読んでおかないと。 _(via del.icio.us/otsune)

#3 [web] _BLOG STATION:【書評】 『モヒカン族はなかった』

_活字うろうろ - たらばがに食べた : モヒカン族とはなんだったのか
_断片部 - memo::laiso モヒカン族とはなんだったのか・表紙

こんな本まで出てたのか。興味深い。 *1 _(via del.icio.us/otsune)
*1: と書くとそれっぽい一言コメントになりそうであらうか。にしてもこういうものを出せる人のセンスには惚れてしまいそう。

#4 [jiji] _サーバ管理者日誌 - ハリケーン「カトリーナ」は天誅

_米国民の一部に「カトリーナ」を「神の御業」とする見方
ニューオーリンズのオリバー・トーマス市議会長は、記者団に対し、「もしかすると、神はわれわれを浄化しようとしておられるのかもしれない」と述べている。

ロイター より

なんだか富野アニメみたいだ。

#5 [game] _斑鳩からバーンアウトが生まれたという衝撃の事実

_バーンアウト リベンジ|開発者コメント

海外のゲーム制作者にも変な形(?)で多大な影響を与えてしまったトレジャースピリッツ。であらうか。ゲーム業界はインスパイアなくして成立しないのである。とか。さておき墨字アートがハングル文字にしか見えない…。

#6 [zatta] _00ナンバーサイボーグという呼称はブラックゴースト団に押しつけられたものである。そのブラックゴースト団と戦うのだから、まず最初にやるべきことは敵につけられた名前の拒否である。

そういえばそうだ。

アメリカ人と日本人はそのへんの感覚が違うのか。…違いを意識することで日本人にとって魅力的な商品を作ることができるかもしれないなと夢想したり。

この記事へのツッコミ

実は、日本に来襲する台風にも名前が付いている。 by がんした    2005/10/19 00:54
あまり浸透してないが、北西太平洋領域で発生した台風にも名前が付いている。

ちなみに、今、来てる台風20号は、
http://www.jma.go.jp/jp/typh/

『キロギー』( No.3 北朝鮮命名 Kirogi:キロギー:雁)という。
http://www.kishou.go.jp/know/typhoon/1-5.html
Re: 実は、日本に来襲する台風にも名前が付いている。 by mieki256    2005/10/19 19:32
> 北西太平洋領域で発生した台風にも名前が付いている。

知らなかった…。

紹介ページの中に、2000年からそのようにした、とありますな。
やはり番号よりは名前のほうが都合のいい場面があるのかな。
Re: 実は、日本に来襲する台風にも名前が付いている。 by けいと    2005/10/19 23:38
> 番号よりは名前のほうが都合のいい場面

私は必要性を感じていませんが、
大きな被害をもたらした台風の名前を忘れないっていう
効果はあるのかも。

伊勢湾台風とか洞爺丸台風とかキャサリン台風とか、
今でも語り草になりますけど、
台風0520号は…とはなかなか語りにくいといいますか
思い出しにくいといいますか。
Re: 実は、日本に来襲する台風にも名前が付いている。 by がんした    2005/10/20 20:37
オイラも番号制の方がイイなぁ。
台風が発生した時系列順になってる方が、色々と分かりやすくて良い。
例えば、『台風10号より先に台風11号が、日本列島に来襲した時』とか。
台風シーズンに、『**月の段階で##号が発生、今年は台風が多い(or少ない)ね』とか。

つーか、名づけるのはイイのだけど、その名づけ方が気に入らない。名前って個性だろ?
それを発生した順にリスト一覧から順につけるなんて、何て事務的な。
どうせ名づけるなら、言語学者とかコピーライターとか、その道の
知識人が会議をして、台風の発生日時や場所、状況、規模を考慮して
誰もが納得出来る妥当な名づけ方して欲しい。
Re: 実は、日本に来襲する台風にも名前が付いている。 by けいと    2005/10/21 01:05
> 言語学者とかコピーライターとか、その道の
> 知識人が会議をして、台風の発生日時や場所、状況、規模を考慮して

昔のアメリカ人はハリケーンに女性の名前を付けていたわけですが…

おそらく世の男性はある程度納得するはず。
台風=女性っていう図式が。感覚的に。
状況や規模どころか性格まで言い表せちゃうし:-P

ですが、
とある団体(女性団体だったか人権団体だったか)が
差別だって言うことになって
今は男女混合の名前になっているはずです。
しかも、向こうはABC順ですから、
名前でもある程度順番が分かるんですよね。
人名の頭文字になりにくいアルファベットは飛ばすらしいですが。

今年は台風大発生で
衆院選の自民党比例区名簿よろしく、
リスト不足になるとかいわれています。
今まさにアメリカに上陸せんとしている「史上最大規模」のハリケーンは
「ウィルマ」らしいので、きっと頭文字はW。
おおむね23号ぐらいかな?
Re: 実は、日本に来襲する台風にも名前が付いている。 by mieki256    2005/10/21 09:17
> どうせ名づけるなら〜台風の発生日時や場所、状況、規模を考慮して

あ。それいいなぁ。名前と台風の特性が一致したほうが実用性(?)がありそう。
なんでそうしなかったんだろう…。もったいない(?)。
Re: 実は、日本に来襲する台風にも名前が付いている。 by mieki256    2005/10/21 09:28
> おそらく世の男性はある程度納得するはず。
> 台風=女性っていう図式が。感覚的に。

…(無言で頷いてしまいそう)

> 今は男女混合の名前になっているはず

知らなかった…。そんなところまで差別云々の問題が。なるほどなぁ。

#7 [eclipse][java] DoJa3.0をインストールしたのだけどエラーが

eclipse 2.1.3 で、実行 → 実行、を選ぶとエラーが。

_DOJA3.5にて、jar作成時にエラー - EclipseWiki :

環境変数のPATHにj2se sdkのbinディレクトリのパスを追加する

談/123 - EclipseWiki より

とある。これか。

しかし、1.3.1、1.4.2、1.5.0 のどれに通せばいいのやら。

とりあえず、1.5.0のbinを、環境変数PATHに追加してみた。…動いた。これでいいのかな。

JDK_HOMEを指定しろとあるなぁ :

eclipse を介さず、xyzzy で打ったソースを iαppli Development Kit for DoJa 3.0 でビルドしようとしたのだけど、1.5のソースがどうとか言われてビルドできない。マニュアルPDFを読んだら、JDK_HOME にJ2SEのインストールフォルダを指定しろ、とあったので、1.3.1 のインストールフォルダを指定。…ビルドされるようになった。

_J2SE 5.0を使うと「ターゲットリリース 1.1 がデフォルトのソースリリース 1.5 と競合しています。」というメッセージが表示されて、ビルドに失敗してしまう。 :

これだわ。
J2SE 5.0を使う場合には「ターゲットリリース 1.1 がデフォルトのソースリリース 1.5 と競合しています。」というメッセージが表示されて、ビルドに失敗してしまいます。その場合には、下画面のようにメニュー「設定 > sun.tools.javac.Mainを使用する」のチェックをオンにしてからビルドすればよいです。

ITmedia エンタープライズ:特集:Eclipseで始めるiアプリ――低レベルAPI編 (10/10) より

あー。それでも良かったのか。チェックしたら「オススメしない」と言われてしまって「こりゃマズイのかな」と思ってた。

Java 1.3.1_16 が出てる :

先日インストールしたときは、1.3.1_15 だったのだけど。よくわからんけど、アンインストールして、1.3.1_16 をインストールした。

Mozilla Firefox の plugins フォルダの中に、また色々なDLLが入ってしまった。該当DLLを別フォルダに移動したり、1.5.0 等をアンインストールしたうえで、 _Java ソフトウェアの無料ダウンロード のページから、xpi を使ってインストール。1.5.0 の SDK もアンインストール・再インストール。

Mozilla Firefox のソレが、1.5.0_5 になってるな。先日は 1.5.0_4 だったと思ったけど。

#8 [java][xyzzy] _xyzzyでプログラミング/JavaTinyConsole - Xyzzy Wiki

netinstaller でインストール。jtc.lの先頭部分を見ながら、load-file したり、~/.xyzzy に書いたり。

なるほど、TABで補完がされる。いい感じ。

#9 [java] _i-appli 開発情報

有用なリンク集。

_iアプリの作り方 :

とりあえずドキュメント等をDL :

CLDC API Documentation, V1.0, also (ZIP) or Japanese (ZIP, 1.4MB) なるものを、 _J2ME Documentation のページからDL。

#10 [jiji] 靖国神社参拝問題

政治家連中は変な宗教でもやってるんか。

50年前に命を落とした人達は、自分たちのせいで日本が延々とトラブルを抱え込むことになるなんて夢にも思ってなかっただろうな。死者へ礼をつくしてるつもりが、むしろ冒涜になってるというこの矛盾。

それともアレかな。わざとやってるんかな。この件について国民の間で炎上させて、分祀を進めたいとか。…だとしたら、参拝に賛成してる人達は、実は小泉さん言うところの『反対勢力』だった、ということに。

まあ、参拝賛成が多数であれば、国民に対する効果的なポージングにはなるわけだから、政治家連中にとってはどっちに転んでも痛くないのか。痛いのは、中韓からグダグダ言われたくないと思ってる勢力であって。…米国との癒着をさらに進めたい与党としては、中韓と険悪なムードを作ることで、米国寄りであるというポージングにもなると踏んでるのだろうか。しかし、6ヶ国協議とやらが絡んでるこの時期にこんなことをしていたら、米国からも「足並み揃えて圧力加えたいこの時期に、コイツラ何考えとるんじゃ。アホか」と思われそうだが。

何にせよ、外交ってもんをさほど考えてないが故の愚行にしか見えない。この国は50年前から、外交テクニックは進歩してるんだろうか。そうは思えん。…やっぱり無駄死にだったわ。>靖国神社に祀られてる人達。

2004/10/18(月) [n年前の日記]

#1 [game] _ぎゃるぱにX

Windows用同人ゲーム。いわゆる、QIXでギャル絵が出るタイプ。というかギャルズパニック。 _(via 島国大和のド畜生)

自分のPCはかなり非力なのだけど :

*1 それでも、大量にスプライトが表示されて感動しますた。凄いなぁ。本来ならこれぐらいは表示できるのか… >G400。見直した。

見た目は凄いんだけど、ゲームは…。 とりあえず、遊びにはなってない。と思う。 敵の動きがランダム *2 、かつ、攻撃が鬼のよう。 *3 自機を失う際に、理不尽さを感じずには居られない。…もっとも、参考にしたというゲーム自体がそもそもアレだから、仕方ないかも。 *4

2004/10/20追記 :

リプレイデータがついてることに今頃気がつきました。上述の感想を訂正します。なるほど、こうやって遊ぶのね…。

*1: Celeron 1.0GHz、G400DH 16MB。
*2: 「気まぐれ」に動いてる感が強すぎる。プレイヤーが、敵の動きを予測できないのはちょっと…。
*3: 誘導レーザーが酷すぎる…。
*4: アレはゲームになってないからなぁ。シューティングの攻撃は、シューティングの自機仕様じゃないと避けられない。自機仕様に制約を追加したら、攻撃方法は変えないと。不用意にシューティングの攻撃をそのまま盛り込んじゃいかんよなぁ。

#2 [anime] BLACK JACK、2話

シリーズ構成はあるのだろうか。どういう順番なんだ。

#3 [windows] SP2を入れたらxyzzyのftp転送が妙に時間がかかるようになった

反応が返ってくるのが遅い。なんでだろ。ひょっとして、反応が遅いんじゃなくて、タイムアウトしてるだけかしらん。

2003/10/18() [n年前の日記]

#1 [pc][linux][debian] grub のスプラッシュ画像を作成

grub の起動時にスプラッシュ画像(背景画像)を表示してるのだけど、どうも今一つ。 _ココ を参考に、FREEHANDやPhotoshopを使って、自分で画像を作ってみたり。

要するに、640x480,14色の画像を作ればいいと。以下のgif画像を作ってみた。

その1

その2

その3

これらの画像を、以下の作業で grub から呼び出せるデータに。
convert -colors 14 xxxxx.gif xxxxx.xpm
gzip xxxxx.xpm
su
cp xxxxx.xpm.gz /boot/grub
後は、/boot/grub/menu.lst 内に splashimage=(hd0,0)/grub/xxxxx.xpm.gz の一文があるように修正。 *1

実際に表示してみたら、前よりダサくなってしまった。ガックリ。そのうち作り直そう (;´Д`)

grub起動時の画面をキャプチャできないものだろうか。それができれば、テキスト表示がどこに配置されるか把握できるから、もう少しキッチリ作れそうだけど。その手のコマンドとか入ってないかな…。
*1: (hd0,0) の部分は、/boot が割り当てられてるパーティションを指定するらしい。

2002/10/18(金) [n年前の日記]

#1 BCB、Jbuilder

Satoriのパレット表示が切れる問題をなんとか出来ないかと調べてました。
このまま諦めるには惜しい描画能力だったんで。 _

#2 [digital] BCB、Jbuilder

Satoriのパレット表示が切れる問題をなんとか出来ないかと調べてました。
このまま諦めるには惜しい描画能力だったんで。

_Resource Hacker だけではどうにもならないんで、他のツールを探してたんですが。
MSの各種開発ツールにはspy++なるウインドウ情報取得ツールが同梱されてると知ったので、
それと同種のツールがあればなんとかなるかも?と思ったのです。

で、結局、以下のツールを見つけて使ってみました。

_ClassFinderXP
_YPT HandleX
_Nuke++ <いきなりブルースクリーンで起動せず…
_ProcessProbe , ウィンドウエクスプローラ

最終的には、ウインドウエクスプローラでパレットサイズを変更したら、いい具合に表示されました。
ただこれだと、Satoriを起動するたびに毎回作業せねばならず。
Satoriを終了させるまで変更は反映されたままなのがせめてもの救いなんですが。

どうせなら元々のSatori本体ファイルを書き換えたいところですが、その方法まではわからず。
この手の知識のある人なら、
「Satori起動後に実行すればパレットサイズの調整『だけ』してくれるツール」
を作れるかもしれませんけど。私は知識無いんでダメです(爆)


spy++と同種のツールがBorland C++ Builder(以下BCB)にもあるらしいと知ったので、
ホコリを被ってたBCBをインストールしてみたんですが…
どうもLearning版にはその手のツールは入ってないみたい(爆)

BCB入れたついでに、BCBのupdateプログラムをBolarndサイトで探してたら、
_JBuilder7 Personal なるFREEのJAVA開発ツールも目に入ったんでDLしてみました。
しかしこれ、JDK1.3.1って書いてあるけど、どうなんでしょうか。
先日SUNのヤツを入れたんですが、それは _1.4.x なんですよ。
整合性云々の問題が出たりしないだろうか。不安。
JAVAはそのへんの管理がどうなってるか勉強不足でよくわかりませんです。
MSの各種updateみたいに、ただバージョンを上げていけばOKだったら嬉しいのだけど。

2001/10/18(木) [n年前の日記]

#1 これがcorega

・FTPについて調べてるんですが、よーわかりませんなぁ…
・corega BAR SW-4P は買わないほうがいいみたい。
_(詳細)


なんか今月の日記、(詳細)とか(以下略)ばかりですな…

2000/10/18(水) [n年前の日記]

#1 卒業検定合格

卒業検定、受かったッス。
前日、緊張のせいか、あるいは生活リズム崩壊のせいか、早くから布団に入ったものの一睡もできなかったり。
受けてる最中も、絶対不合格だろうなと。教習所戻ってきたら教官に色々タップリ注意されたし。
でもまあとりあえず、なんとかなったようで。
…ホントにいいのだろうか、こんなんで…

後は免許センターに行って学科試験を受けるわけですが。
オイラの行ってた自動車学校、合格率60%だそうで。
校長さんから、「とにかく勉強してから受けに行ってくれ。頼むから…」と1時間近くもお話を…

とりあえず、自分、そのへん危ないので、明日1日、丸々勉強してから受けに行くつもり。
実際、校長さんが話の途中でいきなり出した問題、間違えて答えちゃったし。
(道路工事をしてる場所の目の前で、同乗者を降ろすために車を停めた。○か×か?って問題)
検定に4人合格したんですが、全員間違えてた…
なんだかかなりトホホな感じ。

ひとまず、お金無駄にしたくないんで、みっちり勉強していきます。ハイ。

帰って来てから急激な眠気が。
歯医者の予約キャンセルして、夜まで寝てました。

1999/10/18(月) [n年前の日記]

#1 (NoTitle) AM3:00起床。早すぎ...

AM3:00起床。早すぎ。

午前中またずっと2ch。ヤバイ。いつになっても次々と他人の意見が出てくるから、ずるずるとのめりこんでいってしまって。これはインターネット自体がそうだろうけど。リンクを辿ればいつまでも時間を消費できる。ヤバイ。

昼頃シャワーを浴び(何日振りかな)、病院へ自転車で。外は晴れなのでそんなに寒くないかなと長袖シャツにカーディガンで飛び出したのがマズかった。風が冷たい。突き刺さる。ジャンパー着ていけばよかった。帰り道吐き気がしてくるくらい寒かったデス。
病院では、ここ数日になってようやく昼型になったことを報告。でも起きる時間がバラバラだし、すぐリズムが崩れるので油断できない、みたいな話をする。なんか忙しいらしくパソコンの話を振ってこなかった。
しかし正直何の為に行ってるのかよくわかんなくなってきているオイラ。
どうもオイラは昔から人前でいい子ちゃんぶってしまう傾向があって。極端に「人に嫌われたくない」という心理が働いてそういう振舞いをしてしまうみたい。先生と話しているときもそういう自分を感じる。話さなきゃならない事があったはずなんだけど、自分の中の何かがそれを思い出すのを邪魔している感じ。これでは意味が無い、ような気がする。

本屋でDOS/Vマガジン、Shadeの本、をGET。
中古ソフト屋で、エロゲーx2、同人ソフト1本、をGET。
あとHなビデオ屋を発見して、中を覗いたらくりいむレモン(だっけ?)のが1本500円で、懐かしいなーと1本だけGET。
エロパワー全開ですかね。でもたぶん買ってもプレイしたり見たりするのはずっと後。もしかすると見ないかも。見る事ではなく入手する事に快楽を感じる事に最近ようやく気がついたというか。只のコレクターなのです。いや、全然レベルが低くてコレクターなんては言えないけど。自分の中にある要素としてはそんなとこかなと。

懸念事項一点あり。返事待ち。

--------------

これをUPした後、メールチェックで返事が届いているのを知りました。
正直かなり混乱しています。色んな言葉が浮かんでくるのですが、でも言葉にならないです。

もう少し落ちついたら、何か書こうと思います。
BBS等、申し訳無いですが今日は書きこみしません。勘弁してください。

以上、25 日分です。

過去ログ表示

Prev - 2024/04 - 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