晴耕雨棋

つい先日も、台風10号がやって来るなど、今年もまさに台風シーズンを迎えた日本列島ですが、今日は雨と囲碁の関係についてです。

以前にも少し書いたことがありますが、雨や雪の日は、COSUMIへのアクセスが大幅に増えます。きちんとしたデータを出すのはあまり簡単ではないので、ここではそれは控えますが、ざっくりと言って、「日本全国でしっかりと雨が降ると、日本からのアクセスが約25%増える」という感覚を私は持っています。そしてこれはおそらく、「どこかでしっかりと雨が降ると、その場所からのアクセスが約25%増える」ということだと思っています。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

雨と囲碁っていうと、「笠碁」という落語の演目を思い出す方が多いかもしれません。調べてみると、元は江戸時代からある話のようですね。その時代においての雨は、仕事をできなくして対局を増やすことの方が多かったのか、それとも、碁敵の所に行くのを阻んで対局を減らすことの方が多かったのか、私にはちょっとわかりませんが、少なくとも現代では、雨が囲碁の対局を増やすものなのは、まず間違いが無さそうです。

苔とWeb

ナニゴケ作ったので、Web上の苔にまつわるもろもろを調べて、一度ブログ記事にしてみます。こういうのを書き残しておけば、何年か後に見返した時に役に立つだろうという当初の意図だったのですが、結果的には、ここにしか残らなそうな内容は特に含まれていません。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

まず、Googleで「苔」という単語を検索した時の、検索結果件数(って言うのかな?)ですが、検索する条件などにもよるのでしょうが、私の環境では「約 38,500,000 件」となります。この数字の大きさを理解するために、私は反射的に「囲碁」という単語と比較してしまうのですが(笑)、そちらは「約 40,100,000 件」となり、まあだいたい似たような規模のワードようです。そして、検索結果の上位には苔の販売業者のサイトが多く並んでいて、これはちょっと「囲碁」とは様相が違いますね(こういう比べ方もなんですが、碁盤碁石を販売するサイトが上から並ぶことはないですからね)。分かりやすいところでは、楽天が5番目に私の環境では来ます。私は苔を自分で育てるということに興味が無い人ですし、ましてや買うとか発想にも無いですが、世の中的にはそんなものみたいです。こういうの、正直、私は最近まで知りませんでした。それにしても、上の方のサイトもそんなにリンクを集めている感じはないですね。「囲碁」だと日本棋院という強敵もいるのですが(笑)、そんなのも無いし、これは意外とスカスカかな? なんとか一気にぶち抜きたいですね。そして、上位のサイト見ている限り、「苔」はけっこうしっかりと蘚苔類のことみたいです。

次に時系列で見るために、Google Trendsでも調べてみました。最初は「苔」。


まず気が付くのは、季節性があるということですね。ピークは5月6月みたいです(ナニゴケもう少し早くリリースしたかった…(笑))。そして、長いスパンで見ると、右肩上がりの傾向も見て取れます。「最近、若い女性に苔が人気で…」とか聞くと、「また言ってるよ」って正直思っていたのですが、どうやらまんざら嘘でもないようです。で、この最近の苔人気の中心は、苔テラリウムとか苔玉など、観賞用に少量の苔を屋内で育てたいという需要にある気がします。「苔 テラリウム」だとこんな感じ。


他の植物と同じく、苔を観察し愛でる人はいつの時代もどこの国にもいるし、日本だと庭など屋外で苔を積極的に育てるということは昔からあったと思いますが、「屋内」というのが新しいところでしょうか? ちなみに、Google Trendsでの「苔」が蘚苔類のことなのかどうかは、当然のことながらかなり微妙です。

私も普段から、苔についてWebで調べることが多いですが、まあ嘘が多いです。「どんな分野でもそんなもの」って声が聞こえてきそうですが、かなりはっきりと相対的に不正確な情報が多いと感じています。理由はいくつか考えられるようにも思いますが、これといった説明を一言でするのはちょっと難しいですね。Googleの画像検索で〇〇ゴケを検索した時も、コンテンツの不正確さに、ウェブサイトの論理構造のまずさと、Googleのバカさ(笑)が相まって、かなり酷いことになってるんですが(でも、今見てみると以前よりだいぶましな気も…)、これがナニゴケを作ろうとした動機のひとつだったりもします。

そんな感じで、本当に役に立つサイトが少ないなと感じている私が、いつも勉強させていただいている、おすすめサイトをひとつ紹介します。

そよ風のなかで Part2
https://soyokaze2jp.blogspot.com/

おそらく中の人はごりごりの蘚苔類の専門家ではないはずですが、根拠のない断定とかするような方ではなく内容も信頼できますし、このブログが無かったら、ナニゴケももっと酷いものにしかならなかったと本当に思います。で、このブログの中の人、 左木山祝一さんが、つい最近、「コケの国のふしぎ図鑑」という書籍を出されました。たくさんお世話になったお礼に、私もできるだけ早く購入させていただきます。おまいらも買え!

次は苔の図鑑についてのブログ記事を書くかもしれないし、書かないかもしれないし、やっぱり書くかもしれない。

ナニゴケをアップデートしました (Ver. 1.0.2)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

9400枚だったTrainのデータ数を10300枚に増やしました。それ以外は何も手を入れていませんあと、TensorFlow.jsのバージョンを上げました。

先日、自宅のすぐそばに、ものすごい「フロウソウ」スポットを見つけてびっくりしました。灯台下暗しとはまさにこのこと…

[追記 2019/8/3]
最終的にはデータを10万枚にするのが目標なので、だとしたらここが一合目ですかね。先は長いですが、必ず登り切りたいと思います。でも、8月は本当に外に出たくないよ。こんなことを言ってて、去年もこの時期の写真ほとんど撮れなかったのですが…

ナニゴケをアップデートしました (Ver. 1.0.1)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

8400枚だったTrainのデータ数を9400枚に大急ぎで増やし、その他もろもろ細かい修正を入れて学習し直したので、精度が少し上がったと思います。

2週間後ぐらいまでにもう一度、ある程度しっかりした修正を行い、そこから先はゆっくりしたペースで、改良を続けたいと思います。使ってくれる方が少ない間に、目立つ欠点はさっさと直してしまいたい…

苔の種類を判別するWEBアプリを作ってみました

苔(コケ植物/蘚苔類)の種類を判別するWEBアプリを作ってみました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

かなり以前からずっと作ってたやつで、できることなら、もう少しまともなものができてからリリースしたかったのですが、それを言っていると、どこまでいっても、もう本当にきりがないので、ここらで一旦、区切りをつけて、一回、表に出したいと思います。

中身はTensorFlow.jsを使ったよくある画像分類で、学習データはすべて私がデジカメで撮った写真です。労力の8割以上(将来的にはおそらく9割以上になると思う)は、この学習データを用意するところに掛かっています。写真は全部で、約13,700枚撮りましたが、結局、実際に学習に回せたのは8,700枚ほど。ある程度正確にいこうとすると、まあこんなもんですね。特に、最初の頃撮っていた分が、かなりの量ゴミになりました。ただ、今はもう、学習データ作成のコツを掴んだというか、やり方が定まってきて、だいぶいい感じにいろんな作業ができるようになりました。

先ほど、一番最初に撮った写真のタイムスタンプを確認しましたが、2017年4月でした。てっきり、さらにもう1年前だったような気がしていたので、うまく言えませんが、なんかちょっとほっとしました。もちろん、それでも時間が掛かりすぎなのは間違いないのですが… 実は去年の今頃、白駒の池に泊りがけで行ってきたんですよ。このナニゴケの為だけに(笑)。あれから一年ですか… 本当になにをしていたんでしょうね? ちなみに、もう一度今年中に白駒の池に行く予定にしてたりします。

スマホでもPCでもちゃんと動いてほしいと思っているこのWEBアプリですが、iOSはちょっと大き目なNNのモデル使うと、特に2回目以降のpredictでよく固まります。これはSafariだけではなく、Chromeでも同じなのでiOSの問題に思えるんですが、意外と情報少ないです(なんでなんだろう?)。ちゃんと動けばかなり速いので、逆に余計いらつくんですよね(笑)。以前、white shadeでも同じような感じだったのですが、あっちは今は大丈夫そうだし、よくわかりません。リリース直前になって、急遽かなりサイズの小さいモデルを作って、それを使うことにしたのですが、iOSの端末に全体の足を引っ張られるのはちょっとなんなので、もうiOSだけフォールバックさせるかもしれません。ちなみに、[ 設定 > Safari > 詳細 > Experimental Features > WebGL 2.0 ]がONになっていると、固まらなくなるような気がしますが、代わりにそこそこ遅くなります。Androidは、よくわかりません。安価で今どきな端末を、ひとつ買ったほうがいいかな? とりあえず、アクセスログ見て適当に判断してみます。

肝心の判別精度は、正直、現時点ではちょっとあれなんですが、とりあえず1か月以内にある程度はなんとかします。そして、1年後までには、十分な実用性が出せるように、ちょっと真剣に頑張ってみたいと思います。今すぐに冬の写真を、というわけにもいかないので、1年ください。そしてそして、このナニゴケ、できれば自分の人生かけたライフワークにしたいと考えていて、せめて10年後には、本当に良いものにしたいと思っています。COSUMIはいつまで続けるのか、私自身もよく分かりませんが、こっちは最期の日まで止めるつもりはありません。今現在、「判別できる種の数78・Trainに使用したデータ8,400枚」なのですが、1年後の目標は、「判別できる種の数120・Trainに使用したデータ20,000枚」、最終的な目標は、「判別できる種の数200・Trainに使用したデータ100,000枚」、これでいきたいと思います。そこまでいったら、日本で撮影した苔の写真を世界で一番たくさん持っていることになりそうですね(笑)。今は何番目ぐらいなのでしょうか?

それにしても、ここ最近このWEBアプリに掛かりっきりで頑張っていたので、さすがにちょっと疲れました。机の上に散乱している大量の苔たちも、一度片付けたいと思います(笑)。何種類あるのかも、もうよくわからんけど、20はあるな… 顕微鏡の覗き過ぎで、目を悪くした気がして、とってもやな感じのこの頃です。

この文章を読んでくださっている方の大半は、おそらく苔なんて興味ないと思うのですが、苔はいいよ! ぜひ、ナニゴケ使えるスマホを持って、家の周りの苔を探してみてください。私も実際に外で使ってみましたが、予想以上に面白かったです。

[追記 2019/7/3]
ナニゴケ作っている時に気づいたのですが、ブラウザによってNNの出力が結構変わってきますね。white shadeのレベル設定があれになるので、もう見なかったことに…(笑)

white shadeで11路盤と13路盤の対局ができるようになりました

今まで9路盤しか無かったwhite shadeで、11路盤と13路盤の対局ができるようになりました。

white shade – 囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/whiteshade.html

少し前にできるようになっていたのですが、ブログ書くの忘れてました… 11路盤なら6子、13路盤なら8子まで石を置くことができます。前にも書きましたが、white shadeの9路盤のレベルごとの強さは、「レベル1はGNU GoのLevel 7に勝率60%、レベル4はFuego1.1の7000playoutに勝率50%、それ以外のレベルは、1レベル違いの自己対戦の勝率が同じ」に合わせていますが、11路盤と13路盤は、「9路盤の同じレベルに勝率50%の人間が勝率50%になるぐらいに」というふわっとした感じに定義しておきたいと思います。通常版の強さと少しずれていくかもしれませんが、とにかくこれでいきたいと思います。

使用した学習データにはほとんど含まれていない碁盤サイズですが、7路盤でもほぼ問題なく打つようなので、これは今度追加するかもしれません。

今回のアップデートでは、動作も大幅に高速になって、ほとんどの環境でサクサクだと思います(もし極端に遅い場合は何かおかしい可能性が高いです)。貴重なバッテリーを大切に使うようになりました。そして、打つ手自体も全体的にかなりきれいになったと思います。石をたくさん置いた時にも、こう打ってほしいなと私が考える理想に近い、個人的に好感もてる打ち方をするようになりました。今現在の一番の問題点は、シチョウがだめなのと、大石のアタリをうっかりする(というか、平たく言うと大石の攻め合いがかなりあやしい)ことですね。でもまあ、これから何とかできそうな気もします。そして、それが本当になんとかなれば19路盤も考えるのですが…

NNのモデルは、碁盤サイズにかかわらず同一のものを使っています。いろいろ考慮するとこれが一番良さそうかなと思いました。もうあと一回、VNとPN作り直して、次のアップデートでレベル6はいけるのではないかと… それで無理なら、少し深く探索してみます。そしてできれば、次のバージョンのVNは一度だけ、自由に使ってもらえるように公開したいなと考えています。13路盤以下だけですが碁盤サイズを選ばず、出力が目数単位のスコアなのは、結構使いやすいと思います。それを使って、だれかが何か素敵なのを作ってくれたりはしないかな?

最初は「とりあえず作ってみました」って感じだったwhite shadeですが、今現在はすでにかなり実用的だと思います。通常版と比較しても、特に大きく劣る点も無い気がしますし、実際、「こっちのほうが好き」って方も多いはず。ぜひ一度、試しに遊んでみてください。

完全にwhite shadeがオフラインでも動くようになりました

COSUMIのwhite shadeは、思考エンジン自体はクライアントサイドで動いているので、今までもオフラインでも対局することができたのですが、そもそもオフラインだとウェブページにアクセスして開くことができなかったので、あまり意味はありませんでした。それを、今まで一度でもオンラインの時にwhite shadeのページにアクセスしたことがあれば、次に開こうとした時に、それが仮にオフラインであっても、ちゃんとページが開けて対局もできるようにしました。

white shade – 囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/whiteshade.html

自分で書いててもどういうことだよって感じで、なんだかとても摩訶不思議なのですが、そういうことができるみたいです。時代の進歩って本当に凄いですね。スマホのホーム画面にwhite shadeのページのアイコンを出しておけば、もうほとんどネイティブアプリと同じように使えます。

私は、Service Workerとか言われても、もうよくわかりませんので、今回はUpUpというライブラリをありがたく使わせてもらいました。ひとつだけ注意点として、オフラインでは対局のリプレイは見れませんので、そこだけはご容赦ください(これは今となっては、まあまあ面倒なんです…)。

今後は、空の旅のお供に、もしくは秘境においてのエクストリーム囲碁の対局相手として(笑)、white shadeをぜひご活用ください。

現在、COSUMIのサーバが落ちています

1月23日の朝6時ぐらいから、COSUMIのサーバが落ちています。現在復旧中ですが、再開時期は未定です。どうかしばらくお待ちください…

[追記 2019/1/23 19:30]
本当に申し訳ないのですが、タイミングが悪いことに私の体調がちょっと良くありません。復旧はどんなに早くても明日24日の早朝、もしかするとかなり遅くなるかもしれません。ご容赦ください。

こんな時こそのwhite shadeですよね… あらかじめperfectsky.netにでも用意しておけばよかったです。今はそんな元気はとてもありません…

[追記 2019/1/24 8:00]
朝までの復旧は間に合いませんでした。申し訳ありません。自信ないですが、お昼にはたぶん… 昨日はインフルエンザに罹ったかもと心配したのですが、どうもそうではなかったようで、そうと分かるとなんか急に元気がでてきました(笑)。

[追記 2019/1/24 12:30]
ごめんなさい。もうお昼も無理です… 夕方!

[追記 2019/1/24 17:30]
とりあえず直りました。ハードウェアのトラブルだったのですが、いろんな事情が重なって時間がかかってしまいました。これはいつものことなのですが、動かし始めた途端、tail -fしたウェブサーバのアクセスログ(ほぼ1行1手)がものすごい勢いで流れ始めて、もう本当に怖いです…(笑) お待たせして本当に申し訳ありませんでした。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

[追記 2019/1/24 18:00]
今頃気づいたのですが、こんなに長い時間COSUMIが止まったのは、今までで初めてですね。しかも断トツで一番だと思います。うーん、その割には私に危機感が無かったかもしれません…(笑)

クライアントサイド版COSUMIを作ってみました

このブログ記事は、以前書いた記事の続きです。よろしければ、そちらもどうぞ。

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる
http://www.perfectsky.net/blog/?p=350

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる その2
http://www.perfectsky.net/blog/?p=380

囲碁の思考エンジンを作ってみる
http://www.perfectsky.net/blog/?p=389

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

以前から作っていた囲碁思考エンジン「white shade」を、JavaScriptに書き直してブラウザで打てるようにしてみました。COSUMIのクライアントサイド版です。

white shade – 囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/whiteshade.html

今現在は9路盤しかできませんが、強さはレベル1からレベル4まで選択できるようになっています。それぞれのレベルでの強さは、一応、通常版のとできるだけ合わせましたが、通常版を手元で再現するのがちょっとめんどくさくて、なかなか完璧にはいっていません。一応、クライアントサイド版では、レベル1はGNU GoのLevel 7に勝率60%、レベル4はFuego1.1の7000playoutに勝率50%、それ以外のレベルは、1レベル違いの自己対戦の勝率が同じになるようにしていきます(これでまあだいたい通常版と同じです)。最終的には、通常版にも無いレベル7ぐらいまで行きたいですね。まだやれることはたくさんあるので、それぐらいはなんとかなりそうな気はしています。現状は、目一杯の設定で、だいたいレベル4.5ぐらい。GNU Goに一局あたり平均16目ぐらい勝てるのですが、それでも勝率は90%を辛うじて超える程度で、100%っていうのはやはりかなり大変そうですね。

レベル1では、4子までの置き碁もできるようにしました。GNU Goにこれをさせると怪しいことになるのでちょっとあれなんですが、white shadeは、どれだけ形勢が悪くても結構自然に打つので、特に問題は無さそうです。今後はもっと大きな碁盤サイズでも対局できるようにしていきますが、8路盤以下は、もうこれで許してください…

JavaScriptのDNNライブラリ(って呼んでいいのかな?)は、TensorFlow.jsを使っています。私も使えたので(笑)、たぶんそんなに難しいものではないです。元々のPython版white shadeも、GTPとかデバッグ用のコードとかもろもろ除けば、実質200行ぐらい(?)のプログラムだったので、JavaScriptに書き直すのも大した手間ではありませんでした。一番たいへんだったのは、先ほどの強さの調整ですね。きれいに弱くするということがこんなに難しいことだとは、本当に思っていませんでした。後、少し心配しているのが、JavaScript版にした時に、NNのモデルのコンバートなんかで弱くなってたりしていないかなんですが、自分が打っている限りでは、大丈夫なように見えます。JavaScript版の強さの計測は、これも今後ちょっと厄介ですね。

簡単にwhite shadeの中身についても、書いておくと、基本的に、左上から右下まで本当に全幅で1手読んでるだけですが、人の手のみを学習したPolicy Networkの出力も少しだけ加味して手を決定していて、あとは、自然に打てるように微調整ですね。レベル4が少し重いかもですが、それ以外のレベルは、ちゃんと動きさえする環境ならば、おそらくサクサクだと思います。で、問題はそのちゃんと動く動作環境なんですが、今現在、iPhone/iPadのiOS系が安定して動かないと思います(後、IEもですがこれはもう本当にどうでもいい。Androidはちょっと分かっていません)。これは結構色々調べたのですが、まず、iPad+Chromeはだめで、Mac+Safariは大丈夫なので、iOSがだめっぽいのですが、NNのモデルを小さいものに変更するとかなり安定するようになるので(ちなみに今現在、Value Networkが92万、Policy Networkが45万パラメータぐらい。本当はもっと大きなNN使いたいぐらいなのに…)、端末が非力なことが単純に問題なのかもしれません。とはいえ、とりあえず動くだけは動いて欲しいのですが… iPhoneで動かない限り、トップページからのリンクもちょっと張れません。これはまた、なんとかします。

今現在、COSUMIは年間のサーバ代(最初に掛かった初期費用は入れず)が130万ぐらい掛かっているのですが、それがこのクライアントサイド版でいつか半分ぐらいにならないかなあと、つい皮算用してしまいます。私は今、車が欲しいんです(笑)。生まれてこのかた、一度も車なんて買ったことないのですが、今猛烈に欲しいんですね。軽でいいんですけど、新車が欲しい(笑)。そのためにも、このサーバ代はなんとかしなければいけません。話変わりますが、なんかネット見ていたら、さくらインターネットからお中元が来たって方がちょくちょくいるのですが、今までに新車のポルシェ一台分ぐらい貢いだ私はもらったことがない!(笑) うー、まだ足らないのかな… おいらもチョコが食べたい。

[追記 2018/9/2]
今回は、white shadeで囲碁の対局をできるようにしたわけですが、いつかは、9路盤以下の悪手指摘機能をこれで置き換えたいですし、もっと言うと、white shade Teach作りたいですね。この場合、teachするのは、囲碁というよりも、white shadeの囲碁に対する気持ちぐらいでしかありませんが(笑)、それでも、初心者の方には、十分有益なような気がします。忙しいので当面の間は無理ですが、またいつかがんばります。

[追記 2019/1/5]
ブラウザがロードするTensorFlow.jsのライブラリのバージョンを上げたら、iOSでもwhite shadeが動くようになったみたいです(やほい!)。ひさしぶりに私も対戦してみましたが、この子、そんなに弱くはないのですが、ときどきとんでもない転び方するので、ちょっと面白いです。ぜひiPhoneで一局打ってみてください。

今現在、9路盤以外でも対局できるように準備していますので、そちらはもうしばらくお待ちください。

COSUMI 10周年

今日2018年5月26日で、COSUMIは開始から10周年を迎えることになりました(実は、黒嘉嘉と誕生日がいっしょなんです(笑)。あっ、先生お誕生日おめでとうございます)。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

10年間の総ページビューは、221,499,920(におくにせんまん…)。もう本当に訳の分からない数字ですが、個人的には、セッション数59,413,618と平均セッション時間12分22秒という2つの数字が一番やばいと思っています。単純に掛け算すると約1398年。人生80年だとすると、17.47人分ですよ!(もう怖えーよ…) そして、COSUMIは10年間通算で、40,599,753敗しました。うーん、たくさん負かされましたね。究極の目標は1億敗なんですが、いつか達成できる日が来るのでしょうか?

10年間のページビューの推移(ともろもろ)です。

基本的にCOSUMIは、非常にゆるやかな右肩上がりをずっと続けてきました。このグラフを形作っているのは、そのほとんどがCOSUMI固有の要因だと言えると思いますが、その中で、唯一といっていいほど例外的に、外部的な要因で大きくアクセス数が変動したのが、2016年3月のAlphaGo-セドル戦で、結局のところ、この10年の間に起こった、囲碁をやらない人までを巻き込んだ大きな囲碁の話題って、この時一回きりだったのだと思います。AlphaGo-柯潔戦とか、井山七冠達成とかは、ニュースバリューがほとんどなかったと見るべきでしょう。

COSUMIの今後については、現時点ではあまりはっきりしたことは言えませんが、新しい機能の追加とかはもうあまりないと思ってください。ただし、使用している囲碁の思考エンジンは、最近、急に出てきた非常に強いオープンソースのソフトや、今現在、私が作っているソフトに、部分的には置き換えられていく可能性が高いと思います。たぶん、そのあたりが今COSUMIに一番足らない部分ではないでしょうか?

そして、ここ最近、私がよく考えていることとして、「いつまでCOSUMIを続けるのか」っていうのがあるのですが、一応、最低でもあと5年は続けたいなと思っています。ただ、それ以降については、私ではなく時代が決めることなのかなという気がしています。

似たような内容のことを、このブログでも何度か書いていると思いますが、COSUMIを最初に作っていた時は、10年後、まさかこんなことになるとは、夢にも思っていませんでした。驚くほどたくさんの方に遊んでいただきましたが、一番楽しんだのは自分自身なんだということについては、よく理解しているつもりです。これも以前からの繰り返しになりますが、すばらしいソフトウェアを自由に使わせてくださっているGNU GoとFuegoの開発者の方にも、再度お礼申し上げます。そして、今までCOSUMIで遊んでくださった方々へ。10年間、本当にありがとうございました。感謝しています。

10周年にかけて、10路盤の対局ができるようにしてみました(笑)。強さはLevel 1相当です。COSUMIは黒しか持たないようになっています。これは、今だけの期間限定です。一週間ぐらいしたらまた元に戻しておきます。

[追記 2018/5/27]
セッション数と平均セッション時間を掛けた1398年という数字は、ユーザがCOSUMIを見ていてくれた延べ時間ぐらいの意味で出したのですが、実情は、おそらくそんなものではありません。古いログは解凍するのも恐ろしいので(笑)、きちんとした数字を出すのはここではやりませんが、例えば、この2週間の間にCOSUMIが打った手数が70,843,582手(+α)、同期間のページビューが1,623,460pvで、割り算すると43.6手/pvぐらいです。それに、全期間のページビューを掛けると約96.7億手(本当によく知らないけど、AlphaGoといい勝負になってない?(笑) GNU Goは軽いですね)。COSUMIでは、これに10秒掛けたのがだいたい対局時間と考えてよいので、そうなると約3065年になります。これはかなり適当な計算ですが、とはいえ、対局リプレイを見ている時間なども含まれていません。

囲碁の思考エンジンを作ってみる

このブログ記事は、以前書いた記事の続きです。できれば、まずはそちらをお読みください。

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる
http://www.perfectsky.net/blog/?p=350

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる その2
http://www.perfectsky.net/blog/?p=380

時間ができたので、以前から作っていたDNNな囲碁の評価関数を使って、囲碁の思考エンジンを作ってみました。「パスも含めて全幅で深さ1だけ読む」という単純なプログラムです。9路盤しか打てません。一応、名前も必要かと思ったので、コードネームだったのをそのまま使って、white shadeと名づけました。由来は、Procol Harumの例の曲です。特にそれ以上の深い意味はありません。ちなみにこの映像は、ちょうど今から50年前のものみたいですが、ポピュラー音楽って本当に進歩がないですね。コンピュータ囲碁は、この5年だけでもめっちゃくちゃ強くなったのに…(笑)

ということで、早速、GNU Goとの対戦を行ってみました。使用した評価関数は、BottleneckアーキテクチャになっているRes-Blockのネックの部分が、32Filterなのと48Filterなのとの2種類。共に10 Res-Block(ちなみに、32Filterはパラメータ数が210,769で、48Filterは368,529。できれば、このあたりのサイズで何とかしたい…)。それぞれ、8対称形の平均をとったのと、とらないのとの、計4種類です。対局数は、先後を換えて150局ずつ計300局。同じような対局ばかりになりがちなので、twogtpに付属していたオープニングブックを使用しています。結果は、

32Filter 106勝194敗 (勝率 35.33%)
32Filter/8対称形の平均 144勝156敗 (勝率 48.00%)
48Filter 128勝172敗 (勝率 42.67%)
48Filter/8対称形の平均 176勝124敗 (勝率 58.67%)

うーん、よくわからんけどまあこんなものかな? とりあえず、ここがスタートですね。棋譜を見ていると、序盤はかなり上手なんですが、この子どうやらアタリがよく分かってないみたいで(笑)、後半すさまじいファンタを見せてくれます。一番強い48Filterの8対称形平均版から適当に3局選んでみたので、ご覧ください。


Sorry, your browser doesn’t support WGo.js.

Sorry, your browser doesn’t support WGo.js.

Sorry, your browser doesn’t support WGo.js.

こんなのに半分以上負けるGNU Goもどうなのよって感じですが(笑)、まあ強い時は強いからしかたないか… でもって、何でこんなにアタリがわからないのかっていうと、いろいろ理由はあるんでしょうが、おそらく一番大きいのは、学習データにこういう局面があまり含まれていないからだと思います。もちろん、大石がアタリになっている局面はそれなりの数あるのですが、そのほとんどが、アタリにされている方の手番になっていて、つぐなり逃げるなりすれば大事にならないので、それで深刻なことだと学習できていない気がします。NNの入力にダメの数を入れるとか、深さ2読むとかしたら、ここまでひどいことにはたぶんならないと思いますが、そんなことしなくても評価関数だけでこれぐらいは分かってほしいですし、こんなことも分からなくて、もっと高度なことが分かるはずもないような気がするので、なんとかしたいのですが、どうするのがいいかな? 「いっぱい対局させて、それをRayに添削してもらって、酷そうな手の前後を学習データに追加していく」みたいな感じでだめかな? また少し試してみます。

9路盤での最終的な目標は、GNU Goに対して1局平均10目勝ちです(今はだいたいイーブンぐらい)。勝率はあまり気にせず、そこを目指していきたいと思っています。そこまでいけたら、ブラウザで打てるようにしたいですね。

いろいろやっている間に、Rayが出してくれる形勢判断が常に1目ずれていること(黒番の時と白番の時で向きが逆、平均すれば0。簡易的な日本ルール対策?)に気づいて、その分を修正しようとしたのですが、今度は別のところで矛盾が生じてきて絶賛混乱中です。もう一目ぐらいどうでもいいか… あと、現在、Policy Networkも作っています。Value Networkもそうですが、よくこんなのでちゃんとしたアウトプットが出てきますね… なんだか、狐につままれた気分です。

あとあと、CapsNetで囲碁やった人とかいないんでしょうか?

[追記 2018/5/6]
最近、Policy Networkを作っているのですが、学習データを普通の棋譜からランダムに切り出して使ったりすると、結構ラベルに偏りが出てくるのが気になります。ということで、囲碁で一局を通して、座標ごとにどれぐらいの回数打たれるのかっていうのを調べてみました。例えば、COSUMIの9路盤のレベル1の作り碁ならこんな感じ。一番打たれる回数の多い場所を100として、それとの割合です。

 14  29  40  52  59  52  40  29  14
 30  44  56  68  71  67  55  44  30
 40  56  76  86  88  86  75  56  41
 53  68  87  96  95  96  86  68  54
 60  73  89  95 100  95  88  73  60
 54  68  87  97  94  95  86  68  53
 41  57  76  86  87  85  75  56  41
 30  45  56  68  71  67  56  44  30
 15  31  41  53  59  52  40  30  14

そして、レベル5ではこんな感じです。

 24  48  56  67  71  67  57  48  24
 48  64  74  82  85  82  74  64  48
 57  74  89  95  97  95  89  75  57
 67  83  96  99  98  99  95  83  67
 71  86  97  99  99  98  97  86  72
 67  83  95 100  98  99  95  83  68
 57  74  89  95  96  94  88  74  56
 48  65  74  83  86  83  74  64  47
 25  48  57  67  71  67  57  48  25

どうでしょう、ちょっと不安になってきませんか?

今現在、学習に使っているデータは、COSUMIの棋譜から取って、いくつかの条件でふるいをかけたものですが、それの検証用データのラベルの合計がこちら。これを[1]とします。

 1628 2786 3627 4372 4508 4372 3627 2786 1628
 2786 4038 4507 5506 6126 5506 4507 4038 2786
 3627 4507 5296 6662 6550 6662 5296 4507 3627
 4372 5506 6662 8024 6928 8024 6662 5506 4372
 4508 6126 6550 6928 7928 6928 6550 6126 4508
 4372 5506 6662 8024 6928 8024 6662 5506 4372
 3627 4507 5296 6662 6550 6662 5296 4507 3627
 2786 4038 4507 5506 6126 5506 4507 4038 2786
 1628 2786 3627 4372 4508 4372 3627 2786 1628

そして、そのデータと同じ作り方をしている学習用データで学習したNNで、先ほどの検証用データを予測させた時の最後のsoftmaxの出力をそのまま合計したのがこちら(この数字をここで使うことが正しいのかがちょっと確信持てませんが…)。これを[2]とします。

 1584 2745 3695 4300 4598 4301 3668 2754 1594
 2735 3890 4561 5532 6039 5525 4578 3922 2746
 3678 4605 5399 6763 6706 6754 5334 4583 3663
 4272 5503 6705 7787 7231 7720 6611 5479 4303
 4623 5987 6656 7232 7764 7128 6517 5946 4598
 4308 5513 6673 7657 7236 7645 6586 5511 4306
 3756 4626 5447 6669 6662 6638 5312 4612 3694
 2820 3924 4578 5491 5972 5544 4613 3944 2766
 1609 2763 3694 4276 4583 4272 3667 2726 1592

それぞれの座標で、[2]/[1]*100したのがこちら。

  97  99 102  98 102  98 101  99  98
  98  96 101 100  99 100 102  97  99
 101 102 102 102 102 101 101 102 101
  98 100 101  97 104  96  99 100  98
 103  98 102 104  98 103 100  97 102
  99 100 100  95 104  95  99 100  98
 104 103 103 100 102 100 100 102 102
 101  97 102 100  97 101 102  98  99
  99  99 102  98 102  98 101  98  98

ほんの少しだけ、それっぽい傾向が見受けられるような気もしますが、まあこれぐらいならぜんぜんOKでしょうかね? とりあえずは気にしないことにします。

[追記 2018/5/25]
「white shadeの棋譜をRayに添削してもらって、悪手っぽいところの前後を学習データに追加して、それをもう一度学習する」ってやり方で、いきなりGNU Goに1局平均10目ぐらい勝てるようになったのですが、それってそれなりの棋力がないとできないはずだと思って実際に棋譜を眺めてみても、そこまで強そうには見えません。どうも、最後にねちねちやられてGNU Goが自爆していることが、ちょくちょくあるからみたいです。手法自体はかなり有効そうなので、目標を「1局平均20目」に変更して、現在、二周目やってます。

[追記 2018/8/29]
ブラウザで対局できるようにしてみました。続きの記事をどうぞ。

クライアントサイド版COSUMIを作ってみました
http://www.perfectsky.net/blog/?p=402

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる その2

このブログ記事は、以前書いた記事の続きです。できれば、まずはそちらをお読みください。

Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる
http://www.perfectsky.net/blog/?p=350

ずいぶん長い間ほったらかしにしていたのですが、そろそろ自分でも、囲碁の思考エンジンを作ってみたいと思い、ここ最近、久しぶりに以前作っていたディープラーニングな評価関数の作成の続きをやっています。

ただ、思いつくことはある程度、前回の時に試していたこともあって、ほとんどの試行はたいした改良に繋がらないのですが、その中で唯一、非常に大きく数字が改善したのが、Squeeze-and-Excitation Networks(SENet)というやつです。

[1709.01507] Squeeze-and-Excitation Networks
https://arxiv.org/abs/1709.01507

このモデルがどのようなものかを解説するのは、私にはちょっと難しいので、詳しくはリンク先を読んでいただくとして、以下簡単に、私が試してみたテスト内容とその結果を書いてみたいと思います。

現在、最終的にはクライアントサイドで思考エンジンが動くウェブアプリの制作を目標にしていて、その関係もあって、とりあえず今回は9路盤です。データの作成方法などは前回とほぼ一緒。対称形に8倍して切りの良い数字にまで少し減らして、230万局面分。95%を学習用に、5%を検証用に使います。

NNのモデルは、基本的に、前回の最後の方で使っていた普通のResNetみたいなのが性能良いのでは、と思っているのですが、今回は非力なスマホなどでも動かしたいので、できるだけ小さなモデルにしなければいけません。特に、パラメータ数は、モデルのファイルサイズになってネットワークの転送量とかにまで影響してくるので、少ないにこしたことはないように思います。ということで、Residual Block内は1×1 -> 3×3 -> 1×1のいわゆるBottleneckアーキテクチャにしました。そもそも、たかだか19×19の囲碁で、3×3のConvが30も50も重なるのって、なんかおかしいような気が以前からしていて、なんというか、そんな遠くの場所よりも、まずはもっと近いところとの関係をよく見ないといけないのではと、つい思ってしまうんですよね… 9路盤なんか、たった4つの3×3のConvで、天元のところにすべての座標の入力の情報が来るわけで、そういう意味でも、3×3を一定量1×1に置き換えるのは、理にかなっているような気がしています。「5×5は3×3が2つの方が良いように、3×3はdepthwiseとpointwiseに分けたほうが良い」みたいなことを言われてしまうと、確かに3×3のConvはちょっと大きすぎですよね… 囲碁だったら、四隅の欠けた3×3の、「十字型」なんかどうなんでしょうか?

ってすみません。話がそれてしまいました。元に戻って今回のNNのモデルですが、前回からの変更点としてもうひとつ、入力層の所でまず、周囲をゼロパディングして、9×9だったフィールドを13×13に広げています。これはパラメータ増やさず、ロスを下げます。やっぱり9×9って小さすぎるんですよね、ってまた似たような話に…(笑)

入力は、「手番のプレーヤーの石の配置」、「相手の石の配置」、「コウで打てない場所」、「全部1」の4面(9,9,4)です。最後の「全部1」と、先ほどの入力層でのゼロパディングで、盤上/盤外を表現したつもりです。

その他の条件は、だいたい前回と同じかな?

コードはこんな感じ。まずは「SENetなし」。

BOARD_SIZE = 9
FIELD_SIZE = 13


def rn_block(input):

    relu_1 = Activation("relu")(input)
    bn_1   = BatchNormalization()(relu_1)
    conv_1 = Conv2D(32, (1, 1))(bn_1)

    relu_2 = Activation("relu")(conv_1)
    bn_2   = BatchNormalization()(relu_2)
    conv_2 = Conv2D(32, (3, 3), padding='same')(bn_2)

    relu_3 = Activation("relu")(conv_2)
    bn_3   = BatchNormalization()(relu_3)
    conv_3 = Conv2D(128, (1, 1))(bn_3)

    return conv_3


input = Input(shape=x_train.shape[1:])

main    = ZeroPadding2D(padding=(int((FIELD_SIZE-BOARD_SIZE)/2), int((FIELD_SIZE-BOARD_SIZE)/2)))(input)
rn_fork = Conv2D(128, (3, 3), padding='same')(main)

main    = rn_block(rn_fork)

rn_fork = add([main, rn_fork])

main    = rn_block(rn_fork)

rn_fork = add([main, rn_fork])

main    = rn_block(rn_fork)

rn_fork = add([main, rn_fork])

main    = rn_block(rn_fork)

rn_fork = add([main, rn_fork])

main    = rn_block(rn_fork)

rn_fork = add([main, rn_fork])

main    = rn_block(rn_fork)

main    = add([main, rn_fork])

main    = Activation("relu")(main)
main    = BatchNormalization()(main)
main    = Conv2D(1, (3, 3), padding='valid')(main)
main    = AveragePooling2D(pool_size=(FIELD_SIZE-2, FIELD_SIZE-2))(main)

output  = Flatten()(main)

そして「SENetあり」。

BOARD_SIZE = 9
FIELD_SIZE = 13


def rn_block(input):

    relu_1 = Activation("relu")(input)
    bn_1   = BatchNormalization()(relu_1)
    conv_1 = Conv2D(32, (1, 1))(bn_1)

    relu_2 = Activation("relu")(conv_1)
    bn_2   = BatchNormalization()(relu_2)
    conv_2 = Conv2D(32, (3, 3), padding='same')(bn_2)

    relu_3 = Activation("relu")(conv_2)
    bn_3   = BatchNormalization()(relu_3)
    conv_3 = Conv2D(128, (1, 1))(bn_3)

    return conv_3


def se_block(input):

    ap      = AveragePooling2D(pool_size=(FIELD_SIZE, FIELD_SIZE))(input)
    conv_1  = Conv2D(8, (1, 1))(ap)
    relu    = Activation("relu")(conv_1)
    conv_2  = Conv2D(128, (1, 1))(relu)
    sigmoid = Activation("sigmoid")(conv_2)
    us      = UpSampling2D(size=(FIELD_SIZE, FIELD_SIZE))(sigmoid)

    return us


main    = ZeroPadding2D(padding=(int((FIELD_SIZE-BOARD_SIZE)/2), int((FIELD_SIZE-BOARD_SIZE)/2)))(input)
rn_fork = Conv2D(128, (3, 3), padding='same')(main)

#main    = rn_block(rn_fork)
se_fork = rn_block(rn_fork)
se_out  = se_block(se_fork)
main    = multiply([se_fork, se_out])

rn_fork = add([main, rn_fork])

#main    = rn_block(rn_fork)
se_fork = rn_block(rn_fork)
se_out  = se_block(se_fork)
main    = multiply([se_fork, se_out])

rn_fork = add([main, rn_fork])

#main    = rn_block(rn_fork)
se_fork = rn_block(rn_fork)
se_out  = se_block(se_fork)
main    = multiply([se_fork, se_out])

rn_fork = add([main, rn_fork])

#main    = rn_block(rn_fork)
se_fork = rn_block(rn_fork)
se_out  = se_block(se_fork)
main    = multiply([se_fork, se_out])

rn_fork = add([main, rn_fork])

#main    = rn_block(rn_fork)
se_fork = rn_block(rn_fork)
se_out  = se_block(se_fork)
main    = multiply([se_fork, se_out])

rn_fork = add([main, rn_fork])

#main    = rn_block(rn_fork)
se_fork = rn_block(rn_fork)
se_out  = se_block(se_fork)
main    = multiply([se_fork, se_out])

main    = add([main, rn_fork])

main    = Activation("relu")(main)
main    = BatchNormalization()(main)
main    = Conv2D(1, (3, 3), padding='valid')(main)
main    = AveragePooling2D(pool_size=(FIELD_SIZE-2, FIELD_SIZE-2))(main)

output  = Flatten()(main)

「SENetなし」はResidual Blockが6つと7つの2種類、「SENetあり」はResidual Blockが6つの、計3種類をテストしてグラフにしてみました。

「SENetなし/Residual Block 7つ」と「SENetあり」は、パラメータ数、予測に掛かる時間、1エポックあたりの学習時間などがそれほどは大きく変わらず、それでいてこのロスの差なので、すばらしいです。ILSVRC2017チャンプは伊達ではない(笑)。しばらく忙しいのですぐには無理そうですが、いずれこいつを使って一手全幅君を作ってみたいと思います。

[追記 2018/4/4]
現在使用している学習データのラベルは、Rayに付けてもらったものですが、それをそのデータを学習したDNNで付け替えて、もう一度最初から学習し直したらどうなるのか、試してみました。

学習する局面は上と同じ230万局面分。95%を学習用、5%を検証用に。ネットワーク構成も上のSENetありと基本的に同じで、10 res-blockです。今回の複数のテストでの唯一の違いは学習データのラベルで、まずは次の3種類、

  • [1] Train/ValidateともRayが付けたもの
  • [2] Trainを[1]の50エポック目のDNNが付け、ValidateはRayが付けたもの
  • [3] Train/Validateとも[1]の50エポック目のDNNが付けたもの

です。[3][2]とTrainのラベルが同じなので、Validateだけ調べれば良かったのですが、実際にやってみると、想像以上に低い数字が出て来て自分の書いたコードが信用できなくなり(笑)、念のために、いつもと同じように最初から学習回しながら、Validateを計測してみました(どうやら、自分の書いたコードは合ってたみたい…)。乱数の加減も今回はあまり関係無かったようで、赤の実線は緑の実線にきれいに隠れていますが、そこにあります(一応、少し太くしておいた(笑))。

正直、驚きの結果です。DNNに予測させるのは、Rayにラベルを付けてもらうより、遥かにコストが掛かからないので、「もし、DNNが付けたラベルでそれなりに学習できたら、データの水増しが可能になるかも」ぐらいに思っていたのですが、ばっさりと全部差し替えても全く問題なさそうですし、グラフ見ているだけでははっきりしませんが、囲碁の神様が付けたラベルに対して、[1]より[2]/[3]の方が性能が高い可能性までありそうに見えます。しかし、そんなうまい話本当にあるのかなあ? どうも信じられないのですが…

以前にも書きましたが、同じ局面の対称形をDNNで予測させると、結構ばらばらな数字を返してくるので、

  • [4] Trainを[1]の50エポック目のDNNが予測した8対称形すべての平均にして、ValidateはRayが付けたもの

もテストしてみました。

このブログには書いていませんが、以前Trainのラベルに平均0の乱数を混ぜて学習させてみたことがあったのですが、その時も意外とValidateの数字が大きく悪くはなったりせず(もちろんTrainはノイズの分がっつり悪くなります)、たくさんのデータで鍛えるとそんなものなんだなあと思ったことがあったのですが、今回の[2]は、[4]に平均0の乱数を混ぜたようなものなので、似たような結果と言えるでしょうか、ってじゃあやっぱり精度の高い予測が欲しい時は、平均とって使った方が良さそうですね。うーん、めんどくさ…

[追記 2018/4/30]
続きの記事があります。

囲碁の思考エンジンを作ってみる
http://www.perfectsky.net/blog/?p=389

1回60秒の英単語テストを作ってみました

2018.01.18  |  ウェブ制作  |  Comments (1)

1回60秒で行う、英単語のテストを作ってみました

六十秒英単語テスト
https://www.60byo.net/

順に出題される単語の意味を、3つの選択肢の中から選んでいくという、よくあるタイプのテストなんですが、正答率ではなく、60秒の間に何回正解できるかを競うところがちょっと変わっていて、もし回答が不正解だったら、3秒間停止して次の問題に進めないようになっています。「正答率だけではなく、回答に掛かった時間も考慮すれば、もっと正確に(高速に)能力が評価できるのでは?」という発想で作ってみました。紙ではできない仕様で、ここはうまくいっているのではと思っています。よかったらぜひ一度、挑戦してみてください。ある程度データが集まったら、テスト結果が上位何パーセントに入るのかとかも、表示させたいと思っています。

このウェブアプリ、作り始めたのはもう2年ぐらい前(もっと前かも?)のことで、おおまかな所はかなりあっさりと制作できたのですが、一番最後にやり始めた肝心の問題の作成がもうめちゃくちゃに大変で、こんなに時間が掛かってしました(というより、こんなのやってられないと途中で何回もぼつにしようとしたんですが…)。信じられないかもしれませんが、のべ数百時間は掛かっています…(泣) いやもう、自分が一番信じられません。本当に馬鹿じゃないのか…

そして、その問題の作成なんですが、かなりいろいろなことを考慮しながら行いましたので、結構気持ちよく回答していけるのではないかなと思います。そのあたりのことも、ここで書こうかと思ったんですが、もういいや。めんどくさい(笑)。

実は今、苔の画像を見て種類を判別するウェブアプリを作っているのですが、今回みたいなことにならないように、とりあえずの性能で良いので、さっさとリリースするようにします。いや本当に、Done is better than perfect. って良い言葉だと思うよ…

[追記 2018/2/7]
テスト結果が上位何パーセントに位置するのかを、表示するようにしてみました。一応、すべての問題を7秒以内に答えた時のみに限定して、テストの途中で諦めてしまったケースなどを、ある程度除外してあります。データがもっと集まれば、再度数字をアップデートする予定ですが、とりあえず今現在、36問正解で上位10%、40問正解で上位5%、45問正解で上位1%に入れるようです。最高記録は48問正解。なかなかすごいですね。問題作った私ですら、これは簡単ではないです。

[追記 2018/4/25]
テスト結果が上位何パーセントに位置するのかのデータを、アップデートしました。37問正解で上位10%、40問正解で上位5%、47問正解で上位1%に入れるようです。最高記録は52問正解でお一人だけ。これは本当にすばらしい反射神経だと思います(笑)。

[追記 2018/8/25]
テスト結果が上位何パーセントに位置するのかのデータを、再度アップデートしました。36問正解で上位10%、41問正解で上位5%、48問正解で上位1%に入れるようです。最高記録は54問正解だそうです…

COSUMIを常時SSL化しました

COSUMIにSSLを導入して、トップページからなにからすべて、暗号化するようにしました。

囲碁ブラウザゲーム COSUMI
http://www.cosumi.net/
https://www.cosumi.net/

大変申し訳ないのですが、チャレンジモードの段級位とか、1/2 ClickやサウンドOn/Offの設定が引き継がれません(引き継ぐための細工をしていません)。チャレンジモードに関しては、代わりにといってはなんですが、最初の連勝中は一級まで2ランクずつ上がっていけるようにしましたので、それでご容赦願います。それから、今回SSL 3.0は切りましたので、極端に古い環境からは、ページの閲覧が一切できなくなっていると思います。

httpからhttpsへリダイレクトされるように設定してあるので、以前張っていただいたリンクなどは、もうそのままで全然問題ないのですが、もし可能であれば、今後はhttpsなURLを使っていただけるとうれしいです。

COSUMIのFlash版を廃止します

来年の5月で、COSUMIはなんと10周年を迎えることになるのですが、そのあたりのタイミングで、「Flash版がメインでHTML5版がサブ」っていう感じの現状を、「HTML5版がメインでFlash版がサブ」っていう感じに変更しようかなあと、少し前から考えていました。ところが先日、Flashが2020年に廃止されるというニュースを聞いた時に、その変更を行うのは、もう今すぐにでも良いのかもと思い始め、さらにその後いろいろ考えているうちに、あまり段階を踏まずに、すっぱりFlash版を無くす方がいいのかも、という気になってきています。

囲碁ブラウザゲーム COSUMI
http://www.cosumi.net/

Flash版はいずれ廃止しなければいけなくなりますし、結局のところ、問題はそのタイミングだけなんですが、まだ最終決定ではないですが、おそらく今年の10月末ぐらいまでには、Flash版は廃止することになると思います。正式に決定したら、また事前に通知します。

Flash版を廃止するのを今まで躊躇していた理由は、主に次の二つかなと思います。

一つ目は、「HTML5版が全く動かない環境があるから」です。そんな環境っていうのは、ずばり古いIEなんですが(と言っても、現時点で、実際にどのバージョンが動かないのかよく分かってないですが…(笑))、これは最近調べてびっくりしたのですが、現在すでに、IE10以下って基本的にベンダがサポートしていないんですね… ベンダがサポートしていない環境を、COSUMIでサポートしなきゃいけない義理はないので(笑)、これはもう大丈夫そうです。

そして二つ目は、「HTML5版では音がきちんと再生されない環境があるから」です。実は、最初にHTML5版を作った時に(これ、もう5年前なのか…)、audio要素を使用してサウンドも鳴るようにコード書いたのですが、環境によって鳴ったり鳴らなかったり、それもいろいろな形でおかしなことになったんですよね。iOSなどは、そもそも仕様が本当にふざけてますし…(これ今もなんでしょうか?) そんなこんなで、その時は匙を投げたのですが、これから試してみないとはっきりとは分かりませんが、今は状況も少しはましになっているんでしょうし、なんとか最低限の形にはなりそうな気がするので、これもたぶん大丈夫だと思います。MP3だってもう使って良いですかね? いろいろ、昔とは違ってきているのではないかなと期待しています。

実は、自分の中でCOSUMIを作り始めた瞬間となっているのは、ネットで買ったFlash Basic 8のパッケージを開けた時なんですよね… 「Flash版はもっと早く廃止したかった」とも思っていますが、実際に無くすとなると、寂しい気持ちが全くないわけではありません。

– – – – – – –

ブログのコメントが簡単にスパム判定されるのは、まだ直ってないですね… ごめんなさい。WP-SpamShieldっていうプラグイン使っているのですが、Akismetの方がいいのかなあ?

[追記 2017/8/13]
Flash版を廃止するのは、少し急なのですが、8月27日と決定しました。廃止するに当たって、手を動かさなければいけないことがいろいろあったですが、一旦やり始めてみると、なんかあっと言う間にほとんど出来てしまいました。そして、そんな作業の中で、Flash版を残して続けていた弊害に、今更ながら気づくことも多くて、もう善は急げで今月中に廃止してしまうことにしました。こまごまとした、いくつかの機能追加もあるので、ほとんどの方には良い変更になると思います。そして、ごく一部の方には、ぼろくそに文句言われそうです…(笑) 毎日、万の単位の人に遊んでもらっているので、結構勇気は要りますね。

「現在のFlash版ページ(例えばhttp://www.cosumi.net/play.html)がHTML5版となり、現在のHTML5版ページ(例えばhttp://www.cosumi.net/mobile/play.html)へのアクセスはそのページにリダイレクトする」って形で行きます。Flashじゃなくなったことに気づかない人も、たくさんいるかもしれません。

ちなみに、サウンド関係はhowler.jsっていうので一発でした。良い時代ですね。

[追記 2017/8/28]
Flash版を廃止しました。それ以外にも、外から見える所も、見えない所も、結構な量、手を入れましたので、なにかやらかしていないか、かなり不安ですが、とりあえず大丈夫かな? 音も出ます。前からやりたかった、チャレンジモードの秒読みも再生されます。

今回、「今後5年間、戦えるように」と考えながら作業していたのですが、その中で、今はまだできていないけれど、これだけはすぐにでもやらないといけないかなと思ったことがひとつだけあって、それはSSLの導入です。はっきり言って、COSUMIはそんな(どんな?)サイトじゃないので、今までSSL無しだったのは、まあ良いと思います。COSUMIエゴサーチが日課の私ですが(笑)、いまだかつてそのことについての指摘を見たことは一度もないですし、ユーザの肌感覚とも合っていたんだと思います。ただ、常時SSLなどということが、これだけ言われるようになっている2017年現在は、SSLってみるのにちょうど良いタイミングな気がするので、時間見つけて一度勉強してみます。たぶんですが、お金はたいしたことなさそうです。SSLサーバー証明書は、例えばさくらのラピッドSSLなら、3年で税込み3,456円だそうで、これならほとんどただみたいなものだし、サーバリソースも、年数千円レベルしか余分に食わないんじゃないかなあ? 桁が違ってたら、ちょっといやですが…

[追記 2017/9/2]
今回初めて、oggとかmp3とかのファイルを用意することになったのですが、stagefrightという文字列の入ったUser agentの行儀が非常に悪くて、繰り返し、繰り返し、同じ音声ファイルを取りに来ます。おそらく、この方とかこの方とかの言っていることと、問題の種類は同じではないかと思いますが、意外と情報少ないですね。Androidのバージョンとしては、4.4.2とか4.2.2とかあたりが多いです。他のサウンドよりも圧倒的に石音のサウンドへのアクセスが多いところから(2番目は、どこかのボタンをクリックしたときのサウンド)、音を鳴らすたびに取りに来ているのかなあと推測しますが、はっきりとは分かりません。結構うざいのですが、下手に弾くのも怖いので、もうこやつらが絶滅するのを待つほか無いのでしょうか…

後、エゴサしていたら、ちょっと嫌なのを発見。ぱっとは理由が分かりませんが、とにかくこちらの問題でないことを、祈るばかり… しかし報酬 1500円って、COSUMIのためだけにいいのであろうか…(笑)