楽しいだけで十分です

好きなことを書きます

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を使っておけば大丈夫みたいです。

なんで同じような定義がいっぱいあるんだろうなあと思ってたのですが、歴史を辿るとなるほどーという感じですね。

参考

gihyo.jp

パーフェクトPHPの「6章 Webアプリケーション入門」をPDOで書き直した

PHP7.0.14でパーフェクトPHPを写経しているのですが、mysql関数が廃止されているため、そのまま写経しても動かない (!) という状態になってしまいました。
なので、自分でPDOで書き直してみました。
同じようなことしてる人がいたら、参考までにどうぞ:)
(自分の環境では動いていそうですが、動作を保証するものではないので、あしからず。)

github.com

ターミナルで、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

勉強会では、節単位で読み手を交換して、読み終わるたびに、このまとめノートを僕が説明する形にしてみました。
スピードも上がったし、概ね良さそうでした。
とりあえず、次回も同じ形で進めていこうと思います。
唯一問題は、このノートを作る時間とモチベーションを、保てるかなー?というところでしょうか・・・!

勉強会・読書会に関する記事などを読んだ

世の中ではたくさんの勉強会が開かれているわけなので、そこから何か学べないかなと思って、いくらか記事を読んでみました。
いいなあと思った記事は次のものです。「勉強会って何だろうね?」という根本的な部分を考えられて良かったです。

勉強会を半年運営して気づいた「強烈なリーダーシップで引っ張るのではなく、“場を創って提供する”リーダーシップもある」って気付かされた話-Six Apart ブログ|オウンドメディア運営者のための実践的情報とコミュニティ

まとめ

試行錯誤しながら、のらりくらりやっていきます。いい勉強会にできたらいいな。

MacのHomebrewのアップデートを、cronで自動化する

Macでcronを使って、Homebrewのアップデートを自動化してみました。
作業したことをメモしておきます。
なお、このエントリでは、それぞれの見出しごとに関連しそうな参照リンクを書く形式にしています。

cronの設定前にすること

事前に設定が必要なことがいくつかあります。
この設定をしていないと、cronを登録しても保存されずに、エラーで終了してしまうので、先に設定を済ましておきましょう。

# .zshrcなどシェルの設定ファイル
export EDITOR=vim
" .vimrc
set backupskip=/tmp/*,/private/tmp/*

cronの設定を行う

  • crontabコマンドを使用します(cron tableの略)
  • crontab -eで編集が行えるのですが、タイポによる設定の削除を防ぐために、以下の方法を使うことが推奨です
crontab -l > 任意のパス/crontab    # 現在のcronの設定を、任意のパスに書き出す
vim 任意のパス/crontab             # 上記の書き出したcronを編集
crontab < 任意のパス/crontab       # 編集したcronを、実行するcronに反映する

cronの書式

分 時 日 月 曜日 (実行ユーザー名) 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()などでも振り直される)ので、気にしないといけない機会はあまりないと思いますが、こういうのもあるんだなあと頭に置いておきます。

参考

d.hatena.ne.jp