なんだか、Emacsのキーバインドが使えた。
テーマをGrAppleにしたからかな?
あれ?設定いじったんだっけか?
まあ、いいんだけどさ。
OSX用に最適化したっていうバージョンも入れてあるけど、関係あるかな?
なんだか、Emacsのキーバインドが使えた。
テーマをGrAppleにしたからかな?
あれ?設定いじったんだっけか?
まあ、いいんだけどさ。
OSX用に最適化したっていうバージョンも入れてあるけど、関係あるかな?
メソッドの使い方が悪いだけかも?
{GET|POST|PUT|DELETE}での処理振り分けについてテストした際のログを見てみたら、GETだけ?で終わってた。
だから何だって事でもないんだけど、なんか気持ち悪い。
ソースを見てみても、パラメータがあろうが無かろうが強制的に?は付くような。深追いしてないので不明。
まあ、いいか。
ああ、path_infoでURL作ってみても、?付きになるわけか。でも、まあ、いいか。
このケース(?がつく)でまずい事ってありますか?
挑戦というか、それっぽく。
Zend_Controller_RewriteRouterのマニュアルを読んでいたら、URLからactionを隠せるし、事前に定義してパラメータを変数名無しでルーティング(?)出来るとの事なので、じゃあRESTfulな感じでいけるかな、と。
正しいアプローチかは怪しすぎながら、Zend_Controller_RewriteRouterを使ってみたかったのでとりあえず。
以下、index.php
<?php require_once realpath(dirname(__FILE__) . '/../conf/init.php'); require_once 'Zend/Controller/Front.php'; require_once 'Zend/Controller/RewriteRouter.php'; // setup route $router = new Zend_Controller_RewriteRouter(); $map = 'test/:var1/:var2'; $default = array( "var1" => 1, "var2" => "hoge", "controller" => "test", "action" => "index" ); $rule = array( "var1" => '\d+', "var2" => '\w+' ); $route = new Zend_Controller_Router_Route($map, $default, $rule); $router->addRoute("test", $route); // setup controller $ctrl = Zend_Controller_Front::getInstance(); $ctrl->setRouter($router); // run Zend_Controller_Front::run(SYSDIR . '/app/controllers'); ?>
マニュアルでは、Zend_Controller_RewriteRouter#addRouteの引数が文字列とか配列とかで渡せるっぽい書き方なんだけど、trunkから持って来たバージョンではZend_Controller_Router_Routeを通してオブジェクトとして渡さないと駄目みたい。この引数の順序は、マップ/デフォルト/フィルタ(それぞれ呼び方は自己流)。コントローラとアクションをデフォルトで設定しておかないとnoRouteになるっぽい。
以下、コントローラ。
<?php require_once dirname(__FILE__) . '/Test/Action.php'; require_once 'Restful/Router.php'; class TestController extends Zend_Controller_Action { public function indexAction() { $obj = new Test_Action($this->_getAllParams()); $router = new Restful_Router(); $router->register('get', array($obj, 'show')); $router->register('post', array($obj, 'create')); $router->register('put', array($obj, 'update')); $router->register('delete', array($obj, 'delete')); $router->routing(); } public function noRouteAction() { header('HTTP/1.x 404 Not Found'); exit; } } ?>
indexアクションで全て処理。Restful_RouterってのでHTTP_REQUEST_METHOD{GET|POST|PUT|DELETE}に従って関数を呼び出す。これは自作。関数呼び出しの登録に使っているTest_Actionは単純にプリントしてるだけ(パラメータのダンプもだけど)。
以下、Restful_RouterとTest_Action
<?php /** * Routing by HTTP Request Method {GET|POST|PUT|DELETE} * * @author Koshigoe <KoshigoeBushou@gmail.com> */ class Restful_Router_Exception extends Exception { } class Restful_Router { private $routingMap; public function __construct() { $this->routingMap = array( "get" => null, "post" => null, "put" => null, "delete" => null ); } /** * register routing map * * @param String $method {get, post, put, delete} * @param Mixed $obj routing function * @return Boolean */ public function register($method, $function) { if (!in_array($method, array_keys($this->routingMap))) { return false; } if (empty($function)) { return false; } if (is_array($function)) { if (count($function) < 2) { return false; } if (empty($function[0]) or empty($function[1])) { return false; } if (!is_object($function[0])) { return false; } $this->routingMap[$method] = array($function[0], strval($function[1])); } else { $this->routingMap[$method] = $function; } return true; } /** * routing */ public function routing() { if (empty($_SERVER["REQUEST_METHOD"])) { throw new Restful_Router_Exception("HTTP Method was empty."); } $method = strtolower($_SERVER["REQUEST_METHOD"]); if (!in_array($method, array_keys($this->routingMap))) { throw new Restful_Router_Exception("HTTP Method was invalid."); } if (empty($this->routingMap[$method])) { throw new Restful_Router_Exception("No route."); } $map = $this->routingMap[$method]; if (!is_array($map)) { $map(); } else { $obj = $map[0]; $fnc = $map[1]; $obj->$fnc(); } } } ?>
<?php class Test_Action { public function __construct($params) { $this->params = $params; } public function show() { echo "show"; echo "<pre>"; var_dump($this->params); echo "</pre>"; } public function create() { echo "create"; echo "<pre>"; var_dump($this->params); echo "</pre>"; } public function update() { echo "update"; echo "<pre>"; var_dump($this->params); echo "</pre>"; } public function delete() { echo "delete"; echo "<pre>"; var_dump($this->params); echo "</pre>"; } } ?>
ソースを貼ってはいるけど、これで何が出来るわけでもなく、これだけで動くわけでもなく。まあ、ZFでもURLをきれいに書けるようになってるね、と。ベースURLを設定して、サブディレクトリ以下でも正しくルーティング出来るようになったらしいけど、その辺は未確認。
ネタが無いので、アプリはなしです。
『第九回XML開発者の日』で、microformats対応がどうたらとあったので、ちょっと触ってみたくなりました。
使い方が分からず、どうしていいのか迷子中。操作系じゃなくて、運用面でね。
技術ネタはここで書き続けて、ほんわかネタをVOXで書いたらいいのかな。
人の記事を色々見て、妥当な線を探りましょうかね。
よく分からないけど、QotDってのは話題ふられてそれに答えて記事を書くのかな?それは何となく楽しそうかも。
前に見て10.4のままだったので今日まで気づかなかった。。。
アップル - Mac OS X - Leopard 先行プレビュー
Spacesって仮想デスクトップなのかな?
Core Animationは、Keynoteとか使ったら関係あるのかな。
Time Machineは聞いた事ある気がする。外付けHDDつないだら勝手にバックアップか。実は今家のmacはバックアップとって無いんだよね。コードはsvnでサーバにおいてあるけど。今までHDD系のトラブルって未経験。(目の保養に)お弁当HDD欲しいし、ちょうどいいかも。
あれ、あまり欲しくないかも。下手にバージョンあげると今使えてるアプリが駄目になったりするし、ね。けど、IntelMac使う事考えると、あげといた方が安心な気もする。どうしよう。まあ、CarbonEmacsが動けばいいんだけどね。家にいるときはPowerMac使うだろうし。
気がつけば今年もあと1ヶ月。いやー、MacBook購入に踏み切るときが迫ってきました。
Apple製品の『箱』って届くと興奮するよね?しません?
何度目になるか分から無いけど、AppleStore(web)で見積もりだけしてみた。
黒で、Memory{2G}/HDD{200GB}/アダプタ{DVI-VGA}に関して標準から変えてみたら、"¥229,570"。某茄子貰えたら無理してみようかな。。。
Leopardは2007年発売です。
アップル - Mac OS X - Leopard 先行プレビュー
次のモデルまで待つ方が良さそうだね。
いつの間にか、『第5章 Zend_Controller_RewriteRouter』がちゃんと書かれていた。
0.2.0が公開された的な話は知ってたけど、マニュアルはまだ更新されてないと思ってた。
Zend_Controller_RewriteRouterでは、Railsみたくパラメータのマッピング(?)が出来るみたいで、以前のようにURL中に名前と値がペアになった形でパラメータを埋め込む必要がなくなってるっぽい。/resource/:nameで定義して、/resource/hogeとしたら、$param["name"] = "hoge"ってことかな。
で、REST話に刺激されて、ZFでactionなしのURI作れるかな、と見てみた訳なんだけど、無理矢理やるなら、noRouteアクションで、リクエストメソッドを判断すれば出来る。けど、トークン処理とかの辺りでサブクラス作ってそれ使えば普通に出来るかも。
気になったんだけど、『Zend_Controller_RewriteRouterではmod_rewriteが不要になる』って話だったと思うんだけど、結局mod_rewrite使ってるよね?使わない?そもそも、mod_rewrite使わない訳じゃなかったのかな?
他の(PHP用の)フレームワークを知らないので何とも言えないんだけど、基礎部分はZFでいいかなと思ったりするこのごろ。ZFは補助ツールが(知らないだけかもだけど)無いので、ZFそのままで快適な開発体制を手に入れられる訳じゃない。けど、Zend Studioでも何でもいいから、補完的役割を果たす何かが出て来てくれると嬉しい。
フレームワーク自体のバージョン管理。アプリケーションコードのバージョン管理。テストツール関連。デプロイ関連。ビューテンプレート関連。データベースのマイグレーション。などなど。Rails使いから漏れ聞こえてくる良さげな機能があったらいいね。
これまで勉強のためにZFで2・3個WebAPI的な何かを作ってみた訳だけど、ZFのバージョン管理の仕組みを作ってなかったので、どうしたものか。Railsだとフリーズだかなんだかの仕組みがあるんだよね?zf/v?/とかにバージョンごとにおいて、configで使うバージョンを(include_path書き換えて)切り替える程度でいいかな?
ネタが見つかり次第、0.2.0でアプリ書いてみようと思います。
最近書いてたWebAPIとか今日聞いたREST話とかで、HTTP分かってないなと反省中。リクエストとレスポンスをちゃんと理解出来てないと駄目だね。path_infoで404(AllowEncodedSlashes)とか、リソース作成(201+Location)とか。
相変わらず打ち上げには参加せずですが、行ってきました。
第九回XML開発者の日
今回はメモをほとんど取ってないのでまとめは無し。きっと、はてなブックマークの/entryに議事録がアップされるでしょう。
microformats押しなのかと思ったら、そんな訳でもなくて、前半はREST。個人的に興味深かったのもREST話。
さて、きっと資料が後で(既に?)アップされると思うので、感想(っぽいダイジェスト?)だけ。
RESTのお話。まず、おさらいだけど、『リソースを表現するURIが大事』で、『変わらないURIがクールだよね』という事。それで、変わらないというか、変え難くする努力はどうしたらいいだろうか。
URIはクライアントに不透明であるべきで、ユーザーがURIを組み立てるとか駄目。リンクとかで表現出来るといいね。『"URI Template"』って注目かも(クエリパラメータをテンプレ化?よく分からなかった。OpenSearch関連らしいです)。
URIの長さ制限でRead(GET)を実現し難そうなら、まずPOSTでリソースを作って(201)、LocationでリソースURIを返そう。検索の際のクエリが長過ぎて、XML-RPCで実装しちゃいそうな場面も解決。『リソースを作ってから操作する』っていうのは目から鱗だった。
リソースとそのURIを基準とするアーキテクチャ(?)をROA(Resource Oriented Architecture)と呼んだりするらしい。SOA vs ROAとか。
リソースとURIは1対多になるよ。例えば、天気情報について考えると、『今日の天気』も『最新の天気』も一緒だよね。
ここまでが、山本陽平さんのお話。次は川村徹さんによる、Railsのお話。
どうやら、Railsは1.2から、よりRESTfulな設計思想(?)が反映されるらしい。そもそも、『URIに動詞(action)が入っていたのは間違いだった』という事らしい。で、{create, show, update, destroy}を{POST, GET, PUT, DELETE}と結びつけて、暗黙的なルーティング(?)をする事にするよ、と。で、コントローラはリソース名を表す、と。
リソースの形式(XMLとかJSONとか)をコンテントネゴシエーションで解決しましょう、と。Acceptヘッダ付きのリクエストをちゃんと解釈する、と。Content-Type付きリクエストから入力の形式の解決もするよ、と。
セッションもリソースだって考えるなら、最初にセッションリソースを作るってのもありかもね、と(色々ご意見あって、実際安全に使えるかはよく分かりませんでした)。
ウィザードをRESTで解決するにはどうしたらいいかな。
(途中終了とかで)無駄なリソースがたくさん出来るかもだけど、フレームワークとかで解決手段を持てば、最初の方法がREST的。
ここまで、川村徹さん。
ここから、xfyというXML(XSLT?)で記述されたアプリを動かすアプリケーションプラットフォームに関してのお話とか、Plaggerのお話、規格標準化に関するお話、microformatsに関するお話と続きました。
Plaggerで印象的だったのは、『Feedでデータを正規化している』『FeedはWebのStandard IO』『WebのUnix shell(pipe)』というお話。あと、skype。
microformatsについては、『みんなで使っていこう、盛り上げよう』的なお話で終わってしまった気がする。導入だったという事でしょうか。MTを使い続ける事を考えると、何かプラグインを入れないと無理。自分でタグ書いてどうにかしようっていう気力は無い。Wikiなんて、HTML書かないし、もっと無理?
そんなこんなな、xmldevday9でした。
さて、actionを書かなくて良いフレームワークを探そうか、PHPで。んー、さすがにそこまで割り切れる文化はないかもね。
SBSのタグって、xmldevday9でいいんですかね。xmldevday?
今日はRewriteMapについてお勉強。
よくわからないので、プログラムを使うprgについてテスト。勿論、プログラムはPHPで書く。
RewriteMapは.htaccessに書けないようなので、vhostに書いてみる。
RewriteEngine On RewriteLog logs/rewrite.log RewriteLogLevel 9 RewriteMap test prg:/path/to/map.php RewriteRule ^/rewritemap/(.*)$ ${test:$1|no_variants} [R,L]
ログは確認のために一応設定。最初、RewriteRuleは.htaccessに書いていたんだけど、上手く動かなかったのでこっちに残ったまま。
で、map.phpは以下。
#!/opt/local/bin/php <? while(!feof(STDIN)) { echo "http://pmg4.local/proxy.php?q=" . trim(fgets(STDIN)) . "\n"; } ?>
RewriteMapの動作確認なので単純なもの。標準入力を受け取って吐き出すだけ。設定によっては(バッファリングしないように)"output_buffering"あたりをいじるのかな?
RewirteRuleを.htaccess書きたくなったので、rewritemap2というディレクトリを作って、そこに.htaccessを置いてみた。
RewriteEngine On RewriteRule ^(.*)$ ${test:$1|map2}
ちなみに、map経由で吐き出すproxy.phpってのはGET変数をダンプして表示するだけ。
<?php echo "<pre>"; var_dump($_GET); echo "</pre>"; ?>
今回は『使ってみる』程度で終了。RewriteLockについてはまた今度(必要になったらテスト)。置換のフィルタにプログラムが使える(?)らしき事がテスト出来たので満足。
関係ないけど、GeSHiってapacheディレクティブ(?)も対応してるんだね。
意味があるか分からないけど、なんとなく気になったので。
HTMLファイルをブラウザに解釈させて、最終的に出来上がるHTMLソースをサーバサイドスクリプトに渡したい。で、リモートのブラウザに処理させるのにSelenium RCとか使えるのかな、と。
まあ、PHPとかでDHTMLをソースに落とし込めればそれで済むんだけど、さ。
HTMLをSAXでパースしてるんだけど、SAXはXMLをパースするもんだって自覚が無かったみたいで心配事がひとつ。
(PEARのXML_HTMLSax)
script要素内にdocument.writeを書いていて、document.writeの中にHTML要素を書いていたりすると、Data Handlerが拾っちゃう。CDATAに入れておけば、Escape Handlerに渡る。
HTMLをパースしようなんて思う場合、その対象は(大抵)人様のHTML。XMLなりYAMLなりのパースし易いフォーマットで提供されてる訳じゃないけど、『使いたいから無理矢理使う』ためにパースする。そんな『野良HTML』にCDATAとか期待する訳にもいかず。
javascriptとかで出来上がる『最終的なHTMLソース』を受け取る事が出来るなら別だけど、そうでないなら思い切ってscript要素をそぎ落としてからパースすればいいのか。
DOM使った方がいいのかな。SAXの方がDOMより優しそうな印象なんだよね。。。
取り出すデータがパターンどおりに出てくれる場合は、(ゴミを取り払ってから)正規表現でぶっこ抜いた方がてっとり早いかな?
イメージ、CSS、JSとかを読み込む場合、そのURLが複数回登場したらリクエスト回数はどうなるんだっけ?
手元のFF2ではイメージ以外は複数回リクエスト投げる事がある。1回のときもあるし複数回のときもある。
イメージはタグを書いてある場合と、動的に追加した場合(createElementからappendChild)とを含めてみても1回だけ。
CSSとJSは強制リロードした時に複数回リクエストしたけど、後は1回(たまに複数回リクエストしてたけど)。
Apacheのログもリクエストの回数分ログが残る。
(ちなみに、HTTPリクエストの確認はLive HTTP Headersを利用)
(JS/CSSを含めた)HTMLの作り次第で挙動が変わったりするのかな。タイミングとか。並列にリクエストするような作りをしてみたりすると複数回リクエスト?
なんとなく、1ページで同じURLを複数回参照していても、リクエストは1回だけで後は(リクエストせずに)ローカルキャッシュを使ってくれるものだと思ってたけど、そんな訳ではないのかな。
『HTTPコネクション(?)を含めたWebコンテンツの描画パフォーマンス測定』をしたい場合、何かいいツールってあるんだっけか。
classNameとかJS周りでの重複リクエストは、IEのキャッシュ設定でページを開くたびに変更を確認するようにしてたかららしい。
リンクをたどったり、アドレス欄でReturnキー叩いてもリクエストしない事も確認出来た。
けど、リロードは完全にリクエストするんだね。まあ、『再読み込み=変更が無いか問い合わせる』と考えれば自然か。
はずれギーク、はずれアルファとでも言うべきか。
調べものをしてググると、結構な割合でその疑問について自分で書いたブログエントリーが引っかかる。「いや、オレが聞いてるんだけど。」とヒトリ突っ込み。
MTはこれまで使って来た印象で、相当にSEO的に有能。何も意識してないけど、Googleさんの上の方に出て来たりする。RSSとかSBSとかの効果もあるんだけど、ね。
そんなわけで、『(表示されるなら)下位に表示されるべき"疑問のみ"のエントリー』まで上の方で引っかかったりする。
しっかりしろー、オレ。
まあ、知らずに自分探ししてちゃんと自分を見つけてるってことかもね。
結構目にしてたのに特に感想持たなかった気がする。
自分のフィードが検索結果の1ページ目に出てたのでちょっとびっくり。"はてなブックマーク ベイズ統計"でググったら『mixin feed』っていうタイトルの自社サービスで発行してるフィードが出た。
いや、まあ「何を今更」な事なんだけど。
そういえば、GooglebotってXMLにスタイル当たってると、変換後の内容でインデクシングするのかな?そうなら、FF2/IE7/Safari2に負けずにスタイルあて続ける意味はあるね。
XSLTによるSEO効果ってどこかでレポートされてたりするのかな?
GoogleとかTechnoratiとかにないかな。
集合知(?)を頼りに、自分のブログエントリーから重み付きキーワードを抽出したい。そんで、それをTreemapで表示したい。
『キーワード抽出』だけなら、形態素解析がどうたらで出来そうな気配。ただ、そこから『適切な単語』を取り出して『重み付け』をするのが大変そう。比較データが自分の手元には無い。
GETで使えて、[{"keyword":"score"},...]なJSON(だよね?)を返してくれるとベスト。いや、TreemapのHTMLを取得するのにJSONデータ使ってるので。XMLで返ってきても間にパーサ挟めばいいので問題は無い。使わせていただけるだけで万々歳。
ひょっとして、ここでベイズ統計?はてブ食わせてごにょごにょ?
おとなしく別のネタ探そうかな。
調べず書くのもなんなんだけど、そういうものなんだろうか。
PATH_INFOを利用してパラメータを渡す際、URL情報とかでスラッシュを含む文字列を扱う場合がある。で、URLエンコードして渡す訳だけど、Apacheの"AllowEncodedSlashes"がOnになってないと404でエラーページが表示される、と。
"AllowEncodedSlashes On"にしたら期待通りに表示されたので、「おお、これでよし」と安心してたら、ログを見てみると404で記録されている。じゃあ、ブラウザが表示してるのは何なのさ、と。404のはずなのに画像とかのリファラにそのリクエストのURLが記録されてるのは何なのさ、と。
プログラム側で、"HTTP/1.1 200 OK"を返すようにしてみたらログも200で記録されたみたいだけど、そういうものなのかな。
「Apacheのバージョンが古くて。。。」って事なのかな?
以下、Firefox2.0(OSX)で遭遇。
『scriptタグによるリクエストの結果が404だと、上記のケース(404だけど正しいコンテンツが返ってくる)でも正しく処理されない』
『ブラウザのアドレス欄入力によるリクエストの結果が404でも、上記のケース(上同)なら正しく表示される』
これは常識?
トップページのタグクラウドの下に追加。まだテスト中(というか動いてない)。
Safariでは見れるんだけど、Firefoxで見れない。素直にXmlHttpRequestでHTML受け取ってやった方がいいのかな(AHAH?)。JSONPの使い方を間違えてるんだろうか。JSONPのレスポンスをコピペすると普通に動くんだけど。。。
もうちょい粘って駄目なら放置。エントリのスコア付きキーワードリストをTreemapにして、エントリのダイジェスト項目を表示してみたかったりするんです。『エントリのスコア付きキーワードリスト』を生成してくれるWebAPIはどこかにあるかな?
Treemapの描画には『PHP用Treemapライブラリ』で紹介したライブラリを利用。これには問題無し。鮮度を表すための時間データは適当に全て当日にしてます。
(global変数使いたくなかったのでいじくってクラスにしたのは秘密)
タグのリンクを指定するためにベースURLを含むURIをsrc属性に入れてるんだけど、それをスラッシュ無しにしたら表示された。。。"AllowEncodedSlashes"の問題?ブラウザのアドレス欄に同じ(URLエンコードしたスラッシュがある状態の)URIを入力したら表示されるんだけどな。scriptタグだと何かあるんだろうか。
↑だけど、ブラウザで見た場合もサーバは404を返してる模様。けど、見えてる。
↑なので、レスポンスヘッダに"HTTP/1.1 200 OK"を書いてみたらスラッシュ含めても出来た。
JSでそのまま出来ないか探してたけど見当たらず、PHPで書かれたものを発見。
Treemap PHP Source Code - neurofuzzy, flash game development, rich internet applications, free source code - *alt.neurotica.fuzzy*
配列(キーワードと量のペア)と表示領域(横幅と縦幅)と分割方向(?)的なパラメータを与えると、HTMLを生成してくれる。関数には4つ引数があるんだけど、先述以外の1つはシステム的な変数(再帰数)。
YUIとか探したらTreemapあるかな?
rss_utils.incのparse_w3cdtf関数がおかしげ。
で、Perlメモ/W3C形式の日時の解析 - Walrus, Digit.を参考に、6パターンの日付文字列をパース出来るようにいじくってみた。
rss_utils.inc内のバージョン表記は"0.51"でした。
"MT+Right Fields+Plagger"を想像して楽しげな気分になってる訳ですが、Right Fieldsでエントリ構造を拡張した場合、MTのAPIは対応出来るんだろうか?
エントリ構造を定義した段階で、そのエントリ構造によるPOSTを処理するためのルールを自動的に定義出来ればいいのかな?AtomPPとかで上手い事処理出来るんだろうか。
拡張フィールドを作らず、既存フィールドにオレ構造(xmlns?microformats?)を埋め込む事も可能?MTはただ保存だけ考えて、外のサービスにPOSTするための構造化はオレ構造に対応させたPlaggerの何かに期待する?
エントリ構造の各フィールドがUIでの入力欄に結びつくとすれば、拡張フィールドがあった方がすっきりする気がする。MTにPOSTするデータを作成するためのUIでは入力欄を分けておいて、POST前のデータ処理段階でマージしたら問題ないかな。
特定の目的を持たない生データを保存する場合、フィールド分けした方がいいのか、マークアップしてまとめちゃっていいのか。わからん。なんとなく、フィールド分けされてた方が、いろんな事に使えそうな気がするけど、気がするだけな気もするし。マークアップしてあればフィルタをかけられる訳だし。
とりあえず実現させ易そうなのは、マークアップしたごちゃ混ぜデータをMTにPOSTして、後はPlaggerにお願いしてみる方法なのかな。
不覚にも会社でネタ振りされてしまい、帰りの電車で気になって仕方なかった。
Googleで調べてみたら、『Amazon.co.jp: ベイズ統計学入門: 本: 渡部 洋』が出て来て、レビューを見ても評判が良いようなので注文してみた。
ベイズ統計にたどり着くまでにどれだけの難所があるのか。。。心が折れる予感。
恥ずかしながら、『お急ぎ便』の存在を今日知りました。有料らしいですが、気になったのでお急ぎ便で注文。