あちい。そろそろ涼しくなってもいいんじゃないかと思うんだが全然そんなことないのな。
今週末イベントなんだが何出せばいいんだよ……。
イベントYPのトップページを修正した。
今までSilverlightで作ってたんだが、起動が重いし、レイアウトとかもいまいちアレで使いづらかったのでなんとかしたかった。 ちょっと前にJavaScriptでリスト表示できるようにしたよ!というのをもらってたのでそれベースで作りなおそうかと。作り直そうかと……したんだけど、もらったソースどこかにいってしまった。おい……。
といってもそんなに難しいものじゃないので自分で作ってしまおう。イベントデータはJSONで出力していてSilverlight版でもそれを使っていたので簡単に読み込める。 表示はknockoutjsを使って適当に表示した。
データは単にリストを返してくるだけなので、終わったイベントとかこれからのイベントとか分類をクライアントでやらなきゃいけないのがめんどい。めんどいが、そんなに難しいものでもなかったのでさくっと。
Wikiからリストを取得してきているので、データの一部に打ち消し線が入っているイベントがあるんでこれなんとか処理したいなぁ。%%で囲んだ部分が打ち消しになるみたいなんだけど、囲んだっつーか閉じてない場合があってめんどい。/%%(.*)(%%)?/
を<del>$1</del>
で置き換えればいいかーとやってみたんだが(.*)
に閉じ用の%%
までマッチしちゃって駄目だった。/%%(.*?)(%%)?/
にしたら空文字列にマッチした。そりゃそうだな。%%
じゃない文字列の連続にマッチしないといけないんだが、どう書けばいいのかよくわからんな……。最終的には/(%%(.*)%%)|(%%(.*))/
にマッチさせて<del>$2$4</del>
で置き換えた。なんでこれで上手くいくのかあまり自信がないんだが動いてるからいいか。
これをknockoutjsでdata-bind="html:hoge"
とかやればいいかーと思ったんだけど、これだと%%~%%
の中にhtml書いてあった時にめんどうなことになるわー。delタグに置き換える前にHTMLのエスケープしとかないとか。で、やり方を調べてみたんだが、なんか定番な処理っぽいわりにjQueryとか標準的な物には入ってないようだ。こうやればできる的なのはいくらか出てくるが、ちょっと微妙。Rackには入ってたのでサーバ側でエスケープ済みのデータを出力することにするか。ついでにdelへの置き換えもサーバ側でやるようにして完了。
あとはbootstrapで見た目をそれなりに整えてできたわ。本当はもうちょい高機能にしたかったが、時間ないし今のところこれでいいだろう。少なくともSilverlightなくてもJavaScriptさえ動けば見れるようになったしね。
今はイベントのキーが日付とイベント名なので、中止になったりした時にタイトルを%%
で打ち消しされると別イベントとして登録されちゃうんだけど、これなんとかしたいなぁ。元データがWikiのRSSなので本当にキーとしてはそれくらいしかないんだが、%%
とかフォーマット情報を削除した名前をキーにすればいいのかなぁ。その上で%%
で囲われたところを削除した結果、空文字列になったらイベント削除とか。そういう感じで考えてみるか。
Wikiに負担がないように6時間に一回更新になってるけどRSS取得だけならそんなに負荷になるとは思えん。30分か1時間に一回更新にしようかな。
立方体くるくるさせた。
いえ、なんの変哲もないただの立方体くるくるでございます。
スクリーンショットはIronRuby+OpenTK+GLES2(ANGLE)版だが、日曜に描画部分のJRuby+JOGL+GL3版も作ったので同じソースでJRubyも動くようになった。 最初はJRubyでもANGLE使いたかったんだが、どうもJOGLはANGLE使うと落ちる謎の現象に見舞われているようで試したら手元でもそうなったので諦めた。
GLES2が使えないとなるとデスクトップではGL2なんぞにこだわる必要もないのでGL3にしてみた。4でもいいが、今のところそこまで使わないのでパス。 といっても立方体くるくる程度では何が変わるわけでもないんだが。
そもそもGLES2もやめたいところではあるんだが、持ち歩きマシンであるLOOX UはGMA500でOpenGLがさっぱりなのでANGLEを使わざるをえない。AMDのAPUなLOOX Uサイズマシンが出たら即買いたいところだが、そんなニッチすぎる物が出るような時勢でないのが残念する。
それはともかく、JRuby版を作るのにJOGLの動作がよくわからんところが多くて難しかった。OpenTKだとGameWindowが思った通りに動いてくれるんだが、JOGLのGLWindowはJavaらしい部品化が進みまくったクラス構成であれこれ組み合わせないと、というかAnimator使わないとループすらできない。Animator使うと別スレッドで描画ループ呼ばれるし。こりゃけっこう大掛かりな仕組みですな。
OpenTKだとGameWindow作った次の瞬間からコンテキストが使えたのに対してJOGLだとGLWindowを表示しないとコンテキストが作られなかった。テストを書きつつやってるんだが、GLWindow表示しないといけない関係でテスト通すとウィンドウがちかちか出たり消えたりして気になる。問題はないんだけど。
それよりGLWindow表示してもコンテキストを使おうとするとこのスレッドにコンテキストがないよと怒られるのがめんどい。GLContext.makeCurrentしないといけないようだ。と、やってみたら今度はmakeCurrentとreleaseの対応がとれてなくてロックがどうこうとか。どうもコンテキストが二つ以上のスレッドが同時アクセスされないように、makeCurrentでロックしてくれるようだ。そのロックを外そうとするとreleaseが必要。うわめんどい。めんどいが、GL命令呼ぶところだけでmakeCurrentとreleaseやってみたらまあなんとかなった。makeCurrent・releaseは対応さえとれてればネストしても大丈夫そうだ。
テスト通すところまでは出来たのでできたわーと立方体くるくるさせたら表示はされるが点滅する。な、なぜだ……。 GLWindowには自動スワップモードというのがあって描画を実装するdisplayコールバックを実行したあとに勝手にswapBuffersを読んでくれるんだが、自分で書きたかったので自動スワップをfalseにしてswapBuffersを明示的に呼んでいた。どうもこれがいけないようで、自動スワップモードをtrueにしてswapBuffersを呼ぶのをやめると正しく表示されるように。しかし何故そうなるのかは謎である。もしかしたら描画スレッドからswapBuffers呼んじゃいけないのかなぁとは思うんだけど、だったらどこでswapBuffers呼べばいいんだよ。わからんので諦めて自動スワップにしておくことにしたが、よく考えたらべつに自動スワップで困ることってないからいいか……。
んー、ちゃんと調べたらlwjglの方がわかりやすいし全部入りで良い気がした。何か理由があってJOGL使ってた気がするが、さっき調べた限りではlwjglで欲しい機能全部ある。しかもメンテされ具合はこっちの方がいいな。乗り換えるか……。
今後はこのままちょこちょこ進めてゲーム作る。しばらくテクスチャとかいらんので描画に関しては立方体まで表示できれば充分だろ。入力とか取れるようにしたいね。