ソフトウェア・開発」カテゴリーアーカイブ

Bootstrapを使用しているページにMS EdgeでアクセスするとLESSファイルにアクセスしようとする話

Bootstrap 3を使用しているWebサイトにMS Edgeを使ってアクセスすると、HTTP 404等の大量の400番台アクセス不可が吐かれているように見えますが、これは開発者ツールを表示している時のみの動きで、通常のアクセス時には問題ありません。

マッピングを行うためにBootstrapコンパイル元のLESSファイルを探すものの、開発環境ではない本番環境にLESSファイルがアップされているはずもなくアクセス不可、という動きのようです。

ms_edge_bootstrap

―Why is Bootstrap trying to load LESS files in Edge?
http://stackoverflow.com/questions/35142485/why-is-bootstrap-trying-to-load-less-files-in-edge

より。

Zabbix Proxyサービス起動時刻がおかしいと正常に動作しなくなる話

Zabbix Server、Zabbix Agentが導入されているサーバーを再起動することは問題ないが、Zabbix Proxyが導入されているサーバーのOSを再起動するとなぜかagent pingが飛ばなくなるという現象が有りました。以下のような状況でした。

  • OSはCentOS 7.2
  • Zabbix 3.0.2
  • zabbix-proxy.serviceは自動起動が有効。
  • キャッシュDBはSQLite3を利用。
  • systemctl restart zabbix-proxy を実行すると改善。
  • 稀にOS再起動後も問題なく動作する。

最初はProxyの設定ファイルを調査するも特に不審な点は無い状況でした。しかし、systemctl status zabbix-proxyで出てくるサービス起動時刻がおかしい事に気づきます。dateコマンドを叩いて表示される時刻はJSTとして正しいものであるものの、zabbix-proxyの起動時刻はJST + 7.x時間という中途半端な時刻になっています。9時間マイナスならともかく、JSTよりさらに先というのがよく分かりません。

  • dateコマンドで表示される時刻は正しい。
  • timedatectlで確認できるJST、UTCともに正しく、RTCはUTCと同じ値。
  • sshd等、他のサービスにもsystemctlで確認できる起動時刻がおかしいものがある。
  • psコマンドで表示される時刻は正常。
  • systemctl restart zabbix-proxyを行うとサービス起動時刻も正常なJSTになる。

時計回りの怪しさ満点ですが、結果としては「OSを起動している仮想環境のホストであるESXiの時計が狂っている」という物でした。OS上の時刻表示が正しいものだから結構気づくのに時間がかかりました。
では、なぜOS上の時刻が正しいのにサービスの起動時刻だけおかしくなるのかというと、OSの再起動時にESXiの機能が時刻同期をオフにしていてもホスト側に合わせてしまうというそんな事しなくていいのに……という処理が入るとの事。その後OS起動処理の中でchronyが動作し、ユーザーが触る頃には正しい時刻、という動きが再起動の度に挟まれていたようです。以下の記事がとても参考になりました。

―ESXi上のWindowsゲストの時刻がずれて詰みかけた話
http://qiita.com/ine1127/items/edb0a46b638265186650

なぜZabbix Proxyの起動時刻が正しくない状況にあると正常に動作しなくなるか、という点については不明ですが(まぁ正常な環境ではないのは確かですが)、とりあえず今のところは再起動後もagent pingが途切れなくなっています。

CodeIgniter 3でREST風のAPIを実装する

GET/POST以外のHTTPメソッド/JSONで入力

REST風のAPIを実装するには一般的にはGETやPOSTだけでなくPUTやDELTE等のHTTPメソッドからの入力にも対応する必要が有りますが、CodeIgniter 3.0.xを利用している環境ではどうやって拾うの?という話。

CodeIgniter 3からInputライブラリに raw_input_stream というプロパティが追加されており、そこから読み込むだけで簡単に文字列を取得できます。

Input Class
https://www.codeigniter.com/user_guide/libraries/input.html

また、このraw_input_streamを使う事でフォームのようなkey=valueではない($this->input->post()で拾えない)値が取得出来ます。あとはJSON形式で投げているならjson_decodeしたりなんなりで。

// raw_input_streamとjson_decodeはnullを返すことが有るよ!
$raw_input = $this->input->raw_input_stream;
$json = json_decode($raw_input);

Q. CodeIgniter 2.x の場合
A1. CodeIgniter 3.xにアップグレードする。1日あれば動くようになるはず。
A2. PHP 5.5以前の環境であるなら5.6以降にして php://input ストリームを開く。
A3. CI_Inputクラス魔改造。お勧め出来ない。

柔軟にURLとコントローラの対応を取りたい

コントローラクラスのフォルダ階層分けやurlヘルパーでのsegment取得、引数指定で頑張ってもいいですが、コントローラに_remapメソッドを定義すれば柔軟性が上がります。URLだけを見るルータ側での設定とは違ってHTTPメソッドによって呼び出すメソッドを変えるような事もやりやすくなるかもしれません。

Controllers — CodeIgniter 3.0.2 documentation Remapping Method Calls
https://www.codeigniter.com/user_guide/general/controllers.html#remapping-method-calls

例えば存在しない機能を叩いた場合のWeb API向け404処理などを振り分けやすくなりますね。