Technote

by sizuhiko

CakePHPで動的にプレフィックスルーティングを追加したときに気をつけること

あるURLや特定のパラメータ、ユーザでアクセスされたとき、プレフィックスルーティングを付けたかったので、動的に付与したらハマったので小ネタを書いておきます。

動的にプレフィックスルーティングを追加するには

公式ドキュメントの解説のとおり、

// routes.php
Router::connect(
    "/site-proxy/:controller",
    array('action' => 'index', 'prefix' => 'site-proxy', 'site-proxy' => true)
);

// core.phpなど
Configure::write('Routing.prefixes', array('site-proxy'));

のように記述します。

RouterTest.phpのテストコードを見たら

$request = new CakeRequest();
$request->addParams(array(
    'controller' => 'registrations', 'action' => 'admin_index',
    'plugin' => null, 'prefix' => 'admin', 'admin' => true,
    'ext' => 'html'
));

みたいなコードがあったので、CakeRequest::addParams() を使って追加できることがわかります。

実際コントローラで

$this->request->addParams(['prefix' => 'site-proxy', 'site-proxy' => true]);

みたいに書くと、View上で $this->html->link() などで出力されるURLにプレフィックスルーティングが追加されます。

ハマりポイント

View上でフォームを作成するときに

echo $this->Form->create('Post');

のように書くと思うのですが、このようにモデル名だけが指定されているときCakePHPではどのようにURLが生成されるか、というと

// FormHelper::create() L367付近
if ($options['action'] === null && $options['url'] === null) {
    $options['action'] = $this->request->here(false);
} elseif (empty($options['url']) || is_array($options['url'])) {

URLというオプションを指定しない場合は、 action は CakeRequest::here() の値になることがわかります。

で、CakeRequest::here() とはどんなコードか見てみると

public function here($base = true) {
    $url = $this->here;
    if (!empty($this->query)) {
        $url .= '?' . http_build_query($this->query, null, '&');
    }
    if (!$base) {
        $url = preg_replace('/^' . preg_quote($this->base, '/') . '/', '', $url, 1);
    }
    return $url;
}

のようになっていて、要は現在のURL($this->query)から再生成されるだけです。リクエストに入っているプレフィックスルーティングの設定は参照されず、プレフィックスなしのURLがformタグのactionに入ってしまいます。

まとめ

解決方法としては

  • Form::create() で url オプションを追加する
  • addParams するときに here を変更する

    // 例)
    $request->addParams(array(
        'admin' => true,
        'prefix' => 'admin',
    ))->addPaths(array(
        'here' => '/admin/this/interesting/index',
    ))
    

あたりが良さそうです。まぁ動的にプレフィックス付けるなんてあんまりやらないのかもしれないですが、何かの参考になれば…

VagrantでComposerからPHPUnitをインストールするときに注意したいこと

現在以下のような環境を設置して開発をしています。

  • ホストOS: Windows7
  • 仮想環境: Vagrant + VirtualBox
  • ゲストOS: CentOS 6.4
  • 開発環境: Apache, PHP, MySQL, git, composer, CakePHP, Bdd, …

事件その1: Bddプラグインがインストールできなくなった

ある日、新しくcomposer installで環境を作っていた人が「Bddプラグインがうまくインストールできないんですけど…」 という事で調べていたら Bddプラグインから依存関係にあったライブラリが行方不明になっていました。

それは phpunit/Object_Freezer です。以前はpearにあって、あるときからgithubに移行していたはずなのに、どこにも痕跡を残さず消滅していました。 で、どこで使っているかというと、Bddプラグインの単体テストモジュールにあたるSpec-PHPです。 現在は Spec-PHP に同梱する形で解決しているのですが、以前はcomposer.jsonに

"pear-phpunit/Object_Freezer": "*"

のように指定していました。ちょうど金曜日だったので、週末にこれらを解決してBddプラグインがうまくイントールできるようになった(私の自宅Mac OSX環境+BddExampleAppで確認)と安心して月曜日出社したのです。

事件その2: PHPUnitがインストールできない!

で、Vagrant環境で更新してみたら….

composer update sizuhiko/Bdd

失敗….

しかも全然関係ないところ PHPUnit のインストールで失敗するよ! ちょうどその週末にPHPUnit4.0のコードがGitHubのデフォルトになりはじめたあたりでした。

でcomposer.jsonにはPHPUnitの記述が

"phpunit/phpunit": "3.7.*"

のように入っています。一見PHPUnit4をインストールするわけではないので関係なさそうですが、 composer install を実行すると

.....
  - Installing phpunit/php-token-stream (dev-master 292f4d5)
    Cloning 292f4d5772dad5a12775be69f4a8dd663b20f103

  - Installing phpunit/php-file-iterator (dev-master acd6903)
    Cloning acd690379117b042d1c8af1fafd61bde001bf6bb

  - Installing phpunit/php-code-coverage (1.2.x-dev 3a60a66)
    Cloning 3a60a660998e8d41d5ea81ff8d96ead546bce150

[RuntimeException]
Failed to execute git checkout '3a60a660998e8d41d5ea81ff8d96ead546bce150' &
& git reset -- hard '3a60a660998e8d41d5ea81ff8d96ead546bce150'

error: Untracked working tree file 'Tests/PHP/CodeCoverage/FilterTest,php'
would be overwritten by merge.

のようにエラーになります。

事件その3: Issueが光の速さで取り消される

ともかく事は重大そうなので、PHPUnitにIssue登録した方が良いかなと思ったので、投稿したところ、ものの数秒でそれはcomposerとか環境の問題でPHPUnitじゃないよ、と返ってきました。

Can’t install 3.7.x to Linux environment by composer

ちょっと慌てていたので、あまり確認しなかったのも良くないなと思い、ここから検証作業の開始です。

原因を調べてみた

まず、その週末にPHPUnitのgithubを見たところで、デフォルトブランチ(master)が4.0系になっているよ、という事に気がついていました。

ここで composer がどのようにライブラリを取得するか考えてみたところ、

  • packagist からリポジトリ情報をダウンロード
  • phpunit/phpunit と一致するソースコードリポジトリからダウンロード(この場合はgithub)
  • git clone git@github.com:sebastianbergmann/phpunit.git が実行される
  • リリースを指定しているので一致するタグがチェックアウトされる git checkout ....

この最後のステップで「Untracked working tree file」になり失敗するのです。

PHPUnitのリポジトリを見てみると、3系まではディレクトリ名が Tests だったのですが、 4系では tests のように小文字に変更となっています。大文字、小文字問題か!と意気たったのが、先程の Issue なわけですが。

自分の環境だけかなーと思って、隣の人にちょっとインストールしてみてもらえないか頼んでみたところ、成功…. えぇぇー!

その環境は Vagrant上のCentOSでなく、素のWindowsでした。 何かがおかしい….

そこで偶然なぜか思ったのが、とりあえずディレクトリ変えてみるか、という事。とりわけ何か理由があった訳でなくたまたまそう思っただけなのです。

composer update (この日は何度実行したろう….) …… 成功した!!!!でも、なんで?!

違いに悩むと…

成功したところ:

  • 素のWindows
  • Vagrant仮想環境内の /tmp/work/app

失敗したところ:

  • Vagrantのsyncfolderである /var/www/html/yourapp/app (CentOSから見えるディレクトリ) windows上だと c:¥develop¥your_app¥app みたいなところ

もしかしてVagrantでマウントしているWindowsディスク上だと大文字、小文字の変更をトレースできなくなるのでは!!

という結論に至り、他の人で同様にVagrantのsync_folder環境で試したらダメでした。

まとめ

ホストがwindowsでゲストがLinuxということはあると思うのですが、ディスク同期してそこにソースコードを置いてエディタはホストOS上で実行は仮想環境上みたいな開発するのは今後も増えてくると思います。 その中で今回のような事象に陥ることは composer + PHPUnit に限らず起きそうだなと思いました。

上記のような Failed to execute git checkout ... エラーが出た時に、あぁそういう事かと心構えができていれば慌てず、一旦ホストOS側で作業するとか、仮想環境上のsync_folder以外で作業するなどやりようがあるかな、と思います。

まぁ慌てず騒がず、落ち着いて対応しましょうという良い教訓になりました。twitterなどでお騒がせしてすみませんでした…

Middleman インストールメモ

ブログを Middleman で作る(厳密に言うとmy.opera.comから移行)するにあたり、いくらかハマりポイントがあったので、メモとして残しておきます。

参考になったサイト

以下のサイトを参照しながら、作業を実施しました。

HTMLジェネレータは何を使うの?

ブログを移行するにあたり、利用可能なフォーマットは WordPress互換フォーマット ということで、「WordPressで良くない?」とか、「my.opera作った人がスピンアウトして作ったサービスがあるらしいよ」とか様々な誘惑があったものの、今時は GitHub Pagesでやるんでしょ?という勝手な妄想(実際そういう人が増えているわけですが)から、そうなれば静的サイトジェネレータが必要だなぁと。

最初に思いついたのはChatWorkが作成したPHP製のデザイナ向け静的サイトジェネレーター「Phest」だったのですが、前提となるWordPressフォーマットからの変換どうするかなーと思っているうちに、気持ちは他のものへ….

で、GitHub Pages ブログ なんてキーワードで検索すると出てくるページと言えば Octopress jekyll あたりなわけです。もちろん jekyll にしておくと GitHub Pagesの公式にも出てくるぐらいで良いなーと思ったのですが、世の中の流れは Middleman みたいな記事をいくつか見かけるうちにすっかりと方向は Middleman に決まりました。それに WordPress XMLからインポートできるプラグイン Wordpress to Middleman Exporter があるということ。

Middleman インストール

しばらく ruby の環境とか触ってなかったので、一番最後の記憶を頼りに「まずは RVM + bundler で環境構築やー」と意気込んで Gemfile に middleman を追加して bundle installを実行したところ、うんともすんともならずインストールできない…. もう今時はRVMじゃないのかな? と思っていたら、rbenvなんですね。そうですか、そうとわかればすぐに切り替えて参考サイトを参照しながら呆気なく構築は完了。

gem install middleman

でインストールも楽々完了です。

ブログモジュールを使うので、middleman の Gemfile に

gem "middleman-blog", "~> 3.5.1"

を追加して

bundle install
middleman init blog --template=blog

と実行すると blog ディレクトリに環境が生成されます。

WorkPress からのインポート

my.opera から WordPress 互換 フォーマットのファイルをダウンロードして、画像やらも全部ダウンロード。 いよいよ先程の変換ツールで実行…. エラーだよ!!(泣)

rubyのエラーだったので、調べて直す事もできたのかもしれないのですが、そのとき思ったのは「要はWordPress.xml をmarkdownに変換すれば良いのだから他にもあるんじゃない?」という誘惑。 イロイロ調べたところ、

  • wp2middleman
  • wordpress-to-jekyll
  • ruby-wpdb
  • wp_conversion

などがあるようで、とりあえず1つずつ試みるという泥臭い作戦に。 どれもうまくいかない….

python系のライブラリもあるらしく

  • wp2md
  • prlican-import
  • exitwp

順番に試して行くと、exitwp がいくつか失敗するものの良い感じに変換できることがわかった。 しかしいくつか失敗する… なんでだろうと思っていたところで、もう一度my.operaのクローズ本文を読んでいたら WordPress 互換 フォーマットなんですよ。「互換」….. もしかして、WordPressに取り込んで、そこから再度エクスポートすると「互換」じゃなくて「正式」なXMLになるんじゃないか!と

WordPress インストール

ちょっと迂回している感じですが、PHPの環境は手元にいくらでもあるのでテキパキとインストールしてXMLをインポート、何もせずそのままエクスポート。2つのファイルを diff で比較してみると確かにちょっと違う。 これを先程一番うまく変換できた exitwp にかけると…….

あらー全部奇麗に変換できるじゃないですかー

デザイン

ここまで来ると後は erb と css なので、既存のmy.operaから html, css, js やらをすべてダウンロードして erb を html と同じになるように編集し、cssとjsも不要な部分を取り除いて設置。

middleman server

で見た目を確認しながら調整して CNAME ファイルも設置。

GitHub Pages へデプロイするために Gemfile に

gem "middleman-deploy"

モジュールを追加して bundle install。

config.rg に

activate :deploy do |deploy|
  deploy.build_before = true # default: false
  deploy.method = :git
  deploy.branch   = "master" # default: gh-pages
end

な感じで設定したら

middleman deproy

でビルドした内容をgithubへ連携してくれます。

今後

ローカル(手元)のmiddleman使えば簡単にデプロイまでできるのですが、たまたま外で自分のPCじゃないときとか、githubにmarkdownをpushしたらビルドしてGitHub Pagesにデプロイしてくれたら良いな、とか思っているので、そのあたりはこれからやっていこうと思います。

Hello Middleman!

my.opera.com の終了に伴い、ブログを移転しました。過去のコンテンツは移行していますが、リンク切れなど起きているかもしれませんので、もし見つけましたら github の issue ページ にてお知らせいただければ幸いです。

このブログは Middleman にて構築しています。Middlemanの導入に関する記事もアップしたいと思っていますので、興味ある方はしばらくお待ちください。

2013年ふりかえり

<!– more –>この投稿は今年参加/発表したり、運営に携わったイベント、やっていた仕事の内容などについてふりかえるポストです。

1月

2013年最初のイベント参加は1/6に開催された「新春!!HTML5KARUTA大会」。 HTML5カルタとは

2012年現在、W3Cで正式に採用されているHTML5のタグは108つあります。HTML5KARUTAは、このHTML5のタグを日本古来から伝わる伝統的な遊戯、カルタとして遊びながら覚えようというものです。

というもので、当日はCakePHPユーザの集う茅場町会場(コワーキングスペース茅場町 Co-Edo)に参加しました。 みんなでビールや日本酒飲みながら楽しくカルタをやって、なんと茅場町会場で優勝いたしました。その後、第二版として販売されたHTML5カルタ初級、中級、上級を購入したのは言うまでもありません。とても楽しいので、2014年の年初めに皆様もカルタで遊んでみてはいかがでしょうか?何?お手元に無い?、大丈夫です、茅場町Co-Edoにカレンダーが揃っていますので、ドロップイン料金だけで楽しめますよ!!

続いては1/21に開催された「CakePHPもくもく会」に参加。こちらも引き続き茅場町Co-Edoでの開催です。元々は@kaz_29さんとCakePHPのBehat連携周辺のアレやコレやを解決したくて開催したのですが、コアデベロッパのGraham含め10名程が参加するイベントとなりました。そこでの成果はCakePHPのBddプラグイン v0.9.2 としてリリースしました。詳しくはこちらの記事で。

また今年はPHP Matsuriが7月開催だったので、この頃から開催会場の選定などが始まっていました。

2月

2/14に開催された「第一回CakeBeerTalk」に参加しました。こちらも茅場町Co-Edo。CakePHP1から2へのマイグレーションの話があったり、CakePHP2.3の新機能の話をしていたんですねー。気付くと年末にはもう3の話をしているというサイクルに驚きます。1月に実施したもくもく会の成果なども含め@kaz_29さんが「CakePHP2+BDD Plugin」の発表をしていました。自分が作ったプラグインを他の人が利用して発表してくれるというのはとても嬉しい事です。

続いて2/28に株式会社 Engine Yardで開催された「第65回 PHP勉強会@東京」に参加。この頃BddプラグインにありがたいPull RequestをいただきComposer対応を進めていたのですが、その過程でいわゆるForkプロジェクトを登録して良いのか?問題に直面したので若干愚痴っぽいLT「composer/installers」もしました。今も結局repositoriesに追記するようにしているのですが、どうしたら良いのかの結論は出ていない感じです。で、それについてまとめた記事はこちら。 また、スライドにも書いたのですが、CakePHP2実践入門増刷されたのも2月の事でした。

PHP Matsuriは会場が札幌全日空ホテルでほぼ確定したところでした。PHP MatusriのページをGitHubページで作り始めたのもこの時期です。

3月

3/9に開催された「(CakePHPとか)PHPのテストについての勉強会」で「テストの基本からCakePHPでTDD/BDDへ」講演しました。他の方の発表も大変に興味深く楽しいイベントでした。

続いて3/27に株式会社 Engine Yardで開催された「第66回 PHP勉強会」に参加。「ClientSide MVC Frameworks using?」というタイトルでJavaScript MVCフレームワークである「JavaScript MVC」というフレームワークについてLTをしました。名前が紛らわしいんですよね。当時ちょうど仕事でHTML5アプリというかクライアントサイドのお仕事でこのフレームワークを使っていて、とても良かったので紹介したという流れです。この後も何度か同様の発表をしたのですが、時代の流れがクライアントソフト、クライアントサーバ、シンクライアントやサーバサイドWeb、AjaxやHTML5アプリ(クライアントサーバ)といったように目紛しく変わって行く中、来年の動向も気になるところです。

PHP Matsuriはスポンサー依頼が本格的に始まったり、Facebookにイベントページが立ったり、先だって作っていた公式サイトも公開したり、いよいよ本格的に動き始めた感じでした。

4月

もちろん4月といえば4q!カンファレンス(@かもすや酒店)。今年も参加しましたー。ちょうどSakenote(#SakeLover)がリリースされた後ということで@kuranukiさんも含め盛り上がったイベント(飲み会)でした。

4/27は「CandyCane 開発会 2013春」に参加。Bddプラグインでテストを書こう!と挑んだのですが、まずモロモロ環境を作っているうちに時間切れとなってしまいました。今思えばこの時にVagrant使っていれば….。その後私が作ったものをベースにComposer対応が完了した模様です。ありがたやー。

仕事はどんどん忙しくなるし、オレ大丈夫かーというような時期でした。マジで。ちょっとイベントに行ける雰囲気でなくなってきたのがちょうどこの頃かなー。

PHP Matsuriの基調講演に Vagrant の Hashimoto さんが決まったのも4月でした。個人的には、これがキッカケで Vagrant 熱が盛り上がってきたのですよね。

5月

仕事がテンパっていてそうとうやばい状況で、どこにも行けませんでした。

5/29にPHP Matsuriのチケット販売を開始したのですが、そのサイト更新だけは気力を振り絞って対応した記憶が….

6月

というのも5/30までで。5/31から前乗りして6/1に開催されたPHPカンファレンス関西に参加。仕事はちゃんと5/30までに何とかしました。こちらでは「Newtype of Web Application Architecture」というタイトルでJavaScript MVCのLTをしました。今年2度目のJavaScriptMVC発表でした。仕事から解放されて大阪を満喫したのは言うまでもありません。無限もやしが正式なメニュー名になっていたのを覚えています(それかよw)。

もちろん6月といえば恒例の Interop にも参加。新しい話題としては特になかったけど、SDNがしっかりとしてきたのは昨年以上に感じたところでした。

PHP MatsuriはPHPカンファレンス関西のLTでチケット販売やゲストの告知をしたり、ノベルティのデザインが決まったり、LT大会用のシステムが出来上がったり、いよいよ来月の開催に向けて最後の追い込みという感じでした。

7月

いよいよPHP Matsuri2013 Sapporo開催。私は夏休み併用で7/10から移動を開始(Matsuriは14,15日)。初の北海道上陸を自家用車で成し遂げようということで大洗からフェリーで行きました。で、その旅の写真はこちら。日焼けして真っ黒な顔で会場入りした私を見て「リゾートを満喫してきた人がいる」と言われました。まぁ確かにMatsuriの写真を見るとサングラス日焼け痕がクッキリとw。

PHP Matsuriでは司会と最初の講演「PHP x Agile 〜プログラマ視点から気にしたい事」を担当。スライドだけ見るとそれを薦めているように見える箇所もありますが、反対の意味として話した内容もあるので単語だけ一人歩きしないと良いなとおもっています。

なおハッカソンでは、JavaScriptMVCとCakePHPで作るプロトタイプ開発(9月のPHPカンファレンスの発表資料を参照してください)という発表をしたのですが、ネタが被りまくりな上、TwitterBootstrapのモーダルボタンがプロジェクタの投影範囲外というトラブルに見舞われ失敗しました….

7/22に株式会社 Engine Yardで開催された「第70回 PHP勉強会@東京」に参加。

また、月末の30日には元CakePHPのリードデベロッパだったNateさんが来日したのに合わせたイベント「緊急開催 Lithium Tokyo 〜Nate Abele氏来日イベント〜」に参加しました(@yandoさんのイベントレポート)。@koriymさんとNateの熱いリソース指向の話はとても素晴らしかったです。

この頃、社内で「インターフェースデザインの実践教室」の読書会を立ち上げました。途中まで進んだところで社外作業になってしまい中断状況。はやく再開したい…

8月

CakeFest2013まであともう少しという頃、CakeFestの発表者にも名前を連ねるRoland氏がオーストリアから来日してBanchaの講演をするというので「CakePHP Tokyo 〜 CakePHPとSenchaTouchによる超高速モバイル開発〜」に参加しました。昨年はJQueryMobileを使った仕事をしたり、今年はJavaScriptMVCを使ったりと、似たような開発をしてきた中でSenchaTouchとどういう連携をするのかとても興味があったのですが、SenchaTouchというよりもそのSDKを使ったパワフルな開発サポート機能もある点がとても面白かったです。

そして30日からCakeFestへ〜

9月

5月前後のちょうど多忙な時期にCall For Paperがあったので、結局今年はスピーカー申し込みはできず一般参加です。でも当日LT募集もあるし資料だけは仕込んで参加。今年もくもく会で仕上げたBDDプラグインのアップデート内容などを発表しよう…と思っていたらペチャクチャ枠に移動となって、挙げ句ペチャクチャ枠の申し込み者が少ないからキャンセル扱いにwww。まぁその後行われたくじ引き大会?で一等の賞品をもらったので、終わりよければ全てよしということで。

CakeFestでの内容は@yandoさんのレポートに、私と@yandoさんが現地から放送したCakeRadioGagaの動画がアップされているので、そちらをご覧いただければと思います。(そういえばかなりメモ取ったのに何もまとめ記事にしていなかった)。 この放送の後は、残っていた他の参加者と焼肉を食べに行ったのでした。

9/14にはPHPカンファレンスが開催され「15分で出来るPHPとJavaScript MVCフレームワークで作るプロトタイプ」というタイトルで講演してきました。今年4回目のJavaScriptMVC関連(厳密にはこの時期にはJavaScriptMVCがCanJSベースの新しいバージョンになっていたので、内容には変化がありました)の発表でした。AngularJSの勢力は増す一方ですが、CanJS(ならびにJavaScriptMVC)も頑張るぞ。

またこの頃からCakePHP関連のお仕事を手伝うようになったのですが、現場のControllerのテストがあまりにアレな感じでしたので「CakePHPのコントローラテストで注意すること」という記事にしてまとめました。また仕事で本格的にVagrantを使ったのもこのお手伝いが最初となりました(これまでは個人の開発環境ばかり)。

10月

バッグをPROTEXのアタッシュケースに変えました。というかしばらく使っていたトートバッグは個人的に合わず….

新しいCakePHPプラグインとしてRailsではおなじみのFabricatorのクローンを作りました。GithubそのときのTweetブログ記事。Fabricatorというより作ってみたらFactoryGirlの機能も盛り込みたくて、結局二個一みたいな感じになっていますが、まぁそこは….

現場であまりにFixture絡みでテストが失敗するので、そんなんじゃダメだーという訳で(およそ30分ぐらいでお昼食べた後すぐ)作ったのです。

11月

Fabricateにsequence機能などいくつかRuby側にある機能を追加しました。ブログ記事

11/29に株式会社 Engine Yardで開催された「第73回 PHP勉強会@東京」に参加。FabricatorとFakerを使った「テストデータの作り方」という発表をしました。

その翌日11/30には「HTML5カンファレンス」にボランティアスタッフとして参加。昨年に続く参加だったのですが、より規模が大きくなり発表も多様でした。動画がアップされているので、すべてのセッションを閲覧できるようになっています。

12月

クリスマスにケーキを食べながらCakePHPの話をしよう、という事でCakePHPのイベントが開催される事に。運営でお手伝いしてきました。 「CakePHPクリスマス勉強会」。LTに空きがあるという事で先月のPHP勉強会と同じネタでしたが「テストデータの作り方」について再演しました。

お仕事では引き続きCakePHPを使った開発現場の支援をしております。

まとめ

ということで、5月危機を除いては月に一度は何かしらの発表、発信はできていたようです。

もっと頑張っている人もいっぱい知っていますが、自分のペースとしてはこのぐらいかなー、後は書籍の話もいただいておりますので、いろいろゆっくりと。

とはいえBDDプラグインのBehat3対応と、Fabricateの拡張も(なるはやで)やりたいなー。という来年に希望を持った前向きな感じで今年を〆たいと思います。

そうそう、3月にはこのブログを書いている My Operaがサービス終了となるので、どこかに移動しなくちゃいけない。実はそれが最優先だったりするのですが(汗

ということで何だかバタバタした終わり方ですが、来年も各所で皆様に会えるのを楽しみに。Co-EdoからPOST。