PHPでrequest bodyの中身が受け取れない

外部サーバとの連携で、送られてくるリクエストの中身をPHPで取得しようとするとなぜか空だった。

テストは通っているのに何故…?としばらくハマり、headerの

Transfer-Encoding: chunked

の存在に気づく。

結論としては、apacheのバグ。

bz.apache.org

Transfer-Encoding: chunkedのとき(Content-lengthの指定がないとき)にContent-lengthが0→ボディが空として扱われてしまう。

apacheを最新版に更新したら直りました。

v2.4.47以降で解消されている模様。

 

参考:

stackoverflow.com

 

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の設定を変更する

EBのアプリケーション内に複数の環境を持っており、環境ごとにapacheの設定を変えたかった。

 

通常は、.ebextensionsの下にファイルを配置すれば良いらしいけど、それだと共通の設定になってしまう。

もしくは、それぞれの環境向けに別バージョンをアップロードするか?

(デプロイのタイミングでファイルを差し替えたり、管理が煩雑になりそう)

環境変数であとから設定できたりしないものか……、とも考えたものの良い手は見つからず。

 

結局、おとなしくAMIを差し替えることにしました。

一旦インスタンスを作成し、設定ファイルを書き換えた上で、そのインスタンスを元にAMIを作成。

カスタム Amazon マシンイメージ(AMI)の作成 - AWS Elastic Beanstalk

macOS Sierraでgdb

macgdbを使おうとしてはまったのでメモ。

バージョンはmacOS Sierra 10.12.6。

 

色んなところに書かれているのが、

brewgdbをインストール

キーチェーンアクセスで証明書を作成する

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は必要でした。

 

 

GitHub Desktopでログインできない

GitHub Desktopを使おうとしたら、リポジトリに接続できなくなっていた。

環境

macOS Sierra

GitHub Desktop1.1.1

 エラーメッセージ

GitHub Desktop was unable to store the account token in the keychain. Please check you have unlocked access to the 'login' keychain.

 

 キーチェーンアクセスを見ると、解除されているので、??となったけど、一旦ロックしてから再度解除したら直りました。

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)));