2018年7月15日 (日)

「無限ループが発生してもハングアップしません」

最近、Unreal Engine の勉強を(少しだけ)していて、今日は「UE4 ブループリント超入門編」を読んだ。今までブループリントというのは、ゲームに必要になる典型的な処理だけをビジュアルにプログラムできるシステムだと思っていたので、基本機能が一通りそろっていて万能なのだという話は目からうろこだった。

それはともかく、この記事の最後の方にこう書いてある。

ちなみにブループリントは優秀なことに無限ループが発生してもなんとハングアップしません。かわりに無限ループが発生したと判断すればエラーになってエディターに戻ってきますので、安心して実行できますのでご安心ください。

ぱっと見、「止まらないコードはすべて検出してエラーにする」と言っているように見えるが、ブループリントが万能である以上、もちろんそんなことは不可能だ。そこで、実際に無限ループするブループリントを作って試してみた。いや、停止問題とかそういう高級なヤツじゃなくて、ばかみたいなやつ。

Infiniteloop

元記事にならって疑似コードで書けばこんな感じだ。

EventBeginPlay()
{
    while (true)
    {
        PrintString("Iterating...");
    }
    PrintString("Done.");
}

これをコンパイルすると…コンパイルできてしまう。VisualStudioだってコンパイル時にエラーを出す(「無限ループ」とは言わず、「while の後ろの PrintString に至るコードパスが存在しない」とかなんとか言うんだったと思うが)くらいの単純な例なのだが。コンパイルできたので動かしてみると、一瞬画面いっぱいにIterating...が並んで、エラーで止まった。Infinite Loop detected と言っている。なるほど、確かに実行時検出はできているようだ。だが停止問題は実行時にも検出できないはずだし、そもそも1周目では検出できないのに何周か動いたところで検出できるというのも奇妙だ。どういう風に検出しているのだろうか。いろいろ調べたところ、どうやらブループリントでは、「コードの同じ個所を100万回実行したら無限ループとみなして止める」という感じのことをやっているらしい。

なるほど。それならできる。お手軽でナンチャッテ的な手法だが、1フレーム時間(約17ms)を超えて動き続けるコードが(「無限」ループであろうとなかろうと)許されないゲームのスクリプトとしては、非常に実用的なデバッグ法なのだろう。これもまた目からうろこだった。

2018年5月13日 (日)

Wraith PrismクーラーのLED配線と制御

連休中にRyzen 7 2700xを買ったのだが、これにバンドルされているWraith Prismと称するクーラーにはLEDがたくさんついている。それはいいのだが、LEDを制御するための配線でハマったのでメモしておく。
 
このクーラー、ファンを回転させるためのケーブルに加え、LEDを制御するためのケーブルが2本も出ている。箱から出した時点ではコネクターがあり、ゴムのフタがかぶせてあるが、専用ケーブルが2本ついている。以下の画像は4Gamer.netの記事にあったものだが、両方刺すとこんな感じになる。(画像クリックで拡大。)
012
 
これが、間違いの始まり。
 
実は、このLED制御ケーブルは両方刺してはいけないのだった。
クーラー側4ピン、マザボ側専用4ピンのケーブル(上の画像の左側)は配線しなくていい。クーラー側3ピン、マザボ側USB10ピンコネクターになっているケーブルだけ配線すればいいのだ。というか、私のように両方配線してしまうと、うまく発光をコントロールできなくなってしまう。
 
私が使っているマザボはAsRockのAB350M Pro4というものだが、その取説にもこんなイラストが入っていて、いかにも両方刺せと言っている。
Ab350mpro423
(もっとも、取説はよく読むと、「Please note that only one cable should be used at a time」と書いてあった。とは言え、ケーブルを3本示して「only one」と言い、実際には図示しているケーブルのうち2本を接続する、というのは、やはり適切な説明とは思えない。)
だったら、どうしてこんな使わない4ピンケーブルが付いてくるんだ、そもそも無ければ間違えないぞ、という話だが、どうやら、従来のRyzenを含む2700x以外にバンドルされているLEDクーラーは専用4ピンケーブルで制御するので、ある意味、それとの互換用なんじゃないかと思う。(よくわからない。)
 
次に、この「USB」のコネクターをどこに刺すか、ということなのだが、結論から言うと、普通に内蔵USBコネクターのどこかに刺せば良い。だが、AB350M Pro4には「AMD LED Fan USB Header」という名前の(シルクはUSB_5だが)ヘッダーがあり、取説もそこに刺せと言っている。それで、そこに刺すものだと思ってしまった。
 
これが2つ目の間違い。
 
いや、ここに刺してもいいのだが、ケーブルのコネクターはUSBの2列10ピンなのに、実際に配線されているのは3本。また、マザボ側はピンが1列4本。これをどういう風に指すのかがわからず間違えたのだ。
 
結局正解は、USB_5の1/2/3/4番ピンに、USBコネクターの10ピンで言うところの6/7/8/9/10が来るように刺すことだった。上のイラストは、正解がわかってから見ると、確かに正しい刺し方を示しているのだが、この図から正しい刺し方を読み取れなかったのだ。
 
以上が正しい配線で、こう配線した後は、AMDのウェブサイトから「AMD Ryzen Wraith Prism RGB lighting control software powered by Cooler Master」という長い名前のソフトをダウンロードしてインストールすれば、すべてのLEDを好きなように設定できる。
 
なお、このソフトを初めて起動したときに、ファームウェアのバージョンアップがあると言われ、そのアップデートをすることになった。どうも、このクーラーにはLEDを制御するためのマイコンが入っていて、そのファームウェアをUSBで書き込めるようになっているようだ。

2018年5月 4日 (金)

Ryzen アップグレード

約1年前にRyzen 1700でPCを組んだのだが、そのCPUだけRyzen 2700Xにアップグレード。
(ただし、マザーボードのBIOS(というか、UEFI?)は最新版にバージョンアップしてある。)
おおむね各種レビューの通り、クロックが速くなった分だけCPUの動作性能が上がったという感じ。AMDの発表によると、CPUの動作クロック以外にキャッシュレイテンシーの大幅改善みたいなことも書いてあるが、それが利いているのかいないのか、よくわからない。使っているメモリが、DDR4-2400というRyzen的には遅めのものということもあるのかもしれない。
 
 

2017年10月20日 (金)

CancelEventArgs は Serializable じゃない

System.ComponentModel.CancelEventArgs は Serializable じゃない。だから remoting で渡せない。
 
だったらこんなの使わねーよ、自分で作るよ、たかが bool 一個なんだし、みたいな。
こうして、名前が違うだけで同じ内容のクラスがどんどん増える。再利用せずに。
System.ComponentModel という namespace の名前が空々しい。
 
というか、まあ、謎の誤動作の原因を調べたらこれだったという、俺の1日を返せ、みたいな。でも、なんというか、EventArgs 的なクラスはいつでも必ず絶対に Serializeable なものだと思い込んでいて、早い段階で間違った道に突き進んでしまったのが敗因なんですけど。
 
とはいえ、なぜ Microsoft がわざわざこれを Serializable なしにしているのか疑問ではある。さすがに「うっかり忘れました、テヘペロ」じゃないよね…。

2017年6月17日 (土)

DBANをUSBメモリーにインストールする

私は昔からハードディスク消去ソフトとしてDBAN (Darik's Boot and Nuke) を愛用している。

これはCD用のisoイメージで提供されるのだが、イマドキCDはいやなのでUSBメモリーにインストールしたい。ところが、Universal USB Installerではうまくインストールできなかった。

いろいろ調べたが、原因がよくわからない。昔、たしかにDBANをUSBメモリーにインストールしたことがあって、そのときはUniversal USB Installerを使ったはずなのだが、両方ともバージョンが上がっているし、PCのブート環境もUEFIとかいろいろあるので、状況が変わったということなのだろう。

isoイメージをUSBにインストールするというソフトは他にもいろいろあるので、適当に評判の良さそうなものを試したが、なぜかどれもうまくいかない。結局、3つ目か4つ目に試したRufusでうまくインストールできた。

結果オーライ。

因みにバージョンは、DBANは2.3.0、Rufusは2.15を使用。どちらも今日時点の最新版。

2017年6月11日 (日)

その後の食洗機

4年ほど前に、狭い台所に無理やり食洗機を置いた話を書いたが、その後もう少し台所が広い部屋に引っ越して、今はまぁ普通に置いている。
現在の様子はこんな感じだ。
Washer1
 
Washer2
シンクの左側は、本来冷蔵庫を置くスペースだと思うのだが、かなり余裕があったので、シンクの左に食洗機用の台を置き、その左に冷蔵庫を置いている。台は、以前使っていたキッチンワゴンでもよかったのだが、食洗機に入れる食器の水が垂れることがあり、ワゴンに入れてあるものが濡れてしまうことがあった。シンクのすぐ隣に置けば水はねもあるだろう。そう考えて、ワゴンは別の場所に置き、ここは専用の台を用意することにした。ホームセンターで見つけた組み立て式の棚だが、棚板をほとんど入れず、実際には大型のごみ箱を置いている。
 

2017年5月28日 (日)

久しぶりのPCアップグレード

10年くらい前は結構頻繁にPCの部品買っていたのですが、最近はあまりやらなくなってました。ふと気が付くと、最近のゲームが動きにくくなっていて、久々にアップグレード。
AMD Ryzen 7 1700
ASRock AB350M Pro4
G.Skill F4-2400C15D-32GVR (DDR4-2400 16GB CL15 x 2)
Samsung 960EVO (M.2 NVMe SSD 500GB)
久々だったので coldsweats01 これだけまとめて買い込みました。
 
Ryzenはメモリの相性が、みたいな話があるので心配だったのですが、適当に買ったモジュールで特に問題なく動作しました。
また、RyzenはUSB3が、みたいな話がありますが、今のところなにも問題起きていません。もっとも、手持ちの USB3デバイスはストレージだけで、残りのキーボード、マウス、ゲームコントローラーはどれもUSB2デバイスだから、かもしれません。

2016年8月27日 (土)

WPF で OpenFileDialog にコントロールを追加する

結論
  • Microsoft.Win32.OpenFileDialog をハックするのは困難。
  • それよりも Microsoft Windows API Code Pack の CommonOpenFileDialog を使う方が良さそう。
  • Microsoft Windows API Code Pack は nuget にある。
ということで、やはり自分で作るより出来合いのものを拾うのが吉ということか。
Microsoft Windows API Code Pack は、msdn のページも削除されて久しいし、メンテされていない。フォークをメンテしようとしている人もいるようだが、あまり活発ではない様子。ソースはあるので、自分に必要な個所だけ自力で直す覚悟をすることになるのだろう。
 
 

2015年11月 1日 (日)

昨日土曜日はハロウィンだったわけですが

金曜日の夜、また日は昼間から夜まで、新宿、原宿、渋谷あたりでは妙な衣装の人たちを大勢見かけた。たぶんハロウィンのイベントとかパーティとかに行く人たちなのだろう。帰る人もいたかもしれない。みなさん衣装のまま電車に乗り、ふつうの街中を歩いていた。

その姿で交番の前を通りすぎる人たちもいて、警官も別に気にしていないようだった。

なぜなのか。

いや、僕は別に警察が取り締まるべきだと思っているわけではない。だが、コミケに代表されるマンガ・アニメのイベントでコスプレをする人たちは「会場で着替える」ということになっていて、「コスプレ衣装のまま会場敷地から外へは絶対に出るな。出たら犯罪だ。」みたいな話になっている。それとの落差が気持ち悪いのだ。

なぜ、マンガ・アニメのイベントに参加する人は、衣装のまま街を歩いてはいけなくて、ハロウィンのイベントに参加する人は、衣装のまま街を歩いても問題ないのか。

理由がさっぱりわからない。

ちなみに、僕が実際に見かけただけで、セーラームーンっぽい女の子5人組とか、マリオとルイジっぽい人たちとか、スパイダーマンっぽい人とか、コミケのコスプレで見かけても違和感のない人がそれなりに混ざっていた。だから、具体的にどういう恰好かということは、街を歩いていいかどうかの基準とは関係ないのだろう。

不思議だ。

kono

«すし職人ロボット