PHPでrequest bodyの中身が受け取れない
外部サーバとの連携で、送られてくるリクエストの中身をPHPで取得しようとするとなぜか空だった。
テストは通っているのに何故…?としばらくハマり、headerの
Transfer-Encoding: chunked
の存在に気づく。
結論としては、apacheのバグ。
Transfer-Encoding: chunkedのとき(Content-lengthの指定がないとき)にContent-lengthが0→ボディが空として扱われてしまう。
apacheを最新版に更新したら直りました。
v2.4.47以降で解消されている模様。
参考:
Docker上のGanacheにMetaMaskからアクセスする
結論:Ganache起動時にホスト0.0.0.0を指定する。
ganache -h "0.0.0.0"
Truffle SuiteのPetShopチュートリアルをやっていました。
チュートリアルはローカル環境が前提(だと思う)ですが、散らかるのが嫌なので、ローカル環境(Mac)のDockerにlinuxを用意して、そこにTruffle,Ganacheをインストールしました。nginxも。
Macのブラウザ(FIreFox)で画面が表示できるようになり、でもGanacheに繋ぐところでCORSエラーに。
App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:8545');
(これ、ひとまずこう書いたのですが、チュートリアルではMetaMaskを使用することになっています)。
その後、チュートリアル通りMetaMaskを使うことにして、MetaMaskのネットワーク設定で試しても同じ結果に。
クロスオリジン要求をブロックしました
クロスドメインに惑わされてしばしハマったのち、冒頭の結論に辿り着きました。
Ganacheのホストはデフォルトで127.0.0.1。
webサーバは"localhost"でDockerコンテナ内のサーバに繋げるから、そういうものと思ってしまっていた。
netstatで見たら、nginxもちゃんと0.0.0.0をlistenしていました。
参考にさせていただきました。
https://zenn.dev/shake_sanma/articles/1c6475ba73da48
Elastic Beanstalkで環境ごとにapacheの設定を変更する
macOS Sierraでgdb
色んなところに書かれているのが、
キーチェーンアクセスで証明書を作成する
gdbにcodesignする
.gdbinitに set startup-with-shell off と記述する
なのですが、その通りやっても、実行時に
During startup program terminated with signal ?, Unknown signal.
となった。
結局、gdb doesn't work on macos High Sierra 10.13.3 - Stack Overflow
を参考に、gdbのバージョンを8.0.1に下げました。
gdb8.0.1のインストール後、codesignは必要でした。
CakePHP 2.xでminify
やりたいこと
CakePHP 2.Xでcssとjsをひとまとめにして圧縮したい。
方法
Minify plugin for CakePHPを使ってみた。
Readmeに従い、今回はcomposerを使ってインストールした。
composer install
で警告が出たので
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
一旦、updateをし、改めてinstallを実行した。
composer update --lock composer install
テンプレートにはどう記述するか?
マニュアルの通り、
echo $this->Minify->css(array('default', 'global')); echo $this->Minify->script(array('jquery', 'interface'));
と書けば良いのだけど、レイアウトファイルを使用している場合はどうしたら良いのか?
こう書いていたのを、
/app/View/Layouts/default.ctp
<!DOCTYPE html> <html lang="ja"> <head> <?php echo $this->fetch('script'); ?> </head> </html>
/app/View/Hoge/index.ctp
<?php $this->Html->script('hoge', array('inline'=>false)); ?>
こうしてみた。
/app/View/Layouts/default.ctp
<!DOCTYPE html> <html lang="ja"> <head> <?php echo $this->fetch('minifyScript'); ?> </head> </html>
/app/View/Hoge/index.ctp
<?php
$this->assign('minifyScript', $this -> Minify ->script(array('hoge'))); ?>
これで解決。
EC2で自分自身を停止する
アプリケーションの都合で、とある状況になったらEC2インスタンスを入れ替えたい。
AutoScalingとLoadBalancerを組み合わせている場合、ヘルスチェックに使用しているhtmlを削除すれば、異常と見なされてインスタンスが回収され、新しいインスタンスが立ち上がる。
が、今回はElastic Beanstalkのworker環境を使っているので、ヘルスチェック用htmlを削除しても、異常扱いにはなるがインスタンスの回収は自動で行われない。
仕方がないので、自分で停止することにした。
use Aws\Ec2\Ec2Client;
$instanceId = file_get_contents('http://169.254.169.254/latest/meta-data/instance-id’);
$ec2client = Ec2Client::factory(Configure::read('AWS'));
$ec2client -> stopInstances(array('InstanceIds' => array($instanceId)));