HTTPステータスコード 302, 303, 307を整理する
会社で同期と話してる時に、「HTTPステータスコードの302, 303, 307って使い分けがよくわからないよねー」ってなったのですが、たまたまパーフェクトPHPで出てきたので、まとめておきます。
それぞれの定義
- 302: Found
- 303: See Other
- 307: Temporary Redirect
どの定義もユースケースとしては、「一時的に別のURLを見て欲しい場合」に使用する
詳細な違い
- 302, 307は定義上は同じもので、リダイレクト時に使用したものと同じHTTPメソッドでリダイレクトする
- 303は、POSTリクエストでデータを送信した後に、表示用画面へGETでリダイレクトして欲しい場合に利用する
ここまでは、仕様の話なのですが、それを無視した挙動が存在するので、話がややこしいのです・・・
ややこしいところ
ほとんどのブラウザは302でも、303と同じようにGETでリダイレクトする (ほとんどのブラウザは、本来の302の仕様を無視している)
実際に、多くのフレームワーク (Ruby on Railsなど)でも、リダイレクトのデフォルトが302になってますよね
なんでこんなことになったの?
歴史的経緯によるものらしいです。
ざっとした、経緯の箇条書き
- HTTP/1.0には、302 Temporary Redirectしか定義されていなかった
- 303 See Other, 307 Temporary Redirectは、HTTP/1.1で策定された
- HTTP/1.1では、「302はリダイレクト時にリクエストされたメソッドを変更してはならず、303はGETでリダイレクトを行う」という仕様にするつもりだったが、多くのブラウザが302を正しく実装せず、303的な挙動をするようにしていた
- そこで、HTTP/1.1が改定された際に、本来の302の役割を、307 Temporary Redirectとして定義し、302は302 Foundと改定された
まとめ
とりあえず、一時的なリダイレクトを行うときは、302を使っておけば大丈夫みたいです。
なんで同じような定義がいっぱいあるんだろうなあと思ってたのですが、歴史を辿るとなるほどーという感じですね。
参考
パーフェクトPHPの「6章 Webアプリケーション入門」をPDOで書き直した
ターミナルで、shell-init: error retrieving current directory: getcwd: cannot access parent directories: というエラーが出た場合の対処
コマンドが実行できない!となって焦ったエラーですが、原因は大したことないものでした。
原因
カレントディレクトリが存在しないため、発生しているエラーです。
解決方法
存在していることがわかっている、別のディレクトリに移動すれば解決します。
参考
SSHログインで「shell-init: error retrieving current directory」となるのを調べたら意外に時間がかかったという話 - \ay diary
Carbonで、日付をゼロサプレスする
PHPでCarbonを使って、日付を制御しようと思ったのですが、ゼロサプレスの方法が分からなかったのでメモ。
そもそもCarbonって?
PHPの日付操作のライブラリです。
Laravelなどのフレームワークにも取り込まれています。
carbon.nesbot.com
使い方はこの辺が参考になります。
PHPの便利な日時操作ライブラリCarbonで曜日を日本語で表示する | A Small, Good Thing – blog
本題
結論から言うと、ゼロサプレスしたいフォーマットの前に -
をつけるだけです。
e.g. 本日の月日をゼロサプレスしたい場合
Carbon::now()->formatLocalized('%-m月%-d日');
簡単ですね。
sprintf
などの書式をわかっている人なら当たり前なんだろうなあと思いながら、僕は知りませんでした。
ネットでも調べた感じなさそうだったので、同じ轍を踏む人がいないように書いておきます。
社内で勉強会を開きました - その後
以前に書いた通り、先週から勉強会を開いています。 yinm.hatenadiary.jp
今日は第2回目ということで、前回の反省点を踏まえて、改善してみました。
実際に行ったことをメモしておきます。
まとめノートを作る
前回は、1項を読むごとにホワイトボードにまとめを書くという形で行ったのですが、進みが遅いことや、読む範囲の粒度が小さいため内容がまとめにくいといった指摘がありました。
ということで、今回はあらかじめ僕の方でまとめノートを作ってみました。節単位です。
github.com
勉強会では、節単位で読み手を交換して、読み終わるたびに、このまとめノートを僕が説明する形にしてみました。
スピードも上がったし、概ね良さそうでした。
とりあえず、次回も同じ形で進めていこうと思います。
唯一問題は、このノートを作る時間とモチベーションを、保てるかなー?というところでしょうか・・・!
勉強会・読書会に関する記事などを読んだ
世の中ではたくさんの勉強会が開かれているわけなので、そこから何か学べないかなと思って、いくらか記事を読んでみました。
いいなあと思った記事は次のものです。「勉強会って何だろうね?」という根本的な部分を考えられて良かったです。
まとめ
試行錯誤しながら、のらりくらりやっていきます。いい勉強会にできたらいいな。
MacのHomebrewのアップデートを、cronで自動化する
Macでcronを使って、Homebrewのアップデートを自動化してみました。
作業したことをメモしておきます。
なお、このエントリでは、それぞれの見出しごとに関連しそうな参照リンクを書く形式にしています。
cronの設定前にすること
事前に設定が必要なことがいくつかあります。
この設定をしていないと、cronを登録しても保存されずに、エラーで終了してしまうので、先に設定を済ましておきましょう。
- Editorの設定を行います(使っているシェルに合わせて、任意のエディタを設定)
# .zshrcなどシェルの設定ファイル export EDITOR=vim
- 上記でエディタをVimにした場合は、バックアップファイルを作成しないようにしておきましょう
" .vimrc set backupskip=/tmp/*,/private/tmp/*
cronの設定を行う
crontab
コマンドを使用します(cron tableの略)crontab -e
で編集が行えるのですが、タイポによる設定の削除を防ぐために、以下の方法を使うことが推奨です- タイポによる削除は、この辺りを参照 crontab -r を安全にする - Kentaro Kuribayashi's blog
crontab -l > 任意のパス/crontab # 現在のcronの設定を、任意のパスに書き出す vim 任意のパス/crontab # 上記の書き出したcronを編集 crontab < 任意のパス/crontab # 編集したcronを、実行するcronに反映する
- さらに、gitなどを使って、バージョン管理しておけば、crontabを削除しても大丈夫なので、やっておきましょう
cronの書式
- いよいよcronの設定を行うのですが、書式は次の形になっています
分 時 日 月 曜日 (実行ユーザー名) cronで実行したいコマンド・スクリプト
ここまでやれば、設定は完了です。
後は設定した時間が来れば、実行されるはず!なのですが、うまく行かなかった人(私です・・・)のために、デバッグ方法や、ハマりそうなポイントを書いておきます。
うまくいかない時は?
デバッグする時は、出力をファイルにリダイレクトして確認する
- 自分の実行したいコマンドに、
1>&2
をつけるなどして、エラー出力をリダイレクトするようにしましょう
- 自分の実行したいコマンドに、
パス指定は絶対パスにしましょう
- ターミナルから実行したら動くのに、cronから動かない!という場合に疑いたい部分です
- crontabにパスを通すというのも有効です(個別のスクリプトで通してもいいのですが、crontab自体に書いてしまった方が、どのcronでも有効になるので汎用性が高そうです)
おまけ
#!/bin/sh log_name=任意のログの絶対パス/`date "+%Y%m%d_%H%M%S"`.log echo 'brew doctor ---------------------------------------------------' >> ${log_name} 2>&1 brew doctor >> ${log_name} 2>&1 if [ $? -ne 0 ]; then echo 'brew update ---------------------------------------------------' >> ${log_name} 2>&1 brew update >> ${log_name} 2>&1 echo 'brew upgrade --------------------------------------------------' >> ${log_name} 2>&1 brew upgrade >> ${log_name} 2>&1 echo 'brew cleanup --------------------------------------------------' >> ${log_name} 2>&1 brew cleanup >> ${log_name} 2>&1 fi
JavaScriptのArray.lengthプロパティは、インデックスの最大値 + 1を表す
タイトルの通りなのですが、びっくりしました。
配列の要素数を返してくれるプロパティだと思ってたら、違いました。
配列のインデックスが飛び飛びになることはほとんどない(Array.shift()
などでも振り直される)ので、気にしないといけない機会はあまりないと思いますが、こういうのもあるんだなあと頭に置いておきます。