SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2024-05-27(Mon) CoffeeScriptでcallback

  前回の記事を「かきかけ」のまましばらく放置してしまっていたが、意図する機能の実装が「一応はできた」ものの、イマイチ美しくなく、記事に書くにはリファクタリングが必要な状況に陥ってしまったためであった。

  やってみたかったのは、名札インスタンスとして、ドラッグ操作で位置変更されたことを送信し、名札インスタンスとして、位置変更指示を受信するという実装。通信セッションは共用だが、名札インスタンスとしてはそれを意識せず、自由に送信し、自分宛てのものだけを受信する。要するに名札インスタンスに処理を閉じたい。各名札は他の名札のことを意識せず、通信を送受信したい。コールバックを受けたい、ということだ。

  既にRubyでは、Procやlambdaを理解できているつもりだが、CoffeeScript/JavaScriptではどう書くのだろう。結局、シンプルに以下で実現できた。

 class Mother
 
     constructor: ->
         @callbacks = []
 
     set_callback: (ins) ->
         @callbacks.push(ins)                    # 子インスタンスを配列に登録
 
     meal_ready: (menu) ->
         for ins in @callbacks
             ins.meal_call(menu)                 # 子インスタンスの関数を呼ぶ
 
 class Child
 
     constructor: (mother, name) ->
         @name = name
         console.log('I am [%s].', @name)
         mother.set_callback(@)                  # 親インスタンスに自分を登録
 
     meal_call: (menu) ->                        # 親インスタンスから呼ばれる関数
         console.log('I am [%s]. I like [%s]!', @name, menu)
 
 #-----------------------------------------------
 #
 #   Main
 #
 mom     = new Mother
 
 taro    = new Child(mom, 'Taro')
 jiro    = new Child(mom, 'Jiro')
 saburo  = new Child(mom, 'Saburo')
 
 mom.meal_ready('Pizza')                         # ゴハンだよー!!
結果は以下。
 
 I am [Taro].
 I am [Jiro].
 I am [Saburo].
 
 I am [Taro]. I like [Pizza]!
 I am [Jiro]. I like [Pizza]!
 I am [Saburo]. I like [Pizza]!

  今回は「WebSocketの@onmessage」の延長で子インスタンスに受信内容を渡したり、「Imageの@onload」の延長で子インスタンスにイメージの読み込み完了を伝えたりするのに使ってみたが、なかなかイイ感じに書けた。

  それとは別に「画面の書き換え処理により常時発生する負荷」の問題だ。ゲームならいいだろうが、起動しっぱなしの在席管理アプリではさすがに許容できない。

  試しに1/60秒の周期処理はそのままに、Screenクラスに@dirtyフラグを持たせ、画面の書き換えだけ抑制させたら、計測誤差レベルのCPU負荷に落ち着いたので、それでヨシとし、それでも1/60秒は過剰なので1/15秒に落とした。つうわけで、まだ多少のバグはあるかもしれないが、一応は開発完了。

  最近、それとは別に改めてレトロゲーに挑戦しているのだが、十分に楽しめるレベルに達しても、クリアまでには達しないという状況ばかりで歯がゆい。ドルアーガ(59)、スパルタンX(Mr.X)、アルゴスの戦士(13)、ブラックドラゴン(7)……どうにも頭打ちばかりでイヤになり、Factorioを再開してしまった。でも、それこそ容易には納得できないんだよなぁ……。