ここしばらく体調があまりよくないままだったが、月曜にきついくらい頭痛くなったので火曜は一日休んで回復した。 それでもとても眠いのは陽気のせいだろう。
あと何か書こうと思ったが何も書くことがなかった。平和である。
いや忘れてただけで書くことはあったな。 イヤホンが断線しかかったので買いにいって失敗したとか。 使ってたやつは5000円くらいしたのにさっさとダメにしちゃうし音の違いとかさっぱり分からんので安いやつでいいやと1500円のにしたんだが、左右のケーブル長が同じタイプのやつだった。左右のケーブル長が違うのがいいからSONYのを買ってたんだが安い奴だと同じだったりするようだ。 そういや以前も安いの買おうとしたんだけど長さ違うのがなかったから逆に奮発してちょっと高めのにしてたんだった。
仕方ないので左側のケーブルをテープでまとめてみたところそんなに邪魔でもなかったので、とりあえずこれで使うことにしよう。今度はちゃんと確認して買ってこよう。
gemでRubyインタプリタ切り替えできたらBundlerで管理できたら便利じゃね!とかどうしようもないことを考えてみたが、rvmとかってそういう物なんじゃねと思った。 ら、rbenvがプロジェクト単位でのRuby環境切り替え的なことができると教えてもらった。
だが残念ながらrvmもrbenvもWindowsでは動かねーんだよなぁと、おとなしくpik使うことにしたんだが、pikはいかんせんもうメンテされてない様子だ。さらに言えば普段msys使ってるのにpikはcmd.exe前提っぽかったので少なくとも俺の環境ではあまり使い物にならないようだ。うがー。
しかしふとmsysでrbenvとかrvmが動くんじゃねーかと思った。Ruby環境の切り替えがOSべったりになる部分もそうないだろうからシェルスクリプトとかで構成されてんだろー?といじってみたんだが、動きそうで動かないところまではいった。
rbenvを使ってみるとインストールと切り替えまではちょっぴりいじりながらも1動きはしたんだが、起動するところで原因不明なシェルスクリプトのエラーが出てしまった。スクリプトを見る限りでは特におかしそうなところはないので、msysのbashが古いんじゃないかなぁと思い当たって諦めた。
rvmはどうかとインストールしようとしてみると、しょっぱなからbashのバージョン古いから無理だわーとエラーを吐かれてしまった。親切である。
msysのbashは新しくならんのかなぁと探しに行ってみたけど少なくともバイナリでは配布してないようだ。ビルドするのも大変かもなーと諦めてしまったが、気合いがある人だったらなんとかできたかもしれない。気合いのある人よろしくおねがいします。
たぶんcygwinならなんとかなるんだろうが、そんなん使うくらいなら最初からOSX使うなりVMにLinuxとか入れるわ。
ruby.exeとかいう名前のシェルスクリプトが作られたりしたのをなんとかした ↩
クライアント側を作った。CSSはつくづくクソ仕様だなと思いながら格闘するだけでできる。 といってもこれがすごい大変なんだが。 IEの開発者ツールで調べようとしても明らかにバグってて、クリックして選択ツールが動いたり動かなかったりするし。
JavaScript自体はそんなに嫌いでもないんだが、なんで動かないんだろうと思ったらブラウザがキャッシュから読み込んでしれっとデバッグできているあたりは殺意を覚える。IEの開発者ツールで読み込んでるjsファイルの中身見る方法がわからなかったせいなんだが。普段何気なく使ってるOperaの開発者ツールは出来がよろしかったようで。
bootstrapのpopoverの使い方がソースを見ないとさっぱりわからなかったのと、 select/optionタグの中には画像がつっこめないという悲しい事実を知って自前でドロップダウンボックスを作った以外は至って普通だった。
カードの柄も仮ながらも見られる程度には描いて、クライアント側はそこそこ出来たのでサーバ側の詰めをしないとな。
役の成立を検出して点数つけてやらないといけないんだけどこれがめんどい。 基本的には8枚中3・3・2枚ずつ同じカードを揃えるだけなんだけど地味に判別めんどいな。
正規表現を使えばできそうな気がするんだが1、カード列は文字列じゃなくてオブジェクト列だ。正規表現みたいなのとしてPEGてのがあってこれのパーサジェネレータ使えればいいんだけど、作ったPEGのパーサも軒並み文字列を入力に受け付ける。PEGは前もって字句解析しなくていいってのが特徴らしいが違うんだよ!しなくていいからといって文字列しか入力しちゃいけないというわけでもあるまい。
オブジェクト列に対してパターンマッチングて便利だと思うんだけどそういうライブラリが見つからなくて不思議。 だがパターンマッチングで調べてたらF#がやたらと出てくるのでF#使えばよさそうだ。
F#はちょっと前にほんのちょっと触った程度ですっかり忘れている上に、 そもそもパターンマッチはやったことなかったので何を使えばいいのかわからずそこそこ苦労したが、 最終的に型定義など諸々込みで40行程度でできた。
判別共用体て何に使うんだろうと思ってたけどなんだかよくわからんが完成した時には使ってた。 コンパイル時列挙体みたいな雰囲気に見える。文法的にもそんな感じだ。
出来たけどカード列はCard型のリストを受け取るようにしちゃったのでC#から使うのはこれまためんどくさそうだなぁ。
調べてみるとF#でList.ofSeq
を使うとseq
型からリストを作れるようだ。そしてF#でのset<T>
型は.NETでのIEnumerable<T>
型そのものなようなので、F#側でset<Card>
を受け取って中でリストを作り、C#からはIEnumerable<Card>
のオブジェクトを渡すだけで済んだ。C#とのやりとりはset<T>
をよく使うようにするのがよさそうだね。
残りはランキングとトランザクションか。ランキングはワーカーロールを使って適当な間隔で回すつもりだったのでそれを作った。順位付けって地味に難しいんですけど!と悩んだが、難しいことは考えずに普通にやるのが一番楽だった。点数順にソートしてループして順位づけていく形になった。
1分毎に順位付けを回すようにしたけどちゃんと1分毎に動いてるか、負荷は大丈夫かなど謎。まあ1分毎には動くだろうけど。 あとちゃんとやるならワーカーで順位更新したことをフロントエンドに教えてあげてクライアントにまで伝達したいところだがめんどくさいからいいか。
ランキングページを作らないといけないような気もするがそれは置いておいて、トランザクション処理をするとサーバ側もだいたい完成だ。 Azure Storage Tableのトランザクション処理はExecuteBatchを使ってバッチ化するとアトミックに実行してくれるという話だったはず、と思って調べてみるもあまりはっきりしない。最終的にはREST APIのドキュメントを見てアトミックに実行するよと明記されていたので納得したんだが、.NET側のAPIは結局REST APIのラッパだからなのか詳しいドキュメントがなくて調べるのに苦労するぜ。
ただCloudTable.ExecuteBatch
の戻り値がTableResult
のリストだったりして不安になる。失敗したらちゃんと全部失敗するんだろうなぁ?だとしたら個別の結果返してくることもないんじゃないの?と不安になることこのうえなし。たぶん大丈夫だとは思うけどやってみないことにはわからんか。
土日はこのへんまで。あと三週間、いや二週間しかないがちゃんとできるかなぁ。動き的にはだいたい出来たから大丈夫だと思うが見た目と内容と負荷なんかが不安ですな。
あとで気付いたけど正規表現でも任意の同じカード3枚をマッチさせるのって難しくね? ↩