‘プログラミング’のエントリ

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はやってくれないっぽい。これも実装してくれるといいな。

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年代中心の話題ってのを見てみたいけど、読者が限られてしまうのかな。ともあれ、今回も素晴らしいイベント、ありがとうございました。

手元の資料によると、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ネイティブ版と同じ動作になった。

ALL ABOUT マイコンBASICマガジンⅡのチケット販売日。今回はVIP席をチャレンジしてみたが、開始即ボタンを押しても売り切りになっていた。A席は確保。1月が楽しみですね。

今年もタイピングサミットの2日目に参加してきたので、要望やバグなどを整理しておく。

全般

いつもお昼くらいから本格的に始まるので11時くらいに行ってみたが、みんなウェザタイ(かボードゲーム)をやっていた。いつもこんなにウェザタイばっかりやってなかった気がするけど。。。

で、今年は英語、バラエティ、日本語、日本語7レベル以下の4大会とのこと。強制参加ではないと聞いてタイピング特訓はさぼっていたため、参加はせず。ちなみに前日シングルプレイをやってみたらレベル5.1くらいだった。

改善点

去年の最大の課題だった動作の重さは今回は大丈夫そうだった。通信ラグは相変わらずあるが、ローカルPCで見る自分のワードは問題なし。で、接続方法とか集計方法とか、毎年改善したいと思うものはあるのだが、それはひとまず置いておいて、いくつか不良っぽいものを聞いたり見たりした。

・WT2で対戦ができない。
DPN_MSGID_ASYNC_OP_COMPLETEでDPNERR_ALREADYINITIALIZEDが帰ってきているのは分かったが、その先は分からず。元々DirectPlayはこのブラックボックスが嫌で作り直したわけで、今回は諦めたいところ。

・一瞬でワードが消える問題
プレイしているとたまに一瞬でワードが消えてしまう問題が頻発。リプレイをもらって調査したところ、原因は判明。ラグが大きい場合、1フレーム差で複数の人が打ちきると、次のワードには進んでいるのに、前の問題を打ち切ってさらに次の問題に進んでしまう。プラグイン実装時、全ユーザが同じプラグインを持たなくていいように、入力文字を送る方式から入力結果を送るように変えたところが問題箇所なので、3.1以前は問題ないはず。どう直せばいいかは検討要。

・ロビーが落ちる
ロビーのホスト側が、対戦終了後に落ちていたことが何回かあった。終了後なのであまり問題になってなかったけど。資料採取はできなかったので、今後再現したら調査要。

・ラグ
今回、5人対戦+前方スクリーン1人で6人対戦をしていたが、そこまでいくとラグが結構発生する。後ろで見ていると、打ち切っているのに思ったより得点が入っていない、と言っている方が何人か。打ち切りのタイミングは、全員がローカルPCで打ち込んだタイミングを送り合い、全員の結果が揃った時点でタイミングを比較する(ただし現バージョンは前述の問題で1フレームずれている)。で、ラグが大きいと自分の画面では打ち切っているのに、全員揃えてみると相手の方が早く打ち終わっていた、という感じになる。前方スクリーンでは全員がラグ状態で表示されていたので、正確な打ち切りの順番が見えるはず。

・キック問題
WT3の裏技として知られているらしい、「キック」が「kicku」で打てる問題。バグなので修正する予定。該当部分はオープンソースにしているので具体的に書くと、InputFilterRomanV1.csのProcessSokuonShortcutで全部のConnectionを処理しているのが問題。昔はこうではなかったようなので、何か理由があってこうしているはず。バグではあるけど、もう少し調査が必要。

・全員が参加前に誰かがEnterを押すと全員やり直し
これは多分直すのが難しいけど、今回ここがかなりネックになっていたように見えたので、改善できれば効果は高そう。

・マニュアルが欲しい
マニュアル、特にロビーとかポート開放なんかのやり方の説明が必要という要望。最近の流れだと、説明はアプリ内に書いておいてマニュアルはない、というのが主流なのでそうしたいんだけど、ちょっとこみいった内容は書く場所がないので、やっぱり補足的なマニュアルは必要か。毎回めんどうな接続しなおしも、ウェザタイのコマンドライン引数の説明(/host or /connect ipaddressで、実はロビーを介さなくても対戦できる)があればもう少し楽だったかも。ともあれ、今更真面目なマニュアルを書くのは面倒なので、プラグインの説明のときみたいな変な文体で書こうかな。

・英語圏へ進出
今後、ウェザタイのストアアプリ化に向けて英語も充実させたいという話をしたところ、今の英語は打ちづらいという話らしい。ワード生成の仕組み上、短文かつ固有名詞が多くなりがちで大文字が多くなるとのことだが、とりあえず固有名詞を少なめにワードそのものの量を増やそう、という方向、かな。自分でも作ればいいんだけど、実際いくつか作ってみると分かるけど、結構難しい。

・Mac版が欲しい
最初にサミットに参加したときから言われていたMac版。なんだけど、今やっているプロジェクトでついにMac版を公開できるかも。近い内に日記とTwitterで計画の全貌を書くつもりだけど、こんな感じでMac版でも少し動き始めている。

・打ち終わりの音
これも最初にサミットに参加したときに言われていた要望。WT3で結構実現したけど、まだまだ実現してないものが多い。

・プレイヤー増殖
再現性は不明だが、ESCでゲームを抜けるときにプレイヤーが増える、らしい。連打が怪しい?

感想

ウェザ大会、かなりの長丁場だったけど、休憩入れつつで最後まで盛り上がっていた。その後、「誰が何をゲーム」(だったかな?)で、全員が作成したワードをシャッフルしてみんなで打つという企画には参加したが、これはこれで、ウェザタイの面白い活用法をまた教えてもらった感じ。95%しばりもそうだけど、ウェザタイ側で特別なことをしなくても、ウェザタイの枠外でいろいろルールを作れるというのはやっぱり面白い。バラエティワードもそうだし、毎年工夫してもらって大会を開いてもらえるのはありがたい。

今後もどこまでウェザタイが使われているかは分からないけど、RTCなど、タイピングの面白さが広まってきそうな今の流れに少しでも役立てるよう、開発は続けるつもり。っていうか、現状家にいるときはずっと開発してる気がするけど、あまり進まない。オープンソース化も真面目に考えるときが来てるのかも。

ベーマガイベント第2弾が発表された。

「ALL ABOUT マイコンBASICマガジンⅡ」

2015年11月に秋葉原で行われた前回のイベントに参加したのだが、子供時代からのベーマガファンから見て最高のイベントだった。前回のイベントは30分でチケットが売り切れて参加できなかった人が多かった、ってことで会場大きくしてもう一回、みたいな感じなのかな。でも、前回は夢を壊さないように(だったかな?)辞退したというつぐ美さんが出るならもう一度行くしかない、ってことでチケット争奪戦は参加予定。っていうかつぐ美さんって本名だったのね。

チケットはいくらかな、って思ったら9801円、8001円、6001円って馴染みのありすぎる数字。逆に5000って何だろう。値段がだいぶ上がって会場が1000人規模になるけど、このイベントに参加する人の年齢層ってあんまりお金気にしない気がするので、やっぱり争奪戦になるのかなあ。

9/24に参加したRealforce Typing Championshipのファミ通の記事が面白い。

「これが世界最速のeスポーツだ! REALFORCE主催のタイピング日本一決定戦がすごかった【TGS2017】」

大会前、Twitterタイムラインで「タイピング日本一を決めるトーナメントがアツい(たぶん)【TGS2017】」のブログ記事が流れてきていた。この記事では時間があれば取材する、みたいなことが書いてあったのだが、結局ずっとブースにライターさんが張り付いて写真を撮っていた記憶がある。

で、その記事だが、長い。けど、さすがプロのライターさんですね。会場の臨場感そのまま、見所がまとまっていて面白い。こんな感じで一般の人にも競技タイピングが広まっていくといいですね。

東京ゲームショウ2017(TGS) 東プレブースで行われた、Realforce Typing Championship(RTC)を現地観戦してきた。この大会は、タイパー御用達Realforceの東プレが主催するタイピング大会で、予選にe-typing、本戦にWeather Typingを使用してタイピング日本一を決める大会。感想を一言で言うと、すごく面白かった。15年越しでこんなものが見られるとは。ってことで配信を見直しながら日記を書いてみる。

大会全体

配信もあるかも、というのはあったけど、やっぱり現場で見ないと盛り上がり具合は分からないな、ってことで現地まで行ってみた。現地では集中して見ていてメモも取らなかったので、後で配信を見ながら日記を書けるっていうのは嬉しい。

で、今回の大会、とにかく実況と解説がすごかった。実況はさすがプロという感じで盛り上げ方がうまい。解説のPocariさんは異様に場慣れしてるし。

タイピング的には、サミットでは打っている間は沈黙状態(ネタワード対戦以外)なので、実況ありは難しそうだった。dqmaniacさんのTwitterにあったけど、ミス入力音が聞こえないのでミスが連鎖するのはなるほど、とか。

開発者視点で

タイピングサミットもそうだけど、私の場合、タイパー視点と開発者視点の両方で見られる特権があるので見ていて面白い。ミス入力が続いたときはウェザタイのせいかな、とか、最後の文字をあえて打たないときはウェザタイが止まったのかな? とか。Paraphrohnさんが一度やり直ししたのはなんだろう。Winキーではないようだったけど、画面切り替え関連かな? とか、会場の大型モニターで見ると画面がちょっとチラついていて不安になったけど、PC画面を見ると普通だったので、モニタ側の制約かな、とか。並べてみると心配ばっかりですね。

で、今回の特徴だった95%ルール。

2年前、新ウェザタイを作ろうとしてからずっと考えていたのが戦略性。今のウェザタイは、早い人が勝つというだけで、例えば実力差が少しあると圧勝になってしまう。ウェザタイ2ではハンデ機能を付けていたが、やっぱりハンデを付けて勝つというのはいまいち気持ちよくないので、ウェザタイ3ではあえて付けず、戦略性で勝てるようにしたいと思っていた。お互いの得意な戦い方で戦うとか、戦略の相性とか、駆け引きがあるタイピング対戦をやりたくて、フルコンしばりなどのルールと、得意な入力方式、ワードセットを選んで交互にお互いのルールで打ち合う、なんかを考えていたのだが、考えるほど複雑になってしまい、詰まっていた。

今回、実況の方が、ウェザタイは戦略性がある、と言っていたけど、今のウェザタイは戦略性はほとんどない。そこをシステムでなんとかしたかったのだが、今のウェザタイでも95%ルールを入れるだけであそこまでの戦略性が生まれるとは驚き。このワードを先に打ったら正確性で負けるから最後の文字を残す、といった不思議な戦略とか、正確性をとるか正確性を捨ててスピード勝負に出るか、相手を見ながら決めていくといったジャンケン要素とか。まさにこういうのを見たかった感がある。そこまで考えてこのルールにしているとしたらすごいゲームデザインセンス。やっぱり最前線にいないとこういう発想は生まれないのかな。

タイパー視点で

一応タイパーなので普通の感想も。あの状態でレベル9.3を出すってすごすぎる。

最初、かなとローマ字の混合対戦と聞いて、普通にやればかな圧勝になるだろう、と思っていたけど、実際はそうはならなかった。かな入力では正確性95%ルールがハンデになるということなのかな。もしかな圧勝になったら、ウェザタイのかな入力の扱いに疑問が出るだろうから説明しないと、とか思ってたけど不要そうですね。一応、昔のマニュアルの評価基準に書いてあります。

→追記。PocariさんのTwitterから、かな有利すぎにならないように文章調整が入っていたとのこと。それであんなに均衡するっていうのはさすが。

あとは、サミットもそうだけど、タイパー的には大会のリプレイを公開してもらえるとすごく嬉しい。非タイパー向けにも、リプレイ対戦をやってみるとあれがどれだけの速度なのか思い知ることができるはず。ただ、リプレイのエクスポート機能がないと、どのリプレイがどの対戦なのか分かりづらいから、それが可能だとしてもウェザタイ側の改善も必要かな。

まとめ

なんか、いろいろ考えることが増えた気がする。ウェザタイのシステムでいろいろ戦略性を作ろうとしてたけど、ルールの工夫でここまでなるわけで、ウェザタイとしては、自由度を高めるだけで良いのかな、とか。この辺はまだまとまらない。

あと、なんかウェザタイをすごい宣伝してもらっていた感じがするけど、東プレ的にはそれでいいのだろうか、って思ったり。協賛のe-typingについてもParaphrohnさんのTシャツくらいしか触れなかったような。そんなにウェザタイ推しでよいのだろうか・・・どんなビジネスモデルを・・・まあ私が心配することではないですね。

おまけでTGS全体

今回のTGS、ウェザタイ初期ユーザで偶然同じ職場にいるけーさくと見に行った。お互い今はタイピング練習をサボっているけど、こういうのを見るとやりたくなるね、みたいな。

入場に並ぶという話だったので、13時に行ってみたのだが、ホール9~11なのもあって入場はスイスイ、一通り見て回ってみた。コントローラーが瞬間的に熱くなったり冷たくなったりするThermo Realとか面白かった。って冷たくなるってどういう仕組みだ。ゲームだけじゃなくてこういう技術的な方の展示もあるんですね。

大会後も時間があったので、大急ぎで1~8ホールを回った。そっちも16時くらいだったのでサクサク見られてよかった。イベント系はだいたい終わっていて残念な感じだけど、雰囲気だけは味わえた。

さて、トークショーもみないと。

はっぱさんとラズパイワークショップ。ラズパイ版ウェザタイと赤外線通信の進捗を報告。どちらも順調に進んでいるのでそろそろ合わせて動かすか、ってところ。なんだけど、Windows 10 IoTでPWMが動かないかも、という情報が。PWMが動かないと赤外線通信がかなり難しくなる。一応調べてみたら何かしらの追加ライブラリはありそうな感じもするけど、代替案としてAndroid Thingsでやるという案もある。そろそろAndroidでの動作も確認したいしということでAndroidで動かしてみた。

まだキーボード入力を実装していないのでちゃんとは動かないし、初めてスマホの縦画面で動かしたので画面もおかしなところが多いけど、一応動いているっぽい。さすがxamarin.forms。

一応進めているWT3の新コンセプト。いろいろアイデアはあるけどなかなかまとまらないので、平行で勉強も進めている。アプリ&ゲームプランナー必読!レベルデザイン徹底指南書組み立て×分解!ゲームデザイン ――ゲームが変わる「ルール」のパワーを読んだり、ソーシャルゲームを試してみたり。

なるほど、今のこの辺りの業界ってこうなってるのか。特に日本だと家でじっくりゲームする時間がないから、気軽に簡単にできる必要があるってことなのかな。ウェザタイで課金とかは考えてないけど、毎日やりたくなるようなやりこみ要素は欲しいところ。

オールフリーソフトさんでウェザタイを紹介してもらった。最近はストアが中心になっているので、フリーソフト紹介サイトが目立ってないイメージがあるけど、twitterを見ると結構アクティブに追加されていますね。

Twitterでいろいろやりとりしていたのだが、WTのプラグイン機能を実装して下さっている方がちらほらと。

月配列(permilさん)

なるほど、githubからforkするとこうなるのか。githubでちゃんとオープンソース運営するって手もあるけど、それだと普通の人が手軽にダウンロードして使うのが難しいし、やっぱりダウンロードサイトかな。ただ、まだ先になりそうなのでそれまでは結局日記で紹介していくしかないか。

Weather Typing 3.2.1がベクターの新着レビューに掲載された。しばらくベクタートップページにリンクされる。

前回のレビューがWT1.5の頃。15年前でずいぶん経ったので、先月更新の案内が来ていた。ちょうどRealforceイベントの件があったのでPocariさんに聞いてみたらOKってことだったので作者のひとこと欄にサミットについても触れておいた。ベクターのレビューは毎回結構深いところまで書いてくれるので読むのが楽しい。今回もWT2のときのマニュアルの情報にまで言及してくれていたり、、、ってWT3でマニュアル作れって話ではあるんだけど。

ウェザタイ on ラズパイ。通信対戦ができるようになった。

デスクトップ版のWTとも対戦ができる。ってことはモバイル版とデスクトップ版との対戦も可能ってことで。ただ、どうもローカルPCクライアントからUWPのサーバには接続できないっぽい。製品版では別に構わないけどデバッグはめんどくさい。

はっぱさんとMaker Faire 2017 Tokyo1日目へ行ってきた。会場が2つに分かれていたけど規模は去年と同じくらい? 一通り回るだけで5時間くらいかかったのでかなり疲れた。

ロボットの展示がかなり多く感じたが、たくさん並んでしまうと何が違うのか分かりにくくなるのがもったいない感じがした。逆にキッズコーナーは各展示でいろんなバリエーションがあって面白い。まあやっぱり一番興味深いのはエレクトロニクスコーナーで、例えば今ちょうどWindows IoTをやっているのでLattePandaはちょっと気になったりした。出展者一覧になさそうなので製品ページへリンク。あと個人的には、denha’s channel ピタゴラスイッチ的なマシーンとかカサネタリウム 変わったプロッタ? なんかが印象に残った。

ウェザタイIoTで出展できるといいなあ。

東京ゲームショウ2017で東プレさん主催のタイピング大会「REALFORCE TYPING CHAMPIONSHIP 2017」が開催される。その中のオフライントーナメントでウェザタイを使って頂けるとのこと。東プレといえばタイパー間で一番有名なキーボードRealforceのメーカー。私ももちろん使用中。

少し前にPocariさんからこういう話があるというのを伺って、使ってもらえるなら歓迎です、というようなことを返したのだが、本決まりになったようだ。いつもウェザタイを推してもらって感謝です。15年前、秋葉原にToD大会をこっそり見に行ったときにはこんなことになるとは思ってなかった。

WT3もタイピングサミットで2度大会を開いてもらって品質向上版を出したばかりなのでタイミング的にもバッチリ。まあ、1対1の(多分)LAN対戦てことで不安要素は特にないのだが、何か現バージョンのバグを知っている方は教えてもらえると助かります。

来週はあれもあるし、しばらくウェザタイのダウンロード数が増えそう。

Weather TypingのUWP化でネックになるネイティブC++の部分。C#に移植するのはそんなに大変ではないのだが、ネイティブ部分を使えるといろいろ便利なので調査。

まず普通にネイティブDLLを作ってUWPからP/Invokeしてみるが、あっさり成功。Windows IoTでもそのまま動いた。禁止されているAPIを使っていなければそのまま動くらしい。

てことで試しにWindowsストア用にビルドして、Windows App Certification Kit(WACK)にかけてみるが、「vccorlib140.dll is not supported for this application type」でWindows Security Features Testに失敗する。問題なさそうなmemsetとかmemcpyとかが引っかかっているので、どうもデスクトップ用のライブラリを見ているためっぽい。

ネイティブDLLのプロジェクトプロパティに「Consume Windows Runtime Extension」というのがあり、Using C++/CX in Desktop appsを参考に有効にしてみるが変わらず。

最終的にHow to: Use Existing C++ Code in a Universal Windows Platform Appというそのままのヘルプが見つかったのでそれに従って、上のC++/CXに加えてプロジェクトファイルを直接書き換えたりプリコンパイルヘッダの名前を変えたりしてWACKに通るようになった。

できあがったDLLをDependancy Walkerで見てみると、元々リンクしていた「VCRUNTIME140.DLL」とか「MSVCP140.DLL」が「VCRUNTIME140_APP.DLL」「MSVCP140_APP.DLL」になっていて、これがUWP用ってことか。

しばらくXamarin.Forms使ってみて分かってきたこと。

1. F5を押してもビルドされない問題

F5を押すとすぐに実行されてしまうので、手動でビルド、デプロイ、実行していたが、Configuration ManagerでUWPプロジェクトのビルドとデプロイにチェックが入っていないためだった。デフォルトでオフになっているのかな。

2. Release版だと例外が発生する問題

Shared ProjectのMainPageを起動するときにSystem.PlatformNotSupportedException: ‘Arg_PlatformNotSupported’ 例外などが発生。Releaseで動かした場合だけなんだけど、そのまま例外をスルーすると動くっぽい。なんだろう。

3. Xamlのインテリセンスが死ぬ

一番困ってるのがこれ。たまに動くんだけど、何かしているといつのまにかインテリセンスが死んでいる。UWPプロジェクトを選択しているときはインテリセンスが正常に動いたことがない。”ContentPage was not found”みたいなのが出てインテリセンスの選択肢がほとんどない。Android/iOSプロジェクトを選択していると動くことも多いけど、いつの間にかインテリセンスのウィンドウが出なくなる。一応そんなときはAndroidやiOSのプロジェクトから共有プロジェクトの参照を消してビルド、もう一回共有プロジェクトの参照を追加してビルドすると出るようになったりする。かも?

Raspberry Piでウェザタイを動かす計画。一通りロジックは移植し終わったのて、画面も少し作ってみた。

2週間前の状態がこれ。モバイルバッテリー付けて持ち運べるようになった。

今はこれ。キーボードを付ければ打ち込める。

キーボード関連等、Windows依存の実装があるが、そこさえ作ってしまえば同じアプリがRaspberry Pi上のWindows 10 IoT、Windowsストア (UWP)、Android、iOSで動くので、一石四鳥といえる。Xamarin MacってのもあるっぽいけどMacでも動いたりするかなあ。

対戦機能も、Windowsストアならサーバ・ホスト両方できそうかな。Androidとかでも、少なくともゲストはできる見込み。

で、折角のラズパイなのでハードウェアも動くはず、ってことでお決まりのLEDを試す。キーボードを押すとON/OFFする。

ここまで下準備ができてくると、やりたかったあの企画も近づいてくる。ある程度できたらイメージを載せてみよう。