anti scroll

ブラウザと小説の新しい関係を模索する

OCaml用の麻雀ライブラリ

フォルダ整理していたら、二年ほど前に書いたOCaml用の麻雀ライブラリが発掘されました。

しまっておくのも無駄だし、バックアップも兼ねてgithubに上げておくことに…

https://github.com/tategakibunko/ocaml-mjlib

一応、ゲームやプレイヤーなども含めて抽象化されている(っぽいけど忘れた)。

ちゃんとユニットテストも付いてるから、それなりに動くんだと思います。

縦書き文庫では、ろくにテストもせずに上げ、苦情ドリブンで対応する僕ですが(個人的にソーシャルデバッグと呼んでいる)、 こういうロジック系のライブラリでは流石にユニットテストぐらいは書きます。

ちょい見る限り、どこか抜けはあるかもしれませんが、日本ルールの役は一通り得点計算できてる(はず)。

ちなみに、よくブログ記事で麻雀の処理を書いてみた、みたいなので、アマタ、シュンツ、コーツをパースして「はい、おしまい」みたいな人をよく見かけますけど、それって麻雀全体の得点計算ロジックの1割にも満たない部分ですからね。

というのも、麻雀って、手元にある14牌の状態だけで判断できる役とか得点なんて殆どないのです…

得点を正しく計算しようと思ったら、とにかく色々なコンテキストを検証する必要があるので。

まずそもそも手元の14牌だって、最後の一枚がツモなのかロンなのかってので区別する必要がありますよね。

ツモかつ喰いがなければ「ツモ」なる役が付くわけですし。

さらにプレイヤー同士の席順で判断する必要のある役とか点とかルールもあるから(リーチ一発とか、ダブロンとか、チーはカミチャだけとか)プレイヤーを抽象化する必要もあるし。

面子だって、鳴かれたものなのかどうかで府の計算も変わるし、役の扱いも変わってくるし(じゃなきゃ、ただのトイトイがスーアンコになってしまう)。

また上がる前の「待ち」がどうだったかによって付く役と付かない役とか符もある。

リャンメン待ちじゃなけりゃピンフにならないし。

リャンメンじゃないならないで、そういう場合は待ちには符がついて得点が変わるし。

また場風で決まる役もあるから(風牌とかダブトン、ダブナンとか)、ゲームの進行状況も抽象化しないと正しい得点計算が出来ない。

他にも裏ドラとかリンシャンとかハイテイとかチョンボとか…まあ色々です。

とにかくゲームの状況(コンテキスト)で決まるものが多すぎるので、必然的に色々なものを抱え込んで抽象する必要があるわけです。

例えばカレンダーを扱うライブラリだってそうですよね。

単に暦とか言ったって、見る観点が色々とあるので。

時間として扱うのか、日付として扱うのか、それともある日付を基準として数えた現在までの秒数として扱うのか。表示フォーマットだって、国ごとに色々あります。

麻雀ライブラリもそういう感じです。

ちなみに麻雀ゲームは過去に色々な言語で作ったことがあるのですが(個人的な趣味です)、 一番楽に書けたのはOCamlだったと思います。

過去の組み合わせは、サーバー/クライアントの組み合わせで

とかです。

まあ経験値が上がったぶん、最新のものが楽になってるのは当然かもしれないですけど。

これ以外には、Haskellの自習用で作った簡易麻雀ライブラリ(hml)もありますが、HaskellOCamlと同じぐらい書きやすかったかもです(特にShowって型クラスが便利だった)。

ちなみにこのライブラリ、最近になって妙にforkされているのですけど、Haskellの手習いとして作ったものなので純粋にヘタクソだし、そもそも大きな山の一割ぐらいしか上っていないので「いいんかな?」という感じです。

外部の埋め込み作品に独自のスタイルを設定する方法

外部の埋め込み作品に、独自のスタイルを設定する方法を用意しました。

具体的には、作者が自前で用意したスタイルファイルを外部から読み込ませる形になります。

通常の埋め込みコード

まず通常の埋め込みコードですが(先頭部分だけ抜粋すると)こんな感じになっていると思います。

var TbThumb = {
  nid:2980,
  width:640,
  //width:"80%",
  height:480,
  fontSize:20
};

大きさの設定ぐらいは出来るけれども、それ以外の細かい設定はできませんでした。

そこで、こんな風にしてスタイル用のスクリプトを指定できるようにしてみました。

スタイルスクリプトを指定した埋め込みコード

var TbThumb = {
  theme:"http://yoursite/path/to/theme.js",
  nid:2980,
  width:640,
  //width:"80%",
  height:480,
  fontSize:20
};

新しく追加されているのは、

theme:"http://yoursite/path/to/theme.js",

の部分です。

"http://yoursite/path/to/theme.js" の部分はお使いのサーバーのURLに置き換えてください。

theme.jsの中身は例えばこんな風に書きます。

Nehan.setStyles({
  "body":{
    "font-size":"16px",
    "padding":{
        "start":"10px",
        "end":"10px"
    },
    "border-color":"wheat",
    "border-style":"solid",
    "border-width":"5px",
    "border-radius":"5px",
    "background-color":"wheat"
  }
});

このスタイルで埋め込んでみた結果

背景を変えて角を丸くしただけですが、再生すると普段とは違う表示になります。

注意事項

スタイルを設定する際にとりあえず覚えておいてほしい点を二つ上げておくと、

  • CSSプロパティはfont-sizeのようにハイフンを使った書き方になる点
  • margin/border/paddingなどを指定する方向として論理方向(start/end/before/after)を使っている点

です。

CSSのプロパティ名については、例えばfont-sizeのことをfontSizeのようには書けない、ということです。

論理方向については、日本語の縦書き(tb-rl)ならstart/endが上と下、before/afterが右と左、とでも覚えておいてください。

より具体的なスタイルスクリプトの書き方

興味のある人はhttp://tategakibunko.github.io/nehan.js/を参照してください。

nehan.js version5 を試験運用中

今週から縦書き文庫やauto-machicなどで、nehan.js version5系列(ベータ版)を試験的に運用しています。

nehan-readerもversion5をのせてver0.7.6を公開しました。

ということで、しばらくは何かしら表示上の問題があるかもしれないです。

ちなみにversion5以降は、IE8以下のテストはしていません。

おそらく動くとは思いますが、テストをしないのですから、事実上のサポート打ち切りと言ってもいいでしょう。合掌……!

はじめて評価をもらった件

GoogleChrome拡張のNehan Readerですが、初めて評価をもらいました。星五つ! 嬉しいですね。

中国語なので内容はよくわかりませんが、英語の閲覧はともかく日本語の閲覧には便利だ、みたいなことだと思います。

縦書き文庫のURLが変わります

新しいURLは http://tb.antiscroll.com です。

いつまでもフリーのダイナミックDNSというのもなんですし、本当はもっと早く独自ドメインを取るべきでした。

独自ドメインについては、最初はtategakibunkoっていうのも考えたのですが、ちょっと長いし応用もきかないような気がしたので、このブログのタイトルと同じ名前をドメイン名にしました。

というわけで、今後はサービスをサブドメインでわけて、

auto-machic: http://am.antiscroll.com

縦書き文庫: http://tb.antiscroll.com

となります。

ただ、古いURLでも当分はアクセスできるようにしておくつもりです。