RTC2018の本番前、TwitterでWeather Typingの指摘をもらった。内容は、左右のシフトを両方押して片方離すとシフトが押されていないことになるというもの。ウェザタイ2では問題ないようなので、ウェザタイ3くらいからのバグっぽい。

ひとまず左右のシフトを区別しないまま、シフトを押した回数をReference Counter的に解決してみたが、左右のシフトの押し離しイベントの数が合わないことがあるようでダメ。RTC2018では修正しないことにした。

で、落ち着いて直してみたが、WPFはいいけど、UWPだとそもそもKeyDown-KeyDown-KeyUpしかイベントが来ない。こんなところでハマるとは。とりあえずKeyStateをとってシフトが押されてなければKeyUpイベントを無理矢理送ることでとりあえず解決。

ウェザタイ、RTC2018バージョンで改造した部分を本体のカスタマイズでできるようにする計画。まずは背景画像を設定できるように。

やっているうちにいろいろ増えてしまったけど、これだけあればだいたいのニーズに対応できるかな。タイル表示は難しいので入れてないけど。

前の日記で書いていたREALFORCEの画像を背景に設定したのがこれ。公式背景にはできないので、ここに貼り付けるだけ。

11/18、Red Bull Gaming Sphere Tokyoで行われたREALFORCE TYPING CHAMPIONSHIP 2018(以下RTC)を現地観戦してきた。RTCは東プレ主催のタイピング大会で、2年連続でオフライントーナメントとしてWeather Typingを使って頂いている。去年の大会も最高だったのだが、今年はいろいろと改善されていてさらによいものになっていた。

運営協力に名前が

今回、公式サイトや配信サイトの下にDenasu Systemが入っている。この並びにあるとどんな法人企業だ、という感じだけど、ありがたい。

で、実際に何をしたかというと、今のウェザタイのRTC2018向け改修。最近、配信でウェザタイをプレイしている方がいらっしゃったりするので、配信に向けた画面構成のヒントがもらえるかも、ってことでできるだけ協力させて頂いた。黒に赤でREALFORCE感を出しながらかっこよくなってますね。背景やフォントなんかは、デフォルトでこのぐらいカスタマイズできるようにはしたいところ。背景、なぜかREALFORCE画像だけでなくWeather Typingのロゴも出ていたけど、単にサンプルで適当に送っただけで、本番で使われるとは思ってなかった。

ちなみに、REALFORCEの遠近を強調した写真を背景画像にしてみたことがあって、なかなかかっこよかったのだか、意匠権的に自分でモデリングしないとな、ってところで止まっていた。まさか本家側で実現されてしまうとは。

さらに余談。ウェザタイの修正は、昼間の仕事が終わってからもう一つ仕事する感じてなかなか大変だった。けど、昼間の仕事と違って、やるかやらないかは全部自分で決められるというのはやっぱり楽しい。会社だと予算もあるしステークホルダーも多いし、作ってしまえばすぐなのにまずは断るところから入るとか、面白くないところも多いわけで。

オンライン予選

とりあえずe-typingを打ってみたけど、やっぱり話にならず、登録はせず。当日も参戦はしていないのだが、こんなの間近で見るしかないってことで、シンガポールから一時帰国。しかも月曜日は東京なので時間を気にする必要もない。

オフライントーナメント

いつもの通り、大会を純粋に楽しむのと、トラブルが起きないように祈る気持ちで観戦。会場、ゲーミングというとおり、対戦と観戦がしやすい作り。前回のTGSは混み合っていたのと他のブースの音と混じりあっていて、それもそれで良かったんだけど、やっぱり選手は大変そうだった。今回は、ヘッドフォンもあってミス音も(多分)聞こえるようになっていたり、選手が集中できる環境になっていた。観客の盛り上がりが、と言う話もあったけど、あれだけ接戦が続くと見入ってしまうというのはあると思う。他のe-sportsってどういう盛り上がり方をするんだろう。

画面構成。プロフィール表示とか、カメラを回さなくても画面が切り替えられたり、配信でも見やすくなっていた。ただ、WTの問題で結果画面がちゃんと出ない問題があって、対戦結果が分かりにくい場面が結構あった。実はロビーでテストしていたときに同じような現象が起きたというのは聞いたのだが、シンガポールでVMもない環境で、ちゃんとした調査がができないままだった。一応、片方画面がおかしくても、相手側にはちゃんと表示されていたので95%判定などはできていたのだが、観客にも分かりにくい画面になっていた。

あとは、必ず最初のワードのプレイヤ表示が2人重なっていたとか。最初のワードは見ても意味がないので支障はないのだか。

大会の内容は例のごとく他のレポートの方が詳しいはずなのでさらっと書く。まだ配信見てないので記憶間違いあるかも。予選かな決勝、TODでタイピングにはまったタイパーとしては、たにごんさん vs dqmaniacさんなんて、夢のカード。なんでこの二人がウェザタイで競ってるんだ、というのとか、去年のリベンジで1回戦から対戦相手にmiriさん指定しかもかなローマ字選択制ルールを活かして、かな入力で挑んだテルさんとか。で決勝。どうなっているんだろうというくらいの接戦。まだ第2回だけど、回を重ねるごとにドラマが生まれそうで熱い。

今回のルール。95%ルールに加えてワード選択により新たな戦略性を、ということかな。ただ自分くらいのレベルでローマ字しかしない人、だとワードの特性は分かりづらかった。このワードはこういう特性で、こういう選手に有利、っていうのがどこかにあるか、解説されると、もっとワード選択の意図が分かって面白いかも。大会を見ていて思ったのだか、95%ルールを付けてあえて複雑にすることで、観戦者もただタイピングの早さを見るんじゃなく、今94%だからこうするはず、とか考えることで面白さが増しているように感じる。多分観戦者も、情報があればワード選択の意図を考えて楽しむ余裕はありそう。

ダブルエリミネーションのルールもちょっと分かりにくくは感じたが、こっちは一般的なルール? であれば、観戦を楽しむためにちゃんと理解して観戦すればよい、のかな。

WT改善点

オフライン予選、トーナメント、大会後の会でもらった宿題のまとめ。やっぱり、サミットとか、こういう場所に行くと、いろいろな情報が得られる。

  • 結果画面問題。調査要
  • 最初のワードのユーザ表示問題。調査要
  • ロビーにゾンビが残ってしまう問題。なんか懐かしい。
  • ポート解放がやっぱり難しい。クラウドでサーバー借りて常設ホストを考えてはいるけど、まだ実行に移せず。
  • 入力不可時間に問題文を入れるのは無駄というか邪魔になるので、見えないようにしたらどうか。→ついでにワード毎のスピードとか出したらいいかな。出したいけどどこに表示しようか悩んでいたところなので。
  • 気付いた点。対戦を続けた場合に何勝したかを入れる。なんで今までなかったんだろう。
  • 気付いた点。対戦中はマウスカーソルを消す機能?

まとめ

今年も素晴らしい大会を開いてもらって感謝。これからも続けていきたいという話もあったので、ウェザタイも継続して使ってもらえるよう改善していくつもり。

で、WTのマルチプラットフォーム化でちょっと安定性が落ちてるので安定性を高めないと、とか、配信向けの最適化とか、さらにやることが増えた。宿題がどんどんたまっていくので開発が一人では限界。それだけでなく、RTCみたいな場が出てくると、私が開発を止めただけで終わってしまうようなリスクは避けないといけないし、どうにかしたい。Webランキング不正のリスクをとってでもオープンソース化するべきなのかも。

せっかくシンガポールにいるのでどこかに行かないとってことでシンガポールの電気街、Sim Lim Square、Sim Lim Towerへ。

Sim Lim Squareは1つのビルに電気店がたくさん入った場所。こっちは普通にスマホとかが売っている店なんだけど、すごいたくさん店がある。

もう一つのSim Lim Towerは面白かった。もう少しコアな店というか、パーツ店が集まった感じ。1店電子工作向けの店があったのでじっくり見てみた。日本と同じような感じでタミヤ製品もあったり。

シンガポールに来てから時間がなくて日記を更新できなかった。

今年もREALFORCE TYPING CHAMPIONSHIPが開催されるとのこと。既にe-typingによるオンライン予選がスタートしている。

前回の東京ゲームショウは、eスポーツとしてのタイピングの可能性が見えたので、今回も盛り上がってほしい。前回の感想→2017/09/24の日記

涼しくなってきたので京都に行ってみた。

京都と言えばヨドバシカメラマルチメディア京都だよね、ってことで駅前に。

やっぱりでかい。以前行ったヨドバシカメラマルチメディア梅田も、大きさが分かる写真を撮ってきたので掲載。

まあさすがにそれだけってのもアレなので清水寺とか伏見稲荷大社にも行ってきた。伏見稲荷大社は、頂上まで登ってみたけどどこがベスト風景なのか分からなかったので頂上の一歩手前の風景。

気がついたらSurface Book 2が手元にあったというお話。

神奈川の家では、DellのInspiron 17R Special Editionを使っていた。Core i7クアッドコア 3630QM+GeForce GT 650M搭載、6年前のノートながら途中でSSDを追加+メモリ16GBに増設したため結構快適に使えていた。ただ、17インチ3.5kgと重いため関西には持ってこれず、持ち運び用のSurface Pro 3を持ってきて使っていた。Surface Pro 3は軽くてすごくよいPCなのだが、Core i5の2コア、独立GPUなしなので、メインノートとするにはやっぱり力不足。特にXamarinアプリのビルドと実行にすごい時間がかかってどうしようもない。ってことで仮住まい移住記念に新しいノートを購入。

ちょっと前だと、GPUを載せたいいノートPCは重くて熱かったのだが、最近Surface Book 2が販売されて、気になっていた。Corei 7 8650U クアッドコア+GTX 1060を載せた上で2kg未満。13.5インチと15インチと迷ったが、13.5インチがデュアルコア、15インチがクアッドコアなので15インチに。SSD 512GBと1TBも迷ったけど、さすがに5万円の差に価値を見いだせず512GBに。しめて35万円です。高っ! 例によってヨドバシカメラで店員さんと雑談しながら購入。

まだノートンとATOK入れたくらいだけど、このPC、いい。

  • GPU以外はディスプレイ側に搭載しているのでキーボードが熱くならない
  • 2kgなので普段持ち運びは厳しいけど、拠点間の移動くらいならできる。Surface Pro 3約2台分
  • プリインストールソフトがOfficeくらい。いつもプリインストールソフトを消すために購入後すぐOSを再インストールしていたのだが、これならそのまま使える
  • ディスプレイを逆にして立てかければ内蔵ディスプレイと外部キーボードを違和感なく使える、と思う。外付けキーボードがないので試してないけど。

とはいえWiMaxでは50GBくらいあるVisual Studioをダウンロードするのが困難なので、一回神奈川で開発環境を整えるまで分からないけど。

ようやくホテル暮らしからウィークリーマンション暮らしへレベルアップ。てことで最小限のものを買いそろえた。まずはネットワーク。マンションのネットワークを契約できないので自分でなんとかする必要がある。通信量を(ほとんど)気にしないようにするには、UQ WiMAXくらいしかない。てことでヨドバシカメラマルチメディア梅田へ行ってみた。ヨドバシカメラで契約すると月々の料金が高いって言われてるようだけど、私には、店員さんにいろいろ聞けるのとすぐ使えるというメリットの方が大きい。どうでもいいけど、ヨドバシカメラは23店舗中11店制覇。みんなで札幌行ったときも一人ヨドバシカメラ行ったしね。

てか、ヨドバ梅田なんだけど、巨大。横浜とかアキバくらいの規模だといいなあ、って軽い感じで行ったのだが、圧倒的に大きい。城。そしてUQ WiMAX売り場の店員さんに、基本的なことは説明しないで良さそうですね、って一目で決めつけられたのはなんでだろう。で、家で調べてたときはSpeed Wi-Fi NEXT W05かな、って思ってたんだけど、マンションで固定回線の代わりに使いたいって相談したらSpeed Wi-Fi HOMEはどう? って勧められた。速度がW04相当で少し遅いが、電波をつかみやすいのとACアダプタさしっぱなしで問題なし。何その私にピッタリなやつ、って感じで即契約。758Mbpsなんて出るわけないし。

そのWiMAX、マンションが14Fなのでどうかな、って思ってたんだけど、まあまあ使えそう。Huluでそこそこ画質の動画は余裕で見える。


せっかく大阪まで行ってヨドバだけってのももったいないので、ついに日本橋へ。なんば駅から少しあるくと通称オタロードへ。そして隣の道に行くと電気っぽいお店が。マルツと千石電商があったので覗いてみた。アキバほど密集している感じはない、というかアキバがごちゃごちゃしてるんだけど、オタっぽいところと電気っぽいところは分離されてる感じ?

というわけで、大阪はベーマガイベントとヨドバシカメラと日本橋に行ったのでもう主要なところは見終わったかな。

生活用品も多少買いそろえたので、次はPCデスクとチェア。元の家から輸送しようか、新たに買ってしまうか。

Xamarin.Forms 3.1のデグレードの続き。WPF版でXamarin.Formsを3.0から3.1にすると,UI部品を動的にサイズ変更できなくなるという問題が発生する。ソースの変更点を調べると,ViewRendererのUpdateHeight,UpdateWidthで,Element.HeightRequestとElement.WidthRequestを使っている箇所がElement.HeightとElement.Widthに変わっていた。元々Requestが-1のときは動いてなくて,Requestを取ってちゃんと動くようにしたっぽいんだけど,WPFのTextBlockのControl.Width/Heightを変えてしまうとうまくサイズ変更されない。なので,とりあえずLabelRendererを作ってUpdateHeight,UpdateWidthをオーバーライドして何もしないようにすればLabelはなんとかなる。だが,ListViewのHasUnevenRowsなんかは回避できなかったので,動的な行サイズの変更はやめた。

追記。Xamarin 3.2 Previewを動かしてみたらUWPではリストが途中で切れるようになるし,WPFではラベルが落ちるようになった。Xamarinのバージョンアップのバグに対応する前に次のバージョンのバグが出てくるからもう無理。過去のバグは1つも直らないのでバグ回避が増えていくだけ。

D.E.放送局さんの「視聴者参加型 タイピング対決~負けたら台詞読み~」を見てみた。ちょっと前に配信に使って良いか問い合わせて頂いたのだが,twitterで情報が流れてきたので。

タイピングサミットでオフラインの大会は何度か見ていたのだが,配信だとこうなるのか,というのでタイピングの動画としても面白かったし,開発視点でも参考になった。いくつかメモ。

  • 対戦できる人数。仕様としては8人まで。誰かがOKを押して「待機中」になると,その後の人が参加できなくなる。そのため,4人で締切になったりしていた。キャンセルすれば「待機中」を消せるとかあるけど,やっぱりここは分かりづらい。
  • 5人以上だと画面表示や通信の問題があるので,対戦人数を制限するオプションはいるかも。オフラインの大会だと人数を制限できるのでよいが,配信だと必要になってくる。
  • 4桁のゲーム番号はアプリを終了させるまでは変わらない。これは何度か連続で同じ人とやる場合を考えた仕様だけど,配信の場合,ゲーム番号をみんなに伝えて早い者勝ちにする,って感じになってて,毎回変わった方が便利そう
  • 配信者も,見てる側も,配信動画を流しながらウェザタイの対戦もしてるわけだが,4人対戦くらいなら十分な速度が出るというのが分かった。8人はさすがに重そうだったけど。

ついでに,ちょくちょくウェザタイを○○に使いたい,っていうメールを頂いているので,「よくある質問」にOKって書いておいた。

XamarinのListViewは鬼門というかおかしな動きが多い。2週間くらい前にXamarinを3.0から3.1にしたのだが,UWPでページ遷移をすると落ちるようになった。2週間ずっと調査していて,ようやく解決。

事象としては,NavigationPage内にListViewを含むページを入れて,ListView内の項目を全削除してから他のページにナビゲート(PopAsync/PushAsync)すると,UnhandledExceptionなNullReferenceExceptionが発生する。ノーヒント。

ListViewのBindingを外したりSleepを入れたりすると落ちなかったりするのだが,根本的には,Xamarin.Forms 3.1でUWP ListViewRendererのList.UpdateLayout()がDevice.BeginInvokeOnMainThreadで実行されるように変わったことが原因。今日神奈川に帰るときに新幹線内暇だったので,このレンダラーをプロジェクトに取り込んでデバッグしてみて,ようやく分かった。以前はListViewが変更されて,UpdateLayoutが行われて,ListViewがDisposeされるという順番だったのが,ListViewがDisposeされてからUIスレッドでUpdateLayoutが行われるので落ちる。

すっきりした回避方法もないんだけど,PopAsync/PushAsyncをDevice.BeginInvokeOnMainThreadで実行するようにして,Navigateが最後になるようにしてみてようやく落ちなくなった。

WPF版もXamarin.Forms 3.1でいろいろデグっているので回避しないと。いつになったら本当にやりたいことができるのか。

第一回第二回に引き続き、大阪南港ATCで開催されたALL ABOUT ベーマガIISP in 大阪に参加してきた。

元々、大阪の人に譲るためチケット争奪には加わらなかったのだが、しばらく売り切れにはならなかったのでポチっと。その後7月から関西に住むことになったので、にわか地元民として堂々と参加。本当申し込んでおいてよかった。

会場は前回までとちょっと変わって会議室。今回は後ろの座席だったけど、前の方は今までにないくらい出演者に近かったはず。ちなみに座席番号が「A-64」みたいな形になっていて、椅子に番号が付いてなかったので若干分かりづらそうだった。「座席はLOCATE 0, 63 です」みたいになっていれば、あそこが 0, 0 だな、みたいに全員瞬時に理解できるのに、と思った。

グッズ

前回のイベントで、電波新聞社が正式にサポートするという宣言をされていた通り、今回は電波新聞社が主催。ということで、前回の会場で売ってたら収拾がつかなくなってそうなグッズの充実っぷり。私も今は一時拠点で荷物を増やせない環境なのだが、Tシャツとかステッカーを入手。ヘルメッツさんのラズパイケースなんかもPC-6001だったら買っていたところだ。

マイコンソフトコーナー

東京ではなかったので楽しみだったマイコンソフトコーナー。今時ゼビウスのアンドアジェネシスを倒して拍手が起きるイベントって何なの、って感じだけど、そこがよかった。小学生の頃、家にPC-6001版のタイニーゼビウスがあってやっていた記憶があるのだが、Wikipediaによるとその後にX1に移植されてようやくタイニーが取れた? ってことなんだろうか。展示コーナーにタイニーゼビウス mkIIが置いてあって眺めたり。

まとめ

今回のイベントはどちらかというとゲームよりで、プログラムな話題はそれほど多くはなかった。もちろんトークの内容は前回までとほとんどかぶらず、ゲームの話も面白かった。毎回トークの内容が違うのはさすがで、20年の時間を感じるところ。ただ、プログラマ日記としてはあまり書くことがない感じかな。

今回会場を抑えめにしてマイコンソフトコーナーを持ってきたみたいに、投稿プログラムを解説するコーナーをメインにしたミニイベントとか、90年代中心のミニイベントとかあるといいなあ、みたいなことを思ったり。

今月は関西移住で生活がいっぱいいっぱいになって開発ができてなかったのだが、今回のイベントでまたモチベーションを高められた。いろいろ作りたいものがたまっているので開発を再開しよう。まずはウェザタイオフラインonラズパイだけど、ラズパイと電子工作の部品が手元にない。いつ一時拠点に持ってこれるのか。

その他

同時開催のメイカーズバザールも行ってみた。んだけど、物販開始まで20分くらいしか時間がなかったので、とりあえずオリジナル製品ゾーンを一通り見て回ったくらい。

本来は今日は大阪に泊まって明日日本橋とか見て回りたかったんだけど、いつでもいけるようになったので今日はそのまま帰宅。でんでんタウンはまた今度。

Weather Typing 3.3がMacOSストアで公開された。これで予定していた全プラットフォームで公開されたことになる。GitHub更新がまだ残ってるけど。

各ストアの入り口はWeather Typingのページを参照。

明日から関西に別荘を作って仮住まいするので,なんとか間に合ってよかった。これから荷物を準備しないと。

Weather Typing 3.3をMicrosoft/Google/Appleのストアに申請した。Windows/Androidは既に公開済みでiOS/MacOSは申請中。

久しぶりに申請した感想としては,Windowsストアが一番楽。Appleストアはきつい。Windowsストアはアプリが少ないのでできるだけ登録しやすくしていて,Appleはアプリが多すぎて質が落ちるのを嫌って障壁を作っているんじゃないかと邪推してしまう。


Microsoftストアは特に何もつまづくことなく申請と登録が完了した。前回の申請からそんなに期間が空いてないのもあるのかもだけど,一番申請しやすい気がする。


Googleプレイは特に前と変わらずだが,元々見づらいというか・・・。申請しようとしたら,もうすぐ古いOS(API)のアプリは申請できなくなるという警告が出た。でAPIレベルを上げたら,パーミッションの設定の方法が変わっていて動かなくなった。とりあえずアプリ起動時に,パーミッション許可をユーザに聞くようにして,許可されなかったら終了するようにした。本当は許可しなくてもある程度使えるようにするのがいいんだろうけど。


Appleストア。どのストアも必要なスクリーンショットやアイコンがかなりあるんだけど,Appleはビルド,アップロード,サブミットと色んな段階で少しずつエラーにしてくるのがつらい。スクリーンショットも,厳密にピクセル数が決まっているのに,シミュレータではどうやってもその解像度の画像を作れないとか。最終的に「アップロードして完了したけどiPadのアイコンはなかったよ」とか言われて,修正するにはアプリのバージョンを上げないといけないとか。ちゃんとしたアプリを開発している人は途中で投げ出して,スパム業者だけはちゃんと頑張るみたいな状況になったりしないのかな。

ただ,輸出管理のことをちゃんと出してきたのはAppleストアだけかな。Mac版を申請しようとしたら,HTTPSを使っているだけでも輸出管理が必要だ,と言われて,なるほど,的な。denasu.comのHTTPS化でここに影響があるのか。結局,年次レポートを米国に出せばいいのかな。

Weather Typing 3.3を公開。全プラットフォーム完成したけど,まずはWindowsデスクトップ版を公開して様子見。順次Windowsストア,Android,iOS,MacOS版を公開していく予定。GitHubも更新しないといけないけどもう少し待って下さい。

修正点はWTのページを参照として,ここでは技術的な話を少し書いておく。

今回,フレームワークをWPFからXamarin.Formsに変更した。前述の全プラットフォームに対して,C#を使った同一ソースとして書けるわけだが,まだまだフレームワークのバグが多くて大変。幸い?ネイティブのかなり深いところまでカスタマイズできるので,なんとか回避できてしまったりするわけだが,開発時間のほとんどをバグの回避に使った感じ。特に今日公開したWPF版は,最近Xamarin.Formsでサポートされたばかりなので不安定。Xamarin.Forms for WPFの本格的なアプリを公開してるって人,他にいるのかな。

感想として,Xamarin.Formsは,WPF/UWP/Android/iOS/MacOSのうち対応したいプラットフォームのネイティブアプリを作ったことがあって,各プラットフォームに精通した人でないとちょっとお勧めしない。逆に精通した人なら,各プラットフォームの性質をどこまでも引き出せるポテンシャルを持っているので,(フレームワークが安定すれば)いい開発環境になると思う。


さて,記録のために書いておくと,WT3.3はテスト項目が2240件。テスト中に見つかったバグが222件。だいたい10個テストすると1個バグが見つかっている。自分のロジックのバグならすぐ直せるけど,何割かはフレームワークがなんかおかしいというものなので調査に1日とか。これは進まない。自動テストもしたいことはしたいんだけど,画面がちらつくとかボタンのデザインが微妙におかしいとか,そういうのをテストできるような自動テストってあるかなあ。

各プラットフォームで公開した後はどうしようかな。本来ならラズパイを使ったウェザタイオフライン(仮)を作ろうとしてたんだけど,来月から関西に行くので,落ち着くまで電子工作的なことができないかも。WTEditorのオンライン化もやりたいんだけど,それをやりはじめるとまた半年くらいかかってしまうし。

Xamarin.FormsにWPFが追加されたので,Xamarinで実装できなかった既存機能をXamarinに入れている。あとはプラグインくらいなのだが,1つ問題が発生。

今回,プラグイン共通DLLであるWeatherTypingPlugin.dllを,PCLから.NET Standardに変更したりいくつか修正をした。でもこのDLLはStrong Nameになっているので,DLLのロード元をリビルドする必要がある。Denasu System公式プラグインはリビルドすればいいのだが,非公式のものもリビルドが必要になる。

V1共通DLLとV2共通DLLを両方読み込むと型が衝突してしまうし,V1共通DLL用のAppDomainとV2共通DLL用のAppDomainを分離して両方読み込んでみるというのも試したけど,結局,V1プラグインが作成した共通DLL内のインスタンスの型をコンパイルできず,うまくいかなかった。正攻法はGACに入れることなんだろうけど,やっぱり抵抗がある。

てことで,WeatherTypingPlugin.dllのStrong Nameを外すことに。これならファイル名が合っていて後方互換性を確保してあれば読み込める。今まで作られていた非公式プラグインは一度リビルドしてもらわないと動かなくなってしまうが,今ならまだ大丈夫だろうという判断。

ちなみに。UWP,つまりWindowsストアアプリでも.NET StandardなDLLを使ってプラグイン的なものは作れそう。AppDomainは作ることはできないのだが,DLLのLoadはできる。UWP自体サンドボックスで,ファイルアクセスなどが制限されているのでセキュリティ的にはそれほど問題はないのかな。ただ,DLLの置き場所が特殊すぎるので,プラグインのダウンロード機能は必須。

ALL ABOUT マイコンBASICマガジンⅡ SP in 大阪前回と前々回に参加したベーマガイベント,早くも第3回が開催される。前回1000人規模にしたときはそこまでチケット争奪ではなかったので,次回あるとしたらどうするのかな,と思っていた。なるほど,大阪か。300席しかないとのことだったので,さすがに大阪の人に譲ろうとしばらく様子見したけど,数日経っても売り切れないので,購入。・・・もう売り切れになってるけど,大阪在住で行きたい人は買えてますよね。

さすがに大阪まで一緒にベーマガイベントに行く人もいないのでニューヨーク以来の一人旅。日本橋は行ってみたいよね,とか考えつつプランを検討中。

Xamarin Forms 3.0が正式リリースになったのでアップデート。今更だが,Xamarin FormsはC#でWindowsストア,Android,iOS,Macの開発ができる共通フレームワークで,共通フレームワークで足りないところはネイティブの機能を使えるのが特徴。ウェザタイではこれを使ってマルチプラットフォーム版を作っている。

Microsoftはいつもバージョン3.0で一気によくなるジンクス通り,3.0でようやく実用的になった感じがある。詳しい変更点はMicrosoft Buildの動画参照だが,ウェザタイにとって嬉しい箇所を紹介。

パフォーマンス

すごく早くなったわけじゃないんだけど,リストビューとかボタンとか,表示の途中経過が見えていたのが目立たなくなった。途中経過が見えるとパフォーマンスが悪く見えるので,これは良い感じ。

Visual State Manager

WPFにあってXamarinになかったものとしてVisual State Managerがある。例えば横画面と縦画面でUIを動的に切り替えたりするときに使う。どうしても必要だったので自作していたのだが,デフォルトで用意された。

WPF

一番大きいのがこれ。これまでXamarinのWindows版はUWP,つまりWindows 10のストアのみに対応。なので,マルチプラットフォーム版ウェザタイはWindows 7では動かない,はずだった。でもWPFに対応したことでWindows 7と同じものが動くようになる。

とはいえリリースされたばかりなのでいろいろおかしなところがある。一番困ったのがList Viewのアイテムを選択したままアイテムを削除するとNotImplementedExceptionが発生する。どうしようもないので,アイテムを削除する前に,CustomRendererからWPFネイティブの「ListView.SelectedIndex = -1」を実行することに。まあこんな感じでやろうと思えばネイティブ機能を使えるところが良い点ではある。

大学の頃の開発仲間の人達と15年ぶりに会ってきた。普通の飲み会ってあまり面白くないのでもうあんまり出ないけど,普通とちょっと違う生き方をしている人と話すのはやっぱり楽しい。

せっかくなのでその前にってことでラズパイワークショップ。前までは喫茶店とかでやっていたんだけど,機器を広げたりできないので,レンタルスペースを借りてみた。喫茶店で飲み物を頼むより少し高いけど,ホワイトボードもあって快適。さすがにハンダ付けは無理そうだから,そういうときはアキバの作業スペースなのかな。

議題はIoT版ウェザタイで,メインになるところはそろそろ動いてきそうなんだけど,ハードウェアというか,首から下げるキーボード的なというか,どうするかなあ。

WTマルチプラットフォーム版。Android版のテストが終わったので次はWindows 10 Mobileかな、と思って試してみたところ一つ問題が発生。どうもIMEの入力をキャンセルできないみたいで、CoreTextEditContext.NotifyTextChangedを呼ぶと勝手にIMEの変換履歴に残ってしまう。これだとひらがなの意味不明な文章が大量に履歴に出てしまうのでよくない。UWPサンプルを動かしてみようと思ったけど、何故かOSのアップデートができない。でいろいろしらべてみると、去年の10月頃、「Windows 10 Mobileは撤退?」のような話が出ているのか。日本以外ではそれなりに使われているのかと思ってたけど、そうでないなら対応する意味はほとんどないかな。てことでWindowsはデスクトップだけにするつもり。

マルチプラットフォーム版WTの開発は,Windows版のテストが完了した。次はAndroid版をテストしているのだが,Bluetoothキーボードがどうしても101キーボードとして認識されている。どうもキー入力を取得すると101のキーコードが来て,通常はIME側で106に変換しているっぽい。携帯だけならいいけど,raspberry pi版もあるのでどうしてもBluetoothキーボードに対応したい。ということで101->106変換を実装。

現状のWTでは101/106の2次元キー配列(1列分のキー×5段)を既に持っている。これを変換するマップを作ればいいわけで,普通に作ると2重のループで2次元配列のそれぞれを対応づけて,Dictionary<KeyCode, KeyCode>を作る感じ。こういう手続き型のコードはささっと書ける。

ただ,最近関数型言語を勉強していて,写像とか圏論に興味がある。なので関数型で書けないかな,って考えると,101キー集合から106キー集合への写像を作ればいいということなので,あえてLinqで書いてみた。んだけど慣れてなくてすごく分かりづらいものになってしまった。関数型に慣れてる人は簡単に書けるのかなあ。理解しづらいのは置いておいて,コンパイルできるようにするまでは大変なんだけど,書き終わって実行すると一発で動いた。このあたりは手続き型に対する関数型の強みになるのかな。

// KeyLine1をインデックス付きにする
x.KeyLines.Select((xLine, i) => new { index = i, line = xLine.KeyTops })
    // KeyLine2をインデックス付きにする
    .Join(y.KeyLines.Select((yLine, i) => new { index = i, line = yLine.KeyTops }),
        xLine => xLine.index,
        yLine => yLine.index,
        // indexが同じキー行でInner Join
        (xLine, yLine) =>
            // KeyTops1をインデックス付きにする
            xLine.line.Select((xKey, i) => new { index = i, key = xKey.KeyCode })
                // KeyTops2をインデックス付きにする
                .Join(yLine.line.Select((yKey, i) => new { index = i, key = yKey.KeyCode }),
                    xKey => xKey.index,
                    yKey => yKey.index,
                    // indexが同じKeyTopでInner Join
                    (xKey, yKey) => new { xKey = xKey.key, yKey = yKey.key }))
     // key1->key2のmapがキー行数分得られたので1次元配列にする
     .SelectMany(xLine => xLine)
     // キーとキーのDictionaryを作る
     .ToDictionary(item => item.xKey, item => item.yKey);

関数型言語だけど,元々Cマガの千言万語で興味があったのだが,最近いろんな言語で関数型言語的な書き方ができてきているので,Haskelを勉強してみた。で,やっぱりモナドで引っかかるので圏論を勉強し始めたのだが,むずい。群論とか線形空間とかの例はなんとなく分かるんだけど,位相空間とかになると分からない。と思っていたら丁度数学ガールの新刊で位相空間を説明していて助かった。

Huluで配信されているシリコンバレーが今日で配信終了。まだ第4シーズンの序盤までしか見てなかったので、週末にシーズン1から一気見した。どうしてもネタバレになるので、これから見る予定がある人は読まないで下さい。

第4シーズン、途中までは、IT業なら共感できるネタで危機に陥り、技術と運で乗り越える、という安心の展開。中でもRussの、「本当にやりたいことは何なんだ、オレはそれに投資する」的な発言でぐっときたり、相変わらず面白い。そこから、悪役が仲間になるジャンプ的王道展開でこれ以上ない盛り上がりに。ようやく場が整って、ついにサクセストーリーに入るのか、って期待したんだけど、後半、だんだんITの感じが薄れてNew Internetはどうなったんだ、って感じに。そこからのRichardの闇落ちは、これまでと違う見てられない系の盛り上がりだったが、面白いのは面白かった。通常なら犯罪が見つかった時点で未遂でよかったという展開か、犯した罪を償う展開か、で終わるところだが、ばれなかったからOKという展開はなかなか見ない。第5シーズンでフォローがあるのかな。アメリカドラマ恒例の先が気になる終わり方なので第5シーズンもHuluで配信するといいな。

週末で全38話19時間英語字幕+英語音声で見てたので頭が無駄に英語モードになっている。喋ろうとすると英語が出てきたり、夢が英語になったり。アメリカ出張前とか英語会議の前はよく英語一気見して英語モードにするけど、別に来週は何もないのでなんとなくもったいない気分。

ウェザタイ。ついにテストに入って、ゴールデンウィークにはマルチOS対応をリリースできそう。各ストアも英語圏に登録して本格的に世界進出しよう、というところなんだけど、シリコンバレーシーズン4を見ていて、ちょっと怖くなった。

お話は、すごい圧縮率のアルゴリズムを使ったチャットサービスを運営してユーザがどんどん増えたけど、COPPA(児童オンライン保護法)に違反していてものすごい罰金を払わないと、っていうもの。話自体は相変わらず面白いんだけどそれは置いておいて、ヨーロッパのGDPRとか、知らないと大変なことになるものが出てきて、個人で作ってるアプリでは把握しきれない。みんなどうしてるんだろう。

ウェザタイも見直してみた。ウェザタイはユーザ登録はあるけど、ハンドルとパスワードだけ。パスワードは暗号化しているし、チャットデータとかはもちろん保持していない。DBに入っている情報は、そもそもランキングとかで公開しているわけで、盗まれても何の情報も漏洩しない。ってことでデータ自体に問題はないと思ってるんだけど、規約までいくとなかなか。

ただ、ランキングのWebサイト欄にメールアドレスを入れている人がいて、その場合は個人と紐付いてしまうわけで、そこだけDBから消してみた。ウェザタイ側でメールアドレスを入れても、今は登録されないようになっている。

Weather TypingマルチOS対応も大詰め。最後にMac対応をしているのだが、なかなか難しい。どうしてもダメだったのがListViewの列の高さを動的に変える方法。ListViewの項目のうち、下半分を普段は隠しておいて、選択したときだけ全部表示する、というのを実現したい。要はランキングのアップロードボタンを隠したいってことなんだけど。

で、WindowsとAndroidではボタン等の表示非表示を切り替えるだけで問題なく動くのだが、iOSとMacはうまくいかない。いろいろ調べて、ListViewItemがクリックされたときにViewCellのForceUpdateSizeを呼ぶとiOSではうまくいった。でも同じ事をMacでやってもうまくいかない。Xamarinのソースを見てみたが、ForceUpdateSizeの実装はTODOになっていて何もやってなかった。その後、Mac側のネイティブコントロールまでいって、NSTableView.NoteHeightOfRowsWithIndexesChangedを呼び出すとか、NSTableView.ReloadDataを呼び出すとかしてもダメ。で、どうもNSTableViewDelegateのGetRowHeightで値を返せばよさそうというところまではいったのだが、XamarinがDelegateを使っているようで、ごっそり置き換えるのは困難。

というところで、Mac版はボタンを表示しっぱなしにすることに。Xamarin側で実装してくれるといいな。

あと、Mac/iOSではListViewに大量のデータを入れると表示が遅い。Windows/Androidはちょっとずつ表示してくれるけど、Mac/iOSはやってくれないっぽい。これも実装してくれるといいな。

3代目のdenasuサーバも6年目でOSも古くなってきた。メモリも枯渇してランキングがすぐ落ちてしまう。いい加減なんとかしよう、ってことで、新サーバに移行した。ついでに、常時SSL化の波もあるのでSSL証明書を取ってデフォルトをSSLに。SSL証明書も安くなって今までやりたかったんだけど、メモリ不足で躊躇していた。

4代目のdenasuサーバもよろしくお願いします。今までできてたことができなくなってたりしたらTwitterとかで教えてもらえると助かります。

Googleが常時SSL推奨になって気になっていたのだが、denasuで契約しているさくらインターネットで、年間1000円でSSL証明書が取得できる、しかも個人OKとのことだったので追加契約してみた。ついでに最近メモリが足りなくてランキングが落ちることが多いので、サーバをアップグレード。ちょっと古いインスタンスなので位置から構築し直しになる。

SSL自体はすぐ発行されて使うことができた。今は新サーバを再構築中。折角なのでCentOS 6からCentOS 7にしていろんなパッケージも最新にすることで最近のLinux界隈を勉強している。

テスト環境もSSLにしようと思ってローカルCAを作ったんだけどちゃんと作るのは結構大変。普通にOpenSSLで作るとChromeが許してくれないのでsubjectAltNameでだいたい名を設定。Androidではそれでも許してくれないのでV3形式で作成したりbasicConstraintsを設定したり。結局それでもAndroid Chromeは許してくれなかったので諦めた。

第9回タイピングサミットで発生していた「一瞬でワードが消える問題」が解決。先週からずっと、サミットの時に取ってもらったリプレイを唯一の手がかりにして調査をしていた。

リプレイを見ていると、どうも他の人が打ち終わった次のフレームで、前回のワードを打ち終わって次のワードに行ってしまっている。なので、まずはラグを疑ってラグをシミュレートしてみたが、全然再現しない。

次にログを増やして何度もリプレイしていると、1人だけフレームがずれていることが分かった。でも入力不能時間に入力してみたりワード送信メッセージを遅延させてみたり、あらゆることをやって、再現しない。

結局、一番最初からフレームがずれていることが分かって、対戦開始画面でEnterが連打されているのが原因だと分かった。Enterを押す度にメッセージが送信されて、フレームがずれていた。

なかなか再現しないバグってのはたくさん経験したが、だいたい再現しなくていろんな特殊な条件を試しても再現せず、結局普通のことが原因なことが多い。今回もEnterを何度か押すという普通にやりがちな操作。少ない手がかりから原因を推理して、シンプルな結論を導き出していくっていうのはプログラミングの醍醐味ですね。プログラマに推理力は必須。

有楽町よみうりホールで行われた「ALL ABOUT マイコンBASICマガジンⅡ」に参加してきた。今日を逃がすと日記を書くのが1週間後になって思い出せなくなるので、寝る前にまとめておく。前回同様ネタバレは避けてね、ということなので感想中心に。

ちなみに、私が使っていたのはPC-6001、ぴゅう太、ファミリーベーシックV1/V3、その後一気にPC-9821で、ベーマガは82~90年と94~00年くらいの読者っていう前提で。

このイベントは1982~2003まで刊行していたマイコンBasic Magazineの同窓会イベントで、2年前に初回のイベントが行われている。そのときの感想は2年前の日記を参照。

全般

チケットは一応VIP席をトライしてみたんだけど、開始後即クリックしてもとれず、PC-6001ユーザらしくA席を確保。前日までに国会図書館で予習復習をしようかと思ってたんだけど、ウェザタイ開発を優先して手元にある数冊を読み込むだけにした。

今回の構成も前回同様のトークショー、ただしスタープログラマとサウンドチームは分割して4部構成となり、結局13時から19時半で6時間半になっていた。密度が濃いので長い感覚はなかったけど、帰ってきても日記を書く時間が足りない。

運営面では、前回はお金をかけられない分手作り感満載の演出にしていたけど、今回は整理券行列に1時間並ばなかったり、パイプ椅子じゃなくてちゃんとした椅子になっていたり、何か欲しくなったらすぐにビックカメラへ行けるように配慮されていたり、かなり改善、じゃなくて手作りじゃない風の演出になっていた。

オープニング

恒例のP6音声合成から始まってムービー。そのうち動画が配信されると思うけど、いろんなネタが仕込まれていて、一応私が初見で分かったのは最初に飛んでいたのがPC-6001だったり、ラーメンライス持ってたり(ライスっぽくなかった気もするけど)、未だに意味はよく分からないシテオクとか、そのくらい。

ベーマガ編集部 再集結!

ここはやっぱりつぐよしさん。前回のイベントの「夢を壊さないために出演しない」が見事にフリになっていた。完全に、ああ、そういうことか、そうこともあるよね、って思った。

スタープログラマー VS. ○○プログラマー

(私は)前回のイベントではちょっと印象が薄かったのだが、今回はこのセッションが一番面白かった。特にファミベのよっしんさんの作品。あんな文字化けみたいなプログラムを掲載してたんだ。で、爆速。あれだけマシン語だとファミベというか普通のファミコンソフトと同じな気が。あえてバッテリーバックアップではなくテープレコーダーからロードというのもよい。うちにもあったけど、なんか音量を下げられないか下げてはいけないかなんかで、スピーカーを塞ぎながら使っていた記憶が。

最後の森巧尚さんの言葉はかなり心にくるものがあった。今の人は自分で作るよりよいものに溢れているけど、ちょっとやってみれば面白さにハマっていくっていうような話だったかな。子供の頃に強制的にあらゆることをやらせてみれば、その中から興味があるものが見つかるかも知れないし、ちょっとでもやったことがあれば将来やりたくなったときに役立つので、プログラミング必修はいいと思う。けど試験対策みたいなのじゃなくて、自分で作ったものが動く楽しみを伝えられるといいですね。

でも私のときは中学でロゴライターのプログラミングをやったような気がするけど、あれは必修じゃなかったのかな。初心者向けの内容だったから勝手にチーム作ってカーレースを実装していたら、先生から言語リファレンス渡されて、これあげるから自由に遊べ、って言われたのを思い出した。いい先生。

DEMPAサウンドチーム クロストーク、​スーパーソフトコーナー プレイバック

ここは正直私はよく分からない内容が多い。ペーパーアドベンチャーとかパソコンレスキューとかのコーナーは分かるけど、ゲームの世代が違う。ぷよぷよやブランディッシュなどの98ゲームならある程度分かるんだけど。

エンディング

最後、公式Twitterでずっと捜索していた何か、最大のサプライズ、ということで何だろう、と思っていたら、バトルオブ本の当日販売だった。ちょうど91~92年はベーマガから離れてロゴライターくらいしかしてなかったのでバトルオブストIIは知らないのだが、バトルオブぷよぷよはかなり面白かったので1冊購入。

これはガンガン宣伝して、ってことだったので表紙を置いておこう。

今回のイベント、前回参加できなかった人向けでもあるので、前回と内容が被るのかな、と思ったけど、そんなこともなく、さらにいろんな裏話を聞くことができた。また、前回、今後に向けたメッセージがあまりないな、と感じたけど、今回は最後の山下章さんや編集長の挨拶にもあるように、まだまだ新しいことをやっていきましょう、新しい世代につないでいきましょうということで、その辺もよかった。

次があるとしたらどうなんでしょうね。個人的には90年代中心の話題ってのを見てみたいけど、読者が限られてしまうのかな。ともあれ、今回も素晴らしいイベント、ありがとうございました。

2年に一回のMSDN更新。最初はVisualStudio使えるだけの安いエディションだったけど、ライセンスの統合とお得なアップグレードを繰り返し、今は最上位のEnterprise Editionになっている。

今回の見積りを見てみると、2年前より10万くらい高くなっていて2年で40万くらい。ってさすがに高いッス。と返信し、Professional版を新規契約し直すことに。現状Enterprise版にしかない特典はOfficeしか使っていないし。Azureの無料枠が実運用で使えれば使い勝手があるかな、ってくらい。で、2年で15万。激安。

その後メールで請求書が届いたのだが、架空請求メールとかが多すぎてメールが埋もれてしまう。本物のはずなのに怪しいメールにしか見えない。

ついでに。お金が浮いたのでiPhoneのテスト環境を更新しようと思ったのだが、SIMフリーiPhone Xは10万以上か、、、ってので、結局iPod Touchの2015年度版を買ってみた。一応iOS11が動くのでしばらくはもつかな。

手元の資料によると、Denasu Systemという名前ができたのは1997年12月30日。ということは今日で20周年らしい。おめでとうございますありがとうございます。ウェザタイは2001年なのでもう少し先。

20周年記念に、ウェザタイのマルチプラットフォーム版の動画を置いておこう。まだまだバグが多いので、バグを踏まないよう動画を撮るのに苦労した。

Windows vs Mac vs iPad vs Androidと、ホスト用に従来のPC版を使った5人対戦動画。

Xamarinを使ったウェザタイのマルチプラットフォーム化は順調に進んでいる。ただ、いろんなプラットフォームの仕様やらバグやらを回避するのが大変。ネット情報も少ないので、1個解決するのに1日かかるとかざら。オープンソースになってるのがせめてもの救い。Xamarin.Forms自体はかなりいいので、変な動作が多いのはもったいない。世の中に広めるためにも、今回分かったTipsをここに書いておくことにする。決して愚痴ではない。

Xamarin Forms for UWP

  • 凝ったUIをリストにしてで表示する場合、Xamarin.Forms的にはListViewのTemplateSelectorを使うのがお勧めのようだが、やってみるとテキストボックス(Entry)のカーソルが表示されなかったりPickerの選択肢が出なかったり(だったかな?)いろいろなことが起こる。結局ScrollView+StackLayoutに落ち着いた。
  • で、ScrollView+StackLayoutにすると、どこをクリックしても最初のテキストボックスがフォーカスされてしまう。ソースを見るとそういう仕様っぽいけど、困るので、ネット情報を参考に、ScrollViewの最初のアイテムとしてサイズ0のButtonを置くことで回避した。
  • XAMLで画像を表示するとき、Anrdoidなどでは画像をResources/Drawableに置けばルートからのパスで指定できるが、同じパスでUWPで使えるようにするには・・・ってことでUWPではルートに画像を置けば読み込めた。気持ち悪いけど。
  • ファイルの扱いも結構困る。Android等ではセキュリティ的に問題なければ自由にファイルパスを指定して扱えるが、UWPはFilePickerなどで指定したファイルか、プロファイル領域しか使えないし、Storageクラスを介さなければならないので自由度が低い。私はファイル操作をラップするクラスを作ってどのプラットフォームでも統一的に扱えるようにしている。

Xamarin Forms for Android

  • ScrollViewと他のUI部品を上下に配置すると、ScrollViewが他の部品をはみ出して画面一杯に表示されてしまう。ScrollViewのIsClippedToBoundsにTrueを設定すればOK。
  • デフォルトではスプラッシュ画面がなく、真っ白な画面が表示される。公式ドキュメントの通りにThemaを作って解決。

Xamarin Forms for Mac

  • ContentPageのBackgroundImageで背景画像を出していたのだが、Mac版だけはタイル表示になってしまう。しょうがないのでContentPageに画面全体のGridを用意してAspect FillにしたImageを配置した。
  • NavigationViewのPopAsyncを何回か実行して一気にタイトル画面に戻るとかしていると、Macだけは途中の画面が表示されてしまう。これはPopAsyncのAnimationパラメータをfalseにすればよい。
  • ListViewの背景がどうやっても白くなってしまうのに悩まされる。ListViewのBackgroundColorにTransparentを設定するだけだとダメで、さらに後ろに白い背景があるっぽい。ソースを見たらあえて白くしているようだったので、ListViewRendererを作って、NativeTableView.EnclosingScrollView.DrawsBackgroundをfalseにする。さらに、これだけだとScrollViewをドラッグしたときに後ろに白い線が見えることがあるのでNativeTableView.HeaderViewをnullにしてようやく完全に透明になった。

Xamarin Forms for iOS

  • ListViewに罫線が入ってしまう。ListViewのSeparatorVisibilityをNoneにすることで消せる。
  • DLLは使えず全部StaticLinkになるのでネイティブP/Invokeしている場合はスタティックリンクにする必要がある。また、他のプロジェクトのクラスの型を参照する場合、GetTypeにモジュール名は付けない。
  • 何故か分からないけどPCLの中にあるクラスに対してGetTypeはできないっぽい。入力方式プラグインはPCLじゃなくて普通のライブラリにした。
  • iOSネイティブのときは、UIInputTextを実装したUIViewでInputDelegateで受け取ったパラメータがUIKeyboardImplで、そのままUIInputTextDelegateにキャストできた。それを使ってTextWillChangeとかTextDidChangeを呼び出し、内部テキストを変更したことをシステムに通知できた。でも、XamarinだとWeakInputDelegateのパラメータをUIInputTextDelegateにキャストできない。ヘルプにはWeakだと実際の継承関係以外の使い方ができるように書いてある気がするけど、どうやるのが正解なんだろう。とりあえず今回はSimpleInputTextのサンプルのように[Adopts (“UITextInput”)]で実装した。ただ、それだとIUITextInputインターフェースを実装しないので、結局TextWillChangeとTextDidChangeを呼び出すパラメータに何を使えば良いのか分からなくなる。なので、わざわざIUITextInputを実装したラッパーを作って[Adopts (“UITextInput”)]を実装したクラスを呼び出すようにして、ようやくiOSネイティブ版と同じ動作になった。